@gatherround/sdk 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/adapters/i-client-adapter.d.ts +45 -0
  2. package/dist/adapters/i-client-adapter.d.ts.map +1 -0
  3. package/dist/adapters/i-client-adapter.js +9 -0
  4. package/dist/adapters/i-client-adapter.js.map +1 -0
  5. package/dist/adapters/i-content-adapter.d.ts +23 -0
  6. package/dist/adapters/i-content-adapter.d.ts.map +1 -0
  7. package/dist/adapters/i-content-adapter.js +9 -0
  8. package/dist/adapters/i-content-adapter.js.map +1 -0
  9. package/dist/adapters/i-controller-transport.d.ts +31 -0
  10. package/dist/adapters/i-controller-transport.d.ts.map +1 -0
  11. package/dist/adapters/i-controller-transport.js +9 -0
  12. package/dist/adapters/i-controller-transport.js.map +1 -0
  13. package/dist/adapters/i-session-adapter.d.ts +42 -0
  14. package/dist/adapters/i-session-adapter.d.ts.map +1 -0
  15. package/dist/adapters/i-session-adapter.js +9 -0
  16. package/dist/adapters/i-session-adapter.js.map +1 -0
  17. package/dist/controller-message.d.ts +59 -0
  18. package/dist/controller-message.d.ts.map +1 -0
  19. package/dist/controller-message.js +8 -0
  20. package/dist/controller-message.js.map +1 -0
  21. package/dist/display-instruction.d.ts +81 -0
  22. package/dist/display-instruction.d.ts.map +1 -0
  23. package/dist/display-instruction.js +8 -0
  24. package/dist/display-instruction.js.map +1 -0
  25. package/dist/index.d.ts +18 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +9 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/runtime-assets.d.ts +17 -0
  30. package/dist/runtime-assets.d.ts.map +1 -0
  31. package/dist/runtime-assets.js +8 -0
  32. package/dist/runtime-assets.js.map +1 -0
  33. package/dist/runtime-episode.d.ts +84 -0
  34. package/dist/runtime-episode.d.ts.map +1 -0
  35. package/dist/runtime-episode.js +8 -0
  36. package/dist/runtime-episode.js.map +1 -0
  37. package/dist/runtime-strings.d.ts +12 -0
  38. package/dist/runtime-strings.d.ts.map +1 -0
  39. package/dist/runtime-strings.js +8 -0
  40. package/dist/runtime-strings.js.map +1 -0
  41. package/dist/runtime-types.d.ts +68 -0
  42. package/dist/runtime-types.d.ts.map +1 -0
  43. package/dist/runtime-types.js +8 -0
  44. package/dist/runtime-types.js.map +1 -0
  45. package/package.json +35 -0
  46. package/src/adapters/i-client-adapter.ts +63 -0
  47. package/src/adapters/i-content-adapter.ts +28 -0
  48. package/src/adapters/i-controller-transport.ts +35 -0
  49. package/src/adapters/i-session-adapter.ts +67 -0
  50. package/src/controller-message.ts +82 -0
  51. package/src/display-instruction.ts +105 -0
  52. package/src/index.ts +81 -0
  53. package/src/runtime-assets.ts +18 -0
  54. package/src/runtime-episode.ts +109 -0
  55. package/src/runtime-strings.ts +12 -0
  56. package/src/runtime-types.ts +84 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * i-client-adapter.ts
