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

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 (113) hide show
  1. package/README.md +127 -0
  2. package/dist/browser-interaction.d.ts +22 -22
  3. package/dist/{chunk-VRRR6QZT.js → chunk-32PFKDV7.js} +170 -406
  4. package/dist/chunk-32PFKDV7.js.map +1 -0
  5. package/dist/{chunk-N33CGX2F.js → chunk-3BAD4VC2.js} +3 -3
  6. package/dist/{chunk-LMHCGCA6.js → chunk-3SKDNDPG.js} +2 -2
  7. package/dist/chunk-5YV2WHJ4.js +25 -0
  8. package/dist/chunk-5YV2WHJ4.js.map +1 -0
  9. package/dist/{chunk-VWTKGIYF.js → chunk-ANRB4XKA.js} +1 -1
  10. package/dist/chunk-ANRB4XKA.js.map +1 -0
  11. package/dist/{chunk-EOEA3I64.js → chunk-BI4G3PM2.js} +7 -7
  12. package/dist/chunk-BI4G3PM2.js.map +1 -0
  13. package/dist/{chunk-KRJPRYEA.js → chunk-EVCLTY4Q.js} +21 -8
  14. package/dist/chunk-EVCLTY4Q.js.map +1 -0
  15. package/dist/{chunk-DQS2EG5E.js → chunk-GDPKTBUR.js} +2 -2
  16. package/dist/{chunk-FL67RDID.js → chunk-H6VDGFL5.js} +128 -128
  17. package/dist/chunk-H6VDGFL5.js.map +1 -0
  18. package/dist/{chunk-6LMESVGT.js → chunk-LR3ZTWQF.js} +3 -3
  19. package/dist/chunk-LR3ZTWQF.js.map +1 -0
  20. package/dist/{chunk-TXELBVTG.js → chunk-PN5O6GG2.js} +2 -2
  21. package/dist/{chunk-533O7C4L.js → chunk-S2JEDVWH.js} +500 -430
  22. package/dist/chunk-S2JEDVWH.js.map +1 -0
  23. package/dist/{chunk-2GQIALJL.js → chunk-UGH54WZ2.js} +6 -2
  24. package/dist/chunk-UGH54WZ2.js.map +1 -0
  25. package/dist/chunk-VCDWP5VL.js +746 -0
  26. package/dist/chunk-VCDWP5VL.js.map +1 -0
  27. package/dist/{chunk-ZSTCUJKZ.js → chunk-Y75CFE77.js} +2 -6
  28. package/dist/chunk-Y75CFE77.js.map +1 -0
  29. package/dist/chunk-Z7QCREWI.js +3435 -0
  30. package/dist/chunk-Z7QCREWI.js.map +1 -0
  31. package/dist/chunk-ZZGN2ATS.js +1941 -0
  32. package/dist/chunk-ZZGN2ATS.js.map +1 -0
  33. package/dist/{components-CNAt5J1p.d.ts → components-gAbIz7hK.d.ts} +2 -18
  34. package/dist/{definitions-bZSBaPjj.d.ts → definitions-BgmV_GhC.d.ts} +3 -3
  35. package/dist/digest.d.ts +2 -2
  36. package/dist/game-CsZScpcn.d.ts +763 -0
  37. package/dist/{index-CR69MyWr.d.ts → index-CcT9Q7N7.d.ts} +1 -1
  38. package/dist/{index.d-Bw8AOcgp.d.ts → index.d-DjzoK7zn.d.ts} +67 -2
  39. package/dist/index.js +1 -2
  40. package/dist/package-set.js +1 -2
  41. package/dist/plugin-runtime-contract.d.ts +4 -4
  42. package/dist/plugin-runtime-contract.js +13 -15
  43. package/dist/{protocol-CVaSqPgX.d.ts → protocol-dYgafTYY.d.ts} +1 -7
  44. package/dist/reducer/advanced.d.ts +12 -11
  45. package/dist/reducer/advanced.js +10 -4
  46. package/dist/reducer-contract.d.ts +10 -2
  47. package/dist/reducer-contract.js +4 -4
  48. package/dist/reducer.d.ts +12 -689
  49. package/dist/reducer.js +19 -1293
  50. package/dist/reducer.js.map +1 -1
  51. package/dist/runtime/primitives.d.ts +4 -4
  52. package/dist/runtime/primitives.js +5 -5
  53. package/dist/runtime/runtime-api.d.ts +2 -2
  54. package/dist/runtime/workspace-contract.d.ts +50 -17
  55. package/dist/runtime/workspace-contract.js +15 -10
  56. package/dist/{runtime-C7Z2acNU.d.ts → runtime-RJ5orDJU.d.ts} +23 -30
  57. package/dist/{plugin-state-BRH3UiUp.d.ts → runtime-api-Bz5pwNU_.d.ts} +86 -4
  58. package/dist/runtime.d.ts +8 -8
  59. package/dist/runtime.js +19 -17
  60. package/dist/runtime.js.map +1 -1
  61. package/dist/schema.d.ts +2 -28
  62. package/dist/testing-compiler.d.ts +4 -4
  63. package/dist/testing-runtime.d.ts +7 -7
  64. package/dist/testing-runtime.js +6 -6
  65. package/dist/testing.d.ts +17 -17
  66. package/dist/testing.js +14 -14
  67. package/dist/{types-q1Guidm5.d.ts → types-DR7DoB1x.d.ts} +1 -1
  68. package/dist/{types-DN4O7kH_.d.ts → types-JWCYHmu7.d.ts} +2 -2
  69. package/dist/types.js +6 -18
  70. package/dist/types.js.map +1 -1
  71. package/dist/ui/components.d.ts +3 -4
  72. package/dist/ui/components.js +1 -5
  73. package/dist/{ui-contract-BC4JpysE.d.ts → ui-contract-GTUPkf8z.d.ts} +175 -176
  74. package/dist/ui.d.ts +4 -5
  75. package/dist/ui.js +2 -6
  76. package/dist/{views-D2Cfzr3h.d.ts → views-BpuWcOyN.d.ts} +101 -48
  77. package/package.json +3 -22
  78. package/dist/authoring/index.d.ts +0 -59
  79. package/dist/authoring/index.js +0 -24
  80. package/dist/authoring/index.js.map +0 -1
  81. package/dist/authoring-compiler.d.ts +0 -27
  82. package/dist/authoring-compiler.js +0 -11
  83. package/dist/authoring-compiler.js.map +0 -1
  84. package/dist/authoring-materialize-cli.d.ts +0 -1
  85. package/dist/authoring-materialize-cli.js +0 -45
  86. package/dist/authoring-materialize-cli.js.map +0 -1
  87. package/dist/chunk-2GQIALJL.js.map +0 -1
  88. package/dist/chunk-533O7C4L.js.map +0 -1
  89. package/dist/chunk-6LMESVGT.js.map +0 -1
  90. package/dist/chunk-EOEA3I64.js.map +0 -1
  91. package/dist/chunk-FL67RDID.js.map +0 -1
  92. package/dist/chunk-HIH6Y4FA.js +0 -7802
  93. package/dist/chunk-HIH6Y4FA.js.map +0 -1
  94. package/dist/chunk-HUK4234C.js +0 -166
  95. package/dist/chunk-HUK4234C.js.map +0 -1
  96. package/dist/chunk-KGV2EUNN.js +0 -532
  97. package/dist/chunk-KGV2EUNN.js.map +0 -1
  98. package/dist/chunk-KRJPRYEA.js.map +0 -1
  99. package/dist/chunk-KWHOFBDM.js +0 -9
  100. package/dist/chunk-KWHOFBDM.js.map +0 -1
  101. package/dist/chunk-VRRR6QZT.js.map +0 -1
  102. package/dist/chunk-VWTKGIYF.js.map +0 -1
  103. package/dist/chunk-XFMSLL3P.js +0 -637
  104. package/dist/chunk-XFMSLL3P.js.map +0 -1
  105. package/dist/chunk-ZSTCUJKZ.js.map +0 -1
  106. package/dist/codegen.d.ts +0 -941
  107. package/dist/codegen.js +0 -44
  108. package/dist/codegen.js.map +0 -1
  109. package/dist/runtime-api-CgPuEVeF.d.ts +0 -86
  110. /package/dist/{chunk-N33CGX2F.js.map → chunk-3BAD4VC2.js.map} +0 -0
  111. /package/dist/{chunk-LMHCGCA6.js.map → chunk-3SKDNDPG.js.map} +0 -0
  112. /package/dist/{chunk-DQS2EG5E.js.map → chunk-GDPKTBUR.js.map} +0 -0
  113. /package/dist/{chunk-TXELBVTG.js.map → chunk-PN5O6GG2.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../workspace-codegen/src/preset-card-sets.ts","../../workspace-codegen/src/hex-geometry.ts","../../workspace-codegen/src/manifest-validation.ts","../../workspace-codegen/src/manifest-static.ts","../../workspace-codegen/src/manifest-contract.ts","../../workspace-codegen/src/ownership.ts","../../workspace-codegen/src/seeds.ts","../../workspace-codegen/src/index.ts"],"sourcesContent":["import type {\n BoardCard,\n ComponentHomeSpec,\n GameTopologyManifest,\n ManualCardSetDefinition,\n ObjectSchema,\n PresetCardSetDefinition,\n PropertySchema,\n} from \"@dreamboard-games/sdk-types\";\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 { HexSpaceSpec, HexVertexRef } from \"@dreamboard-games/sdk-types\";\n\nconst HEX_CORNERS = [\"ne-e\", \"e-se\", \"se-sw\", \"sw-w\", \"w-nw\", \"nw-ne\"] as const;\ntype HexCorner = (typeof HEX_CORNERS)[number];\n\nconst HEX_CORNER_OFFSETS: Record<HexCorner, readonly [number, number, number]> =\n {\n \"ne-e\": [2, -1, -1],\n \"e-se\": [1, -2, 1],\n \"se-sw\": [-1, -1, 2],\n \"sw-w\": [-2, 1, 1],\n \"w-nw\": [-1, 2, -1],\n \"nw-ne\": [1, 1, -2],\n };\n\nfunction cubeFromAxial(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n): readonly [number, number, number] {\n const x = space.q;\n const z = space.r;\n return [x, -x - z, z] as const;\n}\n\nfunction cornerGeometryKey(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n corner: HexCorner,\n): string {\n const [x, y, z] = cubeFromAxial(space);\n const [dx, dy, dz] = HEX_CORNER_OFFSETS[corner];\n return `${3 * x + dx},${3 * y + dy},${3 * z + dz}`;\n}\n\nexport function resolveHexVertexGeometryKey(\n ref: HexVertexRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((left, right) => left.localeCompare(right))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Hex 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 HEX_CORNERS) {\n const key = cornerGeometryKey(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 `Hex vertex ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared vertex.`,\n );\n }\n const vertexKey = candidates[0];\n if (vertexKey === undefined) {\n throw new Error(\"internal: expected exactly one hex vertex geometry key\");\n }\n return vertexKey;\n}\n","import type {\n HexBoardSpec,\n HexBoardTemplateSpec,\n HexSpaceSpec,\n HexVertexSpec,\n BoardCard,\n BoardSpec,\n BoardTemplateSpec,\n DieSeedSpec,\n DieTypeSpec,\n GameTopologyManifest,\n PieceSeedSpec,\n PieceTypeSpec,\n PropertySchema,\n SetupOptionSpec,\n ZoneSpec,\n} from \"@dreamboard-games/sdk-types\";\nimport { resolveHexVertexGeometryKey } from \"./hex-geometry.js\";\n\nexport type ManifestAuthoringValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isHexBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is Extract<BoardTemplateSpec, { layout: \"hex\" }> {\n return boardTemplate.layout === \"hex\";\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 validateSetupProfileReferences(\n manifest: GameTopologyManifest,\n): string[] {\n const issues: string[] = [];\n const optionChoiceIdsByOptionId = new Map<string, Set<string>>(\n (manifest.setupOptions ?? []).map((option, optionIndex) => {\n const choiceIds = new Set<string>();\n for (const choice of option.choices ?? []) {\n choiceIds.add(choice.id);\n }\n if (!option.id) {\n issues.push(\n `manifest.setupOptions[${optionIndex}].id: Missing option id.`,\n );\n }\n return [option.id, choiceIds];\n }),\n );\n\n for (const [profileIndex, profile] of (\n manifest.setupProfiles ?? []\n ).entries()) {\n const optionValues = profile.optionValues ?? {};\n for (const [optionId, choiceId] of Object.entries(optionValues)) {\n const allowedChoices = optionChoiceIdsByOptionId.get(optionId);\n if (!allowedChoices) {\n issues.push(\n `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}: Unknown setup option '${optionId}'.`,\n );\n continue;\n }\n if (!allowedChoices.has(choiceId)) {\n issues.push(\n `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}: Unknown choice '${choiceId}' for setup option '${optionId}'.`,\n );\n }\n }\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 validateBoardTemplateDuplicates(\n boardTemplates: readonly BoardTemplateSpec[],\n): string[] {\n const issues: string[] = [];\n\n for (const [index, boardTemplate] of boardTemplates.entries()) {\n if (isHexBoardTemplateSpec(boardTemplate)) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boardTemplates[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n continue;\n }\n\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boardTemplates[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.containers ?? []).map(\n (container, containerIndex) => ({\n id: container.id,\n path: `manifest.boardTemplates[${index}].containers[${containerIndex}].id`,\n }),\n ),\n label: \"container id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.relations ?? []).map(\n (relation, relationIndex) => ({\n id: relation.id,\n path: `manifest.boardTemplates[${index}].relations[${relationIndex}].id`,\n }),\n ),\n label: \"relation id\",\n }),\n );\n }\n\n return issues;\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: (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 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 validateSetupOptionChoiceDuplicates(\n options: readonly SetupOptionSpec[],\n): string[] {\n const issues: string[] = [];\n\n for (const [optionIndex, option] of options.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (option.choices ?? []).map((choice, choiceIndex) => ({\n id: choice.id,\n path: `manifest.setupOptions[${optionIndex}].choices[${choiceIndex}].id`,\n })),\n label: \"setup option choice id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction resolveHexSpaces(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n): HexSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n continue;\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n q: templateSpace.q,\n r: templateSpace.r,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction validateHexVertexRefs(options: {\n ownerPath: string;\n ownerLabel: string;\n spaces: readonly HexSpaceSpec[];\n vertices: readonly HexVertexSpec[];\n}): string[] {\n const issues: string[] = [];\n const spacesById = new Map(\n options.spaces.map((space) => [space.id, space] as const),\n );\n\n for (const [vertexIndex, vertex] of options.vertices.entries()) {\n try {\n resolveHexVertexGeometryKey(vertex.ref, spacesById);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown hex vertex error.\";\n issues.push(\n `${options.ownerPath}.vertices[${vertexIndex}].ref: ${options.ownerLabel} with spaces '${vertex.ref.spaces.join(\", \")}' failed validation. ${message}`,\n );\n }\n }\n\n return issues;\n}\n\nfunction validateHexBoardVertexRefs(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const hexTemplatesById = new Map(\n (manifest.boardTemplates ?? [])\n .filter(isHexBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n\n for (const [templateIndex, template] of (\n manifest.boardTemplates ?? []\n ).entries()) {\n if (!isHexBoardTemplateSpec(template)) {\n continue;\n }\n issues.push(\n ...validateHexVertexRefs({\n ownerPath: `manifest.boardTemplates[${templateIndex}]`,\n ownerLabel: `Hex board template '${template.id}'`,\n spaces: template.spaces ?? [],\n vertices: template.vertices ?? [],\n }),\n );\n }\n\n for (const [boardIndex, board] of (manifest.boards ?? []).entries()) {\n if (!isHexBoardSpec(board)) {\n continue;\n }\n issues.push(\n ...validateHexVertexRefs({\n ownerPath: `manifest.boards[${boardIndex}]`,\n ownerLabel: `Hex board '${board.id}'`,\n spaces: resolveHexSpaces(\n board,\n hexTemplatesById.get(board.templateId ?? \"\"),\n ),\n vertices: board.vertices ?? [],\n }),\n );\n }\n\n return issues;\n}\n\nfunction collectAmbiguousBoardTypeWarnings(\n manifest: GameTopologyManifest,\n): string[] {\n const warnings: string[] = [];\n const boardTemplatesById = new Map(\n (manifest.boardTemplates ?? []).map(\n (template) => [template.id, template] as const,\n ),\n );\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 const template = board.templateId\n ? boardTemplatesById.get(board.templateId)\n : undefined;\n for (const space of [\n ...((template?.layout === board.layout ? template.spaces : undefined) ??\n []),\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 [\n ...((template?.layout === board.layout ? template.edges : undefined) ??\n []),\n ...(board.edges ?? []),\n ]) {\n addBoardUsage(boardsByEdgeType, edge.typeId, board.id);\n }\n for (const vertex of [\n ...((template?.layout === board.layout\n ? template.vertices\n : undefined) ?? []),\n ...(board.vertices ?? []),\n ]) {\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 [templateIndex, boardTemplate] of (\n manifest.boardTemplates ?? []\n ).entries()) {\n const templatePath = `manifest.boardTemplates[${templateIndex}]`;\n issues.push(\n ...collectKeyIssues([\n { value: boardTemplate.id, path: `${templatePath}.id` },\n { value: boardTemplate.typeId, path: `${templatePath}.typeId` },\n ]),\n ...collectObjectSchemaKeyIssues(\n boardTemplate.boardFieldsSchema,\n `${templatePath}.boardFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n boardTemplate.spaceFieldsSchema,\n `${templatePath}.spaceFieldsSchema`,\n ),\n );\n\n if (boardTemplate.layout !== \"hex\") {\n issues.push(\n ...collectObjectSchemaKeyIssues(\n boardTemplate.relationFieldsSchema,\n `${templatePath}.relationFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n boardTemplate.containerFieldsSchema,\n `${templatePath}.containerFieldsSchema`,\n ),\n ...collectKeyIssues([\n ...(boardTemplate.containers ?? []).flatMap(\n (container, containerIndex) => [\n {\n value: container.id,\n path: `${templatePath}.containers[${containerIndex}].id`,\n },\n {\n value:\n container.host.type === \"space\"\n ? container.host.spaceId\n : undefined,\n path: `${templatePath}.containers[${containerIndex}].host.spaceId`,\n },\n ],\n ),\n ...(boardTemplate.relations ?? []).flatMap(\n (relation, relationIndex) => [\n {\n value: relation.id,\n path: `${templatePath}.relations[${relationIndex}].id`,\n },\n {\n value: relation.typeId,\n path: `${templatePath}.relations[${relationIndex}].typeId`,\n },\n {\n value: relation.fromSpaceId,\n path: `${templatePath}.relations[${relationIndex}].fromSpaceId`,\n },\n {\n value: relation.toSpaceId,\n path: `${templatePath}.relations[${relationIndex}].toSpaceId`,\n },\n ],\n ),\n ]),\n );\n }\n\n if (boardTemplate.layout !== \"generic\") {\n issues.push(\n ...collectObjectSchemaKeyIssues(\n boardTemplate.edgeFieldsSchema,\n `${templatePath}.edgeFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n boardTemplate.vertexFieldsSchema,\n `${templatePath}.vertexFieldsSchema`,\n ),\n ...collectKeyIssues([\n ...(boardTemplate.edges ?? []).map((edge, edgeIndex) => ({\n value: edge.typeId,\n path: `${templatePath}.edges[${edgeIndex}].typeId`,\n })),\n ...(boardTemplate.vertices ?? []).map((vertex, vertexIndex) => ({\n value: vertex.typeId,\n path: `${templatePath}.vertices[${vertexIndex}].typeId`,\n })),\n ]),\n );\n }\n\n issues.push(\n ...collectKeyIssues(\n (boardTemplate.spaces ?? []).flatMap((space, spaceIndex) => [\n {\n value: space.id,\n path: `${templatePath}.spaces[${spaceIndex}].id`,\n },\n {\n value: space.typeId,\n path: `${templatePath}.spaces[${spaceIndex}].typeId`,\n },\n ]),\n ),\n );\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 { value: board.templateId, path: `${boardPath}.templateId` },\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.spaces ?? []).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 ...(manifest.setupOptions ?? []).flatMap((option, optionIndex) => [\n {\n value: option.id,\n path: `manifest.setupOptions[${optionIndex}].id`,\n },\n ...(option.choices ?? []).map((choice, choiceIndex) => ({\n value: choice.id,\n path: `manifest.setupOptions[${optionIndex}].choices[${choiceIndex}].id`,\n })),\n ]),\n ...(manifest.setupProfiles ?? []).flatMap((profile, profileIndex) => [\n {\n value: profile.id,\n path: `manifest.setupProfiles[${profileIndex}].id`,\n },\n ...(profile.guidance?.steps ?? []).map((step, stepIndex) => ({\n value: step.id,\n path: `manifest.setupProfiles[${profileIndex}].guidance.steps[${stepIndex}].id`,\n })),\n ...Object.entries(profile.optionValues ?? {}).flatMap(\n ([optionId, choiceId]) => [\n {\n value: optionId,\n path: `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}`,\n },\n {\n value: choiceId,\n path: `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}`,\n },\n ],\n ),\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.boardTemplates ?? []).map((boardTemplate, index) => ({\n id: boardTemplate.id,\n path: `manifest.boardTemplates[${index}].id`,\n })),\n label: \"board template id\",\n }),\n );\n errors.push(\n ...validateBoardTemplateDuplicates(manifest.boardTemplates ?? []),\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(\n ...collectDuplicateIdIssues({\n entries: (manifest.setupOptions ?? []).map((option, index) => ({\n id: option.id,\n path: `manifest.setupOptions[${index}].id`,\n })),\n label: \"setup option id\",\n }),\n );\n errors.push(\n ...validateSetupOptionChoiceDuplicates(manifest.setupOptions ?? []),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.setupProfiles ?? []).map((profile, index) => ({\n id: profile.id,\n path: `manifest.setupProfiles[${index}].id`,\n })),\n label: \"setup profile id\",\n }),\n );\n for (const [profileIndex, profile] of (\n manifest.setupProfiles ?? []\n ).entries()) {\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (profile.guidance?.steps ?? []).map((step, stepIndex) => ({\n id: step.id,\n path: `manifest.setupProfiles[${profileIndex}].guidance.steps[${stepIndex}].id`,\n })),\n label: `setup profile '${profile.id}' guidance step id`,\n }),\n );\n }\n errors.push(...validateSlotHostsAndHomes(manifest));\n errors.push(...validatePlayerScopedSeedHomes(manifest));\n errors.push(...validateCardHomes(manifest));\n errors.push(...validateSetupProfileReferences(manifest));\n errors.push(...validateHexBoardVertexRefs(manifest));\n\n return {\n errors,\n warnings: collectAmbiguousBoardTypeWarnings(manifest),\n };\n}\n","export type ManifestStaticBoardsData = {\n byId: unknown;\n hex: unknown;\n square: unknown;\n};\n\nexport type ManifestStaticJsonEnvelope = {\n formatVersion: 1;\n generatedBy: \"@dreamboard-games/sdk/codegen\";\n boards: ManifestStaticBoardsData;\n initialTable: unknown;\n};\n\nexport function createManifestStaticBoardsData(\n materializedTable: Record<string, unknown>,\n): ManifestStaticBoardsData {\n const boards = materializedTable.boards as\n | {\n byId: unknown;\n hex: unknown;\n square: unknown;\n }\n | undefined;\n\n return {\n byId: boards?.byId ?? {},\n hex: boards?.hex ?? {},\n square: boards?.square ?? {},\n };\n}\n\nexport function createManifestStaticJsonEnvelope(\n staticBoards: ManifestStaticBoardsData,\n initialTable: unknown,\n): ManifestStaticJsonEnvelope {\n return {\n formatVersion: 1,\n generatedBy: \"@dreamboard-games/sdk/codegen\",\n boards: staticBoards,\n initialTable,\n };\n}\n\nexport function renderManifestStaticJsonSource(\n envelope: ManifestStaticJsonEnvelope,\n): string {\n return `${JSON.stringify(envelope, null, 2)}\\n`;\n}\n","import type {\n BoardEdgeRef,\n BoardContainerSpec,\n BoardCard,\n BoardRelationSpec,\n BoardSpec,\n BoardSpaceSpec,\n BoardTemplateSpec,\n BoardVertexRef,\n GameTopologyManifest,\n GenericBoardSpec,\n GenericBoardTemplateSpec,\n HexBoardSpec,\n HexBoardTemplateSpec,\n HexEdgeRef,\n HexEdgeSpec,\n HexSpaceSpec,\n HexVertexRef,\n HexVertexSpec,\n DieSeedSpec,\n ManualCardSetDefinition,\n ObjectSchema,\n PieceSeedSpec,\n PropertySchema,\n SquareBoardSpec,\n SquareBoardTemplateSpec,\n SquareEdgeSpec,\n SquareSpaceSpec,\n SquareVertexSpec,\n ZoneSpec,\n} from \"@dreamboard-games/sdk-types\";\nimport { resolveHexVertexGeometryKey } from \"./hex-geometry.js\";\nimport {\n createManifestStaticBoardsData,\n createManifestStaticJsonEnvelope,\n renderManifestStaticJsonSource,\n} from \"./manifest-static.js\";\nimport {\n addStandardDecksIfNeeded,\n materializeCardSet,\n} from \"./preset-card-sets.js\";\nimport { validateManifestAuthoring } from \"./manifest-validation.js\";\n\ninterface AnalyzedGenericBoard {\n layout: \"generic\";\n board: GenericBoardSpec;\n template?: GenericBoardTemplateSpec;\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 template?: HexBoardTemplateSpec;\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 template?: SquareBoardTemplateSpec;\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 setupOptionIds: string[];\n setupProfileIds: string[];\n setupChoiceIdsByOptionId: Map<string, string[]>;\n setupOptionsById: Record<\n string,\n {\n id: string;\n name: string;\n description?: string | null;\n choices: ReadonlyArray<{\n id: string;\n label: string;\n description?: string | null;\n }>;\n }\n >;\n setupProfilesById: Record<\n string,\n {\n id: string;\n name: string;\n description?: string | null;\n optionValues?: Record<string, string> | null;\n guidance?: {\n summary?: string | null;\n steps: ReadonlyArray<{\n id: string;\n label: string;\n description?: string | null;\n }>;\n } | null;\n }\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 boardTemplateIds: string[];\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 boardBaseIdsByTemplateId: Map<string, string[]>;\n boardTemplateLayoutById: 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 quote(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction toPascalCase(input: string): string {\n return input\n .split(/[_-]/g)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\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 renderBlocks(blocks: Array<string | null | undefined>): string {\n return blocks.filter((block): block is string => Boolean(block)).join(\"\\n\\n\");\n}\n\nfunction dedupeSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction renderConstArray(values: readonly string[]): string {\n return `[${values.map((value) => quote(value)).join(\", \")}] as const`;\n}\n\nfunction renderStringUnion(\n values: readonly string[],\n fallback = \"never\",\n): string {\n return values.length > 0\n ? values.map((value) => quote(value)).join(\" | \")\n : fallback;\n}\n\nfunction renderStringRecord(\n entries: Iterable<readonly [string, string]>,\n): string {\n const lines = Array.from(entries)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => ` ${quote(key)}: ${quote(value)},`);\n return `{\\n${lines.join(\"\\n\")}\\n} as const`;\n}\n\nfunction renderReadonlyArrayRecord(\n entries: Iterable<readonly [string, readonly string[]]>,\n): string {\n const lines = Array.from(entries)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([key, values]) =>\n ` ${quote(key)}: [${values.map((value) => quote(value)).join(\", \")}] as const,`,\n );\n return `{\\n${lines.join(\"\\n\")}\\n} as const`;\n}\n\nfunction renderJsonConst(value: unknown): string {\n return `${JSON.stringify(value, null, 2)} as const`;\n}\n\ninterface GeneratedIdFamily {\n literalKey: string;\n typeName: string;\n guardName: string;\n description: string;\n}\n\nconst GENERATED_ID_FAMILIES: readonly GeneratedIdFamily[] = [\n {\n literalKey: \"playerIds\",\n typeName: \"PlayerId\",\n guardName: \"PlayerId\",\n description: \"player id\",\n },\n {\n literalKey: \"boardLayouts\",\n typeName: \"BoardLayout\",\n guardName: \"BoardLayout\",\n description: \"board layout\",\n },\n {\n literalKey: \"setupOptionIds\",\n typeName: \"SetupOptionId\",\n guardName: \"SetupOptionId\",\n description: \"setup option id\",\n },\n {\n literalKey: \"setupProfileIds\",\n typeName: \"SetupProfileId\",\n guardName: \"SetupProfileId\",\n description: \"setup profile id\",\n },\n {\n literalKey: \"cardSetIds\",\n typeName: \"CardSetId\",\n guardName: \"CardSetId\",\n description: \"card set id\",\n },\n {\n literalKey: \"cardTypes\",\n typeName: \"CardType\",\n guardName: \"CardType\",\n description: \"card type\",\n },\n {\n literalKey: \"cardIds\",\n typeName: \"CardId\",\n guardName: \"CardId\",\n description: \"card id\",\n },\n {\n literalKey: \"deckIds\",\n typeName: \"DeckId\",\n guardName: \"DeckId\",\n description: \"deck id\",\n },\n {\n literalKey: \"handIds\",\n typeName: \"HandId\",\n guardName: \"HandId\",\n description: \"hand id\",\n },\n {\n literalKey: \"sharedZoneIds\",\n typeName: \"SharedZoneId\",\n guardName: \"SharedZoneId\",\n description: \"shared zone id\",\n },\n {\n literalKey: \"playerZoneIds\",\n typeName: \"PlayerZoneId\",\n guardName: \"PlayerZoneId\",\n description: \"player zone id\",\n },\n {\n literalKey: \"zoneIds\",\n typeName: \"ZoneId\",\n guardName: \"ZoneId\",\n description: \"zone id\",\n },\n {\n literalKey: \"resourceIds\",\n typeName: \"ResourceId\",\n guardName: \"ResourceId\",\n description: \"resource id\",\n },\n {\n literalKey: \"pieceTypeIds\",\n typeName: \"PieceTypeId\",\n guardName: \"PieceTypeId\",\n description: \"piece type id\",\n },\n {\n literalKey: \"pieceIds\",\n typeName: \"PieceId\",\n guardName: \"PieceId\",\n description: \"piece id\",\n },\n {\n literalKey: \"dieTypeIds\",\n typeName: \"DieTypeId\",\n guardName: \"DieTypeId\",\n description: \"die type id\",\n },\n {\n literalKey: \"dieIds\",\n typeName: \"DieId\",\n guardName: \"DieId\",\n description: \"die id\",\n },\n {\n literalKey: \"boardTypeIds\",\n typeName: \"BoardTypeId\",\n guardName: \"BoardTypeId\",\n description: \"board type id\",\n },\n {\n literalKey: \"boardBaseIds\",\n typeName: \"BoardBaseId\",\n guardName: \"BoardBaseId\",\n description: \"board base id\",\n },\n {\n literalKey: \"boardIds\",\n typeName: \"BoardId\",\n guardName: \"BoardId\",\n description: \"board id\",\n },\n {\n literalKey: \"boardContainerIds\",\n typeName: \"BoardContainerId\",\n guardName: \"BoardContainerId\",\n description: \"board container id\",\n },\n {\n literalKey: \"relationTypeIds\",\n typeName: \"RelationTypeId\",\n guardName: \"RelationTypeId\",\n description: \"relation type id\",\n },\n {\n literalKey: \"edgeIds\",\n typeName: \"EdgeId\",\n guardName: \"EdgeId\",\n description: \"edge id\",\n },\n {\n literalKey: \"edgeTypeIds\",\n typeName: \"EdgeTypeId\",\n guardName: \"EdgeTypeId\",\n description: \"edge type id\",\n },\n {\n literalKey: \"vertexIds\",\n typeName: \"VertexId\",\n guardName: \"VertexId\",\n description: \"vertex id\",\n },\n {\n literalKey: \"vertexTypeIds\",\n typeName: \"VertexTypeId\",\n guardName: \"VertexTypeId\",\n description: \"vertex type id\",\n },\n {\n literalKey: \"spaceIds\",\n typeName: \"SpaceId\",\n guardName: \"SpaceId\",\n description: \"space id\",\n },\n {\n literalKey: \"spaceTypeIds\",\n typeName: \"SpaceTypeId\",\n guardName: \"SpaceTypeId\",\n description: \"space type id\",\n },\n] as const;\n\n// `playerIds` are excluded from the generated `records`/`idGuards` surfaces:\n// `PlayerId` is now an opaque brand whose runtime roster comes from the active\n// session, not `manifest.players.maxPlayers`. Authors must use\n// `perPlayer(runtimeIds, init)` and `asPlayerId` from `@dreamboard-games/sdk/reducer`\n// instead of a `Record<PlayerId, T>` keyed on the max-players set.\nconst GENERATED_ID_FAMILIES_WITHOUT_PLAYERS: readonly GeneratedIdFamily[] =\n GENERATED_ID_FAMILIES.filter((family) => family.literalKey !== \"playerIds\");\n\nfunction renderGeneratedRecordsHelpers(): string {\n return `export const records = {\n${GENERATED_ID_FAMILIES_WITHOUT_PLAYERS.map(\n ({ literalKey, typeName }) => ` ${literalKey}<Value>(\n initial: Value | ((${literalKey.slice(0, -1)}: ${typeName}) => Value),\n ): Record<${typeName}, Value> {\n return buildTypedRecord(literals.${literalKey}, initial);\n },`,\n).join(\"\\n\")}\n} as const;`;\n}\n\nfunction renderGeneratedIdGuards(): string {\n return `export const idGuards = {\n${GENERATED_ID_FAMILIES_WITHOUT_PLAYERS.map(\n ({\n literalKey,\n typeName,\n guardName,\n description,\n }) => ` is${guardName}(value: string): value is ${typeName} {\n return isTypedId(literals.${literalKey}, value);\n },\n expect${guardName}(value: string): ${typeName} {\n return expectTypedId(literals.${literalKey}, value, ${quote(description)});\n },`,\n).join(\"\\n\")}\n} as const;`;\n}\n\nfunction renderGeneratedIdHandles(analysis: ManifestAnalysis): string {\n return `export const cardTypes = ${renderHandleObject(\n \"CardType\",\n analysis.cardTypes,\n )};\n\nexport const zones = ${renderHandleObject(\"ZoneId\", analysis.zoneIds)};`;\n}\n\nfunction renderHandleObject(\n typeName: string,\n values: readonly string[],\n): string {\n const lines = Array.from(values)\n .sort((left, right) => left.localeCompare(right))\n .map((value) => ` ${quote(toHandleKey(value))}: ${quote(value)},`);\n return `{\\n${lines.join(\"\\n\")}\\n} as const satisfies Record<string, ${typeName}>`;\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 isHexBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is HexBoardTemplateSpec {\n return boardTemplate.layout === \"hex\";\n}\n\nfunction isSquareBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is SquareBoardTemplateSpec {\n return boardTemplate.layout === \"square\";\n}\n\nfunction isGenericBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is GenericBoardTemplateSpec {\n return boardTemplate.layout === \"generic\";\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\nconst HEX_SIDES = [\"e\", \"ne\", \"nw\", \"w\", \"sw\", \"se\"] as const;\nconst HEX_CORNERS = [\"ne-e\", \"e-se\", \"se-sw\", \"sw-w\", \"w-nw\", \"nw-ne\"] as const;\n\ntype HexSide = (typeof HEX_SIDES)[number];\ntype HexCorner = (typeof HEX_CORNERS)[number];\n\nconst HEX_SIDE_OFFSETS: Record<HexSide, readonly [number, number]> = {\n e: [1, 0],\n ne: [1, -1],\n nw: [0, -1],\n w: [-1, 0],\n sw: [-1, 1],\n se: [0, 1],\n};\n\nconst HEX_CORNER_OFFSETS: Record<HexCorner, readonly [number, number, number]> =\n {\n \"ne-e\": [2, -1, -1],\n \"e-se\": [1, -2, 1],\n \"se-sw\": [-1, -1, 2],\n \"sw-w\": [-2, 1, 1],\n \"w-nw\": [-1, 2, -1],\n \"nw-ne\": [1, 1, -2],\n };\n\nconst HEX_SIDE_CORNERS: Record<HexSide, readonly [HexCorner, HexCorner]> = {\n e: [\"ne-e\", \"e-se\"],\n ne: [\"nw-ne\", \"ne-e\"],\n nw: [\"w-nw\", \"nw-ne\"],\n w: [\"sw-w\", \"w-nw\"],\n sw: [\"se-sw\", \"sw-w\"],\n se: [\"e-se\", \"se-sw\"],\n};\n\nconst HEX_CORNER_SIDES: Record<HexCorner, readonly [HexSide, HexSide]> = {\n \"ne-e\": [\"ne\", \"e\"],\n \"e-se\": [\"e\", \"se\"],\n \"se-sw\": [\"se\", \"sw\"],\n \"sw-w\": [\"sw\", \"w\"],\n \"w-nw\": [\"w\", \"nw\"],\n \"nw-ne\": [\"nw\", \"ne\"],\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\nfunction cubeFromAxial(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n): readonly [number, number, number] {\n const x = space.q;\n const z = space.r;\n return [x, -x - z, z] as const;\n}\n\nfunction cornerGeometryKey(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n corner: HexCorner,\n) {\n const [x, y, z] = cubeFromAxial(space);\n const [dx, dy, dz] = HEX_CORNER_OFFSETS[corner];\n return `${3 * x + dx},${3 * y + dy},${3 * z + dz}`;\n}\n\nfunction edgeGeometryKey(space: Pick<HexSpaceSpec, \"q\" | \"r\">, side: HexSide) {\n const [leftCorner, rightCorner] = HEX_SIDE_CORNERS[side];\n return [\n cornerGeometryKey(space, leftCorner),\n cornerGeometryKey(space, rightCorner),\n ]\n .sort((left, right) => left.localeCompare(right))\n .join(\"::\");\n}\n\nfunction edgeIdFromGeometryKey(key: string): string {\n return `hex-edge:${key}`;\n}\n\nfunction vertexIdFromGeometryKey(key: string): string {\n return `hex-vertex:${key}`;\n}\n\nconst SQUARE_SIDES = [\"north\", \"east\", \"south\", \"west\"] as const;\nconst SQUARE_CORNERS = [\"nw\", \"ne\", \"se\", \"sw\"] as const;\n\ntype SquareSide = (typeof SQUARE_SIDES)[number];\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 geometryKeyFromEdgeRef(\n ref: HexEdgeRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n const [leftId, rightId] = [...ref.spaces].sort((a, b) => a.localeCompare(b));\n if (leftId === undefined || rightId === undefined) {\n throw new Error(\"Hex edge ref must reference exactly two spaces.\");\n }\n const leftSpace = spacesById.get(leftId);\n const rightSpace = spacesById.get(rightId);\n if (!leftSpace || !rightSpace) {\n throw new Error(\n `Hex edge ref references unknown spaces: ${ref.spaces.join(\", \")}.`,\n );\n }\n const [dq, dr] = [rightSpace.q - leftSpace.q, rightSpace.r - leftSpace.r];\n const side = (\n Object.entries(HEX_SIDE_OFFSETS) as Array<\n readonly [HexSide, readonly [number, number]]\n >\n ).find(([, [sideQ, sideR]]) => sideQ === dq && sideR === dr)?.[0];\n if (!side) {\n throw new Error(\n `Hex edge ref spaces '${leftId}' and '${rightId}' are not adjacent.`,\n );\n }\n return edgeGeometryKey(leftSpace, side);\n}\n\nfunction geometryKeyFromVertexRef(\n ref: HexVertexRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n return resolveHexVertexGeometryKey(ref, spacesById);\n}\n\nfunction deriveHexEdges(spaces: readonly HexSpaceSpec[]): ResolvedHexEdge[] {\n const spacesByCoordinate = new Map<string, HexSpaceSpec>();\n for (const space of spaces) {\n spacesByCoordinate.set(`${space.q},${space.r}`, space);\n }\n\n const edgeMap = new Map<string, ResolvedHexEdge>();\n for (const space of spaces) {\n for (const side of HEX_SIDES) {\n const [dq, dr] = HEX_SIDE_OFFSETS[side];\n const neighbor = spacesByCoordinate.get(\n `${space.q + dq},${space.r + dr}`,\n );\n const geometryKey = edgeGeometryKey(space, side);\n const existing = edgeMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ...(neighbor ? [neighbor.id] : []),\n ]);\n edgeMap.set(geometryKey, {\n id: edgeIdFromGeometryKey(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\n return [...edgeMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveHexVertices(\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexVertex[] {\n const spacesByCoordinate = new Map<string, HexSpaceSpec>();\n for (const space of spaces) {\n spacesByCoordinate.set(`${space.q},${space.r}`, space);\n }\n\n const vertexMap = new Map<string, ResolvedHexVertex>();\n for (const space of spaces) {\n for (const corner of HEX_CORNERS) {\n const [leftSide, rightSide] = HEX_CORNER_SIDES[corner];\n const [leftQ, leftR] = HEX_SIDE_OFFSETS[leftSide];\n const [rightQ, rightR] = HEX_SIDE_OFFSETS[rightSide];\n const leftNeighbor = spacesByCoordinate.get(\n `${space.q + leftQ},${space.r + leftR}`,\n );\n const rightNeighbor = spacesByCoordinate.get(\n `${space.q + rightQ},${space.r + rightR}`,\n );\n const geometryKey = cornerGeometryKey(space, corner);\n const existing = vertexMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ...(leftNeighbor ? [leftNeighbor.id] : []),\n ...(rightNeighbor ? [rightNeighbor.id] : []),\n ]);\n vertexMap.set(geometryKey, {\n id: vertexIdFromGeometryKey(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\n return [...vertexMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction mergeBoardSpaces(\n templateSpaces: readonly BoardSpaceSpec[],\n boardSpaces: readonly BoardSpaceSpec[],\n): BoardSpaceSpec[] {\n return Array.from(\n [...templateSpaces, ...boardSpaces]\n .reduce<Map<string, BoardSpaceSpec>>((accumulator, space) => {\n accumulator.set(space.id, space);\n return accumulator;\n }, new Map<string, BoardSpaceSpec>())\n .values(),\n ).sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction mergeBoardContainers(\n templateContainers: readonly BoardContainerSpec[],\n boardContainers: readonly BoardContainerSpec[],\n): BoardContainerSpec[] {\n return Array.from(\n [...templateContainers, ...boardContainers]\n .reduce<Map<string, BoardContainerSpec>>((accumulator, container) => {\n accumulator.set(container.id, container);\n return accumulator;\n }, new Map<string, BoardContainerSpec>())\n .values(),\n ).sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction resolveHexSpaces(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n): HexSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown space '${overrideId}' from template '${template.id}'.`,\n );\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n const templateMatch = templateSpacesById.get(override.id);\n if (!templateMatch) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown space '${override.id}' from template '${template.id}'.`,\n );\n }\n if (templateMatch.q !== override.q || templateMatch.r !== override.r) {\n throw new Error(\n `Hex board '${board.id}' cannot change coordinates for space '${override.id}' from template '${template.id}'.`,\n );\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n q: templateSpace.q,\n r: templateSpace.r,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction indexHexEdgeMetadata(\n specs: readonly HexEdgeSpec[],\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\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 = geometryKeyFromEdgeRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex 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 indexHexVertexMetadata(\n specs: readonly HexVertexSpec[],\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\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 = geometryKeyFromVertexRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex 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 resolveAuthoredHexEdges(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): AnalyzedHexBoard[\"authoredEdges\"] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derivedByGeometryKey = new Map(\n deriveHexEdges(spaces).map((edge) => [edge.geometryKey, edge] as const),\n );\n const collectSpecsByGeometryKey = (\n specs: readonly HexEdgeSpec[],\n ownerLabel: string,\n ) => {\n const specsByGeometryKey = new Map<string, HexEdgeSpec>();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromEdgeRef(spec.ref, spacesById);\n if (specsByGeometryKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex edge refs.`);\n }\n specsByGeometryKey.set(geometryKey, spec);\n }\n return specsByGeometryKey;\n };\n\n const templateSpecsByGeometryKey = template\n ? collectSpecsByGeometryKey(\n template.edges ?? [],\n `Hex board template '${template.id}'`,\n )\n : new Map<string, HexEdgeSpec>();\n const overrideSpecsByGeometryKey = collectSpecsByGeometryKey(\n board.edges ?? [],\n `Hex board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideSpecsByGeometryKey.keys()) {\n if (!templateSpecsByGeometryKey.has(overrideKey)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown edge ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedSpecs = template\n ? Array.from(templateSpecsByGeometryKey.entries()).map(\n ([geometryKey, templateSpec]) =>\n [\n geometryKey,\n overrideSpecsByGeometryKey.get(geometryKey) ?? templateSpec,\n ] as const,\n )\n : Array.from(overrideSpecsByGeometryKey.entries());\n\n return mergedSpecs.map(([geometryKey, spec]) => {\n const derivedEdge = derivedByGeometryKey.get(geometryKey);\n if (!derivedEdge) {\n throw new Error(\n `Hex edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n return {\n id: derivedEdge.id,\n ref: cloneJson(spec.ref),\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}\n\nfunction resolveAuthoredHexVertices(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): AnalyzedHexBoard[\"authoredVertices\"] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derivedByGeometryKey = new Map(\n deriveHexVertices(spaces).map(\n (vertex) => [vertex.geometryKey, vertex] as const,\n ),\n );\n const collectSpecsByGeometryKey = (\n specs: readonly HexVertexSpec[],\n ownerLabel: string,\n ) => {\n const specsByGeometryKey = new Map<string, HexVertexSpec>();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromVertexRef(spec.ref, spacesById);\n if (specsByGeometryKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex vertex refs.`);\n }\n specsByGeometryKey.set(geometryKey, spec);\n }\n return specsByGeometryKey;\n };\n\n const templateSpecsByGeometryKey = template\n ? collectSpecsByGeometryKey(\n template.vertices ?? [],\n `Hex board template '${template.id}'`,\n )\n : new Map<string, HexVertexSpec>();\n const overrideSpecsByGeometryKey = collectSpecsByGeometryKey(\n board.vertices ?? [],\n `Hex board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideSpecsByGeometryKey.keys()) {\n if (!templateSpecsByGeometryKey.has(overrideKey)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown vertex ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedSpecs = template\n ? Array.from(templateSpecsByGeometryKey.entries()).map(\n ([geometryKey, templateSpec]) =>\n [\n geometryKey,\n overrideSpecsByGeometryKey.get(geometryKey) ?? templateSpec,\n ] as const,\n )\n : Array.from(overrideSpecsByGeometryKey.entries());\n\n return mergedSpecs.map(([geometryKey, spec]) => {\n const derivedVertex = derivedByGeometryKey.get(geometryKey);\n if (!derivedVertex) {\n throw new Error(\n `Hex vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n return {\n id: derivedVertex.id,\n ref: cloneJson(spec.ref),\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}\n\nfunction resolveHexEdges(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexEdge[] {\n const derived = deriveHexEdges(spaces);\n const edgesById = new Map(derived.map((edge) => [edge.id, edge] as const));\n for (const authoredEdge of resolveAuthoredHexEdges(board, template, spaces)) {\n const edge = edgesById.get(authoredEdge.id);\n if (!edge) {\n throw new Error(\n `Hex edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n edgesById.set(authoredEdge.id, {\n ...edge,\n typeId: authoredEdge.typeId ?? null,\n label: authoredEdge.label ?? null,\n fields: authoredEdge.fields ?? null,\n });\n }\n\n return [...edgesById.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveHexVertices(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexVertex[] {\n const derived = deriveHexVertices(spaces);\n const verticesById = new Map(\n derived.map((vertex) => [vertex.id, vertex] as const),\n );\n for (const authoredVertex of resolveAuthoredHexVertices(\n board,\n template,\n spaces,\n )) {\n const vertex = verticesById.get(authoredVertex.id);\n if (!vertex) {\n throw new Error(\n `Hex vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n verticesById.set(authoredVertex.id, {\n ...vertex,\n typeId: authoredVertex.typeId ?? null,\n label: authoredVertex.label ?? null,\n fields: authoredVertex.fields ?? null,\n });\n }\n\n return [...verticesById.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveSquareSpaces(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n): SquareSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown space '${overrideId}' from template '${template.id}'.`,\n );\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n const templateMatch = templateSpacesById.get(override.id);\n if (!templateMatch) {\n throw new Error(\n `Square board '${board.id}' overrides unknown space '${override.id}' from template '${template.id}'.`,\n );\n }\n if (\n templateMatch.row !== override.row ||\n templateMatch.col !== override.col\n ) {\n throw new Error(\n `Square board '${board.id}' cannot change coordinates for space '${override.id}' from template '${template.id}'.`,\n );\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n row: templateSpace.row,\n col: templateSpace.col,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\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 template: SquareBoardTemplateSpec | undefined,\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 templateMetadata = template\n ? indexSquareEdgeMetadata(\n template.edges ?? [],\n spacesById,\n `Square board template '${template.id}'`,\n )\n : new Map();\n const overrideMetadata = indexSquareEdgeMetadata(\n board.edges ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideMetadata.keys()) {\n if (!templateMetadata.has(overrideKey)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown edge ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedMetadata = template\n ? new Map(\n [...templateMetadata.entries()].map(([key, metadata]) => [\n key,\n {\n ...metadata,\n ...(overrideMetadata.get(key) ?? {}),\n geometryKey: key,\n },\n ]),\n )\n : overrideMetadata;\n\n for (const [geometryKey, metadata] of mergedMetadata.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 template: SquareBoardTemplateSpec | undefined,\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 templateMetadata = template\n ? indexSquareVertexMetadata(\n template.vertices ?? [],\n spacesById,\n `Square board template '${template.id}'`,\n )\n : new Map();\n const overrideMetadata = indexSquareVertexMetadata(\n board.vertices ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideMetadata.keys()) {\n if (!templateMetadata.has(overrideKey)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown vertex ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedMetadata = template\n ? new Map(\n [...templateMetadata.entries()].map(([key, metadata]) => [\n key,\n {\n ...metadata,\n ...(overrideMetadata.get(key) ?? {}),\n geometryKey: key,\n },\n ]),\n )\n : overrideMetadata;\n\n for (const [geometryKey, metadata] of mergedMetadata.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 const boardTemplates = manifest.boardTemplates ?? [];\n const genericTemplateById = new Map(\n boardTemplates\n .filter(isGenericBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n const hexTemplateById = new Map(\n boardTemplates\n .filter(isHexBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n const squareTemplateById = new Map(\n boardTemplates\n .filter(isSquareBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n\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 hexBoard = board;\n const template = board.templateId\n ? hexTemplateById.get(board.templateId)\n : undefined;\n const spaces = resolveHexSpaces(hexBoard, template);\n return {\n layout: \"hex\",\n board: hexBoard,\n template,\n boardTypeId: hexBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n hexBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n hexBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n edgeFieldsSchema:\n hexBoard.edgeFieldsSchema ?? template?.edgeFieldsSchema,\n vertexFieldsSchema:\n hexBoard.vertexFieldsSchema ?? template?.vertexFieldsSchema,\n spaces,\n authoredEdges: resolveAuthoredHexEdges(hexBoard, template, spaces),\n authoredVertices: resolveAuthoredHexVertices(\n hexBoard,\n template,\n spaces,\n ),\n edges: resolveHexEdges(hexBoard, template, spaces),\n vertices: resolveHexVertices(hexBoard, template, spaces),\n };\n }\n\n if (isSquareBoardSpec(board)) {\n const squareBoard = board;\n const template = board.templateId\n ? squareTemplateById.get(board.templateId)\n : undefined;\n const spaces = resolveSquareSpaces(squareBoard, template);\n return {\n layout: \"square\",\n board: squareBoard,\n template,\n boardTypeId: squareBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n squareBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n squareBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n relationFieldsSchema:\n squareBoard.relationFieldsSchema ?? template?.relationFieldsSchema,\n containerFieldsSchema:\n squareBoard.containerFieldsSchema ?? template?.containerFieldsSchema,\n edgeFieldsSchema:\n squareBoard.edgeFieldsSchema ?? template?.edgeFieldsSchema,\n vertexFieldsSchema:\n squareBoard.vertexFieldsSchema ?? template?.vertexFieldsSchema,\n spaces,\n relations: [\n ...(template?.relations ?? []),\n ...(squareBoard.relations ?? []),\n ],\n containers: mergeBoardContainers(\n template?.containers ?? [],\n squareBoard.containers ?? [],\n ),\n edges: resolveSquareEdges(squareBoard, template, spaces),\n vertices: resolveSquareVertices(squareBoard, template, spaces),\n };\n }\n\n const genericBoard = board;\n const template = board.templateId\n ? genericTemplateById.get(board.templateId)\n : undefined;\n return {\n layout: \"generic\",\n board: genericBoard,\n template,\n boardTypeId: genericBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n genericBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n genericBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n relationFieldsSchema:\n genericBoard.relationFieldsSchema ?? template?.relationFieldsSchema,\n containerFieldsSchema:\n genericBoard.containerFieldsSchema ?? template?.containerFieldsSchema,\n spaces: mergeBoardSpaces(\n template?.spaces ?? [],\n genericBoard.spaces ?? [],\n ),\n relations: [\n ...(template?.relations ?? []),\n ...(genericBoard.relations ?? []),\n ],\n containers: mergeBoardContainers(\n template?.containers ?? [],\n genericBoard.containers ?? [],\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\nfunction renderStrictSlotLocationSchema(\n hosts: ReadonlyArray<{\n kind: \"piece\" | \"die\";\n id: string;\n slotIds: readonly string[];\n }>,\n): string {\n const branches = hosts.flatMap((host) =>\n host.slotIds.map(\n (slotId) => `z.object({\n type: z.literal(\"InSlot\"),\n host: z.object({\n kind: z.literal(${quote(host.kind)}),\n id: z.literal(${quote(host.id)}),\n }),\n slotId: z.literal(${quote(slotId)}),\n position: z.number().int().nullable().optional(),\n })`,\n ),\n );\n\n if (branches.length === 0) {\n return `z.object({\n type: z.literal(\"InSlot\"),\n host: z.never(),\n slotId: z.never(),\n position: z.number().int().nullable().optional(),\n })`;\n }\n\n return branches.join(\",\\n \");\n}\n\nfunction analyzeManifest(\n inputManifest: GameTopologyManifest,\n): ManifestAnalysis {\n const manifest = addStandardDecksIfNeeded(inputManifest);\n const playerIds = 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) => cardSet.cards.map((card) => card.type)),\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 zoneIds = homeSharedZoneIdsByCardType.get(card.type) ?? [];\n zoneIds.push(card.home.zoneId);\n homeSharedZoneIdsByCardType.set(card.type, 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 setupOptionIds = dedupeSorted(\n (manifest.setupOptions ?? []).map((option) => option.id),\n );\n const setupProfileIds = dedupeSorted(\n (manifest.setupProfiles ?? []).map((profile) => profile.id),\n );\n const setupChoiceIdsByOptionId = new Map(\n (manifest.setupOptions ?? []).map((option) => [\n option.id,\n dedupeSorted((option.choices ?? []).map((choice) => choice.id)),\n ]),\n );\n const setupOptionsById = Object.fromEntries(\n (manifest.setupOptions ?? [])\n .slice()\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((option) => [\n option.id,\n {\n id: option.id,\n name: option.name,\n description: option.description ?? null,\n choices: (option.choices ?? []).map((choice) => ({\n id: choice.id,\n label: choice.label,\n description: choice.description ?? null,\n })),\n },\n ]),\n );\n const setupProfilesById = Object.fromEntries(\n (manifest.setupProfiles ?? [])\n .slice()\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((profile) => [\n profile.id,\n {\n id: profile.id,\n name: profile.name,\n description: profile.description ?? null,\n optionValues: profile.optionValues\n ? Object.fromEntries(\n Object.entries(profile.optionValues).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\",\n ),\n )\n : null,\n guidance: profile.guidance\n ? {\n summary: profile.guidance.summary ?? null,\n steps: (profile.guidance.steps ?? []).map((step) => ({\n id: step.id,\n label: step.label,\n description: step.description ?? null,\n })),\n }\n : null,\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 boardTemplateIds = dedupeSorted(\n (manifest.boardTemplates ?? []).map((boardTemplate) => boardTemplate.id),\n );\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 boardBaseIdsByTemplateId = new Map<string, string[]>();\n const boardTemplateLayoutById = 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 boardTemplate of manifest.boardTemplates ?? []) {\n boardTemplateLayoutById.set(boardTemplate.id, boardTemplate.layout);\n boardBaseIdsByLayout.set(\n boardTemplate.layout,\n dedupeSorted([...(boardBaseIdsByLayout.get(boardTemplate.layout) ?? [])]),\n );\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 if (analyzedBoard.board.templateId) {\n boardBaseIdsByTemplateId.set(\n analyzedBoard.board.templateId,\n dedupeSorted([\n ...(boardBaseIdsByTemplateId.get(analyzedBoard.board.templateId) ??\n []),\n analyzedBoard.board.id,\n ]),\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 setupOptionIds,\n setupProfileIds,\n setupChoiceIdsByOptionId,\n setupOptionsById,\n setupProfilesById,\n pieceTypeIds,\n pieceIds,\n pieceTypeIdByPieceId,\n dieTypeIds,\n dieIds,\n dieTypeIdByDieId,\n strictSlotHosts,\n boardTemplateIds,\n boardBaseIds,\n boardIds,\n boardContainerIds,\n boardTypeIds,\n boardLayoutById,\n boardIdsByLayout,\n boardBaseIdsByLayout,\n boardIdsByBaseId,\n boardBaseIdsByTemplateId,\n boardTemplateLayoutById,\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);\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.type,\n name: card.name,\n text: card.text,\n properties: {\n ...materializeCardPropertiesDefaults(\n materializedCardSet.cardSchema,\n 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 templateId: analyzedBoard.board.templateId ?? null,\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-top\",\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 = (\n zoneId: string,\n componentId: string,\n position: unknown,\n ) => {\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 position: unknown,\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(\n location.deckId as string,\n componentId,\n location.position,\n );\n break;\n case \"InHand\":\n pushPlayerComponent(\n location.handId as string,\n location.playerId as string,\n componentId,\n location.position,\n );\n break;\n case \"InZone\":\n pushSharedComponent(\n location.zoneId as string,\n componentId,\n location.position,\n );\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 // PerPlayer<T> wire shape only: { __perPlayer: true, entries: [[playerId, value], ...] }.\n const toPerPlayerWireFormat = <Value>(\n entries: Record<string, Value>,\n ): {\n readonly __perPlayer: true;\n readonly entries: ReadonlyArray<readonly [string, Value]>;\n } => ({\n __perPlayer: true,\n entries: playerIds.map(\n (playerId) => [playerId, entries[playerId] as Value] as const,\n ),\n });\n\n const perPlayerZonesWire = Object.fromEntries(\n Object.entries(perPlayerZones).map(([zoneId, entries]) => [\n zoneId,\n toPerPlayerWireFormat(entries),\n ]),\n );\n const resourcesWire = toPerPlayerWireFormat(resourcesByPlayer);\n\n return {\n playerOrder: playerIds,\n zones: {\n shared: sharedZones,\n perPlayer: perPlayerZonesWire,\n visibility: zoneVisibility,\n cardSetIdsByZoneId: zoneCardSetIdsByZoneId,\n },\n decks: cloneJson(sharedZones),\n hands: cloneJson(perPlayerZonesWire),\n handVisibility,\n cards,\n pieces,\n componentLocations,\n ownerOfCard,\n visibility,\n resources: resourcesWire,\n boards: {\n byId: boardStatesById,\n hex: hexBoardStatesById,\n square: squareBoardStatesById,\n network: {},\n track: {},\n },\n dice,\n };\n}\n\nfunction renderTypeForPropertySchema(\n schema: PropertySchema | null | undefined,\n): string {\n if (!schema) {\n return \"RuntimePayload\";\n }\n let rendered: string;\n switch (schema.type) {\n case \"string\":\n rendered = \"string\";\n break;\n case \"integer\":\n case \"number\":\n rendered = \"number\";\n break;\n case \"boolean\":\n rendered = \"boolean\";\n break;\n case \"cardId\":\n rendered = \"CardId\";\n break;\n case \"playerId\":\n rendered = \"PlayerId\";\n break;\n case \"zoneId\":\n rendered = \"ZoneId\";\n break;\n case \"boardId\":\n rendered = \"BoardId\";\n break;\n case \"edgeId\":\n rendered = \"EdgeId\";\n break;\n case \"vertexId\":\n rendered = \"VertexId\";\n break;\n case \"spaceId\":\n rendered = \"SpaceId\";\n break;\n case \"pieceId\":\n rendered = \"PieceId\";\n break;\n case \"dieId\":\n rendered = \"DieId\";\n break;\n case \"resourceId\":\n rendered = \"ResourceId\";\n break;\n case \"enum\":\n rendered =\n schema.enums && schema.enums.length > 0\n ? schema.enums.map((value) => quote(value)).join(\" | \")\n : \"string\";\n break;\n case \"array\":\n rendered = `Array<${renderTypeForPropertySchema(schema.items)}>`;\n break;\n case \"object\":\n rendered = renderTypeForObjectSchema(\n schema.properties\n ? {\n properties: schema.properties,\n }\n : null,\n );\n break;\n case \"record\":\n rendered = `Record<string, ${renderTypeForPropertySchema(schema.values)}>`;\n break;\n default:\n rendered = \"RuntimePayload\";\n break;\n }\n return schema.nullable ? `${rendered} | null` : rendered;\n}\n\nfunction renderZodForPropertySchema(\n schema: PropertySchema | null | undefined,\n): string {\n if (!schema) {\n return \"z.unknown()\";\n }\n let rendered: string;\n switch (schema.type) {\n case \"string\":\n rendered = \"z.string()\";\n break;\n case \"integer\":\n rendered = \"z.number().int()\";\n break;\n case \"number\":\n rendered = \"z.number()\";\n break;\n case \"boolean\":\n rendered = \"z.boolean()\";\n break;\n case \"cardId\":\n rendered = \"ids.cardId\";\n break;\n case \"playerId\":\n rendered = \"ids.playerId\";\n break;\n case \"zoneId\":\n rendered = \"ids.zoneId\";\n break;\n case \"boardId\":\n rendered = \"ids.boardId\";\n break;\n case \"edgeId\":\n rendered = \"ids.edgeId\";\n break;\n case \"vertexId\":\n rendered = \"ids.vertexId\";\n break;\n case \"spaceId\":\n rendered = \"ids.spaceId\";\n break;\n case \"pieceId\":\n rendered = \"ids.pieceId\";\n break;\n case \"dieId\":\n rendered = \"ids.dieId\";\n break;\n case \"resourceId\":\n rendered = \"ids.resourceId\";\n break;\n case \"enum\":\n rendered =\n schema.enums && schema.enums.length > 0\n ? `z.enum([${schema.enums.map((value) => quote(value)).join(\", \")}])`\n : \"z.string()\";\n break;\n case \"array\":\n rendered = `z.array(${renderZodForPropertySchema(schema.items)})`;\n break;\n case \"object\":\n rendered = renderZodForObjectSchema(\n schema.properties\n ? {\n properties: schema.properties,\n }\n : null,\n );\n break;\n case \"record\":\n rendered = `z.record(z.string(), ${renderZodForPropertySchema(schema.values)})`;\n break;\n default:\n rendered = \"z.unknown()\";\n break;\n }\n if (schema.nullable) {\n rendered = `${rendered}.nullable()`;\n }\n if (schema.optional) {\n rendered = `${rendered}.optional()`;\n }\n if (hasPropertySchemaDefault(schema)) {\n rendered = `${rendered}.default(${JSON.stringify(schema.default)})`;\n }\n return rendered;\n}\n\nfunction renderTypeForObjectSchema(\n schema: ObjectSchema | null | undefined,\n): string {\n if (!schema || Object.keys(schema.properties).length === 0) {\n return \"RuntimeRecord\";\n }\n\n return `{\\n${Object.entries(schema.properties)\n .map(([key, value]) => {\n const optional =\n value?.optional && !hasPropertySchemaDefault(value) ? \"?\" : \"\";\n return ` ${quote(key)}${optional}: ${renderTypeForPropertySchema(value)};`;\n })\n .join(\"\\n\")}\\n}`;\n}\n\nfunction renderZodForObjectSchema(\n schema: ObjectSchema | null | undefined,\n): string {\n if (!schema || Object.keys(schema.properties).length === 0) {\n return \"z.record(z.string(), z.unknown())\";\n }\n\n return `z.object({\\n${Object.entries(schema.properties)\n .map(\n ([key, value]) =>\n ` ${quote(key)}: ${renderZodForPropertySchema(value)},`,\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderCardSetPropertySections(\n cardSets: readonly ManualCardSetDefinition[],\n): string {\n return cardSets\n .map((cardSet) => {\n const typeName = `${toPascalCase(cardSet.id)}CardProperties`;\n const schemaName = `${typeName}Schema`;\n\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n const cardSchema = cardSet.cardSchema;\n const variantBlocks = Object.entries(cardSchema.variants).map(\n ([cardType]) => {\n const variantTypeName = cardPropertiesTypeName(cardSet, cardType);\n const variantSchemaName = cardPropertiesSchemaName(\n cardSet,\n cardType,\n );\n const schema = mergeSharedCardProperties(cardSchema, cardType);\n return renderBlocks([\n `export type ${variantTypeName} = ${renderTypeForObjectSchema(schema)};`,\n `export const ${variantSchemaName} = ${renderZodForObjectSchema(schema)};`,\n ]);\n },\n );\n const variantTypeNames = Object.keys(cardSchema.variants).map(\n (cardType) => cardPropertiesTypeName(cardSet, cardType),\n );\n const variantSchemaNames = Object.keys(cardSchema.variants).map(\n (cardType) => cardPropertiesSchemaName(cardSet, cardType),\n );\n const unionSchema =\n variantSchemaNames.length === 0\n ? \"z.record(z.string(), z.unknown())\"\n : variantSchemaNames.length === 1\n ? variantSchemaNames[0]\n : `z.union([${variantSchemaNames.join(\", \")}])`;\n\n return renderBlocks([\n ...variantBlocks,\n `export type ${typeName} = ${variantTypeNames.join(\" | \") || \"RuntimeRecord\"};`,\n `export const ${schemaName} = ${unionSchema};`,\n `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`,\n ]);\n }\n\n return renderBlocks([\n `export type ${typeName} = ${renderTypeForObjectSchema(cardSet.cardSchema)};`,\n `export const ${schemaName} = ${renderZodForObjectSchema(cardSet.cardSchema)};`,\n `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`,\n ]);\n })\n .join(\"\\n\\n\");\n}\n\nfunction cardPropertiesTypeName(\n cardSet: ManualCardSetDefinition,\n cardType: string,\n): string {\n if (!isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return `${toPascalCase(cardSet.id)}CardProperties`;\n }\n return `${toPascalCase(cardSet.id)}${toPascalCase(cardType)}CardProperties`;\n}\n\nfunction cardPropertiesSchemaName(\n cardSet: ManualCardSetDefinition,\n cardType: string,\n): string {\n if (!isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return `${toPascalCase(cardSet.id)}CardPropertiesSchema`;\n }\n return `${cardPropertiesTypeName(cardSet, cardType)}Schema`;\n}\n\nfunction renderCardPropertiesSchemaByCardSetId(\n cardSets: readonly ManualCardSetDefinition[],\n): string {\n const entries = cardSets.flatMap((cardSet) => {\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return Object.keys(cardSet.cardSchema.variants).map(\n (cardType) =>\n ` ${quote(`${cardSet.id}:${cardType}`)}: ${cardPropertiesSchemaName(cardSet, cardType)},`,\n );\n }\n return [\n ` ${quote(cardSet.id)}: ${toPascalCase(cardSet.id)}CardPropertiesSchema,`,\n ];\n });\n return `const cardPropertiesSchemaByCardSetId: Record<string, z.ZodType<unknown>> = {\\n${entries.join(\"\\n\")}\\n};`;\n}\n\nfunction renderObjectSchemaSection(\n typeName: string,\n schemaName: string,\n schema: ObjectSchema | null | undefined,\n): string {\n return renderBlocks([\n `export type ${typeName} = ${renderTypeForObjectSchema(schema)};`,\n `export const ${schemaName} = ${renderZodForObjectSchema(schema)};`,\n ]);\n}\n\nfunction boardPrefix(boardId: string): string {\n return toPascalCase(boardId);\n}\n\nfunction boardFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}BoardFields`;\n}\n\nfunction boardSpaceFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}SpaceFields`;\n}\n\nfunction boardRelationFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}RelationFields`;\n}\n\nfunction boardContainerFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}ContainerFields`;\n}\n\nfunction hexEdgeFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}EdgeFields`;\n}\n\nfunction hexVertexFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}VertexFields`;\n}\n\nfunction pieceFieldsTypeName(typeId: string): string {\n return `${toPascalCase(typeId)}PieceFields`;\n}\n\nfunction dieFieldsTypeName(typeId: string): string {\n return `${toPascalCase(typeId)}DieFields`;\n}\n\nfunction renderTopologyFieldSections(analysis: ManifestAnalysis): string {\n const sections: string[] = [];\n\n for (const board of analysis.analyzedBoards) {\n sections.push(\n renderObjectSchemaSection(\n boardFieldsTypeName(board.board.id),\n `${boardFieldsTypeName(board.board.id)}Schema`,\n board.boardFieldsSchema,\n ),\n );\n sections.push(\n renderObjectSchemaSection(\n boardSpaceFieldsTypeName(board.board.id),\n `${boardSpaceFieldsTypeName(board.board.id)}Schema`,\n board.spaceFieldsSchema,\n ),\n );\n if (board.layout !== \"hex\") {\n sections.push(\n renderObjectSchemaSection(\n boardRelationFieldsTypeName(board.board.id),\n `${boardRelationFieldsTypeName(board.board.id)}Schema`,\n board.relationFieldsSchema,\n ),\n renderObjectSchemaSection(\n boardContainerFieldsTypeName(board.board.id),\n `${boardContainerFieldsTypeName(board.board.id)}Schema`,\n board.containerFieldsSchema,\n ),\n );\n }\n if (board.layout !== \"generic\") {\n sections.push(\n renderObjectSchemaSection(\n hexEdgeFieldsTypeName(board.board.id),\n `${hexEdgeFieldsTypeName(board.board.id)}Schema`,\n board.edgeFieldsSchema,\n ),\n renderObjectSchemaSection(\n hexVertexFieldsTypeName(board.board.id),\n `${hexVertexFieldsTypeName(board.board.id)}Schema`,\n board.vertexFieldsSchema,\n ),\n );\n }\n }\n\n for (const pieceTypeId of analysis.pieceTypeIds) {\n sections.push(\n renderObjectSchemaSection(\n pieceFieldsTypeName(pieceTypeId),\n `${pieceFieldsTypeName(pieceTypeId)}Schema`,\n analysis.pieceTypeSchemasById.get(pieceTypeId),\n ),\n );\n }\n\n for (const dieTypeId of analysis.dieTypeIds) {\n sections.push(\n renderObjectSchemaSection(\n dieFieldsTypeName(dieTypeId),\n `${dieFieldsTypeName(dieTypeId)}Schema`,\n analysis.dieTypeSchemasById.get(dieTypeId),\n ),\n );\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nfunction renderBoardFieldMapTypes(analysis: ManifestAnalysis): string {\n const boardEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${boardFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const spaceEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${boardSpaceFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const relationEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${\n board.layout === \"hex\"\n ? \"RuntimeRecord\"\n : boardRelationFieldsTypeName(board.board.id)\n };`,\n ),\n )\n .join(\"\\n\");\n const containerEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${\n board.layout === \"hex\"\n ? \"RuntimeRecord\"\n : boardContainerFieldsTypeName(board.board.id)\n };`,\n ),\n )\n .join(\"\\n\");\n const edgeEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const squareEdgeEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const tiledEdgeEntries = analysis.analyzedBoards\n .filter(\n (board): board is AnalyzedHexBoard | AnalyzedSquareBoard =>\n board.layout !== \"generic\",\n )\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const vertexEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const squareVertexEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const tiledVertexEntries = analysis.analyzedBoards\n .filter(\n (board): board is AnalyzedHexBoard | AnalyzedSquareBoard =>\n board.layout !== \"generic\",\n )\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const pieceEntries = analysis.pieceTypeIds\n .map((typeId) => ` ${quote(typeId)}: ${pieceFieldsTypeName(typeId)};`)\n .join(\"\\n\");\n const dieEntries = analysis.dieTypeIds\n .map((typeId) => ` ${quote(typeId)}: ${dieFieldsTypeName(typeId)};`)\n .join(\"\\n\");\n\n return renderBlocks([\n `export type BoardFieldsByBoardId = {\\n${boardEntries}\\n};`,\n `export type BoardSpaceFieldsByBoardId = {\\n${spaceEntries}\\n};`,\n `export type BoardRelationFieldsByBoardId = {\\n${relationEntries}\\n};`,\n `export type BoardContainerFieldsByBoardId = {\\n${containerEntries}\\n};`,\n `export type HexEdgeFieldsByBoardId = ${\n edgeEntries.length > 0 ? `{\\n${edgeEntries}\\n}` : \"Record<string, never>\"\n };`,\n `export type HexVertexFieldsByBoardId = ${\n vertexEntries.length > 0\n ? `{\\n${vertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type SquareEdgeFieldsByBoardId = ${\n squareEdgeEntries.length > 0\n ? `{\\n${squareEdgeEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type SquareVertexFieldsByBoardId = ${\n squareVertexEntries.length > 0\n ? `{\\n${squareVertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type TiledEdgeFieldsByBoardId = ${\n tiledEdgeEntries.length > 0\n ? `{\\n${tiledEdgeEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type TiledVertexFieldsByBoardId = ${\n tiledVertexEntries.length > 0\n ? `{\\n${tiledVertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type PieceFieldsByTypeId = ${\n pieceEntries.length > 0\n ? `{\\n${pieceEntries}\\n}`\n : \"Record<string, RuntimeRecord>\"\n };`,\n `export type DieFieldsByTypeId = ${\n dieEntries.length > 0\n ? `{\\n${dieEntries}\\n}`\n : \"Record<string, RuntimeRecord>\"\n };`,\n ]);\n}\n\nfunction renderCardStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.cardIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object(\n Object.fromEntries(\n literals.cardIds.map((cardId) => [cardId, createCardStateSchema(cardId)]),\n ) as Record<CardId, z.ZodType<unknown>>,\n)`;\n}\n\nfunction renderCardStateSchemaFactory(analysis: ManifestAnalysis): string {\n if (analysis.cardIds.length === 0) {\n return \"\";\n }\n\n return `function createCardStateSchema<CardIdValue extends CardId>(\n cardId: CardIdValue,\n): z.ZodType<CardStateById[CardIdValue]> {\n const cardSetId = literals.cardSetIdByCardId[cardId];\n const cardType = literals.cardTypeByCardId[cardId];\n const cardPropertiesSchema =\n cardPropertiesSchemaByCardSetId[cardSetId + \":\" + cardType] ??\n cardPropertiesSchemaByCardSetId[cardSetId] ??\n unknownRecordSchema;\n return assumeManifestSchema<CardStateById[CardIdValue]>(\n cardStateSchema.extend({\n id: z.literal(cardId),\n cardSetId: z.literal(cardSetId),\n cardType: z.literal(cardType),\n properties: cardPropertiesSchema,\n }),\n );\n}`;\n}\n\nfunction renderPieceStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.pieceIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.pieceIds\n .map((pieceId) => {\n const pieceTypeId = analysis.pieceTypeIdByPieceId.get(pieceId) ?? \"\";\n return ` ${quote(pieceId)}: z.object({\n componentType: z.string().optional(),\n id: z.literal(${quote(pieceId)}),\n pieceTypeId: z.literal(${quote(pieceTypeId)}),\n pieceName: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n properties: ${\n pieceTypeId\n ? `${pieceFieldsTypeName(pieceTypeId)}Schema`\n : \"unknownRecordSchema\"\n },\n }),`;\n })\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderDieStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.dieIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.dieIds\n .map((dieId) => {\n const dieTypeId = analysis.dieTypeIdByDieId.get(dieId) ?? \"\";\n const dieType = (analysis.manifest.dieTypes ?? []).find(\n (candidate) => candidate.id === dieTypeId,\n );\n return ` ${quote(dieId)}: z.object({\n componentType: z.string().optional(),\n id: z.literal(${quote(dieId)}),\n dieTypeId: z.literal(${quote(dieTypeId)}),\n dieName: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n sides: z.literal(${dieType?.sides ?? 6}),\n value: z.number().int().nullable().optional(),\n properties: ${\n dieTypeId\n ? `${dieFieldsTypeName(dieTypeId)}Schema`\n : \"unknownRecordSchema\"\n },\n }),`;\n })\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderGenericBoardStateSchema(\n board: AnalyzedGenericBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n const containerEntries = board.containers\n .map(\n (container) => `${quote(container.id)}: z.object({\n id: z.literal(${quote(container.id)}),\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: ${`${boardContainerFieldsTypeName(board.board.id)}Schema`},\n })`,\n )\n .join(\",\\n \");\n const renderedContainers = containerEntries\n ? `\\n ${containerEntries}\\n `\n : \"\";\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"generic\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: per-board state.spaces is loose-keyed by string. The\n // canonical narrow id (\\`ids.spaceId\\`) is a Zod enum of EVERY\n // space id across every board, which makes a strict\n // \\`z.record(enum, …)\\` reject any board whose spaces are a\n // proper subset of that enum. Loose keying matches the JSON wire\n // shape (\\`additionalProperties\\`); the inner \\`id: ids.spaceId\\`\n // narrows the value's spaceId at parse time. A future per-board\n // branded-id refactor (option B) can re-tighten this without a\n // wire change.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n 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: ${`${boardRelationFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n containers: z.object({${renderedContainers}}),\n })`;\n}\n\nfunction renderHexBoardStateSchema(\n board: AnalyzedHexBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"hex\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: see generic-board comment on the loose-keying choice.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n q: z.number().int(),\n r: z.number().int(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n z.object({\n id: z.string().nullable().optional(),\n typeId: z.literal(\"adjacent\"),\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: unknownRecordSchema,\n }),\n ),\n containers: z.object({}),\n orientation: z.enum([\"pointy-top\", \"flat-top\"]),\n edges: z.array(\n 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: ${`${hexEdgeFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n vertices: z.array(\n 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: ${`${hexVertexFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n })`;\n}\n\nfunction renderSquareBoardStateSchema(\n board: AnalyzedSquareBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n const containerEntries = board.containers\n .map(\n (container) => `${quote(container.id)}: z.object({\n id: z.literal(${quote(container.id)}),\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: ${`${boardContainerFieldsTypeName(board.board.id)}Schema`},\n })`,\n )\n .join(\",\\n \");\n const renderedContainers = containerEntries\n ? `\\n ${containerEntries}\\n `\n : \"\";\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"square\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: see generic-board comment on the loose-keying choice.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n row: z.number().int(),\n col: z.number().int(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n 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: ${`${boardRelationFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n containers: z.object({${renderedContainers}}),\n edges: z.array(\n 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: ${`${hexEdgeFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n vertices: z.array(\n 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: ${`${hexVertexFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n })`;\n}\n\nfunction renderBoardStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.boardIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n const schema =\n board.layout === \"hex\"\n ? renderHexBoardStateSchema(board, runtimeBoardId)\n : board.layout === \"square\"\n ? renderSquareBoardStateSchema(board, runtimeBoardId)\n : renderGenericBoardStateSchema(board, runtimeBoardId);\n return ` ${quote(runtimeBoardId)}: ${schema},`;\n }),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderHexBoardStateSchemaById(analysis: ManifestAnalysis): string {\n const hexBoards = analysis.analyzedBoards.filter(\n (board): board is AnalyzedHexBoard => board.layout === \"hex\",\n );\n if (hexBoards.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${hexBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${renderHexBoardStateSchema(\n board,\n runtimeBoardId,\n )},`,\n ),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderSquareBoardStateSchemaById(analysis: ManifestAnalysis): string {\n const squareBoards = analysis.analyzedBoards.filter(\n (board): board is AnalyzedSquareBoard => board.layout === \"square\",\n );\n if (squareBoards.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${squareBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${renderSquareBoardStateSchema(\n board,\n runtimeBoardId,\n )},`,\n ),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderBoardLiteralHelpers(analysis: ManifestAnalysis): string {\n const boardIdsByLayout = renderReadonlyArrayRecord(analysis.boardIdsByLayout);\n const boardBaseIdsByLayout = renderReadonlyArrayRecord(\n analysis.boardBaseIdsByLayout,\n );\n const boardIdsByBaseId = renderReadonlyArrayRecord(analysis.boardIdsByBaseId);\n const boardBaseIdsByTemplateId = renderReadonlyArrayRecord(\n analysis.boardBaseIdsByTemplateId,\n );\n const boardLayoutById = renderStringRecord(analysis.boardLayoutById);\n const boardTemplateLayoutById = renderStringRecord(\n analysis.boardTemplateLayoutById,\n );\n const boardIdsByTypeId = renderReadonlyArrayRecord(analysis.boardIdsByTypeId);\n const spaceIdsByBoardId = renderReadonlyArrayRecord(\n analysis.spaceIdsByBoardId,\n );\n const spaceTypeIdByBoardId = renderJsonConst(\n sortedObject(analysis.spaceTypeIdByBoardId),\n );\n const spaceIdsByTypeId = renderReadonlyArrayRecord(analysis.spaceIdsByTypeId);\n const containerIdsByBoardId = renderReadonlyArrayRecord(\n analysis.containerIdsByBoardId,\n );\n const containerHostByBoardId = renderJsonConst(\n sortedObject(analysis.containerHostByBoardId),\n );\n const relationTypeIdsByBoardId = renderReadonlyArrayRecord(\n analysis.relationTypeIdsByBoardId,\n );\n const edgeIdsByTypeId = renderReadonlyArrayRecord(analysis.edgeIdsByTypeId);\n const edgeIdsByBoardIdAndTypeId = renderJsonConst(\n sortedObject(analysis.edgeIdsByBoardIdAndTypeId),\n );\n const vertexIdsByTypeId = renderReadonlyArrayRecord(\n analysis.vertexIdsByTypeId,\n );\n const vertexIdsByBoardIdAndTypeId = renderJsonConst(\n sortedObject(analysis.vertexIdsByBoardIdAndTypeId),\n );\n const authoredHexEdgesByBoardId = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n board.authoredEdges.map((edge) => {\n const renderedSite: {\n ref: HexEdgeRef;\n typeId?: string;\n label?: string;\n fields: Record<string, unknown>;\n } = {\n ref: cloneJson(edge.ref),\n fields: {\n ...materializeObjectSchemaDefaults(\n board.edgeFieldsSchema,\n analysis,\n ),\n ...(edge.fields ?? {}),\n },\n };\n if (edge.typeId !== null && edge.typeId !== undefined) {\n renderedSite.typeId = edge.typeId;\n }\n if (edge.label !== null && edge.label !== undefined) {\n renderedSite.label = edge.label;\n }\n return renderedSite;\n }),\n ]),\n ),\n ),\n );\n const authoredHexVerticesByBoardId = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n board.authoredVertices.map((vertex) => {\n const renderedSite: {\n ref: HexVertexRef;\n typeId?: string;\n label?: string;\n fields: Record<string, unknown>;\n } = {\n ref: cloneJson(vertex.ref),\n fields: {\n ...materializeObjectSchemaDefaults(\n board.vertexFieldsSchema,\n analysis,\n ),\n ...(vertex.fields ?? {}),\n },\n };\n if (vertex.typeId !== null && vertex.typeId !== undefined) {\n renderedSite.typeId = vertex.typeId;\n }\n if (vertex.label !== null && vertex.label !== undefined) {\n renderedSite.label = vertex.label;\n }\n return renderedSite;\n }),\n ]),\n ),\n ),\n );\n const authoredHexEdgeIdsByBoardIdAndRef = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n sortedObject(\n board.authoredEdges.map((edge) => [\n boardSpaceRefKey(edge.ref.spaces),\n edge.id,\n ]),\n ),\n ]),\n ),\n ),\n );\n const authoredHexVertexIdsByBoardIdAndRef = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n sortedObject(\n board.authoredVertices.map((vertex) => [\n boardSpaceRefKey(vertex.ref.spaces),\n vertex.id,\n ]),\n ),\n ]),\n ),\n ),\n );\n // `perPlayerBoardIdsByBaseIdAndPlayerIdLookup` has been retired. The old\n // static lookup keyed on the max-players roster at generate time, which is\n // incompatible with the PerPlayer model where the runtime roster decides\n // which seats exist. `boardRefForPlayer(baseId, playerId)` now produces a\n // `PerPlayerBoardRef` at runtime using the active session's seats.\n\n return `const boardIdsByLayoutLookup = ${boardIdsByLayout};\nconst boardBaseIdsByLayoutLookup = ${boardBaseIdsByLayout};\nconst boardIdsByBaseIdLookup = ${boardIdsByBaseId};\nconst boardBaseIdsByTemplateIdLookup = ${boardBaseIdsByTemplateId};\nconst boardLayoutByIdLookup = ${boardLayoutById};\nconst boardTemplateLayoutByIdLookup = ${boardTemplateLayoutById};\nconst boardIdsByTypeIdLookup = ${boardIdsByTypeId};\nconst spaceIdsByBoardIdLookup = ${spaceIdsByBoardId};\nconst spaceTypeIdByBoardIdLookup = ${spaceTypeIdByBoardId};\nconst spaceIdsByTypeIdLookup = ${spaceIdsByTypeId};\nconst containerIdsByBoardIdLookup = ${containerIdsByBoardId};\nconst containerHostByBoardIdLookup = ${containerHostByBoardId};\nconst relationTypeIdsByBoardIdLookup = ${relationTypeIdsByBoardId};\nconst edgeIdsByTypeIdLookup = ${edgeIdsByTypeId};\nconst edgeIdsByBoardIdAndTypeIdLookup = ${edgeIdsByBoardIdAndTypeId};\nconst vertexIdsByTypeIdLookup = ${vertexIdsByTypeId};\nconst vertexIdsByBoardIdAndTypeIdLookup = ${vertexIdsByBoardIdAndTypeId};\nconst authoredHexEdgesByBoardIdLookup = ${authoredHexEdgesByBoardId};\nconst authoredHexVerticesByBoardIdLookup = ${authoredHexVerticesByBoardId};\nconst authoredHexEdgeIdsByBoardIdAndRefLookup = ${authoredHexEdgeIdsByBoardIdAndRef};\nconst authoredHexVertexIdsByBoardIdAndRefLookup = ${authoredHexVertexIdsByBoardIdAndRef};\n\nfunction authoredHexRefKey(spaceIds: readonly string[]): string {\n return [...spaceIds]\n .sort((left, right) => left.localeCompare(right))\n .join(\"$$\");\n}\n\ntype BoardLookupIdValue<\n Lookup extends Record<string, Record<string, readonly string[]>>,\n Key extends keyof Lookup,\n> = Extract<Lookup[Key][keyof Lookup[Key]], readonly string[]>[number];\n\nfunction flattenBoardScopedIds<\n Lookup extends Record<string, Record<string, readonly string[]>>,\n Key extends keyof Lookup,\n>(lookup: Lookup, key: Key): ReadonlyArray<BoardLookupIdValue<Lookup, Key>> {\n return Object.values(lookup[key] ?? {}).flat() as ReadonlyArray<\n BoardLookupIdValue<Lookup, Key>\n >;\n}\n\nexport const boardHelpers = {\n boardIdsForLayout<\n LayoutValue extends keyof typeof boardIdsByLayoutLookup,\n >(layout: LayoutValue): (typeof boardIdsByLayoutLookup)[LayoutValue] {\n return boardIdsByLayoutLookup[layout];\n },\n boardBaseIdsForLayout<\n LayoutValue extends keyof typeof boardBaseIdsByLayoutLookup,\n >(layout: LayoutValue): (typeof boardBaseIdsByLayoutLookup)[LayoutValue] {\n return boardBaseIdsByLayoutLookup[layout];\n },\n boardIdsForBase<\n BoardBaseIdValue extends keyof typeof boardIdsByBaseIdLookup,\n >(\n boardBaseId: BoardBaseIdValue,\n ): (typeof boardIdsByBaseIdLookup)[BoardBaseIdValue] {\n return boardIdsByBaseIdLookup[boardBaseId];\n },\n boardBaseIdsForTemplate<\n TemplateIdValue extends keyof typeof boardBaseIdsByTemplateIdLookup,\n >(\n templateId: TemplateIdValue,\n ): (typeof boardBaseIdsByTemplateIdLookup)[TemplateIdValue] {\n return boardBaseIdsByTemplateIdLookup[templateId];\n },\n boardIdsForType<TypeIdValue extends keyof typeof boardIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof boardIdsByTypeIdLookup)[TypeIdValue] {\n return boardIdsByTypeIdLookup[typeId];\n },\n boardLayout<BoardIdValue extends keyof typeof boardLayoutByIdLookup>(\n boardId: BoardIdValue,\n ): (typeof boardLayoutByIdLookup)[BoardIdValue] {\n return boardLayoutByIdLookup[boardId];\n },\n boardTemplateLayout<\n TemplateIdValue extends keyof typeof boardTemplateLayoutByIdLookup,\n >(\n templateId: TemplateIdValue,\n ): (typeof boardTemplateLayoutByIdLookup)[TemplateIdValue] {\n return boardTemplateLayoutByIdLookup[templateId];\n },\n spaceIds<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof spaceIdsByBoardIdLookup)[BoardIdValue] {\n return spaceIdsByBoardIdLookup[boardId];\n },\n spaceRecord<\n BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n spaceId: (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<(typeof spaceIdsByBoardIdLookup)[BoardIdValue][number], Value> {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n if (!spaceIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(spaceIds, initial) as Record<\n (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isSpaceId<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number] {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n return spaceIds ? isTypedId(spaceIds, value) : false;\n },\n expectSpaceId<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number] {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n if (!spaceIds || !isTypedId(spaceIds, value)) {\n throw new Error(\n \\`Unknown space id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number];\n },\n spaceKinds<BoardIdValue extends keyof typeof spaceTypeIdByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof spaceTypeIdByBoardIdLookup)[BoardIdValue] {\n return spaceTypeIdByBoardIdLookup[boardId];\n },\n spaceIdsForType<TypeIdValue extends keyof typeof spaceIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof spaceIdsByTypeIdLookup)[TypeIdValue] {\n return spaceIdsByTypeIdLookup[typeId];\n },\n containerIds<BoardIdValue extends keyof typeof containerIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof containerIdsByBoardIdLookup)[BoardIdValue] {\n return containerIdsByBoardIdLookup[boardId];\n },\n containerRecord<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n containerId: (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<\n (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n > {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n if (!containerIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(containerIds, initial) as Record<\n (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isContainerId<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof containerIdsByBoardIdLookup)[BoardIdValue][number] {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n return containerIds ? isTypedId(containerIds, value) : false;\n },\n expectContainerId<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): (typeof containerIdsByBoardIdLookup)[BoardIdValue][number] {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n if (!containerIds || !isTypedId(containerIds, value)) {\n throw new Error(\n \\`Unknown container id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof containerIdsByBoardIdLookup)[BoardIdValue][number];\n },\n containerHost<\n BoardIdValue extends keyof typeof containerHostByBoardIdLookup,\n ContainerIdValue extends keyof (typeof containerHostByBoardIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n containerId: ContainerIdValue,\n ): (typeof containerHostByBoardIdLookup)[BoardIdValue][ContainerIdValue] {\n const containers = containerHostByBoardIdLookup[boardId];\n const containerHost = containers?.[containerId];\n if (!containerHost) {\n throw new Error(\n \\`Unknown container '\\${String(containerId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return containerHost as (typeof containerHostByBoardIdLookup)[BoardIdValue][ContainerIdValue];\n },\n relationTypeIds<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue] {\n return relationTypeIdsByBoardIdLookup[boardId];\n },\n relationTypeRecord<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n relationTypeId: (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<\n (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n > {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n if (!relationTypeIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(relationTypeIds, initial) as Record<\n (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isRelationTypeId<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number] {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n return relationTypeIds ? isTypedId(relationTypeIds, value) : false;\n },\n expectRelationTypeId<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number] {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n if (!relationTypeIds || !isTypedId(relationTypeIds, value)) {\n throw new Error(\n \\`Unknown relation type id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number];\n },\n authoredHexEdges<\n BoardIdValue extends keyof typeof authoredHexEdgesByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof authoredHexEdgesByBoardIdLookup)[BoardIdValue] {\n const authoredHexEdges = authoredHexEdgesByBoardIdLookup[boardId];\n if (!authoredHexEdges) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n return authoredHexEdges;\n },\n authoredHexVertices<\n BoardIdValue extends keyof typeof authoredHexVerticesByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof authoredHexVerticesByBoardIdLookup)[BoardIdValue] {\n const authoredHexVertices = authoredHexVerticesByBoardIdLookup[boardId];\n if (!authoredHexVertices) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n return authoredHexVertices;\n },\n resolveHexEdgeId<\n BoardIdValue extends keyof typeof authoredHexEdgeIdsByBoardIdAndRefLookup,\n >(\n boardId: BoardIdValue,\n ref: HexAuthoredEdgeRef<BoardIdValue>,\n ): HexEdgeState<BoardIdValue>[\"id\"] {\n const boardEdges = authoredHexEdgeIdsByBoardIdAndRefLookup[boardId];\n if (!boardEdges) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n const edgeRef = ref as { spaces: readonly string[] };\n const edgeId = (boardEdges as Record<string, HexEdgeState<BoardIdValue>[\"id\"]>)[\n authoredHexRefKey(edgeRef.spaces)\n ];\n if (!edgeId) {\n throw new Error(\n \\`Unknown authored hex edge ref '\\${edgeRef.spaces.join(\", \")}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return edgeId as HexEdgeState<BoardIdValue>[\"id\"];\n },\n resolveHexVertexId<\n BoardIdValue extends keyof typeof authoredHexVertexIdsByBoardIdAndRefLookup,\n >(\n boardId: BoardIdValue,\n ref: HexAuthoredVertexRef<BoardIdValue>,\n ): HexVertexState<BoardIdValue>[\"id\"] {\n const boardVertices = authoredHexVertexIdsByBoardIdAndRefLookup[boardId];\n if (!boardVertices) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n const vertexRef = ref as { spaces: readonly string[] };\n const vertexId = (\n boardVertices as Record<string, HexVertexState<BoardIdValue>[\"id\"]>\n )[authoredHexRefKey(vertexRef.spaces)];\n if (!vertexId) {\n throw new Error(\n \\`Unknown authored hex vertex ref '\\${vertexRef.spaces.join(\", \")}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return vertexId as HexVertexState<BoardIdValue>[\"id\"];\n },\n edgeIdsForType<TypeIdValue extends keyof typeof edgeIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof edgeIdsByTypeIdLookup)[TypeIdValue] {\n return edgeIdsByTypeIdLookup[typeId];\n },\n edgeRecord<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n edgeId: BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >,\n ) => Value),\n ): Record<\n BoardLookupIdValue<typeof edgeIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!edgeIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(edgeIds, initial) as Record<\n BoardLookupIdValue<typeof edgeIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n >;\n },\n isEdgeId<BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): value is BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n return edgeIds ? isTypedId(edgeIds, value) : false;\n },\n expectEdgeId<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!edgeIds || !isTypedId(edgeIds, value)) {\n throw new Error(\n \\`Unknown edge id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >;\n },\n edgeIds<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n TypeIdValue extends keyof (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n typeId: TypeIdValue,\n ): (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue] {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges?.[typeId];\n if (!edgeIds) {\n throw new Error(\n \\`Unknown edge type '\\${String(typeId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return edgeIds as (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue];\n },\n vertexIdsForType<TypeIdValue extends keyof typeof vertexIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof vertexIdsByTypeIdLookup)[TypeIdValue] {\n return vertexIdsByTypeIdLookup[typeId];\n },\n vertexRecord<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n vertexId: BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >,\n ) => Value),\n ): Record<\n BoardLookupIdValue<typeof vertexIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!vertexIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(vertexIds, initial) as Record<\n BoardLookupIdValue<typeof vertexIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n >;\n },\n isVertexId<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n return vertexIds ? isTypedId(vertexIds, value) : false;\n },\n expectVertexId<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!vertexIds || !isTypedId(vertexIds, value)) {\n throw new Error(\n \\`Unknown vertex id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >;\n },\n vertexIds<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n TypeIdValue extends keyof (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n typeId: TypeIdValue,\n ): (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue] {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices?.[typeId];\n if (!vertexIds) {\n throw new Error(\n \\`Unknown vertex type '\\${String(typeId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return vertexIds as (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue];\n },\n // Returns a \\`BoardRef\\` describing a per-player board scoped to the supplied\n // seat. The old \\`boardIdForPlayer\\` returned a concrete runtime-board-id\n // string, which encoded the \"one board per maxPlayers seat\" assumption in\n // static data. Under the PerPlayer model the runtime roster is not known at\n // generate time, so consumers deal with \\`BoardRef\\` and let the runtime\n // resolve the actual owner seat.\n boardRefForPlayer(\n boardBaseId: BoardBaseId,\n playerId: PlayerId,\n ): PerPlayerBoardRef<BoardBaseId, PlayerId> {\n return boardRef(boardBaseId, playerId) as PerPlayerBoardRef<\n BoardBaseId,\n PlayerId\n >;\n },\n sharedBoardRef(\n boardBaseId: BoardBaseId,\n ): SharedBoardRef<BoardBaseId> {\n return boardRef(boardBaseId) as SharedBoardRef<BoardBaseId>;\n },\n} as const;`;\n}\n\nfunction renderManifestContractSource(manifest: GameTopologyManifest): string {\n const analysis = analyzeManifest(manifest);\n const initialTableTemplate = materializeManifestTable({\n manifest,\n playerIds: analysis.playerIds,\n shuffleItems: <Value>(values: readonly Value[]) => [...values],\n });\n const initialTableBoards = (\n initialTableTemplate as {\n boards: {\n byId: unknown;\n hex: unknown;\n square: unknown;\n };\n }\n ).boards;\n const staticBoardsTemplate = createManifestStaticBoardsData({\n boards: initialTableBoards,\n });\n const sharedZoneIds = analysis.sharedZones.map((zone) => zone.id).sort();\n const playerZoneIds = analysis.playerZones.map((zone) => zone.id).sort();\n const zoneVisibilityById = Object.fromEntries(\n Array.from(analysis.zoneVisibilityById.entries()).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n\n const emptySharedZonesTemplate = Object.fromEntries(\n sharedZoneIds.map((zoneId) => [zoneId, []]),\n );\n const defaultVisibilityTemplate = Object.fromEntries(\n analysis.cardIds.map((cardId) => [cardId, { faceUp: true }]),\n );\n const defaultOwnerTemplate = Object.fromEntries(\n analysis.cardIds.map((cardId) => [cardId, null]),\n );\n const cardIdsByCardSetId = new Map<string, string[]>();\n for (const cardId of analysis.cardIds) {\n const cardSetId = analysis.cardSetIdByCardId.get(cardId);\n if (!cardSetId) {\n continue;\n }\n const cardIds = cardIdsByCardSetId.get(cardSetId) ?? [];\n cardIds.push(cardId);\n cardIdsByCardSetId.set(cardSetId, cardIds);\n }\n const renderZoneCardIdArrayType = (cardSetIds: readonly string[]) =>\n `Array<${renderStringUnion(\n cardSetIds.flatMap(\n (cardSetId) => cardIdsByCardSetId.get(cardSetId) ?? [],\n ),\n )}>`;\n const sharedZoneCardIdEntries = sharedZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.sharedZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: ${renderZoneCardIdArrayType(allowedCardSetIds)};`;\n })\n .join(\"\\n\");\n const playerZoneCardIdEntries = playerZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.playerZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: PerPlayer<${renderZoneCardIdArrayType(allowedCardSetIds)}>;`;\n })\n .join(\"\\n\");\n\n const cardSetById = new Map(\n analysis.cardSets.map((cardSet) => [cardSet.id, cardSet] as const),\n );\n\n const perCardStateEntries = analysis.cardIds\n .map((cardId) => {\n const cardSetId = analysis.cardSetIdByCardId.get(cardId) ?? \"\";\n const cardType = analysis.cardTypeByCardId.get(cardId) ?? cardId;\n const cardSet = cardSetById.get(cardSetId);\n const propertiesType = cardSet\n ? cardPropertiesTypeName(cardSet, cardType)\n : cardSetId\n ? `${toPascalCase(cardSetId)}CardProperties`\n : \"RuntimeRecord\";\n return ` ${quote(cardId)}: CardStateRecord<${quote(cardId)}, ${quote(\n cardSetId,\n )}, ${quote(cardType)}, ${propertiesType}>;`;\n })\n .join(\"\\n\");\n const perPieceStateEntries = analysis.pieceIds\n .map((pieceId) => {\n const pieceTypeId = analysis.pieceTypeIdByPieceId.get(pieceId) ?? \"\";\n return ` ${quote(pieceId)}: PieceStateRecord<${quote(pieceId)}, ${quote(\n pieceTypeId,\n )}, ${\n pieceTypeId ? pieceFieldsTypeName(pieceTypeId) : \"RuntimeRecord\"\n }>;`;\n })\n .join(\"\\n\");\n const perDieStateEntries = analysis.dieIds\n .map((dieId) => {\n const dieTypeId = analysis.dieTypeIdByDieId.get(dieId) ?? \"\";\n return ` ${quote(dieId)}: DieStateRecord<${quote(dieId)}, ${quote(\n dieTypeId,\n )}, ${dieTypeId ? dieFieldsTypeName(dieTypeId) : \"RuntimeRecord\"}>;`;\n })\n .join(\"\\n\");\n const perBoardStateEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n if (board.layout === \"hex\") {\n return ` ${quote(runtimeBoardId)}: HexBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.edges.map((edge) => edge.id),\n )}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(\n board.board.id,\n )}>;`;\n }\n if (board.layout === \"square\") {\n return ` ${quote(runtimeBoardId)}: SquareBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${renderStringUnion(\n board.edges.map((edge) => edge.id),\n )}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(\n board.board.id,\n )}, ${boardContainerFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(\n board.board.id,\n )}>;`;\n }\n\n return ` ${quote(runtimeBoardId)}: GenericBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(\n board.board.id,\n )}, ${boardContainerFieldsTypeName(board.board.id)}>;`;\n }),\n )\n .join(\"\\n\");\n const perHexBoardStateEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: BoardStateById[${quote(\n runtimeBoardId,\n )}];`,\n ),\n )\n .join(\"\\n\");\n const perSquareBoardStateEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: BoardStateById[${quote(\n runtimeBoardId,\n )}];`,\n ),\n )\n .join(\"\\n\");\n\n return `/**\n * Generated file.\n * Do not edit directly.\n */\n\nimport { z } from \"zod\";\nimport {\n buildTypedRecord,\n expectTypedId,\n isTypedId,\n} from \"@dreamboard-games/sdk/types\";\nimport {\n asPlayerId,\n boardRef,\n boardRefKey,\n boardRefSchema,\n perPlayer,\n perPlayerEntries,\n perPlayerGet,\n perPlayerHas,\n perPlayerKeys,\n perPlayerSchema,\n type BoardRef,\n type PerPlayer,\n type PerPlayerBoardRef,\n type PlayerId,\n type SharedBoardRef,\n} from \"@dreamboard-games/sdk/reducer\";\nimport {\n assumeManifestSchema,\n cloneManifestDefault,\n createManifestGameStateSchema,\n createManifestRuntimeSchema,\n createManifestStringLiteralSchema,\n dealToPlayerBoardContainer as createDealToPlayerBoardContainerStep,\n dealToPlayerZone as createDealToPlayerZoneStep,\n markManifestScopedSchema,\n resolveManifestPlayerIds,\n seedSharedBoardContainer as createSeedSharedBoardContainerStep,\n seedSharedBoardSpace as createSeedSharedBoardSpaceStep,\n shuffle as createShuffleStep,\n type CardIdOfManifest,\n type DieIdOfManifest,\n type PieceIdOfManifest,\n type ReducerManifestContract,\n type RuntimeCardData,\n type RuntimeCardVisibility,\n type RuntimeComponentLocation,\n type RuntimeDieData,\n type RuntimeHandVisibilityMode,\n type RuntimePieceData,\n type RuntimeRecord,\n type RuntimeTableRecord,\n type SetupBootstrapContainerRef,\n type SetupBootstrapDestinationRef,\n type SetupBootstrapPerPlayerContainerTemplateRef,\n type SetupBootstrapStep,\n type SetupProfileDefinition,\n type StaticBoards,\n} from \"@dreamboard-games/sdk/reducer/advanced\";\n\nconst unknownRecordSchema = assumeManifestSchema<RuntimeRecord>(\n z.record(z.string(), z.unknown()),\n);\n\nfunction resolveDefaultPlayerIds(\n playerIds: readonly string[] | undefined,\n): readonly PlayerId[] {\n return resolveManifestPlayerIds(\n literals.playerIds as unknown as readonly PlayerId[],\n playerIds,\n );\n}\n\nexport const literals = {\n // literals satisfy \\`ManifestLiterals<PlayerId, ...>\\`. The cast is safe\n // because the runtime values are the exact player-id strings the manifest\n // authored; branding is purely a type-level discipline.\n playerIds: ${renderConstArray(analysis.playerIds)} as unknown as readonly PlayerId[],\n phaseNames: [] as readonly string[],\n boardLayouts: [\"generic\", \"hex\", \"square\"] as const,\n setupOptionIds: ${renderConstArray(analysis.setupOptionIds)},\n setupProfileIds: ${renderConstArray(analysis.setupProfileIds)},\n cardSetIds: ${renderConstArray(analysis.cardSetIds)},\n cardTypes: ${renderConstArray(analysis.cardTypes)},\n cardIds: ${renderConstArray(analysis.cardIds)},\n deckIds: ${renderConstArray(sharedZoneIds)},\n handIds: ${renderConstArray(playerZoneIds)},\n sharedZoneIds: ${renderConstArray(sharedZoneIds)},\n playerZoneIds: ${renderConstArray(playerZoneIds)},\n zoneIds: ${renderConstArray(analysis.zoneIds)},\n resourceIds: ${renderConstArray(analysis.resourceIds)},\n resourcePresentationById: ${renderJsonConst(analysis.resourcePresentationById)},\n pieceTypeIds: ${renderConstArray(analysis.pieceTypeIds)},\n pieceIds: ${renderConstArray(analysis.pieceIds)},\n dieTypeIds: ${renderConstArray(analysis.dieTypeIds)},\n dieIds: ${renderConstArray(analysis.dieIds)},\n boardTemplateIds: ${renderConstArray(analysis.boardTemplateIds)},\n boardTypeIds: ${renderConstArray(analysis.boardTypeIds)},\n boardBaseIds: ${renderConstArray(analysis.boardBaseIds)},\n boardIds: ${renderConstArray(analysis.boardIds)},\n boardContainerIds: ${renderConstArray(analysis.boardContainerIds)},\n relationTypeIds: ${renderConstArray(analysis.relationTypeIds)},\n edgeIds: ${renderConstArray(analysis.edgeIds)},\n edgeTypeIds: ${renderConstArray(analysis.edgeTypeIds)},\n vertexIds: ${renderConstArray(analysis.vertexIds)},\n vertexTypeIds: ${renderConstArray(analysis.vertexTypeIds)},\n spaceIds: ${renderConstArray(analysis.spaceIds)},\n spaceTypeIds: ${renderConstArray(analysis.spaceTypeIds)},\n handVisibilityById: ${renderStringRecord(\n playerZoneIds.map(\n (zoneId) => [zoneId, zoneVisibilityById[zoneId] ?? \"ownerOnly\"] as const,\n ),\n )},\n zoneVisibilityById: ${renderStringRecord(analysis.zoneVisibilityById)},\n cardSetIdByCardId: ${renderStringRecord(analysis.cardSetIdByCardId)},\n cardTypeByCardId: ${renderStringRecord(analysis.cardTypeByCardId)},\n setupChoiceIdsByOptionId: ${renderReadonlyArrayRecord(\n analysis.setupChoiceIdsByOptionId,\n )},\n cardSetIdsBySharedZoneId: ${renderReadonlyArrayRecord(\n analysis.sharedZoneCardSetIds,\n )},\n sharedZoneIdsByCardSetId: ${renderReadonlyArrayRecord(\n analysis.sharedZoneIdsByCardSetId,\n )},\n homeSharedZoneIdsByCardType: ${renderReadonlyArrayRecord(\n analysis.homeSharedZoneIdsByCardType,\n )},\n homeSharedZoneIdByCardType: ${renderStringRecord(\n analysis.homeSharedZoneIdByCardType,\n )},\n cardSetIdsByPlayerZoneId: ${renderReadonlyArrayRecord(\n analysis.playerZoneCardSetIds,\n )},\n} as const;\n\n// PlayerId is an opaque brand imported from @dreamboard-games/sdk/reducer.\n// We intentionally do NOT enumerate the manifest's max-players roster here:\n// the runtime session may have fewer active seats than the manifest declares,\n// and requiring ingress to pick a literal from the max-players set reintroduces\n// the \"total-record\" assumption the refactor is meant to eliminate. Runtime\n// roster validation is done through perPlayerSchema(runtimePlayerIds, ...)\n// instead, which can be bound to the actual active roster.\nconst playerIdSchema = markManifestScopedSchema(\n z\n .string()\n .min(1)\n .transform((value) => asPlayerId(value)),\n \"playerId\",\n);\nconst phaseNameSchema = markManifestScopedSchema(z.string(), \"phaseName\");\nconst boardLayoutSchema = createManifestStringLiteralSchema(\n literals.boardLayouts,\n \"boardLayout\",\n);\nconst setupOptionIdSchema = createManifestStringLiteralSchema(\n literals.setupOptionIds,\n \"setupOptionId\",\n);\nconst setupProfileIdSchema = createManifestStringLiteralSchema(\n literals.setupProfileIds,\n \"setupProfileId\",\n);\nconst cardSetIdSchema = createManifestStringLiteralSchema(\n literals.cardSetIds,\n \"cardSetId\",\n);\nconst cardTypeSchema = createManifestStringLiteralSchema(\n literals.cardTypes,\n \"cardType\",\n);\nconst cardIdSchema = createManifestStringLiteralSchema(\n literals.cardIds,\n \"cardId\",\n);\nconst deckIdSchema = createManifestStringLiteralSchema(\n literals.deckIds,\n \"deckId\",\n);\nconst handIdSchema = createManifestStringLiteralSchema(\n literals.handIds,\n \"handId\",\n);\nconst sharedZoneIdSchema = createManifestStringLiteralSchema(\n literals.sharedZoneIds,\n \"sharedZoneId\",\n);\nconst playerZoneIdSchema = createManifestStringLiteralSchema(\n literals.playerZoneIds,\n \"playerZoneId\",\n);\nconst zoneIdSchema = createManifestStringLiteralSchema(\n literals.zoneIds,\n \"zoneId\",\n);\nconst resourceIdSchema = createManifestStringLiteralSchema(\n literals.resourceIds,\n \"resourceId\",\n);\nconst pieceTypeIdSchema = createManifestStringLiteralSchema(\n literals.pieceTypeIds,\n \"pieceTypeId\",\n);\nconst pieceIdSchema = createManifestStringLiteralSchema(\n literals.pieceIds,\n \"pieceId\",\n);\nconst dieTypeIdSchema = createManifestStringLiteralSchema(\n literals.dieTypeIds,\n \"dieTypeId\",\n);\nconst dieIdSchema = createManifestStringLiteralSchema(\n literals.dieIds,\n \"dieId\",\n);\nconst boardTypeIdSchema = createManifestStringLiteralSchema(\n literals.boardTypeIds,\n \"boardTypeId\",\n);\nconst boardBaseIdSchema = createManifestStringLiteralSchema(\n literals.boardBaseIds,\n \"boardBaseId\",\n);\nconst boardIdSchema = createManifestStringLiteralSchema(\n literals.boardIds,\n \"boardId\",\n);\nconst boardContainerIdSchema = createManifestStringLiteralSchema(\n literals.boardContainerIds,\n \"boardContainerId\",\n);\nconst relationTypeIdSchema = createManifestStringLiteralSchema(\n literals.relationTypeIds,\n \"relationTypeId\",\n);\nconst edgeIdSchema = createManifestStringLiteralSchema(\n literals.edgeIds,\n \"edgeId\",\n);\nconst edgeTypeIdSchema = createManifestStringLiteralSchema(\n literals.edgeTypeIds,\n \"edgeTypeId\",\n);\nconst vertexIdSchema = createManifestStringLiteralSchema(\n literals.vertexIds,\n \"vertexId\",\n);\nconst vertexTypeIdSchema = createManifestStringLiteralSchema(\n literals.vertexTypeIds,\n \"vertexTypeId\",\n);\nconst spaceIdSchema = createManifestStringLiteralSchema(\n literals.spaceIds,\n \"spaceId\",\n);\nconst spaceTypeIdSchema = createManifestStringLiteralSchema(\n literals.spaceTypeIds,\n \"spaceTypeId\",\n);\n\nexport const ids = {\n playerId: playerIdSchema,\n phaseName: phaseNameSchema,\n boardLayout: boardLayoutSchema,\n setupOptionId: setupOptionIdSchema,\n setupProfileId: setupProfileIdSchema,\n cardSetId: cardSetIdSchema,\n cardType: cardTypeSchema,\n cardId: cardIdSchema as unknown as typeof cardIdSchema & z.ZodType<CardId>,\n deckId: deckIdSchema as unknown as typeof deckIdSchema & z.ZodType<DeckId>,\n handId: handIdSchema as unknown as typeof handIdSchema & z.ZodType<HandId>,\n sharedZoneId: sharedZoneIdSchema,\n playerZoneId: playerZoneIdSchema,\n zoneId: zoneIdSchema,\n resourceId: resourceIdSchema,\n pieceTypeId: pieceTypeIdSchema,\n pieceId: pieceIdSchema,\n dieTypeId: dieTypeIdSchema,\n dieId: dieIdSchema,\n boardTypeId: boardTypeIdSchema,\n boardBaseId: boardBaseIdSchema,\n boardId: boardIdSchema,\n boardContainerId: boardContainerIdSchema,\n relationTypeId: relationTypeIdSchema,\n edgeId: edgeIdSchema,\n edgeTypeId: edgeTypeIdSchema,\n vertexId: vertexIdSchema,\n vertexTypeId: vertexTypeIdSchema,\n spaceId: spaceIdSchema,\n spaceTypeId: spaceTypeIdSchema,\n} as const;\n\nexport type { PlayerId };\nexport type PhaseName = string;\nexport type BoardLayout = (typeof literals.boardLayouts)[number];\nexport type SetupOptionId = (typeof literals.setupOptionIds)[number];\nexport type SetupProfileId = (typeof literals.setupProfileIds)[number];\nexport type CardSetId = (typeof literals.cardSetIds)[number];\nexport type CardType = (typeof literals.cardTypes)[number];\nexport type CardId = (typeof literals.cardIds)[number];\nexport type DeckId = (typeof literals.deckIds)[number];\nexport type HandId = (typeof literals.handIds)[number];\nexport type SharedZoneId = (typeof literals.sharedZoneIds)[number];\nexport type PlayerZoneId = (typeof literals.playerZoneIds)[number];\nexport type ZoneId = (typeof literals.zoneIds)[number];\nexport type ResourceId = (typeof literals.resourceIds)[number];\nexport type PieceTypeId = (typeof literals.pieceTypeIds)[number];\nexport type PieceId = (typeof literals.pieceIds)[number];\nexport type DieTypeId = (typeof literals.dieTypeIds)[number];\nexport type DieId = (typeof literals.dieIds)[number];\nexport type BoardTypeId = (typeof literals.boardTypeIds)[number];\nexport type BoardBaseId = (typeof literals.boardBaseIds)[number];\nexport type BoardId = (typeof literals.boardIds)[number];\nexport type BoardContainerId = (typeof literals.boardContainerIds)[number];\nexport type RelationTypeId = (typeof literals.relationTypeIds)[number];\nexport type EdgeId = (typeof literals.edgeIds)[number];\nexport type EdgeTypeId = (typeof literals.edgeTypeIds)[number];\nexport type VertexId = (typeof literals.vertexIds)[number];\nexport type VertexTypeId = (typeof literals.vertexTypeIds)[number];\nexport type SpaceId = (typeof literals.spaceIds)[number];\nexport type SpaceTypeId = (typeof literals.spaceTypeIds)[number];\n\n${renderGeneratedIdHandles(analysis)}\n\n${renderGeneratedRecordsHelpers()}\n\n${renderGeneratedIdGuards()}\n\n// Historically this emitted PlayerRecord<T> = Record<PlayerId, T>, but that\n// type reified the \"total roster\" assumption (one entry per max-player). It has\n// been replaced throughout the generated contract with PerPlayer<T> from\n// @dreamboard-games/sdk/reducer, whose entries array matches the\n// actual runtime seat list.\nexport type SharedZoneRecord<T> = Record<SharedZoneId, T>;\nexport type PlayerZoneRecord<T> = Record<PlayerZoneId, PerPlayer<T>>;\nexport type ComponentId = CardId | PieceId | DieId;\nexport type ComponentIdsBySharedZoneId = {\n${sharedZoneIds.map((zoneId) => ` ${quote(zoneId)}: ComponentId[];`).join(\"\\n\")}\n};\nexport type ComponentIdsByPlayerZoneId = {\n${playerZoneIds.map((zoneId) => ` ${quote(zoneId)}: PerPlayer<ComponentId[]>;`).join(\"\\n\")}\n};\nexport type SetupOptionChoice = {\n id: string;\n label: string;\n description?: string | null;\n};\nexport type SetupOption = {\n id: SetupOptionId;\n name: string;\n description?: string | null;\n choices: readonly SetupOptionChoice[];\n};\nexport type SetupProfile = {\n id: SetupProfileId;\n name: string;\n description?: string | null;\n optionValues?: Partial<Record<SetupOptionId, string>> | null;\n};\nexport const setupOptionsById = ${renderJsonConst(analysis.setupOptionsById)};\nexport const setupChoiceIdsByOptionId = ${renderReadonlyArrayRecord(\n analysis.setupChoiceIdsByOptionId,\n )};\nexport const setupProfilesById = ${renderJsonConst(analysis.setupProfilesById)};\n\n${renderCardSetPropertySections(analysis.cardSets)}\n\n${renderTopologyFieldSections(analysis)}\n\n${renderBoardFieldMapTypes(analysis)}\n\nexport type CardProperties = ${\n analysis.cardSets.length > 0\n ? analysis.cardSets\n .map((cardSet) => `${toPascalCase(cardSet.id)}CardProperties`)\n .join(\" | \")\n : \"RuntimeRecord\"\n };\n\nexport type CardStateRecord<\n CardIdValue extends CardId = CardId,\n CardSetIdValue extends CardSetId = CardSetId,\n CardTypeValue extends CardType = CardType,\n Properties = RuntimeRecord,\n> = Omit<RuntimeCardData, \"id\" | \"cardSetId\" | \"cardType\" | \"properties\"> & {\n id: CardIdValue;\n cardSetId: CardSetIdValue;\n cardType: CardTypeValue;\n properties: Properties;\n};\n\nexport type CardStateById = ${\n perCardStateEntries.length > 0\n ? `{\\n${perCardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type PieceStateRecord<\n PieceIdValue extends PieceId = PieceId,\n PieceTypeIdValue extends PieceTypeId = PieceTypeId,\n Fields = RuntimeRecord,\n> = Omit<RuntimePieceData, \"id\" | \"pieceTypeId\" | \"properties\"> & {\n id: PieceIdValue;\n pieceTypeId: PieceTypeIdValue;\n properties: Fields;\n};\n\nexport type DieStateRecord<\n DieIdValue extends DieId = DieId,\n DieTypeIdValue extends DieTypeId = DieTypeId,\n Fields = RuntimeRecord,\n> = Omit<RuntimeDieData, \"id\" | \"dieTypeId\" | \"properties\"> & {\n id: DieIdValue;\n dieTypeId: DieTypeIdValue;\n properties: Fields;\n};\n\nexport type PieceStateById = ${\n perPieceStateEntries.length > 0\n ? `{\\n${perPieceStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type DieStateById = ${\n perDieStateEntries.length > 0\n ? `{\\n${perDieStateEntries}\\n}`\n : \"Record<string, never>\"\n };\nexport type CardIdsBySharedZoneId = {\n${sharedZoneCardIdEntries}\n};\nexport type CardIdsByPlayerZoneId = {\n${playerZoneCardIdEntries}\n};\nexport type CardIdsByDeckId = CardIdsBySharedZoneId;\n\nexport interface BoardSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> {\n id: SpaceIdValue;\n name?: string | null;\n typeId?: SpaceTypeId | null;\n fields: Fields;\n zoneId?: string | null;\n}\n\nexport interface BoardRelationStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> {\n id?: string | null;\n typeId: RelationTypeId;\n fromSpaceId: SpaceIdValue;\n toSpaceId: SpaceIdValue;\n directed: boolean;\n fields: Fields;\n}\n\nexport interface BoardContainerStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n Fields = RuntimeRecord,\n> {\n id: ContainerIdValue;\n name: string;\n host:\n | { type: \"board\" }\n | {\n type: \"space\";\n spaceId: SpaceIdValue;\n };\n allowedCardSetIds?: readonly CardSetId[];\n zoneId: string;\n fields: Fields;\n}\n\nexport interface BoardStateRecordBase<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n> {\n id: BoardIdValue;\n baseId: BoardBaseId;\n typeId?: BoardTypeId | null;\n scope: \"shared\" | \"perPlayer\";\n playerId?: PlayerId | null;\n templateId?: string | null;\n fields: BoardFields;\n}\n\nexport interface GenericBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n ContainerIdValue,\n BoardFields,\n SpaceFields,\n RelationFields,\n ContainerFields\n > {\n layout: \"generic\";\n spaces: Record<\n SpaceIdValue,\n BoardSpaceStateRecord<SpaceIdValue, SpaceFields>\n >;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<\n ContainerIdValue,\n BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>\n >;\n}\n\nexport interface HexSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n q: number;\n r: number;\n}\n\nexport interface SquareSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n row: number;\n col: number;\n}\n\nexport interface TiledEdgeStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n Fields = RuntimeRecord,\n> {\n id: EdgeIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: EdgeTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\n\nexport interface TiledVertexStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n VertexIdValue extends VertexId = VertexId,\n Fields = RuntimeRecord,\n> {\n id: VertexIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: VertexTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\n\nexport type HexEdgeStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n Fields = RuntimeRecord,\n> = TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, Fields>;\n\nexport type HexVertexStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n VertexIdValue extends VertexId = VertexId,\n Fields = RuntimeRecord,\n> = TiledVertexStateRecord<SpaceIdValue, VertexIdValue, Fields>;\n\nexport interface HexBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n VertexIdValue extends VertexId = VertexId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n EdgeFields = RuntimeRecord,\n VertexFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n never,\n BoardFields,\n SpaceFields,\n RuntimeRecord,\n RuntimeRecord\n > {\n layout: \"hex\";\n spaces: Record<SpaceIdValue, HexSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RuntimeRecord>>;\n containers: Record<never, never>;\n orientation: \"pointy-top\" | \"flat-top\";\n edges: Array<HexEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<\n HexVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>\n >;\n}\n\nexport interface SquareBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n EdgeIdValue extends EdgeId = EdgeId,\n VertexIdValue extends VertexId = VertexId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n EdgeFields = RuntimeRecord,\n VertexFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n ContainerIdValue,\n BoardFields,\n SpaceFields,\n RelationFields,\n ContainerFields\n > {\n layout: \"square\";\n spaces: Record<\n SpaceIdValue,\n SquareSpaceStateRecord<SpaceIdValue, SpaceFields>\n >;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<\n ContainerIdValue,\n BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>\n >;\n edges: Array<TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<\n TiledVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>\n >;\n}\n\nexport type TiledBoardStateRecord =\n | HexBoardStateRecord\n | SquareBoardStateRecord;\n\nexport type BoardStateById = {\n${perBoardStateEntries}\n};\n\nexport type HexBoardStateById = ${\n perHexBoardStateEntries.length > 0\n ? `{\\n${perHexBoardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type SquareBoardStateById = ${\n perSquareBoardStateEntries.length > 0\n ? `{\\n${perSquareBoardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\ntype ManifestRecordValue<T> = T[keyof T];\ntype ManifestArrayElement<T> =\n T extends readonly (infer Item)[]\n ? Item\n : T extends (infer Item)[]\n ? Item\n : never;\n\nexport type BoardState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardStateById ? BoardStateById[BoardIdValue] : never;\n\nexport type BoardFields<BoardIdValue extends BoardId = BoardId> =\n BoardState<BoardIdValue> extends { fields: infer Fields } ? Fields : never;\n\nexport type BoardSpaceStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestRecordValue<\n BoardStateById[BoardIdValue][\"spaces\"]\n >;\n};\n\nexport type BoardSpaceState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardSpaceStateByBoardId\n ? BoardSpaceStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardSpaceFields<BoardIdValue extends BoardId = BoardId> =\n BoardSpaceState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardRelationStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestArrayElement<\n BoardStateById[BoardIdValue][\"relations\"]\n >;\n};\n\nexport type BoardRelationState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardRelationStateByBoardId\n ? BoardRelationStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardRelationFields<BoardIdValue extends BoardId = BoardId> =\n BoardRelationState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardContainerStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestRecordValue<\n BoardStateById[BoardIdValue][\"containers\"]\n >;\n};\n\nexport type BoardContainerState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardContainerStateByBoardId\n ? BoardContainerStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardContainerFields<BoardIdValue extends BoardId = BoardId> =\n BoardContainerState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\ntype HexAuthoredEdgesByBoardId = typeof authoredHexEdgesByBoardIdLookup;\ntype HexAuthoredVerticesByBoardId = typeof authoredHexVerticesByBoardIdLookup;\n\nexport type HexAuthoredEdgeState<\n BoardIdValue extends keyof HexAuthoredEdgesByBoardId = keyof HexAuthoredEdgesByBoardId,\n> = BoardIdValue extends keyof HexAuthoredEdgesByBoardId\n ? ManifestArrayElement<HexAuthoredEdgesByBoardId[BoardIdValue]>\n : never;\n\nexport type HexAuthoredEdgeRef<\n BoardIdValue extends keyof HexAuthoredEdgesByBoardId = keyof HexAuthoredEdgesByBoardId,\n> = HexAuthoredEdgeState<BoardIdValue> extends { ref: infer Ref } ? Ref : never;\n\nexport type HexAuthoredVertexState<\n BoardIdValue extends keyof HexAuthoredVerticesByBoardId = keyof HexAuthoredVerticesByBoardId,\n> = BoardIdValue extends keyof HexAuthoredVerticesByBoardId\n ? ManifestArrayElement<HexAuthoredVerticesByBoardId[BoardIdValue]>\n : never;\n\nexport type HexAuthoredVertexRef<\n BoardIdValue extends keyof HexAuthoredVerticesByBoardId = keyof HexAuthoredVerticesByBoardId,\n> = HexAuthoredVertexState<BoardIdValue> extends { ref: infer Ref }\n ? Ref\n : never;\n\nexport type HexEdgeState<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = BoardIdValue extends keyof HexBoardStateById\n ? ManifestArrayElement<HexBoardStateById[BoardIdValue][\"edges\"]>\n : never;\n\nexport type HexEdgeFields<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = HexEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type HexVertexState<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = BoardIdValue extends keyof HexBoardStateById\n ? ManifestArrayElement<HexBoardStateById[BoardIdValue][\"vertices\"]>\n : never;\n\nexport type HexVertexFields<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = HexVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type SquareEdgeState<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = BoardIdValue extends keyof SquareBoardStateById\n ? ManifestArrayElement<SquareBoardStateById[BoardIdValue][\"edges\"]>\n : never;\n\nexport type SquareEdgeFields<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = SquareEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type SquareVertexState<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = BoardIdValue extends keyof SquareBoardStateById\n ? ManifestArrayElement<SquareBoardStateById[BoardIdValue][\"vertices\"]>\n : never;\n\nexport type SquareVertexFields<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = SquareVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type TiledBoardId = keyof HexBoardStateById | keyof SquareBoardStateById;\n\nexport type TiledEdgeState<BoardIdValue extends TiledBoardId = TiledBoardId> =\n BoardIdValue extends keyof HexBoardStateById\n ? HexEdgeState<BoardIdValue>\n : BoardIdValue extends keyof SquareBoardStateById\n ? SquareEdgeState<BoardIdValue>\n : never;\n\nexport type TiledEdgeFields<BoardIdValue extends TiledBoardId = TiledBoardId> =\n TiledEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type TiledVertexState<\n BoardIdValue extends TiledBoardId = TiledBoardId,\n> = BoardIdValue extends keyof HexBoardStateById\n ? HexVertexState<BoardIdValue>\n : BoardIdValue extends keyof SquareBoardStateById\n ? SquareVertexState<BoardIdValue>\n : never;\n\nexport type TiledVertexFields<\n BoardIdValue extends TiledBoardId = TiledBoardId,\n> = TiledVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardStateRecord = ${\n analysis.boardIds.length > 0 ? \"BoardStateById[BoardId]\" : \"never\"\n };\n\nexport type TableState = RuntimeTableRecord & {\n playerOrder: PlayerId[];\n zones: RuntimeTableRecord[\"zones\"] & {\n visibility: Record<ZoneId, RuntimeHandVisibilityMode>;\n cardSetIdsByZoneId?: Record<ZoneId, readonly CardSetId[]>;\n };\n decks: Record<SharedZoneId, CardId[]>;\n hands: Record<PlayerZoneId, PerPlayer<CardId[]>>;\n handVisibility: Record<PlayerZoneId, RuntimeHandVisibilityMode>;\n cards: CardStateById;\n pieces: Record<PieceId, RuntimePieceData>;\n componentLocations: Record<ComponentId, RuntimeComponentLocation>;\n ownerOfCard: Record<CardId, PlayerId | null>;\n visibility: Record<CardId, RuntimeCardVisibility>;\n resources: PerPlayer<Record<ResourceId, number>>;\n boards: RuntimeTableRecord[\"boards\"];\n dice: Record<DieId, RuntimeDieData>;\n};\n\nconst sharedZoneSchema = z.record(sharedZoneIdSchema, z.array(z.string()));\n// PerPlayer<Array<string>> wire shape only: { __perPlayer: true, entries: [[playerId, value], ...] }.\nconst playerZoneSchema = z.record(\n playerZoneIdSchema,\n perPlayerSchema(z.array(z.string())),\n);\nconst cardStateSchema = z.object({\n componentType: z.string().optional(),\n id: ids.cardId,\n cardSetId: ids.cardSetId,\n cardType: ids.cardType,\n name: z.string().optional(),\n text: z.string().optional(),\n properties: unknownRecordSchema,\n});\n${renderCardPropertiesSchemaByCardSetId(analysis.cardSets)}\n${renderCardStateSchemaFactory(analysis)}\nconst cardStateByIdSchema = ${renderCardStateSchemaById(analysis)};\nconst pieceStateByIdSchema = ${renderPieceStateSchemaById(analysis)};\nconst dieStateByIdSchema = ${renderDieStateSchemaById(analysis)};\nconst boardStateByIdSchema = ${renderBoardStateSchemaById(analysis)};\nconst hexBoardStateByIdSchema = ${renderHexBoardStateSchemaById(analysis)};\nconst squareBoardStateByIdSchema = ${renderSquareBoardStateSchemaById(\n analysis,\n )};\nconst boardSpaceTypeIdSchema = ids.spaceTypeId.nullable().optional();\nconst 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});\nconst hexSpaceStateSchema = boardSpaceStateSchema.extend({\n q: z.number().int(),\n r: z.number().int(),\n});\nconst squareSpaceStateSchema = boardSpaceStateSchema.extend({\n row: z.number().int(),\n col: z.number().int(),\n});\nconst 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});\nconst 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});\nconst 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 templateId: z.string().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});\nconst 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});\nconst 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});\nconst 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});\nconst 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-top\", \"flat-top\"]),\n edges: z.array(hexEdgeStateSchema),\n vertices: z.array(hexVertexStateSchema),\n});\nconst 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});\nconst runtimeBoardStateSchema = z.union([\n runtimeGenericBoardStateSchema,\n runtimeHexBoardStateSchema,\n runtimeSquareBoardStateSchema,\n]);\nconst rawTableSchema = z.object({\n playerOrder: z.array(ids.playerId),\n zones: z.object({\n shared: sharedZoneSchema,\n perPlayer: playerZoneSchema,\n visibility: z.record(zoneIdSchema, z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"])),\n cardSetIdsByZoneId: z.record(zoneIdSchema, z.array(ids.cardSetId)).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 ${renderStrictSlotLocationSchema(analysis.strictSlotHosts)},\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: perPlayerSchema(z.record(ids.resourceId, z.number().int())),\n boards: z.object({\n byId: boardStateByIdSchema,\n hex: hexBoardStateByIdSchema,\n square: squareBoardStateByIdSchema,\n }),\n dice: dieStateByIdSchema,\n});\n\nexport const tableSchema = assumeManifestSchema<TableState>(rawTableSchema);\n\nexport const runtimeSchema = createManifestRuntimeSchema({\n phaseNameSchema: z.string(),\n playerIdSchema: ids.playerId,\n setupProfileIdSchema: ids.setupProfileId,\n});\n\n// Produces an empty PerPlayer<CardId[]> for every player zone. The entries\n// array is seeded from the resolved runtime roster so the generated default\n// never creates a record for a player the session does not have.\nfunction buildPerPlayerCardIds(\n playerIds: readonly PlayerId[],\n): CardIdsByPlayerZoneId {\n return Object.fromEntries(\n literals.playerZoneIds.map((zoneId) => [\n zoneId,\n perPlayer(playerIds, () => [] as CardId[]),\n ]),\n ) as CardIdsByPlayerZoneId;\n}\n\nfunction buildPlayerResources(\n playerIds: readonly PlayerId[],\n): PerPlayer<Record<ResourceId, number>> {\n return perPlayer(playerIds, () =>\n Object.fromEntries(\n literals.resourceIds.map((resourceId) => [resourceId, 0]),\n ) as Record<ResourceId, number>,\n );\n}\n\nexport const defaults = {\n zones: (playerIds?: readonly string[]) => ({\n shared: cloneManifestDefault(${JSON.stringify(emptySharedZonesTemplate)}),\n perPlayer: buildPerPlayerCardIds(resolveDefaultPlayerIds(playerIds)),\n visibility: cloneManifestDefault(${JSON.stringify(zoneVisibilityById)}),\n cardSetIdsByZoneId: cloneManifestDefault(${JSON.stringify(\n Object.fromEntries(\n Array.from(analysis.zoneCardSetIdsById.entries()).sort(\n ([left], [right]) => left.localeCompare(right),\n ),\n ),\n )}),\n }) as TableState[\"zones\"],\n decks: () => cloneManifestDefault(${JSON.stringify(emptySharedZonesTemplate)}) as TableState[\"decks\"],\n hands: (playerIds?: readonly string[]) =>\n buildPerPlayerCardIds(resolveDefaultPlayerIds(playerIds)) as TableState[\"hands\"],\n handVisibility: () => cloneManifestDefault(${JSON.stringify(\n Object.fromEntries(\n playerZoneIds.map((zoneId) => [\n zoneId,\n zoneVisibilityById[zoneId] ?? \"ownerOnly\",\n ]),\n ),\n )}) as TableState[\"handVisibility\"],\n ownerOfCard: () => cloneManifestDefault(${JSON.stringify(defaultOwnerTemplate)}) as TableState[\"ownerOfCard\"],\n visibility: () => cloneManifestDefault(${JSON.stringify(defaultVisibilityTemplate)}) as TableState[\"visibility\"],\n resources: (playerIds?: readonly string[]) =>\n buildPlayerResources(resolveDefaultPlayerIds(playerIds)),\n} as const;\n\nexport const staticBoards = ${renderJsonConst(staticBoardsTemplate)};\n\nconst baseInitialTable = ${renderJsonConst(initialTableTemplate)} as unknown as TableState;\nconst baseDeckCardsByZoneId = baseInitialTable.decks as Record<SharedZoneId, readonly CardId[]>;\n\nexport function createInitialTable(options: {\n playerIds?: readonly string[];\n shuffleItems?: <Value>(values: readonly Value[]) => Value[];\n} = {}): TableState {\n const resolvedPlayerIds = resolveDefaultPlayerIds(options.playerIds);\n const shuffleItems =\n options.shuffleItems ?? (<Value>(values: readonly Value[]) => [...values]);\n const table = cloneManifestDefault(baseInitialTable) as TableState;\n table.playerOrder = [...resolvedPlayerIds];\n table.zones = defaults.zones(resolvedPlayerIds);\n table.decks = defaults.decks();\n table.hands = defaults.hands(resolvedPlayerIds);\n table.resources = defaults.resources(resolvedPlayerIds);\n const componentLocations = cloneManifestDefault(\n baseInitialTable.componentLocations,\n ) as TableState[\"componentLocations\"];\n\n for (const [zoneId, baseDeckCardIds] of Object.entries(\n baseDeckCardsByZoneId,\n ) as Array<[SharedZoneId, readonly CardId[]]>) {\n const shuffled = shuffleItems(baseDeckCardIds);\n (table.decks as Record<string, CardId[]>)[zoneId] = [...shuffled];\n (table.zones.shared as Record<string, CardId[]>)[zoneId] = [...shuffled];\n shuffled.forEach((componentId, position) => {\n const location = componentLocations[componentId];\n if (!location || location.type !== \"InDeck\") {\n return;\n }\n componentLocations[componentId] = {\n ...location,\n position,\n };\n });\n }\n\n table.componentLocations = componentLocations;\n return tableSchema.parse(table);\n}\n\nexport const normalSetup = {\n minPlayers: ${JSON.stringify(manifest.players.minPlayers)},\n maxPlayers: ${JSON.stringify(manifest.players.maxPlayers)},\n createInitialTable: (options: { readonly playerIds: readonly string[] }) =>\n createInitialTable({ playerIds: options.playerIds }),\n} as const;\n\nexport const schemas = {\n table: tableSchema,\n runtime: runtimeSchema,\n} as const;\n\nexport function createGameStateSchema<\n PhaseNameSchema extends z.ZodType<unknown>,\n PublicSchema extends z.ZodType<unknown>,\n PrivateSchema extends z.ZodType<unknown>,\n HiddenSchema extends z.ZodType<unknown>,\n PhasesSchema extends z.ZodType<unknown>,\n>({\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n}: {\n phaseNameSchema: PhaseNameSchema;\n publicSchema: PublicSchema;\n privateSchema: PrivateSchema;\n hiddenSchema: HiddenSchema;\n phasesSchema: PhasesSchema;\n}) {\n return createManifestGameStateSchema({\n tableSchema,\n playerIdSchema: ids.playerId,\n setupProfileIdSchema: ids.setupProfileId,\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n });\n}\n\nexport const manifestContract: ReducerManifestContract<\n RuntimeTableRecord,\n string,\n PlayerId,\n DeckId,\n HandId,\n CardId\n> & {\n readonly ids: typeof ids;\n readonly normalSetup: typeof normalSetup;\n} = {\n literals,\n ids,\n defaults,\n normalSetup,\n staticBoards: staticBoards as unknown as StaticBoards<TableState>,\n setupOptionsById,\n setupChoiceIdsByOptionId,\n setupProfilesById,\n tableSchema,\n runtimeSchema,\n createGameStateSchema,\n};\n\n${renderBoardLiteralHelpers(analysis)}\n\nexport type SetupProfilesDefinition = Record<\n SetupProfileId,\n SetupProfileDefinition<string, typeof manifestContract>\n>;\n\nexport function setupProfiles<const Profiles extends SetupProfilesDefinition>(\n profiles: Profiles,\n): Profiles {\n return profiles;\n}\n\nexport function shuffle(\n container: SetupBootstrapContainerRef<typeof manifestContract>,\n): SetupBootstrapStep<typeof manifestContract> {\n return createShuffleStep<typeof manifestContract>(container);\n}\n\nexport function dealToPlayerZone(options: {\n from: Extract<\n SetupBootstrapContainerRef<typeof manifestContract>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n zoneId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerZone\" }\n >[\"zoneId\"];\n count: number;\n playerIds?: readonly PlayerId[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createDealToPlayerZoneStep<typeof manifestContract>(options);\n}\n\nexport function dealToPlayerBoardContainer(options: {\n from: Extract<\n SetupBootstrapContainerRef<typeof manifestContract>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n boardId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerBoardContainer\" }\n >[\"containerId\"];\n count: number;\n playerIds?: readonly PlayerId[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createDealToPlayerBoardContainerStep<typeof manifestContract>(options);\n}\n\nexport function seedSharedBoardContainer(options: {\n from: SetupBootstrapContainerRef<typeof manifestContract>;\n boardId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardContainer\" }\n >[\"containerId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<typeof manifestContract>\n | PieceIdOfManifest<typeof manifestContract>\n | DieIdOfManifest<typeof manifestContract>\n )[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createSeedSharedBoardContainerStep<typeof manifestContract>(options);\n}\n\nexport function seedSharedBoardSpace(options: {\n from: SetupBootstrapContainerRef<typeof manifestContract>;\n boardId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardSpace\" }\n >[\"boardId\"];\n spaceId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardSpace\" }\n >[\"spaceId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<typeof manifestContract>\n | PieceIdOfManifest<typeof manifestContract>\n | DieIdOfManifest<typeof manifestContract>\n )[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createSeedSharedBoardSpaceStep<typeof manifestContract>(options);\n}\n\nexport default manifestContract;\n`;\n}\n\nexport function generateManifestContractSource(\n manifest: GameTopologyManifest,\n): string {\n return renderManifestContractSource(manifest);\n}\n\nexport type GeneratedManifestContractSources = {\n \"shared/manifest-literals.ts\": string;\n \"shared/manifest-types.ts\": string;\n \"shared/manifest-static.json\": string;\n \"shared/manifest-runtime.ts\": string;\n \"shared/manifest-contract.ts\": string;\n};\n\nconst generatedFileBanner = `/**\n * Generated file.\n * Do not edit directly.\n */`;\n\nfunction extractGeneratedLiteralsBlock(source: string): string {\n const startMarker = \"export const literals = {\";\n const endMarker =\n \"\\n\\n// PlayerId is an opaque brand imported from @dreamboard-games/sdk/reducer.\";\n const start = source.indexOf(startMarker);\n const end = source.indexOf(endMarker, start);\n\n if (start === -1 || end === -1) {\n throw new Error(\"Unable to locate generated manifest literals block.\");\n }\n\n return source.slice(start, end).trim();\n}\n\nfunction renderSplitLiteralsBlock(legacySource: string): string {\n return extractGeneratedLiteralsBlock(legacySource).replace(\n / \\/\\/ literals satisfy `ManifestLiterals<PlayerId, \\.\\.\\.>`\\. The cast is safe\\n \\/\\/ because the runtime values are the exact player-id strings the manifest\\n \\/\\/ authored; branding is purely a type-level discipline\\.\\n playerIds: ([\\s\\S]*?) as unknown as readonly PlayerId\\[],\\n phaseNames:/,\n \" playerIds: $1,\\n phaseNames:\",\n );\n}\n\nfunction renderManifestLiteralsSource(legacySource: string): string {\n return `${generatedFileBanner}\n\n${renderSplitLiteralsBlock(legacySource)}\n`;\n}\n\nfunction renderManifestRuntimeSource(legacySource: string): string {\n const literalsBlock = extractGeneratedLiteralsBlock(legacySource);\n const withoutLiterals = legacySource.replace(\n literalsBlock,\n \"export { literals };\",\n );\n return withoutLiterals\n .replace(generatedFileBanner, `${generatedFileBanner}\\n// @ts-nocheck`)\n .replace(\n `} from \"@dreamboard-games/sdk/reducer/advanced\";\\n\\nconst unknownRecordSchema`,\n `} from \"@dreamboard-games/sdk/reducer/advanced\";\\nimport staticBoardsData from \"./manifest-static.json\";\\nimport { literals } from \"./manifest-literals\";\\nimport type { PlayerId as PublicPlayerId, TableState as PublicTableState } from \"./manifest-types\";\\n\\nconst unknownRecordSchema`,\n )\n .replaceAll(\n \"literals.playerIds as unknown as readonly PlayerId[]\",\n \"literals.playerIds\",\n )\n .replaceAll(\n \"cardId: cardIdSchema as unknown as typeof cardIdSchema & z.ZodType<CardId>,\",\n 'cardId: assumeManifestSchema<CardId, \"cardId\">(cardIdSchema),',\n )\n .replaceAll(\n \"deckId: deckIdSchema as unknown as typeof deckIdSchema & z.ZodType<DeckId>,\",\n 'deckId: assumeManifestSchema<DeckId, \"deckId\">(deckIdSchema),',\n )\n .replaceAll(\n \"handId: handIdSchema as unknown as typeof handIdSchema & z.ZodType<HandId>,\",\n 'handId: assumeManifestSchema<HandId, \"handId\">(handIdSchema),',\n )\n .replace(\n \" type StaticBoards,\\n\",\n \" type StaticBoards,\\n type StaticBoardsJsonEnvelope,\\n\",\n )\n .replace(\n /export const staticBoards = ([\\s\\S]*?) as const;\\n\\nconst baseInitialTable = /,\n 'type GeneratedStaticBoards = Pick<PublicTableState[\"boards\"], \"byId\" | \"hex\" | \"square\">;\\ntype GeneratedStaticBoardsJsonEnvelope = Omit<StaticBoardsJsonEnvelope<TableState>, \"boards\"> & {\\n boards: GeneratedStaticBoards;\\n};\\nconst manifestStaticData = staticBoardsData as unknown as GeneratedStaticBoardsJsonEnvelope;\\nexport const staticBoards = manifestStaticData.boards;\\n\\nconst baseInitialTable = ',\n )\n .replace(\n /const baseInitialTable = ([\\s\\S]*?) as const as unknown as TableState;\\nconst baseDeckCardsByZoneId =/,\n \"const baseInitialTable = cloneManifestDefault<TableState>(manifestStaticData.initialTable);\\nconst baseDeckCardsByZoneId =\",\n )\n .replace(\n \"staticBoards: staticBoards as unknown as StaticBoards<TableState>,\",\n \"staticBoards,\",\n )\n .replace(\n `export const manifestContract: ReducerManifestContract<\\n RuntimeTableRecord,`,\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,`,\n )\n .replace(\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,\\n string,\\n PlayerId,`,\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,\\n string,\\n PublicPlayerId,`,\n )\n .replace(\n `const playerIdSchema = markManifestScopedSchema(\\n z\\n .string()\\n .min(1)\\n .transform((value) => asPlayerId(value)),\\n \"playerId\",\\n);`,\n `const playerIdSchema = assumeManifestSchema<PublicPlayerId, \"playerId\">(\\n markManifestScopedSchema(\\n z\\n .string()\\n .min(1)\\n .transform((value) => asPlayerId(value)),\\n \"playerId\",\\n ),\\n);`,\n );\n}\n\nfunction renderCardSetTypeSections(analysis: ManifestAnalysis): string {\n return analysis.cardSets\n .map((cardSet) => {\n const cardIdType = `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`;\n\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n const variantBlocks = Object.keys(cardSet.cardSchema.variants).map(\n (cardType) =>\n `export type ${cardPropertiesTypeName(cardSet, cardType)} = ${renderTypeForObjectSchema(\n mergeSharedCardProperties(\n cardSet.cardSchema as CardPropertySchemaVariants,\n cardType,\n ),\n )};`,\n );\n const variantTypeNames = Object.keys(cardSet.cardSchema.variants).map(\n (cardType) => cardPropertiesTypeName(cardSet, cardType),\n );\n return renderBlocks([\n ...variantBlocks,\n `export type ${toPascalCase(cardSet.id)}CardProperties = ${variantTypeNames.join(\" | \") || \"RuntimeRecord\"};`,\n cardIdType,\n ]);\n }\n\n return renderBlocks([\n `export type ${toPascalCase(cardSet.id)}CardProperties = ${renderTypeForObjectSchema(cardSet.cardSchema)};`,\n cardIdType,\n ]);\n })\n .join(\"\\n\\n\");\n}\n\nfunction renderTopologyFieldTypeSections(analysis: ManifestAnalysis): string {\n const sections: string[] = [];\n for (const board of analysis.analyzedBoards) {\n sections.push(\n `export type ${boardFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.boardFieldsSchema)};`,\n `export type ${boardSpaceFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.spaceFieldsSchema)};`,\n );\n if (board.layout !== \"hex\") {\n sections.push(\n `export type ${boardRelationFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.relationFieldsSchema)};`,\n `export type ${boardContainerFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.containerFieldsSchema)};`,\n );\n }\n if (board.layout !== \"generic\") {\n sections.push(\n `export type ${hexEdgeFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.edgeFieldsSchema)};`,\n `export type ${hexVertexFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.vertexFieldsSchema)};`,\n );\n }\n }\n\n for (const pieceTypeId of analysis.pieceTypeIds) {\n sections.push(\n `export type ${pieceFieldsTypeName(pieceTypeId)} = ${renderTypeForObjectSchema(\n analysis.pieceTypeSchemasById.get(pieceTypeId),\n )};`,\n );\n }\n for (const dieTypeId of analysis.dieTypeIds) {\n sections.push(\n `export type ${dieFieldsTypeName(dieTypeId)} = ${renderTypeForObjectSchema(\n analysis.dieTypeSchemasById.get(dieTypeId),\n )};`,\n );\n }\n return sections.join(\"\\n\");\n}\n\nfunction renderManifestTypesSource(manifest: GameTopologyManifest): string {\n const analysis = analyzeManifest(manifest);\n const sharedZoneIds = analysis.sharedZones.map((zone) => zone.id).sort();\n const playerZoneIds = analysis.playerZones.map((zone) => zone.id).sort();\n const cardSetCardIdAlias = (cardSetId: string) =>\n `${toPascalCase(cardSetId)}CardId`;\n const renderCardIdsForCardSets = (cardSetIds: readonly string[]) =>\n cardSetIds.map(cardSetCardIdAlias).join(\" | \") || \"never\";\n const sharedZoneCardIdEntries = sharedZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.sharedZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: Array<${renderCardIdsForCardSets(allowedCardSetIds)}>;`;\n })\n .join(\"\\n\");\n const playerZoneCardIdEntries = playerZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.playerZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: PerPlayer<Array<${renderCardIdsForCardSets(allowedCardSetIds)}>>;`;\n })\n .join(\"\\n\");\n const perBoardStateEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n if (board.layout === \"hex\") {\n return ` ${quote(runtimeBoardId)}: HexBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(board.edges.map((edge) => edge.id))}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(board.board.id)}>;`;\n }\n if (board.layout === \"square\") {\n return ` ${quote(runtimeBoardId)}: SquareBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${renderStringUnion(board.edges.map((edge) => edge.id))}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(board.board.id)}, ${boardContainerFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(board.board.id)}>;`;\n }\n return ` ${quote(runtimeBoardId)}: GenericBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(board.board.id)}, ${boardContainerFieldsTypeName(board.board.id)}>;`;\n }),\n )\n .join(\"\\n\");\n\n return `${generatedFileBanner}\n\nimport type { PerPlayer } from \"@dreamboard-games/sdk/reducer\";\nimport type {\n RuntimeCardData,\n RuntimeCardVisibility,\n RuntimeComponentLocation,\n RuntimeDieData,\n RuntimeHandVisibilityMode,\n RuntimePieceData,\n RuntimeRecord,\n RuntimeTableRecord,\n} from \"@dreamboard-games/sdk/reducer/advanced\";\nimport { literals } from \"./manifest-literals\";\n\nexport type PlayerId = (typeof literals.playerIds)[number];\nexport type PhaseName = string;\nexport type BoardLayout = (typeof literals.boardLayouts)[number];\nexport type SetupOptionId = (typeof literals.setupOptionIds)[number];\nexport type SetupProfileId = (typeof literals.setupProfileIds)[number];\nexport type CardSetId = (typeof literals.cardSetIds)[number];\nexport type CardType = (typeof literals.cardTypes)[number];\nexport type CardId = (typeof literals.cardIds)[number];\nexport type DeckId = (typeof literals.deckIds)[number];\nexport type HandId = (typeof literals.handIds)[number];\nexport type SharedZoneId = (typeof literals.sharedZoneIds)[number];\nexport type PlayerZoneId = (typeof literals.playerZoneIds)[number];\nexport type ZoneId = (typeof literals.zoneIds)[number];\nexport type ResourceId = (typeof literals.resourceIds)[number];\nexport type PieceTypeId = (typeof literals.pieceTypeIds)[number];\nexport type PieceId = (typeof literals.pieceIds)[number];\nexport type DieTypeId = (typeof literals.dieTypeIds)[number];\nexport type DieId = (typeof literals.dieIds)[number];\nexport type BoardTypeId = (typeof literals.boardTypeIds)[number];\nexport type BoardBaseId = (typeof literals.boardBaseIds)[number];\nexport type BoardId = (typeof literals.boardIds)[number];\nexport type BoardContainerId = (typeof literals.boardContainerIds)[number];\nexport type RelationTypeId = (typeof literals.relationTypeIds)[number];\nexport type EdgeId = (typeof literals.edgeIds)[number];\nexport type EdgeTypeId = (typeof literals.edgeTypeIds)[number];\nexport type VertexId = (typeof literals.vertexIds)[number];\nexport type VertexTypeId = (typeof literals.vertexTypeIds)[number];\nexport type SpaceId = (typeof literals.spaceIds)[number];\nexport type SpaceTypeId = (typeof literals.spaceTypeIds)[number];\n\n${renderCardSetTypeSections(analysis)}\n\n${renderTopologyFieldTypeSections(analysis)}\n\n${renderBoardFieldMapTypes(analysis)}\n\nexport type CardProperties = ${\n analysis.cardSets.length > 0\n ? analysis.cardSets\n .map((cardSet) => `${toPascalCase(cardSet.id)}CardProperties`)\n .join(\" | \")\n : \"RuntimeRecord\"\n };\n\nexport type CardState = Omit<RuntimeCardData, \"id\" | \"cardSetId\" | \"cardType\" | \"properties\"> & {\n id: CardId;\n cardSetId: CardSetId;\n cardType: CardType;\n properties: CardProperties;\n};\nexport type CardStateById = Record<CardId, CardState>;\nexport type PieceStateById = Record<PieceId, RuntimePieceData>;\nexport type DieStateById = Record<DieId, RuntimeDieData>;\nexport type CardIdsBySharedZoneId = {\n${sharedZoneCardIdEntries}\n};\nexport type CardIdsByPlayerZoneId = {\n${playerZoneCardIdEntries}\n};\nexport type CardIdsByDeckId = CardIdsBySharedZoneId;\nexport type ComponentId = CardId | PieceId | DieId;\n\nexport interface BoardSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> {\n id: SpaceIdValue;\n name?: string | null;\n typeId?: SpaceTypeId | null;\n fields: Fields;\n zoneId?: string | null;\n}\nexport interface BoardRelationStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> {\n id?: string | null;\n typeId: RelationTypeId;\n fromSpaceId: SpaceIdValue;\n toSpaceId: SpaceIdValue;\n directed: boolean;\n fields: Fields;\n}\nexport interface BoardContainerStateRecord<SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, Fields = RuntimeRecord> {\n id: ContainerIdValue;\n name: string;\n host: { type: \"board\" } | { type: \"space\"; spaceId: SpaceIdValue };\n allowedCardSetIds?: readonly CardSetId[];\n zoneId: string;\n fields: Fields;\n}\nexport interface BoardStateRecordBase<BoardIdValue extends BoardId = BoardId, BoardFields = RuntimeRecord> {\n id: BoardIdValue;\n baseId: BoardBaseId;\n typeId?: BoardTypeId | null;\n scope: \"shared\" | \"perPlayer\";\n playerId?: PlayerId | null;\n templateId?: string | null;\n fields: BoardFields;\n}\nexport interface GenericBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, RelationFields = RuntimeRecord, ContainerFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"generic\";\n spaces: Record<SpaceIdValue, BoardSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<ContainerIdValue, BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>>;\n}\nexport interface HexSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n q: number;\n r: number;\n}\nexport interface SquareSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n row: number;\n col: number;\n}\nexport interface TiledEdgeStateRecord<SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, Fields = RuntimeRecord> {\n id: EdgeIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: EdgeTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\nexport interface TiledVertexStateRecord<SpaceIdValue extends SpaceId = SpaceId, VertexIdValue extends VertexId = VertexId, Fields = RuntimeRecord> {\n id: VertexIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: VertexTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\nexport type HexEdgeStateRecord<SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, Fields = RuntimeRecord> = TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, Fields>;\nexport type HexVertexStateRecord<SpaceIdValue extends SpaceId = SpaceId, VertexIdValue extends VertexId = VertexId, Fields = RuntimeRecord> = TiledVertexStateRecord<SpaceIdValue, VertexIdValue, Fields>;\nexport interface HexBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, VertexIdValue extends VertexId = VertexId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, EdgeFields = RuntimeRecord, VertexFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"hex\";\n spaces: Record<SpaceIdValue, HexSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RuntimeRecord>>;\n containers: Record<never, never>;\n orientation: \"pointy-top\" | \"flat-top\";\n edges: Array<HexEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<HexVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>>;\n}\nexport interface SquareBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, EdgeIdValue extends EdgeId = EdgeId, VertexIdValue extends VertexId = VertexId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, RelationFields = RuntimeRecord, ContainerFields = RuntimeRecord, EdgeFields = RuntimeRecord, VertexFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"square\";\n spaces: Record<SpaceIdValue, SquareSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<ContainerIdValue, BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>>;\n edges: Array<TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<TiledVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>>;\n}\nexport type BoardStateById = {\n${perBoardStateEntries}\n};\nexport type BoardState<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardStateById ? BoardStateById[BoardIdValue] : never;\nexport type BoardFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardFieldsByBoardId ? BoardFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardSpaceState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { spaces: Record<string, infer Space> } ? Space : never;\nexport type BoardSpaceFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardSpaceFieldsByBoardId ? BoardSpaceFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardRelationState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { relations: Array<infer Relation> } ? Relation : never;\nexport type BoardRelationFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardRelationFieldsByBoardId ? BoardRelationFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardContainerState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { containers: Record<string, infer Container> } ? Container : never;\nexport type BoardContainerFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardContainerFieldsByBoardId ? BoardContainerFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type HexBoardStateById = {\n [BoardIdValue in keyof BoardStateById as BoardStateById[BoardIdValue] extends { layout: \"hex\" } ? BoardIdValue : never]: BoardStateById[BoardIdValue];\n};\nexport type SquareBoardStateById = {\n [BoardIdValue in keyof BoardStateById as BoardStateById[BoardIdValue] extends { layout: \"square\" } ? BoardIdValue : never]: BoardStateById[BoardIdValue];\n};\nexport type HexEdgeState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"hex\"; edges: Array<infer Edge> } ? Edge : never;\nexport type HexEdgeFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof HexEdgeFieldsByBoardId ? HexEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type HexVertexState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"hex\"; vertices: Array<infer Vertex> } ? Vertex : never;\nexport type HexVertexFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof HexVertexFieldsByBoardId ? HexVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type SquareEdgeState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"square\"; edges: Array<infer Edge> } ? Edge : never;\nexport type SquareEdgeFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof SquareEdgeFieldsByBoardId ? SquareEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type SquareVertexState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"square\"; vertices: Array<infer Vertex> } ? Vertex : never;\nexport type SquareVertexFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof SquareVertexFieldsByBoardId ? SquareVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type TiledBoardId = keyof TiledEdgeFieldsByBoardId | keyof TiledVertexFieldsByBoardId;\nexport type TiledEdgeState<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends BoardId ? HexEdgeState<BoardIdValue> | SquareEdgeState<BoardIdValue> : never;\nexport type TiledEdgeFields<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends keyof TiledEdgeFieldsByBoardId ? TiledEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type TiledVertexState<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends BoardId ? HexVertexState<BoardIdValue> | SquareVertexState<BoardIdValue> : never;\nexport type TiledVertexFields<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends keyof TiledVertexFieldsByBoardId ? TiledVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardStateRecord = BoardStateById[BoardId];\n\nexport type TableState = Omit<RuntimeTableRecord, \"playerOrder\" | \"zones\" | \"decks\" | \"hands\" | \"handVisibility\" | \"cards\" | \"pieces\" | \"componentLocations\" | \"ownerOfCard\" | \"visibility\" | \"resources\" | \"boards\" | \"dice\"> & {\n playerOrder: PlayerId[];\n zones: RuntimeTableRecord[\"zones\"] & {\n visibility: Record<ZoneId, RuntimeHandVisibilityMode>;\n cardSetIdsByZoneId?: Record<ZoneId, readonly CardSetId[]>;\n };\n decks: CardIdsBySharedZoneId;\n hands: CardIdsByPlayerZoneId;\n handVisibility: Record<PlayerZoneId, RuntimeHandVisibilityMode>;\n cards: CardStateById;\n pieces: PieceStateById;\n componentLocations: Record<ComponentId, RuntimeComponentLocation>;\n ownerOfCard: Record<CardId, PlayerId | null>;\n visibility: Record<CardId, RuntimeCardVisibility>;\n resources: PerPlayer<Record<ResourceId, number>>;\n boards: {\n byId: BoardStateById;\n hex: HexBoardStateById;\n square: SquareBoardStateById;\n network: Record<string, RuntimeRecord>;\n track: Record<string, RuntimeRecord>;\n };\n dice: DieStateById;\n};\n`;\n}\n\nfunction extractGeneratedRuntimeValueExports(source: string): string[] {\n const exports = new Set<string>();\n for (const match of source.matchAll(\n /^export (?:const|function) ([A-Za-z_$][\\w$]*)/gm,\n )) {\n const name = match[1];\n if (name === undefined) {\n continue;\n }\n if (name !== \"literals\") {\n exports.add(name);\n }\n }\n return [...exports].sort((left, right) => left.localeCompare(right));\n}\n\nfunction renderManifestContractBarrelSource(legacySource: string): string {\n const runtimeExports = extractGeneratedRuntimeValueExports(legacySource);\n return `${generatedFileBanner}\n\nexport { literals } from \"./manifest-literals\";\nexport type * from \"./manifest-types\";\nexport {\n${runtimeExports.map((name) => ` ${name},`).join(\"\\n\")}\n} from \"./manifest-runtime\";\nexport { default } from \"./manifest-runtime\";\n`;\n}\n\nexport function generateManifestContractSources(\n manifest: GameTopologyManifest,\n): GeneratedManifestContractSources {\n const legacySource = renderManifestContractSource(manifest);\n const initialTableTemplate = materializeManifestTable({\n manifest,\n playerIds: analyzeManifest(manifest).playerIds,\n shuffleItems: <Value>(values: readonly Value[]) => [...values],\n });\n const staticBoardsEnvelope = createManifestStaticJsonEnvelope(\n createManifestStaticBoardsData(initialTableTemplate),\n initialTableTemplate,\n );\n return {\n \"shared/manifest-literals.ts\": renderManifestLiteralsSource(legacySource),\n \"shared/manifest-types.ts\": renderManifestTypesSource(manifest),\n \"shared/manifest-static.json\":\n renderManifestStaticJsonSource(staticBoardsEnvelope),\n \"shared/manifest-runtime.ts\": renderManifestRuntimeSource(legacySource),\n \"shared/manifest-contract.ts\":\n renderManifestContractBarrelSource(legacySource),\n };\n}\n","export type OwnershipPattern = {\n prefix: string;\n suffix: string;\n};\n\nexport type ScaffoldingOwnership = {\n version: number;\n allowedPaths: {\n rootFiles: string[];\n directoryPrefixes: string[];\n };\n dynamic: {\n generatedFiles: string[];\n seedFiles: string[];\n seedFilePatterns: OwnershipPattern[];\n };\n cliStatic: {\n exactFiles: string[];\n directoryPrefixes: string[];\n };\n preservedUserFiles: string[];\n};\n\nexport const WORKSPACE_CODEGEN_OWNERSHIP: ScaffoldingOwnership = {\n version: 32,\n allowedPaths: {\n rootFiles: [\n \".npmrc\",\n \"package.json\",\n \"pnpm-lock.yaml\",\n \"package-lock.json\",\n \"manifest.ts\",\n \"manifest.tsconfig.json\",\n \"rule.md\",\n ],\n directoryPrefixes: [\"app/\", \"manifest/\", \"ui/\", \"shared/\", \"test/\"],\n },\n dynamic: {\n generatedFiles: [\n \"shared/manifest-literals.ts\",\n \"shared/manifest-types.ts\",\n \"shared/manifest-static.json\",\n \"shared/manifest-runtime.ts\",\n \"shared/manifest-contract.ts\",\n \"shared/generated/ui-contract.ts\",\n \"app/index.ts\",\n \"app/tsconfig.framework.json\",\n \"ui/tsconfig.framework.json\",\n ],\n seedFiles: [\n \"app/README.md\",\n \"ui/App.tsx\",\n \"app/game-contract.ts\",\n \"app/authoring.ts\",\n \"app/game.ts\",\n \"app/setup-profiles.ts\",\n \"app/reducer-support.ts\",\n \"app/derived.ts\",\n \"ui/interaction-routes.tsx\",\n \"ui/setup-screen.tsx\",\n \"ui/styles.ts\",\n \"ui/ui-contract-typing-smoke.tsx\",\n ],\n seedFilePatterns: [{ prefix: \"app/phases/\", suffix: \".ts\" }],\n },\n cliStatic: {\n exactFiles: [\n \".npmrc\",\n \"package.json\",\n \"app/tsconfig.json\",\n \"ui/index.tsx\",\n \"ui/package.json\",\n \"ui/style.css\",\n \"ui/tsconfig.json\",\n ],\n directoryPrefixes: [],\n },\n preservedUserFiles: [],\n} as const;\n\nexport const AUTHORITATIVE_GENERATED_FILES =\n WORKSPACE_CODEGEN_OWNERSHIP.dynamic.generatedFiles;\nexport const SEED_FILES = WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFiles;\nexport const SEED_FILE_PATTERNS =\n WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFilePatterns;\nexport const PRESERVED_USER_FILES = new Set(\n WORKSPACE_CODEGEN_OWNERSHIP.preservedUserFiles,\n);\n\nconst WINDOWS_DRIVE_PATH = /^[A-Za-z]:[\\\\/]/;\nconst WINDOWS_UNC_PATH = /^(?:\\\\\\\\|\\/\\/)/;\n\nexport const WORKSPACE_OWNERSHIP_VERSION = WORKSPACE_CODEGEN_OWNERSHIP.version;\n\nexport function normalizeOwnedProjectPath(input: string): string | null {\n if (\n input.length === 0 ||\n input.includes(\"\\0\") ||\n input.startsWith(\"/\") ||\n WINDOWS_DRIVE_PATH.test(input) ||\n WINDOWS_UNC_PATH.test(input)\n ) {\n return null;\n }\n\n const normalized = input.replace(/\\\\/g, \"/\");\n const segments = normalized.split(\"/\");\n if (\n segments.some(\n (segment) => segment.length === 0 || segment === \".\" || segment === \"..\",\n )\n ) {\n return null;\n }\n\n return segments.join(\"/\");\n}\n\nexport function isAllowedGamePath(filePath: string): boolean {\n const path = normalizeOwnedProjectPath(filePath);\n if (path === null) return false;\n if (WORKSPACE_CODEGEN_OWNERSHIP.allowedPaths.rootFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.allowedPaths.directoryPrefixes.some(\n (prefix) => path.startsWith(prefix),\n );\n}\n\nexport function isAuthoritativeGeneratedPath(filePath: string): boolean {\n const path = normalizeOwnedProjectPath(filePath);\n if (path === null) return false;\n return WORKSPACE_CODEGEN_OWNERSHIP.dynamic.generatedFiles.includes(path);\n}\n\nexport function isDynamicSeedPath(filePath: string): boolean {\n const path = normalizeOwnedProjectPath(filePath);\n if (path === null) return false;\n if (WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFilePatterns.some(\n (pattern) =>\n path.startsWith(pattern.prefix) && path.endsWith(pattern.suffix),\n );\n}\n\nexport function isCliStaticPath(filePath: string): boolean {\n const path = normalizeOwnedProjectPath(filePath);\n if (path === null) return false;\n if (WORKSPACE_CODEGEN_OWNERSHIP.cliStatic.exactFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.cliStatic.directoryPrefixes.some(\n (prefix) => path.startsWith(prefix),\n );\n}\n\nexport function isLibraryPath(filePath: string): boolean {\n const path = normalizeOwnedProjectPath(filePath);\n if (path === null) return false;\n return isAuthoritativeGeneratedPath(path);\n}\n","import type { GameTopologyManifest } from \"@dreamboard-games/sdk-types\";\n\nexport const SETUP_PROFILES_SEED_MARKER =\n \"Generated by dreamboard setup-profiles scaffold.\";\n\nfunction generateThinUiContractContent(): string {\n return `/**\n * Generated file.\n * Do not edit directly.\n */\n\nimport game from \"../../app/game\";\nimport {\n createGameUiContract,\n type GameUiBoardSurface,\n type GameUiCardCollectionSurface,\n type GameUiGameRootState,\n type GameUiHandSurface,\n type GameUiInteractionFormSurface,\n type GameUiInteractionKey,\n type GameUiInteractionRoutes,\n type GameUiMe,\n type GameUiPhaseName,\n type GameUiPlayers,\n type GameUiTurn,\n type GameUiView,\n} from \"@dreamboard-games/sdk/runtime/workspace-contract\";\nimport type { DreamboardUI } from \"@dreamboard-games/sdk/runtime\";\nimport {\n literals,\n staticBoards,\n type BoardBaseId,\n type CardId,\n type CardProperties,\n type CardType,\n type EdgeId,\n type PlayerId,\n type ResourceId,\n type SpaceId,\n type VertexId,\n type ZoneId,\n} from \"../manifest-contract\";\n\ntype GameDefinition = typeof game;\ntype RuntimeBoundary = DreamboardUI;\ntype PlayerCardZoneId = {\n [Zone in (typeof literals.playerZoneIds)[number]]:\n (typeof literals.cardSetIdsByPlayerZoneId)[Zone] extends readonly []\n ? never\n : Zone;\n}[(typeof literals.playerZoneIds)[number]];\ntype SharedCardZoneId = {\n [Zone in (typeof literals.sharedZoneIds)[number]]:\n (typeof literals.cardSetIdsBySharedZoneId)[Zone] extends readonly []\n ? never\n : Zone;\n}[(typeof literals.sharedZoneIds)[number]];\ntype ManifestTypes = {\n PlayerId: PlayerId & string;\n ResourceId: ResourceId & string;\n ZoneId: ZoneId & string;\n CardId: [CardId] extends [never] ? string : CardId & string;\n CardType: [CardType] extends [never] ? string : CardType & string;\n CardProperties: CardProperties extends Record<string, unknown>\n ? CardProperties\n : Record<string, unknown>;\n BoardBaseId: BoardBaseId & string;\n SpaceId: SpaceId & string;\n EdgeId: EdgeId & string;\n VertexId: VertexId & string;\n PlayerCardZoneId: PlayerCardZoneId & string;\n CardZoneId: (PlayerCardZoneId | SharedCardZoneId) & string;\n};\n\nconst contract = createGameUiContract<\n GameDefinition,\n ManifestTypes,\n typeof staticBoards.hex,\n typeof staticBoards.square\n>({\n game,\n resourceIds: literals.resourceIds as readonly ResourceId[],\n resourcePresentationById: literals.resourcePresentationById,\n hexStaticBoards: staticBoards.hex,\n squareStaticBoards: staticBoards.square,\n});\n\nexport const uiContract = contract.uiContract;\nexport const UI = contract.UI;\nexport const clientParamSchemasByPhase = contract.clientParamSchemasByPhase;\nexport const Board = UI.Board;\nexport const Zone = UI.Zone;\nexport const Game = UI.Game;\nexport const Interaction = UI.Interaction;\nexport const PlayerRoster = UI.PlayerRoster;\nexport const Dice = UI.Dice;\nexport const Phase = UI.Phase;\nexport const ResourceCounter = UI.ResourceCounter;\n\nexport type ViewName = import(\"@dreamboard-games/sdk/runtime/workspace-contract\").GameUiViewName<GameDefinition>;\nexport type GameView = GameUiView<GameDefinition>;\nexport type PhaseName = GameUiPhaseName<GameDefinition>;\nexport type GameRootState = GameUiGameRootState<GameDefinition, ManifestTypes>;\nexport type GamePlayers = GameUiPlayers<ManifestTypes>;\nexport type GameMe = GameUiMe<ManifestTypes>;\nexport type GameTurn = GameUiTurn<GameDefinition, ManifestTypes>;\nexport type InteractionKey = GameUiInteractionKey<GameDefinition>;\nexport type InteractionRoutes = GameUiInteractionRoutes<GameDefinition>;\nexport type InteractionFormSurface<Key extends InteractionKey> =\n GameUiInteractionFormSurface<GameDefinition, typeof uiContract, Key>;\nexport type BoardSurface<\n Board extends ManifestTypes[\"BoardBaseId\"] = ManifestTypes[\"BoardBaseId\"],\n> = GameUiBoardSurface<ManifestTypes, Board>;\nexport type HandSurface<\n Zones extends readonly ManifestTypes[\"ZoneId\"][] = readonly ManifestTypes[\"ZoneId\"][],\n> = GameUiHandSurface<ManifestTypes, Zones>;\nexport type CardCollectionSurface<\n Zones extends readonly ManifestTypes[\"ZoneId\"][] = readonly ManifestTypes[\"ZoneId\"][],\n> = GameUiCardCollectionSurface<ManifestTypes, Zones>;\n\ndeclare module \"@dreamboard-games/sdk/runtime\" {\n interface DreamboardUIRegister {\n contract: GameDefinition;\n ui: typeof uiContract;\n }\n}\n`;\n}\n\nfunction generateReducerSupportSeed(): string {\n return `import {\n createReducerEdit,\n createStateQueries,\n} from \"@dreamboard-games/sdk/reducer\";\nimport type { GameState } from \"./game-contract\";\n\n/**\n * Small, SDK-shaped reducer helpers belong here.\n *\n * Keep schema and contract declarations in app/game-contract.ts.\n * Keep initial state callbacks and defineGame wiring in app/game.ts.\n * Keep memoized aggregates (winner checks, VP totals, longest-road,\n * largest-army) in app/derived.ts via \\`defineDerived\\`.\n * Keep phase files focused on one game-flow state.\n *\n * When this file starts collecting real game rules, split them by domain\n * under app/rules/ instead, for example app/rules/board.ts,\n * app/rules/resources.ts, or app/rules/scoring.ts.\n *\n * Recommended authoring pattern inside a phase reducer:\n *\n * const tx = edit(state);\n * tx.setActivePlayers([q.players.order()[0]]);\n * return accept(tx.state);\n */\n\nexport const edit = createReducerEdit<GameState>();\n\nexport function stateQueries(state: GameState) {\n return createStateQueries(state);\n}\n`;\n}\n\nfunction generateAppReadmeSeed(): string {\n return `# App organization\n\nThis directory owns the reducer: game state schemas, phases, interactions,\nderived values, player views, and reducer helpers.\n\nUse this layout while the game is small:\n\n\\`\\`\\`txt\napp/\n game-contract.ts\n authoring.ts\n game.ts\n derived.ts\n reducer-support.ts\n phases/\n setup.ts\n\\`\\`\\`\n\nWhen a phase grows beyond a single idea, make the phase directory the table of\ncontents and split the implementation by game concept:\n\n\\`\\`\\`txt\napp/phases/player-turn/\n index.ts # bound phase assembly only\n state.ts # phase-local constants and types\n inputs.ts # shared input and presentation helpers\n build.ts # build interactions\n trade.ts # trade interactions\n end-turn.ts # end-turn interaction\n\\`\\`\\`\n\nSplit a phase when it has multiple action families, shared input helpers, card\nactions, or is roughly 250-300 lines. Keep \\`index.ts\\` as the assembly point\nthat imports interactions and registers them with its bound phase object.\n\nDo not turn \\`reducer-support.ts\\` into a catch-all rule module. Keep it small\nfor shared reducer plumbing; put real game rules under \\`app/rules/*\\` once\nthere is more than one domain.\n`;\n}\n\nfunction generateReducerDerivedSeed(): string {\n return `// Memoized, pure projections of reducer state. Read them from reducer\n// callbacks and view projections via the injected \\`derived\\` helper:\n//\n// reduce({ state, derived, accept }) {\n// const winner = derived(winnerOf);\n// return accept({ ...state, publicState: { ...state.publicState, currentLeaderId: winner } });\n// }\n//\n// Do NOT mirror derived values back into \\`publicState\\`. Keep the raw\n// inputs (component locations, zone contents, counters) in state and\n// express aggregates here.\n//\n// Uncomment the example below once you have something to derive.\n\n// import { defineDerived } from \"@dreamboard-games/sdk/reducer\";\n// import type { GameContract } from \"./game-contract\";\n//\n// export const winnerOf = defineDerived<GameContract>()({\n// name: \"winnerOf\",\n// compute: ({ state }) => {\n// // Example: return the first player at or above the VP target.\n// return state.publicState.currentLeaderId ?? null;\n// },\n// });\n\nexport {};\n`;\n}\n\nfunction generateReducerGameContractSeed(): string {\n return `import { z } from \"zod\";\nimport { ids, manifestContract } from \"../shared/manifest-contract\";\nimport { defineGameContract, type GameStateOf } from \"@dreamboard-games/sdk/reducer\";\n\n// Contract files should stay focused on schemas, phases, and exported\n// state types. Put reducers in app/phases/* and pure computations in\n// app/derived.ts or app/rules/*.\nconst publicStateSchema = z.object({\n currentPlayerId: ids.playerId.nullable(),\n notesByPlayerId: z.partialRecord(ids.playerId, z.string()).default({}),\n});\nconst privateStateSchema = z.object({});\nconst hiddenStateSchema = z.object({});\n\nexport const gameContract = defineGameContract({\n manifest: manifestContract,\n state: {\n public: publicStateSchema,\n private: privateStateSchema,\n hidden: hiddenStateSchema,\n },\n phases: {\n setup: z.object({}),\n },\n errors: {},\n});\n\nexport type GameContract = typeof gameContract;\nexport type GameState = GameStateOf<GameContract>;\n`;\n}\n\nfunction generateReducerAuthoringSeed(): string {\n return `import { createContractAuthoring } from \"@dreamboard-games/sdk/reducer\";\nimport { gameContract } from \"./game-contract\";\n\nexport const authoring = createContractAuthoring(gameContract);\n`;\n}\n\nfunction generateReducerGameSeed(): string {\n return `import { authoring } from \"./authoring\";\nimport { phases } from \"./phases\";\nimport setupProfiles from \"./setup-profiles\";\n\n// Keep this file as the defineGame assembly point. Put rules in phases,\n// projections in views/derived modules, and reusable domain helpers in\n// app/rules/* once reducer-support.ts is no longer small.\nexport default authoring.game({\n initial: {\n public: ({ playerIds }) => ({\n currentPlayerId: playerIds[0] ?? null,\n notesByPlayerId: {},\n }),\n private: () => ({}),\n hidden: () => ({}),\n },\n initialPhase: \"setup\",\n setupProfiles,\n phases,\n views: {\n shared: authoring.emptyView(),\n player: authoring.emptyView(),\n },\n});\n`;\n}\n\nfunction generateSetupProfilesSeed(manifest: GameTopologyManifest): string {\n const setupProfiles = manifest.setupProfiles ?? [];\n const setupProfileEntries =\n setupProfiles.length === 0\n ? \"\"\n : `{\\n${setupProfiles\n .map((profile) => ` ${JSON.stringify(profile.id)}: {},`)\n .join(\"\\n\")}\\n}`;\n\n return `// ${SETUP_PROFILES_SEED_MARKER}\nimport { setupProfiles } from \"../shared/manifest-contract\";\n\nexport default setupProfiles(${setupProfileEntries || \"{}\"});\n`;\n}\n\nexport function isFrameworkOwnedSetupProfilesSeed(\n content: string | null | undefined,\n): boolean {\n if (content === null || content === undefined) {\n return false;\n }\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return true;\n }\n if (trimmed.includes(SETUP_PROFILES_SEED_MARKER)) {\n return true;\n }\n return false;\n}\n\nfunction generateSetupPhaseSeed(): string {\n return `import { authoring } from \"../authoring\";\nimport { edit } from \"../reducer-support\";\n\nconst setup = authoring.phase(\"setup\");\n\nconst setupMoodChoices = [\n { value: \"ready\", label: \"Ready\" },\n { value: \"exploring\", label: \"Exploring\" },\n] as const;\ntype SetupMood = (typeof setupMoodChoices)[number][\"value\"];\n\n// A single phase file is fine while the phase is small. When a phase grows\n// multiple action families, move it to app/phases/<phase>/index.ts and split\n// interactions into neighboring concept files.\nexport const setupPhase = setup.define({\n kind: \"player\",\n initialState: () => ({}),\n actor: ({ state }) => state.publicState.currentPlayerId,\n interactions: {\n submit: setup.interaction({\n inputs: {\n mood: setup.inputs.form.choice<SetupMood>({\n choices: setupMoodChoices,\n defaultValue: \"ready\",\n }),\n },\n reduce({ state, input, accept }) {\n const tx = edit(state);\n tx.patchPublicState({\n notesByPlayerId: {\n ...state.publicState.notesByPlayerId,\n [input.playerId]: input.params.mood,\n },\n });\n return accept(tx.state);\n },\n }),\n },\n});\n`;\n}\n\nfunction generatePhaseIndexSeed(): string {\n return `import { setupPhase } from \"./setup\";\nimport type { GameContract } from \"../game-contract\";\nimport type { PhaseMapOf } from \"@dreamboard-games/sdk/reducer\";\n\nexport const phases = {\n setup: setupPhase,\n} satisfies PhaseMapOf<GameContract>;\n`;\n}\n\nfunction generateReducerAppIndex(): string {\n return `import game from \"./game\";\nimport { createReducerBundle } from \"@dreamboard-games/sdk/reducer\";\n\nexport default createReducerBundle(game);\n`;\n}\n\nfunction generateAppFrameworkTsConfig(): string {\n return `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2020\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n resolveJsonModule: true,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: false,\n types: [],\n declaration: false,\n rootDir: \"..\",\n outDir: \"./dist\",\n paths: {\n \"@dreamboard/manifest-contract\": [\"../shared/manifest-contract.ts\"],\n \"#dreamboard/ui-contract\": [\"../shared/generated/ui-contract.ts\"],\n \"@shared/*\": [\"../shared/*\"],\n },\n },\n include: [\n \"./**/*.ts\",\n \"./**/*.d.ts\",\n \"../shared/manifest-*.ts\",\n \"../shared/manifest-*.d.ts\",\n \"../shared/manifest-*.json\",\n ],\n exclude: [\"node_modules\", \"dist\", \"../shared/generated\"],\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction generateUiFrameworkTsConfig(): string {\n return `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2020\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n resolveJsonModule: true,\n jsx: \"react-jsx\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: false,\n types: [],\n paths: {\n \"@dreamboard/manifest-contract\": [\"../shared/manifest-contract.ts\"],\n \"#dreamboard/ui-contract\": [\"../shared/generated/ui-contract.ts\"],\n \"@shared/*\": [\"../shared/*\"],\n },\n },\n include: [\n \"./**/*.ts\",\n \"./**/*.tsx\",\n \"../shared/**/*.ts\",\n \"../shared/**/*.json\",\n ],\n exclude: [\"node_modules\", \"dist\"],\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction generateReducerUiAppContent(): string {\n return `import { Game, Interaction, Phase, UI } from \"#dreamboard/ui-contract\";\nimport { SetupInteractionRoutes } from \"./interaction-routes\";\nimport { SetupScreen } from \"./setup-screen\";\n\nfunction SetupPhase() {\n const setupForm = Interaction.useForm(\"setup.submit\");\n\n return (\n <>\n <SetupScreen />\n <SetupInteractionRoutes form={setupForm} />\n </>\n );\n}\n\nexport default function App() {\n return (\n <UI.Root>\n <Game.Root>\n {() => (\n <Phase.Switch\n routes={{\n setup: () => <SetupPhase />,\n }}\n />\n )}\n </Game.Root>\n </UI.Root>\n );\n}\n`;\n}\n\nfunction generateReducerUiSetupScreenContent(): string {\n return `import { PANEL_CLASS, SHELL_CLASS } from \"./styles\";\n\nexport function SetupScreen() {\n return (\n <main className={SHELL_CLASS}>\n <section className={PANEL_CLASS}>\n <p className=\"text-xs font-bold uppercase tracking-[0.14em] text-slate-500\">\n Setup\n </p>\n <h1 className=\"text-2xl font-bold text-slate-950\">Your game starts here</h1>\n <p className=\"max-w-prose text-sm leading-6 text-slate-600\">\n Replace this screen with your board, hands, mats, and table state.\n Keep interaction wiring in the route file so visual components stay\n focused on layout and styling.\n </p>\n </section>\n </main>\n );\n}\n`;\n}\n\nfunction generateReducerUiInteractionRoutesContent(): string {\n return `import {\n Interaction,\n type InteractionFormSurface,\n} from \"#dreamboard/ui-contract\";\nimport { ACTION_BUTTON_CLASS, PANEL_CLASS } from \"./styles\";\n\nexport function SetupInteractionRoutes({\n form,\n}: {\n form: InteractionFormSurface<\"setup.submit\">;\n}) {\n return (\n <>\n <Interaction.Routes\n routes={{\n \"setup.submit\": {\n collect: {\n mood: form.slot.mood,\n },\n },\n }}\n />\n <aside className={PANEL_CLASS}>\n <div className=\"grid gap-2\">\n <p className=\"text-sm font-bold text-slate-950\">Ready check</p>\n <form.slot.mood.Field />\n <form.Submit className={ACTION_BUTTON_CLASS}>\n Start building\n </form.Submit>\n </div>\n </aside>\n </>\n );\n}\n`;\n}\n\nfunction generateReducerUiStylesContent(): string {\n return `export const SHELL_CLASS =\n \"min-h-screen bg-[#f8fafc] p-6 text-slate-950\";\n\nexport const PANEL_CLASS =\n \"mx-auto grid max-w-3xl gap-4 rounded-lg border border-slate-200 bg-white p-5 shadow-sm\";\n\nexport const ACTION_BUTTON_CLASS =\n \"rounded-md bg-slate-950 px-4 py-2 text-sm font-bold text-white disabled:cursor-not-allowed disabled:opacity-50\";\n`;\n}\n\nfunction generateReducerUiContractTypingSmokeContent(): string {\n return `import { Interaction } from \"#dreamboard/ui-contract\";\n\nexport function UiContractTypingSmoke() {\n const form = Interaction.useForm(\"setup.submit\");\n\n return (\n <Interaction.Routes\n routes={{\n \"setup.submit\": {\n collect: {\n mood: form.slot.mood,\n },\n },\n }}\n />\n );\n}\n\n// @ts-expect-error generated contracts hide legacy interaction roots.\nInteraction.Root({ interaction: \"setup.submit\", children: null });\n`;\n}\n\nexport function generateSeedFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n \"app/README.md\": generateAppReadmeSeed(),\n \"ui/App.tsx\": generateReducerUiAppContent(),\n \"ui/interaction-routes.tsx\": generateReducerUiInteractionRoutesContent(),\n \"ui/setup-screen.tsx\": generateReducerUiSetupScreenContent(),\n \"ui/styles.ts\": generateReducerUiStylesContent(),\n \"ui/ui-contract-typing-smoke.tsx\":\n generateReducerUiContractTypingSmokeContent(),\n \"app/game-contract.ts\": generateReducerGameContractSeed(),\n \"app/authoring.ts\": generateReducerAuthoringSeed(),\n \"app/game.ts\": generateReducerGameSeed(),\n \"app/setup-profiles.ts\": generateSetupProfilesSeed(manifest),\n \"app/reducer-support.ts\": generateReducerSupportSeed(),\n \"app/derived.ts\": generateReducerDerivedSeed(),\n \"app/phases/setup.ts\": generateSetupPhaseSeed(),\n \"app/phases/index.ts\": generatePhaseIndexSeed(),\n };\n}\n\nexport function generateAuthoritativeIndexFile(\n _manifest: GameTopologyManifest,\n): string {\n return generateReducerAppIndex();\n}\n\nexport function generateFrameworkFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n \"app/tsconfig.framework.json\": generateAppFrameworkTsConfig(),\n \"ui/tsconfig.framework.json\": generateUiFrameworkTsConfig(),\n \"shared/generated/ui-contract.ts\": generateThinUiContractContent(),\n \"app/index.ts\": generateAuthoritativeIndexFile(manifest),\n };\n}\n","import type { GameTopologyManifest } from \"@dreamboard-games/sdk-types\";\nimport {\n generateManifestContractSources,\n materializeManifestTable,\n} from \"./manifest-contract.js\";\nimport { validateManifestAuthoring } from \"./manifest-validation.js\";\nimport {\n AUTHORITATIVE_GENERATED_FILES,\n isAllowedGamePath,\n isAuthoritativeGeneratedPath,\n isCliStaticPath,\n isDynamicSeedPath,\n isLibraryPath,\n PRESERVED_USER_FILES,\n SEED_FILES,\n SEED_FILE_PATTERNS,\n WORKSPACE_CODEGEN_OWNERSHIP,\n} from \"./ownership.js\";\nimport {\n generateFrameworkFiles,\n generateSeedFiles,\n isFrameworkOwnedSetupProfilesSeed,\n SETUP_PROFILES_SEED_MARKER,\n} from \"./seeds.js\";\nexport {\n materializeCardSet,\n materializePresetCardSet,\n} from \"./preset-card-sets.js\";\nexport { materializeManifestTable };\n\nexport {\n AUTHORITATIVE_GENERATED_FILES,\n isAllowedGamePath,\n isAuthoritativeGeneratedPath,\n isCliStaticPath,\n isDynamicSeedPath,\n isLibraryPath,\n PRESERVED_USER_FILES,\n SEED_FILES,\n SEED_FILE_PATTERNS,\n WORKSPACE_CODEGEN_OWNERSHIP,\n};\n\nexport function generateAuthoritativeFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n ...generateManifestContractSources(manifest),\n ...generateFrameworkFiles(manifest),\n };\n}\n\nexport { generateSeedFiles };\nexport { isFrameworkOwnedSetupProfilesSeed, SETUP_PROFILES_SEED_MARKER };\nexport { validateManifestAuthoring };\n\nexport function generateDynamicGeneratedFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n ...generateAuthoritativeFiles(manifest),\n ...generateSeedFiles(manifest),\n };\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["toHandleKey","dedupeSorted","renderCardInstanceIds","expandSeedIds","isHexBoardTemplateSpec","isHexBoardSpec","HEX_CORNERS","HEX_CORNER_OFFSETS","cubeFromAxial","cornerGeometryKey","resolveHexSpaces","dedupeSorted","isHexBoardTemplateSpec","isHexBoardSpec","template","resolveHexSpaces","renderCardInstanceIds","cardSetIds","zoneIds","expandSeedIds","renderCardInstanceIds"]}