@dreamboard-games/sdk 0.5.0-alpha.2 → 0.5.0-alpha.3

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 (150) hide show
  1. package/README.md +136 -45
  2. package/dist/chunk-DMFVAZI2.js +16 -0
  3. package/dist/chunk-DMFVAZI2.js.map +1 -0
  4. package/dist/chunk-FMM5LVJW.js +833 -0
  5. package/dist/chunk-FMM5LVJW.js.map +1 -0
  6. package/dist/{chunk-S2JEDVWH.js → chunk-LRILEVKC.js} +6113 -6489
  7. package/dist/chunk-LRILEVKC.js.map +1 -0
  8. package/dist/chunk-SP234IY4.js +1363 -0
  9. package/dist/chunk-SP234IY4.js.map +1 -0
  10. package/dist/chunk-VUWNJXLJ.js +52 -0
  11. package/dist/chunk-VUWNJXLJ.js.map +1 -0
  12. package/dist/chunk-ZPRKWPEP.js +511 -0
  13. package/dist/chunk-ZPRKWPEP.js.map +1 -0
  14. package/dist/definition-BaHNPZol.d.ts +4639 -0
  15. package/dist/diagnostics-B0lgnuZ6.d.ts +65 -0
  16. package/dist/index.d.ts +3553 -1
  17. package/dist/index.js +1045 -6
  18. package/dist/index.js.map +1 -1
  19. package/dist/model-BHro6yXu.d.ts +288 -0
  20. package/dist/react.d.ts +32 -0
  21. package/dist/react.js +80 -0
  22. package/dist/react.js.map +1 -0
  23. package/dist/reducer.d.ts +1194 -79
  24. package/dist/reducer.js +4326 -121
  25. package/dist/reducer.js.map +1 -1
  26. package/dist/testing.d.ts +518 -564
  27. package/dist/testing.js +2448 -915
  28. package/dist/testing.js.map +1 -1
  29. package/dist/types-DimqnJBq.d.ts +86 -0
  30. package/package.json +26 -131
  31. package/dist/HandView-Bi2lxzQP.d.ts +0 -79
  32. package/dist/ResourceCounter-BFxJknqp.d.ts +0 -98
  33. package/dist/ThemeProvider-CElaL2ik.d.ts +0 -99
  34. package/dist/attributes-DbvyMbXw.d.ts +0 -68
  35. package/dist/browser-interaction.d.ts +0 -910
  36. package/dist/browser-interaction.js +0 -119
  37. package/dist/browser-interaction.js.map +0 -1
  38. package/dist/chunk-32PFKDV7.js +0 -11705
  39. package/dist/chunk-32PFKDV7.js.map +0 -1
  40. package/dist/chunk-3BAD4VC2.js +0 -263
  41. package/dist/chunk-3BAD4VC2.js.map +0 -1
  42. package/dist/chunk-3SKDNDPG.js +0 -104
  43. package/dist/chunk-3SKDNDPG.js.map +0 -1
  44. package/dist/chunk-5YV2WHJ4.js +0 -25
  45. package/dist/chunk-5YV2WHJ4.js.map +0 -1
  46. package/dist/chunk-ANRB4XKA.js +0 -90
  47. package/dist/chunk-ANRB4XKA.js.map +0 -1
  48. package/dist/chunk-BI4G3PM2.js +0 -1864
  49. package/dist/chunk-BI4G3PM2.js.map +0 -1
  50. package/dist/chunk-EVCLTY4Q.js +0 -935
  51. package/dist/chunk-EVCLTY4Q.js.map +0 -1
  52. package/dist/chunk-GDPKTBUR.js +0 -564
  53. package/dist/chunk-GDPKTBUR.js.map +0 -1
  54. package/dist/chunk-H6VDGFL5.js +0 -2903
  55. package/dist/chunk-H6VDGFL5.js.map +0 -1
  56. package/dist/chunk-LR3ZTWQF.js +0 -5960
  57. package/dist/chunk-LR3ZTWQF.js.map +0 -1
  58. package/dist/chunk-PF7L4BMG.js +0 -117
  59. package/dist/chunk-PF7L4BMG.js.map +0 -1
  60. package/dist/chunk-PN5O6GG2.js +0 -32
  61. package/dist/chunk-PN5O6GG2.js.map +0 -1
  62. package/dist/chunk-PZ5AY32C.js +0 -10
  63. package/dist/chunk-PZ5AY32C.js.map +0 -1
  64. package/dist/chunk-S2JEDVWH.js.map +0 -1
  65. package/dist/chunk-T3ZKNUZ7.js +0 -1
  66. package/dist/chunk-T3ZKNUZ7.js.map +0 -1
  67. package/dist/chunk-UGH54WZ2.js +0 -223
  68. package/dist/chunk-UGH54WZ2.js.map +0 -1
  69. package/dist/chunk-VCDWP5VL.js +0 -746
  70. package/dist/chunk-VCDWP5VL.js.map +0 -1
  71. package/dist/chunk-VDXOF4FW.js +0 -69
  72. package/dist/chunk-VDXOF4FW.js.map +0 -1
  73. package/dist/chunk-WHR5UW3F.js +0 -1988
  74. package/dist/chunk-WHR5UW3F.js.map +0 -1
  75. package/dist/chunk-Y75CFE77.js +0 -17
  76. package/dist/chunk-Y75CFE77.js.map +0 -1
  77. package/dist/chunk-Z7QCREWI.js +0 -3435
  78. package/dist/chunk-Z7QCREWI.js.map +0 -1
  79. package/dist/chunk-ZZGN2ATS.js +0 -1941
  80. package/dist/chunk-ZZGN2ATS.js.map +0 -1
  81. package/dist/components-gAbIz7hK.d.ts +0 -1284
  82. package/dist/definitions-BgmV_GhC.d.ts +0 -300
  83. package/dist/diagnostics-DIi3ina7.d.ts +0 -50
  84. package/dist/digest.d.ts +0 -8
  85. package/dist/game-CsZScpcn.d.ts +0 -763
  86. package/dist/hex-board-view-aKkblDp6.d.ts +0 -1228
  87. package/dist/index-CcT9Q7N7.d.ts +0 -193
  88. package/dist/index.d-DjzoK7zn.d.ts +0 -2101
  89. package/dist/package-set.d.ts +0 -13
  90. package/dist/package-set.js +0 -12
  91. package/dist/package-set.js.map +0 -1
  92. package/dist/player-state-Cqpyeql0.d.ts +0 -371
  93. package/dist/plugin-runtime-contract.d.ts +0 -17
  94. package/dist/plugin-runtime-contract.js +0 -92
  95. package/dist/plugin-runtime-contract.js.map +0 -1
  96. package/dist/primitive-props-BNHDkgd7.d.ts +0 -16
  97. package/dist/protocol-dYgafTYY.d.ts +0 -314
  98. package/dist/reducer/advanced.d.ts +0 -82
  99. package/dist/reducer/advanced.js +0 -51
  100. package/dist/reducer/advanced.js.map +0 -1
  101. package/dist/reducer-contract.d.ts +0 -11
  102. package/dist/reducer-contract.js +0 -16
  103. package/dist/reducer-contract.js.map +0 -1
  104. package/dist/reference-games/index.d.ts +0 -31
  105. package/dist/reference-games/index.js +0 -48
  106. package/dist/reference-games/index.js.map +0 -1
  107. package/dist/runtime/primitives.d.ts +0 -250
  108. package/dist/runtime/primitives.js +0 -189
  109. package/dist/runtime/primitives.js.map +0 -1
  110. package/dist/runtime/runtime-api.d.ts +0 -2
  111. package/dist/runtime/runtime-api.js +0 -1
  112. package/dist/runtime/runtime-api.js.map +0 -1
  113. package/dist/runtime/workspace-contract.d.ts +0 -392
  114. package/dist/runtime/workspace-contract.js +0 -28
  115. package/dist/runtime/workspace-contract.js.map +0 -1
  116. package/dist/runtime-RJ5orDJU.d.ts +0 -1699
  117. package/dist/runtime-api-Bz5pwNU_.d.ts +0 -296
  118. package/dist/runtime-json-CQ9QbLZ5.d.ts +0 -5
  119. package/dist/runtime.d.ts +0 -83
  120. package/dist/runtime.js +0 -242
  121. package/dist/runtime.js.map +0 -1
  122. package/dist/schema.d.ts +0 -379
  123. package/dist/stale-contract-artifact-error-XLaweZtF.d.ts +0 -18
  124. package/dist/testing-compiler.d.ts +0 -37
  125. package/dist/testing-compiler.js +0 -272
  126. package/dist/testing-compiler.js.map +0 -1
  127. package/dist/testing-runtime.d.ts +0 -119
  128. package/dist/testing-runtime.js +0 -212
  129. package/dist/testing-runtime.js.map +0 -1
  130. package/dist/types-DJj5MJkl.d.ts +0 -256
  131. package/dist/types-DR7DoB1x.d.ts +0 -28
  132. package/dist/types-JWCYHmu7.d.ts +0 -122
  133. package/dist/types.d.ts +0 -1958
  134. package/dist/types.js +0 -14
  135. package/dist/types.js.map +0 -1
  136. package/dist/ui/components.d.ts +0 -17
  137. package/dist/ui/components.js +0 -216
  138. package/dist/ui/components.js.map +0 -1
  139. package/dist/ui/defaults.d.ts +0 -19
  140. package/dist/ui/defaults.js +0 -104
  141. package/dist/ui/defaults.js.map +0 -1
  142. package/dist/ui/player-state.d.ts +0 -2
  143. package/dist/ui/player-state.js +0 -1
  144. package/dist/ui/player-state.js.map +0 -1
  145. package/dist/ui/plugin-styles.css +0 -2
  146. package/dist/ui-contract-GTUPkf8z.d.ts +0 -1168
  147. package/dist/ui.d.ts +0 -317
  148. package/dist/ui.js +0 -277
  149. package/dist/ui.js.map +0 -1
  150. package/dist/views-BpuWcOyN.d.ts +0 -1641
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/reducer/authoring/effect.ts","../src/reducer/game-event.ts","../src/reducer/compose.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n AnySchema,\n EffectRollDieDefinition,\n EffectShuffleDefinition,\n EffectShufflePlayerZoneDefinition,\n} from \"../model\";\nimport type {\n ContinuationCallable,\n ResumableEffectKind,\n} from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nfunction createContinuationCallable<\n DataSchema extends AnySchema,\n ResponseSchema extends AnySchema,\n State extends {\n table: import(\"../model\").RuntimeTableRecord;\n flow: { currentPhase: string };\n },\n Manifest extends import(\"../model\").ManifestContract<\n import(\"../model\").TableOfState<State>\n >,\n EffectType extends ResumableEffectKind = ResumableEffectKind,\n>(definition: {\n id: string;\n data: DataSchema;\n response: ResponseSchema;\n effectKind?: EffectType;\n reduce: ContinuationCallable<\n DataSchema,\n State,\n Manifest,\n string,\n EffectType\n >[\"reduce\"];\n}): ContinuationCallable<DataSchema, State, Manifest, string, EffectType> {\n const continuation = ((data: z.infer<DataSchema>) => {\n return {\n id: continuation.id,\n data,\n };\n }) as ContinuationCallable<DataSchema, State, Manifest, string, EffectType>;\n continuation.id = definition.id;\n continuation.source = \"effect\";\n continuation.dataSchema = definition.data;\n continuation.responseSchema = definition.response;\n continuation.reduce = definition.reduce;\n if (definition.effectKind !== undefined) {\n continuation.effectKind = definition.effectKind;\n }\n return continuation;\n}\n\n// --- `defineEffect` ---\n//\n// Authoring factory for engine-side resumable effects (cues). An effect\n// is the registered bundle of continuation callable + optional reduce,\n// discriminated by `type` which aligns directly with `ResumableEffectKind`:\n//\n// defineEffect<GameContract>()({ type: \"rollDie\", id, context?, reduce? })\n// defineEffect<GameContract>()({ type: \"shuffleSharedZone\", id, context?, reduce? })\n//\n// Authored effects are registered under `phase.effects` and invoked from\n// a reducer via `fx.effect(effect, options)`. The wire protocol already\n// isolates the continuation payload into the ingress bundle's\n// `continuations` map keyed by `effectId`, so `fx.effect` never attaches\n// `resume: undefined` to the wire effect.\n//\n// Addressed player requests are *not* effects. Author them as\n// prompt-kind interactions via `defineInteraction({ kind: \"prompt\",\n// to, options, ... })`.\n\ntype EffectRollDieInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"rollDie\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"rollDie\"\n >[\"reduce\"];\n};\n\ntype EffectShuffleInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shuffleSharedZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shuffleSharedZone\"\n >[\"reduce\"];\n};\n\ntype EffectShufflePlayerZoneInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shufflePlayerZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shufflePlayerZone\"\n >[\"reduce\"];\n};\n\nexport function defineEffect<Contract extends AnyReducerGameContract>() {\n type EffectInput =\n | EffectRollDieInput<Contract, string, AnySchema>\n | EffectShuffleInput<Contract, string, AnySchema>\n | EffectShufflePlayerZoneInput<Contract, string, AnySchema>;\n type EffectOutput =\n | EffectRollDieDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShuffleDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShufflePlayerZoneDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectRollDieInput<Contract, Id, ContextSchema>,\n ): EffectRollDieDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShuffleInput<Contract, Id, ContextSchema>,\n ): EffectShuffleDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShufflePlayerZoneInput<Contract, Id, ContextSchema>,\n ): EffectShufflePlayerZoneDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect(definition: EffectInput): EffectOutput {\n if (\n definition.type === \"rollDie\" ||\n definition.type === \"shuffleSharedZone\" ||\n definition.type === \"shufflePlayerZone\"\n ) {\n const effectKind: ResumableEffectKind = definition.type;\n if (!definition.reduce) {\n return {\n type: definition.type,\n id: definition.id,\n contextSchema: definition.context,\n } as EffectOutput;\n }\n const contextSchema = (definition.context ?? z.object({})) as AnySchema;\n const continuation = createContinuationCallable<\n AnySchema,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n ResumableEffectKind\n >({\n id: definition.id,\n data: contextSchema,\n response: z.unknown() as AnySchema,\n effectKind,\n reduce: definition.reduce,\n });\n return {\n type: definition.type,\n id: definition.id,\n contextSchema,\n __continuation: continuation,\n } as EffectOutput;\n }\n throw new Error(\n `defineEffect: unknown effect definition. Expected type 'rollDie' | 'shuffleSharedZone' | 'shufflePlayerZone'. Addressed prompts are authored as prompt-kind interactions via defineInteraction({ kind: \"prompt\" }).`,\n );\n }\n return effect;\n}\n","import type { SystemActionEvent } from \"./model\";\n\nexport const gameEvent = {\n systemAction(event: Omit<SystemActionEvent, \"kind\">): SystemActionEvent {\n return {\n kind: \"systemAction\",\n ...event,\n };\n },\n};\n","/**\n * State composition primitives.\n *\n * `pipe` threads a seed state through a sequence of `State -> State`\n * transformations, left to right. It is the preferred way to compose curried\n * writers (the `ops.*` namespace) in reducers:\n *\n * return accept(\n * pipe(state,\n * ops.spendPlayerResources({ playerId, resources: cost }),\n * ops.placePieceOnVertex({ boardId, vertexId, pieceId, ownerId: playerId }),\n * ),\n * );\n */\n/**\n * A state-preserving transformation.\n *\n * `Op<State>` is polymorphic in the exact input subtype — given a state `S`\n * that extends `State`, it returns the same `S`. This lets curried writers\n * from `ops.*` and author-written helpers thread through phase-scoped `pipe`\n * calls without losing the narrowed phase state type.\n */\nexport type Op<State> = <S extends State>(state: S) => S;\n\nexport function pipe<State>(\n state: State,\n ...ops: ReadonlyArray<Op<NoInfer<State>>>\n): State {\n let result = state;\n for (const op of ops) {\n result = op(result);\n }\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,SAAS;AAiBlB,SAAS,2BAWP,YAYwE;AACxE,QAAM,gBAAgB,CAAC,SAA8B;AACnD,WAAO;AAAA,MACL,IAAI,aAAa;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACA,eAAa,KAAK,WAAW;AAC7B,eAAa,SAAS;AACtB,eAAa,aAAa,WAAW;AACrC,eAAa,iBAAiB,WAAW;AACzC,eAAa,SAAS,WAAW;AACjC,MAAI,WAAW,eAAe,QAAW;AACvC,iBAAa,aAAa,WAAW;AAAA,EACvC;AACA,SAAO;AACT;AAwEO,SAAS,eAAwD;AAyDtE,WAAS,OAAO,YAAuC;AACrD,QACE,WAAW,SAAS,aACpB,WAAW,SAAS,uBACpB,WAAW,SAAS,qBACpB;AACA,YAAM,aAAkC,WAAW;AACnD,UAAI,CAAC,WAAW,QAAQ;AACtB,eAAO;AAAA,UACL,MAAM,WAAW;AAAA,UACjB,IAAI,WAAW;AAAA,UACf,eAAe,WAAW;AAAA,QAC5B;AAAA,MACF;AACA,YAAM,gBAAiB,WAAW,WAAW,EAAE,OAAO,CAAC,CAAC;AACxD,YAAM,eAAe,2BAMnB;AAAA,QACA,IAAI,WAAW;AAAA,QACf,MAAM;AAAA,QACN,UAAU,EAAE,QAAQ;AAAA,QACpB;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,aAAO;AAAA,QACL,MAAM,WAAW;AAAA,QACjB,IAAI,WAAW;AAAA,QACf;AAAA,QACA,gBAAgB;AAAA,MAClB;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC/NO,IAAM,YAAY;AAAA,EACvB,aAAa,OAA2D;AACtE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,GAAG;AAAA,IACL;AAAA,EACF;AACF;;;ACeO,SAAS,KACd,UACG,KACI;AACP,MAAI,SAAS;AACb,aAAW,MAAM,KAAK;AACpB,aAAS,GAAG,MAAM;AAAA,EACpB;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/reducer/manifest/compiler.ts","../src/reducer/manifest/generated-helpers.ts","../src/reducer/manifest/preset-card-sets.ts","../src/reducer/manifest/manifest-validation.ts","../src/reducer/manifest/materialize.ts","../src/reducer/manifest/schema.ts","../src/reducer/schema-helpers.ts","../src/reducer/authoring/validation.ts","../src/reducer/authoring/steps.ts","../src/reducer/inputs/formInput.ts","../src/reducer/inputs/boardInput.ts","../src/reducer/inputs/targetRule.ts","../src/reducer/inputs/boardTarget.ts","../src/reducer/inputs/cardTarget.ts","../src/reducer/inputs/cardInput.ts","../src/reducer/inputs/rngInput.ts","../src/reducer/inputs/many.ts","../src/reducer/authoring/interaction.ts","../src/reducer/authoring/phase.ts","../src/reducer/authoring/views.ts","../src/reducer/authoring/contract-authoring.ts","../src/reducer/authoring/contract.ts","../src/reducer/authoring/game.ts","../src/reducer/game-event.ts","../src/reducer/memoize.ts","../src/reducer/manifest/authoring.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { buildTypedRecord } from \"./generated-helpers.js\";\nimport { type GameTopologyManifest } from \"../../shared/domain/manifest.js\";\nimport { analyzeManifest, materializeManifestTable } from \"./materialize\";\nimport { createTableSchema, type RuntimeManifestIds } from \"./schema\";\nimport { asPlayerId } from \"../per-player\";\nimport {\n assumeManifestSchema,\n createManifestStringLiteralSchema,\n markManifestScopedSchema,\n createManifestRuntimeSchema,\n createManifestGameStateSchema,\n} from \"../model/manifest\";\nimport type { ReducerManifestContract, RuntimeTableRecord } from \"../model\";\nimport type { AuthoredManifest, CompiledManifest } from \"./types\";\n\n/** Compile authored topology once, in memory, with the same validation used by initialization. */\nexport function compileManifest<const M extends AuthoredManifest>(\n manifest: M,\n): CompiledManifest<M> {\n const source = manifest as unknown as GameTopologyManifest;\n const analysis = analyzeManifest(source);\n const initial = materializeManifestTable({\n manifest: source,\n playerIds: analysis.playerIds,\n shuffleItems: (values) => [...values],\n });\n const sharedZoneIds = analysis.sharedZones.map((zone) => zone.id).sort();\n const playerZoneIds = analysis.playerZones.map((zone) => zone.id).sort();\n const literals = {\n ...Object.fromEntries(\n Object.entries(analysis)\n .filter(([key]) => key.endsWith(\"Ids\") || key === \"cardTypes\")\n .map(([key, value]) => [key, value]),\n ),\n playerIds: analysis.playerIds.map(asPlayerId),\n phaseNames: [],\n boardLayouts: [\"generic\", \"hex\", \"square\"],\n deckIds: sharedZoneIds,\n handIds: playerZoneIds,\n sharedZoneIds,\n playerZoneIds,\n resourcePresentationById: analysis.resourcePresentationById,\n handVisibilityById: Object.fromEntries(\n playerZoneIds.map((id) => [\n id,\n analysis.zoneVisibilityById.get(id) ?? \"ownerOnly\",\n ]),\n ),\n zoneVisibilityById: Object.fromEntries(analysis.zoneVisibilityById),\n cardSetIdByCardId: Object.fromEntries(analysis.cardSetIdByCardId),\n cardTypeByCardId: Object.fromEntries(analysis.cardTypeByCardId),\n cardSetIdsBySharedZoneId: Object.fromEntries(analysis.sharedZoneCardSetIds),\n cardSetIdsByPlayerZoneId: Object.fromEntries(analysis.playerZoneCardSetIds),\n } as unknown as ReducerManifestContract<\n RuntimeTableRecord,\n string,\n string,\n string,\n string,\n string\n >[\"literals\"];\n const families = [\n \"phaseName\",\n \"boardLayout\",\n \"cardSetId\",\n \"cardType\",\n \"cardId\",\n \"deckId\",\n \"handId\",\n \"sharedZoneId\",\n \"playerZoneId\",\n \"zoneId\",\n \"resourceId\",\n \"pieceTypeId\",\n \"pieceId\",\n \"dieTypeId\",\n \"dieId\",\n \"boardTypeId\",\n \"boardBaseId\",\n \"boardId\",\n \"boardContainerId\",\n \"relationTypeId\",\n \"edgeId\",\n \"edgeTypeId\",\n \"vertexId\",\n \"vertexTypeId\",\n \"spaceId\",\n \"spaceTypeId\",\n ] as const;\n const ids = {\n ...Object.fromEntries(\n families.map((family) => {\n const values = literals[\n `${family}s` as keyof typeof literals\n ] as readonly string[];\n return [\n family,\n family === \"phaseName\"\n ? markManifestScopedSchema(z.string(), family)\n : values.length\n ? createManifestStringLiteralSchema(values, family)\n : markManifestScopedSchema(z.never(), family),\n ];\n }),\n ),\n playerId: markManifestScopedSchema(\n z.string().min(1).transform(asPlayerId),\n \"playerId\",\n ),\n } as unknown as RuntimeManifestIds;\n const boardIdSchemas = analysis.analyzedBoards.map((board) =>\n board.board.scope === \"perPlayer\"\n ? z.templateLiteral([board.board.id, \":\", z.string().min(1)])\n : z.literal(board.board.id),\n );\n ids.boardId = markManifestScopedSchema(\n boardIdSchemas.length ? z.union(boardIdSchemas) : z.never(),\n \"boardId\",\n );\n const tableSchema = assumeManifestSchema<RuntimeTableRecord>(\n createTableSchema(analysis, ids),\n );\n const resolvePlayers = (players: readonly string[] = analysis.playerIds) =>\n players.map(asPlayerId);\n const emptyDecks = () =>\n Object.fromEntries(sharedZoneIds.map((id) => [id, []]));\n const hands = (players?: readonly string[]) =>\n Object.fromEntries(\n playerZoneIds.map((id) => [\n id,\n Object.fromEntries(resolvePlayers(players).map((id) => [id, []])),\n ]),\n );\n const defaults = {\n zones: (players?: readonly string[]) => ({\n shared: emptyDecks(),\n perPlayer: hands(players),\n visibility: structuredClone(literals.zoneVisibilityById),\n cardSetIdsByZoneId: Object.fromEntries(analysis.zoneCardSetIdsById),\n }),\n decks: emptyDecks,\n hands,\n handVisibility: () => structuredClone(literals.handVisibilityById),\n ownerOfCard: () =>\n Object.fromEntries(analysis.cardIds.map((id) => [id, null])),\n visibility: () =>\n Object.fromEntries(analysis.cardIds.map((id) => [id, { faceUp: true }])),\n resources: (players?: readonly string[]) =>\n Object.fromEntries(\n resolvePlayers(players).map((id) => [\n id,\n Object.fromEntries(analysis.resourceIds.map((id) => [id, 0])),\n ]),\n ),\n };\n const runtimeSchema = createManifestRuntimeSchema({\n phaseNameSchema: z.string(),\n playerIdSchema: ids.playerId,\n });\n const createInitialTable = (\n options: {\n playerIds?: readonly string[];\n shuffleItems?: <V>(values: readonly V[]) => V[];\n } = {},\n ) =>\n tableSchema.parse(\n materializeManifestTable({\n manifest: source,\n playerIds: options.playerIds ?? analysis.playerIds,\n shuffleItems: options.shuffleItems ?? ((values) => [...values]),\n }),\n );\n return {\n literals,\n ids,\n defaults,\n records: Object.fromEntries(\n families.map((family) => [\n `${family}s`,\n <V>(initial: V | ((id: string) => V)) =>\n buildTypedRecord(\n literals[\n `${family}s` as keyof typeof literals\n ] as readonly string[],\n initial,\n ),\n ]),\n ),\n tableSchema,\n runtimeSchema,\n schemas: { table: tableSchema, runtime: runtimeSchema },\n staticBoards: initial.boards,\n createInitialTable,\n normalSetup: {\n minPlayers: source.players.minPlayers,\n maxPlayers: source.players.maxPlayers,\n createInitialTable,\n },\n createGameStateSchema: (\n config: Parameters<CompiledManifest<M>[\"createGameStateSchema\"]>[0],\n ) =>\n createManifestGameStateSchema({\n ...config,\n tableSchema,\n playerIdSchema: ids.playerId,\n }),\n } as unknown as CompiledManifest<M>;\n}\n","type RecordInitializer<Id extends string, Value> = Value | ((id: Id) => Value);\n\nexport function buildTypedRecord<Id extends string, Value>(\n ids: readonly Id[],\n initial: RecordInitializer<Id, Value>,\n): Record<Id, Value> {\n const createValue =\n typeof initial === \"function\"\n ? (initial as (id: Id) => Value)\n : () => initial;\n\n return Object.fromEntries(ids.map((id) => [id, createValue(id)])) as Record<\n Id,\n Value\n >;\n}\n\nexport function isTypedId<Id extends string>(\n ids: readonly Id[],\n value: string,\n): value is Id {\n return (ids as readonly string[]).includes(value);\n}\n\nexport function expectTypedId<Id extends string>(\n ids: readonly Id[],\n value: string,\n description: string,\n): Id {\n if (isTypedId(ids, value)) {\n return value;\n }\n\n throw new Error(`Unknown ${description} '${value}'.`);\n}\n","import type {\n BoardCard,\n ComponentHomeSpec,\n ManualCardSetDefinition,\n ObjectSchema,\n PresetCardSetDefinition,\n PropertySchema,\n} from \"../../shared/domain/contracts.js\";\nimport type { GameTopologyManifest } from \"../../shared/domain/manifest.js\";\n\nconst STANDARD_DECK_ID = \"standard_52_deck\";\n\nfunction createEnumPropertySchema(\n enums: string[],\n description: string,\n): PropertySchema {\n return {\n type: \"enum\",\n description,\n enums,\n };\n}\n\nfunction createStringPropertySchema(description: string): PropertySchema {\n return {\n type: \"string\",\n description,\n };\n}\n\nexport function createStandard52CardDeck(\n defaultHome: ComponentHomeSpec = { type: \"detached\" },\n): ManualCardSetDefinition {\n const suits = [\"SPADES\", \"HEARTS\", \"CLUBS\", \"DIAMONDS\"];\n const ranks = [\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \"10\",\n \"J\",\n \"Q\",\n \"K\",\n \"A\",\n \"2\",\n ];\n\n const cards: BoardCard[] = [];\n for (const suit of suits) {\n for (const rank of ranks) {\n cards.push({\n type: `${suit}_${rank}`,\n name: `${rank} of ${suit}`,\n imageUrl: `/cards/${suit.toLowerCase()}_${rank.toLowerCase()}.png`,\n text: `A playing card: ${rank} of ${suit}. Value: ${getBigTwoCardValue(rank)}, Suit value: ${getSuitValue(suit)}`,\n count: 1,\n cardType: `${suit}_${rank}`,\n properties: {\n suit,\n rank,\n },\n });\n }\n }\n\n return {\n id: STANDARD_DECK_ID,\n name: \"Standard 52-Card Deck\",\n type: \"manual\",\n defaultHome,\n cards,\n cardSchema: {\n properties: {\n suit: createEnumPropertySchema(\n [\"SPADES\", \"HEARTS\", \"CLUBS\", \"DIAMONDS\"],\n \"The suit of the card\",\n ),\n rank: createStringPropertySchema(\"The rank of the card\"),\n },\n } satisfies ObjectSchema,\n };\n}\n\nexport function addStandardDecksIfNeeded(\n manifest: GameTopologyManifest,\n): GameTopologyManifest {\n return {\n ...manifest,\n cardSets: manifest.cardSets.map((cardSet) =>\n cardSet.type === \"preset\" && cardSet.presetId === STANDARD_DECK_ID\n ? {\n ...createStandard52CardDeck(cardSet.defaultHome),\n id: cardSet.id,\n name: cardSet.name,\n }\n : cardSet,\n ),\n };\n}\n\nexport function materializePresetCardSet(\n presetCardSet: PresetCardSetDefinition,\n): ManualCardSetDefinition {\n if (presetCardSet.presetId !== STANDARD_DECK_ID) {\n throw new Error(`Unsupported preset deck: ${presetCardSet.presetId}`);\n }\n\n const standardDeck = createStandard52CardDeck(presetCardSet.defaultHome);\n return {\n ...standardDeck,\n id: presetCardSet.id,\n name: presetCardSet.name,\n };\n}\n\nexport function materializeCardSet(\n cardSet: GameTopologyManifest[\"cardSets\"][number],\n): ManualCardSetDefinition {\n return cardSet.type === \"manual\"\n ? cardSet\n : materializePresetCardSet(cardSet);\n}\n\nfunction getBigTwoCardValue(rank: string): number {\n switch (rank) {\n case \"3\":\n return 3;\n case \"4\":\n return 4;\n case \"5\":\n return 5;\n case \"6\":\n return 6;\n case \"7\":\n return 7;\n case \"8\":\n return 8;\n case \"9\":\n return 9;\n case \"10\":\n return 10;\n case \"J\":\n return 11;\n case \"Q\":\n return 12;\n case \"K\":\n return 13;\n case \"A\":\n return 14;\n case \"2\":\n return 15;\n default:\n return 0;\n }\n}\n\nfunction getSuitValue(suit: string): number {\n switch (suit) {\n case \"DIAMONDS\":\n return 1;\n case \"CLUBS\":\n return 2;\n case \"HEARTS\":\n return 3;\n case \"SPADES\":\n return 4;\n default:\n return 0;\n }\n}\n","import type {\n BoardCard,\n BoardSpec,\n DieSeedSpec,\n PieceSeedSpec,\n PieceTypeSpec,\n PropertySchema,\n ZoneSpec,\n} from \"../../shared/domain/contracts.js\";\nimport type {\n DieTypeSpec,\n GameTopologyManifest,\n} from \"../../shared/domain/manifest.js\";\nimport {\n createHexBoardGeometry,\n resolveHexSpaces,\n} from \"../../shared/hex-board.js\";\n\nexport type ManifestAuthoringValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isHexBoardSpec(\n board: BoardSpec,\n): board is Extract<BoardSpec, { layout: \"hex\" }> {\n return board.layout === \"hex\";\n}\n\nfunction collectDuplicateIdIssues(options: {\n entries: ReadonlyArray<{ id?: string | null; path: string }>;\n label: string;\n}): string[] {\n const issues: string[] = [];\n const pathsById = new Map<string, string[]>();\n\n for (const entry of options.entries) {\n const id = entry.id?.trim();\n if (!id) {\n continue;\n }\n const paths = pathsById.get(id) ?? [];\n paths.push(entry.path);\n pathsById.set(id, paths);\n }\n\n for (const [id, paths] of pathsById.entries()) {\n if (paths.length > 1) {\n issues.push(`${paths.join(\", \")}: Duplicate ${options.label} '${id}'.`);\n }\n }\n\n return issues;\n}\n\nconst PROTOTYPE_SENSITIVE_KEYS = new Set([\n \"__proto__\",\n \"prototype\",\n \"constructor\",\n]);\n\nfunction validateRecordKey(\n value: string | null | undefined,\n path: string,\n): string[] {\n if (!value || !PROTOTYPE_SENSITIVE_KEYS.has(value)) {\n return [];\n }\n return [\n `${path}: '${value}' is reserved and cannot be used as a generated record key.`,\n ];\n}\n\nfunction collectKeyIssues(\n entries: ReadonlyArray<{ value?: string | null; path: string }>,\n): string[] {\n return entries.flatMap(({ value, path }) => validateRecordKey(value, path));\n}\n\nfunction toHandleKey(input: string): string {\n if (!/[_-]/.test(input)) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n }\n const [first = \"\", ...rest] = input.split(/[_-]/g).filter(Boolean);\n return [\n first.toLowerCase(),\n ...rest.map((part) => {\n const lower = part.toLowerCase();\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n }),\n ].join(\"\");\n}\n\nfunction collectHandleKeyCollisions(\n values: readonly string[],\n label: string,\n): string[] {\n const idsByHandle = new Map<string, string[]>();\n for (const value of values) {\n const handle = toHandleKey(value);\n idsByHandle.set(handle, [...(idsByHandle.get(handle) ?? []), value]);\n }\n return [...idsByHandle.entries()]\n .filter(([, ids]) => ids.length > 1)\n .map(\n ([handle, ids]) =>\n `${label} values ${ids.join(\", \")} all generate handle '${handle}'.`,\n );\n}\n\nfunction dedupeSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction renderCardInstanceIds(card: BoardCard): string[] {\n return card.count > 1\n ? Array.from(\n { length: card.count },\n (_, index) => `${card.type}-${index + 1}`,\n )\n : [card.type];\n}\n\nfunction collectPropertySchemaKeyIssues(\n schema: PropertySchema | null | undefined,\n path: string,\n): string[] {\n if (!schema) {\n return [];\n }\n const issues: string[] = [];\n if (schema.type === \"object\") {\n for (const [key, property] of Object.entries(schema.properties ?? {})) {\n issues.push(\n ...validateRecordKey(key, `${path}.properties.${key}`),\n ...collectPropertySchemaKeyIssues(\n property,\n `${path}.properties.${key}`,\n ),\n );\n }\n }\n if (schema.type === \"array\") {\n issues.push(\n ...collectPropertySchemaKeyIssues(schema.items, `${path}.items`),\n );\n }\n if (schema.type === \"record\") {\n issues.push(\n ...collectPropertySchemaKeyIssues(schema.values, `${path}.values`),\n );\n }\n return issues;\n}\n\nfunction collectObjectSchemaKeyIssues(\n schema:\n | {\n properties?: Record<string, PropertySchema>;\n }\n | null\n | undefined,\n path: string,\n): string[] {\n const issues: string[] = [];\n for (const [key, property] of Object.entries(schema?.properties ?? {})) {\n issues.push(\n ...validateRecordKey(key, `${path}.properties.${key}`),\n ...collectPropertySchemaKeyIssues(property, `${path}.properties.${key}`),\n );\n }\n return issues;\n}\n\nfunction collectCardSchemaKeyIssues(\n cardSet: GameTopologyManifest[\"cardSets\"][number],\n path: string,\n): string[] {\n if (cardSet.type !== \"manual\") {\n return [];\n }\n const schema = cardSet.cardSchema;\n if (\"variants\" in schema) {\n return [\n ...Object.entries(schema.shared ?? {}).flatMap(([key, property]) => [\n ...validateRecordKey(key, `${path}.cardSchema.shared.${key}`),\n ...collectPropertySchemaKeyIssues(\n property,\n `${path}.cardSchema.shared.${key}`,\n ),\n ]),\n ...Object.entries(schema.variants).flatMap(\n ([variantKey, variantSchema]) => [\n ...validateRecordKey(\n variantKey,\n `${path}.cardSchema.variants.${variantKey}`,\n ),\n ...collectObjectSchemaKeyIssues(\n variantSchema,\n `${path}.cardSchema.variants.${variantKey}`,\n ),\n ],\n ),\n ];\n }\n return collectObjectSchemaKeyIssues(schema, `${path}.cardSchema`);\n}\n\nfunction expandSeedIds<\n Seed extends {\n id?: string | null;\n typeId: string;\n count?: number | null;\n },\n>(seeds: readonly Seed[]): string[] {\n return seeds.flatMap((seed) => {\n const count = seed.count ?? 1;\n const baseId = seed.id ?? seed.typeId;\n return count > 1\n ? Array.from({ length: count }, (_, index) => `${baseId}-${index + 1}`)\n : [baseId];\n });\n}\n\nfunction validateTypeSlotDuplicates(options: {\n pieceTypes: readonly PieceTypeSpec[];\n dieTypes: readonly DieTypeSpec[];\n}): string[] {\n const issues: string[] = [];\n\n for (const [index, pieceType] of options.pieceTypes.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (pieceType.slots ?? []).map((slot, slotIndex) => ({\n id: slot.id,\n path: `manifest.pieceTypes[${index}].slots[${slotIndex}].id`,\n })),\n label: \"piece slot id\",\n }),\n );\n }\n\n for (const [index, dieType] of options.dieTypes.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (dieType.slots ?? []).map((slot, slotIndex) => ({\n id: slot.id,\n path: `manifest.dieTypes[${index}].slots[${slotIndex}].id`,\n })),\n label: \"die slot id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateSlotHostsAndHomes(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const pieceTypesById = new Map(\n (manifest.pieceTypes ?? []).map(\n (pieceType) => [pieceType.id, pieceType] as const,\n ),\n );\n const dieTypesById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [dieType.id, dieType] as const),\n );\n const slotIdsByHostKey = new Map<string, Set<string>>();\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n const pieceType = pieceTypesById.get(seed.typeId);\n const slotIds = (pieceType?.slots ?? []).map((slot) => slot.id);\n if (slotIds.length === 0) {\n continue;\n }\n if (typeof seed.id !== \"string\" || seed.id.length === 0) {\n issues.push(\n `manifest.pieceSeeds[${index}].id: Piece seed for slot-bearing type '${seed.typeId}' must declare an explicit id.`,\n );\n continue;\n }\n if ((seed.count ?? 1) !== 1) {\n issues.push(\n `manifest.pieceSeeds[${index}].count: Piece seed '${seed.id}' for slot-bearing type '${seed.typeId}' must omit count or set it to 1.`,\n );\n continue;\n }\n slotIdsByHostKey.set(`piece:${seed.id}`, new Set(slotIds));\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n const dieType = dieTypesById.get(seed.typeId);\n const slotIds = (dieType?.slots ?? []).map((slot) => slot.id);\n if (slotIds.length === 0) {\n continue;\n }\n if (typeof seed.id !== \"string\" || seed.id.length === 0) {\n issues.push(\n `manifest.dieSeeds[${index}].id: Die seed for slot-bearing type '${seed.typeId}' must declare an explicit id.`,\n );\n continue;\n }\n if ((seed.count ?? 1) !== 1) {\n issues.push(\n `manifest.dieSeeds[${index}].count: Die seed '${seed.id}' for slot-bearing type '${seed.typeId}' must omit count or set it to 1.`,\n );\n continue;\n }\n slotIdsByHostKey.set(`die:${seed.id}`, new Set(slotIds));\n }\n\n const validateHome = (\n home: BoardCard[\"home\"] | PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"],\n path: string,\n ) => {\n if (home?.type !== \"slot\") {\n return;\n }\n\n const hostKey = `${home.host.kind}:${home.host.id}`;\n const slotIds = slotIdsByHostKey.get(hostKey);\n if (!slotIds) {\n issues.push(\n `${path}.host: Unknown strict slot host '${home.host.kind}:${home.host.id}'. Hosts must be singleton piece/die seeds whose type declares slots.`,\n );\n return;\n }\n if (!slotIds.has(home.slotId)) {\n issues.push(\n `${path}.slotId: Unknown slot '${home.slotId}' for host '${home.host.kind}:${home.host.id}'.`,\n );\n }\n };\n\n for (const [cardSetIndex, cardSet] of manifest.cardSets.entries()) {\n if (cardSet.type !== \"manual\") {\n continue;\n }\n validateHome(\n cardSet.defaultHome,\n `manifest.cardSets[${cardSetIndex}].defaultHome`,\n );\n for (const [cardIndex, card] of cardSet.cards.entries()) {\n validateHome(\n card.home,\n `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].home`,\n );\n }\n }\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n validateHome(seed.home, `manifest.pieceSeeds[${index}].home`);\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n validateHome(seed.home, `manifest.dieSeeds[${index}].home`);\n }\n\n return issues;\n}\n\nfunction validatePlayerScopedSeedHomes(\n manifest: GameTopologyManifest,\n): string[] {\n const issues: string[] = [];\n const boardScopeById = new Map(\n (manifest.boards ?? []).map((board) => [board.id, board.scope] as const),\n );\n const zoneScopeById = new Map(\n (manifest.zones ?? []).map((zone) => [zone.id, zone.scope] as const),\n );\n\n const validateSeedHome = (\n seed: PieceSeedSpec | DieSeedSpec,\n path: string,\n label: \"Piece seed\" | \"Die seed\",\n ) => {\n const authoredId = seed.id ?? seed.typeId;\n if (seed.ownerId) {\n return;\n }\n\n if (\n homeTargetsBoard(seed.home) &&\n boardScopeById.get(seed.home.boardId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.boardId: ${label} '${authoredId}' requires ownerId because board '${seed.home.boardId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n return;\n }\n\n if (\n seed.home?.type === \"zone\" &&\n zoneScopeById.get(seed.home.zoneId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.zoneId: ${label} '${authoredId}' requires ownerId because zone '${seed.home.zoneId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n };\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n validateSeedHome(seed, `manifest.pieceSeeds[${index}].home`, \"Piece seed\");\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n validateSeedHome(seed, `manifest.dieSeeds[${index}].home`, \"Die seed\");\n }\n\n return issues;\n}\n\nfunction validateCardHomes(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const boardScopeById = new Map(\n (manifest.boards ?? []).map((board) => [board.id, board.scope] as const),\n );\n const zoneScopeById = new Map(\n (manifest.zones ?? []).map((zone) => [zone.id, zone.scope] as const),\n );\n\n for (const [cardSetIndex, cardSet] of manifest.cardSets.entries()) {\n if (!cardSet.defaultHome) {\n issues.push(\n `manifest.cardSets[${cardSetIndex}].defaultHome: ${\n cardSet.type === \"manual\" ? \"Manual\" : \"Preset\"\n } card sets must declare defaultHome.`,\n );\n continue;\n }\n const validateCardHome = (\n home: BoardCard[\"home\"],\n path: string,\n label: string,\n ) => {\n if (\n home?.type === \"zone\" &&\n zoneScopeById.get(home.zoneId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.zoneId: ${label} cannot target per-player zone '${home.zoneId}' because card inventory has no ownerId. Place it during reducer setup instead.`,\n );\n }\n if (\n homeTargetsBoard(home) &&\n boardScopeById.get(home.boardId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.boardId: ${label} cannot target per-player board '${home.boardId}' because card inventory has no ownerId. Place it during reducer setup instead.`,\n );\n }\n };\n\n validateCardHome(\n cardSet.defaultHome,\n `manifest.cardSets[${cardSetIndex}].defaultHome`,\n `Card set '${cardSet.id}' defaultHome`,\n );\n for (const [cardIndex, card] of (cardSet.type === \"manual\"\n ? cardSet.cards\n : []\n ).entries()) {\n const path = `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].home`;\n validateCardHome(card.home, path, `Card '${card.type}'`);\n }\n }\n\n return issues;\n}\n\nfunction homeTargetsBoard(\n home:\n | BoardCard[\"home\"]\n | PieceSeedSpec[\"home\"]\n | DieSeedSpec[\"home\"]\n | undefined,\n): home is Extract<\n NonNullable<BoardCard[\"home\"] | PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"]>,\n { type: \"space\" | \"container\" | \"edge\" | \"vertex\" }\n> {\n return (\n home?.type === \"space\" ||\n home?.type === \"container\" ||\n home?.type === \"edge\" ||\n home?.type === \"vertex\"\n );\n}\n\nfunction validateBoardDuplicates(boards: readonly BoardSpec[]): string[] {\n const issues: string[] = [];\n\n for (const [index, board] of boards.entries()) {\n if (isHexBoardSpec(board)) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: Object.values(board.spaces ?? {}).map(\n (space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boards[${index}].spaces[${spaceIndex}].id`,\n }),\n ),\n label: \"space id\",\n }),\n );\n continue;\n }\n\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boards[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.containers ?? []).map((container, containerIndex) => ({\n id: container.id,\n path: `manifest.boards[${index}].containers[${containerIndex}].id`,\n })),\n label: \"container id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.relations ?? []).map((relation, relationIndex) => ({\n id: relation.id,\n path: `manifest.boards[${index}].relations[${relationIndex}].id`,\n })),\n label: \"relation id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateHexBoardVertexRefs(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n for (const board of manifest.boards ?? []) {\n if (board.layout !== \"hex\") continue;\n try {\n const geometry = createHexBoardGeometry({\n ...board,\n spaces: resolveHexSpaces(board),\n });\n const vertices = (board.vertices ?? []).map((vertex) =>\n \"spaces\" in vertex.ref\n ? geometry.vertex(...vertex.ref.spaces)\n : geometry.vertexAt(vertex.ref.space, vertex.ref.corner),\n );\n const edges = (board.edges ?? []).map((edge) =>\n \"spaces\" in edge.ref\n ? geometry.edge(...edge.ref.spaces)\n : geometry.edgeAt(edge.ref.space, edge.ref.side),\n );\n if (new Set(vertices).size !== vertices.length)\n throw new Error(\"Duplicate hex vertex refs.\");\n if (new Set(edges).size !== edges.length)\n throw new Error(\"Duplicate hex edge refs.\");\n } catch (error) {\n issues.push(\n `Hex board '${board.id}': ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return issues;\n}\n\nfunction collectAmbiguousBoardTypeWarnings(\n manifest: GameTopologyManifest,\n): string[] {\n const warnings: string[] = [];\n const boardsBySpaceType = new Map<string, Set<string>>();\n const boardsByEdgeType = new Map<string, Set<string>>();\n const boardsByVertexType = new Map<string, Set<string>>();\n\n const addBoardUsage = (\n target: Map<string, Set<string>>,\n typeId: string | null | undefined,\n boardId: string,\n ) => {\n if (!typeId) {\n return;\n }\n const boardIds = target.get(typeId) ?? new Set<string>();\n boardIds.add(boardId);\n target.set(typeId, boardIds);\n };\n\n for (const board of manifest.boards ?? []) {\n for (const space of [\n ...(board.layout === \"hex\"\n ? Object.values(board.spaces ?? {})\n : (board.spaces ?? [])),\n ]) {\n addBoardUsage(boardsBySpaceType, space.typeId, board.id);\n }\n\n if (board.layout === \"hex\" || board.layout === \"square\") {\n for (const edge of [...(board.edges ?? [])]) {\n addBoardUsage(boardsByEdgeType, edge.typeId, board.id);\n }\n for (const vertex of [...(board.vertices ?? [])]) {\n addBoardUsage(boardsByVertexType, vertex.typeId, board.id);\n }\n }\n }\n\n const pushWarnings = (\n kind: \"space\" | \"edge\" | \"vertex\",\n boardsByType: Map<string, Set<string>>,\n helperName: string,\n ) => {\n for (const [typeId, boardIds] of boardsByType.entries()) {\n if (boardIds.size < 2) {\n continue;\n }\n warnings.push(\n `Ambiguous ${kind}.typeId '${typeId}' is authored on multiple boards (${Array.from(boardIds).sort().join(\", \")}). Prefer ${helperName} for board-scoped lookups.`,\n );\n }\n };\n\n pushWarnings(\n \"space\",\n boardsBySpaceType,\n \"boardHelpers.spaceIdsByBoardId / boardHelpers.spaceTypeIdByBoardId\",\n );\n pushWarnings(\n \"edge\",\n boardsByEdgeType,\n \"boardHelpers.edgeIdsByBoardIdAndTypeId\",\n );\n pushWarnings(\n \"vertex\",\n boardsByVertexType,\n \"boardHelpers.vertexIdsByBoardIdAndTypeId\",\n );\n\n return warnings;\n}\n\nfunction collectBoardRecordKeyIssues(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const maxPlayers = manifest.players.maxPlayers;\n const playerIds = Array.from(\n { length: maxPlayers },\n (_, index) => `player-${index + 1}`,\n );\n\n for (const [boardIndex, board] of (manifest.boards ?? []).entries()) {\n const boardPath = `manifest.boards[${boardIndex}]`;\n const runtimeBoardIds =\n board.scope === \"perPlayer\"\n ? playerIds.map((playerId) => `${board.id}:${playerId}`)\n : [board.id];\n issues.push(\n ...collectKeyIssues([\n { value: board.id, path: `${boardPath}.id` },\n { value: board.typeId, path: `${boardPath}.typeId` },\n ...runtimeBoardIds.map((runtimeBoardId) => ({\n value: runtimeBoardId,\n path: `${boardPath}.runtimeBoardId`,\n })),\n ]),\n ...collectObjectSchemaKeyIssues(\n board.boardFieldsSchema,\n `${boardPath}.boardFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n board.spaceFieldsSchema,\n `${boardPath}.spaceFieldsSchema`,\n ),\n );\n\n if (board.layout !== \"hex\") {\n issues.push(\n ...collectObjectSchemaKeyIssues(\n board.relationFieldsSchema,\n `${boardPath}.relationFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n board.containerFieldsSchema,\n `${boardPath}.containerFieldsSchema`,\n ),\n ...collectKeyIssues([\n ...(board.containers ?? []).flatMap((container, containerIndex) => [\n {\n value: container.id,\n path: `${boardPath}.containers[${containerIndex}].id`,\n },\n {\n value:\n container.host.type === \"space\"\n ? container.host.spaceId\n : undefined,\n path: `${boardPath}.containers[${containerIndex}].host.spaceId`,\n },\n ]),\n ...(board.relations ?? []).flatMap((relation, relationIndex) => [\n {\n value: relation.id,\n path: `${boardPath}.relations[${relationIndex}].id`,\n },\n {\n value: relation.typeId,\n path: `${boardPath}.relations[${relationIndex}].typeId`,\n },\n {\n value: relation.fromSpaceId,\n path: `${boardPath}.relations[${relationIndex}].fromSpaceId`,\n },\n {\n value: relation.toSpaceId,\n path: `${boardPath}.relations[${relationIndex}].toSpaceId`,\n },\n ]),\n ]),\n );\n }\n\n if (board.layout !== \"generic\") {\n issues.push(\n ...collectObjectSchemaKeyIssues(\n board.edgeFieldsSchema,\n `${boardPath}.edgeFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n board.vertexFieldsSchema,\n `${boardPath}.vertexFieldsSchema`,\n ),\n ...collectKeyIssues([\n ...(board.edges ?? []).map((edge, edgeIndex) => ({\n value: edge.typeId,\n path: `${boardPath}.edges[${edgeIndex}].typeId`,\n })),\n ...(board.vertices ?? []).map((vertex, vertexIndex) => ({\n value: vertex.typeId,\n path: `${boardPath}.vertices[${vertexIndex}].typeId`,\n })),\n ]),\n );\n }\n\n issues.push(\n ...collectKeyIssues(\n (board.layout === \"hex\"\n ? Object.values(board.spaces ?? {})\n : (board.spaces ?? [])\n ).flatMap((space, spaceIndex) => [\n {\n value: space.id,\n path: `${boardPath}.spaces[${spaceIndex}].id`,\n },\n {\n value: space.typeId,\n path: `${boardPath}.spaces[${spaceIndex}].typeId`,\n },\n ]),\n ),\n );\n }\n\n return issues;\n}\n\nfunction collectManifestRecordKeyIssues(\n manifest: GameTopologyManifest,\n): string[] {\n const cardSets = manifest.cardSets;\n const manualCards = cardSets.flatMap((cardSet, cardSetIndex) =>\n cardSet.type === \"manual\"\n ? cardSet.cards.flatMap((card, cardIndex) =>\n renderCardInstanceIds(card).map((cardId) => ({\n card,\n cardId,\n cardIndex,\n cardSetIndex,\n })),\n )\n : [],\n );\n\n return [\n ...collectKeyIssues([\n ...cardSets.map((cardSet, index) => ({\n value: cardSet.id,\n path: `manifest.cardSets[${index}].id`,\n })),\n ...manualCards.flatMap(({ card, cardId, cardIndex, cardSetIndex }) => [\n {\n value: card.type,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].type`,\n },\n {\n value: card.cardType,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].cardType`,\n },\n {\n value: cardId,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].runtimeId`,\n },\n ]),\n ...(manifest.zones ?? []).map((zone, index) => ({\n value: zone.id,\n path: `manifest.zones[${index}].id`,\n })),\n ...(manifest.resources ?? []).map((resource, index) => ({\n value: resource.id,\n path: `manifest.resources[${index}].id`,\n })),\n ...(manifest.pieceTypes ?? []).flatMap((pieceType, typeIndex) => [\n {\n value: pieceType.id,\n path: `manifest.pieceTypes[${typeIndex}].id`,\n },\n ...(pieceType.slots ?? []).map((slot, slotIndex) => ({\n value: slot.id,\n path: `manifest.pieceTypes[${typeIndex}].slots[${slotIndex}].id`,\n })),\n ]),\n ...(manifest.dieTypes ?? []).flatMap((dieType, typeIndex) => [\n {\n value: dieType.id,\n path: `manifest.dieTypes[${typeIndex}].id`,\n },\n ...(dieType.slots ?? []).map((slot, slotIndex) => ({\n value: slot.id,\n path: `manifest.dieTypes[${typeIndex}].slots[${slotIndex}].id`,\n })),\n ]),\n ...expandSeedIds(manifest.pieceSeeds ?? []).map((pieceId, index) => ({\n value: pieceId,\n path: `manifest.pieceSeeds[*][${index}]`,\n })),\n ...expandSeedIds(manifest.dieSeeds ?? []).map((dieId, index) => ({\n value: dieId,\n path: `manifest.dieSeeds[*][${index}]`,\n })),\n ]),\n ...cardSets.flatMap((cardSet, cardSetIndex) =>\n collectCardSchemaKeyIssues(cardSet, `manifest.cardSets[${cardSetIndex}]`),\n ),\n ...(manifest.pieceTypes ?? []).flatMap((pieceType, typeIndex) =>\n collectObjectSchemaKeyIssues(\n pieceType.fieldsSchema,\n `manifest.pieceTypes[${typeIndex}].fieldsSchema`,\n ),\n ),\n ...(manifest.dieTypes ?? []).flatMap((dieType, typeIndex) =>\n collectObjectSchemaKeyIssues(\n dieType.fieldsSchema,\n `manifest.dieTypes[${typeIndex}].fieldsSchema`,\n ),\n ),\n ...collectBoardRecordKeyIssues(manifest),\n ...collectHandleKeyCollisions(\n dedupeSorted(manualCards.map(({ card }) => card.cardType ?? card.type)),\n \"Card type\",\n ),\n ...collectHandleKeyCollisions(\n dedupeSorted((manifest.zones ?? []).map((zone) => zone.id)),\n \"Zone\",\n ),\n ];\n}\n\nexport function validateManifestAuthoring(\n manifest: GameTopologyManifest,\n): ManifestAuthoringValidationResult {\n const errors: string[] = [];\n\n errors.push(...collectManifestRecordKeyIssues(manifest));\n errors.push(\n ...collectDuplicateIdIssues({\n entries: manifest.cardSets.map((cardSet, index) => ({\n id: cardSet.id,\n path: `manifest.cardSets[${index}].id`,\n })),\n label: \"card set id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: manifest.cardSets.flatMap((cardSet, cardSetIndex) =>\n cardSet.type === \"manual\"\n ? cardSet.cards.flatMap((card, cardIndex) =>\n renderCardInstanceIds(card).map((cardId) => ({\n id: cardId,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].type`,\n })),\n )\n : [],\n ),\n label: \"card runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.zones ?? []).map((zone: ZoneSpec, index) => ({\n id: zone.id,\n path: `manifest.zones[${index}].id`,\n })),\n label: \"zone id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.boards ?? []).map((board, index) => ({\n id: board.id,\n path: `manifest.boards[${index}].id`,\n })),\n label: \"board id\",\n }),\n );\n errors.push(...validateBoardDuplicates(manifest.boards ?? []));\n errors.push(\n ...validateTypeSlotDuplicates({\n pieceTypes: manifest.pieceTypes ?? [],\n dieTypes: manifest.dieTypes ?? [],\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.pieceTypes ?? []).map((pieceType, index) => ({\n id: pieceType.id,\n path: `manifest.pieceTypes[${index}].id`,\n })),\n label: \"piece type id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: expandSeedIds(manifest.pieceSeeds ?? []).map(\n (pieceId, index) => ({\n id: pieceId,\n path: `manifest.pieceSeeds[*][${index}]`,\n }),\n ),\n label: \"piece runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.dieTypes ?? []).map((dieType, index) => ({\n id: dieType.id,\n path: `manifest.dieTypes[${index}].id`,\n })),\n label: \"die type id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: expandSeedIds(manifest.dieSeeds ?? []).map((dieId, index) => ({\n id: dieId,\n path: `manifest.dieSeeds[*][${index}]`,\n })),\n label: \"die runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.resources ?? []).map((resource, index) => ({\n id: resource.id,\n path: `manifest.resources[${index}].id`,\n })),\n label: \"resource id\",\n }),\n );\n errors.push(...validateSlotHostsAndHomes(manifest));\n errors.push(...validatePlayerScopedSeedHomes(manifest));\n errors.push(...validateCardHomes(manifest));\n errors.push(...validateHexBoardVertexRefs(manifest));\n\n return {\n errors,\n warnings: collectAmbiguousBoardTypeWarnings(manifest),\n };\n}\n","import type {\n BoardEdgeRef,\n BoardContainerSpec,\n BoardCard,\n BoardRelationSpec,\n BoardSpec,\n BoardSpaceSpec,\n BoardVertexRef,\n GenericBoardSpec,\n HexBoardSpec,\n HexEdgeRef,\n HexSpaceSpec,\n HexVertexRef,\n DieSeedSpec,\n ManualCardSetDefinition,\n ObjectSchema,\n PieceSeedSpec,\n PropertySchema,\n SquareBoardSpec,\n SquareEdgeSpec,\n SquareSpaceSpec,\n SquareVertexSpec,\n ZoneSpec,\n} from \"../../shared/domain/contracts.js\";\nimport type { GameTopologyManifest } from \"../../shared/domain/manifest.js\";\n\nimport {\n createHexBoardGeometry,\n resolveHexSpaces,\n} from \"../../shared/hex-board.js\";\n\nimport {\n addStandardDecksIfNeeded,\n materializeCardSet,\n} from \"./preset-card-sets.js\";\n\nimport { validateManifestAuthoring } from \"./manifest-validation.js\";\n\ninterface AnalyzedGenericBoard {\n layout: \"generic\";\n board: GenericBoardSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n relationFieldsSchema?: ObjectSchema | null;\n containerFieldsSchema?: ObjectSchema | null;\n spaces: BoardSpaceSpec[];\n relations: BoardRelationSpec[];\n containers: BoardContainerSpec[];\n}\n\ninterface AnalyzedHexBoard {\n layout: \"hex\";\n board: HexBoardSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n edgeFieldsSchema?: ObjectSchema | null;\n vertexFieldsSchema?: ObjectSchema | null;\n spaces: HexSpaceSpec[];\n authoredEdges: Array<{\n id: string;\n ref: HexEdgeRef;\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n authoredVertices: Array<{\n id: string;\n ref: HexVertexRef;\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n edges: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n vertices: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n}\n\ninterface AnalyzedSquareBoard {\n layout: \"square\";\n board: SquareBoardSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n relationFieldsSchema?: ObjectSchema | null;\n containerFieldsSchema?: ObjectSchema | null;\n edgeFieldsSchema?: ObjectSchema | null;\n vertexFieldsSchema?: ObjectSchema | null;\n spaces: SquareSpaceSpec[];\n relations: BoardRelationSpec[];\n containers: BoardContainerSpec[];\n edges: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n vertices: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n}\n\ntype AnalyzedBoard =\n | AnalyzedGenericBoard\n | AnalyzedHexBoard\n | AnalyzedSquareBoard;\n\ninterface ManifestAnalysis {\n manifest: GameTopologyManifest;\n playerIds: string[];\n sharedZones: ZoneSpec[];\n playerZones: ZoneSpec[];\n zoneIds: string[];\n cardSets: ManualCardSetDefinition[];\n cardSetIds: string[];\n cardTypes: string[];\n cardIds: string[];\n cardSetIdByCardId: Map<string, string>;\n cardTypeByCardId: Map<string, string>;\n sharedZoneCardSetIds: Map<string, string[]>;\n sharedZoneIdsByCardSetId: Map<string, string[]>;\n homeSharedZoneIdsByCardType: Map<string, string[]>;\n homeSharedZoneIdByCardType: Map<string, string>;\n playerZoneCardSetIds: Map<string, string[]>;\n zoneCardSetIdsById: Map<string, string[]>;\n zoneVisibilityById: Map<string, string>;\n resourceIds: string[];\n resourcePresentationById: Record<\n string,\n { label: string; icon?: string | null }\n >;\n pieceTypeIds: string[];\n pieceIds: string[];\n pieceTypeIdByPieceId: Map<string, string>;\n dieTypeIds: string[];\n dieIds: string[];\n dieTypeIdByDieId: Map<string, string>;\n strictSlotHosts: Array<{\n kind: \"piece\" | \"die\";\n id: string;\n slotIds: string[];\n }>;\n boardBaseIds: string[];\n boardIds: string[];\n boardContainerIds: string[];\n boardTypeIds: string[];\n boardLayoutById: Map<string, string>;\n boardIdsByLayout: Map<string, string[]>;\n boardBaseIdsByLayout: Map<string, string[]>;\n boardIdsByBaseId: Map<string, string[]>;\n boardIdsByTypeId: Map<string, string[]>;\n spaceIdsByBoardId: Map<string, string[]>;\n spaceTypeIdByBoardId: Map<string, Record<string, string | null>>;\n spaceIdsByTypeId: Map<string, string[]>;\n containerIdsByBoardId: Map<string, string[]>;\n containerHostByBoardId: Map<\n string,\n Record<string, { type: \"board\" } | { type: \"space\"; spaceId: string }>\n >;\n relationTypeIds: string[];\n relationTypeIdsByBoardId: Map<string, string[]>;\n edgeIds: string[];\n edgeTypeIds: string[];\n edgeIdsByTypeId: Map<string, string[]>;\n edgeIdsByBoardIdAndTypeId: Map<string, Record<string, string[]>>;\n vertexIds: string[];\n vertexTypeIds: string[];\n vertexIdsByTypeId: Map<string, string[]>;\n vertexIdsByBoardIdAndTypeId: Map<string, Record<string, string[]>>;\n spaceIds: string[];\n spaceTypeIds: string[];\n analyzedBoards: AnalyzedBoard[];\n pieceTypeSchemasById: Map<string, ObjectSchema | null | undefined>;\n dieTypeSchemasById: Map<string, ObjectSchema | null | undefined>;\n}\n\ntype CardPropertySchemaVariants = {\n shared?: Record<string, PropertySchema>;\n variants: Record<string, ObjectSchema>;\n};\n\ntype CardPropertySchema = ObjectSchema | CardPropertySchemaVariants;\n\nfunction isCardPropertySchemaVariants(\n schema: CardPropertySchema | null | undefined,\n): schema is CardPropertySchemaVariants {\n return Boolean(schema && \"variants\" in schema);\n}\n\nfunction mergeSharedCardProperties(\n schema: CardPropertySchemaVariants,\n cardType: string,\n): ObjectSchema | null {\n const variant = schema.variants[cardType];\n if (!variant) {\n return null;\n }\n return {\n properties: {\n ...(schema.shared ?? {}),\n ...variant.properties,\n },\n };\n}\n\nfunction hasPropertySchemaDefault(\n property: PropertySchema | null | undefined,\n): property is PropertySchema & { default: unknown } {\n return Boolean(property && \"default\" in property);\n}\n\nfunction dedupeSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction sortedObject<Value>(\n entries: Iterable<readonly [string, Value]>,\n): Record<string, Value> {\n return Object.fromEntries(\n Array.from(entries).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction createRecord<Value>(): Record<string, Value> {\n return Object.create(null) as Record<string, Value>;\n}\n\nfunction renderCardInstanceIds(card: BoardCard): string[] {\n if (card.count > 1) {\n return Array.from(\n { length: card.count },\n (_, index) => `${card.type}-${index + 1}`,\n );\n }\n return [card.type];\n}\n\nfunction expandSeedIds(\n seeds: ReadonlyArray<\n | PieceSeedSpec\n | { id?: string | null; typeId: string; count?: number | null }\n >,\n): string[] {\n const expanded: string[] = [];\n for (const seed of seeds) {\n const count = seed.count ?? 1;\n const baseId = seed.id ?? seed.typeId;\n if (count <= 1) {\n expanded.push(baseId);\n continue;\n }\n for (let index = 1; index <= count; index += 1) {\n expanded.push(`${baseId}-${index}`);\n }\n }\n return expanded;\n}\n\nfunction isHexBoardSpec(board: BoardSpec): board is HexBoardSpec {\n return board.layout === \"hex\";\n}\n\nfunction isSquareBoardSpec(board: BoardSpec): board is SquareBoardSpec {\n return board.layout === \"square\";\n}\n\ninterface ResolvedHexEdge {\n id: string;\n geometryKey: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n}\n\ninterface ResolvedHexVertex {\n id: string;\n geometryKey: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n}\n\nconst SQUARE_SIDES = [\"north\", \"east\", \"south\", \"west\"] as const;\n\nconst SQUARE_CORNERS = [\"nw\", \"ne\", \"se\", \"sw\"] as const;\n\ntype SquareSide = (typeof SQUARE_SIDES)[number];\n\ntype SquareCorner = (typeof SQUARE_CORNERS)[number];\n\nfunction squareEdgeIdFromGeometryKey(key: string): string {\n return `square-edge:${key}`;\n}\n\nfunction squareVertexIdFromGeometryKey(key: string): string {\n return `square-vertex:${key}`;\n}\n\nfunction squareCornerGeometryKey(\n space: Pick<SquareSpaceSpec, \"row\" | \"col\">,\n corner: SquareCorner,\n): string {\n switch (corner) {\n case \"nw\":\n return `${space.col},${space.row}`;\n case \"ne\":\n return `${space.col + 1},${space.row}`;\n case \"se\":\n return `${space.col + 1},${space.row + 1}`;\n case \"sw\":\n return `${space.col},${space.row + 1}`;\n }\n}\n\nfunction squareEdgeGeometryKey(\n space: Pick<SquareSpaceSpec, \"row\" | \"col\">,\n side: SquareSide,\n): string {\n const endpoints =\n side === \"north\"\n ? [`${space.col},${space.row}`, `${space.col + 1},${space.row}`]\n : side === \"east\"\n ? [`${space.col + 1},${space.row}`, `${space.col + 1},${space.row + 1}`]\n : side === \"south\"\n ? [\n `${space.col},${space.row + 1}`,\n `${space.col + 1},${space.row + 1}`,\n ]\n : [`${space.col},${space.row}`, `${space.col},${space.row + 1}`];\n return endpoints.sort((left, right) => left.localeCompare(right)).join(\"::\");\n}\n\nfunction geometryKeyFromSquareEdgeRef(\n ref: BoardEdgeRef,\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((a, b) => a.localeCompare(b))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Square edge ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const side of SQUARE_SIDES) {\n const key = squareEdgeGeometryKey(space, side);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Square edge ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared edge.`,\n );\n }\n const [only] = candidates;\n if (only === undefined) {\n throw new Error(\n \"unreachable: candidates.length === 1 but first is undefined\",\n );\n }\n return only;\n}\n\nfunction geometryKeyFromSquareVertexRef(\n ref: BoardVertexRef,\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((a, b) => a.localeCompare(b))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Square vertex ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const corner of SQUARE_CORNERS) {\n const key = squareCornerGeometryKey(space, corner);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Square vertex ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared vertex.`,\n );\n }\n const [only] = candidates;\n if (only === undefined) {\n throw new Error(\n \"unreachable: candidates.length === 1 but first is undefined\",\n );\n }\n return only;\n}\n\nfunction resolveAuthoredHexEdges(\n board: HexBoardSpec,\n geometry: ReturnType<typeof createHexBoardGeometry>,\n): AnalyzedHexBoard[\"authoredEdges\"] {\n return (board.edges ?? []).map((edge) => ({\n ...edge,\n id:\n \"spaces\" in edge.ref\n ? geometry.edge(...edge.ref.spaces)\n : geometry.edgeAt(edge.ref.space, edge.ref.side),\n }));\n}\nfunction resolveAuthoredHexVertices(\n board: HexBoardSpec,\n geometry: ReturnType<typeof createHexBoardGeometry>,\n): AnalyzedHexBoard[\"authoredVertices\"] {\n return (board.vertices ?? []).map((vertex) => ({\n ...vertex,\n id:\n \"spaces\" in vertex.ref\n ? geometry.vertex(...vertex.ref.spaces)\n : geometry.vertexAt(vertex.ref.space, vertex.ref.corner),\n }));\n}\n\nfunction resolveSquareSpaces(board: SquareBoardSpec): SquareSpaceSpec[] {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveSquareEdges(\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexEdge[] {\n const edgeMap = new Map<string, ResolvedHexEdge>();\n for (const space of spaces) {\n for (const side of SQUARE_SIDES) {\n const geometryKey = squareEdgeGeometryKey(space, side);\n const existing = edgeMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ]);\n edgeMap.set(geometryKey, {\n id: squareEdgeIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n return [...edgeMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveSquareVertices(\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexVertex[] {\n const vertexMap = new Map<string, ResolvedHexVertex>();\n for (const space of spaces) {\n for (const corner of SQUARE_CORNERS) {\n const geometryKey = squareCornerGeometryKey(space, corner);\n const existing = vertexMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ]);\n vertexMap.set(geometryKey, {\n id: squareVertexIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n return [...vertexMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction indexSquareEdgeMetadata(\n specs: readonly SquareEdgeSpec[],\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromSquareEdgeRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate square edge refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction indexSquareVertexMetadata(\n specs: readonly SquareVertexSpec[],\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromSquareVertexRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate square vertex refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction resolveSquareEdges(\n board: SquareBoardSpec,\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexEdge[] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derived = deriveSquareEdges(spaces);\n const edgesByGeometryKey = new Map(\n derived.map((edge) => [edge.geometryKey, edge] as const),\n );\n const metadataByKey = indexSquareEdgeMetadata(\n board.edges ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n for (const [geometryKey, metadata] of metadataByKey.entries()) {\n const edge = edgesByGeometryKey.get(geometryKey);\n if (!edge) {\n throw new Error(\n `Square edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n edgesByGeometryKey.set(geometryKey, {\n ...edge,\n typeId: metadata.typeId ?? null,\n label: metadata.label ?? null,\n fields: metadata.fields ?? null,\n });\n }\n\n return [...edgesByGeometryKey.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveSquareVertices(\n board: SquareBoardSpec,\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexVertex[] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derived = deriveSquareVertices(spaces);\n const verticesByGeometryKey = new Map(\n derived.map((vertex) => [vertex.geometryKey, vertex] as const),\n );\n const metadataByKey = indexSquareVertexMetadata(\n board.vertices ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n for (const [geometryKey, metadata] of metadataByKey.entries()) {\n const vertex = verticesByGeometryKey.get(geometryKey);\n if (!vertex) {\n throw new Error(\n `Square vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n verticesByGeometryKey.set(geometryKey, {\n ...vertex,\n typeId: metadata.typeId ?? null,\n label: metadata.label ?? null,\n fields: metadata.fields ?? null,\n });\n }\n\n return [...verticesByGeometryKey.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction analyzeBoards(manifest: GameTopologyManifest, playerIds: string[]) {\n return (manifest.boards ?? []).map((board): AnalyzedBoard => {\n const runtimeBoardIds =\n board.scope === \"perPlayer\"\n ? playerIds.map((playerId) => `${board.id}:${playerId}`)\n : [board.id];\n\n if (isHexBoardSpec(board)) {\n const spaces = resolveHexSpaces(board);\n const geometry = createHexBoardGeometry({ ...board, spaces });\n const authoredEdges = resolveAuthoredHexEdges(board, geometry);\n const authoredVertices = resolveAuthoredHexVertices(board, geometry);\n return {\n layout: \"hex\",\n board,\n boardTypeId: board.typeId,\n runtimeBoardIds,\n boardFieldsSchema: board.boardFieldsSchema,\n spaceFieldsSchema: board.spaceFieldsSchema,\n edgeFieldsSchema: board.edgeFieldsSchema,\n vertexFieldsSchema: board.vertexFieldsSchema,\n spaces,\n authoredEdges,\n authoredVertices,\n edges: geometry.edges.map((edge) => ({\n ...edge,\n ...authoredEdges.find((authored) => authored.id === edge.id),\n })),\n vertices: geometry.vertices.map((vertex) => ({\n ...vertex,\n ...authoredVertices.find((authored) => authored.id === vertex.id),\n })),\n };\n }\n\n if (isSquareBoardSpec(board)) {\n const squareBoard = board;\n const spaces = resolveSquareSpaces(squareBoard);\n return {\n layout: \"square\",\n board: squareBoard,\n\n boardTypeId: squareBoard.typeId,\n runtimeBoardIds,\n boardFieldsSchema: squareBoard.boardFieldsSchema,\n spaceFieldsSchema: squareBoard.spaceFieldsSchema,\n relationFieldsSchema: squareBoard.relationFieldsSchema,\n containerFieldsSchema: squareBoard.containerFieldsSchema,\n edgeFieldsSchema: squareBoard.edgeFieldsSchema,\n vertexFieldsSchema: squareBoard.vertexFieldsSchema,\n spaces,\n relations: [...(squareBoard.relations ?? [])],\n containers: [...(squareBoard.containers ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n ),\n edges: resolveSquareEdges(squareBoard, spaces),\n vertices: resolveSquareVertices(squareBoard, spaces),\n };\n }\n\n const genericBoard = board;\n return {\n layout: \"generic\",\n board: genericBoard,\n\n boardTypeId: genericBoard.typeId,\n runtimeBoardIds,\n boardFieldsSchema: genericBoard.boardFieldsSchema,\n spaceFieldsSchema: genericBoard.spaceFieldsSchema,\n relationFieldsSchema: genericBoard.relationFieldsSchema,\n containerFieldsSchema: genericBoard.containerFieldsSchema,\n spaces: [...(genericBoard.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n ),\n relations: [...(genericBoard.relations ?? [])],\n containers: [...(genericBoard.containers ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n ),\n };\n });\n}\n\nfunction isSingletonExplicitSeed(seed: {\n id?: string | null;\n count?: number | null;\n}): seed is typeof seed & { id: string } {\n return (\n typeof seed.id === \"string\" && seed.id.length > 0 && (seed.count ?? 1) === 1\n );\n}\n\nexport function analyzeManifest(\n inputManifest: GameTopologyManifest,\n runtimePlayerIds?: readonly string[],\n): ManifestAnalysis {\n const manifest = addStandardDecksIfNeeded(inputManifest);\n const playerIds = runtimePlayerIds\n ? [...runtimePlayerIds]\n : Array.from(\n { length: manifest.players.maxPlayers },\n (_, index) => `player-${index + 1}`,\n );\n const sharedZones = (manifest.zones ?? []).filter(\n (zone) => zone.scope === \"shared\",\n );\n const playerZones = (manifest.zones ?? []).filter(\n (zone) => zone.scope === \"perPlayer\",\n );\n const zoneIds = dedupeSorted((manifest.zones ?? []).map((zone) => zone.id));\n const cardSets = manifest.cardSets.map(materializeCardSet);\n const cardSetIds = dedupeSorted(cardSets.map((cardSet) => cardSet.id));\n const cardTypes = dedupeSorted(\n cardSets.flatMap((cardSet) =>\n cardSet.cards.map((card) => card.cardType ?? card.type),\n ),\n );\n const cardIds = dedupeSorted(\n cardSets.flatMap((cardSet) => cardSet.cards.flatMap(renderCardInstanceIds)),\n );\n const cardSetIdByCardId = new Map<string, string>();\n const cardTypeByCardId = new Map<string, string>();\n for (const cardSet of cardSets) {\n for (const card of cardSet.cards) {\n for (const cardId of renderCardInstanceIds(card)) {\n cardSetIdByCardId.set(cardId, cardSet.id);\n cardTypeByCardId.set(cardId, card.cardType ?? card.type);\n }\n }\n }\n\n const sharedZoneCardSetIds = new Map<string, string[]>();\n for (const zone of sharedZones) {\n sharedZoneCardSetIds.set(\n zone.id,\n dedupeSorted(zone.allowedCardSetIds ?? []),\n );\n }\n const playerZoneCardSetIds = new Map<string, string[]>();\n for (const zone of playerZones) {\n playerZoneCardSetIds.set(\n zone.id,\n dedupeSorted(zone.allowedCardSetIds ?? []),\n );\n }\n const zoneCardSetIdsById = new Map<string, string[]>();\n for (const [zoneId, cardSetIds] of sharedZoneCardSetIds.entries()) {\n zoneCardSetIdsById.set(zoneId, cardSetIds);\n }\n for (const [zoneId, cardSetIds] of playerZoneCardSetIds.entries()) {\n zoneCardSetIdsById.set(zoneId, cardSetIds);\n }\n\n const sharedZoneIdsByCardSetId = new Map<string, string[]>(\n cardSetIds.map((cardSetId): [string, string[]] => [cardSetId, []]),\n );\n for (const [zoneId, allowedCardSetIds] of sharedZoneCardSetIds.entries()) {\n for (const cardSetId of allowedCardSetIds) {\n const zoneIds = sharedZoneIdsByCardSetId.get(cardSetId) ?? [];\n zoneIds.push(zoneId);\n sharedZoneIdsByCardSetId.set(cardSetId, zoneIds);\n }\n }\n for (const [cardSetId, zoneIds] of sharedZoneIdsByCardSetId.entries()) {\n sharedZoneIdsByCardSetId.set(cardSetId, dedupeSorted(zoneIds));\n }\n\n const sharedZoneIdSet = new Set(sharedZones.map((zone) => zone.id));\n const homeSharedZoneIdsByCardType = new Map<string, string[]>(\n cardTypes.map((cardType): [string, string[]] => [cardType, []]),\n );\n for (const cardSet of cardSets) {\n for (const card of cardSet.cards) {\n if (\n card.home?.type !== \"zone\" ||\n !sharedZoneIdSet.has(card.home.zoneId)\n ) {\n continue;\n }\n const cardType = card.cardType ?? card.type;\n const zoneIds = homeSharedZoneIdsByCardType.get(cardType) ?? [];\n zoneIds.push(card.home.zoneId);\n homeSharedZoneIdsByCardType.set(cardType, zoneIds);\n }\n }\n const homeSharedZoneIdByCardType = new Map<string, string>();\n for (const [cardType, zoneIds] of homeSharedZoneIdsByCardType.entries()) {\n const uniqueZoneIds = dedupeSorted(zoneIds);\n homeSharedZoneIdsByCardType.set(cardType, uniqueZoneIds);\n const [homeZoneId] = uniqueZoneIds;\n if (uniqueZoneIds.length === 1 && homeZoneId !== undefined) {\n homeSharedZoneIdByCardType.set(cardType, homeZoneId);\n }\n }\n\n const zoneVisibilityById = new Map<string, string>(\n (manifest.zones ?? []).map((zone) => [\n zone.id,\n zone.visibility ?? \"public\",\n ]),\n );\n const resourceIds = dedupeSorted(\n (manifest.resources ?? []).map((resource) => resource.id),\n );\n const resourcePresentationById = sortedObject(\n (manifest.resources ?? []).map((resource) => [\n resource.id,\n {\n label: resource.name,\n ...(resource.icon ? { icon: resource.icon } : {}),\n },\n ]),\n );\n const pieceTypeIds = dedupeSorted(\n (manifest.pieceTypes ?? []).map((pieceType) => pieceType.id),\n );\n const pieceTypeSchemasById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [\n pieceType.id,\n pieceType.fieldsSchema,\n ]),\n );\n const pieceTypeSlotIdsById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [\n pieceType.id,\n dedupeSorted((pieceType.slots ?? []).map((slot) => slot.id)),\n ]),\n );\n const pieceTypeIdByPieceId = new Map<string, string>();\n for (const seed of manifest.pieceSeeds ?? []) {\n for (const pieceId of expandSeedIds([seed])) {\n pieceTypeIdByPieceId.set(pieceId, seed.typeId);\n }\n }\n const pieceIds = dedupeSorted(pieceTypeIdByPieceId.keys());\n const dieTypeIds = dedupeSorted(\n (manifest.dieTypes ?? []).map((dieType) => dieType.id),\n );\n const dieTypeSchemasById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [\n dieType.id,\n dieType.fieldsSchema,\n ]),\n );\n const dieTypeSlotIdsById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [\n dieType.id,\n dedupeSorted((dieType.slots ?? []).map((slot) => slot.id)),\n ]),\n );\n const dieTypeIdByDieId = new Map<string, string>();\n for (const seed of manifest.dieSeeds ?? []) {\n for (const dieId of expandSeedIds([seed])) {\n dieTypeIdByDieId.set(dieId, seed.typeId);\n }\n }\n const dieIds = dedupeSorted(dieTypeIdByDieId.keys());\n const strictSlotHosts = [\n ...(manifest.pieceSeeds ?? []).flatMap((seed) => {\n if (!isSingletonExplicitSeed(seed)) {\n return [];\n }\n const slotIds = pieceTypeSlotIdsById.get(seed.typeId) ?? [];\n return slotIds.length > 0\n ? [\n {\n kind: \"piece\" as const,\n id: seed.id,\n slotIds,\n },\n ]\n : [];\n }),\n ...(manifest.dieSeeds ?? []).flatMap((seed) => {\n if (!isSingletonExplicitSeed(seed)) {\n return [];\n }\n const slotIds = dieTypeSlotIdsById.get(seed.typeId) ?? [];\n return slotIds.length > 0\n ? [\n {\n kind: \"die\" as const,\n id: seed.id,\n slotIds,\n },\n ]\n : [];\n }),\n ].sort(\n (left, right) =>\n left.kind.localeCompare(right.kind) || left.id.localeCompare(right.id),\n );\n const analyzedBoards = analyzeBoards(manifest, playerIds);\n const boardBaseIds = dedupeSorted(\n analyzedBoards.map(({ board }) => board.id),\n );\n const boardIds = dedupeSorted(\n analyzedBoards.flatMap((entry) => entry.runtimeBoardIds),\n );\n const boardTypeIds = dedupeSorted(\n analyzedBoards\n .map((board) => board.boardTypeId)\n .filter((typeId): typeId is string => typeof typeId === \"string\"),\n );\n const boardLayoutById = new Map<string, string>();\n const boardIdsByLayout = new Map<string, string[]>();\n const boardBaseIdsByLayout = new Map<string, string[]>();\n const boardIdsByBaseId = new Map<string, string[]>();\n const boardIdsByTypeId = new Map<string, string[]>();\n const spaceIdsByBoardId = new Map<string, string[]>();\n const spaceTypeIdByBoardId = new Map<string, Record<string, string | null>>();\n const spaceIdsByTypeId = new Map<string, string[]>();\n const containerIdsByBoardId = new Map<string, string[]>();\n const containerHostByBoardId = new Map<\n string,\n Record<string, { type: \"board\" } | { type: \"space\"; spaceId: string }>\n >();\n const relationTypeIdsByBoardId = new Map<string, string[]>();\n const edgeIdsByTypeId = new Map<string, string[]>();\n const edgeIdsByBoardIdAndTypeId = new Map<string, Record<string, string[]>>();\n const vertexIdsByTypeId = new Map<string, string[]>();\n const vertexIdsByBoardIdAndTypeId = new Map<\n string,\n Record<string, string[]>\n >();\n for (const analyzedBoard of analyzedBoards) {\n boardIdsByBaseId.set(analyzedBoard.board.id, analyzedBoard.runtimeBoardIds);\n boardIdsByLayout.set(\n analyzedBoard.board.layout,\n dedupeSorted([\n ...(boardIdsByLayout.get(analyzedBoard.board.layout) ?? []),\n ...analyzedBoard.runtimeBoardIds,\n ]),\n );\n boardBaseIdsByLayout.set(\n analyzedBoard.board.layout,\n dedupeSorted([\n ...(boardBaseIdsByLayout.get(analyzedBoard.board.layout) ?? []),\n analyzedBoard.board.id,\n ]),\n );\n const runtimeSpaceIds = analyzedBoard.spaces.map((space) => space.id);\n const runtimeSpaceTypeIds: Record<string, string | null> = sortedObject(\n analyzedBoard.spaces.map(\n (space) => [space.id, space.typeId ?? null] as const,\n ),\n );\n const runtimeContainerIds =\n analyzedBoard.layout === \"hex\"\n ? []\n : analyzedBoard.containers.map((container) => container.id);\n const runtimeContainerHosts: Record<\n string,\n { type: \"board\" } | { type: \"space\"; spaceId: string }\n > =\n analyzedBoard.layout === \"hex\"\n ? {}\n : sortedObject(\n analyzedBoard.containers.map((container) => [\n container.id,\n container.host.type === \"space\"\n ? { type: \"space\" as const, spaceId: container.host.spaceId }\n : { type: \"board\" as const },\n ]),\n );\n const runtimeRelationTypeIds =\n analyzedBoard.layout === \"hex\"\n ? [\"adjacent\"]\n : analyzedBoard.layout === \"square\"\n ? dedupeSorted([\n \"adjacent\",\n ...analyzedBoard.relations.map((relation) => relation.typeId),\n ])\n : dedupeSorted(\n analyzedBoard.relations.map((relation) => relation.typeId),\n );\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n boardLayoutById.set(runtimeBoardId, analyzedBoard.board.layout);\n spaceIdsByBoardId.set(runtimeBoardId, runtimeSpaceIds);\n spaceTypeIdByBoardId.set(runtimeBoardId, runtimeSpaceTypeIds);\n containerIdsByBoardId.set(runtimeBoardId, runtimeContainerIds);\n containerHostByBoardId.set(runtimeBoardId, runtimeContainerHosts);\n relationTypeIdsByBoardId.set(runtimeBoardId, runtimeRelationTypeIds);\n }\n if (analyzedBoard.boardTypeId) {\n boardIdsByTypeId.set(\n analyzedBoard.boardTypeId,\n dedupeSorted([\n ...(boardIdsByTypeId.get(analyzedBoard.boardTypeId) ?? []),\n ...analyzedBoard.runtimeBoardIds,\n ]),\n );\n }\n for (const space of analyzedBoard.spaces) {\n if (!space.typeId) {\n continue;\n }\n spaceIdsByTypeId.set(\n space.typeId,\n dedupeSorted([...(spaceIdsByTypeId.get(space.typeId) ?? []), space.id]),\n );\n }\n if (analyzedBoard.layout !== \"generic\") {\n const edgeIdsForBoardByType: Record<string, string[]> = {};\n for (const edge of analyzedBoard.edges) {\n if (!edge.typeId) {\n continue;\n }\n edgeIdsByTypeId.set(\n edge.typeId,\n dedupeSorted([...(edgeIdsByTypeId.get(edge.typeId) ?? []), edge.id]),\n );\n edgeIdsForBoardByType[edge.typeId] = dedupeSorted([\n ...(edgeIdsForBoardByType[edge.typeId] ?? []),\n edge.id,\n ]);\n }\n const vertexIdsForBoardByType: Record<string, string[]> = {};\n for (const vertex of analyzedBoard.vertices) {\n if (!vertex.typeId) {\n continue;\n }\n vertexIdsByTypeId.set(\n vertex.typeId,\n dedupeSorted([\n ...(vertexIdsByTypeId.get(vertex.typeId) ?? []),\n vertex.id,\n ]),\n );\n vertexIdsForBoardByType[vertex.typeId] = dedupeSorted([\n ...(vertexIdsForBoardByType[vertex.typeId] ?? []),\n vertex.id,\n ]);\n }\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n edgeIdsByBoardIdAndTypeId.set(runtimeBoardId, edgeIdsForBoardByType);\n vertexIdsByBoardIdAndTypeId.set(\n runtimeBoardId,\n vertexIdsForBoardByType,\n );\n }\n }\n }\n const relationTypeIds = dedupeSorted(\n Array.from(relationTypeIdsByBoardId.values()).flat(),\n );\n const edgeIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"generic\" ? [] : board.edges.map((edge) => edge.id),\n ),\n );\n const edgeTypeIds = dedupeSorted(edgeIdsByTypeId.keys());\n const vertexIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"generic\"\n ? []\n : board.vertices.map((vertex) => vertex.id),\n ),\n );\n const vertexTypeIds = dedupeSorted(vertexIdsByTypeId.keys());\n const boardContainerIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"hex\"\n ? []\n : board.containers.map((container) => container.id),\n ),\n );\n const spaceIds = dedupeSorted(\n analyzedBoards.flatMap((board) => board.spaces.map((space) => space.id)),\n );\n const spaceTypeIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.spaces\n .map((space) => space.typeId)\n .filter((typeId): typeId is string => typeof typeId === \"string\"),\n ),\n );\n\n return {\n manifest,\n playerIds,\n sharedZones,\n playerZones,\n zoneIds,\n cardSets,\n cardSetIds,\n cardTypes,\n cardIds,\n cardSetIdByCardId,\n cardTypeByCardId,\n sharedZoneCardSetIds,\n sharedZoneIdsByCardSetId,\n homeSharedZoneIdsByCardType,\n homeSharedZoneIdByCardType,\n playerZoneCardSetIds,\n zoneCardSetIdsById,\n zoneVisibilityById,\n resourceIds,\n resourcePresentationById,\n pieceTypeIds,\n pieceIds,\n pieceTypeIdByPieceId,\n dieTypeIds,\n dieIds,\n dieTypeIdByDieId,\n strictSlotHosts,\n boardBaseIds,\n boardIds,\n boardContainerIds,\n boardTypeIds,\n boardLayoutById,\n boardIdsByLayout,\n boardBaseIdsByLayout,\n boardIdsByBaseId,\n boardIdsByTypeId,\n spaceIdsByBoardId,\n spaceTypeIdByBoardId,\n spaceIdsByTypeId,\n containerIdsByBoardId,\n containerHostByBoardId,\n relationTypeIds,\n relationTypeIdsByBoardId,\n edgeIds,\n edgeTypeIds,\n edgeIdsByTypeId,\n edgeIdsByBoardIdAndTypeId,\n vertexIds,\n vertexTypeIds,\n vertexIdsByTypeId,\n vertexIdsByBoardIdAndTypeId,\n spaceIds,\n spaceTypeIds,\n analyzedBoards,\n pieceTypeSchemasById,\n dieTypeSchemasById,\n };\n}\n\nfunction cloneJson<Value>(value: Value): Value {\n return JSON.parse(JSON.stringify(value)) as Value;\n}\n\nfunction boardSpaceRefKey(spaceIds: readonly string[]): string {\n return [...spaceIds]\n .sort((left, right) => left.localeCompare(right))\n .join(\"$$\");\n}\n\nfunction materializePropertySchemaDefault(\n property: PropertySchema,\n analysis: ManifestAnalysis,\n runtimeBoardId?: string,\n): unknown {\n if (hasPropertySchemaDefault(property)) {\n return cloneJson(property.default);\n }\n if (property.optional) {\n return undefined;\n }\n if (property.nullable) {\n return null;\n }\n\n switch (property.type) {\n case \"string\":\n return \"\";\n case \"integer\":\n case \"number\":\n return 0;\n case \"boolean\":\n return false;\n case \"enum\":\n return property.enums?.[0] ?? \"\";\n case \"array\":\n return [];\n case \"object\":\n return materializeObjectSchemaDefaults(\n property.properties ? { properties: property.properties } : undefined,\n analysis,\n runtimeBoardId,\n );\n case \"record\":\n return {};\n case \"zoneId\":\n return analysis.zoneIds[0] ?? \"\";\n case \"cardId\":\n return analysis.cardIds[0] ?? \"\";\n case \"playerId\":\n return analysis.playerIds[0] ?? \"\";\n case \"boardId\":\n return runtimeBoardId ?? analysis.boardIds[0] ?? \"\";\n case \"edgeId\":\n return analysis.edgeIds[0] ?? \"\";\n case \"vertexId\":\n return analysis.vertexIds[0] ?? \"\";\n case \"spaceId\":\n return (\n (runtimeBoardId\n ? analysis.spaceIdsByBoardId.get(runtimeBoardId)?.[0]\n : undefined) ??\n analysis.spaceIds[0] ??\n \"\"\n );\n case \"pieceId\":\n return analysis.pieceIds[0] ?? \"\";\n case \"dieId\":\n return analysis.dieIds[0] ?? \"\";\n case \"resourceId\":\n return analysis.resourceIds[0] ?? \"\";\n }\n}\n\nfunction materializeObjectSchemaDefaults(\n schema: ObjectSchema | null | undefined,\n analysis: ManifestAnalysis,\n runtimeBoardId?: string,\n): Record<string, unknown> {\n if (!schema?.properties) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(schema.properties).flatMap(([key, property]) => {\n const value = materializePropertySchemaDefault(\n property,\n analysis,\n runtimeBoardId,\n );\n return value === undefined ? [] : [[key, value]];\n }),\n );\n}\n\nfunction materializeCardPropertiesDefaults(\n schema: CardPropertySchema | null | undefined,\n cardType: string,\n analysis: ManifestAnalysis,\n): Record<string, unknown> {\n const objectSchema = isCardPropertySchemaVariants(schema)\n ? mergeSharedCardProperties(schema, cardType)\n : schema;\n return materializeObjectSchemaDefaults(objectSchema, analysis);\n}\n\nexport function materializeManifestTable(options: {\n manifest: GameTopologyManifest;\n playerIds: readonly string[];\n shuffleItems: <Value>(values: readonly Value[]) => Value[];\n}): Record<string, unknown> {\n const validation = validateManifestAuthoring(options.manifest);\n if (validation.errors.length > 0) {\n throw new Error(\n `Cannot materialize invalid topology manifest:\\n${validation.errors.join(\"\\n\")}`,\n );\n }\n\n const analysis = analyzeManifest(options.manifest, options.playerIds);\n const manifest = analysis.manifest;\n const playerIds = [...options.playerIds];\n\n const cards = createRecord<Record<string, unknown>>();\n const pieces = createRecord<Record<string, unknown>>();\n const dice = createRecord<Record<string, unknown>>();\n const componentLocations = createRecord<Record<string, unknown>>();\n const locationOrder = new Map<string, number>();\n\n const boardAnalysisByBaseId = new Map(\n analysis.analyzedBoards.map((board) => [board.board.id, board] as const),\n );\n const edgeIdByBoardBaseIdAndSpaces = new Map<string, Map<string, string>>();\n const vertexIdByBoardBaseIdAndSpaces = new Map<string, Map<string, string>>();\n\n for (const analyzedBoard of analysis.analyzedBoards) {\n if (analyzedBoard.layout === \"generic\") {\n continue;\n }\n edgeIdByBoardBaseIdAndSpaces.set(\n analyzedBoard.board.id,\n new Map(\n analyzedBoard.edges.map((edge) => [\n boardSpaceRefKey(edge.spaceIds),\n edge.id,\n ]),\n ),\n );\n vertexIdByBoardBaseIdAndSpaces.set(\n analyzedBoard.board.id,\n new Map(\n analyzedBoard.vertices.map((vertex) => [\n boardSpaceRefKey(vertex.spaceIds),\n vertex.id,\n ]),\n ),\n );\n }\n\n const nextLocationPosition = (location: Record<string, unknown>): number => {\n const key = JSON.stringify(location);\n const position = locationOrder.get(key) ?? 0;\n locationOrder.set(key, position + 1);\n return position;\n };\n const zoneScopeById = new Map<string, \"shared\" | \"perPlayer\">([\n ...analysis.sharedZones.map((zone) => [zone.id, \"shared\"] as const),\n ...analysis.playerZones.map((zone) => [zone.id, \"perPlayer\"] as const),\n ]);\n const resolveRuntimeBoardId = (\n boardBaseId: string,\n ownerId: string | null | undefined,\n context?: string,\n ) => {\n const analyzedBoard = boardAnalysisByBaseId.get(boardBaseId);\n if (!analyzedBoard) {\n throw new Error(\n `${context ?? \"Component home\"}.boardId: Unknown board '${boardBaseId}'.`,\n );\n }\n if (analyzedBoard?.board.scope === \"perPlayer\") {\n if (!ownerId) {\n throw new Error(\n `${context ?? `Home on board '${boardBaseId}'`} requires ownerId because board '${boardBaseId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n return `${boardBaseId}:${ownerId}`;\n }\n return boardBaseId;\n };\n\n const resolveBoardEdgeId = (\n boardBaseId: string,\n spaceIds: readonly string[],\n ) => {\n const edgeId = edgeIdByBoardBaseIdAndSpaces\n .get(boardBaseId)\n ?.get(boardSpaceRefKey(spaceIds));\n if (!edgeId) {\n throw new Error(\n `Unknown edge on board '${boardBaseId}' for spaces [${spaceIds.join(\", \")}].`,\n );\n }\n return edgeId;\n };\n\n const resolveBoardVertexId = (\n boardBaseId: string,\n spaceIds: readonly string[],\n ) => {\n const vertexId = vertexIdByBoardBaseIdAndSpaces\n .get(boardBaseId)\n ?.get(boardSpaceRefKey(spaceIds));\n if (!vertexId) {\n throw new Error(\n `Unknown vertex on board '${boardBaseId}' for spaces [${spaceIds.join(\", \")}].`,\n );\n }\n return vertexId;\n };\n\n const materializeComponentLocation = (\n home: NonNullable<BoardCard[\"home\"]>,\n context: {\n path: string;\n label: string;\n },\n ): Record<string, unknown> => {\n if (home.type === \"detached\") {\n return { type: \"Detached\" };\n }\n\n if (home.type === \"slot\") {\n return {\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n position: nextLocationPosition({\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n }),\n };\n }\n\n if (home.type === \"zone\") {\n const zoneScope = zoneScopeById.get(home.zoneId);\n if (!zoneScope) {\n throw new Error(\n `${context.path}.zoneId: ${context.label} targets unknown zone '${home.zoneId}'.`,\n );\n }\n if (zoneScope === \"perPlayer\") {\n throw new Error(\n `${context.path}.zoneId: ${context.label} cannot target per-player zone '${home.zoneId}' because card inventory has no ownerId. Place it during reducer setup instead.`,\n );\n }\n return {\n type: \"InDeck\",\n deckId: home.zoneId,\n playedBy: null,\n position: nextLocationPosition({\n type: \"InDeck\",\n deckId: home.zoneId,\n playedBy: null,\n }),\n };\n }\n\n if (home.type === \"space\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n null,\n `${context.path}.boardId: ${context.label}`,\n );\n if (\n !analysis.spaceIdsByBoardId.get(home.boardId)?.includes(home.spaceId)\n ) {\n throw new Error(\n `${context.path}.spaceId: ${context.label} targets unknown space '${home.spaceId}' on board '${home.boardId}'.`,\n );\n }\n return {\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n position: nextLocationPosition({\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n }),\n };\n }\n\n if (home.type === \"container\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n null,\n `${context.path}.boardId: ${context.label}`,\n );\n if (\n !analysis.containerIdsByBoardId\n .get(home.boardId)\n ?.includes(home.containerId)\n ) {\n throw new Error(\n `${context.path}.containerId: ${context.label} targets unknown container '${home.containerId}' on board '${home.boardId}'.`,\n );\n }\n return {\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n position: nextLocationPosition({\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n }),\n };\n }\n\n if (home.type === \"edge\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n null,\n `${context.path}.boardId: ${context.label}`,\n );\n const edgeId = resolveBoardEdgeId(home.boardId, home.ref.spaces);\n return {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position: nextLocationPosition({\n type: \"OnEdge\",\n boardId,\n edgeId,\n }),\n };\n }\n\n if (home.type === \"vertex\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n null,\n `${context.path}.boardId: ${context.label}`,\n );\n const vertexId = resolveBoardVertexId(home.boardId, home.ref.spaces);\n return {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position: nextLocationPosition({\n type: \"OnVertex\",\n boardId,\n vertexId,\n }),\n };\n }\n\n const exhaustive: never = home;\n throw new Error(\n `Unsupported component home: ${JSON.stringify(exhaustive)}`,\n );\n };\n\n for (const [cardSetIndex, cardSet] of manifest.cardSets.entries()) {\n const materializedCardSet = materializeCardSet(cardSet);\n for (const [cardIndex, card] of materializedCardSet.cards.entries()) {\n const cardInstanceIds = renderCardInstanceIds(card);\n for (const [instanceIndex, cardId] of cardInstanceIds.entries()) {\n cards[cardId] = {\n id: cardId,\n cardSetId: materializedCardSet.id,\n cardType: card.cardType ?? card.type,\n name: card.name,\n text: card.text,\n properties: {\n ...materializeCardPropertiesDefaults(\n materializedCardSet.cardSchema,\n card.cardType ?? card.type,\n analysis,\n ),\n ...(card.properties ?? {}),\n },\n };\n const resolvedHome = card.home ?? materializedCardSet.defaultHome;\n const path =\n card.home === undefined\n ? `manifest.cardSets[${cardSetIndex}].defaultHome`\n : `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].home`;\n componentLocations[cardId] = materializeComponentLocation(\n resolvedHome,\n {\n path,\n label: `Card '${card.type}' instance ${instanceIndex + 1}`,\n },\n );\n }\n }\n }\n\n if (Object.keys(cards).length !== analysis.cardIds.length) {\n throw new Error(\n \"Materialized card record cardinality drifted from analysis.\",\n );\n }\n if (Object.keys(componentLocations).length !== analysis.cardIds.length) {\n throw new Error(\n \"Materialized card locations drifted from analysis before seed placement.\",\n );\n }\n\n const pieceTypesById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [pieceType.id, pieceType]),\n );\n const dieTypesById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [dieType.id, dieType]),\n );\n\n const assignSeedLocation = (\n componentId: string,\n ownerId: string | null | undefined,\n home: PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"] | undefined,\n context: {\n path: string;\n label: string;\n },\n ) => {\n if (!home) {\n componentLocations[componentId] = { type: \"Detached\" };\n return;\n }\n\n if (home.type === \"slot\") {\n componentLocations[componentId] = {\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n position: nextLocationPosition({\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n }),\n };\n return;\n }\n\n if (home.type === \"zone\") {\n if (zoneScopeById.get(home.zoneId) === \"perPlayer\") {\n if (!ownerId) {\n throw new Error(\n `${context.path}.zoneId: ${context.label} requires ownerId because zone '${home.zoneId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n componentLocations[componentId] = {\n type: \"InHand\",\n handId: home.zoneId,\n playerId: ownerId,\n position: nextLocationPosition({\n type: \"InHand\",\n handId: home.zoneId,\n playerId: ownerId,\n }),\n };\n return;\n }\n\n componentLocations[componentId] = {\n type: \"InZone\",\n zoneId: home.zoneId,\n playedBy: null,\n position: nextLocationPosition({\n type: \"InZone\",\n zoneId: home.zoneId,\n }),\n };\n return;\n }\n\n if (home.type === \"space\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n position: nextLocationPosition({\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n }),\n };\n return;\n }\n\n if (home.type === \"container\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n position: nextLocationPosition({\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n }),\n };\n return;\n }\n\n if (home.type === \"edge\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n const edgeId = resolveBoardEdgeId(home.boardId, home.ref.spaces);\n componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position: nextLocationPosition({\n type: \"OnEdge\",\n boardId,\n edgeId,\n }),\n };\n return;\n }\n\n if (home.type === \"vertex\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n const vertexId = resolveBoardVertexId(home.boardId, home.ref.spaces);\n componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position: nextLocationPosition({\n type: \"OnVertex\",\n boardId,\n vertexId,\n }),\n };\n return;\n }\n\n componentLocations[componentId] = { type: \"Detached\" };\n };\n\n for (const [seedIndex, seed] of (manifest.pieceSeeds ?? []).entries()) {\n const pieceType = pieceTypesById.get(seed.typeId);\n for (const componentId of expandSeedIds([seed])) {\n pieces[componentId] = {\n componentType: \"piece\",\n id: componentId,\n pieceTypeId: seed.typeId,\n pieceName: pieceType?.name ?? seed.typeId,\n ownerId: seed.ownerId ?? null,\n properties: {\n ...materializeObjectSchemaDefaults(\n analysis.pieceTypeSchemasById.get(seed.typeId),\n analysis,\n ),\n ...(seed.fields ?? {}),\n },\n };\n assignSeedLocation(componentId, seed.ownerId, seed.home, {\n path: `manifest.pieceSeeds[${seedIndex}].home`,\n label: `Piece seed '${seed.id ?? seed.typeId}'`,\n });\n }\n }\n\n for (const [seedIndex, seed] of (manifest.dieSeeds ?? []).entries()) {\n const dieType = dieTypesById.get(seed.typeId);\n for (const componentId of expandSeedIds([seed])) {\n dice[componentId] = {\n componentType: \"die\",\n id: componentId,\n dieTypeId: seed.typeId,\n dieName: dieType?.name ?? seed.typeId,\n ownerId: seed.ownerId ?? null,\n sides: dieType?.sides ?? 6,\n value: null,\n properties: {\n ...materializeObjectSchemaDefaults(\n analysis.dieTypeSchemasById.get(seed.typeId),\n analysis,\n ),\n ...(seed.fields ?? {}),\n },\n };\n assignSeedLocation(componentId, seed.ownerId, seed.home, {\n path: `manifest.dieSeeds[${seedIndex}].home`,\n label: `Die seed '${seed.id ?? seed.typeId}'`,\n });\n }\n }\n\n const boardStatesById = createRecord<Record<string, unknown>>();\n const hexBoardStatesById = createRecord<Record<string, unknown>>();\n const squareBoardStatesById = createRecord<Record<string, unknown>>();\n\n for (const analyzedBoard of analysis.analyzedBoards) {\n const sharedBoardState = {\n baseId: analyzedBoard.board.id,\n layout: analyzedBoard.layout,\n typeId: analyzedBoard.boardTypeId ?? null,\n scope: analyzedBoard.board.scope,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.boardFieldsSchema,\n analysis,\n ),\n ...(analyzedBoard.board.fields ?? {}),\n },\n };\n\n const buildSpaces = () =>\n Object.fromEntries(\n analyzedBoard.spaces.map((space) => {\n const spaceId = space.id;\n const baseSpaceState = {\n id: spaceId,\n name: \"name\" in space ? (space.name ?? null) : null,\n typeId: space?.typeId ?? null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.spaceFieldsSchema,\n analysis,\n ),\n ...(space.fields ?? {}),\n },\n zoneId: \"zoneId\" in space ? (space.zoneId ?? null) : null,\n };\n\n if (analyzedBoard.layout === \"hex\") {\n const hexSpace = space as HexSpaceSpec;\n return [\n spaceId,\n {\n ...baseSpaceState,\n q: hexSpace.q,\n r: hexSpace.r,\n },\n ];\n }\n\n if (analyzedBoard.layout === \"square\") {\n const squareSpace = space as SquareSpaceSpec;\n return [\n spaceId,\n {\n ...baseSpaceState,\n row: squareSpace.row,\n col: squareSpace.col,\n },\n ];\n }\n\n return [spaceId, baseSpaceState];\n }),\n );\n\n const relations =\n analyzedBoard.layout === \"hex\"\n ? []\n : analyzedBoard.relations.map((relation) => ({\n id: relation.id ?? null,\n typeId: relation.typeId,\n fromSpaceId: relation.fromSpaceId,\n toSpaceId: relation.toSpaceId,\n directed: relation.directed ?? false,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.relationFieldsSchema,\n analysis,\n ),\n ...(relation.fields ?? {}),\n },\n }));\n\n const buildContainers = (runtimeBoardId: string) =>\n analyzedBoard.layout === \"hex\"\n ? {}\n : Object.fromEntries(\n analyzedBoard.containers.map((container) => {\n const containerId = container.id;\n return [\n containerId,\n {\n id: containerId,\n name: container.name ?? containerId,\n host:\n container.host.type === \"space\"\n ? { type: \"space\", spaceId: container.host.spaceId }\n : { type: \"board\" },\n allowedCardSetIds: container.allowedCardSetIds,\n zoneId: `board:${runtimeBoardId}:container:${containerId}`,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.containerFieldsSchema,\n analysis,\n runtimeBoardId,\n ),\n ...(container.fields ?? {}),\n },\n },\n ];\n }),\n );\n\n const edges =\n analyzedBoard.layout === \"generic\"\n ? []\n : analyzedBoard.edges.map((edge) => ({\n id: edge.id,\n spaceIds: [...edge.spaceIds],\n typeId: edge.typeId ?? null,\n label: edge.label ?? null,\n ownerId: null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.edgeFieldsSchema,\n analysis,\n ),\n ...(edge.fields ?? {}),\n },\n }));\n\n const vertices =\n analyzedBoard.layout === \"generic\"\n ? []\n : analyzedBoard.vertices.map((vertex) => ({\n id: vertex.id,\n spaceIds: [...vertex.spaceIds],\n typeId: vertex.typeId ?? null,\n label: vertex.label ?? null,\n ownerId: null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.vertexFieldsSchema,\n analysis,\n ),\n ...(vertex.fields ?? {}),\n },\n }));\n\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n const playerId =\n analyzedBoard.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(analyzedBoard.board.id.length + 1)\n : null;\n const boardState = {\n id: runtimeBoardId,\n ...sharedBoardState,\n playerId,\n spaces: cloneJson(buildSpaces()),\n relations: cloneJson(relations),\n containers: cloneJson(buildContainers(runtimeBoardId)),\n ...(analyzedBoard.layout === \"hex\"\n ? {\n orientation: analyzedBoard.board.orientation ?? \"pointy\",\n edges: cloneJson(edges),\n vertices: cloneJson(vertices),\n }\n : analyzedBoard.layout === \"square\"\n ? {\n edges: cloneJson(edges),\n vertices: cloneJson(vertices),\n }\n : {}),\n };\n\n boardStatesById[runtimeBoardId] = boardState;\n if (analyzedBoard.layout === \"hex\") {\n hexBoardStatesById[runtimeBoardId] = boardState;\n }\n if (analyzedBoard.layout === \"square\") {\n squareBoardStatesById[runtimeBoardId] = boardState;\n }\n }\n }\n\n const sharedZones = Object.fromEntries(\n analysis.sharedZones.map((zone) => [zone.id, [] as string[]]),\n );\n const perPlayerZones = Object.fromEntries(\n analysis.playerZones.map((zone) => [\n zone.id,\n Object.fromEntries(\n playerIds.map((playerId) => [playerId, [] as string[]]),\n ),\n ]),\n );\n const zoneVisibility = Object.fromEntries(\n (manifest.zones ?? []).map((zone) => [\n zone.id,\n zone.visibility ?? \"public\",\n ]),\n );\n const zoneCardSetIdsByZoneId = Object.fromEntries(\n Array.from(analysis.zoneCardSetIdsById.entries()).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n const handVisibility = Object.fromEntries(\n analysis.playerZones.map((zone) => [\n zone.id,\n zone.visibility ?? \"ownerOnly\",\n ]),\n );\n const componentSortPosition = (position: unknown) =>\n typeof position === \"number\" ? position : Number.MAX_SAFE_INTEGER;\n const pushSharedComponent = (zoneId: string, componentId: string) => {\n const zone = sharedZones[zoneId];\n if (!zone) {\n return;\n }\n zone.push(componentId);\n zone.sort(\n (left, right) =>\n componentSortPosition(componentLocations[left]?.position) -\n componentSortPosition(componentLocations[right]?.position),\n );\n };\n const pushPlayerComponent = (\n zoneId: string,\n playerId: string,\n componentId: string,\n ) => {\n const zone = perPlayerZones[zoneId]?.[playerId];\n if (!zone) {\n return;\n }\n zone.push(componentId);\n zone.sort(\n (left, right) =>\n componentSortPosition(componentLocations[left]?.position) -\n componentSortPosition(componentLocations[right]?.position),\n );\n };\n\n for (const [componentId, location] of Object.entries(componentLocations)) {\n switch (location.type) {\n case \"InDeck\":\n pushSharedComponent(location.deckId as string, componentId);\n break;\n case \"InHand\":\n pushPlayerComponent(\n location.handId as string,\n location.playerId as string,\n componentId,\n );\n break;\n case \"InZone\":\n pushSharedComponent(location.zoneId as string, componentId);\n break;\n default:\n break;\n }\n }\n const ownerOfCard = Object.fromEntries(\n Object.keys(cards).map((cardId) => [cardId, null]),\n );\n const visibility = Object.fromEntries(\n Object.keys(cards).map((cardId) => [cardId, { faceUp: true }]),\n );\n const resourcesByPlayer = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n Object.fromEntries(\n analysis.resourceIds.map((resourceId) => [resourceId, 0]),\n ),\n ]),\n );\n return cloneJson({\n playerOrder: playerIds,\n zones: {\n shared: sharedZones,\n perPlayer: perPlayerZones,\n visibility: zoneVisibility,\n cardSetIdsByZoneId: zoneCardSetIdsByZoneId,\n },\n decks: cloneJson(sharedZones),\n hands: cloneJson(perPlayerZones),\n handVisibility,\n cards,\n pieces,\n componentLocations,\n ownerOfCard,\n visibility,\n resources: resourcesByPlayer,\n boards: {\n byId: boardStatesById,\n hex: hexBoardStatesById,\n square: squareBoardStatesById,\n network: {},\n track: {},\n },\n dice,\n });\n}\n","import { z } from \"zod\";\nimport type {\n ObjectSchema,\n PropertySchema,\n} from \"../../shared/domain/contracts.js\";\nimport type { ManifestIds } from \"../model\";\n\nimport type { analyzeManifest } from \"./materialize\";\ntype Analysis = ReturnType<typeof analyzeManifest>;\nexport type RuntimeManifestIds = {\n [K in keyof ManifestIds<\n string,\n string,\n string,\n string,\n string\n >]: z.ZodType<string>;\n};\ntype Ids = RuntimeManifestIds;\nexport function createTableSchema(analysis: Analysis, ids: Ids) {\n const unknownRecordSchema = z.record(z.string(), z.unknown());\n const objectSchema = (\n schema: ObjectSchema | null | undefined,\n ): z.ZodTypeAny =>\n schema && Object.keys(schema.properties).length\n ? z.object(\n Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n propertySchema(value),\n ]),\n ),\n )\n : unknownRecordSchema;\n function propertySchema(schema: PropertySchema | undefined): z.ZodTypeAny {\n if (!schema) return z.unknown();\n let result: z.ZodTypeAny;\n switch (schema.type) {\n case \"string\":\n result = z.string();\n break;\n case \"integer\":\n result = z.number().int();\n break;\n case \"number\":\n result = z.number();\n break;\n case \"boolean\":\n result = z.boolean();\n break;\n case \"enum\":\n result = schema.enums?.length\n ? z.enum(schema.enums as [string, ...string[]])\n : z.string();\n break;\n case \"array\":\n result = z.array(propertySchema(schema.items));\n break;\n case \"record\":\n result = z.record(z.string(), propertySchema(schema.values));\n break;\n case \"object\":\n result = objectSchema({ properties: schema.properties ?? {} });\n break;\n default:\n result = ids[schema.type];\n }\n if (schema.nullable) result = result.nullable();\n if (schema.optional) result = result.optional();\n if (Object.prototype.hasOwnProperty.call(schema, \"default\"))\n result = result.default(schema.default);\n return result;\n }\n const shape = <T>(\n items: readonly T[],\n getKey: (item: T) => string,\n getSchema: (item: T) => z.ZodTypeAny,\n ) =>\n z.object(\n Object.fromEntries(items.map((item) => [getKey(item), getSchema(item)])),\n );\n const cardStateByIdSchema = shape(\n analysis.cardIds,\n (id) => id,\n (id) => {\n const setId = analysis.cardSetIdByCardId.get(id)!;\n const type = analysis.cardTypeByCardId.get(id)!;\n const schema = analysis.cardSets.find(\n (set) => set.id === setId,\n )!.cardSchema;\n const properties =\n schema && \"variants\" in schema\n ? objectSchema({\n properties: {\n ...schema.shared,\n ...schema.variants[type]?.properties,\n },\n })\n : objectSchema(schema);\n return z.object({\n componentType: z.string().optional(),\n id: z.literal(id),\n cardSetId: z.literal(setId),\n cardType: z.literal(type),\n name: z.string().optional(),\n text: z.string().optional(),\n properties,\n });\n },\n );\n const pieceStateByIdSchema = shape(\n analysis.pieceIds,\n (id) => id,\n (id) => {\n const type = analysis.pieceTypeIdByPieceId.get(id)!;\n return z.object({\n componentType: z.string().optional(),\n id: z.literal(id),\n pieceTypeId: z.literal(type),\n pieceName: z.string().nullish(),\n ownerId: ids.playerId.nullish(),\n properties: objectSchema(analysis.pieceTypeSchemasById.get(type)),\n });\n },\n );\n const dieStateByIdSchema = shape(\n analysis.dieIds,\n (id) => id,\n (id) => {\n const type = analysis.dieTypeIdByDieId.get(id)!;\n return z.object({\n componentType: z.string().optional(),\n id: z.literal(id),\n dieTypeId: z.literal(type),\n dieName: z.string().nullish(),\n ownerId: ids.playerId.nullish(),\n sides: z.literal(\n analysis.manifest.dieTypes?.find((die) => die.id === type)?.sides ??\n 6,\n ),\n value: z.number().int().nullish(),\n properties: objectSchema(analysis.dieTypeSchemasById.get(type)),\n });\n },\n );\n const sharedZoneSchema = shape(\n analysis.sharedZones,\n (zone) => zone.id,\n () => z.array(ids.cardId),\n );\n const playerZoneSchema = shape(\n analysis.playerZones,\n (zone) => zone.id,\n () => z.record(ids.playerId, z.array(ids.cardId)),\n );\n const zoneIdSchema = ids.zoneId;\n const playerZoneIdSchema = ids.playerZoneId;\n const slotVariants = analysis.strictSlotHosts.flatMap((host) =>\n host.slotIds.map((slotId) =>\n z.object({\n type: z.literal(\"InSlot\"),\n host: z.object({ kind: z.literal(host.kind), id: z.literal(host.id) }),\n slotId: z.literal(slotId),\n position: z.number().int().nullish(),\n }),\n ),\n );\n const slotLocationSchema = slotVariants.length\n ? z.union(\n slotVariants as unknown as [\n z.ZodTypeAny,\n z.ZodTypeAny,\n ...z.ZodTypeAny[],\n ],\n )\n : z.never();\n const boardSpaceTypeIdSchema = ids.spaceTypeId.nullable().optional();\n const boardSpaceStateSchema = z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: boardSpaceTypeIdSchema,\n fields: unknownRecordSchema,\n zoneId: z.string().nullable().optional(),\n });\n const hexSpaceStateSchema = boardSpaceStateSchema.extend({\n q: z.number().int(),\n r: z.number().int(),\n });\n const squareSpaceStateSchema = boardSpaceStateSchema.extend({\n row: z.number().int(),\n col: z.number().int(),\n });\n const boardRelationStateSchema = z.object({\n id: z.string().nullable().optional(),\n typeId: ids.relationTypeId,\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: unknownRecordSchema,\n });\n const boardContainerStateSchema = z.object({\n id: ids.boardContainerId,\n name: z.string(),\n host: z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"board\") }),\n z.object({ type: z.literal(\"space\"), spaceId: ids.spaceId }),\n ]),\n allowedCardSetIds: z.array(ids.cardSetId).optional(),\n zoneId: z.string(),\n fields: unknownRecordSchema,\n });\n const runtimeGenericBoardStateSchema = z.object({\n id: ids.boardId,\n baseId: ids.boardBaseId,\n layout: z.literal(\"generic\"),\n typeId: ids.boardTypeId.nullable().optional(),\n scope: z.enum([\"shared\", \"perPlayer\"]),\n playerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n // T220: per-board state.spaces is loose-keyed by string. See the\n // codegen-template comment in renderGenericBoardStateSchema for\n // the rationale; the wire shape is unchanged (additionalProperties\n // JSON), and the inner id field narrows at parse time.\n spaces: z.record(z.string(), boardSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.record(z.string(), boardContainerStateSchema),\n });\n const hexEdgeStateSchema = z.object({\n id: ids.edgeId,\n spaceIds: z.array(ids.spaceId).min(1).max(2),\n typeId: ids.edgeTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n });\n const hexVertexStateSchema = z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(3),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n });\n const squareVertexStateSchema = z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(4),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n });\n const runtimeHexBoardStateSchema = runtimeGenericBoardStateSchema.extend({\n layout: z.literal(\"hex\"),\n // T220: loose-keyed by string — see comment above.\n spaces: z.record(z.string(), hexSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.object({}),\n orientation: z.enum([\"pointy\", \"flat\"]),\n edges: z.array(hexEdgeStateSchema),\n vertices: z.array(hexVertexStateSchema),\n });\n const runtimeSquareBoardStateSchema = runtimeGenericBoardStateSchema.extend({\n layout: z.literal(\"square\"),\n // T220: loose-keyed by string — see comment above.\n spaces: z.record(z.string(), squareSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.record(z.string(), boardContainerStateSchema),\n edges: z.array(hexEdgeStateSchema),\n vertices: z.array(squareVertexStateSchema),\n });\n const boards = analysis.analyzedBoards.flatMap((board) =>\n board.runtimeBoardIds.map((id) => {\n const base = {\n id:\n board.board.scope === \"perPlayer\"\n ? z.templateLiteral([board.board.id, \":\", z.string().min(1)])\n : z.literal(id),\n baseId: z.literal(board.board.id),\n scope: z.literal(board.board.scope),\n fields: objectSchema(board.boardFieldsSchema),\n };\n const spaces = boardSpaceStateSchema.extend({\n fields: objectSchema(board.spaceFieldsSchema),\n });\n const relations = z.array(\n boardRelationStateSchema.extend({\n fields: objectSchema(\n \"relationFieldsSchema\" in board\n ? board.relationFieldsSchema\n : undefined,\n ),\n }),\n );\n const containers =\n \"containers\" in board\n ? shape(\n board.containers,\n (item) => item.id,\n (item) =>\n boardContainerStateSchema.extend({\n id: z.literal(item.id),\n fields: objectSchema(board.containerFieldsSchema),\n }),\n )\n : z.object({});\n if (board.layout === \"generic\")\n return {\n id,\n scope: board.board.scope,\n layout: board.layout,\n schema: runtimeGenericBoardStateSchema.extend({\n ...base,\n spaces: z.record(z.string(), spaces),\n relations,\n containers,\n }),\n };\n const edges = z.array(\n hexEdgeStateSchema.extend({\n fields: objectSchema(board.edgeFieldsSchema),\n }),\n );\n const vertices = z.array(\n (board.layout === \"hex\"\n ? hexVertexStateSchema\n : squareVertexStateSchema\n ).extend({ fields: objectSchema(board.vertexFieldsSchema) }),\n );\n return {\n id,\n scope: board.board.scope,\n layout: board.layout,\n schema:\n board.layout === \"hex\"\n ? runtimeHexBoardStateSchema.extend({\n ...base,\n spaces: z.record(\n z.string(),\n spaces.extend({ q: z.number().int(), r: z.number().int() }),\n ),\n edges,\n vertices,\n })\n : runtimeSquareBoardStateSchema.extend({\n ...base,\n spaces: z.record(\n z.string(),\n spaces.extend({\n row: z.number().int(),\n col: z.number().int(),\n }),\n ),\n relations,\n containers,\n edges,\n vertices,\n }),\n };\n }),\n );\n const boardCollection = (entries: typeof boards) => {\n const shared = entries.filter((board) => board.scope === \"shared\");\n const scoped = entries\n .filter((board) => board.scope === \"perPlayer\")\n .map((board) => board.schema);\n return shape(\n shared,\n (board) => board.id,\n (board) => board.schema,\n ).catchall(scoped.length ? z.union(scoped) : z.never());\n };\n const boardStateByIdSchema = boardCollection(boards);\n const hexBoardStateByIdSchema = boardCollection(\n boards.filter((board) => board.layout === \"hex\"),\n );\n const squareBoardStateByIdSchema = boardCollection(\n boards.filter((board) => board.layout === \"square\"),\n );\n return z\n .object({\n playerOrder: z.array(ids.playerId),\n zones: z.object({\n shared: sharedZoneSchema,\n perPlayer: playerZoneSchema,\n visibility: z.record(\n zoneIdSchema,\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cardSetIdsByZoneId: z\n .record(zoneIdSchema, z.array(ids.cardSetId))\n .optional(),\n }),\n decks: sharedZoneSchema,\n hands: playerZoneSchema,\n handVisibility: z.record(\n playerZoneIdSchema,\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: cardStateByIdSchema,\n pieces: pieceStateByIdSchema,\n componentLocations: z.record(\n z.string(),\n z.union([\n z.object({ type: z.literal(\"Detached\") }),\n z.object({\n type: z.literal(\"InDeck\"),\n deckId: ids.deckId,\n playedBy: ids.playerId.nullable(),\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InHand\"),\n handId: ids.handId,\n playerId: ids.playerId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: ids.playerId.nullable().optional(),\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnSpace\"),\n boardId: ids.boardId,\n spaceId: ids.spaceId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InContainer\"),\n boardId: ids.boardId,\n containerId: ids.boardContainerId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnEdge\"),\n boardId: ids.boardId,\n edgeId: ids.edgeId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnVertex\"),\n boardId: ids.boardId,\n vertexId: ids.vertexId,\n position: z.number().int().nullable().optional(),\n }),\n slotLocationSchema,\n ]),\n ),\n ownerOfCard: z.record(ids.cardId, ids.playerId.nullable()),\n visibility: z.record(\n ids.cardId,\n z.object({\n faceUp: z.boolean(),\n visibleTo: z.array(ids.playerId).nullable().optional(),\n }),\n ),\n resources: z.record(\n ids.playerId,\n z.record(ids.resourceId, z.number().int()),\n ),\n boards: z.object({\n byId: boardStateByIdSchema,\n hex: hexBoardStateByIdSchema,\n square: squareBoardStateByIdSchema,\n network: z.record(z.string(), unknownRecordSchema).default({}),\n track: z.record(z.string(), unknownRecordSchema).default({}),\n }),\n dice: dieStateByIdSchema,\n })\n .superRefine((table, context) => {\n const players = new Set(table.playerOrder);\n if (players.size !== table.playerOrder.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"playerOrder\"],\n message: \"Duplicate player id\",\n });\n }\n const checkPlayers = (\n record: Record<string, unknown>,\n path: string[],\n ) => {\n for (const playerId of table.playerOrder) {\n if (!Object.hasOwn(record, playerId))\n context.addIssue({\n code: \"custom\",\n path: [...path, playerId],\n message: \"Missing active player\",\n });\n }\n for (const playerId of Object.keys(record)) {\n if (!players.has(playerId))\n context.addIssue({\n code: \"custom\",\n path: [...path, playerId],\n message: \"Unknown active player\",\n });\n }\n };\n checkPlayers(table.resources, [\"resources\"]);\n for (const [id, players] of Object.entries(\n table.hands as Record<string, Record<string, unknown>>,\n ))\n checkPlayers(players, [\"hands\", id]);\n for (const [id, players] of Object.entries(\n table.zones.perPlayer as Record<string, Record<string, unknown>>,\n ))\n checkPlayers(players, [\"zones\", \"perPlayer\", id]);\n });\n}\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"./model\";\n\nexport type SparseMap<Key extends string, Value> = Partial<Record<Key, Value>>;\nexport type SparseCounts<Key extends string> = SparseMap<Key, number>;\n\ntype SparseSchemaMetadata = {\n keySchema: z.ZodType<string>;\n valueSchema: z.ZodTypeAny;\n};\n\nconst sparseSchemas = new WeakMap<object, SparseSchemaMetadata>();\n\nexport function sparseMap<\n KeySchema extends z.ZodType<string>,\n ValueSchema extends z.ZodTypeAny,\n>(\n keySchema: KeySchema,\n valueSchema: ValueSchema,\n): z.ZodType<SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>> {\n const schema = z.partialRecord(keySchema, valueSchema) as z.ZodType<\n SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>\n >;\n sparseSchemas.set(schema as unknown as object, {\n keySchema,\n valueSchema,\n });\n return schema;\n}\n\nexport function sparseCounts<KeySchema extends z.ZodType<string>>(\n keySchema: KeySchema,\n): z.ZodType<SparseCounts<z.infer<KeySchema>>> {\n return sparseMap(keySchema, z.number().int().min(0)) as z.ZodType<\n SparseCounts<z.infer<KeySchema>>\n >;\n}\n\nexport function getZodDef(schema: unknown): {\n type?: string;\n} & Record<string, unknown> {\n const anySchema = schema as {\n _zod?: { def?: Record<string, unknown> };\n def?: Record<string, unknown>;\n };\n const fromInternal = anySchema?._zod?.def;\n if (fromInternal && typeof fromInternal === \"object\") {\n return fromInternal;\n }\n const fromLegacy = anySchema?.def;\n if (fromLegacy && typeof fromLegacy === \"object\") {\n return fromLegacy;\n }\n return {};\n}\n\nexport function unwrapWrappers(schema: unknown): unknown {\n let current = schema;\n while (true) {\n const def = getZodDef(current);\n const innerType = def.innerType;\n if (\n (def.type === \"nullable\" ||\n def.type === \"optional\" ||\n def.type === \"default\" ||\n def.type === \"readonly\" ||\n def.type === \"catch\") &&\n innerType\n ) {\n current = innerType;\n continue;\n }\n return current;\n }\n}\n\nexport function isPlainZodString(schema: unknown): boolean {\n return getZodDef(schema).type === \"string\";\n}\n\nexport function isZodArray(schema: unknown): boolean {\n return getZodDef(schema).type === \"array\";\n}\n\nexport function isEnumKeyedRecordSchema(schema: unknown): boolean {\n const def = getZodDef(schema);\n const keyType = def.keyType;\n return (\n def.type === \"record\" &&\n typeof keyType === \"object\" &&\n keyType !== null &&\n getZodDef(keyType).type === \"enum\"\n );\n}\n\nexport function isSparseMapSchema(schema: unknown): boolean {\n const inner = unwrapWrappers(schema);\n return (\n typeof inner === \"object\" &&\n inner !== null &&\n sparseSchemas.has(inner as object)\n );\n}\n\nfunction getSparseSchemaMetadata(\n schema: unknown,\n): SparseSchemaMetadata | undefined {\n const inner = unwrapWrappers(schema);\n if (typeof inner !== \"object\" || inner === null) {\n return undefined;\n }\n return sparseSchemas.get(inner as object);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getObjectShape(\n schema: unknown,\n): Record<string, unknown> | null {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return null;\n }\n const shape = def.shape;\n if (typeof shape === \"function\") {\n const resolved = shape();\n return resolved && typeof resolved === \"object\"\n ? (resolved as Record<string, unknown>)\n : null;\n }\n return shape && typeof shape === \"object\"\n ? (shape as Record<string, unknown>)\n : null;\n}\n\nfunction normalizeSchemaInput(schema: unknown, input: unknown): unknown {\n const inner = unwrapWrappers(schema);\n const sparse = getSparseSchemaMetadata(inner);\n if (sparse && isPlainObject(input)) {\n const filtered = Object.fromEntries(\n Object.entries(input)\n .filter(\n ([key, value]) =>\n typeof value !== \"undefined\" &&\n sparse.keySchema.safeParse(key).success,\n )\n .map(([key, value]) => [\n key,\n normalizeSchemaInput(sparse.valueSchema, value),\n ]),\n );\n return filtered;\n }\n\n const shape = getObjectShape(inner);\n if (shape && isPlainObject(input)) {\n return Object.fromEntries(\n Object.entries(input).map(([key, value]) => {\n const fieldSchema = shape[key];\n return [\n key,\n typeof fieldSchema === \"undefined\"\n ? value\n : normalizeSchemaInput(fieldSchema, value),\n ];\n }),\n );\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && Array.isArray(input) && def.element) {\n return input.map((value) => normalizeSchemaInput(def.element, value));\n }\n\n return input;\n}\n\nexport function normalizeCommandParams<Output>(\n schema: SchemaLike<Output>,\n input: unknown,\n): Output {\n return schema.parse(normalizeSchemaInput(schema, input));\n}\n","import { isManifestScopedSchema, type SchemaLike } from \"../model\";\nimport type { InputCollector } from \"../model\";\nimport {\n getObjectShape,\n getZodDef,\n isEnumKeyedRecordSchema,\n isPlainZodString,\n isSparseMapSchema,\n isZodArray,\n unwrapWrappers,\n} from \"../schema-helpers\";\nimport type { AnyReducerGameContract } from \"./types\";\n\n/**\n * Canonical set of manifest-scoped id field names. `defineGameContract`\n * uses this list to reject state schemas that describe one of these fields\n * with a raw `z.string()` instead of the corresponding branded enum from\n * `manifest.ids.*` (or `gameContract.schemas.*`).\n *\n * The rule of thumb is \"one way to do things\": if a field *is* a player id,\n * card id, zone id, etc. in the manifest, the authored state schema must\n * reuse the same literal/branded schema so generated types line up with the\n * runtime checks, instead of silently widening to `string`.\n */\nconst MANIFEST_SCOPED_ID_NAMES = [\n \"playerId\",\n \"cardId\",\n \"deckId\",\n \"handId\",\n \"zoneId\",\n \"sharedZoneId\",\n \"playerZoneId\",\n \"boardId\",\n \"boardContainerId\",\n \"boardTypeId\",\n \"boardBaseId\",\n \"edgeId\",\n \"edgeTypeId\",\n \"vertexId\",\n \"vertexTypeId\",\n \"spaceId\",\n \"spaceTypeId\",\n \"relationTypeId\",\n \"resourceId\",\n \"pieceId\",\n \"pieceTypeId\",\n \"dieId\",\n \"dieTypeId\",\n \"cardSetId\",\n \"cardType\",\n] as const;\n\ntype ManifestScopedIdName = (typeof MANIFEST_SCOPED_ID_NAMES)[number];\n\nfunction matchManifestScopedIdName(\n key: string,\n): { name: ManifestScopedIdName; kind: \"singular\" | \"plural\" } | null {\n for (const name of MANIFEST_SCOPED_ID_NAMES) {\n const capitalized = `${name.charAt(0).toUpperCase()}${name.slice(1)}`;\n if (key === name || key.endsWith(capitalized)) {\n return { name, kind: \"singular\" };\n }\n const plural = `${name}s`;\n const capitalizedPlural = `${capitalized}s`;\n if (key === plural || key.endsWith(capitalizedPlural)) {\n return { name, kind: \"plural\" };\n }\n }\n return null;\n}\n\nexport function validateInteractionParamsSchema(\n schema: unknown,\n context: \"defineInteraction\",\n path: string,\n): void {\n const inner = unwrapWrappers(schema);\n if (isEnumKeyedRecordSchema(inner) && !isSparseMapSchema(inner)) {\n throw new Error(\n `${context}: ${path} uses an enum-keyed z.record(...), which parses as a total map at runtime. ` +\n `Use sparseMap(...) or sparseCounts(...) from @dreamboard-games/sdk/reducer instead so interaction params stay sparse and match runtime validation.`,\n );\n }\n\n const shape = getObjectShape(inner);\n if (shape) {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n validateInteractionParamsSchema(fieldSchema, context, `${path}.${key}`);\n }\n return;\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && def.element) {\n validateInteractionParamsSchema(def.element, context, `${path}[]`);\n return;\n }\n\n if (def.type === \"record\" && def.valueType) {\n validateInteractionParamsSchema(def.valueType, context, `${path}.*`);\n }\n}\n\nexport function validateInteractionInputsSchema(\n inputs: Record<string, InputCollector> | undefined,\n context: \"defineInteraction\",\n): void {\n if (!inputs) return;\n for (const [key, collector] of Object.entries(inputs)) {\n validateInteractionParamsSchema(collector.schema, context, `inputs.${key}`);\n }\n}\n\nexport function validateManyCommitPolicy(input: {\n inputs: Record<string, InputCollector> | undefined;\n commit?: { mode: string };\n context: string;\n}): void {\n if (input.commit?.mode !== \"autoWhenReady\") return;\n if (\n Object.values(input.inputs ?? {}).some(\n (collector) => collector.selection?.mode === \"many\",\n )\n ) {\n throw new Error(\n `${input.context}: interactions with many(...) inputs must use commit: { mode: \"manual\" }.`,\n );\n }\n}\n\nexport function validateInteractionLikeDefinition(\n input: {\n inputs?: Record<string, InputCollector>;\n steps?: { entries: readonly { key: string }[] };\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n context: \"defineInteraction\",\n): void {\n if (input.steps) {\n if (input.inputs !== undefined)\n throw new Error(\"An interaction declares inputs or steps, never both.\");\n if (input.steps.entries.length === 0)\n throw new Error(\"An interaction requires at least one step.\");\n const keys = input.steps.entries.map((entry) => entry.key);\n if (new Set(keys).size !== keys.length)\n throw new Error(\"Interaction step keys must be unique.\");\n }\n validateInteractionInputsSchema(input.inputs, context);\n validateManyCommitPolicy({\n inputs: input.inputs,\n commit: input.commit,\n context,\n });\n if (input.paramsSchema) {\n validateInteractionParamsSchema(\n input.paramsSchema,\n context,\n \"paramsSchema\",\n );\n }\n}\n\nexport function validateStateSchemaIdBranding(\n schema: unknown,\n scope: \"public\" | \"private\" | \"hidden\",\n): void {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return;\n }\n const shape = def.shape as Record<string, unknown> | undefined;\n if (!shape) {\n return;\n }\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const match = matchManifestScopedIdName(key);\n if (!match) {\n continue;\n }\n const inner = unwrapWrappers(fieldSchema);\n if (match.kind === \"singular\") {\n if (isPlainZodString(inner) && !isManifestScopedSchema(inner)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses a raw z.string() ` +\n `but its name identifies it as a manifest-scoped '${match.name}'. ` +\n `Use gameContract.schemas.${match.name} (or manifest.ids.${match.name}) ` +\n `so the branded literal union flows through state types.`,\n );\n }\n continue;\n }\n if (match.kind === \"plural\" && isZodArray(inner)) {\n const element = unwrapWrappers(getZodDef(inner).element);\n if (isPlainZodString(element) && !isManifestScopedSchema(element)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses z.array(z.string()) ` +\n `but its name identifies it as manifest-scoped '${match.name}' values. ` +\n `Use z.array(gameContract.schemas.${match.name}) ` +\n `(or manifest.ids.${match.name}) so the branded literal union flows through state types.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGamePhaseNames(definition: {\n contract: AnyReducerGameContract;\n phases: Record<string, unknown>;\n initialPhase?: string;\n}): void {\n const contractPhaseNames = (\n definition.contract as AnyReducerGameContract & {\n phaseNames?: readonly string[];\n }\n ).phaseNames;\n if (!Array.isArray(contractPhaseNames)) {\n return;\n }\n const declared = new Set(contractPhaseNames);\n const actual = new Set(Object.keys(definition.phases));\n const missing = [...declared].filter((name) => !actual.has(name));\n const extra = [...actual].filter((name) => !declared.has(name));\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = [];\n if (missing.length > 0) {\n parts.push(`missing: [${missing.join(\", \")}]`);\n }\n if (extra.length > 0) {\n parts.push(`extra: [${extra.join(\", \")}]`);\n }\n throw new Error(\n `defineGame: phases record does not match contract.phaseNames (${parts.join(\n \"; \",\n )}). Update contract.phaseNames or the phases record so they agree.`,\n );\n }\n if (\n definition.initialPhase !== undefined &&\n !declared.has(definition.initialPhase)\n ) {\n throw new Error(\n `defineGame: initialPhase '${definition.initialPhase}' is not declared in contract.phaseNames.`,\n );\n }\n}\n\nexport function validateDefineGameSimultaneousPhases(definition: {\n phases: Record<string, unknown>;\n}): void {\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n kind?: unknown;\n submit?: { inputs?: Record<string, InputCollector> };\n resolve?: unknown;\n interactions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord || phaseRecord.kind !== \"simultaneousPlayer\") {\n continue;\n }\n if (!phaseRecord.submit) {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare submit.`,\n );\n }\n if (typeof phaseRecord.resolve !== \"function\") {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare resolve.`,\n );\n }\n if (phaseRecord.interactions?.submit) {\n throw new Error(\n `defineGame: phases.${phaseName}.interactions.submit conflicts with the reserved simultaneous submit interaction id.`,\n );\n }\n validateInteractionInputsSchema(\n phaseRecord.submit.inputs,\n \"defineInteraction\",\n );\n validateManyCommitPolicy({\n inputs: phaseRecord.submit.inputs,\n commit: (phaseRecord.submit as { commit?: { mode: string } }).commit,\n context: `defineGame: phases.${phaseName}.submit`,\n });\n }\n}\n\nexport type ManifestIdSchemasOf<\n Ids extends Record<string, SchemaLike<unknown>>,\n> = {\n readonly [Key in keyof Ids]: Ids[Key] extends SchemaLike<infer Output>\n ? Ids[Key] & import(\"../model\").ManifestIdSchema<Output>\n : Ids[Key];\n};\n","import { validateInteractionInputsSchema } from \"./validation\";\nimport type {\n CollectorState,\n InputCollector,\n ParamsOf,\n PlayerIdOfState,\n TableQueriesOfState,\n} from \"../model\";\n\ntype StepCollector = Exclude<InputCollector, { readonly kind: \"rng\" }>;\n\nexport type StepFactoryArgs<\n State extends CollectorState,\n Collectors extends Record<string, InputCollector>,\n> = {\n readonly state: State;\n readonly playerId: PlayerIdOfState<State>;\n readonly q: TableQueriesOfState<State>;\n readonly selected: Readonly<ParamsOf<Collectors>>;\n};\n\nexport type InputStep<State extends CollectorState> = {\n readonly key: string;\n readonly resolve: {\n invoke(\n args: StepFactoryArgs<State, Record<string, InputCollector>>,\n ): InputCollector;\n }[\"invoke\"];\n};\n\nexport type StepDefinition<Collectors extends Record<string, InputCollector>> =\n {\n readonly collectors: Collectors;\n readonly entries: readonly InputStep<CollectorState>[];\n };\n\n/** Ordered authoring definition. Only the committed values are persisted. */\nexport class InteractionSteps<\n State extends CollectorState,\n Collectors extends Record<string, InputCollector> = Record<never, never>,\n> {\n declare readonly collectors: Collectors;\n\n constructor(readonly entries: readonly InputStep<State>[] = []) {}\n\n input<const Key extends string, Collector extends StepCollector>(\n key: Key extends keyof Collectors ? never : Key,\n collector:\n | Collector\n | ((args: StepFactoryArgs<State, Collectors>) => Collector),\n ): InteractionSteps<State, Collectors & Record<Key, Collector>> {\n if (this.entries.some((entry) => entry.key === key)) {\n throw new Error(`Duplicate interaction step '${key}'.`);\n }\n const factory =\n typeof collector === \"function\"\n ? (collector as InputStep<State>[\"resolve\"])\n : () => collector;\n const resolve: InputStep<State>[\"resolve\"] = (args) => {\n const resolved = factory(args);\n if (resolved.kind === \"rng\")\n throw new Error(\"Interaction steps cannot contain RNG collectors.\");\n validateInteractionInputsSchema({ [key]: resolved }, \"defineInteraction\");\n return resolved;\n };\n if (\n typeof collector !== \"function\" &&\n (collector as InputCollector).kind === \"rng\"\n ) {\n throw new Error(\"Interaction steps cannot contain RNG collectors.\");\n }\n if (typeof collector !== \"function\")\n validateInteractionInputsSchema(\n { [key]: collector },\n \"defineInteraction\",\n );\n return new InteractionSteps([...this.entries, { key, resolve }]);\n }\n}\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"../model/table\";\nimport type { ManifestIdSchema } from \"../model/manifest\";\nimport type {\n BoundedNumberDomainDescriptor,\n ChoiceDomainDescriptor,\n ChoiceListDomainDescriptor,\n CollectorState,\n InputCollector,\n ResourceMapDomainDescriptor,\n} from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\n\ntype DomainContext<State extends CollectorState> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n};\n\ntype ManifestFormInputSchema =\n | ManifestIdSchema<unknown>\n | z.ZodOptional<ManifestIdSchema<unknown>>\n | z.ZodNullable<ManifestIdSchema<unknown>>;\n\ntype DomainNumber<State extends CollectorState> =\n | number\n | ((context: DomainContext<State>) => number);\n\ntype ResourceMapInputOptions<State extends CollectorState> = {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n};\n\ntype ChoiceValue = string | null;\n\ntype FormInputDomainDescriptor =\n | ResourceMapDomainDescriptor\n | BoundedNumberDomainDescriptor\n | ChoiceDomainDescriptor\n | ChoiceListDomainDescriptor;\n\ntype DomainChoice<Value extends ChoiceValue> = {\n value: Value;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype DomainChoicePresentation = {\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype ResourceMapChoiceDecorator<State extends CollectorState> = (\n context: DomainContext<State> & {\n resourceId: string;\n label: string;\n icon?: string;\n },\n) => DomainChoicePresentation | null | undefined;\n\ntype ResourceMapChoiceSource<State extends CollectorState> =\n | \"resourceMap\"\n | {\n source: \"resourceMap\";\n decorate?: ResourceMapChoiceDecorator<State>;\n };\n\ntype DomainChoices<Value extends ChoiceValue, State extends CollectorState> =\n | ReadonlyArray<DomainChoice<Value>>\n | ResourceMapChoiceSource<State>\n | ((context: DomainContext<State>) => ReadonlyArray<DomainChoice<Value>>);\n\ntype ChoiceListDefaultValue<\n Value extends string,\n State extends CollectorState,\n> =\n | Value[]\n | \"all\"\n | ((\n context: DomainContext<State> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n ) => Value[]);\n\ntype ChoiceDefaultValue<\n Value extends ChoiceValue,\n State extends CollectorState,\n> =\n | Value\n | ((\n context: DomainContext<State> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n ) => Value);\n\ntype ChoiceDefaultResolver<\n Value extends ChoiceValue,\n State extends CollectorState,\n> = (\n context: DomainContext<State> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n) => Value | undefined;\n\nfunction isResourceMapChoiceSource<State extends CollectorState>(\n choices: DomainChoices<ChoiceValue, State>,\n): choices is ResourceMapChoiceSource<State> {\n return (\n choices === \"resourceMap\" ||\n (typeof choices === \"object\" &&\n choices !== null &&\n !Array.isArray(choices) &&\n \"source\" in choices &&\n choices.source === \"resourceMap\")\n );\n}\n\nfunction resolveDomainNumber<State extends CollectorState>(\n value: DomainNumber<State> | undefined,\n context: DomainContext<State>,\n fallback: number,\n): number {\n if (typeof value === \"function\") return value(context);\n return value ?? fallback;\n}\n\nfunction resolveDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n>(\n choices: DomainChoices<Value, State>,\n context: DomainContext<State>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n if (isResourceMapChoiceSource(choices)) {\n return resolveResourceMapChoices(choices, context);\n }\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction choiceValuesInclude(\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n value: ChoiceValue,\n): boolean {\n return choices.some((choice) => Object.is(choice.value, value));\n}\n\nfunction assertChoiceDefaultInChoices(\n inputName: string,\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n defaultValue: ChoiceValue,\n): void {\n if (choiceValuesInclude(choices, defaultValue)) return;\n const printable = defaultValue === null ? \"null\" : `'${defaultValue}'`;\n throw new Error(\n `${inputName} defaultValue ${printable} must be one of its choices. ` +\n \"If null is a valid value, add an explicit { value: null, label: ... } choice.\",\n );\n}\n\nfunction choiceSchema<Value extends ChoiceValue>(\n choices: ReadonlyArray<DomainChoice<Value>>,\n): SchemaLike<Value> {\n if (choices.length === 0) return z.never() as SchemaLike<Value>;\n const values = choices.map((choice) => choice.value);\n const stringValues = values.filter(\n (value): value is Exclude<Value, null> => value !== null,\n );\n const hasNull = values.some((value) => value === null);\n\n if (stringValues.length === 0) {\n return z.null() as unknown as SchemaLike<Value>;\n }\n\n const stringSchema = z.enum(\n stringValues as [Exclude<Value, null>, ...Array<Exclude<Value, null>>],\n );\n\n if (hasNull) {\n return z.union([stringSchema, z.null()]) as unknown as SchemaLike<Value>;\n }\n\n return stringSchema as unknown as SchemaLike<Value>;\n}\n\nfunction resolveResourceMapChoices<State extends CollectorState>(\n choices: ResourceMapChoiceSource<State>,\n context: DomainContext<State>,\n): Array<{\n value: string;\n label: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const firstPlayerId = context.state.table.playerOrder[0];\n const firstResourceMap =\n firstPlayerId === undefined\n ? undefined\n : context.state.table.resources[firstPlayerId];\n if (\n typeof firstResourceMap !== \"object\" ||\n firstResourceMap === null ||\n Array.isArray(firstResourceMap)\n ) {\n return [];\n }\n const decorate = choices === \"resourceMap\" ? undefined : choices.decorate;\n return Object.keys(firstResourceMap)\n .sort()\n .map((resourceId) => {\n const label = resourceId;\n const presentation = decorate?.({ ...context, resourceId, label });\n return {\n value: resourceId,\n label,\n badge: presentation?.badge,\n description: presentation?.description,\n disabled: presentation?.disabled,\n disabledReason: presentation?.disabledReason,\n };\n });\n}\n\nfunction createFormInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return {\n kind: \"form\",\n schema,\n ...(options && \"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n };\n}\n\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(schema: Schema): InputCollector<Schema, State, \"form\">;\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n};\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return createFormInput(schema, options);\n}\n\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State>,\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State> & {\n defaultValue: Record<string, number>;\n },\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n};\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State> & {\n defaultValue?: Record<string, number>;\n },\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.record(z.string(), z.number().int().nonnegative()),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n };\n return {\n type: \"resourceMap\",\n resources: options.resources.map((resource) => ({\n resourceId: resource.resourceId,\n label: resource.label,\n icon: resource.icon,\n min: resolveDomainNumber(resource.min, context, 0),\n max: resolveDomainNumber(resource.max, context, 0),\n })),\n };\n },\n };\n}\n\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n}): InputCollector<z.ZodNumber, State, \"form\">;\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> & {\n readonly defaultValue: number;\n};\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue?: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.number(),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n };\n return {\n type: \"boundedNumber\",\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, 0),\n step:\n options.step === undefined\n ? undefined\n : resolveDomainNumber(options.step, context, 1),\n };\n },\n };\n}\n\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> {\n const staticChoices = Array.isArray(options.choices) ? options.choices : null;\n const hasStaticDefault = typeof options.defaultValue !== \"function\";\n const staticDefault = options.defaultValue as ChoiceValue;\n if (staticChoices && hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n staticChoices,\n staticDefault,\n );\n }\n const schema = staticChoices\n ? (choiceSchema(staticChoices) as SchemaLike<Value>)\n : (z.string().nullable() as unknown as SchemaLike<Value>);\n const dynamicDefault =\n typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema,\n ...(hasStaticDefault ? { defaultValue: staticDefault as Value } : {}),\n domain: (state, playerId, q): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n };\n const choices = resolveDomainChoices(options.choices, context);\n if (hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n choices,\n staticDefault,\n );\n }\n return {\n type: \"choice\",\n choices,\n };\n },\n ...(dynamicDefault\n ? {\n resolveDefaultValue: (state, playerId, q, domain) => {\n const choices =\n domain.type === \"choice\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n const resolved = dynamicDefault({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n\n choices,\n });\n if (resolved === undefined) return undefined;\n assertChoiceDefaultInChoices(\"formInput.choice\", choices, resolved);\n return resolved;\n },\n }\n : {}),\n };\n}\n\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n};\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\">;\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> {\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choiceList requires at least one choice.\");\n }\n const staticDefaultValue = Array.isArray(options.defaultValue)\n ? options.defaultValue\n : undefined;\n const dynamicDefaultValue =\n options.defaultValue === \"all\" || typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema: z.array(z.string()) as unknown as SchemaLike<Value[]>,\n ...(staticDefaultValue !== undefined\n ? { defaultValue: staticDefaultValue }\n : {}),\n domain: (state, playerId, q): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n };\n const choices = resolveDomainChoices(options.choices, context).map(\n (choice) => ({\n ...choice,\n value: choice.value as string,\n }),\n );\n return {\n type: \"choiceList\",\n choices,\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, choices.length),\n };\n },\n ...(dynamicDefaultValue\n ? {\n resolveDefaultValue: (state, playerId, q, domain) => {\n const choices =\n domain.type === \"choiceList\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n if (dynamicDefaultValue === \"all\") {\n return choices.map((choice) => choice.value);\n }\n return dynamicDefaultValue({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n\n choices,\n });\n },\n }\n : {}),\n };\n}\n\ntype FormInputForState<State extends CollectorState> = {\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n ): InputCollector<Schema, State, \"form\">;\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n ): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n };\n resourceMap(\n options: ResourceMapInputOptions<State>,\n ): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\n resourceMap(\n options: ResourceMapInputOptions<State> & {\n defaultValue: Record<string, number>;\n },\n ): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n };\n resourceChoices(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State>;\n number(\n options: Parameters<typeof numberInput<State>>[0],\n ): ReturnType<typeof numberInput<State>>;\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n }): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n };\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n }): InputCollector<SchemaLike<Value>, State, \"form\">;\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n }): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n };\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n }): InputCollector<SchemaLike<Value[]>, State, \"form\">;\n};\n\nfunction formInputForState<\n State extends CollectorState,\n>(): FormInputForState<State> {\n return Object.assign(\n ((\n schema: ManifestFormInputSchema & SchemaLike<unknown>,\n options?: object,\n ) => baseFormInput(schema, options as never)) as FormInputForState<State>,\n {\n resourceMap: (\n options: ResourceMapInputOptions<State> & {\n defaultValue?: Record<string, number>;\n },\n ) => resourceMapInput<State>(options),\n resourceChoices: (options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }) => formInput.resourceChoices<State>(options),\n number: (options: Parameters<typeof numberInput<State>>[0]) =>\n numberInput<State>(options),\n choice: (options: never) => choiceInput(options),\n choiceList: (options: never) => choiceListInput(options),\n },\n );\n}\n\n/**\n * Manifest-backed id input. Free-form Zod schemas are intentionally explicit:\n * if the runtime cannot disclose valid values or numeric bounds through a\n * manifest id or domain helper, use a custom interaction surface with an\n * explicit `paramsSchema` instead of the default form renderer.\n */\nexport const formInput = Object.assign(baseFormInput, {\n resourceMap: resourceMapInput,\n resourceChoices: <State extends CollectorState = CollectorState>(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State> => ({\n source: \"resourceMap\",\n ...options,\n }),\n number: numberInput,\n choice: choiceInput,\n choiceList: choiceListInput,\n forState: formInputForState,\n});\n","import { z } from \"zod\";\nimport type {\n BoardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n TargetKind,\n} from \"../model/spec\";\nimport {\n markManifestScopedSchema,\n type ManifestIdSchema,\n} from \"../model/manifest\";\nimport type { BoardTargetRule, PlayerBoardSpaceTarget } from \"./boardTarget\";\n\nexport type PlayerSpaceInputSchema<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string,\n> = z.ZodObject<{\n boardId: z.ZodLiteral<BoardId>;\n playerId: ManifestIdSchema<PlayerId, \"playerId\">;\n spaceId: z.ZodType<SpaceId>;\n}>;\n\n/**\n * `boardInput.*` helpers produce collectors that accept a board-element id\n * (vertex / edge / space / tile) scoped to one built `boardTarget` rule.\n *\n * Id typing:\n * The `Id` type parameter is the branded id for the board you target,\n * e.g. `HexVertexIdOfTable<Table, \"main\">` or\n * `SquareSpaceIdOfTable<Table, \"board\">`. Once tightened,\n * `ParamsOf<Collectors>` downstream typing reflects the branded id too.\n *\n * Eligibility:\n * Pass a built `boardTarget.*(...).where(...).build()` rule. The same rule\n * feeds server-authoritative eligible-target projection, submit validation,\n * and tests through its `bind({ state, playerId, q })` helper.\n *\n * Runtime vs. compile time:\n * At runtime the submitted value is a string. Branding is purely a\n * compile-time discipline.\n */\nfunction makeBoardCollector<\n Kind extends \"board-vertex\" | \"board-edge\" | \"board-tile\" | \"board-space\",\n>(kind: Kind) {\n return function collector<\n State extends CollectorState = CollectorState,\n Id extends string = string,\n >(options: {\n target: BoardTargetRule<State, Id>;\n }): InputCollector<z.ZodType<Id>, State, Kind> {\n const target = options.target;\n return {\n kind,\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n ) => ReturnType<BoardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n domain: (state: CollectorState, playerId: string, q: unknown) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })\n .map(String),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n } as unknown as InputCollector<z.ZodType<Id>, State, Kind>;\n };\n}\n\nexport const vertexInput = makeBoardCollector(\"board-vertex\");\nexport const edgeInput = makeBoardCollector(\"board-edge\");\nexport const tileInput = makeBoardCollector(\"board-tile\");\nexport const spaceInput = makeBoardCollector(\"board-space\");\n\nexport function playerSpaceInput<\n State extends CollectorState = CollectorState,\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = string,\n>(options: {\n target: BoardTargetRule<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n}): InputCollector<\n PlayerSpaceInputSchema<BoardId, SpaceId, PlayerId>,\n State,\n \"board-space\"\n> {\n const target = options.target;\n const playerIdSchema = markManifestScopedSchema(\n z.string(),\n \"playerId\",\n ) as unknown as ManifestIdSchema<PlayerId, \"playerId\">;\n return {\n kind: \"board-space\",\n schema: z.object({\n boardId: z.literal(target.boardId),\n playerId: playerIdSchema,\n spaceId: z.string() as unknown as z.ZodType<SpaceId>,\n }) as PlayerSpaceInputSchema<BoardId, SpaceId, PlayerId>,\n eligibleTargets: ((state, playerId, q) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetValue) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n },\n targetValue as PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n ) => ReturnType<\n BoardTargetRule<\n CollectorState,\n PlayerBoardSpaceTarget<string, string, string>\n >[\"validate\"]\n >)\n | undefined,\n domain: (state: CollectorState, playerId: string, q: unknown) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })\n .map((candidate) => candidate.spaceId),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n };\n}\n\nexport const boardInput = {\n vertex: vertexInput,\n edge: edgeInput,\n tile: tileInput,\n space: spaceInput,\n playerSpace: playerSpaceInput,\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { ValidationIssue } from \"../model/spec/runtime-args\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\n\nexport type TargetContext<State extends CollectorState> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n};\n\nexport type TargetPredicateArgs<\n State extends CollectorState,\n Target,\n> = TargetContext<State> & {\n targetId: Target;\n target: Target;\n};\n\nexport type TargetPredicate<State extends CollectorState, Target> = {\n id: string;\n errorCode: string;\n message?: string;\n test: (args: TargetPredicateArgs<State, Target>) => boolean;\n};\n\nexport type BoundTargetRule<Target> = {\n readonly eligible: () => readonly Target[];\n readonly validate: (target: Target) => ValidationIssue | null;\n readonly isEligible: (target: Target) => boolean;\n};\n\nexport type TargetRule<State extends CollectorState, Target> = {\n readonly eligible: (ctx: TargetContext<State>) => readonly Target[];\n readonly validate: (\n ctx: TargetContext<State>,\n target: Target,\n ) => ValidationIssue | null;\n readonly isEligible: (ctx: TargetContext<State>, target: Target) => boolean;\n readonly bind: (ctx: TargetContext<State>) => BoundTargetRule<Target>;\n};\n\nexport type TargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n> = {\n readonly where: (\n predicate: TargetPredicate<State, Target>,\n ) => TargetRuleBuilder<State, Target, Rule>;\n readonly build: () => Rule;\n};\n\nexport type TargetCandidateResolver<State extends CollectorState, Target> = (\n ctx: TargetContext<State>,\n) => readonly Target[];\n\nexport type TargetRuleOptions = {\n missingCandidateIssue?: ValidationIssue;\n equals?: (left: unknown, right: unknown) => boolean;\n};\n\nconst DEFAULT_MISSING_CANDIDATE_ISSUE: ValidationIssue = {\n errorCode: \"TARGET_NOT_ELIGIBLE\",\n message: \"Target is not eligible.\",\n};\n\nexport function createTargetRule<State extends CollectorState, Target>(\n candidates: TargetCandidateResolver<State, Target>,\n predicates: readonly TargetPredicate<State, Target>[],\n options: TargetRuleOptions = {},\n): TargetRule<State, Target> {\n const missingCandidateIssue =\n options.missingCandidateIssue ?? DEFAULT_MISSING_CANDIDATE_ISSUE;\n const equals = options.equals ?? Object.is;\n\n const validate = (\n ctx: TargetContext<State>,\n target: Target,\n ): ValidationIssue | null => {\n if (!candidates(ctx).some((candidate) => equals(candidate, target))) {\n return missingCandidateIssue;\n }\n for (const predicate of predicates) {\n if (!predicate.test({ ...ctx, targetId: target, target })) {\n return {\n errorCode: predicate.errorCode,\n message: predicate.message,\n };\n }\n }\n return null;\n };\n\n const rule: TargetRule<State, Target> = {\n eligible: (ctx) =>\n candidates(ctx).filter((targetId) => validate(ctx, targetId) == null),\n validate,\n isEligible: (ctx, target) => validate(ctx, target) == null,\n bind: (ctx) => ({\n eligible: () => rule.eligible(ctx),\n validate: (id) => rule.validate(ctx, id),\n isEligible: (id) => rule.isEligible(ctx, id),\n }),\n };\n\n return rule;\n}\n\nexport function createTargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n>(\n buildRule: (predicates: readonly TargetPredicate<State, Target>[]) => Rule,\n predicates: readonly TargetPredicate<State, Target>[] = [],\n): TargetRuleBuilder<State, Target, Rule> {\n return {\n where: (predicate) =>\n createTargetRuleBuilder(buildRule, [...predicates, predicate]),\n build: () => buildRule(predicates),\n };\n}\n","import type { CollectorState, TargetKind } from \"../model/spec\";\nimport type {\n PlayerIdOfState,\n BoardIdOfTable,\n TableOfState,\n} from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type BoardTargetPredicate<\n State extends CollectorState,\n Target,\n> = TargetPredicate<State, Target>;\n\nexport type BoardTargetRule<State extends CollectorState, Target> = TargetRule<\n State,\n Target\n> & {\n readonly boardId: string;\n readonly targetKind: TargetKind;\n readonly valueKind: \"board-id\" | \"player-board-space\";\n};\n\nexport type BoardTargetBuilder<\n State extends CollectorState,\n Target,\n> = TargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>;\n\nexport type PlayerBoardSpaceTarget<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string,\n> = {\n readonly boardId: BoardId;\n readonly playerId: PlayerId;\n readonly spaceId: SpaceId;\n};\n\nfunction candidateIdsForKind<State extends CollectorState, Id extends string>(\n q: TableQueriesOfState<State>,\n boardId: string,\n targetKind: TargetKind,\n): readonly Id[] {\n const board = q.board(boardId as BoardIdOfTable<TableOfState<State>>).state;\n if (targetKind === \"edge\")\n return idsFromCollection<Id>(board.layout === \"generic\" ? [] : board.edges);\n if (targetKind === \"vertex\")\n return idsFromCollection<Id>(\n board.layout === \"generic\" ? [] : board.vertices,\n );\n return idsFromCollection<Id>(board.spaces);\n}\n\nfunction idsFromCollection<Id extends string>(\n collection: unknown,\n): readonly Id[] {\n if (!collection) return [];\n const values = Array.isArray(collection)\n ? collection\n : Object.values(collection as Record<string, unknown>);\n return values.flatMap((value) => {\n if (typeof value === \"string\") return [value as Id];\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"id\" in value &&\n typeof (value as { id?: unknown }).id === \"string\"\n ) {\n return [(value as { id: string }).id as Id];\n }\n return [];\n });\n}\n\nfunction createBoardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(targetKind: TargetKind, boardId: string): BoardTargetBuilder<State, Id> {\n return createTargetRuleBuilder<State, Id, BoardTargetRule<State, Id>>(\n (predicates) => ({\n ...createTargetRule(\n ({ q }) => candidateIdsForKind<State, Id>(q, boardId, targetKind),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n },\n ),\n boardId,\n targetKind,\n valueKind: \"board-id\",\n }),\n );\n}\n\nfunction createPlayerSpaceTargetBuilder<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n>(\n boardId: BoardId,\n): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n> {\n type Target = PlayerBoardSpaceTarget<\n BoardId,\n SpaceId,\n PlayerIdOfState<State>\n >;\n return createTargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, q }) => {\n const spacesForPlayer = (playerId: string): readonly SpaceId[] =>\n candidateIdsForKind<State, SpaceId>(\n q,\n `${boardId}:${playerId}`,\n \"space\",\n );\n return state.table.playerOrder.flatMap((playerId) =>\n spacesForPlayer(playerId).map((spaceId) => ({\n boardId,\n playerId: playerId as PlayerIdOfState<State>,\n spaceId,\n })),\n );\n },\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n equals: (left, right) =>\n isPlayerBoardSpaceTarget(left) &&\n isPlayerBoardSpaceTarget(right) &&\n left.boardId === right.boardId &&\n left.playerId === right.playerId &&\n left.spaceId === right.spaceId,\n },\n ),\n boardId,\n targetKind: \"space\",\n valueKind: \"player-board-space\",\n }),\n );\n}\n\nfunction isPlayerBoardSpaceTarget(\n value: unknown,\n): value is PlayerBoardSpaceTarget<string, string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"boardId\" in value &&\n \"playerId\" in value &&\n \"spaceId\" in value\n );\n}\n\nfunction makeBoardTargetFactory(targetKind: TargetKind) {\n return function target<State extends CollectorState, Id extends string>(\n boardId: string,\n ): BoardTargetBuilder<State, Id> {\n return createBoardTargetBuilder<State, Id>(targetKind, boardId);\n };\n}\n\nexport const boardTarget = {\n edge: makeBoardTargetFactory(\"edge\"),\n vertex: makeBoardTargetFactory(\"vertex\"),\n space: makeBoardTargetFactory(\"space\"),\n tile: makeBoardTargetFactory(\"tile\"),\n playerSpace<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n >(\n boardId: BoardId,\n ): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n > {\n return createPlayerSpaceTargetBuilder<State, BoardId, SpaceId>(boardId);\n },\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type CardTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type CardTargetRule<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[] = readonly string[],\n> = TargetRule<State, Id> & {\n readonly zoneIds: ZoneIds;\n readonly zoneId: ZoneIds[number];\n readonly targetKind: \"card\";\n};\n\nexport type CardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[] = readonly string[],\n> = TargetRuleBuilder<State, Id, CardTargetRule<State, Id, ZoneIds>>;\n\nfunction cardIdsForZone<State extends CollectorState, Id extends string>(\n state: State,\n playerId: string,\n q: {\n zone: {\n sharedCards: (zoneId: never) => readonly unknown[];\n playerCards: (playerId: never, zoneId: never) => readonly unknown[];\n };\n },\n zoneId: string,\n): readonly Id[] {\n const table = state.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n if (\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {})\n ) {\n return q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly Id[];\n }\n if (zoneId in (table.decks ?? {}) || zoneId in (table.zones?.shared ?? {})) {\n return q.zone.sharedCards(zoneId as never) as readonly Id[];\n }\n return [];\n}\n\nfunction createCardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[],\n>(zoneIds: ZoneIds): CardTargetBuilder<State, Id, ZoneIds> {\n return createTargetRuleBuilder<State, Id, CardTargetRule<State, Id, ZoneIds>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, playerId, q }) =>\n zoneIds.flatMap((zoneId) =>\n cardIdsForZone<State, Id>(state, playerId, q, zoneId),\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CARD_TARGET_NOT_ELIGIBLE\",\n message: \"Card target is not eligible.\",\n },\n },\n ),\n zoneIds,\n zoneId: zoneIds[0] as ZoneIds[number],\n targetKind: \"card\",\n }),\n );\n}\n\nexport const cardTarget = {\n zones<\n State extends CollectorState,\n Id extends string = CardIdOfState<State>,\n const ZoneIds extends readonly string[] = readonly string[],\n >(zoneIds: ZoneIds): CardTargetBuilder<State, Id, ZoneIds> {\n return createCardTargetBuilder<State, Id, ZoneIds>(zoneIds);\n },\n};\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport type { CardTargetRule } from \"./cardTarget\";\n\n/**\n * `cardInput` produces a collector backed by one built `cardTarget` rule.\n * The submitted value is a manifest-branded card id.\n *\n * The target rule feeds server-authoritative eligible-card projection, submit\n * validation, and tests through its `bind({ state, playerId, q })` helper.\n */\nexport function cardInput<\n State extends CollectorState = CollectorState,\n Id extends string = CardIdOfState<State>,\n const ZoneIds extends readonly string[] = readonly string[],\n>(options: {\n target: CardTargetRule<State, Id, ZoneIds>;\n}): InputCollector<z.ZodType<Id>, State, \"card\"> & {\n readonly meta: {\n readonly zoneId: ZoneIds[number];\n readonly zoneIds: ZoneIds;\n readonly targetKind: \"card\";\n };\n} {\n const target = options.target;\n return {\n kind: \"card\",\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n ) => ReturnType<CardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n domain: (state, playerId, q) => ({\n type: \"cardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind,\n zoneIds: target.zoneIds,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })\n .map(String),\n }),\n meta: {\n zoneId: target.zoneId,\n zoneIds: target.zoneIds,\n targetKind: target.targetKind,\n },\n };\n}\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\n\n/**\n * `rngInput.*` helpers produce collectors whose value is *sampled by the\n * engine on submit* rather than supplied by the client. The schema pins\n * the exact output shape so `ParamsOf<Collectors>` sees precisely typed\n * results.\n *\n * Determinism:\n * Sampling happens inside `submitInteraction` only, never inside\n * reducer validation. This lets clients check a submission without\n * burning RNG state.\n */\n\ntype DieRoll = z.ZodObject<{ values: z.ZodArray<z.ZodNumber> }>;\ntype CoinFlip = z.ZodObject<{\n value: z.ZodEnum<{ heads: \"heads\"; tails: \"tails\" }>;\n}>;\n\n// The literal `kind: \"rng\"` is intentionally preserved in the return type\n// so `ClientParamsOf<Collectors>` can structurally detect engine-sampled\n// collectors and omit them from client-facing submit params.\ntype RngCollector<\n Schema extends DieRoll | CoinFlip,\n State extends CollectorState,\n> = InputCollector<Schema, State, \"rng\">;\n\n/**\n * Roll `count` d6s. The submitted value is `{ values: number[] }` with\n * `values.length === count` and each face `1..6`.\n */\nexport function d6<State extends CollectorState = CollectorState>(\n count: number = 1,\n): RngCollector<DieRoll, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n values: z.array(z.number().int().min(1).max(6)).length(count),\n }),\n meta: { rng: \"d6\", count },\n };\n}\n\n/** Flip a coin. The submitted value is `{ value: \"heads\" | \"tails\" }`. */\nexport function coin<\n State extends CollectorState = CollectorState,\n>(): RngCollector<CoinFlip, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n value: z.enum([\"heads\", \"tails\"]),\n }),\n meta: { rng: \"coin\" },\n };\n}\n\nexport const rngInput = { d6, coin };\n","import { z } from \"zod\";\nimport type {\n CollectorState,\n InputCollector,\n InputSelectionDescriptor,\n} from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type ManyOptions =\n | {\n count: number;\n distinct?: boolean;\n }\n | {\n min?: number;\n max?: number;\n distinct?: boolean;\n };\n\ntype NonRngCollector = InputCollector<SchemaLike<unknown>, CollectorState> & {\n readonly kind: Exclude<InputCollector[\"kind\"], \"rng\">;\n};\n\ntype CollectorSchema<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<infer Schema, CollectorState>,\n]\n ? Schema\n : never;\n\ntype CollectorStateOf<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<SchemaLike<unknown>, infer State>,\n]\n ? State\n : never;\n\ntype CollectorKindOf<Collector extends NonRngCollector> = [Collector] extends [\n {\n readonly kind: infer Kind extends Exclude<InputCollector[\"kind\"], \"rng\">;\n },\n]\n ? Kind\n : never;\n\nexport type ManyInputCollector<\n Schema extends SchemaLike<unknown> = SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n Kind extends Exclude<InputCollector[\"kind\"], \"rng\"> = Exclude<\n InputCollector[\"kind\"],\n \"rng\"\n >,\n> = InputCollector<z.ZodArray<Schema>, State, Kind> & {\n readonly selection: Extract<InputSelectionDescriptor, { mode: \"many\" }>;\n};\n\nfunction normalizeManyOptions(\n options: ManyOptions,\n): Extract<InputSelectionDescriptor, { mode: \"many\" }> {\n if (\"count\" in options) {\n assertNonNegativeInteger(options.count, \"many(...).count\");\n return {\n mode: \"many\",\n min: options.count,\n max: options.count,\n distinct: options.distinct,\n };\n }\n const min = options.min ?? 0;\n assertNonNegativeInteger(min, \"many(...).min\");\n if (options.max !== undefined) {\n assertNonNegativeInteger(options.max, \"many(...).max\");\n if (options.max < min) {\n throw new Error(\"many(...).max must be greater than or equal to min.\");\n }\n }\n return {\n mode: \"many\",\n min,\n max: options.max,\n distinct: options.distinct,\n };\n}\n\nfunction assertNonNegativeInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative integer.`);\n }\n}\n\nexport function many<Collector extends NonRngCollector>(\n collector: Collector,\n options: ManyOptions,\n): ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n> &\n Pick<Collector, \"meta\"> {\n if ((collector as InputCollector).kind === \"rng\") {\n throw new Error(\"many(...) cannot wrap rngInput collectors.\");\n }\n const selection = normalizeManyOptions(options);\n const rest = { ...collector } as Omit<\n Collector,\n \"schema\" | \"selection\" | \"defaultValue\"\n > & {\n schema?: unknown;\n selection?: unknown;\n defaultValue?: unknown;\n };\n delete rest.schema;\n delete rest.selection;\n delete rest.defaultValue;\n return {\n ...rest,\n schema: z.array(\n collector.schema as CollectorSchema<Collector>,\n ) as z.ZodArray<CollectorSchema<Collector>>,\n selection,\n } as unknown as ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n > &\n Pick<Collector, \"meta\">;\n}\n","import type {\n InputCollector,\n InteractionRule,\n InteractionSpec,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractErrorCode,\n ContractManifest,\n ContractState,\n InferPhaseState,\n PhaseStateInput,\n} from \"./types\";\nimport { validateInteractionLikeDefinition } from \"./validation\";\n\nexport function defineInteraction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <Collectors extends Record<string, InputCollector>>(\n definition: InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineInteraction\",\n );\n return definition;\n };\n}\n\nexport function defineInteractionRule<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n >(\n definition: InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n > => definition;\n}\n","import { z } from \"zod\";\nimport type {\n AnyInteractionSpec,\n InputCollector,\n PhaseDefinition,\n OptionsOfContract,\n SchemaLike,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nexport function definePhase<Contract extends AnyReducerGameContract>() {\n return <\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Interactions extends Record<\n string,\n AnyInteractionSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >\n > = Record<string, never>,\n const Kind extends \"player\" | \"simultaneousPlayer\" | \"auto\" =\n | \"player\"\n | \"simultaneousPlayer\"\n | \"auto\",\n >(\n definition: PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Interactions,\n OptionsOfContract<Contract>\n > & { kind: Kind },\n ): PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Interactions,\n OptionsOfContract<Contract>\n > & { kind: Kind } => {\n return definition;\n };\n}\n","import type { ViewData } from \"../model/spec/views\";\nimport type { ViewDefinition } from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\n/** Contextual typing for a view defined outside the game assembly module. */\nexport function defineView<Contract extends AnyReducerGameContract>() {\n return <Projection extends ViewData>(\n view: ViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n >,\n ) => view;\n}\n","import type { ViewData } from \"../model/spec/views\";\nimport { InteractionSteps } from \"./steps\";\nimport type { ViewDefinition } from \"../model\";\nimport type { z } from \"zod\";\nimport type {\n CardIdOfManifest,\n InputCollector,\n InteractionMap,\n InteractionRule,\n InteractionSpec,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n PhaseSchemasOfContract,\n OptionsOfContract,\n PlayerIdOfState,\n SchemaLike,\n TableOfManifest,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledSpaceIdOfTable,\n TiledVertexIdOfTable,\n ViewOfContract,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type { PlayerBoardSpaceTarget, PlayerSpaceInputSchema } from \"../inputs\";\nimport type { TargetPredicate } from \"../inputs/targetRule\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport type { ReducerTransaction } from \"../transaction\";\nimport {\n boardInput,\n boardTarget,\n cardInput,\n cardTarget,\n formInput,\n rngInput,\n} from \"../inputs\";\nimport type {\n AnyReducerGameContract,\n ContractErrorCode,\n ContractManifest,\n ContractState,\n} from \"./types\";\nimport { defineGameDefinition } from \"./game\";\nimport { defineInteraction, defineInteractionRule } from \"./interaction\";\nimport { definePhase } from \"./phase\";\nimport { defineView } from \"./views\";\nexport type ContractWithPhases = AnyReducerGameContract & {\n readonly phases: Record<string, SchemaLike<object>>;\n};\n\ntype BoundState<Contract extends ContractWithPhases> = ContractState<Contract>;\n\ntype BoundManifest<Contract extends ContractWithPhases> =\n ContractManifest<Contract>;\n\ntype BoundTable<Contract extends ContractWithPhases> = TableOfManifest<\n BoundManifest<Contract>\n>;\n\ntype BoundPhaseState<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n> = ScopedPhaseState<BoundState<Contract>, z.infer<PhaseStateSchema>>;\n\ntype BoundFormInputs<Contract extends ContractWithPhases> = ReturnType<\n typeof formInput.forState<BoundState<Contract>>\n>;\n\n/** Board element collector options: the board and the predicates that filter it. */\ntype BoundBoardInputOptions<Contract extends ContractWithPhases, Id> = {\n boardId: string;\n where?: BoundWhere<Contract, Id>;\n};\n\ntype BoundBoardInputs<Contract extends ContractWithPhases> = {\n vertex<\n Id extends string = TiledVertexIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(\n options: BoundBoardInputOptions<Contract, Id>,\n ): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-vertex\">;\n edge<\n Id extends string = TiledEdgeIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(\n options: BoundBoardInputOptions<Contract, Id>,\n ): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-edge\">;\n tile<Id extends string = string>(\n options: BoundBoardInputOptions<Contract, Id>,\n ): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-tile\">;\n space<\n Id extends string = TiledSpaceIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(\n options: BoundBoardInputOptions<Contract, Id>,\n ): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-space\">;\n playerSpace<\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = PlayerIdOfState<BoundState<Contract>>,\n >(options: {\n boardId: BoardId;\n where?: BoundWhere<\n Contract,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n }): InputCollector<\n PlayerSpaceInputSchema<BoardId, SpaceId, PlayerId>,\n BoundState<Contract>,\n \"board-space\"\n >;\n};\n\n/**\n * An eligibility predicate whose `errorCode` is checked against the model's\n * declared error codes. The unbound `TargetPredicate` accepts any string.\n */\nexport type BoundTargetPredicate<\n Contract extends ContractWithPhases,\n Target,\n> = Omit<TargetPredicate<BoundState<Contract>, Target>, \"errorCode\"> & {\n errorCode: ContractErrorCode<Contract>;\n};\n\ntype BoundWhere<Contract extends ContractWithPhases, Target> =\n | BoundTargetPredicate<Contract, Target>\n | readonly BoundTargetPredicate<Contract, Target>[];\n\ntype BoundCardCollector<\n Contract extends ContractWithPhases,\n Id extends string,\n ZoneIds extends readonly string[],\n> = InputCollector<z.ZodType<Id>, BoundState<Contract>, \"card\"> & {\n readonly meta: {\n readonly zoneId: ZoneIds[number];\n readonly zoneIds: ZoneIds;\n readonly targetKind: \"card\";\n };\n};\n\n/**\n * Card collector: the zones to draw candidates from and the predicates that\n * filter them. The target rule is built internally.\n */\ntype BoundCardInput<Contract extends ContractWithPhases> = <\n Id extends string = CardIdOfManifest<BoundManifest<Contract>>,\n const ZoneIds extends readonly string[] = readonly string[],\n>(options: {\n from: ZoneIds;\n where?: BoundWhere<Contract, Id>;\n}) => BoundCardCollector<Contract, Id, ZoneIds>;\n\ntype BoundRngInputs<Contract extends ContractWithPhases> = {\n d6(count?: number): ReturnType<typeof rngInput.d6<BoundState<Contract>>>;\n coin(): ReturnType<typeof rngInput.coin<BoundState<Contract>>>;\n};\n\nexport type BoundInputBuilders<Contract extends ContractWithPhases> = {\n readonly board: BoundBoardInputs<Contract>;\n readonly card: BoundCardInput<Contract>;\n readonly form: BoundFormInputs<Contract>;\n readonly rng: BoundRngInputs<Contract>;\n};\n\nexport type PhaseAuthoring<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n> = {\n steps(): InteractionSteps<BoundPhaseState<Contract, PhaseStateSchema>>;\n interaction<Collectors extends Record<string, InputCollector>>(\n spec: Extract<\n InteractionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n { steps: unknown }\n >,\n ): Extract<\n InteractionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n { steps: unknown }\n >;\n interaction<Collectors extends Record<string, InputCollector>>(\n spec: Extract<\n InteractionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n { inputs: unknown }\n >,\n ): Extract<\n InteractionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n { inputs: unknown }\n >;\n rule<\n Collectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n >(\n rule: InteractionRule<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionRule<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >;\n define<\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Interactions extends InteractionMap<\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>\n > = Record<string, never>,\n const Kind extends \"player\" | \"simultaneousPlayer\" | \"auto\" =\n | \"player\"\n | \"simultaneousPlayer\"\n | \"auto\",\n >(\n definition: Omit<\n PhaseDefinition<\n PhaseStateSchema,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Interactions,\n OptionsOfContract<Contract>,\n ContractErrorCode<Contract>\n >,\n \"state\"\n > & { kind: Kind },\n ): PhaseDefinition<\n PhaseStateSchema,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Interactions,\n OptionsOfContract<Contract>,\n ContractErrorCode<Contract>\n > & { kind: Kind };\n readonly inputs: BoundInputBuilders<Contract>;\n /** Compile-time only. Reading any member at runtime throws. */\n readonly types: PhaseTypes<Contract, PhaseStateSchema>;\n};\n\n/**\n * Phantom type carriers for one phase: `typeof playing.types.State` is the\n * phase-scoped game state (`state.phase` narrowed to this phase's schema).\n */\nexport type PhaseTypes<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n> = {\n readonly State: BoundPhaseState<Contract, PhaseStateSchema>;\n readonly PhaseState: z.infer<PhaseStateSchema>;\n readonly Tx: ReducerTransaction<\n BoundPhaseState<Contract, PhaseStateSchema>,\n ContractErrorCode<Contract>\n >;\n};\n\n/**\n * Phantom type carriers for the whole game. These replace the\n * `GameStateOf<GameContractOf<typeof model>>` chain: a module that has the\n * bound game value can write `typeof game.types.State` and stop there.\n */\nexport type ContractTypes<Contract extends ContractWithPhases> = {\n readonly Contract: Contract;\n readonly Options: OptionsOfContract<Contract>;\n readonly State: BoundState<Contract>;\n readonly Manifest: BoundManifest<Contract>;\n readonly ErrorCode: ContractErrorCode<Contract>;\n readonly PlayerId: PlayerIdOfState<BoundState<Contract>>;\n readonly Queries: TableQueriesOfState<BoundState<Contract>>;\n readonly Tx: ReducerTransaction<\n BoundState<Contract>,\n ContractErrorCode<Contract>\n >;\n};\n\n/**\n * Rejects phase keys the model did not declare. `PhaseMapOf<Contract>` already\n * requires every declared phase; this closes the other direction so an extra\n * key fails at `assemble` instead of at runtime.\n */\ntype NoUndeclaredPhases<Contract, Definitions> = {\n [Name in Exclude<\n keyof Definitions,\n PhaseNameOfContract<Contract>\n >]: `Phase '${Name & string}' is not declared in model.phases`;\n};\n\nexport type GameAuthoring<Contract extends ContractWithPhases> = {\n readonly contract: Contract;\n view<Projection extends ViewData>(\n view: ViewDefinition<\n BoundState<Contract>,\n BoundManifest<Contract>,\n Projection\n >,\n ): ViewDefinition<BoundState<Contract>, BoundManifest<Contract>, Projection>;\n /** Compile-time only. Reading any member at runtime throws. */\n readonly types: ContractTypes<Contract>;\n /** Assemble the final game definition from phases and the seat view. */\n assemble<\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n >(\n definition: Omit<\n import(\"../model\").ReducerGameDefinition<Contract, Definitions, View>,\n \"contract\"\n > & {\n phases: NoUndeclaredPhases<Contract, Definitions>;\n },\n ): import(\"../model\").ReducerGameDefinition<Contract, Definitions, View>;\n phase<Name extends PhaseNameOfContract<Contract>>(\n name: Name,\n ): PhaseAuthoring<Contract, PhaseSchemasOfContract<Contract>[Name]>;\n};\n\nconst PHANTOM_TYPES_MESSAGE =\n \"`.types` is a compile-time carrier: use it only in `typeof` positions.\";\n\nfunction phantomTypes<Types>(): Types {\n return new Proxy(Object.freeze({}), {\n get() {\n throw new TypeError(PHANTOM_TYPES_MESSAGE);\n },\n }) as Types;\n}\n\ntype AnyPredicate = TargetPredicate<never, never>;\n\nfunction toPredicateList(\n where: AnyPredicate | readonly AnyPredicate[] | undefined,\n): readonly AnyPredicate[] {\n if (!where) return [];\n return Array.isArray(where) ? where : [where as AnyPredicate];\n}\n\nfunction applyWhere<Builder extends { where: (p: never) => Builder }>(\n builder: Builder,\n where: AnyPredicate | readonly AnyPredicate[] | undefined,\n): Builder {\n return toPredicateList(where).reduce(\n (current, predicate) => current.where(predicate as never),\n builder,\n );\n}\n\nfunction createFusedCardInput<\n Contract extends ContractWithPhases,\n>(): BoundCardInput<Contract> {\n return ((options: {\n from: readonly string[];\n where?: AnyPredicate | readonly AnyPredicate[];\n }) => {\n const target = applyWhere(\n cardTarget.zones<never, string, readonly string[]>(options.from),\n options.where,\n ).build();\n return cardInput({\n target: target as never,\n });\n }) as unknown as BoundCardInput<Contract>;\n}\n\nfunction createFusedBoardInputs<\n Contract extends ContractWithPhases,\n>(): BoundBoardInputs<Contract> {\n const fuse =\n (kind: \"vertex\" | \"edge\" | \"space\" | \"tile\") =>\n (options: {\n boardId: string;\n where?: AnyPredicate | readonly AnyPredicate[];\n }) => {\n const target = applyWhere(\n boardTarget[kind]<never, string>(options.boardId),\n options.where,\n ).build();\n return boardInput[kind]({\n target: target as never,\n });\n };\n const playerSpace = (options: {\n boardId: string;\n where?: AnyPredicate | readonly AnyPredicate[];\n }) =>\n boardInput.playerSpace({\n target: applyWhere(\n boardTarget.playerSpace<never, string, string>(options.boardId),\n options.where,\n ).build() as never,\n });\n return {\n vertex: fuse(\"vertex\"),\n edge: fuse(\"edge\"),\n space: fuse(\"space\"),\n tile: fuse(\"tile\"),\n playerSpace,\n } as unknown as BoundBoardInputs<Contract>;\n}\n\nfunction createBoundInputBuilders<\n Contract extends ContractWithPhases,\n>(): BoundInputBuilders<Contract> {\n return {\n board: createFusedBoardInputs<Contract>(),\n card: createFusedCardInput<Contract>(),\n form: formInput.forState<BoundState<Contract>>(),\n rng: rngInput as BoundRngInputs<Contract>,\n };\n}\n\nfunction createPhaseAuthoring<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n>(\n _contract: Contract,\n schema: PhaseStateSchema,\n): PhaseAuthoring<Contract, PhaseStateSchema> {\n return {\n steps: () => new InteractionSteps(),\n interaction: defineInteraction<\n Contract,\n PhaseStateSchema\n >() as PhaseAuthoring<Contract, PhaseStateSchema>[\"interaction\"],\n rule: (rule) =>\n defineInteractionRule<Contract, PhaseStateSchema>()(\n rule as Parameters<\n ReturnType<typeof defineInteractionRule<Contract, PhaseStateSchema>>\n >[0],\n ) as typeof rule,\n define: (definition) =>\n definePhase<Contract>()({\n ...definition,\n state: schema,\n } as Parameters<ReturnType<typeof definePhase<Contract>>>[0]) as never,\n inputs: createBoundInputBuilders<Contract>(),\n types: phantomTypes<PhaseTypes<Contract, PhaseStateSchema>>(),\n };\n}\n\nexport function createContractAuthoring<\n const Contract extends ContractWithPhases,\n>(contract: Contract): GameAuthoring<Contract> {\n const phaseCache = new Map<string, unknown>();\n const assemble: GameAuthoring<Contract>[\"assemble\"] = (definition) =>\n defineGameDefinition({\n contract,\n ...(definition as Omit<\n import(\"../model\").ReducerGameDefinition<\n Contract,\n PhaseMapOf<Contract>,\n ViewOfContract<Contract>\n >,\n \"contract\"\n >),\n }) as never;\n return {\n contract,\n view: defineView<Contract>(),\n types: phantomTypes<ContractTypes<Contract>>(),\n assemble,\n phase: (name) => {\n const cached = phaseCache.get(name);\n if (cached) return cached as never;\n const schema = contract.phases[name];\n const bound = createPhaseAuthoring(contract, schema);\n phaseCache.set(name, bound);\n return bound as never;\n },\n };\n}\n","import type { RuntimeRecord } from \"../model/table\";\nimport { z } from \"zod\";\nimport { createManifestStringLiteralSchema } from \"../model/manifest\";\nimport type {\n ReducerGameContract,\n ReducerManifestContract,\n RuntimeTableRecord,\n SchemaLike,\n StateDefinition,\n} from \"../model\";\nimport {\n type ManifestIdSchemasOf,\n validateStateSchemaIdBranding,\n} from \"./validation\";\n\n/**\n * Narrows a manifest's `literals.phaseNames` and `ids.phaseName` to the\n * author-supplied phase-name tuple. Lets `defineGameContract` override the\n * codegen-emitted `phaseNames: readonly string[]` / `phaseName: z.string()`\n * placeholders so `PhaseNameOfContract<Contract>` resolves to a literal\n * union and flows through `tx.transition`, `PhaseMapOf`, and the flow\n * state's `currentPhase`.\n */\nexport type NarrowManifestPhaseNames<\n Manifest,\n PhaseNames extends readonly string[],\n> = Manifest & {\n literals: Manifest extends { literals: infer L }\n ? Omit<L, \"phaseNames\"> & { phaseNames: PhaseNames }\n : { phaseNames: PhaseNames };\n ids: Manifest extends { ids: infer I }\n ? Omit<I, \"phaseName\"> & { phaseName: z.ZodType<PhaseNames[number]> }\n : { phaseName: z.ZodType<PhaseNames[number]> };\n};\n\nexport type ReducerGameContractInput<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n Phases extends Record<string, SchemaLike<object>>,\n Errors extends Record<string, string> | undefined = undefined,\n OptionsSchema extends SchemaLike<RuntimeRecord> = SchemaLike<\n Record<string, never>\n >,\n> = {\n manifest: Manifest;\n state: StateDefinition<PublicSchema, PrivateSchema, HiddenSchema>;\n phases: Phases;\n errors?: Errors;\n options?: OptionsSchema;\n};\n\nexport type DefinedGameContract<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n Phases extends Record<string, SchemaLike<object>>,\n Errors extends Record<string, string> | undefined = undefined,\n OptionsSchema extends SchemaLike<RuntimeRecord> = SchemaLike<\n Record<string, never>\n >,\n> = ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors,\n OptionsSchema\n> & {\n readonly phases: Phases;\n readonly errors: Errors;\n readonly phaseNames: readonly (keyof Phases & string)[];\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n};\n\nfunction validateErrorMap(errors: Record<string, string> | undefined): void {\n if (!errors) return;\n const codePattern = /^[A-Z][A-Z0-9_]*$/;\n for (const [code, message] of Object.entries(errors)) {\n if (!codePattern.test(code)) {\n throw new Error(\n `defineGameContract: error code '${code}' must use UPPER_SNAKE_CASE.`,\n );\n }\n if (typeof message !== \"string\" || message.length === 0) {\n throw new Error(\n `defineGameContract: error code '${code}' must declare a non-empty default message.`,\n );\n }\n }\n}\n\n/** Options are persisted and parsed again when a session crosses the ingress boundary. */\nfunction validateOptionsSchema(schema: SchemaLike<RuntimeRecord>): void {\n z.toJSONSchema(schema, {\n override: ({ zodSchema }) => {\n const definition = zodSchema._zod.def;\n if (\n definition.type === \"pipe\" ||\n (\"coerce\" in definition && definition.coerce) ||\n definition.checks?.some((check) => check._zod.def.check === \"overwrite\")\n ) {\n throw new Error(\n \"Game options schemas must not transform or coerce persisted values.\",\n );\n }\n },\n });\n}\n\nexport function defineGameContract<\n Table extends RuntimeTableRecord,\n const Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n const Phases extends Record<string, SchemaLike<object>>,\n const Errors extends Record<string, string> | undefined = undefined,\n OptionsSchema extends SchemaLike<RuntimeRecord> = SchemaLike<\n Record<string, never>\n >,\n>(\n definition: ReducerGameContractInput<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors,\n OptionsSchema\n >,\n): DefinedGameContract<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors,\n OptionsSchema\n> {\n validateStateSchemaIdBranding(definition.state.public, \"public\");\n validateStateSchemaIdBranding(definition.state.private, \"private\");\n validateStateSchemaIdBranding(definition.state.hidden, \"hidden\");\n validateErrorMap(definition.errors);\n const optionsSchema = definition.options ?? z.strictObject({});\n validateOptionsSchema(optionsSchema);\n const phaseNames = Object.keys(definition.phases) as (keyof Phases &\n string)[];\n if (phaseNames.length === 0) {\n throw new Error(\n \"defineGameContract: phases must be a non-empty record of phase schemas.\",\n );\n }\n for (const name of phaseNames) {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new Error(\n \"defineGameContract: phase names must be non-empty strings.\",\n );\n }\n }\n const phaseNameSchema = createManifestStringLiteralSchema(phaseNames);\n const narrowedManifest = {\n ...definition.manifest,\n literals: {\n ...definition.manifest.literals,\n phaseNames,\n },\n ids: {\n ...definition.manifest.ids,\n phaseName: phaseNameSchema,\n },\n } as unknown as NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >;\n const contract = {\n manifest: narrowedManifest,\n state: definition.state,\n phases: definition.phases,\n errors: definition.errors,\n options: optionsSchema,\n phaseNames,\n schemas: narrowedManifest.ids,\n } as DefinedGameContract<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors,\n OptionsSchema\n >;\n return contract;\n}\n","import type { RuntimeRecord } from \"../model/table\";\nimport { compileManifest } from \"../manifest/compiler\";\nimport type {\n AuthoredManifest,\n CompiledManifest,\n ManifestTable,\n} from \"../manifest/types\";\nimport type {\n PhaseMapOf,\n ReducerGameDefinition,\n ReducerManifestContract,\n RuntimeTableRecord,\n SchemaLike,\n ViewOfContract,\n} from \"../model\";\nimport { createContractAuthoring } from \"./contract-authoring\";\nimport {\n defineGameContract,\n type DefinedGameContract,\n type ReducerGameContractInput,\n} from \"./contract\";\nimport type { AnyReducerGameContract } from \"./types\";\nimport {\n validateDefineGamePhaseNames,\n validateDefineGameSimultaneousPhases,\n} from \"./validation\";\n\nexport function defineGameDefinition<\n const Contract extends AnyReducerGameContract,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: { contract: Contract } & Omit<\n ReducerGameDefinition<NoInfer<Contract>, Definitions, View>,\n \"contract\"\n >,\n): ReducerGameDefinition<Contract, Definitions, View> {\n validateDefineGamePhaseNames(definition);\n validateDefineGameSimultaneousPhases(definition);\n return definition;\n}\n\n/**\n * Creates the bound authoring object for a model without assembling the game.\n *\n * The returned value is the type leaf (`typeof game.types.State`), the factory namespace\n * (`game.phase(name)`, `game.view`), and the assembler (`game.assemble`).\n * Phase files import it directly, so no factory wrappers or `*AuthoringOf`\n * parameter types are needed.\n */\nexport function createGame<\n const Manifest extends AuthoredManifest,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n const Phases extends Record<string, SchemaLike<object>>,\n const Errors extends Record<string, string> | undefined = undefined,\n OptionsSchema extends SchemaLike<RuntimeRecord> = SchemaLike<\n Record<string, never>\n >,\n>(model: {\n manifest: Manifest;\n state: { public: PublicSchema; private: PrivateSchema; hidden: HiddenSchema };\n phases: Phases;\n errors?: Errors;\n options?: OptionsSchema;\n}): import(\"./contract-authoring\").GameAuthoring<\n DefinedGameContract<\n ManifestTable<Manifest>,\n CompiledManifest<Manifest>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors,\n OptionsSchema\n >\n>;\n\nexport function createGame<\n Table extends RuntimeTableRecord,\n const Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n const Phases extends Record<string, SchemaLike<object>>,\n const Errors extends Record<string, string> | undefined = undefined,\n OptionsSchema extends SchemaLike<RuntimeRecord> = SchemaLike<\n Record<string, never>\n >,\n>(\n model: ReducerGameContractInput<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors,\n OptionsSchema\n >,\n): import(\"./contract-authoring\").GameAuthoring<\n DefinedGameContract<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors,\n OptionsSchema\n >\n>;\nexport function createGame(\n model:\n | ReducerGameContractInput<\n RuntimeTableRecord,\n ReducerManifestContract<\n RuntimeTableRecord,\n string,\n string,\n string,\n string,\n string\n >,\n SchemaLike<object>,\n SchemaLike<object>,\n SchemaLike<object>,\n Record<string, SchemaLike<object>>,\n Record<string, string> | undefined,\n SchemaLike<RuntimeRecord>\n >\n | {\n manifest: AuthoredManifest;\n state: {\n public: SchemaLike<object>;\n private: SchemaLike<object>;\n hidden: SchemaLike<object>;\n };\n phases: Record<string, SchemaLike<object>>;\n errors?: Record<string, string>;\n options?: SchemaLike<RuntimeRecord>;\n },\n): unknown {\n const manifest =\n \"literals\" in model.manifest\n ? model.manifest\n : compileManifest(model.manifest);\n return createContractAuthoring(defineGameContract({ ...model, manifest }));\n}\n","import type { SystemActionEvent } from \"./model\";\n\nexport const gameEvent = {\n systemAction(event: Omit<SystemActionEvent, \"kind\">): SystemActionEvent {\n return {\n kind: \"systemAction\",\n ...event,\n };\n },\n};\n","/** Cache a pure calculation by immutable object identity. Do not pass a mutable draft. */\nexport function memoize<A extends object, R>(fn: (a: A) => R): (a: A) => R {\n const cache = new WeakMap<A, R>();\n return (a) => {\n if (cache.has(a)) return cache.get(a)!;\n const value = fn(a);\n cache.set(a, value);\n return value;\n };\n}\n","import type {\n HexSpaceId,\n HexEdgeId,\n HexVertexId,\n} from \"../../shared/domain/board-identities.js\";\nimport type {\n BoardEdgeRef,\n BoardVertexRef,\n DieTypeSpec as ApiDieTypeSpec,\n GameTopologyManifest as ApiGameTopologyManifest,\n JsonValue,\n} from \"../../shared/domain/contracts.js\";\n\ntype DieTypeSpec = Omit<ApiDieTypeSpec, \"sides\"> & {\n sides?: ApiDieTypeSpec[\"sides\"];\n};\n\ntype DeepReadonly<T> = T extends (...args: readonly unknown[]) => unknown\n ? T\n : T extends readonly (infer Item)[]\n ? ReadonlyArray<DeepReadonly<Item>>\n : T extends object\n ? { readonly [Key in keyof T]: DeepReadonly<T[Key]> }\n : T;\n\ntype GameTopologyManifest = DeepReadonly<\n Omit<ApiGameTopologyManifest, \"dieTypes\"> & {\n dieTypes?: readonly DieTypeSpec[];\n }\n>;\n\ntype ArrayItem<T> = T extends readonly (infer Item)[] ? Item : never;\ntype EntryId<T> = T extends { id: infer Id extends string } ? Id : never;\ntype IdsOf<T> = EntryId<ArrayItem<NonNullable<T>>>;\ntype RuntimeRecord = Record<string, JsonValue>;\n\ntype CardSetId<Manifest extends GameTopologyManifest> = IdsOf<\n Manifest[\"cardSets\"]\n>;\ntype ZoneId<Manifest extends GameTopologyManifest> = IdsOf<Manifest[\"zones\"]>;\ntype BoardId<Manifest extends GameTopologyManifest> = IdsOf<Manifest[\"boards\"]>;\ntype PerPlayerZoneId<Manifest extends GameTopologyManifest> = EntryId<\n Extract<ArrayItem<NonNullable<Manifest[\"zones\"]>>, { scope: \"perPlayer\" }>\n>;\ntype SharedZoneId<Manifest extends GameTopologyManifest> = Exclude<\n ZoneId<Manifest>,\n PerPlayerZoneId<Manifest>\n>;\ntype PerPlayerBoardId<Manifest extends GameTopologyManifest> = EntryId<\n Extract<ArrayItem<NonNullable<Manifest[\"boards\"]>>, { scope: \"perPlayer\" }>\n>;\ntype SharedBoardId<Manifest extends GameTopologyManifest> = Exclude<\n BoardId<Manifest>,\n PerPlayerBoardId<Manifest>\n>;\ntype ResourceId<Manifest extends GameTopologyManifest> = IdsOf<\n Manifest[\"resources\"]\n>;\ntype PieceTypeId<Manifest extends GameTopologyManifest> = IdsOf<\n Manifest[\"pieceTypes\"]\n>;\ntype DieTypeId<Manifest extends GameTopologyManifest> = IdsOf<\n Manifest[\"dieTypes\"]\n>;\ntype PieceSeedOf<Manifest extends GameTopologyManifest> = ArrayItem<\n NonNullable<Manifest[\"pieceSeeds\"]>\n>;\ntype DieSeedOf<Manifest extends GameTopologyManifest> = ArrayItem<\n NonNullable<Manifest[\"dieSeeds\"]>\n>;\ntype ManualCardSetOf<Manifest extends GameTopologyManifest> = Extract<\n ArrayItem<NonNullable<Manifest[\"cardSets\"]>>,\n { type: \"manual\" }\n>;\ntype CardOf<Manifest extends GameTopologyManifest> =\n ManualCardSetOf<Manifest> extends infer CardSet\n ? CardSet extends { cards: infer Cards extends readonly unknown[] }\n ? ArrayItem<Cards>\n : never\n : never;\n\ntype BoardOf<\n Manifest extends GameTopologyManifest,\n CurrentBoardId extends BoardId<Manifest>,\n> = Extract<ArrayItem<NonNullable<Manifest[\"boards\"]>>, { id: CurrentBoardId }>;\ntype SpaceIdOf<BoardLike> = BoardLike extends { layout: \"hex\" }\n ? HexSpaceId<BoardLike>\n : IdsOf<BoardLike extends { spaces?: infer Spaces } ? Spaces : never>;\ntype ContainerIdOf<BoardLike> = IdsOf<\n BoardLike extends { containers?: infer Containers } ? Containers : never\n>;\ntype SpaceOf<BoardLike> = ArrayItem<\n NonNullable<BoardLike extends { spaces?: infer Spaces } ? Spaces : never>\n>;\ntype SquareSpaceOf<BoardLike> = Extract<\n SpaceOf<BoardLike>,\n { row: number; col: number }\n>;\ntype SpaceIdForBoard<\n Manifest extends GameTopologyManifest,\n CurrentBoardId extends BoardId<Manifest>,\n> = SpaceIdOf<BoardOf<Manifest, CurrentBoardId>>;\ntype ContainerIdForBoard<\n Manifest extends GameTopologyManifest,\n CurrentBoardId extends BoardId<Manifest>,\n> = ContainerIdOf<BoardOf<Manifest, CurrentBoardId>>;\n\ntype RuntimeIdsFromCount<BaseId extends string, Count> = Count extends number\n ? number extends Count\n ? BaseId | `${BaseId}-${number}`\n : Count extends 1\n ? BaseId\n : `${BaseId}-${OneTo<Count>}`\n : BaseId;\n\ntype CardRuntimeId<Card> = Card extends { type: infer TypeId extends string }\n ? RuntimeIdsFromCount<\n TypeId,\n Card extends { count: infer Count extends number } ? Count : never\n >\n : never;\ntype SeedRuntimeId<Seed> = Seed extends { typeId: infer TypeId extends string }\n ? RuntimeIdsFromCount<\n Seed extends { id: infer Id extends string } ? Id : TypeId,\n Seed extends { count: infer Count extends number } ? Count : never\n >\n : never;\ntype CardId<Manifest extends GameTopologyManifest> = CardRuntimeId<\n CardOf<Manifest>\n>;\ntype PieceId<Manifest extends GameTopologyManifest> = SeedRuntimeId<\n PieceSeedOf<Manifest>\n>;\ntype DieId<Manifest extends GameTopologyManifest> = SeedRuntimeId<\n DieSeedOf<Manifest>\n>;\n\ntype PieceTypeOf<\n Manifest extends GameTopologyManifest,\n CurrentTypeId extends PieceTypeId<Manifest>,\n> = Extract<\n ArrayItem<NonNullable<Manifest[\"pieceTypes\"]>>,\n { id: CurrentTypeId }\n>;\ntype DieTypeOf<\n Manifest extends GameTopologyManifest,\n CurrentTypeId extends DieTypeId<Manifest>,\n> = Extract<\n ArrayItem<NonNullable<Manifest[\"dieTypes\"]>>,\n { id: CurrentTypeId }\n>;\ntype SlotIdOf<TypeSpec> = IdsOf<\n TypeSpec extends { slots?: infer Slots } ? Slots : never\n>;\ntype SlotIdForPieceType<\n Manifest extends GameTopologyManifest,\n CurrentTypeId extends PieceTypeId<Manifest>,\n> = SlotIdOf<PieceTypeOf<Manifest, CurrentTypeId>>;\ntype SlotIdForDieType<\n Manifest extends GameTopologyManifest,\n CurrentTypeId extends DieTypeId<Manifest>,\n> = SlotIdOf<DieTypeOf<Manifest, CurrentTypeId>>;\n\ntype SingletonExplicitSeed<Seed> = Seed extends { id: string }\n ? Seed extends { count: infer Count extends number }\n ? Count extends 1\n ? Seed\n : never\n : Seed\n : never;\ntype TypedPieceSlotHostSeed<Manifest extends GameTopologyManifest> =\n SingletonExplicitSeed<PieceSeedOf<Manifest>> extends infer Seed\n ? Seed extends { typeId: infer CurrentTypeId extends PieceTypeId<Manifest> }\n ? [SlotIdForPieceType<Manifest, CurrentTypeId>] extends [never]\n ? never\n : Seed\n : never\n : never;\ntype TypedDieSlotHostSeed<Manifest extends GameTopologyManifest> =\n SingletonExplicitSeed<DieSeedOf<Manifest>> extends infer Seed\n ? Seed extends { typeId: infer CurrentTypeId extends DieTypeId<Manifest> }\n ? [SlotIdForDieType<Manifest, CurrentTypeId>] extends [never]\n ? never\n : Seed\n : never\n : never;\n\ntype TypedPieceSlotHomeSpec<Manifest extends GameTopologyManifest> =\n TypedPieceSlotHostSeed<Manifest> extends infer Seed\n ? Seed extends {\n id: infer HostId extends string;\n typeId: infer CurrentTypeId extends PieceTypeId<Manifest>;\n }\n ? {\n type: \"slot\";\n host: {\n kind: \"piece\";\n id: HostId;\n };\n slotId: SlotIdForPieceType<Manifest, CurrentTypeId>;\n }\n : never\n : never;\ntype TypedDieSlotHomeSpec<Manifest extends GameTopologyManifest> =\n TypedDieSlotHostSeed<Manifest> extends infer Seed\n ? Seed extends {\n id: infer HostId extends string;\n typeId: infer CurrentTypeId extends DieTypeId<Manifest>;\n }\n ? {\n type: \"slot\";\n host: {\n kind: \"die\";\n id: HostId;\n };\n slotId: SlotIdForDieType<Manifest, CurrentTypeId>;\n }\n : never\n : never;\n\ntype RequiredSchemaKeys<Properties extends Readonly<Record<string, unknown>>> =\n {\n [Key in keyof Properties]: Properties[Key] extends { optional: true }\n ? never\n : Properties[Key] extends { default: unknown }\n ? never\n : Key;\n }[keyof Properties];\ntype OptionalSchemaKeys<Properties extends Readonly<Record<string, unknown>>> =\n {\n [Key in keyof Properties]: Properties[Key] extends { optional: true }\n ? Key\n : Properties[Key] extends { default: unknown }\n ? Key\n : never;\n }[keyof Properties];\n\ntype SchemaValueFromObjectProperties<\n Properties extends Readonly<Record<string, unknown>>,\n Manifest extends GameTopologyManifest,\n BoardLike = never,\n> = keyof Properties extends never\n ? RuntimeRecord\n : {\n [Key in RequiredSchemaKeys<Properties>]: SchemaValueForProperty<\n Properties[Key],\n Manifest,\n BoardLike\n >;\n } & {\n [Key in OptionalSchemaKeys<Properties>]?: SchemaValueForProperty<\n Properties[Key],\n Manifest,\n BoardLike\n >;\n };\n\ntype SchemaValueForObjectSchema<\n Schema,\n Manifest extends GameTopologyManifest,\n BoardLike = never,\n> = Schema extends {\n properties: infer Properties extends Readonly<Record<string, unknown>>;\n}\n ? SchemaValueFromObjectProperties<Properties, Manifest, BoardLike>\n : RuntimeRecord;\n\ntype MergeSharedProperties<Variant, Shared> = Variant extends {\n properties: infer VariantProperties extends Readonly<Record<string, unknown>>;\n}\n ? {\n properties: Shared extends Readonly<Record<string, unknown>>\n ? Omit<Shared, keyof VariantProperties> & VariantProperties\n : VariantProperties;\n }\n : Variant;\n\ntype BaseSchemaValueForProperty<\n Schema,\n Manifest extends GameTopologyManifest,\n BoardLike = never,\n> = Schema extends { type: \"string\" }\n ? string\n : Schema extends { type: \"integer\" | \"number\" }\n ? number\n : Schema extends { type: \"boolean\" }\n ? boolean\n : Schema extends { type: \"zoneId\" }\n ? ZoneId<Manifest>\n : Schema extends { type: \"cardId\" }\n ? CardId<Manifest>\n : Schema extends { type: \"playerId\" }\n ? PlayerId<Manifest>\n : Schema extends { type: \"boardId\" }\n ? BoardId<Manifest>\n : Schema extends { type: \"spaceId\" }\n ? [BoardLike] extends [never]\n ? string\n : SpaceIdOf<BoardLike>\n : Schema extends { type: \"edgeId\" }\n ? [BoardLike] extends [never]\n ? string\n : DerivedEdgeIdOf<BoardLike>\n : Schema extends { type: \"vertexId\" }\n ? [BoardLike] extends [never]\n ? string\n : DerivedVertexIdOf<BoardLike>\n : Schema extends { type: \"pieceId\" }\n ? PieceId<Manifest>\n : Schema extends { type: \"dieId\" }\n ? DieId<Manifest>\n : Schema extends { type: \"resourceId\" }\n ? ResourceId<Manifest>\n : Schema extends { type: \"enum\" }\n ? Schema extends {\n enums: infer Values extends readonly string[];\n }\n ? Values[number]\n : string\n : Schema extends { type: \"array\" }\n ? ReadonlyArray<\n SchemaValueForProperty<\n Schema extends {\n items?: infer Items;\n }\n ? Items\n : undefined,\n Manifest,\n BoardLike\n >\n >\n : Schema extends { type: \"object\" }\n ? SchemaValueForObjectSchema<\n Schema extends {\n properties?: infer Properties extends\n Record<string, unknown>;\n }\n ? {\n properties: Properties;\n }\n : undefined,\n Manifest,\n BoardLike\n >\n : Schema extends { type: \"record\" }\n ? Record<\n string,\n SchemaValueForProperty<\n Schema extends {\n values?: infer Values;\n }\n ? Values\n : undefined,\n Manifest,\n BoardLike\n >\n >\n : RuntimeRecord;\n\ntype SchemaValueForProperty<\n Schema,\n Manifest extends GameTopologyManifest,\n BoardLike = never,\n> = Schema extends { nullable: true }\n ? BaseSchemaValueForProperty<Schema, Manifest, BoardLike> | null\n : BaseSchemaValueForProperty<Schema, Manifest, BoardLike>;\n\ntype BuildTuple<\n Length extends number,\n Accumulator extends unknown[] = [],\n> = Accumulator[\"length\"] extends Length\n ? Accumulator\n : BuildTuple<Length, [...Accumulator, unknown]>;\n\ntype EnumerateInternal<\n Length extends number,\n Accumulator extends number[] = [],\n> = Accumulator[\"length\"] extends Length\n ? Accumulator[number]\n : EnumerateInternal<Length, [...Accumulator, Accumulator[\"length\"]]>;\n\ntype AddOne<Count extends number> = [...BuildTuple<Count>, unknown][\"length\"] &\n number;\ntype OneTo<Count extends number> = Exclude<EnumerateInternal<AddOne<Count>>, 0>;\ntype PlayerId<Manifest extends GameTopologyManifest> =\n Manifest[\"players\"][\"maxPlayers\"] extends infer MaxPlayers extends number\n ? `player-${OneTo<MaxPlayers>}`\n : `player-${number}`;\n\ntype ToNumber<Input extends string> =\n Input extends `${infer Value extends number}` ? Value : never;\ntype AbsoluteNumber<Count extends number> =\n `${Count}` extends `-${infer Value extends number}` ? Value : Count;\ntype IsNegative<Count extends number> = `${Count}` extends `-${string}`\n ? true\n : false;\ntype Negate<Count extends number> = Count extends 0\n ? 0\n : ToNumber<`${`${Count}` extends `-${infer Value extends number}`\n ? Value\n : `-${Count}`}`>;\ntype AddPositive<Left extends number, Right extends number> = number extends\n | Left\n | Right\n ? number\n : [...BuildTuple<Left>, ...BuildTuple<Right>][\"length\"] & number;\ntype ComparePositive<\n Left extends number,\n Right extends number,\n> = Left extends Right\n ? \"equal\"\n : number extends Left | Right\n ? \"unknown\"\n : BuildTuple<Left> extends [...BuildTuple<Right>, ...infer Rest]\n ? Rest extends []\n ? \"equal\"\n : \"greater\"\n : \"less\";\ntype SubtractPositive<\n Left extends number,\n Right extends number,\n> = number extends Left | Right\n ? number\n : BuildTuple<Left> extends [...BuildTuple<Right>, ...infer Rest]\n ? Rest[\"length\"] & number\n : never;\ntype AddSigned<Left extends number, Right extends number> = number extends\n | Left\n | Right\n ? number\n : IsNegative<Left> extends IsNegative<Right>\n ? IsNegative<Left> extends true\n ? Negate<AddPositive<AbsoluteNumber<Left>, AbsoluteNumber<Right>>>\n : AddPositive<AbsoluteNumber<Left>, AbsoluteNumber<Right>>\n : ComparePositive<\n AbsoluteNumber<Left>,\n AbsoluteNumber<Right>\n > extends \"equal\"\n ? 0\n : ComparePositive<\n AbsoluteNumber<Left>,\n AbsoluteNumber<Right>\n > extends \"greater\"\n ? IsNegative<Left> extends true\n ? Negate<\n SubtractPositive<AbsoluteNumber<Left>, AbsoluteNumber<Right>>\n >\n : SubtractPositive<AbsoluteNumber<Left>, AbsoluteNumber<Right>>\n : IsNegative<Right> extends true\n ? Negate<\n SubtractPositive<AbsoluteNumber<Right>, AbsoluteNumber<Left>>\n >\n : SubtractPositive<AbsoluteNumber<Right>, AbsoluteNumber<Left>>;\ntype SquareCornerGeometryKey<\n Space extends { row: number; col: number },\n Corner extends \"nw\" | \"ne\" | \"se\" | \"sw\",\n> = Corner extends \"nw\"\n ? `${Space[\"col\"]},${Space[\"row\"]}`\n : Corner extends \"ne\"\n ? `${AddSigned<Space[\"col\"], 1>},${Space[\"row\"]}`\n : Corner extends \"se\"\n ? `${AddSigned<Space[\"col\"], 1>},${AddSigned<Space[\"row\"], 1>}`\n : `${Space[\"col\"]},${AddSigned<Space[\"row\"], 1>}`;\ntype SquareEdgeGeometryKey<\n Space extends { row: number; col: number },\n Side extends \"north\" | \"east\" | \"south\" | \"west\",\n> = Side extends \"north\"\n ? `${Space[\"col\"]},${Space[\"row\"]}::${AddSigned<Space[\"col\"], 1>},${Space[\"row\"]}`\n : Side extends \"east\"\n ? `${AddSigned<Space[\"col\"], 1>},${Space[\"row\"]}::${AddSigned<\n Space[\"col\"],\n 1\n >},${AddSigned<Space[\"row\"], 1>}`\n : Side extends \"south\"\n ? `${Space[\"col\"]},${AddSigned<Space[\"row\"], 1>}::${AddSigned<\n Space[\"col\"],\n 1\n >},${AddSigned<Space[\"row\"], 1>}`\n : `${Space[\"col\"]},${Space[\"row\"]}::${Space[\"col\"]},${AddSigned<\n Space[\"row\"],\n 1\n >}`;\ntype DerivedSquareEdgeIdOf<BoardLike> =\n SquareSpaceOf<BoardLike> extends infer Space\n ? Space extends { row: number; col: number }\n ?\n | `square-edge:${SquareEdgeGeometryKey<Space, \"north\">}`\n | `square-edge:${SquareEdgeGeometryKey<Space, \"east\">}`\n | `square-edge:${SquareEdgeGeometryKey<Space, \"south\">}`\n | `square-edge:${SquareEdgeGeometryKey<Space, \"west\">}`\n : never\n : never;\ntype DerivedSquareVertexIdOf<BoardLike> =\n SquareSpaceOf<BoardLike> extends infer Space\n ? Space extends { row: number; col: number }\n ?\n | `square-vertex:${SquareCornerGeometryKey<Space, \"nw\">}`\n | `square-vertex:${SquareCornerGeometryKey<Space, \"ne\">}`\n | `square-vertex:${SquareCornerGeometryKey<Space, \"se\">}`\n | `square-vertex:${SquareCornerGeometryKey<Space, \"sw\">}`\n : never\n : never;\ntype DerivedHexEdgeIdOf<BoardLike> = BoardLike extends {\n id: infer Id extends string;\n}\n ? HexEdgeId<Id>\n : never;\ntype DerivedHexVertexIdOf<BoardLike> = BoardLike extends {\n id: infer Id extends string;\n}\n ? HexVertexId<Id>\n : never;\ntype DerivedEdgeIdOf<BoardLike> = BoardLike extends { layout: \"square\" }\n ? DerivedSquareEdgeIdOf<BoardLike>\n : BoardLike extends { layout: \"hex\" }\n ? DerivedHexEdgeIdOf<BoardLike>\n : never;\ntype DerivedVertexIdOf<BoardLike> = BoardLike extends { layout: \"square\" }\n ? DerivedSquareVertexIdOf<BoardLike>\n : BoardLike extends { layout: \"hex\" }\n ? DerivedHexVertexIdOf<BoardLike>\n : never;\n\ntype TypedSharedSpaceHomeSpec<Manifest extends GameTopologyManifest> = {\n [CurrentBoardId in SharedBoardId<Manifest>]: {\n type: \"space\";\n boardId: CurrentBoardId;\n spaceId: SpaceIdForBoard<Manifest, CurrentBoardId>;\n };\n}[SharedBoardId<Manifest>];\n\ntype TypedPerPlayerSpaceHomeSpec<Manifest extends GameTopologyManifest> = {\n [CurrentBoardId in PerPlayerBoardId<Manifest>]: {\n type: \"space\";\n boardId: CurrentBoardId;\n spaceId: SpaceIdForBoard<Manifest, CurrentBoardId>;\n };\n}[PerPlayerBoardId<Manifest>];\n\ntype TypedSharedContainerHomeSpec<Manifest extends GameTopologyManifest> = {\n [CurrentBoardId in SharedBoardId<Manifest>]: {\n type: \"container\";\n boardId: CurrentBoardId;\n containerId: ContainerIdForBoard<Manifest, CurrentBoardId>;\n };\n}[SharedBoardId<Manifest>];\n\ntype TypedPerPlayerContainerHomeSpec<Manifest extends GameTopologyManifest> = {\n [CurrentBoardId in PerPlayerBoardId<Manifest>]: {\n type: \"container\";\n boardId: CurrentBoardId;\n containerId: ContainerIdForBoard<Manifest, CurrentBoardId>;\n };\n}[PerPlayerBoardId<Manifest>];\n\ntype TypedSharedEdgeHomeSpec<Manifest extends GameTopologyManifest> = {\n [CurrentBoardId in SharedBoardId<Manifest>]: {\n type: \"edge\";\n boardId: CurrentBoardId;\n ref: BoardEdgeRef;\n };\n}[SharedBoardId<Manifest>];\n\ntype TypedPerPlayerEdgeHomeSpec<Manifest extends GameTopologyManifest> = {\n [CurrentBoardId in PerPlayerBoardId<Manifest>]: {\n type: \"edge\";\n boardId: CurrentBoardId;\n ref: BoardEdgeRef;\n };\n}[PerPlayerBoardId<Manifest>];\n\ntype TypedSharedVertexHomeSpec<Manifest extends GameTopologyManifest> = {\n [CurrentBoardId in SharedBoardId<Manifest>]: {\n type: \"vertex\";\n boardId: CurrentBoardId;\n ref: BoardVertexRef;\n };\n}[SharedBoardId<Manifest>];\n\ntype TypedPerPlayerVertexHomeSpec<Manifest extends GameTopologyManifest> = {\n [CurrentBoardId in PerPlayerBoardId<Manifest>]: {\n type: \"vertex\";\n boardId: CurrentBoardId;\n ref: BoardVertexRef;\n };\n}[PerPlayerBoardId<Manifest>];\n\ntype TypedSharedZoneHomeSpec<Manifest extends GameTopologyManifest> = {\n type: \"zone\";\n zoneId: SharedZoneId<Manifest>;\n};\n\ntype TypedPerPlayerZoneHomeSpec<Manifest extends GameTopologyManifest> = {\n type: \"zone\";\n zoneId: PerPlayerZoneId<Manifest>;\n};\n\ntype TypedPlayerScopedComponentHomeSpec<Manifest extends GameTopologyManifest> =\n | TypedPerPlayerZoneHomeSpec<Manifest>\n | TypedPerPlayerSpaceHomeSpec<Manifest>\n | TypedPerPlayerContainerHomeSpec<Manifest>\n | TypedPerPlayerEdgeHomeSpec<Manifest>\n | TypedPerPlayerVertexHomeSpec<Manifest>;\n\ntype TypedSharedComponentHomeSpec<Manifest extends GameTopologyManifest> =\n | { type: \"detached\" }\n | TypedSharedZoneHomeSpec<Manifest>\n | TypedSharedSpaceHomeSpec<Manifest>\n | TypedSharedContainerHomeSpec<Manifest>\n | TypedSharedEdgeHomeSpec<Manifest>\n | TypedSharedVertexHomeSpec<Manifest>\n | TypedPieceSlotHomeSpec<Manifest>\n | TypedDieSlotHomeSpec<Manifest>;\n\ntype TypedComponentHomeSpec<Manifest extends GameTopologyManifest> =\n | TypedSharedComponentHomeSpec<Manifest>\n | TypedPlayerScopedComponentHomeSpec<Manifest>;\n\ntype TypedSeedLocationSpec<\n Seed,\n Manifest extends GameTopologyManifest,\n> = Seed extends { home: infer Home }\n ? Home extends TypedPlayerScopedComponentHomeSpec<Manifest>\n ? Omit<Seed, \"ownerId\" | \"home\"> & {\n ownerId: PlayerId<Manifest>;\n home: TypedPlayerScopedComponentHomeSpec<Manifest>;\n }\n : Omit<Seed, \"ownerId\" | \"home\"> & {\n ownerId?: PlayerId<Manifest>;\n home?: TypedComponentHomeSpec<Manifest>;\n }\n : Omit<Seed, \"ownerId\" | \"home\"> & {\n ownerId?: PlayerId<Manifest>;\n home?: TypedComponentHomeSpec<Manifest>;\n };\n\ntype TypedVisibilitySpec<Manifest extends GameTopologyManifest> = {\n faceUp?: boolean;\n visibleTo?: readonly PlayerId<Manifest>[];\n};\ntype TypedVisibility<T, Manifest extends GameTopologyManifest> = T extends {\n visibility?: unknown;\n}\n ? Omit<T, \"visibility\"> & {\n visibility?: TypedVisibilitySpec<Manifest>;\n }\n : T;\ntype TypedFields<\n T,\n Schema,\n Manifest extends GameTopologyManifest,\n BoardLike = never,\n> = T extends { fields?: unknown }\n ? Omit<T, \"fields\"> & {\n fields?: SchemaValueForObjectSchema<Schema, Manifest, BoardLike>;\n }\n : T;\ntype TypedBoardContainerHost<Host, BoardLike> = Host extends {\n type: \"space\";\n spaceId: string;\n}\n ? Omit<Host, \"spaceId\"> & {\n spaceId: SpaceIdOf<BoardLike>;\n }\n : Host;\ntype TypedBoardContainer<\n Container,\n Manifest extends GameTopologyManifest,\n BoardLike,\n ContainerSchema,\n> = Container extends { host: infer Host }\n ? Omit<\n TypedFields<\n TypedAllowedCardSetIds<Container, Manifest>,\n ContainerSchema,\n Manifest,\n BoardLike\n >,\n \"host\"\n > & {\n host: TypedBoardContainerHost<Host, BoardLike>;\n }\n : TypedFields<\n TypedAllowedCardSetIds<Container, Manifest>,\n ContainerSchema,\n Manifest,\n BoardLike\n >;\ntype TypedBoardRelation<\n Relation,\n Manifest extends GameTopologyManifest,\n BoardLike,\n RelationSchema,\n> = Relation extends object\n ? Omit<\n TypedFields<Relation, RelationSchema, Manifest, BoardLike>,\n \"fromSpaceId\" | \"toSpaceId\"\n > & {\n fromSpaceId: SpaceIdOf<BoardLike>;\n toSpaceId: SpaceIdOf<BoardLike>;\n }\n : Relation;\ntype TypedOptionalArray<\n Base,\n Source,\n Key extends string,\n Item,\n> = Source extends { [Property in Key]?: readonly unknown[] }\n ? Base & {\n [Property in Key]?: ReadonlyArray<Item>;\n }\n : Base;\ntype SchemaForEntry<Entry, Key extends string> = Key extends keyof Entry\n ? Entry[Key]\n : undefined;\ntype TypedGenericBoardLike<\n Entry,\n Manifest extends GameTopologyManifest,\n BoardLike,\n> = TypedOptionalArray<\n TypedOptionalArray<\n TypedOptionalArray<\n TypedFields<\n Omit<Entry, \"spaces\" | \"relations\" | \"containers\">,\n SchemaForEntry<Entry, \"boardFieldsSchema\">,\n Manifest,\n BoardLike\n >,\n Entry,\n \"spaces\",\n TypedFields<\n ArrayItem<\n NonNullable<Entry extends { spaces?: infer Spaces } ? Spaces : never>\n >,\n SchemaForEntry<Entry, \"spaceFieldsSchema\">,\n Manifest,\n BoardLike\n >\n >,\n Entry,\n \"relations\",\n TypedBoardRelation<\n ArrayItem<\n NonNullable<\n Entry extends { relations?: infer Relations } ? Relations : never\n >\n >,\n Manifest,\n BoardLike,\n SchemaForEntry<Entry, \"relationFieldsSchema\">\n >\n >,\n Entry,\n \"containers\",\n TypedBoardContainer<\n ArrayItem<\n NonNullable<\n Entry extends { containers?: infer Containers } ? Containers : never\n >\n >,\n Manifest,\n BoardLike,\n SchemaForEntry<Entry, \"containerFieldsSchema\">\n >\n>;\ntype TypedHexBoardLike<\n Entry,\n Manifest extends GameTopologyManifest,\n BoardLike,\n> = TypedOptionalArray<\n TypedOptionalArray<\n TypedFields<\n Omit<Entry, \"spaces\" | \"edges\" | \"vertices\">,\n SchemaForEntry<Entry, \"boardFieldsSchema\">,\n Manifest,\n BoardLike\n > &\n (Entry extends { spaces: infer Spaces }\n ? {\n spaces: {\n [Key in keyof Spaces]: TypedFields<\n Spaces[Key],\n SchemaForEntry<Entry, \"spaceFieldsSchema\">,\n Manifest,\n BoardLike\n >;\n };\n }\n : unknown),\n Entry,\n \"edges\",\n TypedFields<\n ArrayItem<\n NonNullable<Entry extends { edges?: infer Edges } ? Edges : never>\n >,\n SchemaForEntry<Entry, \"edgeFieldsSchema\">,\n Manifest,\n BoardLike\n >\n >,\n Entry,\n \"vertices\",\n TypedFields<\n ArrayItem<\n NonNullable<\n Entry extends { vertices?: infer Vertices } ? Vertices : never\n >\n >,\n SchemaForEntry<Entry, \"vertexFieldsSchema\">,\n Manifest,\n BoardLike\n >\n>;\ntype TypedSquareBoardLike<\n Entry,\n Manifest extends GameTopologyManifest,\n BoardLike,\n> = TypedOptionalArray<\n TypedOptionalArray<\n TypedOptionalArray<\n TypedOptionalArray<\n TypedOptionalArray<\n TypedFields<\n Omit<\n Entry,\n \"spaces\" | \"relations\" | \"containers\" | \"edges\" | \"vertices\"\n >,\n SchemaForEntry<Entry, \"boardFieldsSchema\">,\n Manifest,\n BoardLike\n >,\n Entry,\n \"spaces\",\n TypedFields<\n ArrayItem<\n NonNullable<\n Entry extends { spaces?: infer Spaces } ? Spaces : never\n >\n >,\n SchemaForEntry<Entry, \"spaceFieldsSchema\">,\n Manifest,\n BoardLike\n >\n >,\n Entry,\n \"relations\",\n TypedBoardRelation<\n ArrayItem<\n NonNullable<\n Entry extends { relations?: infer Relations } ? Relations : never\n >\n >,\n Manifest,\n BoardLike,\n SchemaForEntry<Entry, \"relationFieldsSchema\">\n >\n >,\n Entry,\n \"containers\",\n TypedBoardContainer<\n ArrayItem<\n NonNullable<\n Entry extends { containers?: infer Containers } ? Containers : never\n >\n >,\n Manifest,\n BoardLike,\n SchemaForEntry<Entry, \"containerFieldsSchema\">\n >\n >,\n Entry,\n \"edges\",\n TypedFields<\n ArrayItem<\n NonNullable<Entry extends { edges?: infer Edges } ? Edges : never>\n >,\n SchemaForEntry<Entry, \"edgeFieldsSchema\">,\n Manifest,\n BoardLike\n >\n >,\n Entry,\n \"vertices\",\n TypedFields<\n ArrayItem<\n NonNullable<\n Entry extends { vertices?: infer Vertices } ? Vertices : never\n >\n >,\n SchemaForEntry<Entry, \"vertexFieldsSchema\">,\n Manifest,\n BoardLike\n >\n>;\ntype TypedBoardLikeEntry<\n Entry,\n Manifest extends GameTopologyManifest,\n> = Entry extends { layout: \"generic\" }\n ? TypedGenericBoardLike<Entry, Manifest, Entry>\n : Entry extends { layout: \"hex\" }\n ? TypedHexBoardLike<Entry, Manifest, Entry>\n : Entry extends { layout: \"square\" }\n ? TypedSquareBoardLike<Entry, Manifest, Entry>\n : Entry;\n\ntype AuthoredCardType<Card> = Card extends {\n cardType: infer Category extends string;\n}\n ? Category\n : Card extends { type: infer Type extends string }\n ? Type\n : never;\ntype TypedCard<\n Card,\n Manifest extends GameTopologyManifest,\n CardSchema,\n> = Card extends { type: string }\n ? Omit<TypedVisibility<Card, Manifest>, \"home\" | \"properties\"> & {\n home?: TypedComponentHomeSpec<Manifest>;\n properties: CardSchema extends {\n variants: infer Variants extends Record<string, unknown>;\n shared?: infer Shared;\n }\n ? AuthoredCardType<Card> extends keyof Variants\n ? SchemaValueForObjectSchema<\n MergeSharedProperties<Variants[AuthoredCardType<Card>], Shared>,\n Manifest\n >\n : never\n : SchemaValueForObjectSchema<CardSchema, Manifest>;\n }\n : Card;\n\ntype TypedCardSet<\n CardSet,\n Manifest extends GameTopologyManifest,\n> = CardSet extends {\n type: \"manual\";\n cardSchema: infer CardSchema;\n cards: infer Cards extends readonly unknown[];\n}\n ? Omit<CardSet, \"cards\" | \"defaultHome\"> & {\n defaultHome: TypedComponentHomeSpec<Manifest>;\n cards: ReadonlyArray<TypedCard<ArrayItem<Cards>, Manifest, CardSchema>>;\n }\n : CardSet;\n\ntype TypedAllowedCardSetIds<\n T,\n Manifest extends GameTopologyManifest,\n> = T extends object\n ? Omit<T, \"allowedCardSetIds\"> & {\n allowedCardSetIds?: readonly CardSetId<Manifest>[];\n }\n : T;\n\ntype TypedZone<\n Zone,\n Manifest extends GameTopologyManifest,\n> = TypedAllowedCardSetIds<Zone, Manifest>;\n\ntype TypedPieceSeed<\n Seed,\n Manifest extends GameTopologyManifest,\n> = Seed extends { typeId: infer CurrentTypeId }\n ? CurrentTypeId extends PieceTypeId<Manifest>\n ? Omit<\n TypedSeedLocationSpec<TypedVisibility<Seed, Manifest>, Manifest>,\n \"typeId\" | \"ownerId\" | \"home\" | \"fields\"\n > & {\n typeId: CurrentTypeId;\n fields?: SchemaValueForObjectSchema<\n PieceTypeOf<Manifest, CurrentTypeId> extends {\n fieldsSchema?: infer FieldsSchema;\n }\n ? FieldsSchema\n : undefined,\n Manifest\n >;\n } & Pick<\n TypedSeedLocationSpec<TypedVisibility<Seed, Manifest>, Manifest>,\n \"ownerId\" | \"home\"\n >\n : Omit<Seed, \"typeId\"> & {\n typeId: PieceTypeId<Manifest>;\n }\n : never;\n\ntype TypedDieSeed<Seed, Manifest extends GameTopologyManifest> = Seed extends {\n typeId: infer CurrentTypeId;\n}\n ? CurrentTypeId extends DieTypeId<Manifest>\n ? Omit<\n TypedSeedLocationSpec<TypedVisibility<Seed, Manifest>, Manifest>,\n \"typeId\" | \"ownerId\" | \"home\" | \"fields\"\n > & {\n typeId: CurrentTypeId;\n fields?: SchemaValueForObjectSchema<\n DieTypeOf<Manifest, CurrentTypeId> extends {\n fieldsSchema?: infer FieldsSchema;\n }\n ? FieldsSchema\n : undefined,\n Manifest\n >;\n } & Pick<\n TypedSeedLocationSpec<TypedVisibility<Seed, Manifest>, Manifest>,\n \"ownerId\" | \"home\"\n >\n : Omit<Seed, \"typeId\"> & {\n typeId: DieTypeId<Manifest>;\n }\n : never;\n\nexport type TypedTopologyManifest<Manifest extends GameTopologyManifest> = Omit<\n Manifest,\n \"cardSets\" | \"zones\" | \"boards\" | \"pieceSeeds\" | \"dieSeeds\"\n> & {\n cardSets: ReadonlyArray<\n TypedCardSet<ArrayItem<Manifest[\"cardSets\"]>, Manifest>\n >;\n zones?: Manifest[\"zones\"] extends readonly unknown[]\n ? ReadonlyArray<TypedZone<ArrayItem<Manifest[\"zones\"]>, Manifest>>\n : Manifest[\"zones\"];\n boards: Manifest[\"boards\"] extends readonly unknown[]\n ? ReadonlyArray<\n TypedBoardLikeEntry<ArrayItem<Manifest[\"boards\"]>, Manifest>\n >\n : Manifest[\"boards\"];\n pieceSeeds?: Manifest[\"pieceSeeds\"] extends readonly unknown[]\n ? ReadonlyArray<TypedPieceSeed<ArrayItem<Manifest[\"pieceSeeds\"]>, Manifest>>\n : Manifest[\"pieceSeeds\"];\n dieSeeds?: Manifest[\"dieSeeds\"] extends readonly unknown[]\n ? ReadonlyArray<TypedDieSeed<ArrayItem<Manifest[\"dieSeeds\"]>, Manifest>>\n : Manifest[\"dieSeeds\"];\n};\n\ntype TopologyManifestValidation<Manifest> =\n Manifest extends GameTopologyManifest\n ? TypedTopologyManifest<Manifest>\n : GameTopologyManifest;\n\ntype DefinedTopologyManifest<Manifest> = Manifest extends GameTopologyManifest\n ? Manifest\n : GameTopologyManifest;\n\nexport function defineTopologyManifest<const Manifest>(\n manifest: Manifest & TopologyManifestValidation<NoInfer<Manifest>>,\n): DefinedTopologyManifest<Manifest> {\n return manifest as DefinedTopologyManifest<Manifest>;\n}\n"],"mappings":"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","names":["z","dedupeSorted","renderCardInstanceIds","expandSeedIds","isHexBoardSpec","cardSetIds","zoneIds","players","z","id","initial","z","z","z","z","z","z","z","z","z"]}