3
+ *
4
+ * TV engine ↔ platform adapter for session lifecycle and messaging.
5
+ * The TV app uses this to create sessions, send display instructions
6
+ * to phone controllers, and receive controller messages.
7
+ */
8
+ import type { ControllerMessage } from "../controller-message.js";
9
+ import type { DisplayInstruction } from "../display-instruction.js";
10
+ export interface GameSessionOptions {
11
+ /** Published episode ID to play. */
12
+ episodeId: string;
13
+ /** Published version ID (optional — uses latest if omitted). */
14
+ versionId?: string;
15
+ /** Maximum number of players (excluding the TV host). */
16
+ maxPlayers: number;
17
+ }
18
+ export interface GameSessionResult {
19
+ /** Unique session identifier. */
20
+ sessionId: string;
21
+ /** Short alphanumeric code for manual entry (e.g. "A3F9K2"). */
22
+ sessionCode: string;
23
+ /** Full URL for phone controller join (embedded in QR code). */
24
+ controllerUrl: string;
25
+ }
26
+ export interface PlayerSessionResult {
27
+ /** The player's unique ID within this session. */
28
+ playerId: string;
29
+ /** The session they joined. */
30
+ sessionId: string;
31
+ }
32
+ /**
33
+ * Engine-side adapter for session management and bidirectional messaging.
34
+ */
35
+ export interface IClientAdapter {
36
+ createGameSession(options: GameSessionOptions): Promise<GameSessionResult>;
37
+ joinGameSession(sessionId: string): Promise<PlayerSessionResult>;
38
+ disconnect(): void;
39
+ sendToController(playerId: string, instruction: DisplayInstruction): Promise<void>;
40
+ broadcastToAll(instruction: DisplayInstruction): Promise<void>;
41
+ onControllerMessage(cb: (playerId: string, message: ControllerMessage) => void): void;
42
+ onPlayerConnected(cb: (playerId: string) => void): void;
43
+ onPlayerDisconnected(cb: (playerId: string) => void): void;
44
+ }
45
+ //# sourceMappingURL=i-client-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-client-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/i-client-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;GAEG;AACH,MAAM,WAAW,cAAc;IAE7B,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3E,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjE,UAAU,IAAI,IAAI,CAAC;IAGnB,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,cAAc,CAAC,WAAW,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG/D,mBAAmB,CACjB,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,KAAK,IAAI,GACzD,IAAI,CAAC;IACR,iBAAiB,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IACxD,oBAAoB,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;CAC5D"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * i-client-adapter.ts
3
+ *
4
+ * TV engine ↔ platform adapter for session lifecycle and messaging.
5
+ * The TV app uses this to create sessions, send display instructions
6
+ * to phone controllers, and receive controller messages.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=i-client-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-client-adapter.js","sourceRoot":"","sources":["../../src/adapters/i-client-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * i-content-adapter.ts
3
+ *
4
+ * TV engine ↔ episode content adapter.
5
+ * Resolves published episode JSON from whatever storage backend is active
6
+ * (Firestore registry → GCS for GRG, embedded build for Luna, etc.).
7
+ */
8
+ import type { RuntimeEpisode } from "../runtime-episode.js";
9
+ /**
10
+ * Adapter for loading published episode content at runtime.
11
+ */
12
+ export interface IContentAdapter {
13
+ /**
14
+ * Fetch the latest published episode.
15
+ * Resolution: platform registry → storage path → parsed JSON.
16
+ */
17
+ loadEpisode(episodeId: string): Promise<RuntimeEpisode>;
18
+ /**
19
+ * Fetch a specific published version (for rollback / pinned builds).
20
+ */
21
+ loadEpisodeVersion(episodeId: string, versionId: string): Promise<RuntimeEpisode>;
22
+ }
23
+ //# sourceMappingURL=i-content-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-content-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/i-content-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAExD;;OAEG;IACH,kBAAkB,CAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * i-content-adapter.ts
3
+ *
4
+ * TV engine ↔ episode content adapter.
5
+ * Resolves published episode JSON from whatever storage backend is active
6
+ * (Firestore registry → GCS for GRG, embedded build for Luna, etc.).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=i-content-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-content-adapter.js","sourceRoot":"","sources":["../../src/adapters/i-content-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * i-controller-transport.ts
3
+ *
4
+ * Controller-side transport interface.
5
+ * The phone controller app uses this to communicate with the TV game engine.
6
+ * GRG implements this over Firebase RTDB; Luna uses GameLift Realtime JS SDK.
7
+ */
8
+ import type { ControllerMessage } from "../controller-message.js";
9
+ import type { DisplayInstruction } from "../display-instruction.js";
10
+ /**
11
+ * Transport layer for phone controller ↔ TV engine communication.
12
+ */
13
+ export interface IControllerTransport {
14
+ /**
15
+ * Connect to an active session (called after scanning QR / reading URL param).
16
+ */
17
+ joinSession(sessionId: string): Promise<void>;
18
+ /**
19
+ * Send a player input event to the TV engine.
20
+ */
21
+ sendInput(message: ControllerMessage): Promise<void>;
22
+ /**
23
+ * Register a callback for display instructions from the TV engine.
24
+ */
25
+ onDisplayInstruction(cb: (instruction: DisplayInstruction) => void): void;
26
+ /**
27
+ * Tear down transport connection.
28
+ */
29
+ disconnect(): void;
30
+ }
31
+ //# sourceMappingURL=i-controller-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-controller-transport.d.ts","sourceRoot":"","sources":["../../src/adapters/i-controller-transport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD;;OAEG;IACH,oBAAoB,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;IAE1E;;OAEG;IACH,UAAU,IAAI,IAAI,CAAC;CACpB"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * i-controller-transport.ts
3
+ *
4
+ * Controller-side transport interface.
5
+ * The phone controller app uses this to communicate with the TV game engine.
6
+ * GRG implements this over Firebase RTDB; Luna uses GameLift Realtime JS SDK.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=i-controller-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-controller-transport.js","sourceRoot":"","sources":["../../src/adapters/i-controller-transport.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * i-session-adapter.ts
3
+ *
4
+ * TV engine ↔ session persistence adapter.
5
+ * Manages game session state (variables, scene checkpoints) in whatever
6
+ * persistence layer the platform provides (RTDB for GRG, save system for Luna, etc.).
7
+ */
8
+ export interface PlayerConfig {
9
+ /** Player's unique ID (e.g. Firebase UID). */
10
+ playerId: string;
11
+ /** Display name. */
12
+ name: string;
13
+ /** Assigned hero role slot (0 = host, 1–4 = players). */
14
+ role: number;
15
+ }
16
+ /**
17
+ * Runtime variable state for an episode session.
18
+ * Keys are variable names; values are their current runtime values.
19
+ */
20
+ export type EpisodeVariables = Record<string, boolean | number | string>;
21
+ /**
22
+ * Serializable checkpoint for a scene's execution state.
23
+ * Shape is intentionally loose — the engine defines what goes in here.
24
+ */
25
+ export interface SceneCheckpoint {
26
+ /** Current node ID within the scene. */
27
+ currentNodeId: string;
28
+ /** Any additional engine state needed to resume. */
29
+ [key: string]: unknown;
30
+ }
31
+ /**
32
+ * Engine-side adapter for session state persistence.
33
+ */
34
+ export interface ISessionAdapter {
35
+ createSession(episodeId: string, players: PlayerConfig[]): Promise<string>;
36
+ getSessionVariables(sessionId: string): Promise<EpisodeVariables>;
37
+ updateSessionVariables(sessionId: string, vars: Partial<EpisodeVariables>): Promise<void>;
38
+ saveSceneState(sessionId: string, sceneId: string, state: SceneCheckpoint): Promise<void>;
39
+ loadSceneState(sessionId: string, sceneId: string): Promise<SceneCheckpoint | null>;
40
+ advanceScene(sessionId: string, nextSceneId: string): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=i-session-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-session-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/i-session-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;AAEzE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,YAAY,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAElE,sBAAsB,CACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAEnC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * i-session-adapter.ts
3
+ *
4
+ * TV engine ↔ session persistence adapter.
5
+ * Manages game session state (variables, scene checkpoints) in whatever
6
+ * persistence layer the platform provides (RTDB for GRG, save system for Luna, etc.).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=i-session-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-session-adapter.js","sourceRoot":"","sources":["../../src/adapters/i-session-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * controller-message.ts
3
+ *
4
+ * Phone → TV typed event union.
5
+ * Sent by the phone controller to the TV game engine via IControllerTransport.sendInput().
6
+ */
7
+ export interface HeroSelected {
8
+ type: "HeroSelected";
9
+ /** The hero role slot chosen by this player. */
10
+ role: number;
11
+ }
12
+ export interface QTEResponse {
13
+ type: "QTEResponse";
14
+ /** Whether the player succeeded the QTE within the time limit. */
15
+ success: boolean;
16
+ /** Reaction time in milliseconds, or null if timed out. */
17
+ reactionTimeMs: number | null;
18
+ }
19
+ export interface ChoiceSelected {
20
+ type: "ChoiceSelected";
21
+ /** Index into the node's choices array. */
22
+ choiceIndex: number;
23
+ }
24
+ export interface VoteSubmitted {
25
+ type: "VoteSubmitted";
26
+ /** Index into the node's vote options array. */
27
+ optionIndex: number;
28
+ }
29
+ export interface ReadyConfirmed {
30
+ type: "ReadyConfirmed";
31
+ }
32
+ export interface ExploreOptionSelected {
33
+ type: "ExploreOptionSelected";
34
+ /** Index into the explore node's options array. */
35
+ optionIndex: number;
36
+ }
37
+ export interface ExploreExitSelected {
38
+ type: "ExploreExitSelected";
39
+ /** Index into the explore node's exits array. */
40
+ exitIndex: number;
41
+ }
42
+ export interface ExploreExitVote {
43
+ type: "ExploreExitVote";
44
+ /** Whether this player accepts the proposed exit. */
45
+ accepted: boolean;
46
+ }
47
+ export interface PlayerPing {
48
+ type: "PlayerPing";
49
+ /** ISO-8601 timestamp from the controller. */
50
+ timestamp: string;
51
+ }
52
+ /**
53
+ * Discriminated union of all messages a phone controller can send to the TV engine.
54
+ * Discriminant field: `type`.
55
+ */
56
+ export type ControllerMessage = HeroSelected | QTEResponse | ChoiceSelected | VoteSubmitted | ExploreOptionSelected | ExploreExitSelected | ExploreExitVote | ReadyConfirmed | PlayerPing;
57
+ /** All possible `type` values for ControllerMessage. */
58
+ export type ControllerMessageType = ControllerMessage["type"];
59
+ //# sourceMappingURL=controller-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-message.d.ts","sourceRoot":"","sources":["../src/controller-message.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IACvB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,eAAe,CAAC;IACtB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,iBAAiB,CAAC;IACxB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,WAAW,GACX,cAAc,GACd,aAAa,GACb,qBAAqB,GACrB,mBAAmB,GACnB,eAAe,GACf,cAAc,GACd,UAAU,CAAC;AAEf,wDAAwD;AACxD,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * controller-message.ts
3
+ *
4
+ * Phone → TV typed event union.
5
+ * Sent by the phone controller to the TV game engine via IControllerTransport.sendInput().
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=controller-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller-message.js","sourceRoot":"","sources":["../src/controller-message.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * display-instruction.ts
3
+ *
4
+ * TV → Phone typed payload union.
5
+ * Sent by the TV game engine to phone controllers via IClientAdapter.sendToController().
6
+ */
7
+ export interface RenderLayout {
8
+ type: "RenderLayout";
9
+ /** Layout template identifier (e.g. "choice_prompt", "qte_tap", "vote_grid"). */
10
+ template: string;
11
+ /** Template-specific data — shape varies by template. */
12
+ data: Record<string, unknown>;
13
+ }
14
+ export interface ShowPrompt {
15
+ type: "ShowPrompt";
16
+ /** Prompt text to display. */
17
+ text: string;
18
+ /** Optional choices for the player. */
19
+ choices?: string[];
20
+ /** Optional timer duration in seconds. */
21
+ timerSeconds?: number;
22
+ /** Hero profile image URL for the controller top bar, or null if unset. */
23
+ heroProfileImg?: string | null;
24
+ }
25
+ export interface ShowFeedback {
26
+ type: "ShowFeedback";
27
+ /** Feedback message (e.g. "Correct!", "Time's up!"). */
28
+ text: string;
29
+ /** Visual style hint. */
30
+ style: "success" | "failure" | "neutral";
31
+ }
32
+ export interface ApplyTheme {
33
+ type: "ApplyTheme";
34
+ /** CSS custom properties to apply on the controller. */
35
+ properties: Record<string, string>;
36
+ }
37
+ export interface ShowCountdown {
38
+ type: "ShowCountdown";
39
+ /** Duration in seconds. */
40
+ durationSeconds: number;
41
+ /** Optional label (e.g. "Get ready!"). */
42
+ label?: string;
43
+ }
44
+ export interface ClearScreen {
45
+ type: "ClearScreen";
46
+ }
47
+ export interface GameTerminated {
48
+ type: "GameTerminated";
49
+ /** Optional reason for termination. */
50
+ reason?: string;
51
+ }
52
+ export interface UpdateMeters {
53
+ type: "UpdateMeters";
54
+ /** Meter ID → current value. */
55
+ meters: Record<string, number>;
56
+ }
57
+ export interface ScheduledCue {
58
+ /** Milliseconds from playStartServerTime to show this QTE. */
59
+ atMs: number;
60
+ /** Cue index (matches the timeEvent index on the play_video node). */
61
+ cueIndex: number;
62
+ /** QTE template (e.g. "qte_tap"). */
63
+ template: string;
64
+ /** Template-specific data (text, timeLimit, difficulty, heroProfileImg). */
65
+ data: Record<string, unknown>;
66
+ }
67
+ export interface ScheduleQTE {
68
+ type: "ScheduleQTE";
69
+ /** Server timestamp (Date.now() on app) when the video started playing. */
70
+ playStartServerTime: number;
71
+ /** Cues to schedule, sorted by atMs ascending. */
72
+ cues: ScheduledCue[];
73
+ }
74
+ /**
75
+ * Discriminated union of all instructions the TV engine can send to phone controllers.
76
+ * Discriminant field: `type`.
77
+ */
78
+ export type DisplayInstruction = RenderLayout | ShowPrompt | ShowFeedback | ApplyTheme | ShowCountdown | ClearScreen | GameTerminated | UpdateMeters | ScheduleQTE;
79
+ /** All possible `type` values for DisplayInstruction. */
80
+ export type DisplayInstructionType = DisplayInstruction["type"];
81
+ //# sourceMappingURL=display-instruction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-instruction.d.ts","sourceRoot":"","sources":["../src/display-instruction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,eAAe,CAAC;IACtB,2BAA2B;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IACvB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kDAAkD;IAClD,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAID;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,UAAU,GACV,aAAa,GACb,WAAW,GACX,cAAc,GACd,YAAY,GACZ,WAAW,CAAC;AAEhB,yDAAyD;AACzD,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * display-instruction.ts
3
+ *
4
+ * TV → Phone typed payload union.
5
+ * Sent by the TV game engine to phone controllers via IClientAdapter.sendToController().
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=display-instruction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-instruction.js","sourceRoot":"","sources":["../src/display-instruction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @grg/sdk — Gather Round SDK
3
+ *
4
+ * Shared types, interfaces, and schemas for the Gather Round ecosystem.
5
+ * This package contains contracts only — no business logic, no platform
6
+ * imports, no React.
7
+ */
8
+ export type { RuntimeEpisode, RuntimeHero, RuntimeHeroAttribute, RuntimeMeterDefinition, RuntimeVariable, RuntimeEpisodeAssets, } from "./runtime-episode.js";
9
+ export type { RuntimeNode, RuntimeTransition, RuntimeCondition, RuntimeConditionGroup, RuntimeMutation, } from "./runtime-types.js";
10
+ export type { RuntimeStrings } from "./runtime-strings.js";
11
+ export type { AssetEntry, RuntimeAssetManifest } from "./runtime-assets.js";
12
+ export type { ControllerMessage, ControllerMessageType, HeroSelected, QTEResponse, ChoiceSelected, VoteSubmitted, ExploreOptionSelected, ExploreExitSelected, ExploreExitVote, ReadyConfirmed, PlayerPing, } from "./controller-message.js";
13
+ export type { DisplayInstruction, DisplayInstructionType, RenderLayout, ShowPrompt, ShowFeedback, ApplyTheme, ShowCountdown, ClearScreen, GameTerminated, UpdateMeters, ScheduledCue, ScheduleQTE, } from "./display-instruction.js";
14
+ export type { IContentAdapter } from "./adapters/i-content-adapter.js";
15
+ export type { IClientAdapter, GameSessionOptions, GameSessionResult, PlayerSessionResult, } from "./adapters/i-client-adapter.js";
16
+ export type { ISessionAdapter, PlayerConfig, EpisodeVariables, SceneCheckpoint, } from "./adapters/i-session-adapter.js";
17
+ export type { IControllerTransport } from "./adapters/i-controller-transport.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,YAAY,EACV,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAI5E,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAIlC,YAAY,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAEvE,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AAExC,YAAY,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @grg/sdk — Gather Round SDK
3
+ *
4
+ * Shared types, interfaces, and schemas for the Gather Round ecosystem.
5
+ * This package contains contracts only — no business logic, no platform
6
+ * imports, no React.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * runtime-assets.ts
3
+ *
4
+ * Asset manifest artifact (assets.json).
5
+ * Lists all media files referenced by the episode for pre-loading.
6
+ */
7
+ export interface AssetEntry {
8
+ /** GCS bucket name. */
9
+ bucket: string;
10
+ /** Object path within the bucket. */
11
+ path: string;
12
+ /** Asset type for pre-loading strategy. */
13
+ type: "video" | "image" | "audio";
14
+ }
15
+ /** Keyed by a logical ID (e.g. "hero.1.cardImg", "node-abc.url"). */
16
+ export type RuntimeAssetManifest = Record<string, AssetEntry>;
17
+ //# sourceMappingURL=runtime-assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-assets.d.ts","sourceRoot":"","sources":["../src/runtime-assets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACnC;AAED,qEAAqE;AACrE,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * runtime-assets.ts
3
+ *
4
+ * Asset manifest artifact (assets.json).
5
+ * Lists all media files referenced by the episode for pre-loading.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=runtime-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-assets.js","sourceRoot":"","sources":["../src/runtime-assets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * runtime-episode.ts
3
+ *
4
+ * Top-level runtime episode type — the root of episode.json.
5
+ * Produced by the editor's publish pipeline, consumed by the game engine.
6
+ */
7
+ import type { RuntimeNode } from "./runtime-types.js";
8
+ export interface RuntimeHeroAttribute {
9
+ /** Stable key (e.g. "essence", "fear_meter"). */
10
+ id: string;
11
+ /** Display name (e.g. "Essence", "Fear Meter"). */
12
+ label: string;
13
+ /** Narrative descriptor value — always string. */
14
+ value: string;
15
+ }
16
+ export interface RuntimeMeterDefinition {
17
+ /** Stable key matching variable name (e.g. "alignment"). */
18
+ id: string;
19
+ /** Display label (e.g. "Alignment"). */
20
+ label: string;
21
+ /** Starting value (e.g. 10). */
22
+ defaultValue: number;
23
+ /** Range floor (e.g. 0). */
24
+ min: number;
25
+ /** Range ceiling (e.g. 20). */
26
+ max: number;
27
+ /** Optional CSS color for bar, null = theme default. */
28
+ color: string | null;
29
+ }
30
+ export interface RuntimeHero {
31
+ /** Role slot: 0 = TV Host, 1–4 = player heroes. */
32
+ role: number;
33
+ name: string;
34
+ description: string;
35
+ /** Self-describing attribute array — includes all designer-defined attributes. */
36
+ attributes: RuntimeHeroAttribute[];
37
+ /** Meter definitions for this hero's class (numeric bars with min/max range). */
38
+ meters: RuntimeMeterDefinition[];
39
+ /** GCS path to hero card image (lobby / character sheet), or null if unset. */
40
+ cardImg: string | null;
41
+ /** GCS path to profile image (thumbnail / PiP overlay), or null if unset. */
42
+ profileImg: string | null;
43
+ }
44
+ export interface RuntimeVariable {
45
+ /** Variable name (the target key used in mutations/conditions). */
46
+ name: string;
47
+ /** Data type — determines valid runtime operations. */
48
+ type: "boolean" | "number" | "string";
49
+ /** Starting value at episode begin. */
50
+ defaultValue: boolean | number | string;
51
+ /**
52
+ * When set, the engine creates one instance per entity of this type.
53
+ * null = plain global variable. "hero" = one instance per hero.
54
+ */
55
+ expandBy: "hero" | null;
56
+ }
57
+ export interface RuntimeEpisodeAssets {
58
+ logo: string | null;
59
+ thumbnail: string | null;
60
+ /** Full-screen image shown on the start/title screen. */
61
+ startBg: string | null;
62
+ /** Background image shown behind the lobby UI. */
63
+ lobbyBg: string | null;
64
+ }
65
+ export interface RuntimeEpisode {
66
+ /** Schema version — bumped on breaking changes to the runtime format. */
67
+ version: "2.0" | "2.1" | "2.2";
68
+ /** Firestore episode document ID. */
69
+ episodeId: string;
70
+ /** ISO-8601 timestamp of when this artifact was compiled. */
71
+ compiledAt: string;
72
+ /** Publish version ID (timestamp-based, e.g. "20260306T120000Z"). */
73
+ versionId: string;
74
+ title: string;
75
+ genre: string | null;
76
+ summary: string | null;
77
+ /** Node ID to begin execution from. */
78
+ startNodeId: string;
79
+ heroes: RuntimeHero[];
80
+ variables: RuntimeVariable[];
81
+ assets: RuntimeEpisodeAssets;
82
+ nodes: RuntimeNode[];
83
+ }
84
+ //# sourceMappingURL=runtime-episode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-episode.d.ts","sourceRoot":"","sources":["../src/runtime-episode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,iFAAiF;IACjF,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,+EAA+E;IAC/E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtC,uCAAuC;IACvC,YAAY,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAID,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yDAAyD;IACzD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,kDAAkD;IAClD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAID,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC/B,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IAGpB,MAAM,EAAE,WAAW,EAAE,CAAC;IAGtB,SAAS,EAAE,eAAe,EAAE,CAAC;IAG7B,MAAM,EAAE,oBAAoB,CAAC;IAG7B,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * runtime-episode.ts
3
+ *
4
+ * Top-level runtime episode type — the root of episode.json.
5
+ * Produced by the editor's publish pipeline, consumed by the game engine.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=runtime-episode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-episode.js","sourceRoot":"","sources":["../src/runtime-episode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * runtime-strings.ts
3
+ *
4
+ * String extraction artifact (strings.en.json).
5
+ * Flat key-value map of all player-facing text, keyed by node + field path.
6
+ */
7
+ /**
8
+ * Flat key-value map of all player-facing text.
9
+ * Keys follow the pattern: `{nodeId}.{field}` or `{nodeId}.{field}.{index}`
10
+ */
11
+ export type RuntimeStrings = Record<string, string>;
12
+ //# sourceMappingURL=runtime-strings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-strings.d.ts","sourceRoot":"","sources":["../src/runtime-strings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * runtime-strings.ts
3
+ *
4
+ * String extraction artifact (strings.en.json).
5
+ * Flat key-value map of all player-facing text, keyed by node + field path.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=runtime-strings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-strings.js","sourceRoot":"","sources":["../src/runtime-strings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}