@dreamboard-games/sdk 0.2.0 → 0.2.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{bundle-TIZcw8LB.d.ts → bundle-CDd5FKeD.d.ts} +3 -1
- package/dist/{chunk-VFTAA4WO.js → chunk-MKXPVOUT.js} +4 -2
- package/dist/chunk-MKXPVOUT.js.map +1 -0
- package/dist/{chunk-WN74KVNY.js → chunk-YFY3RL52.js} +2 -2
- package/dist/chunk-YFY3RL52.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/infrastructure/reducer-bundle-abi.d.ts +113 -113
- package/dist/infrastructure/reducer-bundle-abi.js +1 -1
- package/dist/package-set.d.ts +2 -2
- package/dist/package-set.js +1 -1
- package/dist/reducer.d.ts +1 -1
- package/dist/reducer.js +1 -1
- package/dist/reducer.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/package.json +9 -9
- package/src/generated/reducer-contract/wire.ts +1 -1
- package/src/generated/reducer-contract/zod.ts +3 -1
- package/src/package-set.ts +1 -1
- package/src/reducer/bundle/ingress-bundle.ts +1 -1
- package/dist/chunk-VFTAA4WO.js.map +0 -1
- package/dist/chunk-WN74KVNY.js.map +0 -1
package/dist/reducer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/reducer/model/manifest.ts","../src/reducer/schema-helpers.ts","../src/reducer/authoring/validation.ts","../src/reducer/authoring/contract.ts","../src/reducer/authoring/effect.ts","../src/reducer/authoring/game.ts","../src/reducer/authoring/interaction.ts","../src/reducer/authoring/phase.ts","../src/reducer/authoring/view-stage.ts","../src/reducer/inputs/formInput.ts","../src/reducer/per-player.ts","../src/reducer/inputs/defineInputs.ts","../src/reducer/inputs/boardInput.ts","../src/reducer/inputs/targetRule.ts","../src/reducer/inputs/boardTarget.ts","../src/reducer/inputs/cardTarget.ts","../src/reducer/inputs/choiceTarget.ts","../src/reducer/inputs/cardInput.ts","../src/reducer/inputs/promptInput.ts","../src/reducer/inputs/rngInput.ts","../src/reducer/inputs/many.ts","../src/reducer/engine/runtime-instruction-engine.ts","../src/reducer/table-ops.ts","../src/reducer/rng.ts","../src/reducer/bundle/trusted/rng-sampler.ts","../src/reducer/bundle/trusted/engine-instruction-resolver.ts","../src/reducer/bundle/trusted/flow-instruction-resolver.ts","../src/reducer/bundle/trusted/simultaneous-player.ts","../src/reducer/ops.ts","../src/reducer/table-queries.ts","../src/reducer/transaction.ts","../src/reducer/definition-index.ts","../src/reducer/bundle/trusted/runtime-registry.ts","../src/reducer/derived.ts","../src/reducer/effects.ts","../src/reducer/bundle/trusted/trusted-runtime-args.ts","../src/reducer/bundle/trusted/trusted-runtime-result.ts","../src/reducer/bundle/trusted/trusted-state-codec.ts","../src/reducer/bundle/trusted/trusted-setup-profiles.ts","../src/reducer/bundle/trusted/runtime-scope.ts","../src/reducer/bundle/trusted/instruction-runner.ts","../src/reducer/parse-utils.ts","../src/reducer/bundle/trusted/interaction-types.ts","../src/reducer/bundle/trusted/interaction-collectors.ts","../src/reducer/bundle/trusted/interaction-authorization.ts","../src/reducer/bundle/trusted/interaction-decision.ts","../src/reducer/bundle/trusted/stage-resolver.ts","../src/reducer/bundle/trusted/interaction-resolver.ts","../src/reducer/setup-bootstrap.ts","../src/reducer/bundle/trusted/lifecycle-runner.ts","../src/reducer/bundle/trusted/projection-context.ts","../src/reducer/bundle/trusted/projection-builder.ts","../src/reducer/bundle/trusted/static-projection.ts","../src/reducer/bundle/trusted-bundle.ts","../src/reducer/ingress/session-codec.ts","../src/reducer/ingress/input-codec.ts","../src/reducer/ingress/runtime-payload.ts","../src/reducer/ingress/phase-schemas.ts","../src/generated/reducer-contract/builders.ts","../src/reducer/bundle/ingress-bundle.ts","../src/reducer/client-param-schemas.ts","../src/reducer/setup-bootstrap-helpers.ts","../src/reducer/compose.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n AnySchema,\n RuntimeHandVisibilityMode,\n RuntimeTableRecord,\n SchemaLike,\n} from \"./table\";\nimport type {\n BoardBaseIdOfManifest,\n BoardContainerIdOfManifest,\n CardIdOfManifest,\n CardIdOfTable,\n DeckIdOfTable,\n DieIdOfManifest,\n HandIdOfTable,\n PieceIdOfManifest,\n PlayerIdOfManifest,\n PlayerIdOfTable,\n SetupSelectionInputOfManifest,\n PlayerZoneIdOfManifest,\n SetupSelectionOfManifest,\n SharedZoneIdOfManifest,\n SpaceIdOfManifest,\n} from \"./extract\";\nimport type { TableQueriesOfState } from \"./queries\";\n\ndeclare const manifestIdSchemaBrand: unique symbol;\n\nexport type ManifestIdSchema<Output = unknown> = z.ZodType<Output> & {\n readonly [manifestIdSchemaBrand]: true;\n};\n\nexport type ManifestLiterals<\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n PhaseName extends string = string,\n> = {\n playerIds: readonly PlayerId[];\n phaseNames: readonly PhaseName[];\n boardLayouts: readonly (\"generic\" | \"hex\" | \"square\")[];\n setupOptionIds: readonly string[];\n setupProfileIds: readonly string[];\n cardSetIds: readonly string[];\n cardTypes: readonly string[];\n deckIds: readonly DeckId[];\n handIds: readonly HandId[];\n sharedZoneIds: readonly DeckId[];\n playerZoneIds: readonly HandId[];\n zoneIds: readonly (DeckId | HandId)[];\n cardIds: readonly CardId[];\n resourceIds: readonly string[];\n resourcePresentationById?: Record<\n string,\n { label: string; icon?: string | null }\n >;\n pieceTypeIds: readonly string[];\n pieceIds: readonly string[];\n dieTypeIds: readonly string[];\n dieIds: readonly string[];\n boardTemplateIds: readonly string[];\n boardTypeIds: readonly string[];\n boardBaseIds: readonly string[];\n boardIds: readonly string[];\n boardContainerIds: readonly string[];\n relationTypeIds: readonly string[];\n edgeIds: readonly string[];\n edgeTypeIds: readonly string[];\n vertexIds: readonly string[];\n vertexTypeIds: readonly string[];\n spaceIds: readonly string[];\n spaceTypeIds: readonly string[];\n handVisibilityById: Record<HandId, RuntimeHandVisibilityMode>;\n zoneVisibilityById: Record<DeckId | HandId, RuntimeHandVisibilityMode>;\n setupChoiceIdsByOptionId: Record<string, readonly string[]>;\n cardSetIdByCardId: Record<CardId, string>;\n cardTypeByCardId: Record<CardId, string>;\n cardSetIdsBySharedZoneId: Record<DeckId, readonly string[]>;\n cardSetIdsByPlayerZoneId: Record<HandId, readonly string[]>;\n};\n\nexport type ManifestIds<\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n PhaseName extends string = string,\n> = {\n playerId: z.ZodType<PlayerId>;\n phaseName: z.ZodType<PhaseName>;\n boardLayout: AnySchema;\n setupOptionId: AnySchema;\n setupProfileId: AnySchema;\n cardSetId: AnySchema;\n cardType: AnySchema;\n cardId: z.ZodType<CardId>;\n deckId: z.ZodType<DeckId>;\n handId: z.ZodType<HandId>;\n sharedZoneId: AnySchema;\n playerZoneId: AnySchema;\n zoneId: AnySchema;\n resourceId: AnySchema;\n pieceTypeId: AnySchema;\n pieceId: AnySchema;\n dieId: AnySchema;\n dieTypeId: AnySchema;\n boardTypeId: AnySchema;\n boardId: AnySchema;\n boardBaseId: AnySchema;\n boardContainerId: AnySchema;\n relationTypeId: AnySchema;\n edgeId: AnySchema;\n edgeTypeId: AnySchema;\n vertexId: AnySchema;\n vertexTypeId: AnySchema;\n spaceId: AnySchema;\n spaceTypeId: AnySchema;\n};\n\nexport type ManifestDefaults<Table extends RuntimeTableRecord> = {\n zones: (playerIds?: readonly string[]) => Table[\"zones\"];\n decks: (playerIds?: readonly string[]) => Table[\"decks\"];\n hands: (playerIds?: readonly string[]) => Table[\"hands\"];\n handVisibility: (playerIds?: readonly string[]) => Table[\"handVisibility\"];\n ownerOfCard: (playerIds?: readonly string[]) => Table[\"ownerOfCard\"];\n visibility: (playerIds?: readonly string[]) => Table[\"visibility\"];\n resources: (playerIds?: readonly string[]) => Table[\"resources\"];\n};\n\nexport type StaticBoards<Table extends RuntimeTableRecord> = Pick<\n Table[\"boards\"],\n \"byId\" | \"hex\" | \"square\"\n>;\n\nexport type SetupOptionChoiceMetadata = {\n id: string;\n label: string;\n description?: string | null;\n};\n\nexport type SetupOptionMetadata = {\n id: string;\n name: string;\n description?: string | null;\n choices: readonly SetupOptionChoiceMetadata[];\n};\n\nexport type SetupProfileMetadata = {\n id: string;\n name: string;\n description?: string | null;\n optionValues?: Record<string, string> | null;\n};\n\nexport type ReducerManifestContract<\n Table extends RuntimeTableRecord,\n PhaseName extends string,\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n> = {\n literals: ManifestLiterals<PlayerId, DeckId, HandId, CardId, PhaseName>;\n ids: ManifestIds<PlayerId, DeckId, HandId, CardId, PhaseName>;\n defaults: ManifestDefaults<Table>;\n staticBoards?: StaticBoards<Table>;\n setupOptionsById: Record<string, SetupOptionMetadata>;\n setupChoiceIdsByOptionId: Record<string, readonly string[]>;\n setupProfilesById: Record<string, SetupProfileMetadata>;\n tableSchema: z.ZodType<Table>;\n runtimeSchema: AnySchema;\n createGameStateSchema: (config: {\n phaseNameSchema: AnySchema;\n publicSchema: AnySchema;\n privateSchema: AnySchema;\n hiddenSchema: AnySchema;\n phasesSchema: AnySchema;\n }) => AnySchema;\n};\n\nexport type GeneratedManifestContractLike<\n Table extends RuntimeTableRecord = RuntimeTableRecord,\n PhaseName extends string = string,\n PlayerId extends string = string,\n DeckId extends string = string,\n HandId extends string = string,\n CardId extends string = string,\n> = ReducerManifestContract<Table, PhaseName, PlayerId, DeckId, HandId, CardId>;\n\nexport type ManifestContract<Table extends RuntimeTableRecord> =\n ReducerManifestContract<\n Table,\n string,\n PlayerIdOfTable<Table>,\n DeckIdOfTable<Table>,\n HandIdOfTable<Table>,\n CardIdOfTable<Table>\n >;\n\nfunction toNonEmptyStringTuple<Values extends readonly string[]>(\n values: Values,\n): [Values[number], ...Array<Values[number]>] {\n const [first, ...rest] = Array.from(values);\n if (typeof first === \"undefined\") {\n throw new Error(\"Expected a non-empty literal tuple\");\n }\n return [first as Values[number], ...(rest as Array<Values[number]>)];\n}\n\n/**\n * Registry of Zod schemas produced by `createManifestStringLiteralSchema`.\n *\n * The schemas returned from this helper are the canonical manifest-scoped\n * branded schemas (e.g. `manifest.ids.playerId`). When a manifest has zero\n * members for a given id family the underlying schema falls back to plain\n * `z.string()`, which is indistinguishable from an author-written\n * `z.string()` at runtime. This WeakSet lets `defineGameContract` recognise\n * the manifest-supplied case and not flag it as a raw string.\n */\nconst manifestScopedSchemas = new WeakSet<object>();\n\nexport function markManifestScopedSchema<Schema extends z.ZodTypeAny>(\n schema: Schema,\n): Schema & ManifestIdSchema<z.infer<Schema>> {\n manifestScopedSchemas.add(schema as unknown as object);\n return schema as Schema & ManifestIdSchema<z.infer<Schema>>;\n}\n\nexport function isManifestScopedSchema(schema: unknown): boolean {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n manifestScopedSchemas.has(schema as object)\n );\n}\n\nexport function createManifestStringLiteralSchema<\n Values extends readonly string[],\n>(\n values: Values,\n): ManifestIdSchema<Values[number] extends never ? string : Values[number]> {\n const schema =\n values.length === 0\n ? (z.string() as z.ZodType<\n Values[number] extends never ? string : Values[number]\n >)\n : (z.enum(toNonEmptyStringTuple(values)) as z.ZodType<\n Values[number] extends never ? string : Values[number]\n >);\n return markManifestScopedSchema(schema);\n}\n\nexport function assumeManifestSchema<Output>(\n schema: z.ZodTypeAny,\n): z.ZodType<Output> {\n return schema as z.ZodType<Output>;\n}\n\nexport function cloneManifestDefault<Value>(value: Value): Value {\n if (typeof globalThis.structuredClone === \"function\") {\n return globalThis.structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as Value;\n}\n\nexport function resolveManifestPlayerIds<PlayerId extends string>(\n manifestPlayerIds: readonly PlayerId[],\n playerIds: readonly string[] | undefined,\n): readonly PlayerId[] {\n if (!playerIds || playerIds.length === 0) {\n return manifestPlayerIds;\n }\n\n const knownPlayerIds = new Set<string>(manifestPlayerIds);\n return playerIds.filter((playerId): playerId is PlayerId =>\n knownPlayerIds.has(playerId),\n );\n}\n\nexport function createManifestRuntimeSchema<\n PhaseNameSchema extends z.ZodTypeAny,\n PlayerId extends string,\n SetupProfileId extends string,\n>({\n phaseNameSchema,\n playerIdSchema,\n setupProfileIdSchema,\n}: {\n phaseNameSchema: PhaseNameSchema;\n playerIdSchema: z.ZodType<PlayerId>;\n setupProfileIdSchema: z.ZodType<SetupProfileId>;\n}) {\n return z.object({\n prompts: z\n .array(\n z.object({\n id: z.string(),\n promptId: z.string(),\n to: playerIdSchema,\n title: z.string().optional(),\n payload: z.unknown().optional(),\n options: z\n .array(z.object({ id: z.string(), label: z.string() }))\n .optional(),\n resume: z.object({ id: z.string(), data: z.unknown() }),\n }),\n )\n .default([]),\n rng: z\n .object({\n seed: z.number().nullable().optional(),\n cursor: z.number().int().default(0),\n trace: z.array(z.string()).default([]),\n })\n .default({\n seed: null,\n cursor: 0,\n trace: [],\n }),\n setup: z\n .object({\n profileId: setupProfileIdSchema,\n optionValues: z.record(z.string(), z.string().nullable()).default({}),\n })\n .nullable()\n .default(null),\n simultaneous: z\n .object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: z.unknown(),\n }),\n ),\n })\n .nullable(),\n })\n .default({ current: null }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable()\n .default(null),\n nextInstanceId: z.number().int().default(1),\n });\n}\n\nexport function createManifestGameStateSchema<\n Table extends RuntimeTableRecord,\n PhaseNameSchema extends z.ZodTypeAny,\n PublicSchema extends z.ZodTypeAny,\n PrivateSchema extends z.ZodTypeAny,\n HiddenSchema extends z.ZodTypeAny,\n PhasesSchema extends z.ZodTypeAny,\n PlayerId extends string,\n SetupProfileId extends string,\n>({\n tableSchema,\n playerIdSchema,\n setupProfileIdSchema,\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n}: {\n tableSchema: z.ZodType<Table>;\n playerIdSchema: z.ZodType<PlayerId>;\n setupProfileIdSchema: z.ZodType<SetupProfileId>;\n phaseNameSchema: PhaseNameSchema;\n publicSchema: PublicSchema;\n privateSchema: PrivateSchema;\n hiddenSchema: HiddenSchema;\n phasesSchema: PhasesSchema;\n}) {\n return z.object({\n table: tableSchema,\n public: publicSchema,\n private: z.record(z.string(), privateSchema),\n hidden: hiddenSchema,\n flow: z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n }),\n phase: phasesSchema,\n runtime: createManifestRuntimeSchema({\n phaseNameSchema,\n playerIdSchema,\n setupProfileIdSchema,\n }),\n });\n}\n\n// --- State Definition ---\n\nexport type StateDefinition<\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n> = {\n public: PublicSchema;\n private: PrivateSchema;\n hidden: HiddenSchema;\n};\n\nexport type InitContext<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n > = ManifestContract<Table>,\n> = {\n manifest: Manifest;\n table: Table;\n playerIds: PlayerIdOfTable<Table>[];\n rngSeed?: number | null;\n setup: SetupSelectionOfManifest<Manifest> | null;\n q: TableQueriesOfState<{ table: Table }>;\n};\n\nexport type InitSetupSelectionInput<\n Manifest extends ReducerManifestContract<\n RuntimeTableRecord,\n string,\n string,\n string,\n string,\n string\n > = GeneratedManifestContractLike,\n> = SetupSelectionInputOfManifest<Manifest>;\n\n// --- Setup Bootstrap Types ---\n\nexport type SetupBootstrapSharedZoneRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedZone\";\n zoneId: SharedZoneIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerZoneRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerZone\";\n zoneId: PlayerZoneIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapSharedBoardContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerBoardContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapSharedBoardSpaceRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedBoardSpace\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n spaceId: SpaceIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerBoardSpaceRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerBoardSpace\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n spaceId: SpaceIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | SetupBootstrapSharedZoneRef<Manifest>\n | SetupBootstrapPerPlayerZoneRef<Manifest>\n | SetupBootstrapSharedBoardContainerRef<Manifest>\n | SetupBootstrapPerPlayerBoardContainerRef<Manifest>;\n\nexport type SetupBootstrapDestinationRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | SetupBootstrapContainerRef<Manifest>\n | SetupBootstrapSharedBoardSpaceRef<Manifest>\n | SetupBootstrapPerPlayerBoardSpaceRef<Manifest>;\n\nexport type SetupBootstrapPerPlayerContainerTemplateRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | {\n type: \"playerZone\";\n zoneId: PlayerZoneIdOfManifest<Manifest>;\n }\n | {\n type: \"playerBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n };\n\nexport type SetupBootstrapStep<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | {\n type: \"shuffle\";\n container: SetupBootstrapContainerRef<Manifest>;\n }\n | {\n type: \"move\";\n from: SetupBootstrapContainerRef<Manifest>;\n to: SetupBootstrapDestinationRef<Manifest>;\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<Manifest>\n | PieceIdOfManifest<Manifest>\n | DieIdOfManifest<Manifest>\n )[];\n }\n | {\n type: \"deal\";\n from:\n | SetupBootstrapSharedZoneRef<Manifest>\n | SetupBootstrapSharedBoardContainerRef<Manifest>;\n to: SetupBootstrapPerPlayerContainerTemplateRef<Manifest>;\n count: number;\n playerIds?: readonly PlayerIdOfManifest<Manifest>[];\n };\n\nexport type SetupProfileDefinition<\n PhaseName extends string = string,\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n initialPhase?: PhaseName;\n bootstrap?: readonly SetupBootstrapStep<Manifest>[];\n};\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"./model\";\n\nexport type SparseMap<Key extends string, Value> = Partial<Record<Key, Value>>;\nexport type SparseCounts<Key extends string> = SparseMap<Key, number>;\n\ntype SparseSchemaMetadata = {\n keySchema: z.ZodType<string>;\n valueSchema: z.ZodTypeAny;\n};\n\nconst sparseSchemas = new WeakMap<object, SparseSchemaMetadata>();\n\nexport function sparseMap<\n KeySchema extends z.ZodType<string>,\n ValueSchema extends z.ZodTypeAny,\n>(\n keySchema: KeySchema,\n valueSchema: ValueSchema,\n): z.ZodType<SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>> {\n const schema = z.partialRecord(keySchema, valueSchema) as z.ZodType<\n SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>\n >;\n sparseSchemas.set(schema as unknown as object, {\n keySchema,\n valueSchema,\n });\n return schema;\n}\n\nexport function sparseCounts<KeySchema extends z.ZodType<string>>(\n keySchema: KeySchema,\n): z.ZodType<SparseCounts<z.infer<KeySchema>>> {\n return sparseMap(keySchema, z.number().int().min(0)) as z.ZodType<\n SparseCounts<z.infer<KeySchema>>\n >;\n}\n\nexport function getZodDef(schema: unknown): {\n type?: string;\n} & Record<string, unknown> {\n const anySchema = schema as {\n _zod?: { def?: Record<string, unknown> };\n def?: Record<string, unknown>;\n };\n const fromInternal = anySchema?._zod?.def;\n if (fromInternal && typeof fromInternal === \"object\") {\n return fromInternal;\n }\n const fromLegacy = anySchema?.def;\n if (fromLegacy && typeof fromLegacy === \"object\") {\n return fromLegacy;\n }\n return {};\n}\n\nexport function unwrapWrappers(schema: unknown): unknown {\n let current = schema;\n while (true) {\n const def = getZodDef(current);\n const innerType = def.innerType;\n if (\n (def.type === \"nullable\" ||\n def.type === \"optional\" ||\n def.type === \"default\" ||\n def.type === \"readonly\" ||\n def.type === \"catch\") &&\n innerType\n ) {\n current = innerType;\n continue;\n }\n return current;\n }\n}\n\nexport function isPlainZodString(schema: unknown): boolean {\n return getZodDef(schema).type === \"string\";\n}\n\nexport function isZodArray(schema: unknown): boolean {\n return getZodDef(schema).type === \"array\";\n}\n\nexport function isEnumKeyedRecordSchema(schema: unknown): boolean {\n const def = getZodDef(schema);\n const keyType = def.keyType;\n return (\n def.type === \"record\" &&\n typeof keyType === \"object\" &&\n keyType !== null &&\n getZodDef(keyType).type === \"enum\"\n );\n}\n\nexport function isSparseMapSchema(schema: unknown): boolean {\n const inner = unwrapWrappers(schema);\n return (\n typeof inner === \"object\" &&\n inner !== null &&\n sparseSchemas.has(inner as object)\n );\n}\n\nfunction getSparseSchemaMetadata(\n schema: unknown,\n): SparseSchemaMetadata | undefined {\n const inner = unwrapWrappers(schema);\n if (typeof inner !== \"object\" || inner === null) {\n return undefined;\n }\n return sparseSchemas.get(inner as object);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getObjectShape(\n schema: unknown,\n): Record<string, unknown> | null {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return null;\n }\n const shape = def.shape;\n if (typeof shape === \"function\") {\n const resolved = shape();\n return resolved && typeof resolved === \"object\"\n ? (resolved as Record<string, unknown>)\n : null;\n }\n return shape && typeof shape === \"object\"\n ? (shape as Record<string, unknown>)\n : null;\n}\n\nfunction normalizeSchemaInput(schema: unknown, input: unknown): unknown {\n const inner = unwrapWrappers(schema);\n const sparse = getSparseSchemaMetadata(inner);\n if (sparse && isPlainObject(input)) {\n const filtered = Object.fromEntries(\n Object.entries(input)\n .filter(\n ([key, value]) =>\n typeof value !== \"undefined\" &&\n sparse.keySchema.safeParse(key).success,\n )\n .map(([key, value]) => [\n key,\n normalizeSchemaInput(sparse.valueSchema, value),\n ]),\n );\n return filtered;\n }\n\n const shape = getObjectShape(inner);\n if (shape && isPlainObject(input)) {\n return Object.fromEntries(\n Object.entries(input).map(([key, value]) => {\n const fieldSchema = shape[key];\n return [\n key,\n typeof fieldSchema === \"undefined\"\n ? value\n : normalizeSchemaInput(fieldSchema, value),\n ];\n }),\n );\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && Array.isArray(input) && def.element) {\n return input.map((value) => normalizeSchemaInput(def.element, value));\n }\n\n return input;\n}\n\nexport function normalizeCommandParams<Output>(\n schema: SchemaLike<Output>,\n input: unknown,\n): Output {\n return schema.parse(normalizeSchemaInput(schema, input));\n}\n","import {\n isManifestScopedSchema,\n type ManifestContract,\n type RuntimeTableRecord,\n type SchemaLike,\n} from \"../model\";\nimport type { InputCollector } from \"../model\";\nimport {\n getObjectShape,\n getZodDef,\n isEnumKeyedRecordSchema,\n isPlainZodString,\n isSparseMapSchema,\n isZodArray,\n unwrapWrappers,\n} from \"../schema-helpers\";\nimport type { AnyReducerGameContract } from \"./types\";\n\n/**\n * Canonical set of manifest-scoped id field names. `defineGameContract`\n * uses this list to reject state schemas that describe one of these fields\n * with a raw `z.string()` instead of the corresponding branded enum from\n * `manifest.ids.*` (or `gameContract.schemas.*`).\n *\n * The rule of thumb is \"one way to do things\": if a field *is* a player id,\n * card id, zone id, etc. in the manifest, the authored state schema must\n * reuse the same literal/branded schema so generated types line up with the\n * runtime checks, instead of silently widening to `string`.\n */\nconst MANIFEST_SCOPED_ID_NAMES = [\n \"playerId\",\n \"cardId\",\n \"deckId\",\n \"handId\",\n \"zoneId\",\n \"sharedZoneId\",\n \"playerZoneId\",\n \"boardId\",\n \"boardContainerId\",\n \"boardTypeId\",\n \"boardBaseId\",\n \"edgeId\",\n \"edgeTypeId\",\n \"vertexId\",\n \"vertexTypeId\",\n \"spaceId\",\n \"spaceTypeId\",\n \"relationTypeId\",\n \"resourceId\",\n \"pieceId\",\n \"pieceTypeId\",\n \"dieId\",\n \"dieTypeId\",\n \"setupOptionId\",\n \"setupProfileId\",\n \"cardSetId\",\n \"cardType\",\n] as const;\n\ntype ManifestScopedIdName = (typeof MANIFEST_SCOPED_ID_NAMES)[number];\n\nfunction matchManifestScopedIdName(\n key: string,\n): { name: ManifestScopedIdName; kind: \"singular\" | \"plural\" } | null {\n for (const name of MANIFEST_SCOPED_ID_NAMES) {\n const capitalized = `${name.charAt(0).toUpperCase()}${name.slice(1)}`;\n if (key === name || key.endsWith(capitalized)) {\n return { name, kind: \"singular\" };\n }\n const plural = `${name}s`;\n const capitalizedPlural = `${capitalized}s`;\n if (key === plural || key.endsWith(capitalizedPlural)) {\n return { name, kind: \"plural\" };\n }\n }\n return null;\n}\n\nexport function validateInteractionParamsSchema(\n schema: unknown,\n context: \"defineInteraction\" | \"defineCardAction\",\n path: string,\n): void {\n const inner = unwrapWrappers(schema);\n if (isEnumKeyedRecordSchema(inner) && !isSparseMapSchema(inner)) {\n throw new Error(\n `${context}: ${path} uses an enum-keyed z.record(...), which parses as a total map at runtime. ` +\n `Use sparseMap(...) or sparseCounts(...) from @dreamboard-games/sdk/reducer instead so interaction params stay sparse and match runtime validation.`,\n );\n }\n\n const shape = getObjectShape(inner);\n if (shape) {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n validateInteractionParamsSchema(fieldSchema, context, `${path}.${key}`);\n }\n return;\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && def.element) {\n validateInteractionParamsSchema(def.element, context, `${path}[]`);\n return;\n }\n\n if (def.type === \"record\" && def.valueType) {\n validateInteractionParamsSchema(def.valueType, context, `${path}.*`);\n }\n}\n\nexport function validateInteractionInputsSchema(\n inputs: Record<string, InputCollector> | undefined,\n context: \"defineInteraction\" | \"defineCardAction\",\n): void {\n if (!inputs) return;\n for (const [key, collector] of Object.entries(inputs)) {\n validateInteractionParamsSchema(collector.schema, context, `inputs.${key}`);\n }\n}\n\nexport function validateManyCommitPolicy(input: {\n inputs: Record<string, InputCollector> | undefined;\n commit?: { mode: string };\n context: string;\n}): void {\n if (input.commit?.mode !== \"autoWhenReady\") return;\n if (\n Object.values(input.inputs ?? {}).some(\n (collector) => collector.selection?.mode === \"many\",\n )\n ) {\n throw new Error(\n `${input.context}: interactions with many(...) inputs must use commit: { mode: \"manual\" }.`,\n );\n }\n}\n\nexport function validateInteractionLikeDefinition(\n input: {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n context: \"defineInteraction\" | \"defineCardAction\",\n): void {\n validateInteractionInputsSchema(input.inputs, context);\n validateManyCommitPolicy({\n inputs: input.inputs,\n commit: input.commit,\n context,\n });\n if (input.paramsSchema) {\n validateInteractionParamsSchema(\n input.paramsSchema,\n context,\n \"paramsSchema\",\n );\n }\n}\n\nexport function validateStateSchemaIdBranding(\n schema: unknown,\n scope: \"public\" | \"private\" | \"hidden\",\n): void {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return;\n }\n const shape = def.shape as Record<string, unknown> | undefined;\n if (!shape) {\n return;\n }\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const match = matchManifestScopedIdName(key);\n if (!match) {\n continue;\n }\n const inner = unwrapWrappers(fieldSchema);\n if (match.kind === \"singular\") {\n if (isPlainZodString(inner) && !isManifestScopedSchema(inner)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses a raw z.string() ` +\n `but its name identifies it as a manifest-scoped '${match.name}'. ` +\n `Use gameContract.schemas.${match.name} (or manifest.ids.${match.name}) ` +\n `so the branded literal union flows through state types.`,\n );\n }\n continue;\n }\n if (match.kind === \"plural\" && isZodArray(inner)) {\n const element = unwrapWrappers(getZodDef(inner).element);\n if (isPlainZodString(element) && !isManifestScopedSchema(element)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses z.array(z.string()) ` +\n `but its name identifies it as manifest-scoped '${match.name}' values. ` +\n `Use z.array(gameContract.schemas.${match.name}) ` +\n `(or manifest.ids.${match.name}) so the branded literal union flows through state types.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGamePhaseNames(definition: {\n contract: AnyReducerGameContract;\n phases: Record<string, unknown>;\n initialPhase?: string;\n setupProfiles?: Record<string, { initialPhase?: string }>;\n}): void {\n const contractPhaseNames = (\n definition.contract as AnyReducerGameContract & {\n phaseNames?: readonly string[];\n }\n ).phaseNames;\n if (!Array.isArray(contractPhaseNames)) {\n return;\n }\n const declared = new Set(contractPhaseNames);\n const actual = new Set(Object.keys(definition.phases));\n const missing = [...declared].filter((name) => !actual.has(name));\n const extra = [...actual].filter((name) => !declared.has(name));\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = [];\n if (missing.length > 0) {\n parts.push(`missing: [${missing.join(\", \")}]`);\n }\n if (extra.length > 0) {\n parts.push(`extra: [${extra.join(\", \")}]`);\n }\n throw new Error(\n `defineGame: phases record does not match contract.phaseNames (${parts.join(\n \"; \",\n )}). Update contract.phaseNames or the phases record so they agree.`,\n );\n }\n if (\n definition.initialPhase !== undefined &&\n !declared.has(definition.initialPhase)\n ) {\n throw new Error(\n `defineGame: initialPhase '${definition.initialPhase}' is not declared in contract.phaseNames.`,\n );\n }\n if (definition.setupProfiles) {\n for (const [profileId, profile] of Object.entries(\n definition.setupProfiles,\n )) {\n const initial = profile?.initialPhase;\n if (initial !== undefined && !declared.has(initial)) {\n throw new Error(\n `defineGame: setupProfiles.${profileId}.initialPhase '${initial}' is not declared in contract.phaseNames.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGameZoneWiring(definition: {\n contract: {\n manifest: ManifestContract<RuntimeTableRecord>;\n };\n phases: Record<string, unknown>;\n}): void {\n const manifestPlayerZoneIds = new Set(\n definition.contract.manifest.literals.playerZoneIds ?? [],\n );\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n zones?: Record<string, unknown>;\n cardActions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord) continue;\n\n if (phaseRecord.zones !== undefined && !Array.isArray(phaseRecord.zones)) {\n const zonesRecord =\n typeof phaseRecord.zones === \"object\" && phaseRecord.zones !== null\n ? (phaseRecord.zones as Record<string, unknown>)\n : null;\n const hasRemovedZoneSpec =\n zonesRecord &&\n Object.values(zonesRecord).some(\n (zone) =>\n typeof zone === \"object\" &&\n zone !== null &&\n (\"cardsFrom\" in zone || \"playableVia\" in zone || \"from\" in zone),\n );\n if (hasRemovedZoneSpec) {\n throw new Error(\n `defineGame: phases.${phaseName}.zones uses removed zone spec objects. Use zones: [\"manifest-player-zone-id\"] and cardActions[*].playFrom instead.`,\n );\n }\n throw new Error(\n `defineGame: phases.${phaseName}.zones must be an array of manifest player zone ids.`,\n );\n }\n\n for (const [index, zoneId] of (phaseRecord.zones ?? []).entries()) {\n if (typeof zoneId !== \"string\") {\n throw new Error(\n `defineGame: phases.${phaseName}.zones[${index}] must be a manifest player zone id string.`,\n );\n }\n if (!manifestPlayerZoneIds.has(zoneId)) {\n throw new Error(\n `defineGame: phases.${phaseName}.zones[${index}] '${zoneId}' is not declared in manifest.literals.playerZoneIds.`,\n );\n }\n }\n\n for (const [actionId, action] of Object.entries(\n phaseRecord.cardActions ?? {},\n )) {\n const actionRecord =\n typeof action === \"object\" && action !== null\n ? (action as Record<string, unknown>)\n : null;\n const playFrom = actionRecord?.playFrom;\n if (\n typeof playFrom === \"string\" &&\n !manifestPlayerZoneIds.has(playFrom)\n ) {\n throw new Error(\n `defineGame: phases.${phaseName}.cardActions.${actionId}.playFrom '${playFrom}' is not declared in manifest.literals.playerZoneIds.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGameSimultaneousPhases(definition: {\n phases: Record<string, unknown>;\n}): void {\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n kind?: unknown;\n submit?: { inputs?: Record<string, InputCollector> };\n resolve?: unknown;\n interactions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord || phaseRecord.kind !== \"simultaneousPlayer\") {\n continue;\n }\n if (!phaseRecord.submit) {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare submit.`,\n );\n }\n if (typeof phaseRecord.resolve !== \"function\") {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare resolve.`,\n );\n }\n if (phaseRecord.interactions?.submit) {\n throw new Error(\n `defineGame: phases.${phaseName}.interactions.submit conflicts with the reserved simultaneous submit interaction id.`,\n );\n }\n validateInteractionInputsSchema(\n phaseRecord.submit.inputs,\n \"defineInteraction\",\n );\n validateManyCommitPolicy({\n inputs: phaseRecord.submit.inputs,\n commit: (phaseRecord.submit as { commit?: { mode: string } }).commit,\n context: `defineGame: phases.${phaseName}.submit`,\n });\n }\n}\n\nexport type ManifestIdSchemasOf<\n Ids extends Record<string, SchemaLike<unknown>>,\n> = {\n readonly [Key in keyof Ids]: Ids[Key] extends SchemaLike<infer Output>\n ? Ids[Key] & import(\"../model\").ManifestIdSchema<Output>\n : Ids[Key];\n};\n","import { z } from \"zod\";\nimport { createManifestStringLiteralSchema } from \"../model/manifest\";\nimport type {\n ReducerGameContract,\n ReducerManifestContract,\n RuntimeTableRecord,\n SchemaLike,\n StateDefinition,\n} from \"../model\";\nimport {\n type ManifestIdSchemasOf,\n validateStateSchemaIdBranding,\n} from \"./validation\";\n\n/**\n * Narrows a manifest's `literals.phaseNames` and `ids.phaseName` to the\n * author-supplied phase-name tuple. Lets `defineGameContract` override the\n * codegen-emitted `phaseNames: readonly string[]` / `phaseName: z.string()`\n * placeholders so `PhaseNameOfContract<Contract>` resolves to a literal\n * union and flows through `fx.transition`, `PhaseMapOf`, and the flow\n * state's `currentPhase`.\n */\ntype NarrowManifestPhaseNames<\n Manifest,\n PhaseNames extends readonly string[],\n> = Omit<Manifest, \"literals\" | \"ids\"> & {\n literals: Manifest extends { literals: infer L }\n ? Omit<L, \"phaseNames\"> & { phaseNames: PhaseNames }\n : { phaseNames: PhaseNames };\n ids: Manifest extends { ids: infer I }\n ? Omit<I, \"phaseName\"> & { phaseName: z.ZodType<PhaseNames[number]> }\n : { phaseName: z.ZodType<PhaseNames[number]> };\n};\n\ntype ReducerGameContractInput<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n Phases extends Record<string, SchemaLike<object>>,\n> = {\n manifest: Manifest;\n state: StateDefinition<PublicSchema, PrivateSchema, HiddenSchema>;\n phases: Phases;\n};\n\nexport function defineGameContract<\n Table extends RuntimeTableRecord,\n const Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n const Phases extends Record<string, SchemaLike<object>>,\n>(\n definition: ReducerGameContractInput<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases\n >,\n): ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases\n> & {\n readonly phases: Phases;\n readonly phaseNames: readonly (keyof Phases & string)[];\n /**\n * Ergonomic shortcut to the manifest-backed Zod id schemas. Equivalent to\n * `definition.manifest.ids`. Prefer `gameContract.schemas.playerId` etc.\n * over re-importing the generated `ids` namespace so that every authored\n * schema is anchored to the same SDK-guided source.\n */\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n} {\n validateStateSchemaIdBranding(definition.state.public, \"public\");\n validateStateSchemaIdBranding(definition.state.private, \"private\");\n validateStateSchemaIdBranding(definition.state.hidden, \"hidden\");\n const phaseNames = Object.keys(definition.phases) as (keyof Phases &\n string)[];\n if (phaseNames.length === 0) {\n throw new Error(\n \"defineGameContract: phases must be a non-empty record of phase schemas.\",\n );\n }\n for (const name of phaseNames) {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new Error(\n \"defineGameContract: phase names must be non-empty strings.\",\n );\n }\n }\n const phaseNameSchema = createManifestStringLiteralSchema(phaseNames);\n const narrowedManifest = {\n ...definition.manifest,\n literals: {\n ...definition.manifest.literals,\n phaseNames,\n },\n ids: {\n ...definition.manifest.ids,\n phaseName: phaseNameSchema,\n },\n } as unknown as NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >;\n const contract = {\n manifest: narrowedManifest,\n state: definition.state,\n phases: definition.phases,\n phaseNames,\n schemas: narrowedManifest.ids,\n } as ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases\n > & {\n readonly phases: Phases;\n readonly phaseNames: readonly (keyof Phases & string)[];\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n };\n return contract;\n}\n","import { z } from \"zod\";\nimport type {\n AnySchema,\n ContinuationCallable,\n EffectRollDieDefinition,\n EffectShuffleDefinition,\n EffectShufflePlayerZoneDefinition,\n ResumableEffectKind,\n} from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nfunction createContinuationCallable<\n DataSchema extends AnySchema,\n ResponseSchema extends AnySchema,\n State extends {\n table: import(\"../model\").RuntimeTableRecord;\n flow: { currentPhase: string };\n },\n Manifest extends import(\"../model\").ManifestContract<\n import(\"../model\").TableOfState<State>\n >,\n EffectType extends ResumableEffectKind = ResumableEffectKind,\n>(definition: {\n id: string;\n data: DataSchema;\n response: ResponseSchema;\n effectKind?: EffectType;\n reduce: ContinuationCallable<\n DataSchema,\n State,\n Manifest,\n string,\n EffectType\n >[\"reduce\"];\n}): ContinuationCallable<DataSchema, State, Manifest, string, EffectType> {\n const continuation = ((data: z.infer<DataSchema>) => {\n return {\n id: continuation.id,\n data,\n };\n }) as ContinuationCallable<DataSchema, State, Manifest, string, EffectType>;\n continuation.id = definition.id;\n continuation.source = \"effect\";\n continuation.dataSchema = definition.data;\n continuation.responseSchema = definition.response;\n continuation.reduce = definition.reduce;\n if (definition.effectKind !== undefined) {\n continuation.effectKind = definition.effectKind;\n }\n return continuation;\n}\n\n// --- `defineEffect` ---\n//\n// Authoring factory for engine-side resumable effects (cues). An effect\n// is the registered bundle of continuation callable + optional reduce,\n// discriminated by `type` which aligns directly with `ResumableEffectKind`:\n//\n// defineEffect<GameContract>()({ type: \"rollDie\", id, context?, reduce? })\n// defineEffect<GameContract>()({ type: \"shuffleSharedZone\", id, context?, reduce? })\n//\n// Authored effects are registered under `phase.effects` and invoked from\n// a reducer via `fx.effect(effect, options)`. The wire protocol already\n// isolates the continuation payload into the ingress bundle's\n// `continuations` map keyed by `effectId`, so `fx.effect` never attaches\n// `resume: undefined` to the wire effect.\n//\n// Addressed player requests are *not* effects. Author them as\n// prompt-kind interactions via `defineInteraction({ kind: \"prompt\",\n// to, options, ... })`.\n\ntype EffectRollDieInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"rollDie\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"rollDie\"\n >[\"reduce\"];\n};\n\ntype EffectShuffleInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shuffleSharedZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shuffleSharedZone\"\n >[\"reduce\"];\n};\n\ntype EffectShufflePlayerZoneInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shufflePlayerZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shufflePlayerZone\"\n >[\"reduce\"];\n};\n\nexport function defineEffect<Contract extends AnyReducerGameContract>() {\n type EffectInput =\n | EffectRollDieInput<Contract, string, AnySchema>\n | EffectShuffleInput<Contract, string, AnySchema>\n | EffectShufflePlayerZoneInput<Contract, string, AnySchema>;\n type EffectOutput =\n | EffectRollDieDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShuffleDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShufflePlayerZoneDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectRollDieInput<Contract, Id, ContextSchema>,\n ): EffectRollDieDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShuffleInput<Contract, Id, ContextSchema>,\n ): EffectShuffleDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShufflePlayerZoneInput<Contract, Id, ContextSchema>,\n ): EffectShufflePlayerZoneDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect(definition: EffectInput): EffectOutput {\n if (\n definition.type === \"rollDie\" ||\n definition.type === \"shuffleSharedZone\" ||\n definition.type === \"shufflePlayerZone\"\n ) {\n const effectKind: ResumableEffectKind = definition.type;\n if (!definition.reduce) {\n return {\n type: definition.type,\n id: definition.id,\n contextSchema: definition.context,\n } as EffectOutput;\n }\n const contextSchema = (definition.context ?? z.object({})) as AnySchema;\n const continuation = createContinuationCallable<\n AnySchema,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n ResumableEffectKind\n >({\n id: definition.id,\n data: contextSchema,\n response: z.unknown() as AnySchema,\n effectKind,\n reduce: definition.reduce,\n });\n return {\n type: definition.type,\n id: definition.id,\n contextSchema,\n __continuation: continuation,\n } as EffectOutput;\n }\n throw new Error(\n `defineEffect: unknown effect definition. Expected type 'rollDie' | 'shuffleSharedZone' | 'shufflePlayerZone'. Addressed prompts are authored as prompt-kind interactions via defineInteraction({ kind: \"prompt\" }).`,\n );\n }\n return effect;\n}\n","import type { PhaseMapOf, ReducerGameDefinition, ViewMapOf } from \"../model\";\nimport type { AnyReducerGameContract } from \"./types\";\nimport {\n validateDefineGamePhaseNames,\n validateDefineGameSimultaneousPhases,\n validateDefineGameZoneWiring,\n} from \"./validation\";\n\nexport function defineGame<\n const Contract extends AnyReducerGameContract,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract> = Record<string, never>,\n>(\n definition: { contract: Contract } & Omit<\n ReducerGameDefinition<NoInfer<Contract>, Definitions, Views>,\n \"contract\"\n >,\n): ReducerGameDefinition<Contract, Definitions, Views> {\n validateDefineGamePhaseNames(definition);\n validateDefineGameSimultaneousPhases(definition);\n validateDefineGameZoneWiring(definition);\n return definition;\n}\n","import type {\n CardActionSpec,\n InputCollector,\n InteractionRule,\n InteractionSpec,\n PlayerZoneIdOfManifest,\n ScopedPhaseState,\n} from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n InferPhaseState,\n PhaseStateInput,\n} from \"./types\";\nimport { validateInteractionLikeDefinition } from \"./validation\";\n\nexport function defineInteraction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <Collectors extends Record<string, InputCollector>>(\n definition: InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>\n >,\n ): InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineInteraction\",\n );\n return definition;\n };\n}\n\nexport function defineInteractionRule<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n >(\n definition: InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>\n >,\n ): InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>\n > => definition;\n}\n\nexport function defineCardAction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<string, never>,\n const PlayFrom extends PlayerZoneIdOfManifest<ContractManifest<Contract>> =\n PlayerZoneIdOfManifest<ContractManifest<Contract>>,\n >(\n definition: CardActionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n PlayFrom\n >,\n ): CardActionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n PlayFrom\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineCardAction\",\n );\n return definition;\n };\n}\n","import { z } from \"zod\";\nimport type {\n AnyCardActionSpec,\n AnyInteractionSpec,\n CardActionMap,\n EffectMap,\n InputCollector,\n ManifestContract,\n PhaseDefinition,\n PhaseZoneList,\n PlayerIdOfState,\n RuntimeTableRecord,\n SchemaLike,\n ScopedPhaseState,\n SetupSelectionOfManifest,\n StageMap,\n TableOfState,\n} from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\ntype StepPhaseState<\n PhaseStateSchema extends SchemaLike<object>,\n Steps extends readonly string[],\n> = z.infer<PhaseStateSchema> & { step: Steps[number] };\n\ntype StepPhaseInteractionEntry<Step extends string, Interaction> = {\n steps: readonly Step[];\n interaction: Interaction;\n};\n\ntype StepPhaseCardActionEntry<Step extends string, Action> = {\n steps: readonly Step[];\n action: Action;\n};\n\ntype StepPhaseInteractionMap<\n Step extends string,\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n> = Record<\n string,\n StepPhaseInteractionEntry<Step, AnyInteractionSpec<State, Manifest>>\n>;\n\ntype StepPhaseCardActionMap<\n Step extends string,\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n> = Record<\n string,\n StepPhaseCardActionEntry<Step, AnyCardActionSpec<State, Manifest>>\n>;\n\ntype UnwrappedStepInteractions<\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n Interactions extends Record<\n string,\n StepPhaseInteractionEntry<string, AnyInteractionSpec<State, Manifest>>\n >,\n> = {\n [Key in keyof Interactions]: Interactions[Key][\"interaction\"];\n};\n\ntype UnwrappedStepCardActions<\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n CardActions extends Record<\n string,\n StepPhaseCardActionEntry<string, AnyCardActionSpec<State, Manifest>>\n >,\n> = {\n [Key in keyof CardActions]: CardActions[Key][\"action\"];\n};\n\nfunction stepStateSchema<Steps extends readonly [string, ...string[]]>(\n schema: SchemaLike<object>,\n steps: Steps,\n): SchemaLike<object> {\n const stepSchema = z.enum(steps);\n const maybeObject = schema as {\n extend?: (shape: { step: typeof stepSchema }) => SchemaLike<object>;\n };\n if (typeof maybeObject.extend === \"function\") {\n return maybeObject.extend({ step: stepSchema });\n }\n return z.intersection(schema, z.object({ step: stepSchema }));\n}\n\nfunction unwrapStepInteractions<\n Step extends string,\n Interactions extends Record<string, StepPhaseInteractionEntry<Step, unknown>>,\n>(interactions: Interactions | undefined) {\n if (!interactions) return undefined;\n return Object.fromEntries(\n Object.entries(interactions).map(([key, entry]) => [\n key,\n {\n ...(entry.interaction as object),\n __steps: entry.steps,\n },\n ]),\n );\n}\n\nfunction unwrapStepCardActions<\n Step extends string,\n CardActions extends Record<string, StepPhaseCardActionEntry<Step, unknown>>,\n>(cardActions: CardActions | undefined) {\n if (!cardActions) return undefined;\n return Object.fromEntries(\n Object.entries(cardActions).map(([key, entry]) => [\n key,\n {\n ...(entry.action as object),\n __steps: entry.steps,\n },\n ]),\n );\n}\n\nexport function definePhase<Contract extends AnyReducerGameContract>() {\n return <\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<\n ContractState<Contract>,\n ContractManifest<Contract>\n > = Record<string, never>,\n Interactions extends Record<\n string,\n AnyInteractionSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<ContractManifest<Contract>> = readonly [],\n CardActions extends CardActionMap<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > = Record<string, never>,\n >(\n definition: PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >,\n ): PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n > => {\n return definition;\n };\n}\n\nexport function defineStepPhase<Contract extends AnyReducerGameContract>() {\n return <\n const Steps extends readonly [string, ...string[]],\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<\n ContractState<Contract>,\n ContractManifest<Contract>\n > = Record<string, never>,\n Interactions extends StepPhaseInteractionMap<\n Steps[number],\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<ContractManifest<Contract>> = readonly [],\n CardActions extends StepPhaseCardActionMap<\n Steps[number],\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n >(\n definition: Omit<\n PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n CardActions\n >\n >,\n \"state\" | \"initialState\" | \"interactions\" | \"cardActions\"\n > & {\n steps: Steps;\n state: PhaseStateSchema;\n initialState?: (ctx: {\n manifest: ContractManifest<Contract>;\n state: ContractState<Contract>;\n playerIds: PlayerIdOfState<ContractState<Contract>>[];\n setup: SetupSelectionOfManifest<ContractManifest<Contract>> | null;\n }) => z.infer<PhaseStateSchema>;\n interactions?: Interactions;\n cardActions?: CardActions;\n },\n ) => {\n const [initialStep] = definition.steps;\n const state = stepStateSchema(definition.state, definition.steps);\n const initialState = definition.initialState\n ? (ctx: Parameters<NonNullable<typeof definition.initialState>>[0]) => ({\n ...definition.initialState?.(ctx),\n step: initialStep,\n })\n : () => ({ step: initialStep });\n const { steps: _steps, ...rest } = definition;\n void _steps;\n const normalized = {\n ...rest,\n state,\n initialState,\n interactions: unwrapStepInteractions(definition.interactions),\n cardActions: unwrapStepCardActions(definition.cardActions),\n };\n return normalized as unknown as PhaseDefinition<\n SchemaLike<StepPhaseState<PhaseStateSchema, Steps>>,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n CardActions\n >\n >;\n };\n}\n","import type { z } from \"zod\";\nimport type {\n ExactManifestContractOf,\n SchemaLike,\n ScopedPhaseState,\n StageSpec,\n StaticViewDefinition,\n ViewDefinition,\n} from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nexport function defineView<Contract extends AnyReducerGameContract>() {\n return <Projection>(\n definition: ViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n >,\n ): ViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n > => definition;\n}\n\n/**\n * Factory for the session-scoped static view (see {@link StaticViewDefinition}).\n * Kept separate from {@link defineView} because the argument shape is\n * structurally different: it exposes only the manifest and generated static\n * queries, with no `state`, `playerId`, `runtime`, `fx`, `ops`, or\n * `accept/reject`. That shape is what prevents authors from accidentally\n * projecting per-tick state into the once-per-session payload.\n */\nexport function defineStaticView<Contract extends AnyReducerGameContract>() {\n return <Projection>(\n definition: StaticViewDefinition<\n ExactManifestContractOf<Contract>,\n Projection\n >,\n ): StaticViewDefinition<ExactManifestContractOf<Contract>, Projection> =>\n definition;\n}\n\nexport function defineStage<Contract extends AnyReducerGameContract>() {\n return (\n definition: StageSpec<ContractState<Contract>, ContractManifest<Contract>>,\n ): StageSpec<ContractState<Contract>, ContractManifest<Contract>> =>\n definition;\n}\n\nexport function definePhaseStage<\n Contract extends AnyReducerGameContract,\n PhaseStateSchema extends SchemaLike<object>,\n>() {\n return (\n definition: StageSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >,\n ): StageSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > => definition;\n}\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"../model/table\";\nimport type { ManifestIdSchema } from \"../model/manifest\";\nimport type {\n BoundedNumberDomainDescriptor,\n ChoiceDomainDescriptor,\n ChoiceListDomainDescriptor,\n CollectorState,\n InputCollector,\n ResourceMapDomainDescriptor,\n} from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport type { DerivedResolver } from \"../derived\";\nimport { isPerPlayer } from \"../per-player\";\nimport type { DependencyValues, InputFieldRef } from \"./defineInputs\";\n\ntype DomainContext<\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n derived: DerivedResolver;\n values: Values;\n};\n\ntype ManifestFormInputSchema =\n | ManifestIdSchema<unknown>\n | z.ZodOptional<ManifestIdSchema<unknown>>\n | z.ZodNullable<ManifestIdSchema<unknown>>;\n\ntype DomainNumber<State extends CollectorState> =\n | number\n | ((context: DomainContext<State>) => number);\n\ntype ChoiceValue = string | null;\n\ntype FormInputDomainDescriptor =\n | ResourceMapDomainDescriptor\n | BoundedNumberDomainDescriptor\n | ChoiceDomainDescriptor\n | ChoiceListDomainDescriptor;\n\ntype DomainChoice<Value extends ChoiceValue, State extends CollectorState> = {\n value: Value;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype DomainChoicePresentation = {\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype ResourceMapChoiceDecorator<State extends CollectorState> = (\n context: DomainContext<State> & {\n resourceId: string;\n label: string;\n icon?: string;\n },\n) => DomainChoicePresentation | null | undefined;\n\ntype ResourceMapChoiceSource<State extends CollectorState> =\n | \"resourceMap\"\n | {\n source: \"resourceMap\";\n decorate?: ResourceMapChoiceDecorator<State>;\n };\n\ntype DomainChoices<Value extends ChoiceValue, State extends CollectorState> =\n | ReadonlyArray<DomainChoice<Value, State>>\n | ResourceMapChoiceSource<State>\n | ((\n context: DomainContext<State>,\n ) => ReadonlyArray<DomainChoice<Value, State>>);\n\ntype DependentDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n> =\n | ReadonlyArray<DomainChoice<Value, State>>\n | ((\n context: DomainContext<State, DependencyValues<Dependencies>>,\n ) => ReadonlyArray<DomainChoice<Value, State>>);\n\ntype ChoiceListDefaultValue<\n Value extends string,\n State extends CollectorState,\n> =\n | Value[]\n | \"all\"\n | ((\n context: DomainContext<State> & {\n choices: ReadonlyArray<DomainChoice<Value, State>>;\n },\n ) => Value[]);\n\ntype ChoiceDefaultValue<\n Value extends ChoiceValue,\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> =\n | Value\n | ((\n context: DomainContext<State, Values> & {\n choices: ReadonlyArray<DomainChoice<Value, State>>;\n },\n ) => Value);\n\ntype ChoiceDefaultResolver<\n Value extends ChoiceValue,\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = (\n context: DomainContext<State, Values> & {\n choices: ReadonlyArray<DomainChoice<Value, State>>;\n },\n) => Value | undefined;\n\nfunction isResourceMapChoiceSource<State extends CollectorState>(\n choices: DomainChoices<ChoiceValue, State>,\n): choices is ResourceMapChoiceSource<State> {\n return (\n choices === \"resourceMap\" ||\n (typeof choices === \"object\" &&\n choices !== null &&\n !Array.isArray(choices) &&\n \"source\" in choices &&\n choices.source === \"resourceMap\")\n );\n}\n\nfunction resolveDomainNumber<State extends CollectorState>(\n value: DomainNumber<State> | undefined,\n context: DomainContext<State>,\n fallback: number,\n): number {\n if (typeof value === \"function\") return value(context);\n return value ?? fallback;\n}\n\nfunction resolveDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n>(\n choices: DomainChoices<Value, State>,\n context: DomainContext<State>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n if (isResourceMapChoiceSource(choices)) {\n return resolveResourceMapChoices(choices, context);\n }\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction resolveDependentDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n>(\n choices: DependentDomainChoices<Value, State, Dependencies>,\n context: DomainContext<State, DependencyValues<Dependencies>>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction choiceValuesInclude(\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n value: ChoiceValue,\n): boolean {\n return choices.some((choice) => Object.is(choice.value, value));\n}\n\nfunction assertChoiceDefaultInChoices(\n inputName: string,\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n defaultValue: ChoiceValue,\n): void {\n if (choiceValuesInclude(choices, defaultValue)) return;\n const printable = defaultValue === null ? \"null\" : `'${defaultValue}'`;\n throw new Error(\n `${inputName} defaultValue ${printable} must be one of its choices. ` +\n \"If null is a valid value, add an explicit { value: null, label: ... } choice.\",\n );\n}\n\nfunction choiceSchema<Value extends ChoiceValue, State extends CollectorState>(\n choices: ReadonlyArray<DomainChoice<Value, State>>,\n): SchemaLike<Value> {\n const values = choices.map((choice) => choice.value);\n const stringValues = values.filter(\n (value): value is Exclude<Value, null> => value !== null,\n );\n const hasNull = values.some((value) => value === null);\n\n if (stringValues.length === 0) {\n return z.null() as unknown as SchemaLike<Value>;\n }\n\n const stringSchema = z.enum(\n stringValues as [Exclude<Value, null>, ...Array<Exclude<Value, null>>],\n );\n\n if (hasNull) {\n return z.union([stringSchema, z.null()]) as unknown as SchemaLike<Value>;\n }\n\n return stringSchema as unknown as SchemaLike<Value>;\n}\n\nfunction resolveResourceMapChoices<State extends CollectorState>(\n choices: ResourceMapChoiceSource<State>,\n context: DomainContext<State>,\n): Array<{\n value: string;\n label: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resources = context.state.table.resources as unknown;\n const firstResourceMap =\n isPerPlayer(resources) && resources.entries.length > 0\n ? resources.entries[0]?.[1]\n : resources;\n if (\n typeof firstResourceMap !== \"object\" ||\n firstResourceMap === null ||\n Array.isArray(firstResourceMap)\n ) {\n return [];\n }\n const decorate = choices === \"resourceMap\" ? undefined : choices.decorate;\n return Object.keys(firstResourceMap)\n .sort()\n .map((resourceId) => {\n const label = resourceId;\n const presentation = decorate?.({ ...context, resourceId, label });\n return {\n value: resourceId,\n label,\n badge: presentation?.badge,\n description: presentation?.description,\n disabled: presentation?.disabled,\n disabledReason: presentation?.disabledReason,\n };\n });\n}\n\nfunction createFormInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return {\n kind: \"form\",\n schema,\n ...(options && \"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n };\n}\n\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(schema: Schema): InputCollector<Schema, State, \"form\">;\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n};\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return createFormInput(schema, options);\n}\n\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n defaultValue: Record<string, number>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n};\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n defaultValue?: Record<string, number>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.record(z.string(), z.number().int().nonnegative()),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"resourceMap\",\n resources: options.resources.map((resource) => ({\n resourceId: resource.resourceId,\n label: resource.label,\n icon: resource.icon,\n min: resolveDomainNumber(resource.min, context, 0),\n max: resolveDomainNumber(resource.max, context, 0),\n })),\n };\n },\n };\n}\n\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n}): InputCollector<z.ZodNumber, State, \"form\">;\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> & {\n readonly defaultValue: number;\n};\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue?: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.number(),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"boundedNumber\",\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, 0),\n step:\n options.step === undefined\n ? undefined\n : resolveDomainNumber(options.step, context, 1),\n };\n },\n };\n}\n\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends ChoiceValue = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends ChoiceValue = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<string, unknown>[] =\n readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<string, unknown>[] =\n readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices:\n | DomainChoices<Value, State>\n | DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n defaultValue: ChoiceDefaultValue<\n Value,\n State,\n Readonly<Record<string, unknown>>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> {\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choice requires at least one choice.\");\n }\n const staticChoices = Array.isArray(options.choices) ? options.choices : null;\n const hasStaticDefault = typeof options.defaultValue !== \"function\";\n const staticDefault = options.defaultValue as ChoiceValue;\n if (staticChoices && hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n staticChoices,\n staticDefault,\n );\n }\n const schema = staticChoices\n ? (choiceSchema(staticChoices) as SchemaLike<Value>)\n : (z.string().nullable() as unknown as SchemaLike<Value>);\n const dynamicDefault =\n typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema,\n ...(hasStaticDefault ? { defaultValue: staticDefault as Value } : {}),\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state,\n playerId,\n q,\n derived,\n values,\n ): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n };\n const choices = dependsOn\n ? resolveDependentDomainChoices(\n options.choices as DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >,\n {\n ...context,\n values: (values ?? {}) as DependencyValues<\n readonly InputFieldRef<string, unknown>[]\n >,\n },\n )\n : resolveDomainChoices(options.choices as DomainChoices<Value, State>, {\n ...context,\n values: {},\n });\n if (hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n choices,\n staticDefault,\n );\n }\n return {\n type: \"choice\",\n choices,\n };\n },\n ...(dynamicDefault\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choice\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n const resolved = dynamicDefault({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n if (resolved === undefined) return undefined;\n assertChoiceDefaultInChoices(\"formInput.choice\", choices, resolved);\n return resolved;\n },\n }\n : {}),\n };\n}\n\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n};\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\">;\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> {\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choiceList requires at least one choice.\");\n }\n const staticDefaultValue = Array.isArray(options.defaultValue)\n ? options.defaultValue\n : undefined;\n const dynamicDefaultValue =\n options.defaultValue === \"all\" || typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema: z.array(z.string()) as unknown as SchemaLike<Value[]>,\n ...(staticDefaultValue !== undefined\n ? { defaultValue: staticDefaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n const choices = resolveDomainChoices(options.choices, context).map(\n (choice) => ({\n ...choice,\n value: choice.value as string,\n }),\n );\n return {\n type: \"choiceList\",\n choices,\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, choices.length),\n };\n },\n ...(dynamicDefaultValue\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choiceList\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n if (dynamicDefaultValue === \"all\") {\n return choices.map((choice) => choice.value);\n }\n return dynamicDefaultValue({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n },\n }\n : {}),\n };\n}\n\ntype FormInputForState<State extends CollectorState> = {\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n ): InputCollector<Schema, State, \"form\">;\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n ): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n };\n resourceMap(\n options: Parameters<typeof resourceMapInput<State>>[0],\n ): ReturnType<typeof resourceMapInput<State>>;\n resourceChoices(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State>;\n number(\n options: Parameters<typeof numberInput<State>>[0],\n ): ReturnType<typeof numberInput<State>>;\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n }): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n };\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n }): InputCollector<SchemaLike<Value>, State, \"form\">;\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n }): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n };\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n }): InputCollector<SchemaLike<Value[]>, State, \"form\">;\n};\n\nfunction formInputForState<\n State extends CollectorState,\n>(): FormInputForState<State> {\n return Object.assign(\n ((schema: ManifestFormInputSchema & SchemaLike<unknown>, options?: {}) =>\n baseFormInput(schema, options as never)) as FormInputForState<State>,\n {\n resourceMap: (options: Parameters<typeof resourceMapInput<State>>[0]) =>\n resourceMapInput<State>(options),\n resourceChoices: (options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }) => formInput.resourceChoices<State>(options),\n number: (options: Parameters<typeof numberInput<State>>[0]) =>\n numberInput<State>(options),\n choice: (options: never) => choiceInput(options),\n choiceList: (options: never) => choiceListInput(options),\n },\n );\n}\n\n/**\n * Manifest-backed id input. Free-form Zod schemas are intentionally explicit:\n * if the runtime cannot disclose valid values or numeric bounds through a\n * manifest id or domain helper, use a custom interaction surface with an\n * explicit `paramsSchema` instead of the default form renderer.\n */\nexport const formInput = Object.assign(baseFormInput, {\n resourceMap: resourceMapInput,\n resourceChoices: <State extends CollectorState = CollectorState>(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State> => ({\n source: \"resourceMap\",\n ...options,\n }),\n number: numberInput,\n choice: choiceInput,\n choiceList: choiceListInput,\n forState: formInputForState,\n});\n","import { z } from \"zod\";\nimport type { Brand } from \"./model/table\";\n\n/**\n * Opaque brand applied to a runtime player identifier.\n *\n * Generators produce a workspace-specific `PlayerId` alias (e.g.\n * `Brand<string, \"PlayerId\">` in `shared/manifest-contract.ts`). Authors\n * obtain `PlayerId` values only through:\n * - `q.player.order()` / `q.player.current()` (reducer queries),\n * - engine-injected callback arguments (actions, phases, prompts),\n * - `perPlayerKeys(...)` / entries iteration,\n * - `asPlayerId(raw)` as an explicit escape hatch (e.g. ingress parsing).\n *\n * The brand is a phantom type: at runtime a `PlayerId` is just a string.\n * Do not JSON-serialize the brand marker; it exists purely at the type\n * level to block accidental literal comparisons such as\n * `playerId === \"player-1\"`.\n */\nexport type PlayerId = Brand<string, \"PlayerId\">;\n\n/**\n * Explicit conversion from a raw string to a branded `PlayerId`.\n *\n * Use at trust boundaries only (wire ingress, tests, fixtures). Inside\n * reducer logic, obtain `PlayerId` values from the engine instead of\n * constructing them yourself.\n */\nexport function asPlayerId(raw: string): PlayerId {\n return raw as PlayerId;\n}\n\n/**\n * Type guard that narrows `unknown` to `PlayerId` when the value is a\n * non-empty string. Does not validate against a specific player roster;\n * use `perPlayerSchema`/ingress parsing for that.\n */\nexport function isPlayerId(value: unknown): value is PlayerId {\n return typeof value === \"string\" && value.length > 0;\n}\n\n/**\n * A runtime-accurate per-player map.\n *\n * `PerPlayer<Value>` is an opaque, ordered container whose entries are\n * exactly the players that exist at runtime (the seats passed to\n * `initialize`).\n *\n * The `__perPlayer` discriminator keeps the structural type nominal-ish\n * without depending on a symbol (symbols do not round-trip through JSON,\n * which this shape must).\n *\n * Construct with `perPlayer(ids, init)` and read with the accessors in\n * this module; do not reach into `entries` directly unless you need\n * ordered iteration.\n */\nexport interface PerPlayer<Value, Id extends PlayerId = PlayerId> {\n readonly __perPlayer: true;\n readonly entries: ReadonlyArray<readonly [Id, Value]>;\n}\n\n/**\n * Construct a `PerPlayer<Value>` with one entry per `id` in `ids`.\n *\n * `ids` is treated as the authoritative runtime seat list: the returned\n * `PerPlayer` contains exactly `ids.length` entries, in the same order.\n * Duplicate ids throw.\n */\nexport function perPlayer<Value, Id extends PlayerId = PlayerId>(\n ids: readonly Id[],\n init: (id: Id, index: number) => Value,\n): PerPlayer<Value, Id> {\n const seen = new Set<string>();\n const entries: Array<readonly [Id, Value]> = [];\n for (const [index, id] of ids.entries()) {\n if (seen.has(id)) {\n throw new Error(`perPlayer: duplicate player id '${id}'`);\n }\n seen.add(id);\n entries.push([id, init(id, index)] as const);\n }\n return { __perPlayer: true, entries };\n}\n\n/** Ordered list of seat ids present in the `PerPlayer`. */\nexport function perPlayerKeys<Id extends PlayerId>(\n value: PerPlayer<unknown, Id>,\n): Id[] {\n return value.entries.map((entry) => entry[0]);\n}\n\n/** Ordered list of values present in the `PerPlayer`. */\nexport function perPlayerValues<Value>(\n value: PerPlayer<Value, PlayerId>,\n): Value[] {\n return value.entries.map((entry) => entry[1]);\n}\n\n/**\n * Ordered `[id, value]` pairs. Returns the backing array as-is; callers\n * must not mutate it.\n */\nexport function perPlayerEntries<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n): ReadonlyArray<readonly [Id, Value]> {\n return value.entries;\n}\n\n/** Number of seats in the `PerPlayer`. */\nexport function perPlayerSize(value: PerPlayer<unknown, PlayerId>): number {\n return value.entries.length;\n}\n\n/** Whether `id` has a value. */\nexport function perPlayerHas<Id extends PlayerId>(\n value: PerPlayer<unknown, Id>,\n id: Id,\n): boolean {\n for (const [candidate] of value.entries) {\n if (candidate === id) {\n return true;\n }\n }\n return false;\n}\n\n/** Lookup with no fallback; returns `undefined` for missing seats. */\nexport function perPlayerGet<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n): Value | undefined {\n for (const [candidate, v] of value.entries) {\n if (candidate === id) {\n return v;\n }\n }\n return undefined;\n}\n\n/**\n * Lookup that throws if `id` is not present.\n *\n * Use when the caller has already established (via `q.player.order()`,\n * an action context, etc.) that `id` is an active runtime seat.\n */\nexport function perPlayerRequire<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n): Value {\n const found = perPlayerGet(value, id);\n if (found === undefined && !perPlayerHas(value, id)) {\n throw new Error(`perPlayerRequire: missing entry for player id '${id}'`);\n }\n return found as Value;\n}\n\n/**\n * Return a new `PerPlayer` with `id`'s value replaced (or added if the\n * id is not present). Preserves entry order; new entries are appended.\n */\nexport function perPlayerSet<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n next: Value,\n): PerPlayer<Value, Id> {\n const entries = value.entries.slice();\n const index = entries.findIndex((entry) => entry[0] === id);\n if (index >= 0) {\n entries[index] = [id, next] as const;\n } else {\n entries.push([id, next] as const);\n }\n return { __perPlayer: true, entries };\n}\n\n/**\n * Return a new `PerPlayer` where each value is replaced by `f(value, id)`.\n * Seat order is preserved.\n */\nexport function perPlayerMap<Value, Next, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n f: (v: Value, id: Id, index: number) => Next,\n): PerPlayer<Next, Id> {\n return {\n __perPlayer: true,\n entries: value.entries.map(\n ([id, v], index) => [id, f(v, id, index)] as const,\n ),\n };\n}\n\n/**\n * Structural check for a `PerPlayer` without a Zod schema. Useful in\n * debug paths and as a fast pre-filter before schema validation.\n */\nexport function isPerPlayer(value: unknown): value is PerPlayer<unknown> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const candidate = value as { __perPlayer?: unknown; entries?: unknown };\n if (candidate.__perPlayer !== true) {\n return false;\n }\n if (!Array.isArray(candidate.entries)) {\n return false;\n }\n return candidate.entries.every(\n (entry) =>\n Array.isArray(entry) &&\n entry.length === 2 &&\n typeof entry[0] === \"string\",\n );\n}\n\n/**\n * Options accepted by `perPlayerSchema`.\n *\n * Setting `players` locks the schema to an exact seat list: parse fails\n * if the input is missing any seat or has an unknown id. Leaving\n * `players` unset yields a schema that accepts any non-empty string as\n * a key, which is the right default for generic SDK types.\n *\n * `playerIdSchema` lets callers feed a manifest-scoped Zod id schema in\n * so parse errors carry the same message as other branded ids.\n */\nexport type PerPlayerSchemaOptions<Id extends PlayerId> = {\n readonly playerIdSchema?: z.ZodType<Id>;\n readonly players?: readonly Id[];\n};\n\n/**\n * Build a Zod schema that validates a wire-shaped `PerPlayer<Value>`.\n *\n * When `options.players` is supplied the schema enforces that entries\n * match that exact set (same cardinality, same ids, any order). This is\n * the mechanism that catches the class of bug where a 3-player session\n * produced a view shape the old `Record<PlayerId, T>` type claimed had\n * a `player-4` key.\n */\nexport function perPlayerSchema<Value, Id extends PlayerId = PlayerId>(\n valueSchema: z.ZodType<Value>,\n options: PerPlayerSchemaOptions<Id> = {},\n): z.ZodType<PerPlayer<Value, Id>> {\n const keySchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n\n const base = z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([keySchema, valueSchema])),\n })\n .transform(\n (value): PerPlayer<Value, Id> => ({\n __perPlayer: true as const,\n entries: value.entries as ReadonlyArray<readonly [Id, Value]>,\n }),\n );\n\n if (!options.players) {\n return base as unknown as z.ZodType<PerPlayer<Value, Id>>;\n }\n\n const expected = options.players;\n return base.superRefine((value, ctx) => {\n const seen = new Set<string>();\n for (const [id] of value.entries) {\n if (seen.has(id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate player id '${id}'`,\n });\n }\n seen.add(id);\n }\n for (const expectedId of expected) {\n if (!seen.has(expectedId)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Missing entry for player id '${expectedId}'`,\n });\n }\n }\n for (const id of seen) {\n if (!expected.some((expectedId) => expectedId === id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Unexpected player id '${id}' (allowed: ${expected.join(\", \")})`,\n });\n }\n }\n }) as unknown as z.ZodType<PerPlayer<Value, Id>>;\n}\n\n// ---------------------------------------------------------------------------\n// BoardRef: replacement for flat `\"board:player-N\"` literal unions.\n// ---------------------------------------------------------------------------\n\n/**\n * Reference to a board by its authored `baseId`, plus an optional seat\n * for per-player boards.\n *\n * Replaces the old generated `\"ring:player-1\" | \"ring:player-2\" | ...`\n * flat unions whose keys pretended to be static but were actually\n * derived from `maxPlayers` and therefore misaligned with the runtime\n * seat list.\n *\n * The discriminant is the *presence* of `seat`, not a `scope` field, so\n * authors can destructure and pass the ref directly without needing a\n * discriminator check for shared boards.\n */\nexport type BoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> = SharedBoardRef<BaseId> | PerPlayerBoardRef<BaseId, Id>;\n\nexport interface SharedBoardRef<BaseId extends string = string> {\n readonly baseId: BaseId;\n readonly seat?: undefined;\n}\n\nexport interface PerPlayerBoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> {\n readonly baseId: BaseId;\n readonly seat: Id;\n}\n\n/** Construct a shared board ref. */\nexport function sharedBoardRef<BaseId extends string>(\n baseId: BaseId,\n): SharedBoardRef<BaseId> {\n return { baseId };\n}\n\n/** Construct a per-player board ref. */\nexport function perPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat: Id,\n): PerPlayerBoardRef<BaseId, Id> {\n return { baseId, seat };\n}\n\n/**\n * Construct a `BoardRef` without knowing the scope ahead of time. Pass\n * `seat` for per-player boards; omit for shared boards.\n */\nexport function boardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat?: Id,\n): BoardRef<BaseId, Id> {\n if (seat === undefined) {\n return { baseId };\n }\n return { baseId, seat };\n}\n\n/** Stable string key for Maps/Records keyed by a `BoardRef`. */\nexport function boardRefKey(ref: BoardRef): string {\n return ref.seat === undefined ? ref.baseId : `${ref.baseId}:${ref.seat}`;\n}\n\n/**\n * Inverse of `boardRefKey`. Parses `\"base\"` as a shared ref and\n * `\"base:player-N\"` as a per-player ref. Returns `null` for malformed\n * input.\n */\nexport function parseBoardRefKey(key: string): BoardRef | null {\n if (!key.length) {\n return null;\n }\n const colon = key.indexOf(\":\");\n if (colon < 0) {\n return { baseId: key };\n }\n const baseId = key.slice(0, colon);\n const seat = key.slice(colon + 1);\n if (!baseId.length || !seat.length) {\n return null;\n }\n return { baseId, seat: seat as PlayerId };\n}\n\n/**\n * Zod schema for a `BoardRef` with free-form base and seat ids.\n *\n * Feed a manifest-scoped `baseIdSchema` and `playerIdSchema` to bind\n * the ref to a specific workspace.\n */\nexport function boardRefSchema<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n>(\n options: {\n readonly baseIdSchema?: z.ZodType<BaseId>;\n readonly playerIdSchema?: z.ZodType<Id>;\n } = {},\n): z.ZodType<BoardRef<BaseId, Id>> {\n const baseSchema =\n options.baseIdSchema ?? (z.string().min(1) as unknown as z.ZodType<BaseId>);\n const playerSchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n const shared = z.strictObject({ baseId: baseSchema });\n const perPlayer = z.strictObject({ baseId: baseSchema, seat: playerSchema });\n return z.union([perPlayer, shared]) as unknown as z.ZodType<\n BoardRef<BaseId, Id>\n >;\n}\n\n/** True when `ref` targets a shared board (no seat). */\nexport function isSharedBoardRef<BaseId extends string>(\n ref: BoardRef<BaseId, PlayerId>,\n): ref is SharedBoardRef<BaseId> {\n return ref.seat === undefined;\n}\n\n/** True when `ref` targets a per-player board (has a seat). */\nexport function isPerPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n ref: BoardRef<BaseId, Id>,\n): ref is PerPlayerBoardRef<BaseId, Id> {\n return ref.seat !== undefined;\n}\n","import type { z } from \"zod\";\nimport type { InputCollector } from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type InputFieldRef<\n Key extends string = string,\n Value = unknown,\n Collector extends InputCollector = InputCollector,\n> = {\n readonly key: Key;\n readonly collector: Collector;\n readonly __value?: Value;\n};\n\ntype RefValue<Ref> =\n Ref extends InputFieldRef<string, infer Value, InputCollector>\n ? Value\n : never;\n\ntype CollectorOfRef<Ref> =\n Ref extends InputFieldRef<string, unknown, infer Collector>\n ? Collector\n : never;\n\ntype CollectorValue<Collector> =\n Collector extends InputCollector<infer Schema> ? z.infer<Schema> : never;\n\nexport type DependencyValues<\n Dependencies extends readonly InputFieldRef<\n string,\n unknown,\n InputCollector\n >[],\n> = {\n readonly [Ref in Dependencies[number] as Ref[\"key\"]]: RefValue<Ref>;\n};\n\ntype DefinedInputRefs = Record<\n string,\n InputFieldRef<string, unknown, InputCollector>\n>;\n\nexport type DefinedInputs<Refs extends DefinedInputRefs> = {\n readonly [Key in keyof Refs]: CollectorOfRef<Refs[Key]>;\n};\n\nclass InputBuilder {\n add<\n const Key extends string,\n Collector extends InputCollector<SchemaLike<unknown>>,\n >(\n key: Key,\n collector: Collector,\n ): InputFieldRef<Key, CollectorValue<Collector>, Collector> {\n return { key, collector };\n }\n}\n\n/**\n * Define an interaction's inputs with typed field references. Field refs can be\n * passed to dependent input domains, and the returned collector map preserves\n * the original key/value types for interaction params.\n */\nexport function defineInputs<const Refs extends DefinedInputRefs>(\n define: (input: InputBuilder) => Refs,\n): DefinedInputs<Refs> {\n const refs = define(new InputBuilder());\n return Object.fromEntries(\n Object.entries(refs).map(([key, ref]) => [key, ref.collector]),\n ) as DefinedInputs<Refs>;\n}\n","import { z } from \"zod\";\nimport type {\n BoardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n TargetKind,\n} from \"../model/spec\";\nimport type { BoardTargetRule, PlayerBoardSpaceTarget } from \"./boardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `boardInput.*` helpers produce collectors that accept a board-element id\n * (vertex / edge / space / tile) scoped to one built `boardTarget` rule.\n *\n * Id typing:\n * The `Id` type parameter is the branded id for the board you target,\n * e.g. `HexVertexIdOfTable<Table, \"main\">` or\n * `SquareSpaceIdOfTable<Table, \"board\">`. Once tightened,\n * `ParamsOf<Collectors>` downstream typing reflects the branded id too.\n *\n * Eligibility:\n * Pass a built `boardTarget.*(...).where(...).build()` rule. The same rule\n * feeds server-authoritative eligible-target projection, submit validation,\n * and tests through its `bind({ state, playerId, q })` helper.\n *\n * Runtime vs. compile time:\n * At runtime the submitted value is a string. Branding is purely a\n * compile-time discipline.\n */\nfunction makeBoardCollector<\n Kind extends \"board-vertex\" | \"board-edge\" | \"board-tile\" | \"board-space\",\n>(kind: Kind) {\n return function collector<\n State extends CollectorState = CollectorState,\n Id extends string = string,\n >(options: {\n target: BoardTargetRule<State, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, State, Kind> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind,\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<BoardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state: CollectorState,\n playerId: string,\n q: unknown,\n _derived: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n } as unknown as InputCollector<z.ZodType<Id>, State, Kind>;\n };\n}\n\nexport const vertexInput = makeBoardCollector(\"board-vertex\");\nexport const edgeInput = makeBoardCollector(\"board-edge\");\nexport const tileInput = makeBoardCollector(\"board-tile\");\nexport const spaceInput = makeBoardCollector(\"board-space\");\n\nexport function playerSpaceInput<\n State extends CollectorState = CollectorState,\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = string,\n>(options: {\n target: BoardTargetRule<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<\n z.ZodType<PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>>,\n State,\n \"board-space\"\n> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"board-space\",\n schema: z.object({\n boardId: z.literal(target.boardId),\n playerId: z.string(),\n spaceId: z.string(),\n }) as unknown as z.ZodType<\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >,\n eligibleTargets: ((state, playerId, q, values) =>\n target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId)) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetValue, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetValue as PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<\n BoardTargetRule<\n CollectorState,\n PlayerBoardSpaceTarget<string, string, string>\n >[\"validate\"]\n >)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state: CollectorState,\n playerId: string,\n q: unknown,\n _derived: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n };\n}\n\nexport const boardInput = {\n vertex: vertexInput,\n edge: edgeInput,\n tile: tileInput,\n space: spaceInput,\n playerSpace: playerSpaceInput,\n};\n","import type { CollectorState, ValidationIssue } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\n\nexport type TargetContext<State extends CollectorState> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n values?: Readonly<Record<string, unknown>>;\n};\n\nexport type TargetPredicateArgs<\n State extends CollectorState,\n Target,\n> = TargetContext<State> & {\n targetId: Target;\n target: Target;\n};\n\nexport type TargetPredicate<State extends CollectorState, Target> = {\n id: string;\n errorCode: string;\n message?: string;\n test: (args: TargetPredicateArgs<State, Target>) => boolean;\n};\n\nexport type BoundTargetRule<Target> = {\n readonly eligible: () => readonly Target[];\n readonly validate: (target: Target) => ValidationIssue | null;\n readonly isEligible: (target: Target) => boolean;\n};\n\nexport type TargetRule<State extends CollectorState, Target> = {\n readonly eligible: (ctx: TargetContext<State>) => readonly Target[];\n readonly validate: (\n ctx: TargetContext<State>,\n target: Target,\n ) => ValidationIssue | null;\n readonly isEligible: (ctx: TargetContext<State>, target: Target) => boolean;\n readonly bind: (ctx: TargetContext<State>) => BoundTargetRule<Target>;\n};\n\nexport type TargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n> = {\n readonly where: (\n predicate: TargetPredicate<State, Target>,\n ) => TargetRuleBuilder<State, Target, Rule>;\n readonly build: () => Rule;\n};\n\nexport type TargetCandidateResolver<State extends CollectorState, Target> = (\n ctx: TargetContext<State>,\n) => readonly Target[];\n\nexport type TargetRuleOptions = {\n missingCandidateIssue?: ValidationIssue;\n equals?: (left: unknown, right: unknown) => boolean;\n};\n\nconst DEFAULT_MISSING_CANDIDATE_ISSUE: ValidationIssue = {\n errorCode: \"TARGET_NOT_ELIGIBLE\",\n message: \"Target is not eligible.\",\n};\n\nexport function createTargetRule<State extends CollectorState, Target>(\n candidates: TargetCandidateResolver<State, Target>,\n predicates: readonly TargetPredicate<State, Target>[],\n options: TargetRuleOptions = {},\n): TargetRule<State, Target> {\n const missingCandidateIssue =\n options.missingCandidateIssue ?? DEFAULT_MISSING_CANDIDATE_ISSUE;\n const equals = options.equals ?? Object.is;\n\n const validate = (\n ctx: TargetContext<State>,\n target: Target,\n ): ValidationIssue | null => {\n if (!candidates(ctx).some((candidate) => equals(candidate, target))) {\n return missingCandidateIssue;\n }\n for (const predicate of predicates) {\n if (!predicate.test({ ...ctx, targetId: target, target })) {\n return {\n errorCode: predicate.errorCode,\n message: predicate.message,\n };\n }\n }\n return null;\n };\n\n const rule: TargetRule<State, Target> = {\n eligible: (ctx) =>\n candidates(ctx).filter((targetId) => validate(ctx, targetId) == null),\n validate,\n isEligible: (ctx, target) => validate(ctx, target) == null,\n bind: (ctx) => ({\n eligible: () => rule.eligible(ctx),\n validate: (id) => rule.validate(ctx, id),\n isEligible: (id) => rule.isEligible(ctx, id),\n }),\n };\n\n return rule;\n}\n\nexport function createTargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n>(\n buildRule: (predicates: readonly TargetPredicate<State, Target>[]) => Rule,\n predicates: readonly TargetPredicate<State, Target>[] = [],\n): TargetRuleBuilder<State, Target, Rule> {\n return {\n where: (predicate) =>\n createTargetRuleBuilder(buildRule, [...predicates, predicate]),\n build: () => buildRule(predicates),\n };\n}\n","import type { CollectorState, TargetKind } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type BoardTargetPredicate<\n State extends CollectorState,\n Target,\n> = TargetPredicate<State, Target>;\n\nexport type BoardTargetRule<State extends CollectorState, Target> = TargetRule<\n State,\n Target\n> & {\n readonly boardId: string;\n readonly targetKind: TargetKind;\n readonly valueKind: \"board-id\" | \"player-board-space\";\n};\n\nexport type BoardTargetBuilder<\n State extends CollectorState,\n Target,\n> = TargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>;\n\nexport type PlayerBoardSpaceTarget<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string,\n> = {\n readonly boardId: BoardId;\n readonly playerId: PlayerId;\n readonly spaceId: SpaceId;\n};\n\nfunction candidateIdsForKind<State extends CollectorState, Id extends string>(\n q: TableQueriesOfState<State>,\n boardId: string,\n targetKind: TargetKind,\n): readonly Id[] {\n if (targetKind === \"edge\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).edges);\n }\n if (targetKind === \"vertex\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).vertices);\n }\n return idsFromCollection<Id>(q.board.get(boardId as never)?.spaces);\n}\n\nfunction idsFromCollection<Id extends string>(\n collection: unknown,\n): readonly Id[] {\n if (!collection) return [];\n const values = Array.isArray(collection)\n ? collection\n : Object.values(collection as Record<string, unknown>);\n return values.flatMap((value) => {\n if (typeof value === \"string\") return [value as Id];\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"id\" in value &&\n typeof (value as { id?: unknown }).id === \"string\"\n ) {\n return [(value as { id: string }).id as Id];\n }\n return [];\n });\n}\n\nfunction createBoardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(targetKind: TargetKind, boardId: string): BoardTargetBuilder<State, Id> {\n return createTargetRuleBuilder<State, Id, BoardTargetRule<State, Id>>(\n (predicates) => ({\n ...createTargetRule(\n ({ q }) => candidateIdsForKind<State, Id>(q, boardId, targetKind),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n },\n ),\n boardId,\n targetKind,\n valueKind: \"board-id\",\n }),\n );\n}\n\nfunction createPlayerSpaceTargetBuilder<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n>(\n boardId: BoardId,\n): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n> {\n type Target = PlayerBoardSpaceTarget<\n BoardId,\n SpaceId,\n PlayerIdOfState<State>\n >;\n return createTargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, q }) => {\n const spacesForPlayer = (playerId: string): readonly SpaceId[] =>\n candidateIdsForKind<State, SpaceId>(\n q,\n `${boardId}:${playerId}`,\n \"space\",\n );\n return state.table.playerOrder.flatMap((playerId) =>\n spacesForPlayer(playerId).map((spaceId) => ({\n boardId,\n playerId: playerId as PlayerIdOfState<State>,\n spaceId,\n })),\n );\n },\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n equals: (left, right) =>\n isPlayerBoardSpaceTarget(left) &&\n isPlayerBoardSpaceTarget(right) &&\n left.boardId === right.boardId &&\n left.playerId === right.playerId &&\n left.spaceId === right.spaceId,\n },\n ),\n boardId,\n targetKind: \"space\",\n valueKind: \"player-board-space\",\n }),\n );\n}\n\nfunction isPlayerBoardSpaceTarget(\n value: unknown,\n): value is PlayerBoardSpaceTarget<string, string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"boardId\" in value &&\n \"playerId\" in value &&\n \"spaceId\" in value\n );\n}\n\nfunction makeBoardTargetFactory(targetKind: TargetKind) {\n return function target<State extends CollectorState, Id extends string>(\n boardId: string,\n ): BoardTargetBuilder<State, Id> {\n return createBoardTargetBuilder<State, Id>(targetKind, boardId);\n };\n}\n\nexport const boardTarget = {\n edge: makeBoardTargetFactory(\"edge\"),\n vertex: makeBoardTargetFactory(\"vertex\"),\n space: makeBoardTargetFactory(\"space\"),\n tile: makeBoardTargetFactory(\"tile\"),\n playerSpace<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n >(\n boardId: BoardId,\n ): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n > {\n return createPlayerSpaceTargetBuilder<State, BoardId, SpaceId>(boardId);\n },\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type CardTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type CardTargetRule<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[] = readonly string[],\n> = TargetRule<State, Id> & {\n readonly zoneIds: ZoneIds;\n readonly zoneId: ZoneIds[number];\n readonly targetKind: \"card\";\n};\n\nexport type CardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[] = readonly string[],\n> = TargetRuleBuilder<State, Id, CardTargetRule<State, Id, ZoneIds>>;\n\nfunction cardIdsForZone<State extends CollectorState, Id extends string>(\n state: State,\n playerId: string,\n q: {\n zone: {\n sharedCards: (zoneId: never) => readonly unknown[];\n playerCards: (playerId: never, zoneId: never) => readonly unknown[];\n };\n },\n zoneId: string,\n): readonly Id[] {\n const table = state.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n if (\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {})\n ) {\n return q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly Id[];\n }\n if (zoneId in (table.decks ?? {}) || zoneId in (table.zones?.shared ?? {})) {\n return q.zone.sharedCards(zoneId as never) as readonly Id[];\n }\n return [];\n}\n\nfunction createCardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[],\n>(zoneIds: ZoneIds): CardTargetBuilder<State, Id, ZoneIds> {\n return createTargetRuleBuilder<State, Id, CardTargetRule<State, Id, ZoneIds>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, playerId, q }) =>\n zoneIds.flatMap((zoneId) =>\n cardIdsForZone<State, Id>(state, playerId, q, zoneId),\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CARD_TARGET_NOT_ELIGIBLE\",\n message: \"Card target is not eligible.\",\n },\n },\n ),\n zoneIds,\n zoneId: zoneIds[0] as ZoneIds[number],\n targetKind: \"card\",\n }),\n );\n}\n\nexport const cardTarget = {\n zones<\n State extends CollectorState,\n Id extends string = CardIdOfState<State>,\n const ZoneIds extends readonly string[] = readonly string[],\n >(zoneIds: ZoneIds): CardTargetBuilder<State, Id, ZoneIds> {\n return createCardTargetBuilder<State, Id, ZoneIds>(zoneIds);\n },\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetContext,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type ChoiceTargetOption<Id extends string> = {\n id: Id;\n label?: string;\n};\n\nexport type ChoiceOptionsFactory<\n State extends CollectorState,\n Id extends string,\n> = (\n state: State,\n playerId: PlayerIdOfState<State>,\n q: TableQueriesOfState<State>,\n) => ReadonlyArray<ChoiceTargetOption<Id>>;\n\nexport type ChoiceTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type ChoiceTargetRule<\n State extends CollectorState,\n Id extends string,\n> = TargetRule<State, Id> & {\n readonly targetKind: \"choice\";\n readonly options: (\n ctx: TargetContext<State>,\n ) => ReadonlyArray<ChoiceTargetOption<Id>>;\n readonly eligibleOptions: (\n ctx: TargetContext<State>,\n ) => ReadonlyArray<ChoiceTargetOption<Id>>;\n};\n\nexport type ChoiceTargetBuilder<\n State extends CollectorState,\n Id extends string,\n> = TargetRuleBuilder<State, Id, ChoiceTargetRule<State, Id>>;\n\nfunction normalizeOptions<State extends CollectorState, Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n): ChoiceOptionsFactory<State, Id> {\n if (typeof options === \"function\") return options;\n return () => options;\n}\n\nfunction createChoiceTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n): ChoiceTargetBuilder<State, Id> {\n const optionsFactory = normalizeOptions(options);\n return createTargetRuleBuilder<State, Id, ChoiceTargetRule<State, Id>>(\n (predicates) => {\n const baseRule = createTargetRule(\n (ctx) =>\n optionsFactory(ctx.state, ctx.playerId, ctx.q).map(\n (option) => option.id,\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CHOICE_TARGET_NOT_ELIGIBLE\",\n message: \"Choice target is not eligible.\",\n },\n },\n );\n return {\n ...baseRule,\n targetKind: \"choice\",\n options: (ctx) => optionsFactory(ctx.state, ctx.playerId, ctx.q),\n eligibleOptions: (ctx) =>\n optionsFactory(ctx.state, ctx.playerId, ctx.q).filter((option) =>\n baseRule.isEligible(ctx, option.id),\n ),\n };\n },\n );\n}\n\nexport const choiceTarget = {\n options<State extends CollectorState, Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n ): ChoiceTargetBuilder<State, Id> {\n return createChoiceTargetBuilder(options);\n },\n};\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport type { CardTargetRule } from \"./cardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `cardInput` produces a collector backed by one built `cardTarget` rule.\n * The submitted value is a manifest-branded card id.\n *\n * The target rule feeds server-authoritative eligible-card projection, submit\n * validation, and tests through its `bind({ state, playerId, q })` helper.\n */\nexport function cardInput<\n State extends CollectorState = CollectorState,\n Id extends string = CardIdOfState<State>,\n const ZoneIds extends readonly string[] = readonly string[],\n>(options: {\n target: CardTargetRule<State, Id, ZoneIds>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<z.ZodType<Id>, State, \"card\"> & {\n readonly meta: {\n readonly zoneId: ZoneIds[number];\n readonly zoneIds: ZoneIds;\n readonly targetKind: \"card\";\n };\n} {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"card\",\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<CardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (state, playerId, q, _derived, values) => ({\n type: \"cardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind,\n zoneIds: target.zoneIds,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n }),\n meta: {\n zoneId: target.zoneId,\n zoneIds: target.zoneIds,\n targetKind: target.targetKind,\n },\n };\n}\n","import type { SchemaLike } from \"../model/table\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { ChoiceTargetRule } from \"./choiceTarget\";\nimport type { z } from \"zod\";\n\ntype SchemaStringValue<Schema extends SchemaLike<unknown>> = Extract<\n Schema extends z.ZodType<infer V> ? V : never,\n string\n>;\n\n/**\n * `promptInput` marks an interaction as a prompt delivered to a player's\n * inbox. The submitted value is validated by the supplied Zod schema.\n *\n * Static or free-form prompts need only `schema`. Finite dynamic choices use\n * a built `choiceTarget.options(...).build()` rule so projected options and\n * submit validation share one source of truth.\n */\nexport function promptInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(options: {\n schema: Schema;\n target?: ChoiceTargetRule<State, SchemaStringValue<Schema>>;\n}): InputCollector<Schema, State, \"prompt\"> {\n const target = options.target;\n return {\n kind: \"prompt\",\n schema: options.schema,\n eligibleTargets: target\n ? (((state, playerId, q) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n ) => ReadonlyArray<unknown>)\n | undefined)\n : undefined,\n validateTarget: target\n ? (((state, playerId, q, targetId) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n },\n targetId as SchemaStringValue<Schema>,\n )) as InputCollector<Schema, State, \"prompt\">[\"validateTarget\"])\n : undefined,\n meta: target\n ? {\n options: (state: unknown, playerId: unknown, q: unknown) =>\n target.options({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n }),\n eligibleOptions: (state: unknown, playerId: unknown, q: unknown) =>\n target.eligibleOptions({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n }),\n }\n : undefined,\n domain: (state, playerId, q) => ({\n type: \"choice\" as const,\n choices: target\n ? target\n .options({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })\n .map((option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n }))\n : [],\n }),\n };\n}\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\n\n/**\n * `rngInput.*` helpers produce collectors whose value is *sampled by the\n * engine on submit* rather than supplied by the client. The schema pins\n * the exact output shape so `ParamsOf<Collectors>` sees precisely typed\n * results.\n *\n * Determinism:\n * Sampling happens inside `submitInteraction` only, never inside\n * `validateInteraction`. This lets clients dry-run a submission without\n * burning RNG state.\n */\n\ntype DieRoll = z.ZodObject<{ values: z.ZodArray<z.ZodNumber> }>;\ntype CoinFlip = z.ZodObject<{\n value: z.ZodEnum<{ heads: \"heads\"; tails: \"tails\" }>;\n}>;\n\n// The literal `kind: \"rng\"` is intentionally preserved in the return type\n// so `ClientParamsOf<Collectors>` can structurally detect engine-sampled\n// collectors and omit them from client-facing submit params.\ntype RngCollector<\n Schema extends DieRoll | CoinFlip,\n State extends CollectorState,\n> = InputCollector<Schema, State, \"rng\">;\n\n/**\n * Roll `count` d6s. The submitted value is `{ values: number[] }` with\n * `values.length === count` and each face `1..6`.\n */\nexport function d6<State extends CollectorState = CollectorState>(\n count: number = 1,\n): RngCollector<DieRoll, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n values: z.array(z.number().int().min(1).max(6)).length(count),\n }),\n meta: { rng: \"d6\", count },\n };\n}\n\n/** Flip a coin. The submitted value is `{ value: \"heads\" | \"tails\" }`. */\nexport function coin<\n State extends CollectorState = CollectorState,\n>(): RngCollector<CoinFlip, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n value: z.enum([\"heads\", \"tails\"]),\n }),\n meta: { rng: \"coin\" },\n };\n}\n\nexport const rngInput = { d6, coin };\n","import { z } from \"zod\";\nimport type {\n CollectorState,\n InputCollector,\n InputSelectionDescriptor,\n} from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type ManyOptions =\n | {\n count: number;\n distinct?: boolean;\n }\n | {\n min?: number;\n max?: number;\n distinct?: boolean;\n };\n\ntype NonRngCollector = InputCollector<SchemaLike<unknown>, CollectorState> & {\n readonly kind: Exclude<InputCollector[\"kind\"], \"rng\">;\n};\n\ntype CollectorSchema<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<infer Schema, CollectorState>,\n]\n ? Schema\n : never;\n\ntype CollectorStateOf<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<SchemaLike<unknown>, infer State>,\n]\n ? State\n : never;\n\ntype CollectorKindOf<Collector extends NonRngCollector> = [Collector] extends [\n {\n readonly kind: infer Kind extends Exclude<InputCollector[\"kind\"], \"rng\">;\n },\n]\n ? Kind\n : never;\n\nexport type ManyInputCollector<\n Schema extends SchemaLike<unknown> = SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n Kind extends Exclude<InputCollector[\"kind\"], \"rng\"> = Exclude<\n InputCollector[\"kind\"],\n \"rng\"\n >,\n> = InputCollector<z.ZodType<ReadonlyArray<z.infer<Schema>>>, State, Kind> & {\n readonly selection: Extract<InputSelectionDescriptor, { mode: \"many\" }>;\n};\n\nfunction normalizeManyOptions(\n options: ManyOptions,\n): Extract<InputSelectionDescriptor, { mode: \"many\" }> {\n if (\"count\" in options) {\n assertNonNegativeInteger(options.count, \"many(...).count\");\n return {\n mode: \"many\",\n min: options.count,\n max: options.count,\n distinct: options.distinct,\n };\n }\n const min = options.min ?? 0;\n assertNonNegativeInteger(min, \"many(...).min\");\n if (options.max !== undefined) {\n assertNonNegativeInteger(options.max, \"many(...).max\");\n if (options.max < min) {\n throw new Error(\"many(...).max must be greater than or equal to min.\");\n }\n }\n return {\n mode: \"many\",\n min,\n max: options.max,\n distinct: options.distinct,\n };\n}\n\nfunction assertNonNegativeInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative integer.`);\n }\n}\n\nexport function many<Collector extends NonRngCollector>(\n collector: Collector,\n options: ManyOptions,\n): ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n> &\n Pick<Collector, \"meta\"> {\n if ((collector as InputCollector).kind === \"rng\") {\n throw new Error(\"many(...) cannot wrap rngInput collectors.\");\n }\n const selection = normalizeManyOptions(options);\n const {\n schema: _schema,\n selection: _selection,\n defaultValue: _defaultValue,\n ...rest\n } = collector;\n return {\n ...rest,\n schema: z.array(collector.schema as z.ZodTypeAny) as unknown as z.ZodType<\n ReadonlyArray<z.infer<CollectorSchema<Collector>>>\n >,\n selection,\n } as unknown as ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n > &\n Pick<Collector, \"meta\">;\n}\n","import type {\n DispatchTraceEntry,\n TrustedReducerDispatchResult,\n TrustedRuntimeInput,\n} from \"../core/types\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\n\nexport function createRuntimeInstructionEngine<\n State,\n PlayerId extends string,\n Input extends TrustedRuntimeInput<PlayerId>,\n>({\n reduce,\n resolveInstruction,\n afterInput,\n}: {\n reduce: (\n state: State,\n input: Input,\n ) =>\n | { type: \"reject\"; errorCode: string; message?: string }\n | {\n type: \"accept\";\n state: State;\n instructions?: RuntimeInstructionForState<State>[];\n };\n resolveInstruction: (\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ) => {\n state: State;\n queuedInputs: Input[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n afterInput?: (\n state: State,\n input: Input,\n ) => {\n state: State;\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n}) {\n function drainInstructions(\n state: State,\n instructionsToDrain: RuntimeInstructionForState<State>[],\n ): State {\n let workingState = state;\n const instructionQueue = [...instructionsToDrain];\n const systemQueue: Input[] = [];\n\n while (instructionQueue.length > 0 || systemQueue.length > 0) {\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n systemQueue.push(...resolved.queuedInputs);\n }\n\n while (systemQueue.length > 0) {\n const input = systemQueue.shift();\n if (input === undefined) break;\n const result = reduce(workingState, input);\n if (result.type === \"reject\") {\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${input.kind}'.`,\n );\n }\n workingState = result.state;\n instructionQueue.push(...(result.instructions ?? []));\n }\n }\n\n return workingState;\n }\n\n function dispatch(\n state: State,\n input: Input,\n ): TrustedReducerDispatchResult<State, PlayerId> {\n let workingState = state;\n const pendingInputs: Input[] = [input];\n const trace: DispatchTraceEntry<State, PlayerId, Input>[] = [\n {\n type: \"acceptedClientInput\",\n input,\n },\n ];\n\n while (pendingInputs.length > 0) {\n const pendingInput = pendingInputs.shift();\n if (pendingInput === undefined) break;\n const result = reduce(workingState, pendingInput);\n if (result.type === \"reject\") {\n if (pendingInput === input) {\n return result;\n }\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${pendingInput.kind}'.`,\n );\n }\n\n workingState = result.state;\n\n if (afterInput) {\n const afterInputResult = afterInput(workingState, pendingInput);\n workingState = afterInputResult.state;\n trace.push(...afterInputResult.trace);\n }\n\n const instructionQueue = [...(result.instructions ?? [])];\n const continuationQueue: Input[] = [];\n while (instructionQueue.length > 0 || continuationQueue.length > 0) {\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n trace.push({\n type: \"appliedInstruction\",\n instruction,\n });\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n trace.push(...resolved.trace);\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n continuationQueue.push(...resolved.queuedInputs);\n }\n\n while (continuationQueue.length > 0) {\n const queued = continuationQueue.shift();\n if (queued === undefined) break;\n pendingInputs.push(queued);\n }\n }\n }\n\n return {\n type: \"accept\",\n state: workingState,\n trace,\n };\n }\n\n return {\n dispatch,\n drainInstructions,\n };\n}\n","import type {\n CardCollection,\n ViewCard,\n ViewSlotOccupant,\n} from \"../types/index.js\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n CardIdOfTable,\n CardIdOfState,\n ComponentLocationOfTable,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandCardsOfTable,\n HandIdOfTable,\n HexBoardIdOfTable,\n HexEdgeIdOfTable,\n HexSpaceIdOfTable,\n HexVertexIdOfTable,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RelationTypeIdOfTable,\n ResolvedContainerLocation,\n ResolvedDeckLocation,\n ResolvedEdgeLocation,\n ResolvedHandLocation,\n ResolvedSlotLocation,\n ResolvedSpaceLocation,\n ResolvedVertexLocation,\n ResolvedZoneLocation,\n ResourceBalancesOfTable,\n RuntimeBoardState,\n RuntimeComponentLocation,\n RuntimeRecord,\n RuntimeTableRecord,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeStateOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexStateOfTable,\n TiledVertexTypeIdOfTable,\n} from \"./model\";\nimport type { PerPlayer, PlayerId } from \"./per-player\";\nimport { perPlayerGet, perPlayerMap, perPlayerSet } from \"./per-player\";\n\n// Thin wrappers that preserve the existing \"look up by player id\" idiom used\n// throughout this file. `hands`, `zones.perPlayer`, and `resources` are\n// `PerPlayer<T>`-shaped at runtime (the ingress codec rejects anything else),\n// so these helpers assume the wrapper is always present.\nfunction ppRead<Value>(\n value: PerPlayer<Value> | undefined,\n playerId: string,\n): Value | undefined {\n if (value === undefined) return undefined;\n return perPlayerGet(value, playerId as PlayerId);\n}\n\nfunction ppWrite<Value>(\n value: PerPlayer<Value> | undefined,\n playerId: string,\n next: Value,\n): PerPlayer<Value> {\n const base: PerPlayer<Value> = value ?? { __perPlayer: true, entries: [] };\n return perPlayerSet(base, playerId as PlayerId, next);\n}\n\ntype ViewCardForTable<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<Table>,\n> =\n CardId extends CardIdOfTable<Table>\n ? ViewCard<\n CardId & string,\n Table[\"cards\"][CardId][\"cardType\"] & string,\n Extract<Table[\"cards\"][CardId][\"properties\"], Record<string, unknown>>\n >\n : never;\n\ntype ViewSlotOccupantForTable<Table extends RuntimeTableRecord> =\n ViewSlotOccupant<\n ComponentIdOfTable<Table> & string,\n PlayerIdOfTable<Table> & string,\n string,\n Record<string, unknown>\n >;\n\nexport function ensureArray<T>(value: readonly T[] | T[] | undefined): T[] {\n return Array.isArray(value) ? [...value] : [];\n}\n\nfunction locationPosition(location: RuntimeComponentLocation): number {\n return \"position\" in location && typeof location.position === \"number\"\n ? location.position\n : Number.MAX_SAFE_INTEGER;\n}\n\nfunction orderedComponentIdsForLocation(\n table: RuntimeTableRecord,\n predicate: (location: RuntimeComponentLocation) => boolean,\n): string[] {\n return Object.entries(table.componentLocations)\n .filter(([, location]) => predicate(location))\n .sort(\n (left, right) => locationPosition(left[1]) - locationPosition(right[1]),\n )\n .map(([componentId]) => componentId);\n}\n\nfunction allowedCardSetIdsForZone(\n table: RuntimeTableRecord,\n zoneId: string,\n): readonly string[] {\n return table.zones.cardSetIdsByZoneId?.[zoneId] ?? [];\n}\n\nfunction hasOwnKey(record: Record<string, unknown>, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, key);\n}\n\nfunction isSharedZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.decks, zoneId) || hasOwnKey(table.zones.shared, zoneId)\n );\n}\n\nfunction isPlayerZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.hands, zoneId) ||\n hasOwnKey(table.zones.perPlayer, zoneId) ||\n hasOwnKey(table.handVisibility, zoneId)\n );\n}\n\nfunction zoneScopeForId(\n table: RuntimeTableRecord,\n zoneId: string,\n): \"shared\" | \"perPlayer\" | null {\n if (isPlayerZoneId(table, zoneId)) {\n return \"perPlayer\";\n }\n if (isSharedZoneId(table, zoneId)) {\n return \"shared\";\n }\n return null;\n}\n\nfunction assertZoneScope(\n table: RuntimeTableRecord,\n zoneId: string,\n expectedScope: \"shared\" | \"perPlayer\",\n operation: string,\n argumentName: string,\n): void {\n const actualScope = zoneScopeForId(table, zoneId);\n if (actualScope === expectedScope) {\n return;\n }\n\n if (actualScope === null) {\n throw new Error(\n `Unknown zone '${zoneId}' passed as ${argumentName} to ${operation}.`,\n );\n }\n\n throw new Error(\n `Zone '${zoneId}' has scope '${actualScope}', but ${operation} requires ${argumentName} to be a ${expectedScope === \"shared\" ? \"shared\" : \"perPlayer\"} zone.`,\n );\n}\n\nfunction matchesSlotHost(\n location: RuntimeComponentLocation,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId?: string,\n): location is Extract<RuntimeComponentLocation, { type: \"InSlot\" }> {\n return (\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n (slotId === undefined || location.slotId === slotId)\n );\n}\n\nfunction componentPlayerId<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): (PlayerIdOfTable<Table> & string) | null {\n const piece = table.pieces[componentId];\n if (piece) {\n return (piece.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return (die.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const owner = table.ownerOfCard[componentId];\n if (owner !== undefined) {\n return (owner ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n return null;\n}\n\nfunction componentData<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): Record<string, unknown> | undefined {\n const piece = table.pieces[componentId];\n if (piece) {\n return piece.properties as Record<string, unknown>;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return die.properties as Record<string, unknown>;\n }\n\n const card = table.cards[componentId];\n if (card) {\n return card.properties as Record<string, unknown>;\n }\n\n return undefined;\n}\n\nexport function assertCardAllowedInZone<Table extends RuntimeTableRecord>(\n table: Table,\n zoneId: string,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds = allowedCardSetIdsForZone(table, zoneId);\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter zone '${zoneId}'.`,\n );\n }\n}\n\nfunction cloneRuntimeBoardState(board: RuntimeBoardState): RuntimeBoardState {\n if (board.layout !== \"generic\") {\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n edges: board.edges.map((edge) => ({\n ...edge,\n spaceIds: [...edge.spaceIds],\n fields: { ...edge.fields },\n })),\n vertices: board.vertices.map((vertex) => ({\n ...vertex,\n spaceIds: [...vertex.spaceIds],\n fields: { ...vertex.fields },\n })),\n };\n }\n\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n };\n}\n\nexport function cloneRuntimeTable<Table extends RuntimeTableRecord>(\n table: Table,\n): Table {\n return {\n ...table,\n zones: {\n shared: Object.fromEntries(\n Object.entries(table.zones.shared).map(([zoneId, componentIds]) => [\n zoneId,\n [...componentIds],\n ]),\n ) as Table[\"zones\"][\"shared\"],\n perPlayer: Object.fromEntries(\n Object.entries(table.zones.perPlayer).map(([zoneId, players]) => [\n zoneId,\n perPlayerMap(players as PerPlayer<string[]>, (componentIds) => [\n ...componentIds,\n ]),\n ]),\n ) as Table[\"zones\"][\"perPlayer\"],\n visibility: { ...table.zones.visibility },\n cardSetIdsByZoneId: table.zones.cardSetIdsByZoneId\n ? Object.fromEntries(\n Object.entries(table.zones.cardSetIdsByZoneId).map(\n ([zoneId, cardSetIds]) => [zoneId, [...cardSetIds]],\n ),\n )\n : table.zones.cardSetIdsByZoneId,\n } as Table[\"zones\"],\n decks: Object.fromEntries(\n Object.entries(table.decks).map(([deckId, cards]) => [\n deckId,\n [...cards],\n ]),\n ) as Table[\"decks\"],\n hands: Object.fromEntries(\n Object.entries(table.hands).map(([handId, players]) => [\n handId,\n perPlayerMap(players as PerPlayer<string[]>, (cards) => [...cards]),\n ]),\n ) as Table[\"hands\"],\n handVisibility: { ...table.handVisibility },\n pieces: Object.fromEntries(\n Object.entries(table.pieces).map(([pieceId, piece]) => [\n pieceId,\n { ...piece },\n ]),\n ) as Table[\"pieces\"],\n componentLocations: { ...table.componentLocations },\n ownerOfCard: { ...table.ownerOfCard },\n visibility: { ...table.visibility },\n resources: perPlayerMap(\n table.resources as PerPlayer<RuntimeRecord>,\n (resources) => ({ ...resources }),\n ) as Table[\"resources\"],\n boards: {\n ...table.boards,\n byId: Object.fromEntries(\n Object.entries(table.boards.byId).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n hex: Object.fromEntries(\n Object.entries(table.boards.hex ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n square: Object.fromEntries(\n Object.entries(table.boards.square ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n } as Table[\"boards\"],\n dice: Object.fromEntries(\n Object.entries(table.dice).map(([dieId, die]) => [dieId, { ...die }]),\n ) as Table[\"dice\"],\n };\n}\n\nfunction syncSharedZoneWithDeck<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId, nextCards: readonly string[]): void {\n table.decks[zoneId] = [...nextCards] as Table[\"decks\"][ZoneId];\n table.zones.shared[zoneId] = [\n ...nextCards,\n ] as Table[\"zones\"][\"shared\"][ZoneId];\n}\n\n/**\n * Read or write a per-player zone's card list by mutating `table` in place.\n * Called with no `nextCards` to read; called with `nextCards` to write the\n * new ordering. Returns the list at the read site as a plain array.\n *\n * Used by engine-side per-player shuffle resolution; authors should reach for\n * the named ops in this file.\n */\nexport function shufflePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n nextCards?: readonly string[],\n): string[] {\n if (nextCards === undefined) {\n const fromZone = ppRead(\n table.zones.perPlayer[zoneId] ?? table.hands[zoneId],\n playerId,\n ) as readonly string[] | undefined;\n return [...ensureArray(fromZone)];\n }\n table.hands[zoneId] = ppWrite(table.hands[zoneId], playerId, [\n ...nextCards,\n ]) as (typeof table.hands)[string];\n table.zones.perPlayer[zoneId] = ppWrite(\n table.zones.perPlayer[zoneId],\n playerId,\n [...nextCards],\n ) as (typeof table.zones.perPlayer)[string];\n return [...nextCards];\n}\n\nfunction syncPlayerZoneWithHand<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n playerId: PlayerId,\n nextCards: readonly string[],\n): void {\n table.hands[zoneId] = ppWrite(table.hands[zoneId], playerId as string, [\n ...nextCards,\n ]) as Table[\"hands\"][ZoneId];\n table.zones.perPlayer[zoneId] = ppWrite(\n table.zones.perPlayer[zoneId],\n playerId as string,\n [...nextCards],\n ) as Table[\"zones\"][\"perPlayer\"][ZoneId];\n}\n\nfunction reindexSpaceOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): void {\n getComponentsOnSpace(table, boardId, spaceId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnSpace\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexContainerOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, containerId: ContainerId): void {\n getComponentsInContainer(table, boardId, containerId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InContainer\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexEdgeOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n EdgeId extends HexEdgeIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnEdge\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexVertexOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n VertexId extends HexVertexIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, vertexId: VertexId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnVertex\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n location.slotId === slotId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InSlot\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction removeComponentFromCurrentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): void {\n const currentLocation = table.componentLocations[componentId];\n if (!currentLocation) {\n return;\n }\n\n if (currentLocation.type === \"InDeck\") {\n const nextCards = ensureArray(table.decks[currentLocation.deckId]).filter(\n (candidate) => candidate !== componentId,\n );\n syncSharedZoneWithDeck(\n table,\n currentLocation.deckId as SharedZoneIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InDeck\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"InHand\") {\n const nextCards = ensureArray(\n ppRead(table.hands[currentLocation.handId], currentLocation.playerId),\n ).filter((candidate) => candidate !== componentId);\n syncPlayerZoneWithHand(\n table,\n currentLocation.handId as PlayerZoneIdOfTable<Table>,\n currentLocation.playerId as PlayerIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InHand\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"OnSpace\") {\n delete table.componentLocations[componentId];\n reindexSpaceOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.spaceId as SpaceIdOfTable<Table, BoardIdOfTable<Table>>,\n );\n return;\n }\n\n if (currentLocation.type === \"InZone\") {\n if (currentLocation.zoneId in table.zones.shared) {\n const nextComponents = ensureArray(\n table.zones.shared[currentLocation.zoneId],\n ).filter((candidate) => candidate !== componentId);\n syncSharedZoneWithDeck(\n table,\n currentLocation.zoneId as SharedZoneIdOfTable<Table>,\n nextComponents,\n );\n nextComponents.forEach((currentComponentId, index) => {\n const location = table.componentLocations[currentComponentId];\n if (location?.type === \"InZone\") {\n table.componentLocations[currentComponentId] = {\n ...location,\n position: index,\n };\n }\n });\n }\n delete table.componentLocations[componentId];\n return;\n }\n\n if (currentLocation.type === \"InContainer\") {\n delete table.componentLocations[componentId];\n reindexContainerOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.containerId as BoardContainerIdOfTable<\n Table,\n BoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnEdge\") {\n delete table.componentLocations[componentId];\n reindexEdgeOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.edgeId as HexEdgeIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnVertex\") {\n delete table.componentLocations[componentId];\n reindexVertexOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.vertexId as HexVertexIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"InSlot\") {\n delete table.componentLocations[componentId];\n reindexSlotOccupants(table, currentLocation.host, currentLocation.slotId);\n return;\n }\n\n delete table.componentLocations[componentId];\n}\n\nfunction appendToDeck<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertZoneScope(\n nextTable,\n deckId as string,\n \"shared\",\n \"addCardToSharedZone\",\n \"zoneId\",\n );\n const deckCards = [\n ...ensureArray(nextTable.decks[deckId]),\n ] as DeckCardsOfTable<Table, DeckId>;\n assertCardAllowedInZone(nextTable, deckId, cardId);\n if (position === \"top\") {\n deckCards.unshift(cardId);\n } else {\n deckCards.push(cardId);\n }\n syncSharedZoneWithDeck(nextTable, deckId, deckCards);\n for (const [index, currentCardId] of deckCards.entries()) {\n if (currentCardId === cardId) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId,\n playedBy,\n position: index,\n };\n continue;\n }\n const existing = nextTable.componentLocations[currentCardId];\n nextTable.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId,\n playedBy: existing?.type === \"InDeck\" ? existing.playedBy : null,\n position: index,\n };\n }\n nextTable.ownerOfCard[cardId] = playedBy;\n nextTable.visibility[cardId] = {\n faceUp: true,\n };\n return nextTable;\n}\n\nfunction removeFromDeck<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertZoneScope(\n nextTable,\n deckId as string,\n \"shared\",\n \"removeCardFromSharedZone\",\n \"zoneId\",\n );\n const remaining = ensureArray(nextTable.decks[deckId]).filter(\n (candidate) => candidate !== cardId,\n );\n syncSharedZoneWithDeck(nextTable, deckId, remaining);\n for (const [index, currentCardId] of remaining.entries()) {\n const currentLocation = nextTable.componentLocations[currentCardId];\n if (currentLocation?.type === \"InDeck\") {\n nextTable.componentLocations[currentCardId] = {\n ...currentLocation,\n position: index,\n };\n }\n }\n return nextTable;\n}\n\nfunction computeVisibilityForPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction moveFromHandToDeck<\n Table extends RuntimeTableRecord,\n HandId extends HandIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends DeckIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n handId: HandId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n deckId: DeckId;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.handId as string,\n \"perPlayer\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.deckId as string,\n \"shared\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"toZoneId\",\n );\n const currentHand = ensureArray(\n ppRead(nextTable.hands[options.handId], options.playerId as string) as\n | readonly string[]\n | undefined,\n ).filter((candidate) => candidate !== options.cardId);\n syncPlayerZoneWithHand(\n nextTable,\n options.handId,\n options.playerId,\n currentHand,\n );\n for (const [index, currentCardId] of currentHand.entries()) {\n nextTable.componentLocations[currentCardId as string] = {\n type: \"InHand\",\n handId: options.handId,\n playerId: options.playerId,\n position: index,\n };\n }\n nextTable.ownerOfCard[options.cardId] = options.playedBy ?? options.playerId;\n nextTable.visibility[options.cardId] = {\n faceUp: true,\n };\n return appendToDeck(\n nextTable,\n options.deckId,\n options.cardId,\n options.playedBy ?? options.playerId,\n options.position ?? \"bottom\",\n );\n}\n\nexport function setActivePlayers<\n State extends { flow: { activePlayers: PlayerIdOfState<State>[] } },\n>(state: State, activePlayers: PlayerIdOfState<State>[]): State {\n return {\n ...state,\n flow: {\n ...state.flow,\n activePlayers,\n },\n };\n}\n\nexport function setPhaseState<State extends { phase: object }, PhaseState>(\n state: State,\n phaseState: PhaseState,\n): State {\n return {\n ...state,\n phase: phaseState,\n };\n}\n\ntype DeckCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends DeckIdOfTable<Table>,\n> = ZoneId extends infer Each extends DeckIdOfTable<Table>\n ? DeckCardsOfTable<Table, Each>\n : never;\n\ntype HandCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends HandIdOfTable<Table>,\n> = ZoneId extends infer Each extends HandIdOfTable<Table>\n ? HandCardsOfTable<Table, Each>\n : never;\n\nexport function getSharedZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId): DeckCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"shared\",\n \"getSharedZoneCards\",\n \"zoneId\",\n );\n return [\n ...ensureArray(table.zones.shared[zoneId] ?? table.decks[zoneId]),\n ] as DeckCardsForZone<Table, ZoneId>;\n}\n\nexport function getPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): HandCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"perPlayer\",\n \"getPlayerZoneCards\",\n \"zoneId\",\n );\n const cards =\n ppRead(table.zones.perPlayer[zoneId], playerId as string) ??\n ppRead(table.hands[zoneId], playerId as string);\n return [\n ...ensureArray(cards as readonly string[] | undefined),\n ] as unknown as HandCardsForZone<Table, ZoneId>;\n}\n\nfunction collectZoneIds(\n ...sources: ReadonlyArray<Record<string, unknown> | undefined>\n): string[] {\n const seen = new Set<string>();\n for (const source of sources) {\n if (!source) continue;\n for (const key of Object.keys(source)) {\n seen.add(key);\n }\n }\n return [...seen];\n}\n\nexport function getAllSharedZoneCards<Table extends RuntimeTableRecord>(\n table: Table,\n): {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n} {\n const zoneIds = collectZoneIds(\n table.zones.shared as Record<string, unknown> | undefined,\n table.decks as Record<string, unknown> | undefined,\n );\n const result: Record<string, readonly unknown[]> = {};\n for (const zoneId of zoneIds) {\n result[zoneId] = getSharedZoneCards(\n table,\n zoneId as SharedZoneIdOfTable<Table>,\n );\n }\n return result as {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n };\n}\n\nexport function getAllPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n} {\n const result: Record<string, readonly unknown[]> = {};\n for (const playerId of table.playerOrder) {\n result[playerId] = getPlayerZoneCards(\n table,\n playerId as PlayerIdOfTable<Table>,\n zoneId,\n );\n }\n return result as {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n };\n}\n\nexport function getCard<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): ViewCardForTable<Table, CardId> {\n const card = table.cards[cardId] as Table[\"cards\"][CardId];\n\n return {\n id: card.id,\n cardType: card.cardType,\n name: card.name,\n text: card.text,\n properties: card.properties,\n } as ViewCardForTable<Table, CardId>;\n}\n\nexport function getCardsById<\n Table extends RuntimeTableRecord,\n const CardIds extends readonly CardIdOfTable<NoInfer<Table>>[],\n>(\n table: Table,\n cardIds: CardIds,\n): Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id> | undefined;\n}> {\n return Object.fromEntries(\n cardIds.map((cardId) => [\n cardId,\n table.cards[cardId] ? getCard(table, cardId) : undefined,\n ]),\n ) as Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id> | undefined;\n }>;\n}\n\nexport function getSharedZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getSharedZoneCards(table, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getPlayerZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getPlayerZoneCards(table, playerId, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): ViewSlotOccupantForTable<Table>[] {\n return orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host, slotId),\n ).map((componentId) => ({\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n }));\n}\n\nexport function getSlotOccupantsByHost<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n): Readonly<Record<string, ViewSlotOccupantForTable<Table>[]>> {\n const occupantsBySlot: Record<string, ViewSlotOccupantForTable<Table>[]> = {};\n\n orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host),\n ).forEach((componentId) => {\n const location = table.componentLocations[componentId];\n if (!location || !matchesSlotHost(location, host)) {\n return;\n }\n\n const slotOccupant: ViewSlotOccupantForTable<Table> = {\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId: location.slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n };\n\n (occupantsBySlot[location.slotId] ??= []).push(slotOccupant);\n });\n\n return occupantsBySlot;\n}\n\nexport function getCardOwner<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"ownerOfCard\"][CardId] {\n return table.ownerOfCard[cardId] as Table[\"ownerOfCard\"][CardId];\n}\n\nexport function getCardVisibility<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"visibility\"][CardId] {\n return table.visibility[cardId] as Table[\"visibility\"][CardId];\n}\n\nexport function getPlayerOrder<Table extends RuntimeTableRecord>(\n table: Table,\n): Table[\"playerOrder\"] {\n return table.playerOrder;\n}\n\nexport function getPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: PlayerIdOfTable<NoInfer<Table>>,\n): ResourceBalancesOfTable<Table> {\n return perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as unknown as PlayerId,\n ) as ResourceBalancesOfTable<Table>;\n}\n\n/**\n * Read the amount a player holds of a single resource. Returns `0` when the\n * player has never accumulated that resource.\n */\nexport function getPlayerResourceAmount<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n): number {\n const playerResources = perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n );\n if (!playerResources) return 0;\n const value = (playerResources as Record<string, unknown>)[resourceId];\n return typeof value === \"number\" ? value : 0;\n}\n\n/**\n * Sum of every resource amount for a player (e.g. \"total cards in hand\"\n * games). Skips `undefined` and non-number values.\n */\nexport function getPlayerResourceTotal<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): number {\n const playerResources = perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n );\n if (!playerResources) return 0;\n let total = 0;\n for (const key of Object.keys(playerResources)) {\n const value = (playerResources as Record<string, unknown>)[key];\n if (typeof value === \"number\") total += value;\n }\n return total;\n}\n\n/**\n * Next player in seating order after `playerId`, wrapping around to the\n * first seat. Returns `null` when `playerId` is not in the player order or\n * the order is empty.\n */\nexport function getNextPlayerInOrder<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): PlayerIdOfTable<Table> | null {\n const order = table.playerOrder as unknown as ReadonlyArray<\n PlayerIdOfTable<Table>\n >;\n if (order.length === 0) return null;\n const idx = order.indexOf(playerId as PlayerIdOfTable<Table>);\n if (idx < 0) return null;\n return order[(idx + 1) % order.length] ?? null;\n}\n\n/**\n * Iterate a resource-amounts record, skipping undefined / non-positive entries.\n * Shared by the resource mutation helpers below.\n */\nfunction forEachResourceEntry(\n amounts: Readonly<Record<string, number | undefined>>,\n visit: (resourceId: string, amount: number) => void,\n): void {\n for (const resourceId of Object.keys(amounts)) {\n const amount = amounts[resourceId];\n if (typeof amount !== \"number\" || amount === 0) continue;\n visit(resourceId, amount);\n }\n}\n\n/**\n * Return `true` when `playerId` has at least the requested `amounts` of each\n * resource. Unknown resource ids are treated as zero-balance (i.e. requesting\n * one of them returns `false` unless the requested amount is also zero).\n */\nexport function canAffordResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): boolean {\n for (const resourceId of Object.keys(amounts)) {\n const required = amounts[resourceId];\n if (typeof required !== \"number\" || required <= 0) continue;\n if (getPlayerResourceAmount(table, playerId, resourceId) < required) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Return the subset of `amounts` that the player cannot afford. The returned\n * record maps resource id → shortfall. Empty when the player can afford the\n * full cost.\n */\nexport function getMissingResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Record<string, number> {\n const missing: Record<string, number> = {};\n for (const resourceId of Object.keys(amounts)) {\n const required = amounts[resourceId];\n if (typeof required !== \"number\" || required <= 0) continue;\n const have = getPlayerResourceAmount(table, playerId, resourceId);\n if (have < required) missing[resourceId] = required - have;\n }\n return missing;\n}\n\nfunction withPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n nextForPlayer: Record<string, number>,\n): Table {\n return {\n ...table,\n resources: perPlayerSet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n nextForPlayer as RuntimeRecord,\n ),\n } as Table;\n}\n\n/**\n * Increment each resource in `amounts` for `playerId`. Negative entries are\n * rejected — prefer {@link spendPlayerResources} for deductions so that\n * affordability is checked explicitly.\n */\nexport function addPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n forEachResourceEntry(amounts, (resourceId, amount) => {\n if (amount < 0) {\n throw new Error(\n `addPlayerResources: negative amount for resource '${resourceId}'. ` +\n `Use spendPlayerResources or transferPlayerResources instead.`,\n );\n }\n next[resourceId] = (next[resourceId] ?? 0) + amount;\n });\n return withPlayerResources(table, playerId, next);\n}\n\n/**\n * Deduct each resource in `amounts` from `playerId`. Throws when the player\n * cannot afford the full cost — callers must check `canAfford` in their\n * `validate` phase before invoking this op.\n */\nexport function spendPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n if (!canAffordResources(table, playerId, amounts)) {\n const missing = getMissingResources(table, playerId, amounts);\n throw new Error(\n `spendPlayerResources: player '${playerId}' cannot afford ${JSON.stringify(\n missing,\n )}. Check canAfford in your validate step first.`,\n );\n }\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n forEachResourceEntry(amounts, (resourceId, amount) => {\n if (amount < 0) {\n throw new Error(\n `spendPlayerResources: negative amount for resource '${resourceId}'. ` +\n `Pass positive amounts — the op deducts them from the player.`,\n );\n }\n next[resourceId] = Math.max(0, (next[resourceId] ?? 0) - amount);\n });\n return withPlayerResources(table, playerId, next);\n}\n\n/**\n * Transfer the specified `amounts` from one player to another. Fails when the\n * source player cannot afford the full cost; on success the destination\n * gains exactly what the source loses.\n */\nexport function transferPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n fromPlayerId: string,\n toPlayerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const afterSpend = spendPlayerResources(table, fromPlayerId, amounts);\n return addPlayerResources(afterSpend, toPlayerId, amounts);\n}\n\n/**\n * Overwrite a single resource balance for a player. Prefer the additive or\n * subtractive helpers — use this only when the new balance is an absolute\n * (e.g. \"set coins to 10\" for a scripted setup).\n */\nexport function setPlayerResource<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n amount: number,\n): Table {\n if (!Number.isFinite(amount) || amount < 0) {\n throw new Error(\n `setPlayerResource: amount must be a non-negative finite number, got ${amount}.`,\n );\n }\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n return withPlayerResources(table, playerId, {\n ...prev,\n [resourceId]: amount,\n });\n}\n\nexport function getComponentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ComponentLocationOfTable<Table, ComponentId> | undefined {\n return table.componentLocations[componentId] as\n | ComponentLocationOfTable<Table, ComponentId>\n | undefined;\n}\n\nexport function getComponentDeckLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedDeckLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InDeck\") {\n return null;\n }\n\n return {\n componentId,\n deckId: location.deckId as DeckIdOfTable<Table>,\n cards: table.decks[location.deckId as DeckIdOfTable<Table>],\n location,\n } as ResolvedDeckLocation<Table, ComponentId>;\n}\n\nexport function getComponentHandLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedHandLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InHand\") {\n return null;\n }\n\n return {\n componentId,\n handId: location.handId as HandIdOfTable<Table>,\n playerId: location.playerId as PlayerIdOfTable<Table>,\n cards: ppRead(\n table.hands[location.handId as HandIdOfTable<Table>],\n location.playerId as string,\n ),\n location,\n } as unknown as ResolvedHandLocation<Table, ComponentId>;\n}\n\nexport function getComponentZoneLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedZoneLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InZone\") {\n return null;\n }\n\n return {\n componentId,\n zoneId: location.zoneId,\n location,\n } as ResolvedZoneLocation<Table, ComponentId>;\n}\n\nexport function getComponentSpaceLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSpaceLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnSpace\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const spaceId = location.spaceId as SpaceIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n spaceId,\n space: getSpace(table, boardId, spaceId),\n location,\n } as ResolvedSpaceLocation<Table, ComponentId>;\n}\n\nexport function getComponentContainerLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedContainerLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InContainer\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const containerId = location.containerId as BoardContainerIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n containerId,\n container: getContainer(table, boardId, containerId),\n location,\n } as ResolvedContainerLocation<Table, ComponentId>;\n}\n\nexport function getComponentEdgeLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedEdgeLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnEdge\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const edgeId = location.edgeId as TiledEdgeIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n edgeId,\n edge: getEdge(table, boardId, edgeId),\n location,\n } as ResolvedEdgeLocation<Table, ComponentId>;\n}\n\nexport function getComponentVertexLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedVertexLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnVertex\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const vertexId = location.vertexId as TiledVertexIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n vertexId,\n vertex: getVertex(table, boardId, vertexId),\n location,\n } as ResolvedVertexLocation<Table, ComponentId>;\n}\n\nexport function getComponentSlotLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSlotLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InSlot\") {\n return null;\n }\n\n return {\n componentId,\n host: location.host,\n slotId: location.slotId,\n location,\n } as ResolvedSlotLocation<Table, ComponentId>;\n}\n\nexport function getBoard<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n>(table: Table, boardId: BoardId): Table[\"boards\"][\"byId\"][BoardId] {\n return table.boards.byId[boardId] as Table[\"boards\"][\"byId\"][BoardId];\n}\n\nexport function getHexBoard<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >;\n}\n\nexport function getTiledBoard<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" | \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" | \"square\" }\n >;\n}\n\nexport function getSquareBoard<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >;\n}\n\nexport function getSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId] {\n return getBoard(table, boardId).spaces[\n spaceId\n ] as Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId];\n}\n\nexport function getHexSpace<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends HexSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n>[\"spaces\"][SpaceId] {\n return getHexBoard(table, boardId).spaces[spaceId] as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getSquareSpace<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n>[\"spaces\"][SpaceId] {\n return getSquareBoard(table, boardId).spaces[spaceId] as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId] {\n return getBoard(table, boardId).containers[\n containerId\n ] as Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId];\n}\n\nexport function assertCardAllowedInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds =\n getContainer(table, boardId, containerId).allowedCardSetIds ?? [];\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter container '${containerId}' on board '${boardId}'.`,\n );\n }\n}\n\nexport function getEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledEdgeStateOfTable<Table, BoardId, EdgeId> {\n const edge = getTiledBoard(table, boardId).edges.find(\n (candidate) => candidate.id === edgeId,\n );\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n return edge as TiledEdgeStateOfTable<Table, BoardId, EdgeId>;\n}\n\nexport function getVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledVertexStateOfTable<Table, BoardId, VertexId> {\n const vertex = getTiledBoard(table, boardId).vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n return vertex as TiledVertexStateOfTable<Table, BoardId, VertexId>;\n}\n\nexport function getHexSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n q: number,\n r: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getHexBoard(table, boardId).spaces).find(\n (space) => space.q === q && space.r === r,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSquareSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n row: number,\n col: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getSquareBoard(table, boardId).spaces).find(\n (space) => space.row === row && space.col === col,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSpaceEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.spaceIds.includes(spaceId))\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getSpaceVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.spaceIds.includes(spaceId))\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n const vertex = tiledBoard.vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n const vertexSpaceIds = new Set(vertex.spaceIds);\n return tiledBoard.edges\n .filter((edge) =>\n edge.spaceIds.every((spaceId) => vertexSpaceIds.has(spaceId)),\n )\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n const edge = tiledBoard.edges.find((candidate) => candidate.id === edgeId);\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n const edgeSpaceIds = new Set(edge.spaceIds);\n return tiledBoard.vertices\n .filter((vertex) =>\n Array.from(edgeSpaceIds).every((spaceId) =>\n vertex.spaceIds.includes(spaceId),\n ),\n )\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getRelatedSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n TypeId extends RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n): SpaceId[] {\n const board = getBoard(table, boardId);\n const related = new Set<SpaceId>();\n\n for (const relation of board.relations) {\n if (relation.typeId !== relationTypeId) {\n continue;\n }\n if (relation.fromSpaceId === spaceId) {\n related.add(relation.toSpaceId as SpaceId);\n continue;\n }\n if (!relation.directed && relation.toSpaceId === spaceId) {\n related.add(relation.fromSpaceId as SpaceId);\n }\n }\n\n return [...related];\n}\n\nexport function getAdjacentSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): SpaceId[] {\n return getRelatedSpaces(\n table,\n boardId,\n spaceId,\n \"adjacent\" as RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n );\n}\n\nexport function getSpaceDistance<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n): number {\n if (fromSpaceId === toSpaceId) {\n return 0;\n }\n\n const visited = new Set<string>([fromSpaceId]);\n let frontier: string[] = [fromSpaceId];\n let distance = 0;\n\n while (frontier.length > 0) {\n distance += 1;\n const nextFrontier: string[] = [];\n\n for (const currentSpaceId of frontier) {\n for (const neighborId of getAdjacentSpaces(\n table,\n boardId,\n currentSpaceId as SpaceId,\n )) {\n if (neighborId === toSpaceId) {\n return distance;\n }\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n nextFrontier.push(neighborId);\n }\n }\n }\n\n frontier = nextFrontier;\n }\n\n return Number.POSITIVE_INFINITY;\n}\n\nexport function getSquareNeighbors<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n options: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" } = {},\n): SquareSpaceIdOfTable<Table, BoardId>[] {\n const board = getSquareBoard(table, boardId);\n const space = getSquareSpace(table, boardId, spaceId);\n const offsets: ReadonlyArray<readonly [number, number]> =\n options.mode === \"diagonal\"\n ? [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : options.mode === \"all\"\n ? [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n ];\n\n return offsets\n .map(([rowOffset, colOffset]) =>\n Object.values(board.spaces).find(\n (candidate) =>\n candidate.row === space.row + rowOffset &&\n candidate.col === space.col + colOffset,\n ),\n )\n .filter((candidate): candidate is typeof space => candidate !== undefined)\n .map((candidate) => candidate.id as SquareSpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getSquareDistance<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options: { metric?: \"manhattan\" | \"chebyshev\" } = {},\n): number {\n const from = getSquareSpace(table, boardId, fromSpaceId);\n const to = getSquareSpace(table, boardId, toSpaceId);\n const rowDistance = Math.abs(from.row - to.row);\n const colDistance = Math.abs(from.col - to.col);\n\n return options.metric === \"chebyshev\"\n ? Math.max(rowDistance, colDistance)\n : rowDistance + colDistance;\n}\n\nexport function getBoardsByTypeId<\n Table extends RuntimeTableRecord,\n TypeId extends BoardTypeIdOfTable<NoInfer<Table>>,\n>(table: Table, typeId: TypeId): BoardIdOfTable<Table>[] {\n return Object.entries(table.boards.byId)\n .filter(([, board]) => board.typeId === typeId)\n .map(([boardId]) => boardId as BoardIdOfTable<Table>);\n}\n\nexport function getSpacesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n TypeId extends SpaceTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): SpaceIdOfTable<Table, BoardId>[] {\n return Object.entries(getBoard(table, boardId).spaces)\n .filter(([, space]) => space.typeId === typeId)\n .map(([spaceId]) => spaceId as SpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getEdgesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledEdgeTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.typeId === typeId)\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getVerticesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledVertexTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.typeId === typeId)\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getComponentsOnSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getSpace(table, boardId, spaceId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"OnSpace\" &&\n location.boardId === boardId &&\n location.spaceId === spaceId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getContainer(table, boardId, containerId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"InContainer\" &&\n location.boardId === boardId &&\n location.containerId === containerId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function moveComponentToSpace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n const position = getComponentsOnSpace(nextTable, boardId, spaceId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToContainer<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n containerId: ContainerId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertCardAllowedInContainer(nextTable, boardId, containerId, componentId);\n const position = getComponentsInContainer(\n nextTable,\n boardId,\n containerId,\n ).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToDetached<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): Table {\n const nextTable = cloneRuntimeTable(table);\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = { type: \"Detached\" };\n return nextTable;\n}\n\nexport function moveComponentToEdge<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n edgeId: EdgeId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n getEdge(nextTable, boardId, edgeId);\n const position = getComponentsOnEdge(nextTable, boardId, edgeId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToVertex<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n vertexId: VertexId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n getVertex(nextTable, boardId, vertexId);\n const position = getComponentsOnVertex(nextTable, boardId, vertexId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position,\n };\n return nextTable;\n}\n\nexport function moveCardFromPlayerZoneToSharedZone<\n Table extends RuntimeTableRecord,\n HandId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: HandId;\n toZoneId: DeckId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n return moveFromHandToDeck({\n table: options.table,\n playerId: options.playerId,\n handId: options.fromZoneId,\n cardId: options.cardId,\n deckId: options.toZoneId,\n playedBy: options.playedBy,\n position: options.position,\n });\n}\n\n/**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer zone\n * (e.g. discard, hand, in-play). Use this for the \"gain\" verb — distinct from\n * `dealCardsToPlayerZone`, which draws an unspecified count of top cards from\n * a deck. Owner flips to the receiving player; visibility is recomputed from\n * the destination zone's `handVisibility` mode.\n */\n/**\n * Move the top `count` cards from one perPlayer zone to another for the same\n * player. Companion to {@link dealCardsFromDeckToHand} for the perPlayer →\n * perPlayer case (most importantly, \"draw N from your deck to your hand\"\n * in deck-builders). Visibility is recomputed for the destination; owner is\n * preserved.\n */\nexport function dealCardsBetweenPlayerZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n}): Table {\n let nextTable = options.table;\n for (let i = 0; i < options.count; i += 1) {\n const sourceCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.fromZoneId] ??\n nextTable.hands[options.fromZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const topCardId = sourceCards[0];\n if (topCardId === undefined) {\n break;\n }\n nextTable = moveCardBetweenPlayerZones({\n table: nextTable,\n playerId: options.playerId,\n fromZoneId: options.fromZoneId,\n toZoneId: options.toZoneId,\n cardId: topCardId as CompatibleCardIdForTwoPlayerZones<\n Table,\n FromZoneId,\n ToZoneId\n >,\n });\n }\n return nextTable;\n}\n\nexport function moveCardFromSharedZoneToPlayerZone<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<Table, ToZoneId, FromZoneId>;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.fromZoneId as string,\n \"shared\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"toZoneId\",\n );\n\n const sourceCards = ensureArray(\n nextTable.zones.shared[options.fromZoneId] ??\n nextTable.decks[options.fromZoneId],\n );\n if (!sourceCards.includes(options.cardId as string)) {\n throw new Error(\n `Card '${String(options.cardId)}' is not in shared zone '${String(\n options.fromZoneId,\n )}'.`,\n );\n }\n assertCardAllowedInZone(\n nextTable,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const remainingSource = sourceCards.filter(\n (candidate) => candidate !== options.cardId,\n );\n syncSharedZoneWithDeck(nextTable, options.fromZoneId, remainingSource);\n for (const [index, currentCardId] of remainingSource.entries()) {\n const existing = nextTable.componentLocations[currentCardId];\n if (existing?.type === \"InDeck\") {\n nextTable.componentLocations[currentCardId] = {\n ...existing,\n position: index,\n };\n }\n }\n\n const destinationCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.toZoneId] ??\n nextTable.hands[options.toZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const nextDestination =\n options.position === \"top\"\n ? [options.cardId as string, ...destinationCards]\n : [...destinationCards, options.cardId as string];\n syncPlayerZoneWithHand(\n nextTable,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const [index, currentCardId] of nextDestination.entries()) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: options.toZoneId as string,\n playerId: options.playerId as string,\n position: index,\n };\n }\n nextTable.ownerOfCard[options.cardId as string] = options.playerId as string;\n nextTable.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n nextTable,\n options.toZoneId as string,\n options.playerId as string,\n );\n\n return nextTable;\n}\n\n/**\n * Move a card between two perPlayer zones owned by the same player. Use this\n * for hand → in-play, in-play → discard, and similar same-player transitions\n * that do not change ownership. Owner is preserved; visibility is recomputed\n * from the destination zone's `handVisibility` mode.\n */\nexport function moveCardBetweenPlayerZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<Table, FromZoneId, ToZoneId>;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.fromZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"toZoneId\",\n );\n\n const sourceCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.fromZoneId] ??\n nextTable.hands[options.fromZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n if (!sourceCards.includes(options.cardId as string)) {\n throw new Error(\n `Card '${String(options.cardId)}' is not in zone '${String(\n options.fromZoneId,\n )}' for player '${String(options.playerId)}'.`,\n );\n }\n assertCardAllowedInZone(\n nextTable,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const remainingSource = sourceCards.filter(\n (candidate) => candidate !== options.cardId,\n );\n syncPlayerZoneWithHand(\n nextTable,\n options.fromZoneId,\n options.playerId,\n remainingSource,\n );\n for (const [index, currentCardId] of remainingSource.entries()) {\n const existing = nextTable.componentLocations[currentCardId];\n if (existing?.type === \"InHand\") {\n nextTable.componentLocations[currentCardId] = {\n ...existing,\n position: index,\n };\n }\n }\n\n const destinationCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.toZoneId] ??\n nextTable.hands[options.toZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const nextDestination =\n options.position === \"top\"\n ? [options.cardId as string, ...destinationCards]\n : [...destinationCards, options.cardId as string];\n syncPlayerZoneWithHand(\n nextTable,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const [index, currentCardId] of nextDestination.entries()) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: options.toZoneId as string,\n playerId: options.playerId as string,\n position: index,\n };\n }\n nextTable.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n nextTable,\n options.toZoneId as string,\n options.playerId as string,\n );\n\n return nextTable;\n}\n\nexport function moveCardBetweenSharedZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<Table, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n const removed = removeFromDeck(\n options.table,\n options.fromZoneId,\n options.cardId,\n );\n return appendToDeck(\n removed,\n options.toZoneId,\n options.cardId as DeckCardsOfTable<Table, ToZoneId>[number],\n options.playedBy ?? null,\n options.position ?? \"bottom\",\n );\n}\n\nexport function removeCardFromSharedZone<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): Table {\n return removeFromDeck(table, deckId, cardId);\n}\n\nexport function addCardToSharedZone<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): Table {\n return appendToDeck(table, deckId, cardId, playedBy, position);\n}\n\n/**\n * Deterministically draw the top `count` cards from a shared deck and deal\n * them into a player's hand zone. No RNG is consumed — call\n * {@link shuffleSharedZone} (via `fx.shuffleSharedZone`) first if the deck\n * needs randomising.\n */\nexport function dealCardsFromDeckToHand<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n HandId extends HandIdOfTable<Table>,\n>(\n table: Table,\n fromZoneId: DeckId,\n playerId: PlayerId,\n toZoneId: HandId,\n count: number,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n const publicHands = new Set(\n Object.entries(nextTable.handVisibility)\n .filter(([, mode]) => mode === \"all\" || mode === \"public\")\n .map(([handId]) => handId),\n );\n\n for (let index = 0; index < count; index += 1) {\n const nextCard = ensureArray(nextTable.decks[fromZoneId])[0];\n if (!nextCard) {\n break;\n }\n nextTable.decks[fromZoneId] = ensureArray(\n nextTable.decks[fromZoneId],\n ).slice(1) as (typeof nextTable.decks)[DeckId];\n nextTable.zones.shared[fromZoneId] = [\n ...ensureArray(nextTable.decks[fromZoneId]),\n ] as (typeof nextTable.zones.shared)[DeckId];\n const prevHand = ppRead(nextTable.hands[toZoneId], playerId as string) as\n | readonly string[]\n | undefined;\n const nextHand = [...ensureArray(prevHand), nextCard];\n assertCardAllowedInZone(nextTable, toZoneId, nextCard);\n nextTable.hands[toZoneId] = ppWrite(\n nextTable.hands[toZoneId],\n playerId as string,\n nextHand,\n ) as (typeof nextTable.hands)[HandId];\n nextTable.zones.perPlayer[toZoneId] = ppWrite(\n nextTable.zones.perPlayer[toZoneId],\n playerId as string,\n [...nextHand],\n ) as (typeof nextTable.zones.perPlayer)[HandId];\n nextTable.componentLocations[nextCard] = {\n type: \"InHand\",\n handId: toZoneId,\n playerId,\n position: nextHand.length - 1,\n };\n nextTable.ownerOfCard[nextCard] = playerId;\n nextTable.visibility[nextCard] = publicHands.has(toZoneId as string)\n ? {\n faceUp: true,\n }\n : {\n faceUp: false,\n visibleTo: [playerId],\n };\n }\n return nextTable;\n}\n\nexport type { RuntimeTableRecord, TableOfState, CardIdOfState };\n","import type { RuntimeRngState } from \"./model\";\n\n/**\n * Deterministic pseudo-random integer generator for reducer-native games.\n *\n * The public contract is `(rng.seed, rng.cursor) -> value`, with the cursor\n * advanced by one per call. Same `(seed, cursor)` tuple always produces the\n * same output, which is what makes session replay deterministic without\n * having to persist anything beyond the seed and cursor.\n *\n * Internally we hash `(seed, cursor)` through a Murmur3-style 32-bit\n * finalizer rather than computing a linear combination of the cursor. The\n * older `(seed * A + C + cursor) & 0x7fffffff` form was linear in `cursor`,\n * so consecutive samples differed by a fixed step — for a d6 that meant\n * every roll produced a simple `+1` counter through the faces. Mixing\n * `(seed, cursor)` with an avalanche finalizer is still pure and still\n * cheap, but now nearby cursors yield well-distributed outputs.\n *\n * Distribution note: the `% bound` step is biased when `bound` is not a\n * power of two. For gameplay-level bounds (≤ 64) the bias is negligible\n * and we leave it in to keep replay fixtures stable against future bound\n * changes. If a caller ever needs strict uniformity we can add an\n * explicit `nextUniformInt` without touching the existing consumers.\n */\nexport function nextRandomInt(\n bound: number,\n rng: RuntimeRngState,\n): [number, RuntimeRngState] {\n if (bound <= 0) {\n throw new Error(\"Random bound must be positive.\");\n }\n const seed = rng.seed ?? 1;\n const raw = hashSeedCursor(seed, rng.cursor);\n const value = raw % bound;\n return [\n value,\n {\n ...rng,\n cursor: rng.cursor + 1,\n trace: [\n ...rng.trace,\n `cursor=${rng.cursor};bound=${bound};value=${value}`,\n ],\n },\n ];\n}\n\n/**\n * Mix `(seed, cursor)` into a uniformly-distributed uint32 using a\n * Murmur3-style finalizer. The seed is split into its low and high 32-bit\n * halves so large 53-bit JS-integer seeds (including the negative seeds\n * the backend derives from its own 64-bit generator) don't collapse onto\n * the same bucket after a `| 0` truncation.\n */\nfunction hashSeedCursor(seed: number, cursor: number): number {\n const seedLo = seed | 0;\n // `Math.floor(seed / 2^32) | 0` keeps the upper bits of large seeds.\n // For small seeds this is 0 (or -1 for negatives), so the stir below is\n // still dominated by `seedLo` + `cursor` as you'd expect.\n const seedHi = Math.floor(seed / 0x1_0000_0000) | 0;\n let x = Math.imul(seedLo, 0x9e3779b1);\n x = (x + Math.imul(seedHi, 0x85ebca77)) | 0;\n x = (x + Math.imul(cursor | 0, 0xc2b2ae3d)) | 0;\n // Murmur3 32-bit finalizer.\n x = Math.imul(x ^ (x >>> 16), 0x85ebca6b);\n x = Math.imul(x ^ (x >>> 13), 0xc2b2ae35);\n x = x ^ (x >>> 16);\n return x >>> 0;\n}\n","import type {\n CollectorState,\n InputCollector,\n RandomHelpers,\n RuntimeRngState,\n SchemaLike,\n} from \"../../model\";\nimport { nextRandomInt } from \"../../rng\";\n\nexport type RngConsumption = {\n operation: string;\n traceEntry: string;\n};\n\nexport type MutableRandomHelpers = {\n random: RandomHelpers;\n currentRng: () => RuntimeRngState;\n};\n\nexport function sampleDieValue(\n sides: number,\n rng: RuntimeRngState,\n): {\n value: number;\n nextRng: RuntimeRngState;\n consumption: RngConsumption;\n} {\n const [offset, nextRng] = nextRandomInt(sides, rng);\n return {\n value: offset + 1,\n nextRng,\n consumption: {\n operation: \"rollDie\",\n traceEntry: nextRng.trace[nextRng.trace.length - 1] ?? \"\",\n },\n };\n}\n\nexport function shuffleWithRng<T>(\n values: readonly T[],\n rng: RuntimeRngState,\n operation:\n | \"shuffleSharedZone\"\n | \"shufflePlayerZone\"\n | \"randomSubset\" = \"shuffleSharedZone\",\n): {\n orderedValues: T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n const orderedValues = [...values];\n let nextRng = rng;\n const consumptions: RngConsumption[] = [];\n for (\n let lastIndex = orderedValues.length - 1;\n lastIndex > 0;\n lastIndex -= 1\n ) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n consumptions.push({\n operation,\n traceEntry: updatedRng.trace[updatedRng.trace.length - 1] ?? \"\",\n });\n nextRng = updatedRng;\n const current = orderedValues[lastIndex];\n const swap = orderedValues[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `shuffleWithRng: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${orderedValues.length})`,\n );\n }\n orderedValues[lastIndex] = swap;\n orderedValues[swapIndex] = current;\n }\n return { orderedValues, nextRng, consumptions };\n}\n\nexport function subsetWithRng<T>(\n values: readonly T[],\n count: number,\n rng: RuntimeRngState,\n): {\n values: readonly T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n if (!Number.isInteger(count) || count < 0) {\n throw new Error(\"random.subset count must be a non-negative integer.\");\n }\n if (count > values.length) {\n throw new Error(\n `random.subset count ${count} exceeds source length ${values.length}.`,\n );\n }\n const shuffled = shuffleWithRng(values, rng, \"randomSubset\");\n return {\n values: shuffled.orderedValues.slice(0, count),\n nextRng: shuffled.nextRng,\n consumptions: shuffled.consumptions,\n };\n}\n\nexport function createMutableRandomHelpers(\n rng: RuntimeRngState,\n): MutableRandomHelpers {\n let current = rng;\n return {\n random: {\n subset(options) {\n const sampled = subsetWithRng(options.from, options.count, current);\n current = sampled.nextRng;\n return sampled.values;\n },\n },\n currentRng: () => current,\n };\n}\n\nexport function sampleRngCollectorValue(\n collector: InputCollector<SchemaLike<unknown>, CollectorState, \"rng\">,\n rng: RuntimeRngState,\n): { value: unknown; nextRng: RuntimeRngState } {\n const meta = collector.meta;\n switch (meta.rng) {\n case \"d6\": {\n const count = meta.count > 0 ? meta.count : 1;\n const values: number[] = [];\n let nextRng = rng;\n for (let i = 0; i < count; i += 1) {\n const sampled = sampleDieValue(6, nextRng);\n values.push(sampled.value);\n nextRng = sampled.nextRng;\n }\n return { value: { values }, nextRng };\n }\n case \"coin\": {\n const [offset, nextRng] = nextRandomInt(2, rng);\n return {\n value: { value: offset === 0 ? \"heads\" : \"tails\" },\n nextRng,\n };\n }\n default: {\n const _exhaustive: never = meta;\n throw new Error(\n `Unknown rngInput kind '${String(_exhaustive)}'. Register a sampler in trusted rng-sampler.`,\n );\n }\n }\n}\n","import type { DispatchTraceEntry, TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport {\n cloneRuntimeTable,\n ensureArray,\n shufflePlayerZoneCards,\n} from \"../../table-ops\";\nimport {\n sampleDieValue,\n shuffleWithRng,\n type RngConsumption,\n} from \"./rng-sampler\";\nimport type {\n TrustedInput,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\nfunction toRngTrace<\n State,\n PlayerId extends string,\n ReducerInput extends TrustedRuntimeInput<PlayerId>,\n>(\n consumptions: readonly RngConsumption[],\n): DispatchTraceEntry<State, PlayerId, ReducerInput>[] {\n return consumptions.map((consumption) => ({\n type: \"rngConsumption\" as const,\n operation: consumption.operation,\n traceEntry: consumption.traceEntry,\n }));\n}\n\nexport function createEngineInstructionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>() {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveRollDie(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.rollDie\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const die = state.table.dice[instruction.dieId];\n if (!die) {\n throw new Error(`Cannot roll unknown die '${instruction.dieId}'.`);\n }\n if (!Number.isInteger(die.sides) || die.sides <= 0) {\n throw new Error(\n `Cannot roll die '${instruction.dieId}' with invalid sides '${die.sides}'.`,\n );\n }\n const nextTable = cloneRuntimeTable(state.table);\n const sampled = sampleDieValue(die.sides, state.runtime.rng);\n nextTable.dice[instruction.dieId] = {\n ...die,\n value: sampled.value,\n };\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"rollDie\",\n response: {\n dieId: instruction.dieId,\n value: sampled.value,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: sampled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>([sampled.consumption]),\n };\n }\n\n function resolveShuffleSharedZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shuffleSharedZone\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const nextTable = cloneRuntimeTable(state.table);\n const deckCards = [...ensureArray(nextTable.decks[instruction.zoneId])];\n const shuffled = shuffleWithRng(deckCards, state.runtime.rng);\n const orderedCardIds = [...shuffled.orderedValues];\n nextTable.decks[instruction.zoneId] = shuffled.orderedValues;\n nextTable.zones.shared[instruction.zoneId] = [...shuffled.orderedValues];\n for (const [index, cardId] of shuffled.orderedValues.entries()) {\n const currentLocation = nextTable.componentLocations[cardId];\n nextTable.componentLocations[cardId] =\n currentLocation?.type === \"InDeck\" || currentLocation?.type === \"InZone\"\n ? {\n ...currentLocation,\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: currentLocation.playedBy ?? null,\n position: index,\n }\n : {\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: null,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shuffleSharedZone\",\n response: {\n zoneId: instruction.zoneId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n function resolveShufflePlayerZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shufflePlayerZone\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const nextTable = cloneRuntimeTable(state.table);\n const zoneCards = shufflePlayerZoneCards(\n nextTable,\n instruction.zoneId,\n instruction.playerId,\n );\n const shuffled = shuffleWithRng(\n zoneCards,\n state.runtime.rng,\n \"shufflePlayerZone\",\n );\n const orderedCardIds = [...shuffled.orderedValues];\n shufflePlayerZoneCards(\n nextTable,\n instruction.zoneId,\n instruction.playerId,\n orderedCardIds,\n );\n for (const [index, cardId] of orderedCardIds.entries()) {\n const currentLocation = nextTable.componentLocations[cardId];\n nextTable.componentLocations[cardId] =\n currentLocation?.type === \"InHand\"\n ? {\n ...currentLocation,\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n }\n : {\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shufflePlayerZone\",\n response: {\n zoneId: instruction.zoneId,\n playerId: instruction.playerId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n return {\n resolveRollDie,\n resolveShuffleSharedZone,\n resolveShufflePlayerZone,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport type {\n TrustedInput,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createFlowInstructionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>) {\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveTransition(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"flow.transition\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const initialized = lifecycle.initializePhaseResult(\n {\n ...state,\n flow: {\n ...state.flow,\n currentPhase:\n instruction.to as unknown as State[\"flow\"][\"currentPhase\"],\n },\n runtime: {\n ...state.runtime,\n lastTransition: {\n from: state.flow.currentPhase,\n to: instruction.to,\n },\n } as State[\"runtime\"],\n },\n instruction.to as PhaseName,\n );\n return {\n state: initialized.state,\n queuedInputs: [],\n queuedInstructions: initialized.instructions,\n trace: [],\n };\n }\n\n return {\n resolveTransition,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\nexport const SIMULTANEOUS_SUBMIT_INTERACTION_ID = \"submit\";\n\ntype ErasedPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n TrustedRuntimeScope<Contract, Definitions, Views>[\"phaseByName\"]\n>;\n\nexport function isSimultaneousPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(phase: ErasedPhase<Contract, Definitions, Views>): boolean {\n return phase.kind === \"simultaneousPlayer\";\n}\n\nexport function simultaneousSubmitInteraction<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n phase: ErasedPhase<Contract, Definitions, Views>,\n):\n | AnyInteractionSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>\n | undefined {\n return (phase as { submit?: unknown }).submit as\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n}\n\nfunction resolvePromptToArray<PlayerId extends string>(\n value: unknown,\n): PlayerId[] {\n if (value === undefined || value === null) return [];\n if (Array.isArray(value)) return value as PlayerId[];\n if (typeof value === \"string\") return [value as PlayerId];\n return [];\n}\n\nexport function resolveSimultaneousActors<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n state: TrustedState<Contract>,\n phase: ErasedPhase<Contract, Definitions, Views>,\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >,\n): TrustedPlayerId<Contract>[] {\n type PlayerId = TrustedPlayerId<Contract>;\n const selector =\n (phase as { actors?: unknown; actor?: unknown }).actors ??\n (phase as { actor?: unknown }).actor;\n if (typeof selector === \"function\") {\n const selected = selector(\n scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n );\n const resolved = resolvePromptToArray<PlayerId>(selected);\n if (resolved.length > 0) {\n return resolved;\n }\n }\n const active = state.flow.activePlayers as PlayerId[];\n if (active.length > 0) {\n return [...active];\n }\n return [...(state.table.playerOrder as PlayerId[])];\n}\n","/**\n * Curried state writers for use with `pipe`.\n *\n * Each entry in the returned `ops` namespace is a curried transformation\n * `(args) => (state) => state` that can be composed with `pipe`:\n *\n * const ops = createReducerOps<GameState>();\n *\n * return accept(\n * pipe(state,\n * ops.setActivePlayers([playerId]),\n * ops.moveCardFromPlayerZoneToSharedZone({\n * playerId,\n * fromZoneId: \"things-hand\",\n * toZoneId: \"ring-1\",\n * cardId: \"a-dog\",\n * }),\n * ),\n * );\n *\n * The factory binds all ops to a specific `State` type so that ID arguments\n * (deck ids, card ids, etc.) are checked against the manifest-derived table\n * shape of the game.\n */\nimport type { Op } from \"./compose\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n CardIdOfTable,\n CompatibleHandIdForDeck,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HiddenStateOfState,\n PhaseStateOfState,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n PrivateStateOfState,\n PublicStateOfState,\n ResourceAmountsOfTable,\n ResourceIdOfTable,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"./model\";\nimport {\n asPlayerId,\n perPlayerGet,\n perPlayerSet,\n type PerPlayer,\n} from \"./per-player\";\nimport {\n addCardToSharedZone as tableAddCardToSharedZone,\n addPlayerResources as tableAddPlayerResources,\n cloneRuntimeTable,\n dealCardsFromDeckToHand as tableDealCardsFromDeckToHand,\n dealCardsBetweenPlayerZones as tableDealCardsBetweenPlayerZones,\n moveCardBetweenPlayerZones as tableMoveCardBetweenPlayerZones,\n moveCardBetweenSharedZones as tableMoveCardBetweenSharedZones,\n moveCardFromPlayerZoneToSharedZone as tableMoveCardFromPlayerZoneToSharedZone,\n moveCardFromSharedZoneToPlayerZone as tableMoveCardFromSharedZoneToPlayerZone,\n moveComponentToContainer as tableMoveComponentToContainer,\n moveComponentToDetached as tableMoveComponentToDetached,\n moveComponentToEdge as tableMoveComponentToEdge,\n moveComponentToSpace as tableMoveComponentToSpace,\n moveComponentToVertex as tableMoveComponentToVertex,\n removeCardFromSharedZone as tableRemoveCardFromSharedZone,\n setActivePlayers as stateSetActivePlayers,\n setPhaseState as stateSetPhaseState,\n setPlayerResource as tableSetPlayerResource,\n spendPlayerResources as tableSpendPlayerResources,\n transferPlayerResources as tableTransferPlayerResources,\n} from \"./table-ops\";\n\n/**\n * Minimum shape required for any state targeted by reducer ops.\n *\n * All curried writers operate on a game state with a `table` field.\n */\nexport type ReducerStateBase = {\n table: RuntimeTableRecord;\n};\n\ntype PipeTable<State extends ReducerStateBase> = TableOfState<State>;\n\n/**\n * A shallow patch for a slice of state. Either a partial object to merge\n * over the previous value, or a functional updater `(prev) => next`.\n */\nexport type StatePatch<T> = Partial<T> | ((prev: T) => T);\n\n/**\n * Curried writer namespace for a specific game state type.\n *\n * Created via {@link createReducerOps}.\n */\nexport interface ReducerOps<State extends ReducerStateBase> {\n // --- Flow ------------------------------------------------------------\n\n /** Set the list of players whose turn is currently active. */\n setActivePlayers(\n activePlayers: ReadonlyArray<PlayerIdOfState<State>>,\n ): Op<State>;\n\n /**\n * Advance `flow.activePlayers` to the single next seat in `playerOrder`.\n *\n * Uses `state.flow.activePlayers[0]` as the current seat (or the first\n * seat in `playerOrder` when `activePlayers` is empty) and sets\n * `activePlayers` to `[q.player.nextInOrder(current)]`. No-op when the\n * player order is empty.\n */\n advanceActivePlayer(): Op<State>;\n\n // --- Author-owned state slices --------------------------------------\n\n /**\n * Update the current phase's local state.\n *\n * Accepts either a `Partial<PhaseState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PhaseState`.\n */\n patchPhaseState(patch: StatePatch<PhaseStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.publicState`.\n *\n * Accepts either a `Partial<PublicState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PublicState`.\n */\n patchPublicState(patch: StatePatch<PublicStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.hiddenState`.\n *\n * Accepts either a `Partial<HiddenState>` or a functional updater.\n */\n patchHiddenState(patch: StatePatch<HiddenStateOfState<State>>): Op<State>;\n\n /**\n * Update a single player's entry in `state.privateState`.\n *\n * Accepts either a `Partial<PrivateState>` or a functional updater.\n */\n patchPlayerPrivateState(args: {\n playerId: PlayerIdOfState<State>;\n patch: StatePatch<PrivateStateOfState<State>>;\n }): Op<State>;\n\n // --- Shared zones / decks -------------------------------------------\n\n /**\n * Append a card to a shared zone (deck). Defaults to placing the card at the\n * bottom; pass `position: \"top\"` for top-of-deck placement (e.g. Bureaucrat-style).\n */\n addCardToSharedZone<\n DeckId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /** Remove a card from a shared zone (deck). */\n removeCardFromSharedZone<\n DeckId extends DeckIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n }): Op<State>;\n\n /**\n * Move a card between two shared zones (decks). Defaults to placing the card\n * at the bottom of the destination; pass `position: \"top\"` for top placement.\n */\n moveCardBetweenSharedZones<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<PipeTable<State>, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Draw the top `count` cards from one perPlayer zone into another for the\n * same player (e.g. deck → hand at the start of a turn). Companion to\n * {@link dealCardsToPlayerZone} for the perPlayer → perPlayer case. Stops\n * silently if the source runs out before `count` is reached.\n */\n dealCardsBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Move a card between two perPlayer zones owned by the same player (e.g.\n * hand → in-play → discard). Owner is preserved; visibility is recomputed\n * from the destination zone.\n */\n moveCardBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a card from a player zone (hand) to a shared zone (deck). Defaults to\n * placing the card at the bottom; pass `position: \"top\"` to topdeck.\n */\n moveCardFromPlayerZoneToSharedZone<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer\n * zone (e.g. discard). The \"gain\" verb in deck-builders. Distinct from\n * {@link dealCardsToPlayerZone}, which draws unspecified top-N cards from a\n * deck. Owner flips to the receiving player; visibility is recomputed.\n */\n moveCardFromSharedZoneToPlayerZone<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n ToZoneId,\n FromZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Deal the top `count` cards from a shared deck into a player's hand zone.\n *\n * This op does not consume RNG. If the deck needs to be random, shuffle it\n * first with `fx.shuffleSharedZone(...)`, then deal from the shuffled deck\n * inside the same reducer via this op.\n */\n dealCardsToPlayerZone<\n FromZoneId extends DeckIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n ToZoneId extends CompatibleHandIdForDeck<PipeTable<State>, FromZoneId> &\n HandIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n playerId: PlayerId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Atomically rotate cards in a per-player zone around the table.\n *\n * Defaults to rotating every card currently in `zoneId` for every player in\n * turn order. Pass `players` to use a smaller explicit order, or\n * `cardIdsByPlayer` to rotate only selected cards such as Hearts passes.\n */\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<PipeTable<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n // --- Board / component movement -------------------------------------\n\n /** Move a component onto a board space. */\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n SpaceId extends SpaceIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): Op<State>;\n\n /** Move a component into a board container. */\n moveComponentToContainer<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n ContainerId extends BoardContainerIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n containerId: ContainerId;\n }): Op<State>;\n\n /** Move a component onto a tiled board edge. */\n moveComponentToEdge<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n EdgeId extends TiledEdgeIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n edgeId: EdgeId;\n }): Op<State>;\n\n /** Move a component onto a tiled board vertex. */\n moveComponentToVertex<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n VertexId extends TiledVertexIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n vertexId: VertexId;\n }): Op<State>;\n\n /** Move a component back to the detached pool. */\n moveComponentToDetached<\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n }): Op<State>;\n\n // --- Resources ------------------------------------------------------\n\n /**\n * Credit the specified resources to a player.\n *\n * Amounts must be non-negative; use {@link spendResources} for deductions\n * so that affordability is checked explicitly.\n *\n * pipe(\n * state,\n * ops.addResources({ playerId, amounts: { wood: 1, brick: 1 } }),\n * )\n */\n addResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Debit the specified resources from a player.\n *\n * Throws when the player cannot afford the full cost — gate with\n * `q.player.canAfford(...)` in your `validate` step before invoking.\n *\n * pipe(\n * state,\n * ops.spendResources({ playerId, amounts: COST_DEV_CARD }),\n * ops.dealCardsToPlayerZone({ ... }),\n * )\n */\n spendResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Transfer the specified resources from one player to another.\n *\n * Throws when the source cannot afford the full amount. On success the\n * destination gains exactly what the source loses.\n */\n transferResources(args: {\n fromPlayerId: PlayerIdOfTable<PipeTable<State>>;\n toPlayerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Overwrite a single resource balance for a player. Prefer\n * {@link addResources} / {@link spendResources} — use this only when the\n * new balance is an absolute (e.g. scripted setup).\n */\n setResource(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n resourceId: ResourceIdOfTable<PipeTable<State>>;\n amount: number;\n }): Op<State>;\n}\n\n// --- Internal helpers -----------------------------------------------\n\ntype AnyTable = RuntimeTableRecord;\ntype AnyState = { table: AnyTable };\n\nfunction updateTable<S extends AnyState>(state: S, nextTable: AnyTable): S {\n return { ...state, table: nextTable };\n}\n\nfunction computePlayerZoneVisibility(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction readPlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): readonly string[] {\n const zone = table.zones.perPlayer[zoneId] ?? table.hands[zoneId];\n if (!zone) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n return (\n perPlayerGet(zone as PerPlayer<readonly string[]>, asPlayerId(playerId)) ??\n []\n );\n}\n\nfunction writePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n cards: readonly string[],\n): void {\n const currentZone = table.zones.perPlayer[zoneId];\n const currentHand = table.hands[zoneId];\n const player = asPlayerId(playerId);\n if (currentZone) {\n table.zones.perPlayer[zoneId] = perPlayerSet(\n currentZone as PerPlayer<string[]>,\n player,\n [...cards],\n );\n }\n if (currentHand) {\n table.hands[zoneId] = perPlayerSet(\n currentHand as PerPlayer<string[]>,\n player,\n [...cards],\n );\n }\n}\n\nfunction assertCardAllowedInPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n cardId: string,\n): void {\n const allowedCardSetIds = table.zones.cardSetIdsByZoneId?.[zoneId];\n if (!allowedCardSetIds || allowedCardSetIds.length === 0) {\n return;\n }\n const card = table.cards[cardId];\n if (!card) {\n throw new Error(`Card '${cardId}' does not exist.`);\n }\n if (!allowedCardSetIds.includes(card.cardSetId)) {\n throw new Error(\n `Card '${cardId}' from set '${card.cardSetId}' is not allowed in player zone '${zoneId}'.`,\n );\n }\n}\n\nfunction rotatePlayerZoneTable(options: {\n table: RuntimeTableRecord;\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n}): RuntimeTableRecord {\n const nextTable = cloneRuntimeTable(options.table);\n const zoneId = options.zoneId;\n if (!nextTable.zones.perPlayer[zoneId] && !nextTable.hands[zoneId]) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n const players = [...(options.players ?? nextTable.playerOrder)];\n if (players.length === 0) {\n return nextTable;\n }\n const playerSet = new Set(nextTable.playerOrder);\n for (const playerId of players) {\n if (!playerSet.has(playerId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': player '${playerId}' is not in player order.`,\n );\n }\n }\n\n const selectedByPlayer = new Map<string, readonly string[]>();\n for (const playerId of players) {\n const sourceCards = readPlayerZoneCards(nextTable, zoneId, playerId);\n const selected = options.cardIdsByPlayer?.[playerId] ?? sourceCards;\n for (const cardId of selected) {\n if (!sourceCards.includes(cardId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': card '${cardId}' is not in zone for player '${playerId}'.`,\n );\n }\n assertCardAllowedInPlayerZone(nextTable, zoneId, cardId);\n }\n selectedByPlayer.set(playerId, [...selected]);\n }\n\n const removeByPlayer = new Map<string, string[]>();\n for (const playerId of players) {\n const selected = new Set(selectedByPlayer.get(playerId) ?? []);\n removeByPlayer.set(\n playerId,\n readPlayerZoneCards(nextTable, zoneId, playerId).filter(\n (cardId) => !selected.has(cardId),\n ),\n );\n }\n\n const additionsByPlayer = new Map<string, string[]>(\n players.map((playerId) => [playerId, []]),\n );\n for (const [index, fromPlayerId] of players.entries()) {\n const offset = options.direction === \"left\" ? 1 : -1;\n const recipient =\n players[(index + offset + players.length) % players.length]!;\n additionsByPlayer\n .get(recipient)!\n .push(...(selectedByPlayer.get(fromPlayerId) ?? []));\n }\n\n for (const playerId of players) {\n const remaining = removeByPlayer.get(playerId) ?? [];\n const additions = additionsByPlayer.get(playerId) ?? [];\n const nextCards =\n options.position === \"top\"\n ? [...additions, ...remaining]\n : [...remaining, ...additions];\n writePlayerZoneCards(nextTable, zoneId, playerId, nextCards);\n for (const [position, cardId] of nextCards.entries()) {\n nextTable.componentLocations[cardId] = {\n type: \"InHand\",\n handId: zoneId,\n playerId,\n position,\n };\n nextTable.ownerOfCard[cardId] = playerId;\n nextTable.visibility[cardId] = computePlayerZoneVisibility(\n nextTable,\n zoneId,\n playerId,\n );\n }\n }\n\n return nextTable;\n}\n\n/**\n * Internal, id-type-erased signatures for the board writer family.\n *\n * The public `tableMove*` helpers constrain their id args to manifest-derived\n * unions such as `TiledBoardIdOfTable<Table>`, which collapse to `never` for\n * the unconstrained `RuntimeTableRecord`. Inside `createReducerOps<State>`\n * the `State` generic is not yet bound, so at this call site we only know\n * that all ids are plain strings. These aliases narrow that distinction to\n * one place instead of leaking `as never` casts across every op body.\n */\ntype TableMoveComponentToEdgeInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n) => RuntimeTableRecord;\n\ntype TableMoveComponentToVertexInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n) => RuntimeTableRecord;\n\ntype TableDealCardsFromDeckToHandInternal = (\n table: RuntimeTableRecord,\n fromZoneId: string,\n playerId: string,\n toZoneId: string,\n count: number,\n) => RuntimeTableRecord;\n\nconst moveComponentToEdgeInternal =\n tableMoveComponentToEdge as unknown as TableMoveComponentToEdgeInternal;\nconst moveComponentToVertexInternal =\n tableMoveComponentToVertex as unknown as TableMoveComponentToVertexInternal;\nconst dealCardsFromDeckToHandInternal =\n tableDealCardsFromDeckToHand as unknown as TableDealCardsFromDeckToHandInternal;\n\n/**\n * Create the `ops.*` namespace specialised to a game state.\n *\n * Call this once (typically in a shared reducer-support module) and reuse the\n * resulting object across phases:\n *\n * export const ops = createReducerOps<GameState>();\n */\nexport function createReducerOps<\n State extends ReducerStateBase,\n>(): ReducerOps<State> {\n // The implementation operates on the structural `AnyState` shape; the\n // public `ReducerOps<State>` interface adds manifest-aware argument\n // validation and polymorphic state preservation on top. The final\n // `as unknown as ReducerOps<State>` bridges the two: all runtime\n // correctness is still covered by the underlying table-ops writers.\n const applyPatch = <T extends object>(\n prev: T,\n patch: Partial<T> | ((prev: T) => T),\n ): T => {\n if (typeof patch === \"function\") {\n return (patch as (prev: T) => T)(prev);\n }\n return { ...prev, ...patch };\n };\n\n const impl = {\n setActivePlayers(activePlayers: ReadonlyArray<string>) {\n return <S extends AnyState>(state: S): S =>\n stateSetActivePlayers(\n state as unknown as never,\n [...activePlayers] as never,\n ) as unknown as S;\n },\n advanceActivePlayer() {\n return <S extends AnyState>(state: S): S => {\n const table = (state as unknown as { table: RuntimeTableRecord }).table;\n const order = table.playerOrder as ReadonlyArray<string>;\n if (order.length === 0) return state;\n const flow = (\n state as unknown as { flow?: { activePlayers?: readonly string[] } }\n ).flow;\n const current = flow?.activePlayers?.[0];\n const idx = current ? order.indexOf(current) : -1;\n const nextIdx = idx < 0 ? 0 : (idx + 1) % order.length;\n const nextId = order[nextIdx];\n if (nextId === undefined) return state;\n return stateSetActivePlayers(\n state as unknown as never,\n [nextId] as never,\n ) as unknown as S;\n };\n },\n patchPhaseState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev = (state as unknown as { phase?: object }).phase ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return stateSetPhaseState(\n state as unknown as { phase: object },\n next as object,\n ) as unknown as S;\n };\n },\n patchPublicState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { publicState?: object }).publicState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, publicState: next } as S;\n };\n },\n patchHiddenState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { hiddenState?: object }).hiddenState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, hiddenState: next } as S;\n };\n },\n patchPlayerPrivateState(args: { playerId: string; patch: unknown }) {\n return <S extends AnyState>(state: S): S => {\n const privateByPlayer =\n (state as unknown as { privateState?: Record<string, object> })\n .privateState ?? {};\n const prev = (privateByPlayer[args.playerId] ?? {}) as object;\n const next = applyPatch(\n prev,\n args.patch as Partial<object> | ((prev: object) => object),\n );\n return {\n ...state,\n privateState: {\n ...privateByPlayer,\n [args.playerId]: next,\n },\n } as S;\n };\n },\n addCardToSharedZone(args: {\n deckId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddCardToSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n args.playedBy ?? null,\n args.position ?? \"bottom\",\n );\n return updateTable(state, nextTable);\n };\n },\n removeCardFromSharedZone(args: { deckId: string; cardId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableRemoveCardFromSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenSharedZones(args: {\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenSharedZones({\n table: state.table,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableDealCardsBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n count: args.count,\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromPlayerZoneToSharedZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromPlayerZoneToSharedZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromSharedZoneToPlayerZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromSharedZoneToPlayerZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsToPlayerZone(args: {\n fromZoneId: string;\n playerId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = dealCardsFromDeckToHandInternal(\n state.table,\n args.fromZoneId,\n args.playerId,\n args.toZoneId,\n args.count,\n );\n return updateTable(state, nextTable);\n };\n },\n rotatePlayerZone(args: {\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = rotatePlayerZoneTable({\n table: state.table,\n zoneId: args.zoneId,\n direction: args.direction,\n players: args.players,\n cardIdsByPlayer: args.cardIdsByPlayer,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveComponentToSpace(args: {\n componentId: string;\n boardId: string;\n spaceId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToSpace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToContainer(args: {\n componentId: string;\n boardId: string;\n containerId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToContainer(\n state.table,\n args.componentId,\n args.boardId,\n args.containerId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToEdge(args: {\n componentId: string;\n boardId: string;\n edgeId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToEdgeInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToVertex(args: {\n componentId: string;\n boardId: string;\n vertexId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToVertexInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToDetached(args: { componentId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToDetached(\n state.table,\n args.componentId,\n );\n return updateTable(state, nextTable);\n };\n },\n addResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n spendResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSpendPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n transferResources(args: {\n fromPlayerId: string;\n toPlayerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableTransferPlayerResources(\n state.table,\n args.fromPlayerId,\n args.toPlayerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n setResource(args: {\n playerId: string;\n resourceId: string;\n amount: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSetPlayerResource(\n state.table,\n args.playerId,\n args.resourceId,\n args.amount,\n );\n return updateTable(state, nextTable);\n };\n },\n };\n\n return impl as unknown as ReducerOps<State>;\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n CardIdOfTable,\n ComponentDataOfTable,\n ComponentIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HexBoardIdOfTable,\n HexSpaceIdOfTable,\n PlayerIdOfTable,\n RelationTypeIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n TableQueries,\n TableQueriesOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexTypeIdOfTable,\n} from \"./model\";\nimport {\n getAdjacentSpaces,\n getAllPlayerZoneCards,\n getAllSharedZoneCards,\n getBoard,\n getBoardsByTypeId,\n getCard,\n getCardsById,\n getCardOwner,\n getCardVisibility,\n getSlotOccupants,\n getSlotOccupantsByHost,\n getComponentContainerLocation,\n getComponentDeckLocation,\n getComponentEdgeLocation,\n getComponentHandLocation,\n getComponentLocation,\n getComponentSlotLocation,\n getComponentSpaceLocation,\n getComponentVertexLocation,\n getComponentZoneLocation,\n getComponentsInContainer,\n getComponentsOnEdge,\n getComponentsOnSpace,\n getComponentsOnVertex,\n getContainer,\n getEdge,\n getEdgesByTypeId,\n getHexBoard,\n getHexSpace,\n getHexSpaceAt,\n getIncidentEdges,\n getIncidentVertices,\n canAffordResources,\n getMissingResources,\n getNextPlayerInOrder,\n getPlayerOrder,\n getPlayerResourceAmount,\n getPlayerResourceTotal,\n getPlayerResources,\n getPlayerZoneCardCollection,\n getPlayerZoneCards,\n getRelatedSpaces,\n getSharedZoneCardCollection,\n getSharedZoneCards,\n getSpace,\n getSpaceDistance,\n getSpaceEdges,\n getSpacesByTypeId,\n getSpaceVertices,\n getSquareBoard,\n getSquareDistance,\n getSquareNeighbors,\n getSquareSpace,\n getSquareSpaceAt,\n getTiledBoard,\n getVertex,\n getVerticesByTypeId,\n} from \"./table-ops\";\n\nexport function createTableQueries<Table extends RuntimeTableRecord>(\n table: Table,\n): TableQueries<Table> {\n return {\n board: {\n get: <BoardId extends BoardIdOfTable<Table>>(boardId: BoardId) =>\n getBoard(table, boardId),\n hex: <BoardId extends HexBoardIdOfTable<Table>>(boardId: BoardId) =>\n getHexBoard(table, boardId),\n square: <BoardId extends SquareBoardIdOfTable<Table>>(boardId: BoardId) =>\n getSquareBoard(table, boardId),\n tiled: <BoardId extends TiledBoardIdOfTable<Table>>(boardId: BoardId) =>\n getTiledBoard(table, boardId),\n space: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSpace(table, boardId, spaceId),\n hexSpace: <\n BoardId extends HexBoardIdOfTable<Table>,\n SpaceId extends HexSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getHexSpace(table, boardId, spaceId),\n squareSpace: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSquareSpace(table, boardId, spaceId),\n container: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getContainer(table, boardId, containerId),\n edge: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getEdge(table, boardId, edgeId),\n vertex: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getVertex(table, boardId, vertexId),\n byType: <TypeId extends BoardTypeIdOfTable<Table>>(typeId: TypeId) =>\n getBoardsByTypeId(table, typeId),\n spacesByType: <\n BoardId extends BoardIdOfTable<Table>,\n TypeId extends SpaceTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getSpacesByTypeId(table, boardId, typeId),\n edgesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledEdgeTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getEdgesByTypeId(table, boardId, typeId),\n verticesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledVertexTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getVerticesByTypeId(table, boardId, typeId),\n adjacentSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getAdjacentSpaces(table, boardId, spaceId),\n relatedSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n TypeId extends RelationTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n ) => getRelatedSpaces(table, boardId, spaceId, relationTypeId),\n incidentEdges: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getIncidentEdges(table, boardId, vertexId),\n incidentVertices: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getIncidentVertices(table, boardId, edgeId),\n spaceEdges: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceEdges(table, boardId, spaceId),\n spaceVertices: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceVertices(table, boardId, spaceId),\n spaceDistance: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n ) => getSpaceDistance(table, boardId, fromSpaceId, toSpaceId),\n hexSpaceAt: <BoardId extends HexBoardIdOfTable<Table>>(\n boardId: BoardId,\n q: number,\n r: number,\n ) => getHexSpaceAt(table, boardId, q, r),\n squareSpaceAt: <BoardId extends SquareBoardIdOfTable<Table>>(\n boardId: BoardId,\n row: number,\n col: number,\n ) => getSquareSpaceAt(table, boardId, row, col),\n squareNeighbors: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ) => getSquareNeighbors(table, boardId, spaceId, options),\n squareDistance: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ) => getSquareDistance(table, boardId, fromSpaceId, toSpaceId, options),\n spaceOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getComponentsOnSpace(table, boardId, spaceId),\n containerOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getComponentsInContainer(table, boardId, containerId),\n edgeOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getComponentsOnEdge(table, boardId, edgeId),\n vertexOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getComponentsOnVertex(table, boardId, vertexId),\n },\n zone: {\n sharedCards: <ZoneId extends DeckIdOfTable<Table>>(zoneId: ZoneId) =>\n getSharedZoneCards(table, zoneId),\n sharedCardCollection: <ZoneId extends DeckIdOfTable<Table>>(\n zoneId: ZoneId,\n ) => getSharedZoneCardCollection(table, zoneId),\n allSharedCards: () => getAllSharedZoneCards(table),\n playerCards: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCards(table, playerId, zoneId),\n playerCardCollection: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCardCollection(table, playerId, zoneId),\n allPlayerCards: <ZoneId extends HandIdOfTable<Table>>(zoneId: ZoneId) =>\n getAllPlayerZoneCards(table, zoneId),\n },\n card: {\n get: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCard(table, cardId),\n byIds: <CardIds extends readonly CardIdOfTable<Table>[]>(\n cardIds: CardIds,\n ) => getCardsById(table, cardIds),\n owner: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardOwner(table, cardId),\n visibility: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardVisibility(table, cardId),\n },\n slot: {\n occupants: (host, slotId) => getSlotOccupants(table, host, slotId),\n occupantsByHost: (host) => getSlotOccupantsByHost(table, host),\n pieceOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"piece\", id: hostId }, slotId),\n pieceOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"piece\", id: hostId }),\n dieOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"die\", id: hostId }, slotId),\n dieOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"die\", id: hostId }),\n },\n player: {\n order: () => getPlayerOrder(table),\n nextInOrder: (playerId) => getNextPlayerInOrder(table, playerId),\n resources: (playerId) => getPlayerResources(table, playerId),\n resource: (playerId, resourceId) =>\n getPlayerResourceAmount(table, playerId, resourceId),\n resourceTotal: (playerId) => getPlayerResourceTotal(table, playerId),\n canAfford: (playerId, amounts) =>\n canAffordResources(table, playerId, amounts),\n missingResources: (playerId, amounts) =>\n getMissingResources(table, playerId, amounts),\n },\n component: {\n data: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) =>\n (table.cards[componentId] ??\n table.pieces[componentId] ??\n table.dice[componentId]) as\n | ComponentDataOfTable<Table, ComponentId>\n | undefined,\n location: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentLocation(table, componentId),\n deck: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentDeckLocation(table, componentId),\n hand: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentHandLocation(table, componentId),\n zone: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentZoneLocation(table, componentId),\n space: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSpaceLocation(table, componentId),\n container: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentContainerLocation(table, componentId),\n edge: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentEdgeLocation(table, componentId),\n vertex: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentVertexLocation(table, componentId),\n slot: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSlotLocation(table, componentId),\n },\n };\n}\n\nexport function createStateQueries<State extends { table: RuntimeTableRecord }>(\n state: State,\n): TableQueriesOfState<State> {\n return createTableQueries(\n state.table,\n ) as unknown as TableQueriesOfState<State>;\n}\n","import type { Op } from \"./compose\";\nimport type {\n BoardIdOfTable,\n CardIdOfTable,\n ComponentIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n TableOfState,\n TableQueriesOfState,\n} from \"./model\";\nimport { createReducerOps, type ReducerOps } from \"./ops\";\nimport { createStateQueries } from \"./table-queries\";\n\nexport type RotatePlayerZoneArgs<\n State extends { table: RuntimeTableRecord },\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>> = PlayerZoneIdOfTable<\n TableOfState<State>\n >,\n PlayerId extends PlayerIdOfTable<TableOfState<State>> = PlayerIdOfTable<\n TableOfState<State>\n >,\n> = {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<TableOfState<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n};\n\ntype TransactionMethods<State extends { table: RuntimeTableRecord }> = {\n [Key in Exclude<\n keyof ReducerOps<State>,\n \"moveComponentToSpace\"\n >]: ReducerOps<State>[Key] extends (...args: infer Args) => Op<State>\n ? (...args: Args) => State\n : never;\n} & {\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<TableOfState<State>>,\n SpaceId extends SpaceIdOfTable<TableOfState<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): State;\n};\n\nexport type ReducerTransaction<State extends { table: RuntimeTableRecord }> =\n TransactionMethods<State> & {\n readonly state: State;\n readonly q: TableQueriesOfState<State>;\n apply(op: Op<State>): State;\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(\n args: RotatePlayerZoneArgs<State, ZoneId, PlayerId>,\n ): State;\n };\n\nexport type ReducerEdit<State extends { table: RuntimeTableRecord }> = <\n DraftState extends State,\n>(\n state: DraftState,\n) => ReducerTransaction<DraftState>;\n\nexport function createReducerTransaction<\n State extends { table: RuntimeTableRecord },\n>(initialState: State, ops: ReducerOps<State> = createReducerOps<State>()) {\n let currentState = initialState;\n let currentQueries = createStateQueries(currentState);\n\n const refresh = (nextState: State): State => {\n currentState = nextState;\n currentQueries = createStateQueries(currentState);\n return currentState;\n };\n\n const apply = (op: Op<State>): State => refresh(op(currentState));\n\n const base = {\n get state() {\n return currentState;\n },\n get q() {\n return currentQueries;\n },\n apply,\n };\n\n return new Proxy(base, {\n get(target, property, receiver) {\n if (property in target) {\n return Reflect.get(target, property, receiver);\n }\n const opFactory = ops[property as keyof ReducerOps<State>];\n if (typeof opFactory !== \"function\") {\n return undefined;\n }\n return (...args: readonly unknown[]) => {\n const op = (opFactory as (...args: readonly unknown[]) => Op<State>)(\n ...args,\n );\n return apply(op);\n };\n },\n }) as ReducerTransaction<State>;\n}\n\nexport function createReducerEdit<State extends { table: RuntimeTableRecord }>(\n ops: ReducerOps<State> = createReducerOps<State>(),\n): ReducerEdit<State> {\n return <DraftState extends State>(state: DraftState) =>\n createReducerTransaction(state, ops as unknown as ReducerOps<DraftState>);\n}\n","import { cardInput } from \"./inputs/cardInput\";\nimport { cardTarget } from \"./inputs/cardTarget\";\nimport type {\n AnyCardActionSpec,\n AnyContinuationCallable,\n AnyInteractionSpec,\n BaseGameStateOfContract,\n EffectMap,\n InputCollector,\n InteractionMap,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n StageMap,\n StageSpec,\n ViewMapOf,\n PhaseZoneList,\n PlayerZoneIdOfManifest,\n} from \"./model\";\n\nexport type ReducerIndexedPhase<Contract extends ReducerGameContractLike> =\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Record<string, InputCollector>,\n EffectMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n InteractionMap<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n StageMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n PhaseZoneList<ManifestContractOf<Contract>>\n >;\n\nexport type ReducerIndexedInteractionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyInteractionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport type ReducerIndexedStageEntry<Contract extends ReducerGameContractLike> =\n readonly [\n string,\n StageSpec<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n ];\n\nexport type ReducerIndexedZoneEntry<Contract extends ReducerGameContractLike> =\n PlayerZoneIdOfManifest<ManifestContractOf<Contract>>;\n\nexport type ReducerIndexedCardActionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyCardActionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport type ReducerIndexedEffectEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n {\n readonly id: string;\n readonly type: string;\n readonly continuation?: AnyContinuationCallable<\n BaseGameStateOfContract<Contract>\n > & {\n readonly id?: string;\n };\n },\n];\n\nexport interface ReducerDefinitionPhaseIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseName: PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n readonly phase: ReducerIndexedPhase<Contract>;\n readonly interactions: ReadonlyArray<\n ReducerIndexedInteractionEntry<Contract>\n >;\n readonly stages: ReadonlyArray<ReducerIndexedStageEntry<Contract>>;\n readonly zones: ReadonlyArray<ReducerIndexedZoneEntry<Contract>>;\n readonly cardActions: ReadonlyArray<ReducerIndexedCardActionEntry<Contract>>;\n readonly effects: ReadonlyArray<ReducerIndexedEffectEntry<Contract>>;\n}\n\nexport interface ReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n ReducerIndexedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>\n >;\n}\n\ntype RawEffectEntry<Contract extends ReducerGameContractLike> = readonly [\n string,\n {\n id?: string;\n type?: string;\n __continuation?: AnyContinuationCallable<\n BaseGameStateOfContract<Contract>\n > & {\n id?: string;\n };\n },\n];\n\nfunction phaseEntriesOf<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): Array<\n readonly [\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n ReducerIndexedPhase<Contract>,\n ]\n> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n return Object.entries(definition.phases) as unknown as Array<\n readonly [PhaseName, ReducerIndexedPhase<Contract>]\n >;\n}\n\nfunction interactionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n return Object.entries(\n (phase as { interactions?: Record<string, unknown> }).interactions ?? {},\n ) as Array<ReducerIndexedInteractionEntry<Contract>>;\n}\n\nfunction simultaneousSubmitEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n const submit = (phase as { submit?: unknown }).submit;\n if (!submit) return [];\n return [\n [\"submit\", submit] as unknown as ReducerIndexedInteractionEntry<Contract>,\n ];\n}\n\nfunction cardActionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedCardActionEntry<Contract>> {\n return Object.entries(\n (phase as { cardActions?: Record<string, unknown> }).cardActions ?? {},\n ) as Array<ReducerIndexedCardActionEntry<Contract>>;\n}\n\nfunction stageEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedStageEntry<Contract>> {\n return Object.entries(\n (phase as { stages?: Record<string, unknown> }).stages ?? {},\n ) as Array<ReducerIndexedStageEntry<Contract>>;\n}\n\nfunction zoneEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedZoneEntry<Contract>> {\n return Array.from(\n (phase as { zones?: readonly unknown[] }).zones ?? [],\n ) as Array<ReducerIndexedZoneEntry<Contract>>;\n}\n\nfunction effectEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<RawEffectEntry<Contract>> {\n return Object.entries(\n (phase as { effects?: Record<string, unknown> }).effects ?? {},\n ) as Array<RawEffectEntry<Contract>>;\n}\n\nexport function collectReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ReducerDefinitionIndex<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const phaseEntries = phaseEntriesOf(definition);\n const phasesByName = new Map<\n PhaseName,\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>\n >();\n\n for (const [phaseName, phase] of phaseEntries) {\n const interactionEntries = [\n ...interactionEntriesOf(phase),\n ...simultaneousSubmitEntriesOf(phase),\n ];\n const cardActionEntries: Array<ReducerIndexedInteractionEntry<Contract>> =\n cardActionEntriesOf(phase).map(([cardActionId, cardAction]) => [\n cardActionId,\n {\n ...cardAction,\n __steps: cardAction.__steps,\n inputs: {\n cardId: cardInput<State>({\n target: cardTarget\n .zones<State>([cardAction.playFrom])\n .where({\n id: \"card-type\",\n errorCode: \"WRONG_CARD_TYPE\",\n message: `Card must be ${cardAction.cardType}.`,\n test: ({ q, targetId }) =>\n q.card.get(targetId).cardType === cardAction.cardType,\n })\n .build(),\n }),\n ...(cardAction.inputs ?? {}),\n },\n } satisfies AnyInteractionSpec<State, Manifest>,\n ]);\n const effects: Array<ReducerIndexedEffectEntry<Contract>> = effectEntriesOf(\n phase,\n ).map(([effectKey, effectValue]) => [\n effectKey,\n {\n id: effectValue.id ?? effectKey,\n type: effectValue.type ?? \"rollDie\",\n continuation: effectValue.__continuation,\n },\n ]);\n\n phasesByName.set(phaseName, {\n phaseName,\n phase,\n interactions: [...interactionEntries, ...cardActionEntries],\n stages: stageEntriesOf(phase),\n zones: zoneEntriesOf(phase),\n cardActions: cardActionEntriesOf(phase),\n effects,\n });\n }\n\n return {\n phaseEntries,\n phasesByName,\n };\n}\n","import type {\n AnyContinuationCallable,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectReducerDefinitionIndex,\n type ReducerDefinitionPhaseIndex,\n type ReducerIndexedCardActionEntry,\n type ReducerIndexedInteractionEntry,\n type ReducerIndexedPhase,\n type ReducerIndexedStageEntry,\n type ReducerIndexedZoneEntry,\n} from \"../../definition-index\";\n\nexport type TrustedErasedPhase<Contract extends ReducerGameContractLike> =\n ReducerIndexedPhase<Contract>;\n\nexport type TrustedInteractionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedInteractionEntry<Contract>;\n\nexport type TrustedCardActionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedCardActionEntry<Contract>;\n\nexport type TrustedStageEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedStageEntry<Contract>;\n\nexport type TrustedZoneEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedZoneEntry<Contract>;\n\nexport type TrustedContinuationRegistry<\n Contract extends ReducerGameContractLike,\n> = ReadonlyMap<\n string,\n AnyContinuationCallable<BaseGameStateOfContract<Contract>>\n>;\n\nexport interface TrustedPhaseRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> extends Omit<\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>,\n \"effects\"\n> {}\n\nexport interface TrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n TrustedErasedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >;\n readonly continuationsById: TrustedContinuationRegistry<Contract>;\n readonly effectsById: ReadonlyMap<\n string,\n { readonly id: string; readonly type: string }\n >;\n}\n\nexport function collectTrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): TrustedRuntimeRegistry<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const index = collectReducerDefinitionIndex(definition);\n const phasesByName = new Map<\n PhaseName,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >();\n const continuationsById = new Map<string, AnyContinuationCallable<State>>();\n const effectsById = new Map<\n string,\n { readonly id: string; readonly type: string }\n >();\n\n for (const phaseIndex of index.phasesByName.values()) {\n const { effects: _effects, ...trustedPhase } = phaseIndex;\n phasesByName.set(phaseIndex.phaseName, trustedPhase);\n for (const [, effect] of phaseIndex.effects) {\n effectsById.set(effect.id, { id: effect.id, type: effect.type });\n if (effect.continuation) {\n const continuationId = effect.continuation.id ?? effect.id;\n continuationsById.set(\n continuationId,\n effect.continuation as AnyContinuationCallable<State>,\n );\n }\n }\n }\n\n return {\n phaseEntries: index.phaseEntries,\n phasesByName,\n continuationsById,\n effectsById,\n };\n}\n","import type { RuntimeTableRecord } from \"./model/table\";\nimport type { TableQueriesOfState } from \"./model/queries\";\nimport type { BaseGameStateOfContract } from \"./model/definition\";\nimport { createStateQueries } from \"./table-queries\";\n\n/**\n * A freestanding, memoized projection of immutable game state.\n *\n * Use `defineDerived` for values that are pure functions of component\n * locations, zone contents, resources, or other state fields - and are\n * consumed from multiple reducer or view call sites, or whose compute cost\n * is non-trivial (graph walks, aggregate reductions).\n *\n * Do NOT cache derived values in `publicState`. State fields should be\n * inputs to derivations, not mirrors of them.\n */\nexport type DerivedDefinition<Contract, Value> = {\n /** Optional label for debugging. Does not affect caching. */\n readonly name?: string;\n readonly compute: (ctx: {\n readonly state: BaseGameStateOfContract<Contract>;\n readonly q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n readonly derived: DerivedResolver;\n }) => Value;\n};\n\n/**\n * Resolves a `DerivedDefinition` to its value. Callers do not need to know\n * about memoization - the resolver handles caching internally.\n */\nexport type DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n) => Value;\n\ntype AnyDerivedDefinition = DerivedDefinition<unknown, unknown>;\n\n/**\n * Author-facing factory for creating a derived value tied to a game\n * contract. Usage:\n *\n * ```ts\n * export const longestRoad = defineDerived<GameContract>()({\n * name: \"longestRoad\",\n * compute: ({ q, derived }) => computeLongestRoad(q),\n * });\n * ```\n */\nexport function defineDerived<Contract>() {\n return <Value>(def: {\n name?: string;\n compute: (ctx: {\n state: BaseGameStateOfContract<Contract>;\n q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived: DerivedResolver;\n }) => Value;\n }): DerivedDefinition<Contract, Value> => def;\n}\n\n/**\n * Creates a resolver scoped to a single state snapshot. Each engine tick\n * and each view projection call creates its own resolver; cache lifetime\n * ends with the call. Cache key is the `DerivedDefinition` identity (the\n * object reference).\n *\n * Re-entry on an in-flight definition throws a readable error.\n */\nexport function createDerivedResolver<\n State extends { table: RuntimeTableRecord },\n>(\n state: State,\n options: { q?: TableQueriesOfState<State> } = {},\n): DerivedResolver {\n const cache = new Map<AnyDerivedDefinition, unknown>();\n const inflight = new Set<AnyDerivedDefinition>();\n const q = options.q ?? createStateQueries(state);\n\n const resolver: DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n ): Value => {\n const typedDef = def as unknown as AnyDerivedDefinition;\n if (cache.has(typedDef)) {\n return cache.get(typedDef) as Value;\n }\n if (inflight.has(typedDef)) {\n throw new Error(\n `Cyclic derived: '${def.name ?? \"<anonymous>\"}' depends on itself.`,\n );\n }\n inflight.add(typedDef);\n try {\n const value = (\n def.compute as unknown as (ctx: {\n state: unknown;\n q: unknown;\n derived: DerivedResolver;\n }) => Value\n )({ state, q, derived: resolver });\n cache.set(typedDef, value);\n return value;\n } finally {\n inflight.delete(typedDef);\n }\n };\n\n return resolver;\n}\n","import type {\n AnyContinuationToken,\n EffectSpecLike,\n ReducerFx,\n RuntimeTableRecord,\n} from \"./model\";\n\ntype FxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\ntype InternalEffectDefinition = EffectSpecLike;\n\nfunction buildResume(\n effect: InternalEffectDefinition,\n context: unknown,\n): AnyContinuationToken | undefined {\n if (!effect.__continuation) {\n return undefined;\n }\n return (effect.__continuation as unknown as (data: unknown) => unknown)(\n context ?? {},\n ) as AnyContinuationToken;\n}\n\nfunction invokeEffect(\n effect: InternalEffectDefinition,\n options: Record<string, unknown>,\n) {\n const continuation = buildResume(effect, options.context);\n if (effect.type === \"rollDie\") {\n return continuation === undefined\n ? {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n }\n : {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n continuation,\n };\n }\n if (effect.type === \"shuffleSharedZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n }\n : {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n continuation,\n };\n }\n if (effect.type === \"shufflePlayerZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n }\n : {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n continuation,\n };\n }\n throw new Error(\n `fx.effect: unsupported effect type '${(effect as InternalEffectDefinition).type}'.`,\n );\n}\n\nexport function createReducerFx<State extends FxState>(\n _state: State,\n): ReducerFx<State> {\n const fx: ReducerFx<State> = {\n transition(to) {\n return { kind: \"flow.transition\", to } as ReturnType<\n ReducerFx<State>[\"transition\"]\n >;\n },\n effect(effect, options) {\n return invokeEffect(\n effect as unknown as InternalEffectDefinition,\n options as Record<string, unknown>,\n ) as ReturnType<ReducerFx<State>[\"effect\"]>;\n },\n } as ReducerFx<State>;\n return fx;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n ActionContext,\n BaseGameStateOfContract,\n ManifestContractOf,\n PlayerIdOfState,\n RandomHelpers,\n ReducerGameContractLike,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { TrustedRuntimeHelpers, TrustedState } from \"./runtime-scope\";\n\nexport function fxForState<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n) {\n return createReducerFx<TrustedState<Contract>>(state);\n}\n\nexport function buildContext<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n): ActionContext<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n> {\n type DomainState = BaseGameStateOfContract<Contract>;\n type PlayerId = PlayerIdOfState<DomainState>;\n type Manifest = ManifestContractOf<Contract>;\n return {\n currentPhase: state.flow.currentPhase as ActionContext<\n DomainState,\n Manifest\n >[\"currentPhase\"],\n manifest,\n playerOrder: [...state.table.playerOrder] as PlayerId[],\n activePlayers: [...state.flow.activePlayers] as PlayerId[],\n runtime: publicRuntime(state.runtime),\n setup: (state.runtime.setup\n ? {\n profileId: state.runtime.setup.profileId,\n optionValues: {\n ...state.runtime.setup.optionValues,\n },\n }\n : null) as ActionContext<DomainState, Manifest>[\"setup\"],\n };\n}\n\nfunction publicRuntime<Runtime extends { rng?: unknown }>(\n runtime: Runtime,\n): Omit<Runtime, \"rng\"> {\n const { rng: _rng, ...rest } = runtime;\n return rest;\n}\n\nconst DISABLED_RANDOM_HELPERS: RandomHelpers = {\n subset() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n};\n\nexport function buildRuntimeArgs<\n Contract extends ReducerGameContractLike,\n Extra extends object,\n>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n helpers: TrustedRuntimeHelpers<Contract>,\n toDomainState: (\n state: TrustedState<Contract>,\n ) => BaseGameStateOfContract<Contract>,\n extra: Extra,\n options: {\n q?: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n } = {},\n) {\n const domainState = toDomainState(state);\n const q = options.q ?? createStateQueries(domainState);\n return {\n ...buildContext(state, manifest),\n ...helpers,\n fx: options.fx ?? fxForState(state),\n q,\n derived: options.derived ?? createDerivedResolver(domainState, { q }),\n runtime: publicRuntime(state.runtime),\n random: options.random ?? DISABLED_RANDOM_HELPERS,\n ...extra,\n };\n}\n","import type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { ReducerReject, ReducerResult } from \"../../model\";\n\nexport function acceptResult<State>(\n state: State,\n instructions: Array<RuntimeInstructionForState<State>> = [],\n) {\n return {\n type: \"accept\" as const,\n state,\n instructions,\n };\n}\n\nexport function rejectResult(\n errorCode: string,\n message?: string,\n): ReducerReject {\n return {\n type: \"reject\",\n errorCode,\n message,\n };\n}\n\nexport function normalizeResult<State>(\n result: ReducerResult<State> | void,\n fallbackState: State,\n): ReducerResult<State> {\n if (result === undefined || result === null) {\n return acceptResult(fallbackState);\n }\n return result;\n}\n\nexport const runtimeResultHelpers = {\n accept: acceptResult,\n reject: rejectResult,\n};\n","export function toDomainState<State extends { runtime: unknown }, DomainState>(\n state: State,\n): DomainState {\n const { runtime: _runtime, ...domain } = state;\n attachPhaseAccessor(domain);\n return domain as DomainState;\n}\n\nexport function toCombinedState<\n SessionState extends { domain: unknown; runtime: unknown },\n State,\n>(session: SessionState): State {\n const combined = {\n ...(session.domain as object),\n runtime: session.runtime,\n };\n attachPhaseAccessor(combined);\n return combined as State;\n}\n\nexport function toSessionState<\n State extends { runtime: unknown },\n DomainState,\n SessionState,\n>(state: State, toDomain: (state: State) => DomainState): SessionState {\n return {\n domain: toDomain(state),\n runtime: state.runtime,\n } as SessionState;\n}\n\nfunction attachPhaseAccessor(state: unknown): void {\n if (!state || typeof state !== \"object\") return;\n const candidate = state as {\n flow?: { currentPhase?: unknown };\n phase?: unknown;\n };\n const phase = candidate.phase;\n if (!phase || typeof phase !== \"object\") return;\n const descriptor = Object.getOwnPropertyDescriptor(phase, \"get\");\n if (descriptor && typeof descriptor.value === \"function\") return;\n Object.defineProperty(phase, \"get\", {\n enumerable: false,\n configurable: true,\n value: (phaseName: string) =>\n candidate.flow?.currentPhase === phaseName ? phase : null,\n });\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\n\nexport function resolveTrustedSetupProfiles<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(definition: ReducerGameDefinition<Contract, Definitions, Views>) {\n const manifestSetupProfilesById =\n definition.contract.manifest.setupProfilesById;\n const manifestSetupProfileIds = Object.keys(manifestSetupProfilesById).sort();\n const reducerSetupProfiles = definition.setupProfiles ?? {};\n const reducerSetupProfileIds = Object.keys(reducerSetupProfiles).sort();\n if (\n manifestSetupProfileIds.length !== reducerSetupProfileIds.length ||\n manifestSetupProfileIds.some(\n (profileId, index) => reducerSetupProfileIds[index] !== profileId,\n )\n ) {\n throw new Error(\n `Reducer setupProfiles must exactly match manifest setupProfiles. Manifest=[${manifestSetupProfileIds.join(\", \")}], reducer=[${reducerSetupProfileIds.join(\", \")}].`,\n );\n }\n return {\n manifestSetupProfilesById,\n reducerSetupProfiles,\n };\n}\n\nexport function resolveDefaultInitialPhase<PhaseName extends string>(\n explicitInitialPhase: PhaseName | undefined,\n phaseEntries: ReadonlyArray<readonly [PhaseName, unknown]>,\n): PhaseName {\n const defaultInitialPhase = explicitInitialPhase ?? phaseEntries[0]?.[0];\n if (!defaultInitialPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n return defaultInitialPhase;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createReducerOps } from \"../../ops\";\nimport { createReducerEdit } from \"../../transaction\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n ActionContext,\n AnyContinuationCallable,\n AnyInteractionSpec,\n BaseGameSessionOfContract,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n PlayerIdOfState,\n PlayerZoneIdOfManifest,\n RandomHelpers,\n ReducerGameContractLike,\n ReducerGameDefinition,\n StageSpec,\n TableQueriesOfState,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectTrustedRuntimeRegistry,\n type TrustedErasedPhase,\n type TrustedCardActionEntry,\n type TrustedInteractionEntry,\n type TrustedPhaseRegistry,\n type TrustedRuntimeRegistry,\n} from \"./runtime-registry\";\nimport {\n buildContext as buildTrustedContext,\n buildRuntimeArgs as buildTrustedRuntimeArgs,\n fxForState as trustedFxForState,\n} from \"./trusted-runtime-args\";\nimport {\n normalizeResult,\n rejectResult,\n runtimeResultHelpers,\n} from \"./trusted-runtime-result\";\nimport {\n toCombinedState as codecToCombinedState,\n toDomainState as codecToDomainState,\n toSessionState as codecToSessionState,\n} from \"./trusted-state-codec\";\nimport {\n resolveDefaultInitialPhase,\n resolveTrustedSetupProfiles,\n} from \"./trusted-setup-profiles\";\n\nexport { normalizeResult, rejectResult } from \"./trusted-runtime-result\";\n\nexport type TrustedDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReducerGameDefinition<Contract, Definitions, Views>;\n\nexport type TrustedDomainState<Contract extends ReducerGameContractLike> =\n BaseGameStateOfContract<Contract>;\n\nexport type TrustedSessionState<Contract extends ReducerGameContractLike> =\n BaseGameSessionOfContract<Contract>;\n\nexport type TrustedState<Contract extends ReducerGameContractLike> =\n TrustedDomainState<Contract> & {\n runtime: TrustedSessionState<Contract>[\"runtime\"];\n };\n\nexport type TrustedManifest<Contract extends ReducerGameContractLike> =\n ManifestContractOf<Contract>;\n\nexport type TrustedPhaseName<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = PhaseNamesOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type TrustedPlayerId<Contract extends ReducerGameContractLike> =\n PlayerIdOfState<TrustedDomainState<Contract>>;\n\nexport type TrustedInput<Contract extends ReducerGameContractLike> =\n TrustedRuntimeInput<TrustedPlayerId<Contract>>;\n\nexport type { TrustedErasedPhase } from \"./runtime-registry\";\n\nexport interface TrustedRuntimeHelpers<\n Contract extends ReducerGameContractLike,\n> {\n accept: (\n state: TrustedDomainState<Contract>,\n instructions?: Array<\n RuntimeInstructionForState<TrustedDomainState<Contract>>\n >,\n ) => {\n type: \"accept\";\n state: TrustedDomainState<Contract>;\n instructions: Array<\n RuntimeInstructionForState<TrustedDomainState<Contract>>\n >;\n };\n reject: typeof rejectResult;\n ops: ReturnType<typeof createReducerOps<TrustedDomainState<Contract>>>;\n edit: ReturnType<typeof createReducerEdit<TrustedDomainState<Contract>>>;\n}\n\nexport interface TrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n definition: TrustedDefinition<Contract, Definitions, Views>;\n registry: TrustedRuntimeRegistry<Contract, Definitions, Views>;\n phaseEntries: ReadonlyArray<\n readonly [\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedErasedPhase<Contract>,\n ]\n >;\n defaultInitialPhase: TrustedPhaseName<Contract, Definitions, Views>;\n manifestSetupProfilesById: TrustedManifest<Contract>[\"setupProfilesById\"];\n reducerSetupProfiles: NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >;\n runtimeHelpers: TrustedRuntimeHelpers<Contract>;\n toDomainState(state: TrustedState<Contract>): TrustedDomainState<Contract>;\n toCombinedState(\n session: TrustedSessionState<Contract>,\n ): TrustedState<Contract>;\n toSessionState(state: TrustedState<Contract>): TrustedSessionState<Contract>;\n phaseRegistryByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined;\n phaseByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedErasedPhase<Contract>;\n findInteractionInPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n interactionId: string,\n ):\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n interactionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedInteractionEntry<Contract>>;\n stagesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<\n readonly [\n string,\n StageSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>,\n ]\n >;\n zonesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<PlayerZoneIdOfManifest<TrustedManifest<Contract>>>;\n cardActionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedCardActionEntry<Contract>>;\n continuationById(\n id: string,\n ): AnyContinuationCallable<TrustedDomainState<Contract>> | undefined;\n fxForState(\n state: TrustedState<Contract>,\n ): ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n buildContext(\n state: TrustedState<Contract>,\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>>;\n buildRuntimeArgs<Extra extends object>(\n state: TrustedState<Contract>,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<TrustedDomainState<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n },\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>> &\n TrustedRuntimeHelpers<Contract> & {\n fx: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n q: ReturnType<typeof createStateQueries<TrustedDomainState<Contract>>>;\n derived: ReturnType<\n typeof createDerivedResolver<TrustedDomainState<Contract>>\n >;\n runtime: Omit<TrustedState<Contract>[\"runtime\"], \"rng\">;\n random: RandomHelpers;\n } & Extra;\n}\n\nexport function createTrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: TrustedDefinition<Contract, Definitions, Views>,\n): TrustedRuntimeScope<Contract, Definitions, Views> {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n const registry = collectTrustedRuntimeRegistry(definition);\n const { phaseEntries } = registry;\n const defaultInitialPhase = resolveDefaultInitialPhase(\n definition.initialPhase as PhaseName | undefined,\n phaseEntries,\n );\n const { manifestSetupProfilesById, reducerSetupProfiles } =\n resolveTrustedSetupProfiles(definition);\n\n function toDomainState(state: State): DomainState {\n return codecToDomainState<State, DomainState>(state);\n }\n\n function toCombinedState(session: SessionState): State {\n return codecToCombinedState<SessionState, State>(session);\n }\n\n function toSessionState(state: State): SessionState {\n return codecToSessionState<State, DomainState, SessionState>(\n state,\n toDomainState,\n );\n }\n\n function phaseRegistryByName(\n phaseName: PhaseName,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined {\n return registry.phasesByName.get(phaseName);\n }\n\n function phaseByName(phaseName: PhaseName): TrustedErasedPhase<Contract> {\n const phaseRegistry = phaseRegistryByName(phaseName);\n if (!phaseRegistry) {\n throw new Error(`Unknown reducer phase '${phaseName}'.`);\n }\n return phaseRegistry.phase;\n }\n\n function findInteractionInPhase(\n phaseName: PhaseName,\n interactionId: string,\n ): AnyInteractionSpec<DomainState, Manifest> | undefined {\n const found = interactionEntriesForPhase(phaseName).find(\n ([id]) => id === interactionId,\n );\n return found?.[1];\n }\n\n function interactionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.interactions ?? [];\n }\n\n function stagesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.stages ?? [];\n }\n\n function zonesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.zones ?? [];\n }\n\n function cardActionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.cardActions ?? [];\n }\n\n function continuationById(id: string) {\n return registry.continuationsById.get(id);\n }\n\n const helpers: TrustedRuntimeHelpers<Contract> = {\n ...runtimeResultHelpers,\n ops: createReducerOps<DomainState>(),\n edit: createReducerEdit<DomainState>(),\n };\n\n function fxForState(state: State) {\n return trustedFxForState<Contract>(state);\n }\n\n function buildContext(state: State): ActionContext<DomainState, Manifest> {\n return buildTrustedContext<Contract>(state, definition.contract.manifest);\n }\n\n function buildRuntimeArgs<Extra extends object>(\n state: State,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<DomainState>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<State>>;\n random?: RandomHelpers;\n },\n ) {\n return buildTrustedRuntimeArgs<Contract, Extra>(\n state,\n definition.contract.manifest,\n helpers,\n toDomainState,\n extra,\n options,\n );\n }\n\n return {\n definition,\n registry,\n phaseEntries,\n defaultInitialPhase,\n manifestSetupProfilesById,\n reducerSetupProfiles: reducerSetupProfiles as NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >,\n runtimeHelpers: helpers,\n toDomainState,\n toCombinedState,\n toSessionState,\n phaseRegistryByName,\n phaseByName,\n findInteractionInPhase,\n interactionEntriesForPhase,\n stagesForPhase,\n zonesForPhase,\n cardActionEntriesForPhase,\n continuationById,\n fxForState,\n buildContext,\n buildRuntimeArgs,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { RuntimePayload } from \"../../model\";\nimport { createRuntimeInstructionEngine } from \"../../engine/runtime-instruction-engine\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerResult,\n RuntimeRngState,\n ViewMapOf,\n} from \"../../model\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport { createEngineInstructionResolver } from \"./engine-instruction-resolver\";\nimport { createFlowInstructionResolver } from \"./flow-instruction-resolver\";\nimport {\n createMutableRandomHelpers,\n sampleRngCollectorValue,\n} from \"./rng-sampler\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n simultaneousSubmitInteraction,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport {\n normalizeResult,\n rejectResult,\n type TrustedDomainState,\n type TrustedInput,\n type TrustedManifest,\n type TrustedPhaseName,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createTrustedInstructionRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const flowInstructions = createFlowInstructionResolver(lifecycle);\n const engineInstructions = createEngineInstructionResolver<\n Contract,\n Definitions,\n Views\n >();\n\n type RuntimeRngResult = { runtimeRng?: RuntimeRngState };\n\n function reduceInternal(\n state: State,\n input: ReducerInput,\n ): ReducerResult<DomainState> & RuntimeRngResult {\n const ctx = scope.buildContext(state);\n\n if (input.kind === \"interaction\") {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) {\n return rejectResult(\n \"unsupported-action\",\n `Interaction '${input.interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n );\n }\n const parsed = interactions.parseInteractionParams(\n interaction,\n input.params,\n { playerId: input.playerId },\n );\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n interaction.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n playerId: input.playerId,\n params: parsed.params,\n },\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n if (input.kind === \"continuation\") {\n const continuation = scope.continuationById(input.continuationId);\n if (!continuation) {\n return rejectResult(\n \"missing-continuation\",\n `Continuation '${input.continuationId}' was not registered.`,\n );\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n continuation.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n source: \"effect\" as const,\n effectKind: input.effectKind,\n data: input.resumeData,\n response: input.response,\n },\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n return scope.runtimeHelpers.accept(scope.toDomainState(state));\n }\n\n function preSampleRngForAction(\n state: State,\n input: ReducerInput,\n ): { state: State; input: ReducerInput } {\n if (input.kind !== \"interaction\") return { state, input };\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) return { state, input };\n const collectors = interaction.inputs as Record<string, InputCollector>;\n let nextRng = state.runtime.rng;\n const sampled: Record<string, unknown> = {};\n let anySampled = false;\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind !== \"rng\") continue;\n const { value, nextRng: advanced } = sampleRngCollectorValue(\n collector,\n nextRng,\n );\n sampled[key] = value;\n nextRng = advanced;\n anySampled = true;\n }\n if (!anySampled) return { state, input };\n const mergedParams: Record<string, unknown> = {\n ...((input.params ?? {}) as Record<string, unknown>),\n ...sampled,\n };\n return {\n state: {\n ...state,\n runtime: { ...state.runtime, rng: nextRng },\n } as State,\n input: { ...input, params: mergedParams } as ReducerInput,\n };\n }\n\n function clearSimultaneousCurrent(state: State): State {\n return {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: { current: null },\n },\n } as State;\n }\n\n function reduceSimultaneousSubmit(\n state: State,\n input: ReducerInput,\n ): ReducerResult<State> | null {\n if (\n input.kind !== \"interaction\" ||\n input.interactionId !== SIMULTANEOUS_SUBMIT_INTERACTION_ID\n ) {\n return null;\n }\n\n const phaseName = state.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) {\n return null;\n }\n\n const submit = simultaneousSubmitInteraction(scope.phaseByName(phaseName));\n if (!submit) {\n return rejectResult(\n \"missing-submit-interaction\",\n `Simultaneous phase '${phaseName}' does not declare submit.`,\n );\n }\n const resolve = (phase as { resolve?: unknown }).resolve;\n if (typeof resolve !== \"function\") {\n return rejectResult(\n \"missing-simultaneous-resolve\",\n `Simultaneous phase '${phaseName}' does not declare resolve.`,\n );\n }\n\n const actors = resolveSimultaneousActors(scope, state, phase);\n if (!actors.includes(input.playerId as PlayerId)) {\n return rejectResult(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${input.interactionId}').`,\n );\n }\n\n const parsed = interactions.parseInteractionParams(submit, input.params);\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n\n const current =\n state.runtime.simultaneous?.current?.phaseName === phaseName\n ? state.runtime.simultaneous.current\n : {\n phaseName,\n actors,\n submissions: {},\n };\n const existing = current.submissions[input.playerId as PlayerId];\n const canResubmit =\n (phase as { canResubmit?: boolean }).canResubmit === true;\n if (existing && !canResubmit) {\n return rejectResult(\n \"ALREADY_SUBMITTED\",\n `Interaction '${input.interactionId}' has already been submitted by '${input.playerId}'.`,\n );\n }\n\n const submissions: Record<\n string,\n { interactionId: string; params: RuntimePayload }\n > = {\n ...current.submissions,\n [input.playerId]: {\n interactionId: input.interactionId,\n params: parsed.params as RuntimePayload,\n },\n };\n const stateWithSubmission = {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: {\n current: {\n phaseName,\n actors,\n submissions,\n },\n },\n },\n } as State;\n const waitingPlayerIds = actors.filter((actor) => !submissions[actor]);\n if (waitingPlayerIds.length > 0) {\n return {\n type: \"accept\",\n state: stateWithSubmission,\n instructions: [],\n };\n }\n\n const resolvedSubmissions = Object.fromEntries(\n actors.map((actor) => [\n actor,\n {\n playerId: actor,\n params: submissions[actor]?.params ?? {},\n },\n ]),\n );\n const random = createMutableRandomHelpers(stateWithSubmission.runtime.rng);\n const resolved = normalizeResult(\n resolve(\n scope.buildRuntimeArgs(\n stateWithSubmission,\n {\n state: scope.toDomainState(stateWithSubmission),\n submissions: resolvedSubmissions,\n submittedPlayerIds: [...actors],\n waitingPlayerIds: [],\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(stateWithSubmission),\n );\n if (resolved.type === \"reject\") {\n return resolved;\n }\n return {\n type: \"accept\",\n state: clearSimultaneousCurrent({\n ...resolved.state,\n runtime: { ...stateWithSubmission.runtime, rng: random.currentRng() },\n } as State),\n instructions: resolved.instructions ?? [],\n };\n }\n\n function reduceOnce(state: State, input: ReducerInput): ReducerResult<State> {\n const sampled = preSampleRngForAction(state, input);\n const simultaneousResult = reduceSimultaneousSubmit(\n sampled.state,\n sampled.input,\n );\n if (simultaneousResult) {\n return simultaneousResult;\n }\n const result = reduceInternal(sampled.state, sampled.input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: {\n ...result.state,\n runtime: {\n ...sampled.state.runtime,\n rng: result.runtimeRng ?? sampled.state.runtime.rng,\n },\n } as State,\n instructions: result.instructions ?? [],\n };\n }\n\n function resolveInstruction(\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n switch (instruction.kind) {\n case \"flow.transition\":\n return flowInstructions.resolveTransition(state, instruction);\n case \"engine.rollDie\":\n return engineInstructions.resolveRollDie(state, instruction);\n case \"engine.shuffleSharedZone\":\n return engineInstructions.resolveShuffleSharedZone(state, instruction);\n case \"engine.shufflePlayerZone\":\n return engineInstructions.resolveShufflePlayerZone(state, instruction);\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `Unknown runtime instruction kind: ${(_exhaustive as { kind: string }).kind}`,\n );\n }\n }\n }\n\n const instructionEngine = createRuntimeInstructionEngine<\n State,\n PlayerId,\n ReducerInput\n >({\n reduce(state, input) {\n return reduceOnce(state, input);\n },\n resolveInstruction,\n });\n\n return {\n resolveInstruction,\n dispatch: instructionEngine.dispatch,\n drainInstructions: instructionEngine.drainInstructions,\n reduceInternal,\n reduceOnce,\n };\n}\n","import { z } from \"zod\";\n\nexport function formatIssue(\n label: string,\n issue: { path: PropertyKey[]; message: string },\n): string {\n const path = issue.path\n .map((segment) =>\n typeof segment === \"symbol\" ? segment.toString() : String(segment),\n )\n .join(\".\");\n return `${path || label}: ${issue.message}`;\n}\n\nexport function safeParseOrThrow<Schema extends z.ZodTypeAny>(\n schema: Schema,\n value: unknown,\n label: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n const message = parsed.error.issues\n .map((issue) => formatIssue(label, issue))\n .join(\"; \");\n throw new Error(message || `Invalid ${label}`);\n }\n return parsed.data;\n}\n","import type {\n AnyInteractionSpec,\n InputCollectorKind,\n InputDomainDescriptor,\n InteractionIdOfDefinition,\n InteractionKind,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDefinition,\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport type TrustedInteractionId<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionIdOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type InteractionDescriptorContext<PlayerId extends string = string> = {\n to: PlayerId;\n title?: string;\n options?: Array<{ id: string; label?: string }>;\n};\n\nexport type InteractionCommitPolicyShape =\n | { mode: \"manual\" }\n | { mode: \"autoWhenReady\" };\n\nexport type InteractionAvailabilityShape =\n | { status: \"available\" }\n | { status: \"notYourTurn\"; reason: string }\n | {\n status: \"insufficientResources\";\n reason: string;\n missingResources: Record<string, number>;\n }\n | { status: \"blocked\"; reason: string; code?: string };\n\ntype InteractionDescriptorBaseShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = {\n phaseName: PhaseName;\n interactionKey: `${PhaseName}.${InteractionId}`;\n interactionId: InteractionId;\n commit: InteractionCommitPolicyShape;\n zoneId?: ZoneId;\n zoneIds?: readonly ZoneId[];\n inputs: InteractionInputDescriptorShape[];\n cost?: Record<string, number>;\n currentResources?: Record<string, number>;\n availability: InteractionAvailabilityShape;\n};\n\nexport type ActionInteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = InteractionDescriptorBaseShape<PhaseName, InteractionId, ZoneId> & {\n kind: \"action\";\n};\n\nexport type PromptInteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> = InteractionDescriptorBaseShape<PhaseName, InteractionId, ZoneId> & {\n kind: \"prompt\";\n context: InteractionDescriptorContext<PlayerId>;\n};\n\nexport type InteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> =\n | ActionInteractionDescriptorShape<PhaseName, InteractionId, ZoneId>\n | PromptInteractionDescriptorShape<\n PhaseName,\n InteractionId,\n PlayerId,\n ZoneId\n >;\n\nexport type TrustedInteractionDescriptorShape<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionDescriptorShape<\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedInteractionId<Contract, Definitions, Views>,\n TrustedPlayerId<Contract>\n>;\n\nexport type InteractionInputDescriptorShape = {\n key: string;\n kind: InputCollectorKind;\n domain: InputDomainDescriptor;\n defaultValue?: unknown;\n};\n\nexport type InteractionActorAuthorization<PlayerId extends string> =\n | { readonly mode: \"addressees\"; readonly addressees: ReadonlySet<PlayerId> }\n | { readonly mode: \"actors\"; readonly actors: ReadonlySet<PlayerId> }\n | { readonly mode: \"active\" };\n\nexport type ResolveDecisionMode = \"descriptor\" | \"card\" | \"submit\";\n\nexport type ResolveDecisionInput<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = {\n state: TrustedState<Contract>;\n playerId: TrustedPlayerId<Contract>;\n interactionId: string;\n params?: Record<string, unknown>;\n mode: ResolveDecisionMode;\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >;\n};\n\nexport type InteractionDecisionResult<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> =\n | {\n found: false;\n validation: ReducerValidationResult;\n }\n | {\n found: true;\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >;\n parsedParams: Record<string, unknown>;\n visible: boolean;\n descriptor: TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n validation: ReducerValidationResult;\n };\n\nexport function makeValidationError(\n errorCode: string,\n message?: string,\n): ReducerValidationResult {\n return {\n valid: false,\n errorCode,\n message,\n };\n}\n","import { formatIssue } from \"../../parse-utils\";\nimport { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n BoardTargetDomainDescriptor,\n CardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n InputSelectionDescriptor,\n ManifestContract,\n ReducerValidationResult,\n TableQueriesOfState,\n TableOfState,\n} from \"../../model\";\nimport { makeValidationError } from \"./interaction-types\";\nimport type { InteractionInputDescriptorShape } from \"./interaction-types\";\n\nconst MAX_EAGER_DEPENDENT_DOMAIN_CASES = 64;\n\ntype CollectorProjectionOptions<DomainState extends CollectorState> = {\n readonly queries?: TableQueriesOfState<DomainState>;\n readonly derived?: DerivedResolver;\n readonly eligibleTargetCache?: Map<string, string[]>;\n readonly eligibleTargetCachePrefix?: string;\n readonly includeEligibleTargets?: boolean;\n};\n\nfunction collectTargetDomainMetadata(collector: InputCollector): {\n targetKind?: string;\n boardId?: string;\n valueKind?: \"board-id\" | \"player-board-space\";\n zoneId?: string;\n zoneIds?: readonly string[];\n} {\n switch (collector.kind) {\n case \"card\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? \"card\",\n zoneId: meta.zoneId,\n zoneIds:\n meta.zoneIds ??\n (meta.zoneId === undefined ? undefined : [meta.zoneId]),\n };\n }\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? collector.kind.replace(\"board-\", \"\"),\n boardId: meta.boardId,\n valueKind: meta.valueKind,\n };\n }\n default:\n return {};\n }\n}\n\nfunction withSelection(\n domain: InputDomainDescriptor,\n collector: InputCollector,\n): InputDomainDescriptor {\n if (!collector.selection) return domain;\n return { ...domain, selection: collector.selection };\n}\n\nfunction lazyTargetDomainFromCollectorMetadata(\n key: string,\n collector: InputCollector,\n dependencies: readonly string[],\n): CardTargetDomainDescriptor | BoardTargetDomainDescriptor | null {\n const metadata = collectTargetDomainMetadata(collector);\n if (collector.kind === \"card\") {\n return withSelection(\n {\n type: \"cardTarget\",\n projection: \"lazy\",\n targetKind: \"card\",\n zoneIds:\n metadata.zoneIds ??\n (metadata.zoneId === undefined ? [] : [metadata.zoneId]),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n },\n collector,\n ) as CardTargetDomainDescriptor;\n }\n if (\n collector.kind === \"board-edge\" ||\n collector.kind === \"board-space\" ||\n collector.kind === \"board-tile\" ||\n collector.kind === \"board-vertex\"\n ) {\n return withSelection(\n {\n type: \"boardTarget\",\n projection: \"lazy\",\n targetKind: (metadata.targetKind ??\n collector.kind.replace(\"board-\", \"\")) as\n | \"edge\"\n | \"vertex\"\n | \"space\"\n | \"tile\",\n boardId: metadata.boardId ?? \"\",\n ...(metadata.valueKind ? { valueKind: metadata.valueKind } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n },\n collector,\n ) as BoardTargetDomainDescriptor;\n }\n return null;\n}\n\nfunction finiteValuesForDependency(\n key: string,\n domain: InputDomainDescriptor | undefined,\n): string[] {\n if (!domain) {\n throw new Error(\n `Interaction input '${key}' is declared as a dependency before it has a projected domain.`,\n );\n }\n if (domain.type === \"cardTarget\" || domain.type === \"boardTarget\") {\n if (domain.projection !== \"resolved\") {\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency because its target domain is not finite.`,\n );\n }\n return [...domain.eligibleTargets];\n }\n if (domain.type === \"choice\") {\n return domain.choices.flatMap((choice) =>\n choice.value === null ? [] : [choice.value],\n );\n }\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency. V1 supports finite target and choice dependencies only.`,\n );\n}\n\nfunction cartesianDependencyTuples(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): Array<Record<string, string>> {\n return dependencies.reduce<Array<Record<string, string>>>(\n (tuples, key) => {\n const values = finiteValuesForDependency(key, domainsByKey[key]);\n return tuples.flatMap((tuple) =>\n values.map((value) => ({ ...tuple, [key]: value })),\n );\n },\n [{}],\n );\n}\n\nfunction withoutDependentProjection(\n domain: InputDomainDescriptor,\n): InputDomainDescriptor {\n const { dependencies: _dependencies, ...rest } =\n domain as InputDomainDescriptor & { dependencies?: unknown };\n return rest as InputDomainDescriptor;\n}\n\nfunction toLazyTargetDomain(\n key: string,\n domain: InputDomainDescriptor,\n dependencies: readonly string[],\n): CardTargetDomainDescriptor | BoardTargetDomainDescriptor | null {\n if (domain.type === \"cardTarget\") {\n return {\n type: \"cardTarget\",\n projection: \"lazy\",\n targetKind: \"card\",\n zoneIds: domain.zoneIds,\n ...(domain.selection ? { selection: domain.selection } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n };\n }\n if (domain.type === \"boardTarget\") {\n return {\n type: \"boardTarget\",\n projection: \"lazy\",\n targetKind: domain.targetKind,\n boardId: domain.boardId,\n ...(domain.valueKind ? { valueKind: domain.valueKind } : {}),\n ...(domain.selection ? { selection: domain.selection } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n };\n }\n return null;\n}\n\nfunction dependencyCaseCount(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): number {\n return dependencies\n .map((key) => finiteValuesForDependency(key, domainsByKey[key]).length)\n .reduce((total, count) => total * count, 1);\n}\n\nfunction unsupportedDefaultInputError(key: string, collector: InputCollector) {\n return new Error(\n `Interaction input '${key}' uses a '${collector.kind}' collector without a default-renderable domain or target metadata. ` +\n \"Use formInput.choice(...), formInput.choiceList(...), formInput.number(...), formInput.resourceMap(...), cardInput(...), or boardInput(...). \" +\n \"For custom payloads, use a custom interaction surface with paramsSchema instead of the default InteractionForm.\",\n );\n}\n\nexport function interactionInputsOf<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<string, InputCollector> {\n return interaction.inputs as Record<string, InputCollector>;\n}\n\nexport function collectEligibleTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, string[]> {\n const collectors = interactionInputsOf(interaction);\n const result: Record<string, string[]> = {};\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n for (const [key, collector] of Object.entries(collectors)) {\n if (!collector.eligibleTargets) continue;\n const cacheKey = options.eligibleTargetCachePrefix\n ? `${options.eligibleTargetCachePrefix}:${key}`\n : null;\n const cached = cacheKey\n ? options.eligibleTargetCache?.get(cacheKey)\n : undefined;\n if (cached) {\n result[key] = cached;\n continue;\n }\n const targets = collector.eligibleTargets(\n domainState as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[0],\n playerId as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[1],\n queries() as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[2],\n );\n const resolved = Array.from(targets as ReadonlyArray<unknown>).map((t) =>\n String(t),\n );\n result[key] = resolved;\n if (cacheKey) {\n options.eligibleTargetCache?.set(cacheKey, resolved);\n }\n }\n return result;\n}\n\nexport function collectInputMetadata<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<\n string,\n {\n kind: string;\n targetKind?: string;\n boardId?: string;\n zoneId?: string;\n zoneIds?: readonly string[];\n }\n> {\n const collectors = interactionInputsOf(interaction);\n return Object.fromEntries(\n Object.entries(collectors).map(([key, collector]) => [\n key,\n {\n kind: collector.kind,\n ...collectTargetDomainMetadata(collector),\n },\n ]),\n );\n}\n\nexport function collectInputDomains<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n eligibleTargets: Record<string, string[]>,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, InputDomainDescriptor> {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n const result: Record<string, InputDomainDescriptor> = {};\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") {\n continue;\n }\n if (collector.kind === \"prompt\") {\n const optionFactory = collector.meta?.options;\n if (!optionFactory) continue;\n result[key] = {\n type: \"choice\",\n choices: optionFactory(domainState, playerId, queries() as unknown).map(\n (option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n ...(() => {\n const issue = collector.validateTarget?.(\n domainState,\n playerId,\n queries() as unknown,\n String(option.id),\n );\n return issue\n ? {\n disabled: true,\n disabledReason: issue.message ?? issue.errorCode,\n }\n : {};\n })(),\n }),\n ),\n };\n continue;\n }\n if (collector.domain) {\n const domainProjector = collector.domain;\n const dependencies = collector.dependsOn ?? [];\n if (\n options.includeEligibleTargets === false &&\n !Object.prototype.hasOwnProperty.call(eligibleTargets, key)\n ) {\n const lazyDomain = lazyTargetDomainFromCollectorMetadata(\n key,\n collector,\n dependencies,\n );\n if (lazyDomain) {\n result[key] = lazyDomain;\n continue;\n }\n }\n const baseDomain = withSelection(\n domainProjector(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n {},\n ),\n collector,\n );\n if (dependencies.length === 0) {\n result[key] = baseDomain;\n continue;\n }\n const caseCount = dependencyCaseCount(dependencies, result);\n const lazyDomain =\n caseCount > MAX_EAGER_DEPENDENT_DOMAIN_CASES\n ? toLazyTargetDomain(key, baseDomain, dependencies)\n : null;\n if (lazyDomain) {\n result[key] = lazyDomain;\n continue;\n }\n const dependentCases = cartesianDependencyTuples(\n dependencies,\n result,\n ).map((values) => ({\n when: values,\n domain: withoutDependentProjection(\n withSelection(\n domainProjector(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n values,\n ),\n collector,\n ),\n ),\n }));\n result[key] = {\n ...baseDomain,\n dependencies: {\n mode: \"eager\",\n dependentCases,\n },\n } as InputDomainDescriptor;\n continue;\n }\n throw unsupportedDefaultInputError(key, collector);\n }\n return result;\n}\n\nexport function collectInteractionInputs<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): InteractionInputDescriptorShape[] {\n const collectors = interactionInputsOf(interaction);\n const dependencyKeys = new Set(\n Object.values(collectors).flatMap((collector) => [\n ...(collector.dependsOn ?? []),\n ]),\n );\n const collectedEligibleTargets =\n options.includeEligibleTargets === false && dependencyKeys.size === 0\n ? {}\n : collectEligibleTargets(interaction, domainState, playerId, options);\n const eligibleTargets =\n options.includeEligibleTargets === false\n ? Object.fromEntries(\n Object.entries(collectedEligibleTargets).filter(([key]) =>\n dependencyKeys.has(key),\n ),\n )\n : collectedEligibleTargets;\n const domainsByKey = collectInputDomains(\n interaction,\n domainState,\n playerId,\n eligibleTargets,\n options,\n );\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n return Object.entries(collectors).flatMap(([key, collector]) => {\n if (collector.kind === \"rng\") {\n return [];\n }\n const domain = domainsByKey[key];\n if (!domain && collector.kind === \"prompt\") {\n return [];\n }\n if (!domain) {\n throw unsupportedDefaultInputError(key, collector);\n }\n const dynamicDefault = collector.resolveDefaultValue?.(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n domain,\n );\n const defaultValue =\n \"defaultValue\" in collector ? collector.defaultValue : dynamicDefault;\n warnConcreteDependentChoiceDefault({\n inputKey: key,\n collector,\n domain,\n defaultValue,\n dependencyKeys,\n });\n return [\n {\n key,\n kind: collector.kind,\n domain,\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n },\n ];\n });\n}\n\nconst concreteDependentChoiceDefaultWarnings = new Set<string>();\n\nfunction shouldEmitAuthoringWarning(): boolean {\n const env = (\n globalThis as typeof globalThis & {\n process?: { env?: Record<string, string | undefined> };\n }\n ).process?.env;\n return (\n env?.NODE_ENV !== \"production\" &&\n env?.DREAMBOARD_SUPPRESS_AUTHORING_WARNINGS !== \"1\"\n );\n}\n\nfunction warnConcreteDependentChoiceDefault({\n inputKey,\n collector,\n domain,\n defaultValue,\n dependencyKeys,\n}: {\n inputKey: string;\n collector: InputCollector;\n domain: InputDomainDescriptor;\n defaultValue: unknown;\n dependencyKeys: ReadonlySet<string>;\n}): void {\n if (\n !shouldEmitAuthoringWarning() ||\n !dependencyKeys.has(inputKey) ||\n collector.kind !== \"form\" ||\n domain.type !== \"choice\" ||\n defaultValue === undefined ||\n defaultValue === null\n ) {\n return;\n }\n\n const warningKey = `${inputKey}:${String(defaultValue)}`;\n if (concreteDependentChoiceDefaultWarnings.has(warningKey)) {\n return;\n }\n concreteDependentChoiceDefaultWarnings.add(warningKey);\n console.warn(\n `[dreamboard] Form choice input \"${inputKey}\" feeds another collector and defaulted to \"${String(\n defaultValue,\n )}\". Dependent choices that select the object an action applies to should usually use defaultValue: () => undefined so collection stays explicit.`,\n );\n}\n\nexport function collectFirstCardZoneId<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): string | undefined {\n const collectors = interactionInputsOf(interaction);\n for (const collector of Object.values(collectors)) {\n if (collector.kind === \"card\") {\n if (collector.meta.zoneId.length > 0) {\n return collector.meta.zoneId;\n }\n }\n }\n return undefined;\n}\n\nexport function collectCardZoneIds<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): readonly string[] {\n const collectors = interactionInputsOf(interaction);\n const zoneIds = new Set<string>();\n for (const collector of Object.values(collectors)) {\n if (collector.kind === \"card\") {\n for (const zoneId of collector.meta.zoneIds ?? [collector.meta.zoneId]) {\n if (zoneId.length > 0) zoneIds.add(zoneId);\n }\n }\n }\n return [...zoneIds];\n}\n\nexport function collectPromptOptions(\n interaction: {\n inputs: Record<string, InputCollector>;\n },\n domainState: unknown,\n playerId: string,\n queries: unknown,\n): Array<{ id: string; label?: string }> | undefined {\n for (const collector of Object.values(interaction.inputs)) {\n if (collector.kind !== \"prompt\") continue;\n const factory = collector.meta?.options;\n if (!factory) continue;\n return factory(domainState, playerId, queries).map((option) => ({\n id: String(option.id),\n ...(option.label !== undefined ? { label: option.label } : {}),\n }));\n }\n return undefined;\n}\n\nexport function parseInteractionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n options: { skipRng?: boolean; playerId?: string } = {},\n):\n | { ok: true; params: Record<string, unknown> }\n | { ok: false; message: string } {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n if (options.skipRng && interaction.paramsSchema) {\n const result = interaction.paramsSchema.safeParse(record);\n if (!result.success) {\n return {\n ok: false,\n message: result.error.issues\n .map((issue) => formatIssue(\"params\", issue))\n .join(\"; \"),\n };\n }\n return { ok: true, params: result.data as Record<string, unknown> };\n }\n const parsed: Record<string, unknown> = {};\n const issues: string[] = [];\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\" && options.skipRng) continue;\n const rawValueBase =\n record[key] === undefined && \"defaultValue\" in collector\n ? collector.defaultValue\n : record[key];\n const rawValue =\n collector.kind === \"board-space\" &&\n collector.meta?.valueKind === \"player-board-space\" &&\n typeof rawValueBase === \"string\" &&\n options.playerId\n ? {\n boardId: collector.meta.boardId,\n playerId: options.playerId,\n spaceId: rawValueBase,\n }\n : rawValueBase;\n const result = collector.schema.safeParse(rawValue);\n if (!result.success) {\n for (const issue of result.error.issues) {\n issues.push(formatIssue(`params.${key}`, issue));\n }\n continue;\n }\n parsed[key] = result.data;\n }\n if (issues.length > 0) {\n return { ok: false, message: issues.join(\"; \") };\n }\n return { ok: true, params: parsed };\n}\n\nexport function prepareInteractionProjectionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n): Record<string, unknown> {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n const prepared: Record<string, unknown> = { ...record };\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n if (record[key] !== undefined) {\n const result = collector.schema.safeParse(record[key]);\n if (result.success) {\n prepared[key] = result.data;\n }\n continue;\n }\n if (\"defaultValue\" in collector) {\n prepared[key] = collector.defaultValue;\n continue;\n }\n const defaultResult = collector.schema.safeParse(undefined);\n if (defaultResult.success) {\n prepared[key] = defaultResult.data;\n }\n }\n return prepared;\n}\n\nexport function validateCollectorTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n params: Record<string, unknown>,\n): ReducerValidationResult {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: ReturnType<typeof createStateQueries> | null = null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ));\n for (const [key, collector] of Object.entries(collectors)) {\n const selectionIssue = validateCollectorSelection(collector, params[key]);\n if (selectionIssue) {\n return makeValidationError(\n selectionIssue.errorCode,\n selectionIssue.message,\n );\n }\n if (!collector.validateTarget) continue;\n const rawTarget = params[key];\n if (rawTarget === null || rawTarget === undefined) continue;\n const dependencyValues = dependencyValuesForCollector(collector, params);\n const targetValues = valuesForCollectorValidation(\n collector.selection,\n rawTarget,\n );\n for (const value of targetValues) {\n const issue = collector.validateTarget(\n domainState as unknown as Parameters<\n typeof collector.validateTarget\n >[0],\n playerId as unknown as Parameters<typeof collector.validateTarget>[1],\n queries() as unknown as Parameters<typeof collector.validateTarget>[2],\n value,\n dependencyValues,\n );\n if (issue) {\n return makeValidationError(issue.errorCode, issue.message);\n }\n }\n }\n return { valid: true };\n}\n\nfunction dependencyValuesForCollector(\n collector: InputCollector,\n params: Record<string, unknown>,\n): Readonly<Record<string, unknown>> | undefined {\n const dependencies = collector.dependsOn ?? [];\n if (dependencies.length === 0) return undefined;\n return Object.fromEntries(\n dependencies.map((dependencyKey) => [dependencyKey, params[dependencyKey]]),\n );\n}\n\nfunction valuesForCollectorValidation(\n selection: InputSelectionDescriptor | undefined,\n value: unknown,\n): readonly unknown[] {\n if (selection?.mode === \"many\") {\n return Array.isArray(value) ? value : [];\n }\n return [value];\n}\n\nfunction validateCollectorSelection(\n collector: InputCollector,\n value: unknown,\n): { errorCode: string; message?: string } | null {\n const selection = collector.selection;\n if (selection?.mode !== \"many\") return null;\n if (!Array.isArray(value)) return null;\n if (value.length < selection.min) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at least ${selection.min} value${selection.min === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.max !== undefined && value.length > selection.max) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at most ${selection.max} value${selection.max === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.distinct) {\n const seen = new Set<string>();\n for (const item of value) {\n const key = stableValueKey(item);\n if (seen.has(key)) {\n return {\n errorCode: \"DUPLICATE_INPUT_VALUE\",\n message: \"Input values must be distinct.\",\n };\n }\n seen.add(key);\n }\n }\n return null;\n}\n\nfunction stableValueKey(value: unknown): string {\n if (value === null) return \"null\";\n switch (typeof value) {\n case \"string\":\n return `string:${value}`;\n case \"number\":\n case \"boolean\":\n case \"undefined\":\n return `${typeof value}:${String(value)}`;\n default:\n return `json:${JSON.stringify(value)}`;\n }\n}\n\nexport function findCardInputKey<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): string | undefined {\n return Object.entries(interactionInputsOf(interaction)).find(\n ([, collector]) => collector.kind === \"card\",\n )?.[0];\n}\n\nexport function findCardInputKeyForZone<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n zoneId: string,\n): string | undefined {\n return Object.entries(interactionInputsOf(interaction)).find(\n ([, collector]) =>\n collector.kind === \"card\" &&\n (collector.meta.zoneIds ?? [collector.meta.zoneId])\n .map(String)\n .includes(zoneId),\n )?.[0];\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { InteractionActorAuthorization } from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n} from \"./simultaneous-player\";\n\nfunction resolvePromptToSet<PlayerId extends string>(\n to: unknown,\n): ReadonlySet<PlayerId> {\n if (to === undefined || to === null) return new Set();\n if (Array.isArray(to)) {\n return new Set(to as PlayerId[]);\n }\n if (typeof to === \"string\") {\n return new Set([to as PlayerId]);\n }\n return new Set();\n}\n\nexport function createInteractionAuthorization<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInteractionActorAuthorization(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): InteractionActorAuthorization<PlayerId> {\n if (interaction.to) {\n const resolved = interaction.to({\n ...scope.buildContext(state),\n state: projection?.domainState ?? scope.toDomainState(state),\n });\n return {\n mode: \"addressees\",\n addressees: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n if (interaction.actor) {\n const resolved = interaction.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n const phase = scope.phaseByName(state.flow.currentPhase as PhaseName);\n if (isSimultaneousPhase(phase)) {\n return {\n mode: \"actors\",\n actors: new Set(\n resolveSimultaneousActors(scope, state, phase, projection),\n ),\n };\n }\n if (phase.actor) {\n const resolved = phase.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n return { mode: \"active\" };\n }\n\n function isActorAuthorized(\n state: State,\n playerId: PlayerId,\n authorization: InteractionActorAuthorization<PlayerId>,\n ): boolean {\n if (authorization.mode === \"addressees\") {\n return authorization.addressees.has(playerId);\n }\n if (authorization.mode === \"actors\") {\n return authorization.actors.has(playerId);\n }\n const active = state.flow.activePlayers as readonly PlayerId[];\n if (active.length === 0) {\n return true;\n }\n return active.includes(playerId);\n }\n\n function isInteractionVisible(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n authorization: InteractionActorAuthorization<PlayerId>,\n authorized: boolean,\n ): boolean {\n return (\n !(authorization.mode === \"addressees\" && !authorized) &&\n !(interaction.visibility === \"actorsOnly\" && !authorized)\n );\n }\n\n return {\n isActorAuthorized,\n isInteractionVisible,\n resolveInteractionActorAuthorization,\n };\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectCardZoneIds,\n collectFirstCardZoneId,\n collectInteractionInputs,\n collectPromptOptions,\n interactionInputsOf,\n parseInteractionParams,\n prepareInteractionProjectionParams,\n validateCollectorTargets,\n} from \"./interaction-collectors\";\nimport type { createInteractionAuthorization } from \"./interaction-authorization\";\nimport type { createStageResolver } from \"./stage-resolver\";\nimport {\n makeValidationError,\n type InteractionDecisionResult,\n type InteractionAvailabilityShape,\n type InteractionDescriptorShape,\n type ResolveDecisionInput,\n type TrustedInteractionDescriptorShape,\n type TrustedInteractionId,\n} from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype StageResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createStageResolver<Contract, Definitions, Views>>;\n\ntype AuthorizationFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n typeof createInteractionAuthorization<Contract, Definitions, Views>\n>;\n\ntype InteractionRuleIssue = {\n errorCode: string;\n message?: string;\n};\n\nfunction issueFromRule(rule: InteractionRuleIssue): InteractionRuleIssue {\n return { errorCode: rule.errorCode, message: rule.message };\n}\n\nfunction issueFromRuleValidationResult(\n rule: InteractionRuleIssue,\n result: boolean | InteractionRuleIssue | null | undefined,\n): InteractionRuleIssue | undefined {\n if (result === false) return issueFromRule(rule);\n if (result && typeof result === \"object\") return result;\n return undefined;\n}\n\nfunction humanizeInteractionId(id: string): string {\n if (!id) return id;\n const withSpaces = id\n .replace(/[-_]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .trim();\n if (!withSpaces) return id;\n return withSpaces\n .split(/\\s+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction deriveInteractionKind(\n inputs: Record<string, InputCollector>,\n): \"action\" | \"prompt\" {\n for (const collector of Object.values(inputs)) {\n if (collector.kind === \"prompt\") {\n return \"prompt\";\n }\n }\n return \"action\";\n}\n\nfunction isTargetCollector(collector: InputCollector): boolean {\n switch (collector.kind) {\n case \"card\":\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isManyCollector(collector: InputCollector): boolean {\n return collector.selection?.mode === \"many\";\n}\n\nfunction terminalCollectorsForInputs(\n inputs: Record<string, InputCollector>,\n): InputCollector[] {\n const terminalKeys = new Set(Object.keys(inputs));\n for (const collector of Object.values(inputs)) {\n for (const dependencyKey of collector.dependsOn ?? []) {\n terminalKeys.delete(dependencyKey);\n }\n }\n const collectors: InputCollector[] = [];\n for (const key of terminalKeys) {\n const collector = inputs[key];\n if (collector) collectors.push(collector);\n }\n return collectors;\n}\n\nfunction deriveCommitPolicy(\n inputs: Record<string, InputCollector>,\n explicit: InteractionDescriptorShape[\"commit\"] | undefined,\n): InteractionDescriptorShape[\"commit\"] {\n const collectors = Object.values(inputs);\n const hasManyCollector = collectors.some(isManyCollector);\n if (explicit) {\n if (explicit.mode === \"autoWhenReady\" && hasManyCollector) {\n throw new Error(\n 'Interactions with many(...) inputs must use commit: { mode: \"manual\" }.',\n );\n }\n return explicit;\n }\n if (hasManyCollector) {\n return { mode: \"manual\" };\n }\n if (collectors.length === 0 || !collectors.some(isTargetCollector)) {\n return { mode: \"manual\" };\n }\n const terminalCollectors = terminalCollectorsForInputs(inputs);\n if (terminalCollectors.length === 0) {\n return { mode: \"manual\" };\n }\n return terminalCollectors.every(\n (collector) => isTargetCollector(collector) || collector.kind === \"rng\",\n ) && terminalCollectors.some(isTargetCollector)\n ? { mode: \"autoWhenReady\" }\n : { mode: \"manual\" };\n}\n\nfunction projectInteractionMetadata(interaction: {\n inputs: Record<string, InputCollector>;\n commit?: InteractionDescriptorShape[\"commit\"];\n}): Pick<InteractionDescriptorShape, \"kind\" | \"commit\"> {\n return {\n kind: deriveInteractionKind(interaction.inputs),\n commit: deriveCommitPolicy(interaction.inputs, interaction.commit),\n };\n}\n\nfunction enrichResourceInputPresentation(\n inputs: InteractionDescriptorShape[\"inputs\"],\n manifest: { literals?: { resourcePresentationById?: unknown } },\n): InteractionDescriptorShape[\"inputs\"] {\n const presentationById = manifest.literals?.resourcePresentationById;\n if (!presentationById || typeof presentationById !== \"object\") {\n return inputs;\n }\n const resources = presentationById as Record<\n string,\n { label?: unknown; icon?: unknown }\n >;\n const enrichChoice = <\n Choice extends { value: string | null; label: string; icon?: string },\n >(\n choice: Choice,\n ): Choice & { icon?: string } => {\n const presentation =\n choice.value === null ? undefined : resources[choice.value];\n return {\n ...choice,\n label:\n typeof presentation?.label === \"string\" &&\n (!choice.label || choice.label === choice.value)\n ? presentation.label\n : choice.label ||\n (typeof presentation?.label === \"string\" ? presentation.label : \"\"),\n icon:\n choice.icon ??\n (typeof presentation?.icon === \"string\"\n ? presentation.icon\n : undefined),\n };\n };\n return inputs.map((input) => {\n if (input.domain.type === \"choice\") {\n return {\n ...input,\n domain: {\n ...input.domain,\n choices: input.domain.choices.map(enrichChoice),\n },\n };\n }\n if (input.domain.type === \"choiceList\") {\n return {\n ...input,\n domain: {\n ...input.domain,\n choices: input.domain.choices.map(enrichChoice),\n },\n };\n }\n if (input.domain.type !== \"resourceMap\") return input;\n return {\n ...input,\n domain: {\n ...input.domain,\n resources: input.domain.resources.map((entry) => {\n const presentation = resources[entry.resourceId];\n return {\n ...entry,\n label:\n entry.label ??\n (typeof presentation?.label === \"string\"\n ? presentation.label\n : undefined),\n icon:\n entry.icon ??\n (typeof presentation?.icon === \"string\"\n ? presentation.icon\n : undefined),\n };\n }),\n },\n };\n });\n}\n\nfunction interactionAvailabilityFromDecision(decision: {\n available: boolean;\n unavailableReason?: string;\n missingResources?: Record<string, number>;\n}): InteractionAvailabilityShape {\n if (decision.available) return { status: \"available\" };\n if (decision.unavailableReason === \"Not your turn\") {\n return { status: \"notYourTurn\", reason: decision.unavailableReason };\n }\n if (decision.unavailableReason === \"INSUFFICIENT_RESOURCES\") {\n return {\n status: \"insufficientResources\",\n reason: decision.unavailableReason,\n missingResources: { ...(decision.missingResources ?? {}) },\n };\n }\n return {\n status: \"blocked\",\n reason: decision.unavailableReason ?? \"Interaction unavailable\",\n };\n}\n\nexport function createInteractionDecisionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n stages: StageResolverFor<Contract, Definitions, Views>,\n authorization: AuthorizationFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type InteractionId = TrustedInteractionId<Contract, Definitions, Views>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n\n function evaluateInteractionCost(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n playerId: PlayerId,\n params: Record<string, unknown>,\n projection?: ProjectionContext<DomainState, State>,\n ):\n | { cost?: Record<string, number>; missing?: Record<string, number> }\n | { error: unknown } {\n if (!interaction.cost) {\n return {};\n }\n const args = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId, params },\n },\n projection,\n );\n try {\n const cost = { ...interaction.cost(args) };\n const typedCost = cost as Parameters<typeof args.q.player.canAfford>[1];\n const missing = args.q.player.canAfford(playerId, typedCost)\n ? {}\n : { ...args.q.player.missingResources(playerId, typedCost) };\n return { cost, missing };\n } catch (error) {\n return { error };\n }\n }\n\n function buildBaseDescriptor(\n state: State,\n playerId: PlayerId,\n interactionId: InteractionId,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n decision: {\n available: boolean;\n unavailableReason?: string;\n cost?: Record<string, number>;\n missingResources?: Record<string, number>;\n },\n options: {\n projection?: ProjectionContext<DomainState, State>;\n includeEligibleTargets?: boolean;\n } = {},\n ): Descriptor {\n const domainState =\n options.projection?.domainState ?? scope.toDomainState(state);\n const phaseName = state.flow.currentPhase as PhaseName;\n const interactionInputs = interactionInputsOf(interaction);\n const metadata = projectInteractionMetadata({\n ...interaction,\n inputs: interactionInputs,\n });\n const queries = options.projection?.q ?? createStateQueries(domainState);\n const derived = options.projection?.derived;\n const shouldMaterializeInputDomains =\n decision.available || decision.unavailableReason !== \"Not your turn\";\n const promptContext =\n metadata.kind === \"prompt\"\n ? {\n to: playerId,\n title: humanizeInteractionId(interactionId),\n options: shouldMaterializeInputDomains\n ? collectPromptOptions(\n { inputs: interactionInputs },\n domainState,\n playerId as unknown as string,\n queries,\n )\n : undefined,\n }\n : undefined;\n const inputs = shouldMaterializeInputDomains\n ? enrichResourceInputPresentation(\n collectInteractionInputs(interaction, domainState, playerId, {\n queries,\n derived,\n eligibleTargetCache: options.projection?.eligibleTargets,\n eligibleTargetCachePrefix: `${phaseName}:${String(\n interactionId,\n )}:${String(playerId)}`,\n includeEligibleTargets: options.includeEligibleTargets,\n }),\n scope.definition.contract.manifest,\n )\n : [];\n const baseDescriptor = {\n phaseName,\n interactionKey: `${phaseName}.${interactionId}`,\n interactionId,\n commit: metadata.commit,\n zoneId: collectFirstCardZoneId(interaction),\n zoneIds: collectCardZoneIds(interaction),\n inputs,\n cost: decision.cost ? { ...decision.cost } : undefined,\n currentResources: decision.cost\n ? {\n ...(queries.player.resources(playerId) as\n | Record<string, number>\n | undefined),\n }\n : undefined,\n availability: interactionAvailabilityFromDecision(decision),\n };\n if (metadata.kind === \"prompt\") {\n return {\n ...baseDescriptor,\n kind: \"prompt\",\n context: promptContext ?? {\n to: playerId,\n title: humanizeInteractionId(interactionId),\n },\n } as Descriptor;\n }\n return {\n ...baseDescriptor,\n kind: \"action\",\n } as Descriptor;\n }\n\n function resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params = {},\n mode,\n projection,\n }: ResolveDecisionInput<\n Contract,\n Definitions,\n Views\n >): InteractionDecisionResult<Contract, Definitions, Views> {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) {\n return {\n found: false,\n validation: makeValidationError(\n \"unsupported-action\",\n `Interaction '${interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n ),\n };\n }\n const trustedInteractionId = interactionId as InteractionId;\n\n const parseForSubmit = mode === \"submit\";\n const parsed = parseForSubmit\n ? parseInteractionParams(interaction, params, {\n skipRng: true,\n playerId,\n })\n : ({\n ok: true,\n params: prepareInteractionProjectionParams(interaction, params),\n } as const);\n if (!parsed.ok) {\n return {\n found: true,\n interaction,\n parsedParams: {},\n visible: true,\n descriptor: buildBaseDescriptor(\n state,\n playerId,\n trustedInteractionId,\n interaction,\n {\n available: false,\n unavailableReason: parsed.message,\n },\n { projection, includeEligibleTargets: false },\n ),\n validation: makeValidationError(\n \"invalid-action-params\",\n parsed.message,\n ),\n };\n }\n\n const phase = scope.phaseByName(phaseName);\n const isSimultaneousSubmit =\n isSimultaneousPhase(phase) &&\n interactionId === SIMULTANEOUS_SUBMIT_INTERACTION_ID;\n const alreadySubmitted =\n isSimultaneousSubmit &&\n state.runtime.simultaneous?.current?.phaseName === phaseName &&\n Boolean(state.runtime.simultaneous.current.submissions[playerId]);\n const canResubmit =\n isSimultaneousSubmit &&\n (phase as { canResubmit?: boolean }).canResubmit === true;\n\n const actorAuthorization =\n authorization.resolveInteractionActorAuthorization(\n state,\n interaction,\n projection,\n );\n const authorized = authorization.isActorAuthorized(\n state,\n playerId,\n actorAuthorization,\n );\n let visible = authorization.isInteractionVisible(\n interaction,\n actorAuthorization,\n authorized,\n );\n if (alreadySubmitted && !canResubmit && mode !== \"submit\") {\n visible = false;\n }\n const stageAllow = stages.resolveActiveStageAllowlist(\n state,\n phaseName,\n projection,\n );\n const stageAllowed = !stageAllow || stageAllow.has(interactionId);\n const stepAllowed = stages.isInteractionAllowedInStep(\n state,\n interaction,\n projection,\n );\n\n let validation: ReducerValidationResult = { valid: true };\n if (!authorized) {\n validation =\n actorAuthorization.mode === \"addressees\"\n ? makeValidationError(\n \"prompt-not-owned\",\n `Interaction '${interactionId}' is not addressed to '${playerId}'.`,\n )\n : makeValidationError(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${interactionId}').`,\n );\n } else if (alreadySubmitted && !canResubmit) {\n validation = makeValidationError(\n \"ALREADY_SUBMITTED\",\n `Interaction '${interactionId}' has already been submitted by '${playerId}'.`,\n );\n } else if (!stageAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current stage.`,\n );\n } else if (!stepAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current step.`,\n );\n }\n\n const canEvaluateProjectionDetails =\n mode !== \"submit\" && visible && authorized && stageAllowed && stepAllowed;\n const canContinueSubmitValidation = mode === \"submit\" && validation.valid;\n let cost: Record<string, number> | undefined;\n let missingResources: Record<string, number> | undefined;\n let costAffordable = true;\n if (canContinueSubmitValidation || canEvaluateProjectionDetails) {\n const costDecision = evaluateInteractionCost(\n state,\n interaction,\n playerId,\n parsed.params,\n projection,\n );\n if (\"error\" in costDecision) {\n costAffordable = false;\n validation = makeValidationError(\n \"cost-unavailable\",\n `Interaction '${interactionId}' cost could not be evaluated.`,\n );\n } else {\n cost = costDecision.cost ?? undefined;\n missingResources = costDecision.missing ?? undefined;\n costAffordable =\n !missingResources ||\n Object.values(missingResources).every((amount) => amount <= 0);\n if (!costAffordable) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n \"INSUFFICIENT_RESOURCES\",\n `Interaction '${interactionId}' cannot be afforded.`,\n );\n }\n }\n }\n }\n\n let ruleAvailabilityIssue: InteractionRuleIssue | undefined;\n if (\n (canContinueSubmitValidation || canEvaluateProjectionDetails) &&\n interaction.rules\n ) {\n const availabilityArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId },\n },\n projection,\n );\n for (const rule of interaction.rules) {\n if (!rule.available) continue;\n if (!rule.available(availabilityArgs)) {\n ruleAvailabilityIssue = issueFromRule(rule);\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n ruleAvailabilityIssue.errorCode,\n ruleAvailabilityIssue.message,\n );\n }\n break;\n }\n }\n }\n\n let authoredValidation:\n | {\n errorCode: string;\n message?: string;\n }\n | undefined;\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n if (validation.valid && mode === \"submit\") {\n validation = validateCollectorTargets(\n interaction,\n projection?.domainState ?? scope.toDomainState(state),\n playerId,\n parsed.params,\n );\n }\n }\n\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n const validateArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: {\n playerId,\n params: parsed.params,\n },\n },\n projection,\n );\n for (const rule of interaction.rules ?? []) {\n if (!rule.validate) continue;\n authoredValidation = issueFromRuleValidationResult(\n rule,\n rule.validate(validateArgs),\n );\n if (authoredValidation) break;\n }\n if (authoredValidation) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n authoredValidation.errorCode,\n authoredValidation.message,\n );\n }\n }\n }\n\n const available =\n stageAllowed &&\n stepAllowed &&\n authorized &&\n !ruleAvailabilityIssue &&\n costAffordable &&\n !authoredValidation;\n const unavailableReason = available\n ? undefined\n : !authorized\n ? \"Not your turn\"\n : !stageAllowed\n ? \"Interaction not allowed in current stage\"\n : !stepAllowed\n ? \"Interaction not allowed in current step\"\n : ruleAvailabilityIssue\n ? (ruleAvailabilityIssue.message ??\n ruleAvailabilityIssue.errorCode)\n : !costAffordable\n ? \"INSUFFICIENT_RESOURCES\"\n : mode === \"card\"\n ? (authoredValidation?.message ?? \"Interaction unavailable\")\n : \"Interaction unavailable\";\n const descriptor = buildBaseDescriptor(\n state,\n playerId,\n trustedInteractionId,\n interaction,\n {\n available,\n unavailableReason,\n cost,\n missingResources,\n },\n {\n projection,\n includeEligibleTargets: available || mode === \"card\",\n },\n );\n return {\n found: true,\n interaction,\n parsedParams: parsed.params,\n visible,\n descriptor,\n validation,\n };\n }\n\n function resolveAvailableInteractionsFor(\n state: State,\n playerId: PlayerId,\n options: { projection?: ProjectionContext<DomainState, State> } = {},\n ) {\n const phaseName = state.flow.currentPhase as PhaseName;\n const descriptors: Descriptor[] = [];\n for (const [interactionId] of scope.interactionEntriesForPhase(phaseName)) {\n const decision = resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params: {},\n mode: \"descriptor\",\n projection: options.projection,\n });\n if (!decision.found || !decision.visible) continue;\n descriptors.push(decision.descriptor);\n }\n return descriptors;\n }\n\n return {\n evaluateInteractionCost,\n resolveAvailableInteractionsFor,\n resolveInteractionDecision,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n StageSpec,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport function createStageResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n\n function resolveActiveStage(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): { id: string; stage: StageSpec<DomainState, Manifest> } | null {\n const stages = scope.stagesForPhase(phaseName);\n if (stages.length === 0) return null;\n const domainState = projection?.domainState ?? scope.toDomainState(state);\n const context = scope.buildContext(state);\n for (const [stageId, stage] of stages) {\n const matches = stage.when\n ? stage.when({\n ...context,\n state: domainState,\n })\n : true;\n if (matches) return { id: stageId, stage };\n }\n return null;\n }\n\n function resolveActiveStageAllowlist(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): Set<string> | null {\n const cacheKey = String(phaseName);\n if (projection?.stageAllowlists.has(cacheKey)) {\n return projection.stageAllowlists.get(cacheKey) ?? null;\n }\n const activeStage = resolveActiveStage(state, phaseName, projection);\n const allowlist = activeStage ? new Set(activeStage.stage.allow) : null;\n projection?.stageAllowlists.set(cacheKey, allowlist);\n return allowlist;\n }\n\n function isInteractionAllowedInStep(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): boolean {\n const allowedSteps = interaction.__steps ?? [];\n if (allowedSteps.length === 0) {\n return true;\n }\n const currentStep = (\n (projection?.domainState ?? scope.toDomainState(state)).phase as {\n step?: unknown;\n }\n ).step;\n return (\n typeof currentStep === \"string\" && allowedSteps.includes(currentStep)\n );\n }\n\n return {\n isInteractionAllowedInStep,\n resolveActiveStage,\n resolveActiveStageAllowlist,\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerReject,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectEligibleTargets,\n collectFirstCardZoneId,\n findCardInputKey,\n findCardInputKeyForZone,\n parseInteractionParams,\n} from \"./interaction-collectors\";\nimport { createInteractionAuthorization } from \"./interaction-authorization\";\nimport { createInteractionDecisionResolver } from \"./interaction-decision\";\nimport { createStageResolver } from \"./stage-resolver\";\nimport {\n rejectResult,\n type TrustedInput,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\nexport type { InteractionDescriptorShape } from \"./interaction-types\";\n\nexport function createInteractionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const stages = createStageResolver(scope);\n const authorization = createInteractionAuthorization(scope);\n const decisions = createInteractionDecisionResolver(\n scope,\n stages,\n authorization,\n );\n\n function validateClientInput(\n state: State,\n input: ReducerInput,\n ): ReducerValidationResult {\n if (input.kind === \"interaction\") {\n const decision = decisions.resolveInteractionDecision({\n state,\n playerId: input.playerId as PlayerId,\n interactionId: input.interactionId,\n params: (input.params ?? {}) as Record<string, unknown>,\n mode: \"submit\",\n });\n return decision.validation;\n }\n return { valid: true };\n }\n\n function validateOrReject(\n state: State,\n input: ReducerInput,\n ): ReducerReject | null {\n const validation = validateClientInput(state, input);\n if (validation.valid) {\n return null;\n }\n const invalidValidation = validation as Exclude<\n ReducerValidationResult,\n { valid: true }\n >;\n return rejectResult(invalidValidation.errorCode, invalidValidation.message);\n }\n\n return {\n collectEligibleTargets,\n collectFirstCardZoneId,\n evaluateInteractionCost: decisions.evaluateInteractionCost,\n findCardInputKey,\n findCardInputKeyForZone,\n isActorAuthorized: authorization.isActorAuthorized,\n isInteractionAllowedInStep: stages.isInteractionAllowedInStep,\n parseInteractionParams,\n resolveActiveStage: stages.resolveActiveStage,\n resolveActiveStageAllowlist: stages.resolveActiveStageAllowlist,\n resolveAvailableInteractionsFor: decisions.resolveAvailableInteractionsFor,\n resolveInteractionActorAuthorization:\n authorization.resolveInteractionActorAuthorization,\n resolveInteractionDecision: decisions.resolveInteractionDecision,\n validateClientInput,\n validateOrReject,\n };\n}\n","import {\n assertCardAllowedInContainer,\n assertCardAllowedInZone,\n cloneRuntimeTable,\n ensureArray,\n getComponentsInContainer,\n getComponentsOnSpace,\n} from \"./table-ops\";\nimport { nextRandomInt } from \"./rng\";\nimport type {\n RuntimeComponentLocation,\n RuntimeRngState,\n RuntimeTableRecord,\n SetupBootstrapContainerRef,\n SetupBootstrapDestinationRef,\n SetupBootstrapPerPlayerContainerTemplateRef,\n SetupBootstrapStep,\n} from \"./model\";\nimport type { PlayerId } from \"./per-player\";\nimport { perPlayerGet, perPlayerSet } from \"./per-player\";\n\ntype StatefulBootstrapContext = {\n table: RuntimeTableRecord;\n runtime: {\n rng: RuntimeRngState;\n };\n};\n\ntype ResolvedSharedZoneRef = {\n kind: \"sharedZone\";\n zoneId: string;\n};\n\ntype ResolvedPlayerZoneRef = {\n kind: \"playerZone\";\n zoneId: string;\n playerId: string;\n};\n\ntype ResolvedBoardZoneRef = {\n kind: \"container\";\n boardId: string;\n containerId: string;\n zoneId: string;\n};\n\ntype ResolvedBoardSpaceRef = {\n kind: \"space\";\n boardId: string;\n spaceId: string;\n};\n\ntype ResolvedContainerRef =\n | ResolvedSharedZoneRef\n | ResolvedPlayerZoneRef\n | ResolvedBoardZoneRef\n | ResolvedBoardSpaceRef;\n\nfunction isCardComponent(\n table: RuntimeTableRecord,\n componentId: string,\n): boolean {\n return componentId in table.cards;\n}\n\nfunction resolveRuntimeBoardId(\n table: RuntimeTableRecord,\n boardId: string,\n playerId?: string,\n): string {\n if (playerId) {\n const perPlayerBoardId = `${boardId}:${playerId}`;\n if (table.boards.byId[perPlayerBoardId]) {\n return perPlayerBoardId;\n }\n }\n if (table.boards.byId[boardId]) {\n return boardId;\n }\n throw new Error(`Unknown board '${boardId}'.`);\n}\n\nfunction resolveContainerRef(\n table: RuntimeTableRecord,\n ref: SetupBootstrapContainerRef | SetupBootstrapDestinationRef,\n): ResolvedContainerRef {\n if (ref.type === \"sharedZone\") {\n return {\n kind: \"sharedZone\",\n zoneId: ref.zoneId,\n };\n }\n\n if (ref.type === \"playerZone\") {\n return {\n kind: \"playerZone\",\n zoneId: ref.zoneId,\n playerId: ref.playerId,\n };\n }\n\n if (ref.type === \"sharedBoardContainer\") {\n const board = table.boards.byId[resolveRuntimeBoardId(table, ref.boardId)];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n }\n\n if (ref.type === \"playerBoardContainer\") {\n const board =\n table.boards.byId[\n resolveRuntimeBoardId(table, ref.boardId, ref.playerId)\n ];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}' for '${ref.playerId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n }\n\n if (ref.type === \"sharedBoardSpace\") {\n const board = table.boards.byId[resolveRuntimeBoardId(table, ref.boardId)];\n if (!board) {\n throw new Error(`Unknown board '${ref.boardId}'.`);\n }\n const space = board?.spaces[ref.spaceId];\n if (!space) {\n throw new Error(\n `Unknown board space '${ref.spaceId}' on board '${ref.boardId}'.`,\n );\n }\n return {\n kind: \"space\",\n boardId: board.id,\n spaceId: ref.spaceId,\n };\n }\n\n const board =\n table.boards.byId[resolveRuntimeBoardId(table, ref.boardId, ref.playerId)];\n if (!board) {\n throw new Error(\n `Unknown board '${ref.boardId}' for player '${ref.playerId}'.`,\n );\n }\n const space = board?.spaces[ref.spaceId];\n if (!space) {\n throw new Error(\n `Unknown board space '${ref.spaceId}' on board '${ref.boardId}' for '${ref.playerId}'.`,\n );\n }\n return {\n kind: \"space\",\n boardId: board.id,\n spaceId: ref.spaceId,\n };\n}\n\nfunction readContainerComponents(\n table: RuntimeTableRecord,\n ref: ResolvedContainerRef,\n): string[] {\n if (ref.kind === \"sharedZone\") {\n return [\n ...ensureArray(table.zones.shared[ref.zoneId] ?? table.decks[ref.zoneId]),\n ];\n }\n\n if (ref.kind === \"playerZone\") {\n const zoneValue = table.zones.perPlayer[ref.zoneId];\n const handValue = table.hands[ref.zoneId];\n const seat = ref.playerId as PlayerId;\n return [\n ...ensureArray(\n (zoneValue !== undefined ? perPlayerGet(zoneValue, seat) : undefined) ??\n (handValue !== undefined ? perPlayerGet(handValue, seat) : undefined),\n ),\n ];\n }\n\n if (ref.kind === \"space\") {\n return getComponentsOnSpace(table, ref.boardId, ref.spaceId);\n }\n\n return getComponentsInContainer(table, ref.boardId, ref.containerId);\n}\n\nfunction sharedZoneLocationFor(\n table: RuntimeTableRecord,\n componentId: string,\n zoneId: string,\n position: number,\n): RuntimeComponentLocation {\n if (isCardComponent(table, componentId)) {\n return {\n type: \"InDeck\",\n deckId: zoneId,\n playedBy: null,\n position,\n };\n }\n\n return {\n type: \"InZone\",\n zoneId,\n playedBy: null,\n position,\n };\n}\n\nfunction updateCardVisibilityForZone(\n table: RuntimeTableRecord,\n componentId: string,\n ref: ResolvedContainerRef,\n): void {\n if (!isCardComponent(table, componentId)) {\n return;\n }\n\n if (ref.kind === \"playerZone\") {\n const visibility = table.zones.visibility[ref.zoneId];\n table.ownerOfCard[componentId] = ref.playerId;\n table.visibility[componentId] =\n visibility === \"all\" || visibility === \"public\"\n ? { faceUp: true }\n : { faceUp: false, visibleTo: [ref.playerId] };\n return;\n }\n\n if (ref.kind === \"sharedZone\") {\n const visibility = table.zones.visibility[ref.zoneId];\n if (visibility === \"hidden\" || visibility === \"ownerOnly\") {\n table.visibility[componentId] = { faceUp: false };\n return;\n }\n table.visibility[componentId] = { faceUp: true };\n }\n}\n\nfunction writeContainerComponents(\n table: RuntimeTableRecord,\n ref: ResolvedContainerRef,\n componentIds: readonly string[],\n): void {\n if (ref.kind === \"sharedZone\") {\n componentIds.forEach((componentId) => {\n assertCardAllowedInZone(table, ref.zoneId, componentId);\n });\n table.decks[ref.zoneId] = [...componentIds];\n table.zones.shared[ref.zoneId] = [...componentIds];\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = sharedZoneLocationFor(\n table,\n componentId,\n ref.zoneId,\n index,\n );\n updateCardVisibilityForZone(table, componentId, ref);\n });\n return;\n }\n\n if (ref.kind === \"playerZone\") {\n componentIds.forEach((componentId) => {\n assertCardAllowedInZone(table, ref.zoneId, componentId);\n });\n const seat = ref.playerId as PlayerId;\n const prevHand = table.hands[ref.zoneId] ?? {\n __perPlayer: true as const,\n entries: [],\n };\n table.hands[ref.zoneId] = perPlayerSet(prevHand, seat, [...componentIds]);\n\n const prevZone = table.zones.perPlayer[ref.zoneId] ?? {\n __perPlayer: true as const,\n entries: [],\n };\n table.zones.perPlayer[ref.zoneId] = perPlayerSet(prevZone, seat, [\n ...componentIds,\n ]);\n\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"InHand\",\n handId: ref.zoneId,\n playerId: ref.playerId,\n position: index,\n };\n updateCardVisibilityForZone(table, componentId, ref);\n });\n return;\n }\n\n if (ref.kind === \"space\") {\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId: ref.boardId,\n spaceId: ref.spaceId,\n position: index,\n };\n });\n return;\n }\n\n componentIds.forEach((componentId) => {\n assertCardAllowedInContainer(\n table,\n ref.boardId,\n ref.containerId,\n componentId,\n );\n });\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId: ref.boardId,\n containerId: ref.containerId,\n position: index,\n };\n });\n}\n\nfunction selectMovedComponents(\n current: readonly string[],\n step: Extract<SetupBootstrapStep, { type: \"move\" }>,\n): string[] {\n if (step.componentIds && typeof step.count === \"number\") {\n throw new Error(\n \"Setup bootstrap move step cannot specify both count and componentIds.\",\n );\n }\n\n if (step.componentIds) {\n const missing = step.componentIds.filter(\n (componentId) => !current.includes(componentId),\n );\n if (missing.length > 0) {\n throw new Error(\n `Setup bootstrap move step references missing components: ${missing.join(\", \")}`,\n );\n }\n return [...step.componentIds];\n }\n\n if (typeof step.count === \"number\") {\n return current.slice(0, step.count);\n }\n\n return [...current];\n}\n\nfunction resolveDealTargetRef(\n table: RuntimeTableRecord,\n ref: SetupBootstrapPerPlayerContainerTemplateRef,\n playerId: string,\n): ResolvedContainerRef {\n if (ref.type === \"playerZone\") {\n return {\n kind: \"playerZone\",\n zoneId: ref.zoneId,\n playerId,\n };\n }\n\n const board =\n table.boards.byId[resolveRuntimeBoardId(table, ref.boardId, playerId)];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}' for '${playerId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n}\n\nexport function applySetupBootstrap<State extends StatefulBootstrapContext>(\n state: State,\n steps: readonly SetupBootstrapStep[],\n): State {\n if (steps.length === 0) {\n return state;\n }\n\n const nextTable = cloneRuntimeTable(state.table);\n let nextRng = state.runtime.rng;\n\n for (const step of steps) {\n if (step.type === \"shuffle\") {\n const container = resolveContainerRef(nextTable, step.container);\n const shuffled = readContainerComponents(nextTable, container);\n for (let lastIndex = shuffled.length - 1; lastIndex > 0; lastIndex -= 1) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n nextRng = updatedRng;\n const current = shuffled[lastIndex];\n const swap = shuffled[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `setup shuffle: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${shuffled.length})`,\n );\n }\n shuffled[lastIndex] = swap;\n shuffled[swapIndex] = current;\n }\n writeContainerComponents(nextTable, container, shuffled);\n continue;\n }\n\n if (step.type === \"move\") {\n const from = resolveContainerRef(nextTable, step.from);\n const to = resolveContainerRef(nextTable, step.to);\n const currentFrom = readContainerComponents(nextTable, from);\n const moved = selectMovedComponents(currentFrom, step);\n const remaining = currentFrom.filter(\n (componentId) => !moved.includes(componentId),\n );\n const currentTo = readContainerComponents(nextTable, to);\n\n writeContainerComponents(nextTable, from, remaining);\n writeContainerComponents(nextTable, to, [...currentTo, ...moved]);\n continue;\n }\n\n const from = resolveContainerRef(nextTable, step.from);\n if (from.kind === \"playerZone\") {\n throw new Error(\n \"Setup bootstrap deal steps require a shared source container.\",\n );\n }\n const playerIds = step.playerIds\n ? [...step.playerIds]\n : [...nextTable.playerOrder];\n let sourceComponents = readContainerComponents(nextTable, from);\n\n for (const playerId of playerIds) {\n if (sourceComponents.length === 0) {\n break;\n }\n const dealt = sourceComponents.slice(0, step.count);\n if (dealt.length === 0) {\n break;\n }\n sourceComponents = sourceComponents.slice(dealt.length);\n const target = resolveDealTargetRef(nextTable, step.to, playerId);\n const currentTo = readContainerComponents(nextTable, target);\n writeContainerComponents(nextTable, target, [...currentTo, ...dealt]);\n }\n\n writeContainerComponents(nextTable, from, sourceComponents);\n }\n\n return {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: nextRng,\n },\n };\n}\n","import { safeParseOrThrow } from \"../../parse-utils\";\nimport { applySetupBootstrap } from \"../../setup-bootstrap\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n ExactManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeSetupSelection,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../../model\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport { isPerPlayer } from \"../../per-player\";\nimport { normalizeResult } from \"./runtime-scope\";\nimport { createMutableRandomHelpers } from \"./rng-sampler\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createLifecycleRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type ExactManifest = ExactManifestContractOf<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveSelectedSetup(\n setup: RuntimeSetupSelectionInput<Manifest> | null | undefined,\n ): State[\"runtime\"][\"setup\"] {\n if (!setup) {\n return null;\n }\n const manifestProfile = scope.manifestSetupProfilesById[setup.profileId];\n if (!manifestProfile) {\n throw new Error(`Unknown setup profile '${setup.profileId}'.`);\n }\n const resolvedOptionValues: Record<string, string | null> =\n Object.fromEntries(\n scope.definition.contract.manifest.literals.setupOptionIds.map(\n (optionId: string) => [optionId, null] as const,\n ),\n );\n\n for (const [optionId, choiceId] of Object.entries(\n manifestProfile.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId;\n }\n for (const [optionId, choiceId] of Object.entries(\n setup.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId ?? null;\n }\n\n return {\n profileId: setup.profileId,\n optionValues:\n resolvedOptionValues as RuntimeSetupSelection<Manifest>[\"optionValues\"],\n };\n }\n\n function resolveInitialPhase(setup: State[\"runtime\"][\"setup\"]): PhaseName {\n const setupProfile = setup\n ? scope.reducerSetupProfiles[setup.profileId]\n : null;\n const resolvedPhase = (setupProfile?.initialPhase ??\n scope.defaultInitialPhase ??\n scope.phaseEntries[0]?.[0]) as PhaseName | undefined;\n if (!resolvedPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n if (!scope.definition.phases[resolvedPhase]) {\n throw new Error(`Unknown initial phase '${resolvedPhase}'.`);\n }\n return resolvedPhase;\n }\n\n function applySelectedSetupBootstrap(state: State): State {\n const setup = state.runtime.setup;\n if (!setup) {\n return state;\n }\n\n const bootstrap = scope.reducerSetupProfiles[setup.profileId]?.bootstrap;\n if (!bootstrap || bootstrap.length === 0) {\n return state;\n }\n\n return applySetupBootstrap(state, bootstrap) as State;\n }\n\n function initPhaseState(\n state: State,\n phaseName: PhaseName,\n playerIds: PlayerId[],\n ): State {\n const phase = scope.phaseByName(phaseName);\n const phaseState = phase.initialState\n ? phase.initialState({\n manifest: scope.definition.contract.manifest,\n state,\n playerIds,\n setup: state.runtime.setup,\n })\n : safeParseOrThrow(phase.state, {}, `phase:${phaseName}:initialState`);\n return {\n ...state,\n phase: safeParseOrThrow(\n phase.state,\n phaseState,\n `phase:${phaseName}`,\n ) as State[\"phase\"],\n flow: {\n ...state.flow,\n currentPhase: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n };\n }\n\n function enterPhase({\n state,\n phaseName,\n playerIds,\n event,\n }: {\n state: State;\n phaseName: PhaseName;\n playerIds: PlayerId[];\n event: \"initialize\" | \"transition\";\n }): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n const workingState = initPhaseState(state, phaseName, playerIds);\n const phase = scope.phaseByName(phaseName);\n let nextState: State = workingState;\n const instructions: RuntimeInstructionForState<State>[] = [];\n if (phase.enter) {\n const random = createMutableRandomHelpers(workingState.runtime.rng);\n const entered = normalizeResult(\n phase.enter(\n scope.buildRuntimeArgs(\n workingState,\n {\n event,\n state: scope.toDomainState(workingState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(workingState),\n );\n if (entered.type === \"reject\") {\n throw new Error(\n entered.message ??\n (event === \"initialize\"\n ? `Reducer phase '${phaseName}' rejected during initialization.`\n : `Reducer phase '${phaseName}' rejected during phase initialization.`),\n );\n }\n nextState = {\n ...entered.state,\n runtime: { ...workingState.runtime, rng: random.currentRng() },\n } as State;\n if (entered.instructions) instructions.push(...entered.instructions);\n }\n\n const activeStage = interactions.resolveActiveStage(nextState, phaseName);\n if (activeStage?.stage.onEnter) {\n const random = createMutableRandomHelpers(nextState.runtime.rng);\n const stageEntered = normalizeResult(\n activeStage.stage.onEnter(\n scope.buildRuntimeArgs(\n nextState,\n {\n event,\n state: scope.toDomainState(nextState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(nextState),\n );\n if (stageEntered.type === \"reject\") {\n throw new Error(\n stageEntered.message ??\n (event === \"initialize\"\n ? `Reducer stage '${phaseName}.${activeStage.id}' rejected during initialization.`\n : `Reducer stage '${phaseName}.${activeStage.id}' rejected during stage initialization.`),\n );\n }\n nextState = {\n ...stageEntered.state,\n runtime: { ...nextState.runtime, rng: random.currentRng() },\n } as State;\n if (stageEntered.instructions) {\n instructions.push(...stageEntered.instructions);\n }\n }\n return { state: nextState, instructions };\n }\n\n function initializePhaseResult(\n state: State,\n phaseName: PhaseName,\n ): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n return enterPhase({\n state,\n phaseName,\n playerIds: scope.buildContext(state).playerOrder as PlayerId[],\n event: \"transition\",\n });\n }\n\n function createInitialState({\n table,\n playerIds,\n rngSeed,\n setup,\n }: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n }): { state: State; initialPhase: PhaseName } {\n const tableWithManifestDefaults = applyManifestTableDefaults(\n table,\n playerIds,\n );\n const parsedTable = safeParseOrThrow(\n scope.definition.contract.manifest.tableSchema,\n tableWithManifestDefaults,\n \"table\",\n ) as State[\"table\"];\n const selectedSetup = resolveSelectedSetup(setup);\n const initialSetup =\n selectedSetup as RuntimeSetupSelection<ExactManifest> | null;\n const initialPhase = resolveInitialPhase(selectedSetup);\n const initialQueries = createStateQueries({ table: parsedTable });\n return {\n initialPhase,\n state: {\n table: parsedTable,\n publicState: safeParseOrThrow(\n scope.definition.contract.state.public,\n scope.definition.initial?.public?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"publicState\",\n ) as State[\"publicState\"],\n privateState: Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n scope.definition.contract.state.private,\n scope.definition.initial?.private?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n playerId,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"privateState\"],\n hiddenState: safeParseOrThrow(\n scope.definition.contract.state.hidden,\n scope.definition.initial?.hidden?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"hiddenState\",\n ) as State[\"hiddenState\"],\n flow: {\n currentPhase: initialPhase as State[\"flow\"][\"currentPhase\"],\n turn: 0,\n round: 0,\n activePlayers: [],\n },\n phase: {} as State[\"phase\"],\n runtime: {\n rng: {\n seed: rngSeed ?? null,\n cursor: 0,\n trace: [],\n },\n setup: selectedSetup,\n simultaneous: { current: null },\n lastTransition: null,\n } as State[\"runtime\"],\n },\n };\n }\n\n function applyManifestTableDefaults(\n table: State[\"table\"],\n playerIds: PlayerId[],\n ): State[\"table\"] {\n const manifest = scope.definition.contract.manifest;\n const defaultZones = manifest.defaults.zones(playerIds);\n const tableZones = table.zones ?? {};\n const tableResources = table.resources;\n return {\n ...table,\n playerOrder:\n table.playerOrder && table.playerOrder.length > 0\n ? table.playerOrder\n : playerIds,\n zones: {\n ...defaultZones,\n ...tableZones,\n shared: {\n ...(defaultZones.shared ?? {}),\n ...(tableZones.shared ?? {}),\n },\n perPlayer: {\n ...(defaultZones.perPlayer ?? {}),\n ...(tableZones.perPlayer ?? {}),\n },\n visibility: {\n ...(defaultZones.visibility ?? {}),\n ...(tableZones.visibility ?? {}),\n },\n cardSetIdsByZoneId: {\n ...(defaultZones.cardSetIdsByZoneId ?? {}),\n ...(tableZones.cardSetIdsByZoneId ?? {}),\n },\n },\n decks: {\n ...manifest.defaults.decks(playerIds),\n ...table.decks,\n },\n hands: {\n ...manifest.defaults.hands(playerIds),\n ...table.hands,\n },\n handVisibility: {\n ...manifest.defaults.handVisibility(playerIds),\n ...table.handVisibility,\n },\n ownerOfCard: {\n ...manifest.defaults.ownerOfCard(playerIds),\n ...table.ownerOfCard,\n },\n visibility: {\n ...manifest.defaults.visibility(playerIds),\n ...table.visibility,\n },\n resources:\n isPerPlayer(tableResources) && tableResources.entries.length > 0\n ? tableResources\n : manifest.defaults.resources(playerIds),\n } as State[\"table\"];\n }\n\n function initializeSession(\n input: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n },\n drainInstructions: (\n state: State,\n instructions: RuntimeInstructionForState<State>[],\n ) => State,\n ): SessionState {\n const initial = createInitialState(input);\n const bootstrappedState = applySelectedSetupBootstrap(initial.state);\n const entered = enterPhase({\n state: bootstrappedState,\n phaseName: initial.initialPhase,\n playerIds: input.playerIds,\n event: \"initialize\",\n });\n return scope.toSessionState(\n drainInstructions(entered.state, entered.instructions),\n );\n }\n\n return {\n createInitialState,\n enterPhase,\n initializePhaseResult,\n initializeSession,\n initPhaseState,\n resolveInitialPhase,\n resolveSelectedSetup,\n };\n}\n","import { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { RuntimeTableRecord, TableQueriesOfState } from \"../../model\";\n\ntype ProjectionFxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\nexport type ProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState = ProjectionFxState,\n> = {\n readonly domainState: State;\n readonly q: TableQueriesOfState<State>;\n readonly derived: DerivedResolver;\n readonly fx: ReturnType<typeof createReducerFx<FxState>>;\n readonly eligibleTargets: Map<string, string[]>;\n readonly stageAllowlists: Map<string, Set<string> | null>;\n};\n\nexport function createProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState,\n>(options: {\n domainState: State;\n combinedState: FxState;\n}): ProjectionContext<State, FxState> {\n const q = createStateQueries(options.domainState);\n return {\n domainState: options.domainState,\n q,\n derived: createDerivedResolver(options.domainState, { q }),\n fx: createReducerFx(options.combinedState),\n eligibleTargets: new Map(),\n stageAllowlists: new Map(),\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n InteractionDescriptorShape,\n createInteractionResolver,\n} from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\nimport {\n createProjectionContext,\n type ProjectionContext,\n} from \"./projection-context\";\nimport { collectCardZoneIds } from \"./interaction-collectors\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n simultaneousSubmitInteraction,\n} from \"./simultaneous-player\";\n\ntype ProjectionMode = \"full\" | \"actionsOnly\";\ntype DescriptorRegistry = {\n add(descriptor: InteractionDescriptorShape): string;\n entries(): Record<string, InteractionDescriptorShape>;\n};\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function createDescriptorRegistry(): DescriptorRegistry {\n const byRef: Record<string, InteractionDescriptorShape> = {};\n const byHash = new Map<string, string>();\n return {\n add(descriptor) {\n const fingerprint = stableStringify(descriptor);\n const existing = byHash.get(fingerprint);\n if (existing) return existing;\n const base =\n typeof descriptor.interactionId === \"string\" &&\n descriptor.interactionId.length > 0\n ? descriptor.interactionId\n : \"interaction\";\n const ref = `${base}:${fnv1a64(fingerprint)}`;\n byHash.set(fingerprint, ref);\n byRef[ref] = descriptor;\n return ref;\n },\n entries() {\n return byRef;\n },\n };\n }\n\n function resolveZoneHandlesFor(\n combinedState: State,\n playerId: PlayerId,\n projection: ProjectionContext<DomainState, State>,\n registry: DescriptorRegistry,\n ) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const zoneIds = new Set<string>(scope.zonesForPhase(phaseName).map(String));\n for (const [, interaction] of scope.interactionEntriesForPhase(phaseName)) {\n for (const zoneId of collectCardZoneIds(interaction)) {\n zoneIds.add(String(zoneId));\n }\n }\n const zones = [...zoneIds];\n if (zones.length === 0) return {};\n const q = projection.q;\n const result: Record<\n string,\n {\n cardIds: string[];\n cardViewsById: Record<string, string>;\n playableByCardId: Record<string, string[]>;\n }\n > = {};\n for (const zoneId of zones) {\n const table = combinedState.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n const isPlayerZone =\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {});\n const cardIds = Array.from(\n isPlayerZone\n ? (q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly string[])\n : (q.zone.sharedCards(zoneId as never) as readonly string[]),\n );\n const cardInteractionIds = scope\n .interactionEntriesForPhase(phaseName)\n .filter(([, interaction]) =>\n collectCardZoneIds(interaction).map(String).includes(zoneId),\n )\n .map(([interactionId]) => interactionId);\n const cardViewsById: Record<string, string> = {};\n const playableByCardId: Record<string, string[]> = {};\n for (const cardId of cardIds) {\n cardViewsById[cardId] = JSON.stringify(q.card.get(cardId as never));\n const perCard: string[] = [];\n for (const interactionId of cardInteractionIds) {\n const interaction = scope.findInteractionInPhase(\n phaseName,\n interactionId,\n );\n if (!interaction) continue;\n const cardKey = interactions.findCardInputKeyForZone(\n interaction,\n zoneId,\n );\n const params = cardKey ? { [cardKey]: cardId } : {};\n const decision = interactions.resolveInteractionDecision({\n state: combinedState,\n playerId,\n interactionId,\n params,\n mode: \"card\",\n projection,\n });\n if (!decision.found || !decision.visible) continue;\n const cardDomain = cardKey\n ? decision.descriptor.inputs.find((input) => input.key === cardKey)\n ?.domain\n : undefined;\n const cardTargets =\n cardDomain?.type === \"cardTarget\" &&\n cardDomain.projection === \"resolved\"\n ? cardDomain.eligibleTargets\n : undefined;\n if (cardKey && !cardTargets?.includes(cardId)) {\n continue;\n }\n perCard.push(\n registry.add({\n ...decision.descriptor,\n zoneId,\n }),\n );\n }\n playableByCardId[cardId] = perCard;\n }\n result[zoneId] = {\n cardIds,\n cardViewsById,\n playableByCardId,\n };\n }\n return result;\n }\n\n function resolveCurrentStageFor(\n combinedState: State,\n projection?: ProjectionContext<DomainState, State>,\n ): string {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n return (\n interactions.resolveActiveStage(combinedState, phaseName, projection)\n ?.id ?? phaseName\n );\n }\n\n function resolveStageSeatsFor(state: SessionState): string[] {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (isSimultaneousPhase(phase)) {\n return resolveSimultaneousActors(scope, combinedState, phase).map(String);\n }\n return [...state.domain.flow.activePlayers];\n }\n\n function resolveSimultaneousPhaseFor(state: SessionState) {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) return null;\n const current = state.runtime.simultaneous?.current;\n if (!current || current.phaseName !== phaseName) return null;\n const submit = simultaneousSubmitInteraction(phase);\n if (!submit) return null;\n const actorIds = current.actors.map(String);\n const sealedPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] !== undefined,\n );\n const pendingPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] === undefined,\n );\n return {\n phaseName: String(current.phaseName),\n interactionId: SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n actorIds,\n sealedPlayerIds,\n pendingPlayerIds,\n };\n }\n\n function resolveViewFor(\n combinedState: State,\n playerId: PlayerId,\n viewId: string,\n projection: ProjectionContext<DomainState, State>,\n ): unknown {\n const views = scope.definition.views;\n const view = views?.[viewId as keyof typeof views];\n if (!view) {\n return null;\n }\n const viewArgs = {\n ...scope.buildContext(combinedState),\n ...scope.runtimeHelpers,\n fx: projection.fx,\n q: projection.q,\n derived: projection.derived,\n state: projection.domainState,\n playerId,\n } as Parameters<typeof view.project>[0];\n return view.project(viewArgs);\n }\n\n function projectSeatsDynamic({\n state,\n playerIds,\n viewId = \"player\",\n projectionMode = \"full\",\n }: {\n state: SessionState;\n playerIds: PlayerId[];\n viewId?: string;\n projectionMode?: ProjectionMode;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n const registry = createDescriptorRegistry();\n type SeatProjection = {\n view?: ReturnType<typeof resolveViewFor>;\n availableInteractionRefs: string[];\n zones?: ReturnType<typeof resolveZoneHandlesFor>;\n };\n const seats: Record<string, SeatProjection> = {};\n for (const playerId of playerIds) {\n const availableInteractionRefs = interactions\n .resolveAvailableInteractionsFor(combinedState, playerId, {\n projection,\n })\n .map((descriptor) => registry.add(descriptor));\n seats[playerId as unknown as string] = {\n ...(projectionMode === \"full\"\n ? {\n view: resolveViewFor(combinedState, playerId, viewId, projection),\n zones: resolveZoneHandlesFor(\n combinedState,\n playerId,\n projection,\n registry,\n ),\n }\n : {}),\n availableInteractionRefs,\n };\n }\n return {\n currentStage: resolveCurrentStageFor(combinedState, projection),\n stageSeats: resolveStageSeatsFor(state),\n simultaneousPhase: resolveSimultaneousPhaseFor(state),\n interactionsByRef: registry.entries(),\n seats,\n };\n }\n\n function projectSeatViewDynamic({\n state,\n playerId,\n viewId = \"player\",\n }: {\n state: SessionState;\n playerId: PlayerId;\n viewId?: string;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n return resolveViewFor(combinedState, playerId, viewId, projection);\n }\n\n return {\n projectSeatsDynamic,\n projectSeatViewDynamic,\n resolveCurrentStageFor,\n resolveStageSeatsFor,\n resolveViewFor,\n resolveZoneHandlesFor,\n };\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableStringify(entry)).join(\",\")}]`;\n }\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n .join(\",\")}}`;\n}\n\nfunction fnv1a64(value: string): string {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= BigInt(value.charCodeAt(index));\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash.toString(16).padStart(16, \"0\");\n}\n","import type {\n ManifestContract,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeTableRecord,\n StaticViewQueries,\n ViewMapOf,\n} from \"../../model\";\nimport type { TrustedRuntimeScope } from \"./runtime-scope\";\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return `{${entries\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`)\n .join(\",\")}}`;\n}\n\nfunction hashProjection(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\");\n}\n\nfunction readManifestVersion(manifest: unknown): string {\n const m = manifest as { version?: unknown; literals?: unknown };\n if (typeof m.version === \"string\" && m.version.length > 0) {\n return m.version;\n }\n if (m.literals && typeof m.literals === \"object\") {\n return hashProjection(stableStringify(m.literals));\n }\n return \"0\";\n}\n\nfunction createStaticViewQueries<\n Manifest extends ManifestContract<RuntimeTableRecord>,\n>(manifest: Manifest): StaticViewQueries<Manifest> {\n const staticBoards = manifest.staticBoards ?? {\n byId: {},\n hex: {},\n square: {},\n };\n const requireBoard = (\n boards: Record<string, unknown>,\n boardId: string,\n layout: \"board\" | \"hex\" | \"square\",\n ) => {\n const board = boards[boardId];\n if (!board) {\n throw new Error(`Unknown static ${layout} board '${boardId}'.`);\n }\n return board;\n };\n\n return {\n board: {\n get: (boardId) =>\n requireBoard(\n staticBoards.byId as Record<string, unknown>,\n boardId,\n \"board\",\n ) as never,\n hex: (boardId) =>\n requireBoard(\n staticBoards.hex as Record<string, unknown>,\n boardId,\n \"hex\",\n ) as never,\n square: (boardId) =>\n requireBoard(\n staticBoards.square as Record<string, unknown>,\n boardId,\n \"square\",\n ) as never,\n },\n };\n}\n\nexport function createStaticProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n return {\n projectStatic(): {\n view: unknown;\n hash: string;\n manifestVersion: string;\n } | null {\n const staticView = scope.definition.staticView;\n if (!staticView) return null;\n const manifest = scope.definition.contract.manifest;\n const view = staticView.project({\n manifest,\n q: createStaticViewQueries(manifest),\n });\n const serialized = stableStringify(view);\n return {\n view: JSON.parse(serialized) as unknown,\n hash: hashProjection(serialized),\n manifestVersion: readManifestVersion(manifest),\n };\n },\n };\n}\n","import type { TrustedReducerBundle } from \"./types\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../model\";\nimport { createTrustedInstructionRunner } from \"./trusted/instruction-runner\";\nimport { createInteractionResolver } from \"./trusted/interaction-resolver\";\nimport { createLifecycleRunner } from \"./trusted/lifecycle-runner\";\nimport { createProjectionBuilder } from \"./trusted/projection-builder\";\nimport { createTrustedRuntimeScope } from \"./trusted/runtime-scope\";\nimport { createStaticProjectionBuilder } from \"./trusted/static-projection\";\n\nexport function createTrustedReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): TrustedReducerBundle<Contract, Definitions, Views> {\n const scope = createTrustedRuntimeScope(definition);\n const interactions = createInteractionResolver(scope);\n const lifecycle = createLifecycleRunner(scope, interactions);\n const instructions = createTrustedInstructionRunner(\n scope,\n interactions,\n lifecycle,\n );\n const staticProjection = createStaticProjectionBuilder(scope);\n const projection = createProjectionBuilder(scope, interactions);\n\n return {\n async initialize(input) {\n return lifecycle.initializeSession(input, instructions.drainInstructions);\n },\n async initializePhase({ state, to }) {\n const initialized = lifecycle.initializePhaseResult(\n scope.toCombinedState(state),\n to,\n );\n return scope.toSessionState(\n instructions.drainInstructions(\n initialized.state,\n initialized.instructions,\n ),\n );\n },\n async validateInput({ state, input }) {\n return interactions.validateClientInput(\n scope.toCombinedState(state),\n input,\n );\n },\n async reduce({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n return reject;\n }\n const result = instructions.reduceOnce(combinedState, input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n instructions: result.instructions ?? [],\n };\n },\n async dispatch({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n return reject;\n }\n const result = instructions.dispatch(combinedState, input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n trace: result.trace,\n };\n },\n projectStatic() {\n return staticProjection.projectStatic();\n },\n projectSeatsDynamic(input) {\n return projection.projectSeatsDynamic(input);\n },\n projectSeatViewDynamic(input) {\n return projection.projectSeatViewDynamic(input);\n },\n };\n}\n","import { z } from \"zod\";\nimport * as ContractZod from \"../../generated/reducer-contract/zod\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport type {\n BaseGameSessionOfContract,\n GameStateOf,\n HiddenSchemaOfContract,\n ManifestContractOf,\n ManifestOf,\n PhaseMapOf,\n PhaseNameOfContract,\n PlayerIdOfState,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n RuntimeSetupSelection,\n TableOfManifest,\n ViewMapOf,\n} from \"../model\";\nimport type { IngressRuntimeCodec, RawReducerSessionState } from \"./raw-types\";\nimport { createRuntimeInputParser } from \"./input-codec\";\nimport { collectIngressPhaseSchemas } from \"./phase-schemas\";\n\nconst runtimePayloadSchema: z.ZodType<unknown> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(runtimePayloadSchema),\n z.record(z.string(), runtimePayloadSchema),\n ]),\n);\nconst runtimeRecordSchema = z.record(z.string(), runtimePayloadSchema);\nconst perPlayerSchema = <Value extends z.ZodTypeAny>(valueSchema: Value) =>\n z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([z.string(), valueSchema])),\n })\n .strict();\nconst runtimeComponentLocationSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"Detached\") }).strict(),\n z\n .object({\n type: z.literal(\"InDeck\"),\n deckId: z.string(),\n playedBy: z.string().nullable(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InHand\"),\n handId: z.string(),\n playerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: z.string().nullable().optional(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnSpace\"),\n boardId: z.string(),\n spaceId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InContainer\"),\n boardId: z.string(),\n containerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnEdge\"),\n boardId: z.string(),\n edgeId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnVertex\"),\n boardId: z.string(),\n vertexId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InSlot\"),\n host: z.union([\n z.object({ kind: z.literal(\"piece\"), id: z.string() }).strict(),\n z.object({ kind: z.literal(\"die\"), id: z.string() }).strict(),\n ]),\n slotId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n]);\nconst currentRuntimeTableSchema = z\n .object({\n playerOrder: z.array(z.string()),\n zones: z\n .object({\n shared: z.record(z.string(), z.array(z.string())),\n perPlayer: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n visibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cardSetIdsByZoneId: z\n .record(z.string(), z.array(z.string()))\n .optional(),\n })\n .strict(),\n decks: z.record(z.string(), z.array(z.string())),\n hands: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n handVisibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n cardSetId: z.string(),\n cardType: z.string(),\n name: z.string().optional(),\n text: z.string().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n pieces: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n pieceTypeId: z.string(),\n pieceName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n componentLocations: z.record(z.string(), runtimeComponentLocationSchema),\n ownerOfCard: z.record(z.string(), z.string().nullable()),\n visibility: z.record(\n z.string(),\n z\n .object({\n faceUp: z.boolean(),\n visibleTo: z.array(z.string()).nullable().optional(),\n })\n .strict(),\n ),\n resources: perPlayerSchema(runtimeRecordSchema),\n boards: z\n .object({\n byId: z.record(z.string(), runtimeRecordSchema),\n hex: z.record(z.string(), runtimeRecordSchema),\n square: z.record(z.string(), runtimeRecordSchema),\n network: z.record(z.string(), runtimeRecordSchema).optional(),\n track: z.record(z.string(), runtimeRecordSchema).optional(),\n })\n .strict(),\n dice: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n dieTypeId: z.string(),\n dieName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n sides: z.number().int(),\n value: z.number().int().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n })\n .strict();\n\nexport function createIngressRuntimeCodec<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n ManifestContractOf<Contract>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseNameOfContract<Contract>\n> {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n type DomainState = GameStateOf<Definition>;\n type State = BaseGameSessionOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNameOfContract<Contract>;\n type ReturnType = IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n Manifest,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseName\n >;\n type PlayerId = PlayerIdOfState<DomainState>;\n\n const { phaseNameSchema } = collectIngressPhaseSchemas(definition);\n const playerIdSchema = definition.contract.manifest.ids\n .playerId as z.ZodType<PlayerId>;\n\n const flowSchema = z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n });\n const runtimeStateSchema = z.object({\n rng: z.object({\n seed: z.number().int().nullable(),\n cursor: z.number().int(),\n trace: z.array(z.string()),\n }),\n setup: z\n .object({\n profileId: z.string(),\n optionValues: z.record(z.string(), z.string().nullable()),\n })\n .nullable(),\n simultaneous: z.object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: runtimePayloadSchema,\n }),\n ),\n })\n .nullable(),\n }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable(),\n });\n const parseRuntimeInput = createRuntimeInputParser(playerIdSchema);\n\n // The return type uses branded/mapped types derived from the contract generic.\n // TypeScript cannot verify that plain objects satisfy these deep mapped types,\n // but the runtime Zod parsing ensures correctness.\n return {\n defaultRuntimeState(\n seed: number | null = null,\n setup: RuntimeSetupSelection<Manifest> | null = null,\n ) {\n const runtimeState: State[\"runtime\"] = {\n rng: {\n seed,\n cursor: 0,\n trace: [],\n },\n setup,\n simultaneous: { current: null },\n lastTransition: null,\n };\n return runtimeState;\n },\n parseInitialTable(rawTable: unknown, playerIds: string[] | undefined) {\n const table = safeParseOrThrow(\n currentRuntimeTableSchema,\n rawTable,\n \"table\",\n ) as unknown as TableOfManifest<ManifestOf<Contract>>;\n return {\n table,\n playerIds: safeParseOrThrow(\n z.array(playerIdSchema),\n playerIds && playerIds.length > 0 ? playerIds : table.playerOrder,\n \"table.playerOrder\",\n ),\n };\n },\n parseState(rawState: RawReducerSessionState) {\n const envelope = safeParseOrThrow(\n ContractZod.ReducerSessionStateSchema,\n rawState,\n \"state\",\n );\n const table = safeParseOrThrow(\n definition.contract.manifest.tableSchema,\n envelope.domain.table,\n \"domain.table\",\n );\n const playerIds = [...table.playerOrder] as PlayerId[];\n const privateState = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n definition.contract.state.private,\n envelope.domain.privateState[playerId] ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"domain\"][\"privateState\"];\n const flow = safeParseOrThrow(\n flowSchema,\n {\n currentPhase: envelope.domain.flow.currentPhase,\n turn: envelope.domain.flow.turn,\n round: envelope.domain.flow.round,\n activePlayers: envelope.domain.flow.activePlayers,\n },\n \"domain.flow\",\n );\n const currentPhaseDefinition = definition.phases[flow.currentPhase];\n if (!currentPhaseDefinition) {\n throw new Error(`Unknown reducer phase '${flow.currentPhase}'.`);\n }\n const rawPhaseState = envelope.domain.phase;\n const phase = safeParseOrThrow(\n currentPhaseDefinition.state,\n rawPhaseState ?? {},\n `phase:${flow.currentPhase}`,\n ) as State[\"domain\"][\"phase\"];\n\n const parsedState: State = {\n domain: {\n table,\n publicState: safeParseOrThrow(\n definition.contract.state.public,\n envelope.domain.publicState,\n \"domain.publicState\",\n ) as State[\"domain\"][\"publicState\"],\n privateState,\n hiddenState: safeParseOrThrow(\n definition.contract.state.hidden,\n envelope.domain.hiddenState,\n \"domain.hiddenState\",\n ) as State[\"domain\"][\"hiddenState\"],\n flow,\n phase,\n },\n runtime: safeParseOrThrow(\n runtimeStateSchema,\n envelope.runtime,\n \"runtime\",\n ) as unknown as State[\"runtime\"],\n };\n return parsedState;\n },\n serializeState(state: State) {\n return {\n domain: { ...state.domain },\n runtime: state.runtime,\n } as RawReducerSessionState;\n },\n parsePlayerId(rawPlayerId: string) {\n return safeParseOrThrow(playerIdSchema, rawPlayerId, \"playerId\");\n },\n parseInput(rawInput: unknown) {\n return parseRuntimeInput(rawInput);\n },\n } as unknown as ReturnType;\n}\n","import { z } from \"zod\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport type { RawRuntimeInput } from \"./raw-types\";\nimport { runtimePayloadSchema } from \"./runtime-payload\";\n\nexport function createRuntimeInputParser<PlayerId extends string>(\n playerIdSchema: z.ZodType<PlayerId>,\n): (rawInput: unknown) => RawRuntimeInput {\n const rawRuntimeInputSchema = z.object({\n kind: z.literal(\"interaction\"),\n playerId: playerIdSchema,\n interactionId: z.string(),\n params: runtimePayloadSchema.default({}),\n });\n\n return (rawInput: unknown) =>\n safeParseOrThrow(rawRuntimeInputSchema, rawInput, \"input\");\n}\n","import { z } from \"zod\";\nimport type { RuntimePayload } from \"../model\";\n\nexport const runtimePayloadSchema: z.ZodType<RuntimePayload> = z.lazy(() =>\n z.union([\n z.boolean(),\n z.number(),\n z.string(),\n z.null(),\n z.array(runtimePayloadSchema),\n z.record(z.string(), z.union([runtimePayloadSchema, z.undefined()])),\n ]),\n);\n","import { z } from \"zod\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewMapOf,\n} from \"../model\";\n\nfunction createPhaseNameSchema<PhaseName extends string>(\n phaseNames: readonly PhaseName[],\n): z.ZodType<PhaseName> {\n const allowed = new Set(phaseNames);\n return z.custom<PhaseName>(\n (value: unknown) =>\n typeof value === \"string\" && allowed.has(value as PhaseName),\n { message: \"Invalid phase name\" },\n );\n}\n\nexport function collectIngressPhaseSchemas<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): {\n phaseEntries: Array<\n [\n PhaseNameOfContract<Contract>,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n phaseNames: PhaseNameOfContract<Contract>[];\n phaseNameSchema: z.ZodType<PhaseNameOfContract<Contract>>;\n} {\n type PhaseName = PhaseNameOfContract<Contract>;\n const phaseEntries = Object.entries(definition.phases) as Array<\n [\n PhaseName,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n const phaseNames = phaseEntries.map(([phaseName]) => phaseName);\n return {\n phaseEntries,\n phaseNames,\n phaseNameSchema: createPhaseNameSchema(phaseNames),\n };\n}\n","// @generated by packages/reducer-contract/scripts/generate-ts.mjs\n// DO NOT EDIT BY HAND. Edit schema/reducer-runtime.schema.json and rerun `pnpm generate`.\n\n/* eslint-disable */\nimport type * as Wire from \"./wire\";\n\n/**\n * Typed effect constructors. Authors MUST go through these; hand-constructing\n * Wire.Effect objects is banned by convention because it's how wire drift\n * re-enters the codebase.\n *\n * The `effectId` is minted by the runtime (see createEffectIdMinter below),\n * not by the author. Each builder returns a `PendingEffect` that carries\n * the optional continuation; the reducer bundle's accept materializer splits\n * pending effects into the wire's `effects[]` + `continuations` map.\n */\n\nexport type PendingEffect = Wire.Effect & {\n readonly __continuation?: Wire.ContinuationToken;\n};\n\nexport type EffectIdMinter = () => Wire.EffectId;\n\n/**\n * Produces sequential, deterministic effect ids scoped to a single accept\n * payload: \"ef0\", \"ef1\", ... . Uniqueness only needs to be local to the\n * payload because the host consumes and discards them per dispatch.\n */\nexport function createEffectIdMinter(): EffectIdMinter {\n let i = 0;\n return () => `ef${i++}` as Wire.EffectId;\n}\n\nexport type EffectBuilders = {\n transition(args: { to: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n rollDie(args: { dieId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n shuffleSharedZone(args: { zoneId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n shufflePlayerZone(args: { zoneId: string; playerId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n};\n\nexport function createEffectBuilders(mint: EffectIdMinter): EffectBuilders {\n return {\n transition(args, continuation) {\n const effect = { effectId: mint(), type: \"transition\" as const, to: args.to };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n rollDie(args, continuation) {\n const effect = { effectId: mint(), type: \"rollDie\" as const, dieId: args.dieId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n shuffleSharedZone(args, continuation) {\n const effect = { effectId: mint(), type: \"shuffleSharedZone\" as const, zoneId: args.zoneId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n shufflePlayerZone(args, continuation) {\n const effect = { effectId: mint(), type: \"shufflePlayerZone\" as const, zoneId: args.zoneId, playerId: args.playerId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n };\n}\n\n/**\n * Takes a list of PendingEffects and splits them into the canonical wire\n * shape: `effects[]` (stripped of `__continuation`) + `continuations` map\n * keyed by effectId. Use at the boundary where reduce/dispatch results leave\n * author code and enter the wire.\n */\nexport function materializeAccept(pending: ReadonlyArray<PendingEffect>): {\n effects: Wire.Effect[];\n continuations: Wire.ContinuationMap;\n} {\n const effects: Wire.Effect[] = [];\n const continuations: Wire.ContinuationMap = {};\n for (const pe of pending) {\n const { __continuation, ...effect } = pe as PendingEffect & { __continuation?: Wire.ContinuationToken };\n effects.push(effect as Wire.Effect);\n if (__continuation !== undefined) {\n continuations[(effect as Wire.Effect).effectId] = __continuation;\n }\n }\n return { effects, continuations };\n}\n","import { createTrustedReducerBundle } from \"./trusted-bundle\";\nimport { createIngressRuntimeCodec } from \"../ingress/runtime-codec\";\nimport * as Builders from \"../../generated/reducer-contract/builders\";\nimport { REDUCER_CONTRACT_VERSION } from \"../../generated/reducer-contract/version\";\nimport * as Wire from \"../../generated/reducer-contract/wire\";\nimport type {\n ManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ReducerReject,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../model\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\nimport type { DispatchTraceEntry } from \"../core/types\";\nimport type {\n UntrustedReducerSessionState,\n UntrustedRuntimeInput,\n UntrustedRuntimeTable,\n} from \"../ingress/types\";\nimport type { ReducerBundle } from \"./types\";\n\n/**\n * Pass the wire-validated `interaction` input through to the trusted\n * bundle. Both layers speak the same single-kind shape now — the routing\n * here only normalizes `params` to a concrete object when the caller\n * elided it.\n *\n * The wire schema admits exactly one player-originated variant\n * (`{ kind: \"interaction\" }`) and the engine's `TrustedRuntimeInput`\n * uses the same discriminator, so this is a straight pass-through.\n * Continuation inputs are engine-internal and never traverse this routing.\n */\nfunction routeInteraction(input: UntrustedRuntimeInput): {\n kind: \"interaction\";\n playerId: string;\n interactionId: string;\n params: unknown;\n} {\n return {\n kind: \"interaction\",\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.params,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Wire-protocol adapter.\n//\n// The trusted bundle (see ./trusted-bundle.ts) keeps the SDK reducer runtime\n// instruction shape at reducer boundaries where:\n// - Results discriminate on `type: \"accept\" | \"reject\"`.\n// - Reducer-returned instructions carry `kind`.\n// - Dispatch traces use normalized runtime instructions.\n// The generated reducer-contract (`packages/reducer-contract`) defines the\n// canonical wire shape consumed by the Kotlin host:\n// - Results discriminate on `kind: \"accept\" | \"reject\"`.\n// - Each effect carries an `effectId`, never an inline `resume`.\n// - Continuations live in a sibling `continuations: Record<effectId, ...>`\n// map on reduce results, or on the matching `appliedEffect` trace entry\n// for dispatch results.\n// - Each DispatchTrace entry discriminates on `kind` (no `type` field).\n//\n// This module is the ONLY place in the SDK reducer that converts runtime\n// instructions into wire effects. It does so through\n// `@dreamboard-games/sdk/infrastructure/reducer-bundle-abi` (the single source of truth for\n// wire-effect construction) rather than hand-rolling the mapping locally —\n// hand-rolled mappings are how wire drift sneaks in (see the catan\n// rollDie regression).\n// ---------------------------------------------------------------------------\n\ntype InternalInstruction<State> = RuntimeInstructionForState<State>;\n\nfunction extractContinuation<State>(\n instruction: InternalInstruction<State>,\n): Wire.ContinuationToken | undefined {\n const continuation = (\n instruction as {\n continuation?: Wire.ContinuationToken | null | undefined;\n }\n ).continuation;\n if (continuation === undefined || continuation === null) return undefined;\n return {\n id: continuation.id,\n data: continuation.data as Wire.JsonValue,\n };\n}\n\n/**\n * Route one engine-internal effect through the generated builder that owns\n * its wire shape. The builder mints the effectId, enforces the correct\n * required/optional key set, and attaches the continuation privately via\n * `__continuation` so `materializeAccept` can split it out at the wire\n * boundary.\n *\n * Why dispatch through the builder instead of constructing `Wire.Effect`\n * directly? The schema + builders are the SSOT for wire shapes. Duplicating\n * that knowledge here once caused the catan rollDie bug; never again.\n */\nfunction toPendingEffect<State>(\n instruction: InternalInstruction<State>,\n fx: Builders.EffectBuilders,\n): Builders.PendingEffect {\n const continuation = extractContinuation<State>(instruction);\n switch (instruction.kind) {\n case \"flow.transition\":\n return fx.transition({ to: instruction.to as string }, continuation);\n case \"engine.rollDie\":\n return fx.rollDie(\n { dieId: (instruction as { dieId: string }).dieId },\n continuation,\n );\n case \"engine.shuffleSharedZone\":\n return fx.shuffleSharedZone(\n { zoneId: (instruction as { zoneId: string }).zoneId as string },\n continuation,\n );\n case \"engine.shufflePlayerZone\":\n return fx.shufflePlayerZone(\n {\n zoneId: (instruction as { zoneId: string }).zoneId as string,\n playerId: (instruction as { playerId: string }).playerId as string,\n },\n continuation,\n );\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `toPendingEffect: unsupported instruction kind '${(_exhaustive as { kind: string }).kind}'.`,\n );\n }\n }\n}\n\nfunction toWireReduceResult<State>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n instructions?: InternalInstruction<State>[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.ReduceResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const pending = (result.instructions ?? []).map((instruction) =>\n toPendingEffect<State>(instruction, fx),\n );\n const { effects, continuations } = Builders.materializeAccept(pending);\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n effects,\n continuations,\n };\n}\n\nfunction toWireDispatchResult<State, PlayerId extends string>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n trace: DispatchTraceEntry<State, PlayerId>[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.DispatchResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const trace: Wire.DispatchTrace[] = [];\n for (const entry of result.trace) {\n switch (entry.type) {\n case \"acceptedClientInput\": {\n const engineInput = entry.input as {\n kind: \"interaction\" | \"continuation\";\n playerId?: string;\n interactionId?: string;\n params?: Wire.JsonValue;\n };\n let wireInput: Wire.GameInput;\n if (engineInput.kind === \"interaction\") {\n wireInput = {\n kind: \"interaction\",\n playerId: engineInput.playerId ?? \"\",\n interactionId: engineInput.interactionId ?? \"\",\n params: engineInput.params ?? {},\n };\n } else {\n // Continuation inputs are engine-internal and shouldn't appear in\n // client-addressed dispatch traces; synthesize a best-effort wire\n // shape so the trace stays well-typed.\n wireInput = {\n kind: \"interaction\",\n playerId: \"\",\n interactionId: \"\",\n params: {},\n };\n }\n trace.push({\n kind: \"acceptedClientInput\",\n input: wireInput,\n });\n break;\n }\n case \"appliedInstruction\": {\n const pending = toPendingEffect<State>(\n entry.instruction as InternalInstruction<State>,\n fx,\n );\n const { effects, continuations } = Builders.materializeAccept([\n pending,\n ]);\n const [wireEffect] = effects;\n if (wireEffect === undefined) {\n throw new Error(\n \"materializeAccept returned no effects for a single pending effect\",\n );\n }\n const continuation = continuations[wireEffect.effectId];\n trace.push(\n continuation === undefined\n ? { kind: \"appliedEffect\", effect: wireEffect }\n : { kind: \"appliedEffect\", effect: wireEffect, continuation },\n );\n break;\n }\n case \"rngConsumption\":\n trace.push({\n kind: \"rngConsumption\",\n operation: entry.operation,\n traceEntry: entry.traceEntry,\n });\n break;\n default: {\n const _exhaustive: never = entry;\n throw new Error(\n `toWireDispatchResult: unknown trace entry type '${(_exhaustive as { type: string }).type}'.`,\n );\n }\n }\n }\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n trace,\n };\n}\n\nfunction toWireDispatchTrace<State, PlayerId extends string>(result: {\n type: \"accept\";\n state: State;\n trace: DispatchTraceEntry<State, PlayerId>[];\n}): Wire.DispatchTrace[] {\n return (\n toWireDispatchResult(result, (state) => state as never) as {\n kind: \"accept\";\n trace: Wire.DispatchTrace[];\n }\n ).trace;\n}\n\nexport function createReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ReducerBundle {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n const trustedBundle = createTrustedReducerBundle(definition);\n const codec = createIngressRuntimeCodec(definition);\n type Manifest = ManifestContractOf<Definition[\"contract\"]>;\n type TrustedState = Awaited<ReturnType<typeof trustedBundle.initialize>>;\n\n function parseTrustedState(state: unknown): TrustedState {\n return codec.parseState(\n state as UntrustedReducerSessionState,\n ) as TrustedState;\n }\n\n function parseRuntimePlayerId(playerId: unknown) {\n if (typeof playerId !== \"string\") {\n throw new Error(\"Expected a string playerId.\");\n }\n return codec.parsePlayerId(playerId);\n }\n\n const bundle = {\n ...trustedBundle,\n // Top-level protocol version. The Kotlin ReducerBundleAdapter reads this\n // on bundle load and rejects bundles whose major version does not match\n // the host's compiled-in REDUCER_CONTRACT_VERSION.\n reducerContractVersion: REDUCER_CONTRACT_VERSION,\n async initialize({\n table,\n playerIds,\n rngSeed,\n setup,\n }: Wire.InitializeRequest) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n return codec.serializeState(\n await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n }),\n );\n },\n async initializePhase({ state, to }: Wire.InitializePhaseRequest) {\n const decodedState = parseTrustedState(state);\n return codec.serializeState(\n await trustedBundle.initializePhase({\n state: decodedState,\n to: to as never,\n }),\n );\n },\n async validateInput({ state, input }: Wire.ValidateInputRequest) {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n return trustedBundle.validateInput({\n state: parseTrustedState(state),\n input: routed as never,\n });\n },\n async reduce({\n state,\n input,\n }: Wire.ReduceRequest): Promise<Wire.ReduceResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.reduce({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireReduceResult<TrustedState>(result as never, (nextState) =>\n codec.serializeState(nextState as never),\n );\n },\n async dispatch({\n state,\n input,\n }: Wire.DispatchRequest): Promise<Wire.DispatchResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireDispatchResult(result as never, (nextState: TrustedState) =>\n codec.serializeState(nextState as never),\n );\n },\n /**\n * Wire-side passthrough for the session-scoped static projection. The\n * host calls this once per reducer session, caches the payload, and\n * thereafter merges it back into every seat view on the client. Returns\n * `null` when `defineGame` did not declare a `staticView`.\n */\n projectStatic() {\n return trustedBundle.projectStatic() as Wire.BoardStaticProjection | null;\n },\n /**\n * Wire-side passthrough for per-tick seat projection. The seat views carry\n * only the fields produced by `defineView`; static topology, when present,\n * was served once via `projectStatic` and is re-merged on the client.\n */\n projectSeatsDynamic({\n state,\n playerIds,\n viewId = \"player\",\n }: Wire.ProjectSeatsDynamicRequest) {\n const parsedState = parseTrustedState(state);\n const parsedPlayerIds = playerIds.map((pid) => codec.parsePlayerId(pid));\n return trustedBundle.projectSeatsDynamic({\n state: parsedState,\n playerIds: parsedPlayerIds,\n viewId,\n }) as Wire.SeatProjectionBundle;\n },\n projectSeatViewDynamic({ state, playerId, viewId = \"player\" }) {\n const parsedState = parseTrustedState(state);\n return trustedBundle.projectSeatViewDynamic({\n state: parsedState,\n playerId: parseRuntimePlayerId(playerId),\n viewId,\n });\n },\n createInProcessRuntime() {\n let state: TrustedState | null = null;\n const requireState = () => {\n if (!state) {\n throw new Error(\"In-process reducer runtime has no state.\");\n }\n return state;\n };\n return {\n async initialize({ table, playerIds, rngSeed, setup }) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n state = await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n });\n },\n hydrate({ state: snapshot }) {\n state = parseTrustedState(snapshot);\n },\n async dispatch({ input }) {\n const validatedWire = codec.parseInput(\n input as UntrustedRuntimeInput,\n );\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: requireState(),\n input: routed as never,\n });\n if (result.type === \"reject\") {\n return {\n kind: \"reject\" as const,\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n state = result.state;\n return {\n kind: \"accept\" as const,\n state: codec.serializeState(state as never),\n trace: toWireDispatchTrace(result as never),\n };\n },\n projectSeatViewDynamic({ playerId, viewId = \"player\" }) {\n return trustedBundle.projectSeatViewDynamic({\n state: requireState(),\n playerId: parseRuntimePlayerId(playerId),\n viewId,\n });\n },\n projectSeatsDynamic({ playerIds, viewId = \"player\" }) {\n const parsedPlayerIds = playerIds.map((pid) =>\n parseRuntimePlayerId(pid),\n );\n return trustedBundle.projectSeatsDynamic({\n state: requireState(),\n playerIds: parsedPlayerIds,\n viewId,\n });\n },\n snapshot() {\n return codec.serializeState(requireState());\n },\n unsafeState() {\n return requireState();\n },\n };\n },\n } satisfies ReducerBundle;\n\n return bundle;\n}\n","import { z } from \"zod\";\nimport { collectReducerDefinitionIndex } from \"./definition-index\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"./model\";\n\nexport type ClientParamSchema = {\n safeParse: (value: unknown) =>\n | { success: true; data: Record<string, unknown> }\n | {\n success: false;\n error: { issues: Array<{ path: PropertyKey[]; message: string }> };\n };\n};\n\nexport type ClientParamSchemasByPhase = Readonly<\n Record<string, Readonly<Record<string, ClientParamSchema>>>\n>;\n\nfunction schemaForCollectors(\n collectors: Record<string, InputCollector>,\n): ClientParamSchema {\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n const schema = collector.schema as z.ZodTypeAny;\n shape[key] =\n \"defaultValue\" in collector\n ? schema.default(collector.defaultValue)\n : schema;\n }\n return z.object(shape) as unknown as ClientParamSchema;\n}\n\nexport function createClientParamSchemasByPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ClientParamSchemasByPhase {\n const index = collectReducerDefinitionIndex(definition);\n const out: Record<string, Record<string, ClientParamSchema>> = {};\n for (const phaseIndex of index.phasesByName.values()) {\n const phaseSchemas: Record<string, ClientParamSchema> = {};\n for (const [id, interaction] of phaseIndex.interactions) {\n phaseSchemas[id] =\n interaction.paramsSchema ?? schemaForCollectors(interaction.inputs);\n }\n out[String(phaseIndex.phaseName)] = phaseSchemas;\n }\n return out;\n}\n","import type {\n CardIdOfManifest,\n DieIdOfManifest,\n GeneratedManifestContractLike,\n PieceIdOfManifest,\n PlayerIdOfManifest,\n SetupBootstrapContainerRef,\n SetupBootstrapPerPlayerContainerTemplateRef,\n SetupBootstrapStep,\n SetupBootstrapDestinationRef,\n} from \"./model\";\n\nexport function shuffle<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>(\n container: SetupBootstrapContainerRef<Manifest>,\n): SetupBootstrapStep<Manifest> {\n return {\n type: \"shuffle\",\n container,\n };\n}\n\nexport function dealToPlayerZone<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>({\n from,\n zoneId,\n count,\n playerIds,\n}: {\n from: Extract<\n SetupBootstrapContainerRef<Manifest>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n zoneId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n { type: \"playerZone\" }\n >[\"zoneId\"];\n count: number;\n playerIds?: readonly PlayerIdOfManifest<Manifest>[];\n}): SetupBootstrapStep<Manifest> {\n return {\n type: \"deal\",\n from,\n to: {\n type: \"playerZone\",\n zoneId,\n } as SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n count,\n playerIds,\n };\n}\n\nexport function dealToPlayerBoardContainer<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>({\n from,\n boardId,\n containerId,\n count,\n playerIds,\n}: {\n from: Extract<\n SetupBootstrapContainerRef<Manifest>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n boardId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n { type: \"playerBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n { type: \"playerBoardContainer\" }\n >[\"containerId\"];\n count: number;\n playerIds?: readonly PlayerIdOfManifest<Manifest>[];\n}): SetupBootstrapStep<Manifest> {\n return {\n type: \"deal\",\n from,\n to: {\n type: \"playerBoardContainer\",\n boardId,\n containerId,\n } as SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n count,\n playerIds,\n };\n}\n\nexport function seedSharedBoardContainer<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>({\n from,\n boardId,\n containerId,\n count,\n componentIds,\n}: {\n from: SetupBootstrapContainerRef<Manifest>;\n boardId: Extract<\n SetupBootstrapDestinationRef<Manifest>,\n { type: \"sharedBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapDestinationRef<Manifest>,\n { type: \"sharedBoardContainer\" }\n >[\"containerId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<Manifest>\n | PieceIdOfManifest<Manifest>\n | DieIdOfManifest<Manifest>\n )[];\n}): SetupBootstrapStep<Manifest> {\n return {\n type: \"move\",\n from,\n to: {\n type: \"sharedBoardContainer\",\n boardId,\n containerId,\n } as SetupBootstrapDestinationRef<Manifest>,\n count,\n componentIds,\n };\n}\n\nexport function seedSharedBoardSpace<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>({\n from,\n boardId,\n spaceId,\n count,\n componentIds,\n}: {\n from: SetupBootstrapContainerRef<Manifest>;\n boardId: Extract<\n SetupBootstrapDestinationRef<Manifest>,\n { type: \"sharedBoardSpace\" }\n >[\"boardId\"];\n spaceId: Extract<\n SetupBootstrapDestinationRef<Manifest>,\n { type: \"sharedBoardSpace\" }\n >[\"spaceId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<Manifest>\n | PieceIdOfManifest<Manifest>\n | DieIdOfManifest<Manifest>\n )[];\n}): SetupBootstrapStep<Manifest> {\n return {\n type: \"move\",\n from,\n to: {\n type: \"sharedBoardSpace\",\n boardId,\n spaceId,\n } as SetupBootstrapDestinationRef<Manifest>,\n count,\n componentIds,\n };\n}\n","/**\n * State composition primitives.\n *\n * `pipe` threads a seed state through a sequence of `State -> State`\n * transformations, left to right. It is the preferred way to compose curried\n * writers (the `ops.*` namespace) in reducers:\n *\n * return accept(\n * pipe(state,\n * ops.spendPlayerResources({ playerId, resources: cost }),\n * ops.placePieceOnVertex({ boardId, vertexId, pieceId, ownerId: playerId }),\n * ),\n * );\n */\n/**\n * A state-preserving transformation.\n *\n * `Op<State>` is polymorphic in the exact input subtype — given a state `S`\n * that extends `State`, it returns the same `S`. This lets curried writers\n * from `ops.*` and author-written helpers thread through phase-scoped `pipe`\n * calls without losing the narrowed phase state type.\n */\nexport type Op<State> = <S extends State>(state: S) => S;\n\nexport function pipe<State>(\n state: State,\n ...ops: ReadonlyArray<Op<NoInfer<State>>>\n): State {\n let result = state;\n for (const op of ops) {\n result = op(result);\n }\n return result;\n}\n"],"mappings":"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","names":["z","z","z","z","z","perPlayer","z","z","z","z","z","toDomainState","toDomainState","toCombinedState","toSessionState","fxForState","buildContext","buildRuntimeArgs","lazyDomain","board","space","from","stableStringify","z","z","z","z","z","runtimePayloadSchema","z","perPlayerSchema","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/reducer/model/manifest.ts","../src/reducer/schema-helpers.ts","../src/reducer/authoring/validation.ts","../src/reducer/authoring/contract.ts","../src/reducer/authoring/effect.ts","../src/reducer/authoring/game.ts","../src/reducer/authoring/interaction.ts","../src/reducer/authoring/phase.ts","../src/reducer/authoring/view-stage.ts","../src/reducer/inputs/formInput.ts","../src/reducer/per-player.ts","../src/reducer/inputs/defineInputs.ts","../src/reducer/inputs/boardInput.ts","../src/reducer/inputs/targetRule.ts","../src/reducer/inputs/boardTarget.ts","../src/reducer/inputs/cardTarget.ts","../src/reducer/inputs/choiceTarget.ts","../src/reducer/inputs/cardInput.ts","../src/reducer/inputs/promptInput.ts","../src/reducer/inputs/rngInput.ts","../src/reducer/inputs/many.ts","../src/reducer/engine/runtime-instruction-engine.ts","../src/reducer/table-ops.ts","../src/reducer/rng.ts","../src/reducer/bundle/trusted/rng-sampler.ts","../src/reducer/bundle/trusted/engine-instruction-resolver.ts","../src/reducer/bundle/trusted/flow-instruction-resolver.ts","../src/reducer/bundle/trusted/simultaneous-player.ts","../src/reducer/ops.ts","../src/reducer/table-queries.ts","../src/reducer/transaction.ts","../src/reducer/definition-index.ts","../src/reducer/bundle/trusted/runtime-registry.ts","../src/reducer/derived.ts","../src/reducer/effects.ts","../src/reducer/bundle/trusted/trusted-runtime-args.ts","../src/reducer/bundle/trusted/trusted-runtime-result.ts","../src/reducer/bundle/trusted/trusted-state-codec.ts","../src/reducer/bundle/trusted/trusted-setup-profiles.ts","../src/reducer/bundle/trusted/runtime-scope.ts","../src/reducer/bundle/trusted/instruction-runner.ts","../src/reducer/parse-utils.ts","../src/reducer/bundle/trusted/interaction-types.ts","../src/reducer/bundle/trusted/interaction-collectors.ts","../src/reducer/bundle/trusted/interaction-authorization.ts","../src/reducer/bundle/trusted/interaction-decision.ts","../src/reducer/bundle/trusted/stage-resolver.ts","../src/reducer/bundle/trusted/interaction-resolver.ts","../src/reducer/setup-bootstrap.ts","../src/reducer/bundle/trusted/lifecycle-runner.ts","../src/reducer/bundle/trusted/projection-context.ts","../src/reducer/bundle/trusted/projection-builder.ts","../src/reducer/bundle/trusted/static-projection.ts","../src/reducer/bundle/trusted-bundle.ts","../src/reducer/ingress/session-codec.ts","../src/reducer/ingress/input-codec.ts","../src/reducer/ingress/runtime-payload.ts","../src/reducer/ingress/phase-schemas.ts","../src/generated/reducer-contract/builders.ts","../src/reducer/bundle/ingress-bundle.ts","../src/reducer/client-param-schemas.ts","../src/reducer/setup-bootstrap-helpers.ts","../src/reducer/compose.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n AnySchema,\n RuntimeHandVisibilityMode,\n RuntimeTableRecord,\n SchemaLike,\n} from \"./table\";\nimport type {\n BoardBaseIdOfManifest,\n BoardContainerIdOfManifest,\n CardIdOfManifest,\n CardIdOfTable,\n DeckIdOfTable,\n DieIdOfManifest,\n HandIdOfTable,\n PieceIdOfManifest,\n PlayerIdOfManifest,\n PlayerIdOfTable,\n SetupSelectionInputOfManifest,\n PlayerZoneIdOfManifest,\n SetupSelectionOfManifest,\n SharedZoneIdOfManifest,\n SpaceIdOfManifest,\n} from \"./extract\";\nimport type { TableQueriesOfState } from \"./queries\";\n\ndeclare const manifestIdSchemaBrand: unique symbol;\n\nexport type ManifestIdSchema<Output = unknown> = z.ZodType<Output> & {\n readonly [manifestIdSchemaBrand]: true;\n};\n\nexport type ManifestLiterals<\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n PhaseName extends string = string,\n> = {\n playerIds: readonly PlayerId[];\n phaseNames: readonly PhaseName[];\n boardLayouts: readonly (\"generic\" | \"hex\" | \"square\")[];\n setupOptionIds: readonly string[];\n setupProfileIds: readonly string[];\n cardSetIds: readonly string[];\n cardTypes: readonly string[];\n deckIds: readonly DeckId[];\n handIds: readonly HandId[];\n sharedZoneIds: readonly DeckId[];\n playerZoneIds: readonly HandId[];\n zoneIds: readonly (DeckId | HandId)[];\n cardIds: readonly CardId[];\n resourceIds: readonly string[];\n resourcePresentationById?: Record<\n string,\n { label: string; icon?: string | null }\n >;\n pieceTypeIds: readonly string[];\n pieceIds: readonly string[];\n dieTypeIds: readonly string[];\n dieIds: readonly string[];\n boardTemplateIds: readonly string[];\n boardTypeIds: readonly string[];\n boardBaseIds: readonly string[];\n boardIds: readonly string[];\n boardContainerIds: readonly string[];\n relationTypeIds: readonly string[];\n edgeIds: readonly string[];\n edgeTypeIds: readonly string[];\n vertexIds: readonly string[];\n vertexTypeIds: readonly string[];\n spaceIds: readonly string[];\n spaceTypeIds: readonly string[];\n handVisibilityById: Record<HandId, RuntimeHandVisibilityMode>;\n zoneVisibilityById: Record<DeckId | HandId, RuntimeHandVisibilityMode>;\n setupChoiceIdsByOptionId: Record<string, readonly string[]>;\n cardSetIdByCardId: Record<CardId, string>;\n cardTypeByCardId: Record<CardId, string>;\n cardSetIdsBySharedZoneId: Record<DeckId, readonly string[]>;\n cardSetIdsByPlayerZoneId: Record<HandId, readonly string[]>;\n};\n\nexport type ManifestIds<\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n PhaseName extends string = string,\n> = {\n playerId: z.ZodType<PlayerId>;\n phaseName: z.ZodType<PhaseName>;\n boardLayout: AnySchema;\n setupOptionId: AnySchema;\n setupProfileId: AnySchema;\n cardSetId: AnySchema;\n cardType: AnySchema;\n cardId: z.ZodType<CardId>;\n deckId: z.ZodType<DeckId>;\n handId: z.ZodType<HandId>;\n sharedZoneId: AnySchema;\n playerZoneId: AnySchema;\n zoneId: AnySchema;\n resourceId: AnySchema;\n pieceTypeId: AnySchema;\n pieceId: AnySchema;\n dieId: AnySchema;\n dieTypeId: AnySchema;\n boardTypeId: AnySchema;\n boardId: AnySchema;\n boardBaseId: AnySchema;\n boardContainerId: AnySchema;\n relationTypeId: AnySchema;\n edgeId: AnySchema;\n edgeTypeId: AnySchema;\n vertexId: AnySchema;\n vertexTypeId: AnySchema;\n spaceId: AnySchema;\n spaceTypeId: AnySchema;\n};\n\nexport type ManifestDefaults<Table extends RuntimeTableRecord> = {\n zones: (playerIds?: readonly string[]) => Table[\"zones\"];\n decks: (playerIds?: readonly string[]) => Table[\"decks\"];\n hands: (playerIds?: readonly string[]) => Table[\"hands\"];\n handVisibility: (playerIds?: readonly string[]) => Table[\"handVisibility\"];\n ownerOfCard: (playerIds?: readonly string[]) => Table[\"ownerOfCard\"];\n visibility: (playerIds?: readonly string[]) => Table[\"visibility\"];\n resources: (playerIds?: readonly string[]) => Table[\"resources\"];\n};\n\nexport type StaticBoards<Table extends RuntimeTableRecord> = Pick<\n Table[\"boards\"],\n \"byId\" | \"hex\" | \"square\"\n>;\n\nexport type SetupOptionChoiceMetadata = {\n id: string;\n label: string;\n description?: string | null;\n};\n\nexport type SetupOptionMetadata = {\n id: string;\n name: string;\n description?: string | null;\n choices: readonly SetupOptionChoiceMetadata[];\n};\n\nexport type SetupProfileMetadata = {\n id: string;\n name: string;\n description?: string | null;\n optionValues?: Record<string, string> | null;\n};\n\nexport type ReducerManifestContract<\n Table extends RuntimeTableRecord,\n PhaseName extends string,\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n> = {\n literals: ManifestLiterals<PlayerId, DeckId, HandId, CardId, PhaseName>;\n ids: ManifestIds<PlayerId, DeckId, HandId, CardId, PhaseName>;\n defaults: ManifestDefaults<Table>;\n staticBoards?: StaticBoards<Table>;\n setupOptionsById: Record<string, SetupOptionMetadata>;\n setupChoiceIdsByOptionId: Record<string, readonly string[]>;\n setupProfilesById: Record<string, SetupProfileMetadata>;\n tableSchema: z.ZodType<Table>;\n runtimeSchema: AnySchema;\n createGameStateSchema: (config: {\n phaseNameSchema: AnySchema;\n publicSchema: AnySchema;\n privateSchema: AnySchema;\n hiddenSchema: AnySchema;\n phasesSchema: AnySchema;\n }) => AnySchema;\n};\n\nexport type GeneratedManifestContractLike<\n Table extends RuntimeTableRecord = RuntimeTableRecord,\n PhaseName extends string = string,\n PlayerId extends string = string,\n DeckId extends string = string,\n HandId extends string = string,\n CardId extends string = string,\n> = ReducerManifestContract<Table, PhaseName, PlayerId, DeckId, HandId, CardId>;\n\nexport type ManifestContract<Table extends RuntimeTableRecord> =\n ReducerManifestContract<\n Table,\n string,\n PlayerIdOfTable<Table>,\n DeckIdOfTable<Table>,\n HandIdOfTable<Table>,\n CardIdOfTable<Table>\n >;\n\nfunction toNonEmptyStringTuple<Values extends readonly string[]>(\n values: Values,\n): [Values[number], ...Array<Values[number]>] {\n const [first, ...rest] = Array.from(values);\n if (typeof first === \"undefined\") {\n throw new Error(\"Expected a non-empty literal tuple\");\n }\n return [first as Values[number], ...(rest as Array<Values[number]>)];\n}\n\n/**\n * Registry of Zod schemas produced by `createManifestStringLiteralSchema`.\n *\n * The schemas returned from this helper are the canonical manifest-scoped\n * branded schemas (e.g. `manifest.ids.playerId`). When a manifest has zero\n * members for a given id family the underlying schema falls back to plain\n * `z.string()`, which is indistinguishable from an author-written\n * `z.string()` at runtime. This WeakSet lets `defineGameContract` recognise\n * the manifest-supplied case and not flag it as a raw string.\n */\nconst manifestScopedSchemas = new WeakSet<object>();\n\nexport function markManifestScopedSchema<Schema extends z.ZodTypeAny>(\n schema: Schema,\n): Schema & ManifestIdSchema<z.infer<Schema>> {\n manifestScopedSchemas.add(schema as unknown as object);\n return schema as Schema & ManifestIdSchema<z.infer<Schema>>;\n}\n\nexport function isManifestScopedSchema(schema: unknown): boolean {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n manifestScopedSchemas.has(schema as object)\n );\n}\n\nexport function createManifestStringLiteralSchema<\n Values extends readonly string[],\n>(\n values: Values,\n): ManifestIdSchema<Values[number] extends never ? string : Values[number]> {\n const schema =\n values.length === 0\n ? (z.string() as z.ZodType<\n Values[number] extends never ? string : Values[number]\n >)\n : (z.enum(toNonEmptyStringTuple(values)) as z.ZodType<\n Values[number] extends never ? string : Values[number]\n >);\n return markManifestScopedSchema(schema);\n}\n\nexport function assumeManifestSchema<Output>(\n schema: z.ZodTypeAny,\n): z.ZodType<Output> {\n return schema as z.ZodType<Output>;\n}\n\nexport function cloneManifestDefault<Value>(value: Value): Value {\n if (typeof globalThis.structuredClone === \"function\") {\n return globalThis.structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as Value;\n}\n\nexport function resolveManifestPlayerIds<PlayerId extends string>(\n manifestPlayerIds: readonly PlayerId[],\n playerIds: readonly string[] | undefined,\n): readonly PlayerId[] {\n if (!playerIds || playerIds.length === 0) {\n return manifestPlayerIds;\n }\n\n const knownPlayerIds = new Set<string>(manifestPlayerIds);\n return playerIds.filter((playerId): playerId is PlayerId =>\n knownPlayerIds.has(playerId),\n );\n}\n\nexport function createManifestRuntimeSchema<\n PhaseNameSchema extends z.ZodTypeAny,\n PlayerId extends string,\n SetupProfileId extends string,\n>({\n phaseNameSchema,\n playerIdSchema,\n setupProfileIdSchema,\n}: {\n phaseNameSchema: PhaseNameSchema;\n playerIdSchema: z.ZodType<PlayerId>;\n setupProfileIdSchema: z.ZodType<SetupProfileId>;\n}) {\n return z.object({\n prompts: z\n .array(\n z.object({\n id: z.string(),\n promptId: z.string(),\n to: playerIdSchema,\n title: z.string().optional(),\n payload: z.unknown().optional(),\n options: z\n .array(z.object({ id: z.string(), label: z.string() }))\n .optional(),\n resume: z.object({ id: z.string(), data: z.unknown() }),\n }),\n )\n .default([]),\n rng: z\n .object({\n seed: z.number().nullable().optional(),\n cursor: z.number().int().default(0),\n trace: z.array(z.string()).default([]),\n })\n .default({\n seed: null,\n cursor: 0,\n trace: [],\n }),\n setup: z\n .object({\n profileId: setupProfileIdSchema,\n optionValues: z.record(z.string(), z.string().nullable()).default({}),\n })\n .nullable()\n .default(null),\n simultaneous: z\n .object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: z.unknown(),\n }),\n ),\n })\n .nullable(),\n })\n .default({ current: null }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable()\n .default(null),\n nextInstanceId: z.number().int().default(1),\n });\n}\n\nexport function createManifestGameStateSchema<\n Table extends RuntimeTableRecord,\n PhaseNameSchema extends z.ZodTypeAny,\n PublicSchema extends z.ZodTypeAny,\n PrivateSchema extends z.ZodTypeAny,\n HiddenSchema extends z.ZodTypeAny,\n PhasesSchema extends z.ZodTypeAny,\n PlayerId extends string,\n SetupProfileId extends string,\n>({\n tableSchema,\n playerIdSchema,\n setupProfileIdSchema,\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n}: {\n tableSchema: z.ZodType<Table>;\n playerIdSchema: z.ZodType<PlayerId>;\n setupProfileIdSchema: z.ZodType<SetupProfileId>;\n phaseNameSchema: PhaseNameSchema;\n publicSchema: PublicSchema;\n privateSchema: PrivateSchema;\n hiddenSchema: HiddenSchema;\n phasesSchema: PhasesSchema;\n}) {\n return z.object({\n table: tableSchema,\n public: publicSchema,\n private: z.record(z.string(), privateSchema),\n hidden: hiddenSchema,\n flow: z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n }),\n phase: phasesSchema,\n runtime: createManifestRuntimeSchema({\n phaseNameSchema,\n playerIdSchema,\n setupProfileIdSchema,\n }),\n });\n}\n\n// --- State Definition ---\n\nexport type StateDefinition<\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n> = {\n public: PublicSchema;\n private: PrivateSchema;\n hidden: HiddenSchema;\n};\n\nexport type InitContext<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n > = ManifestContract<Table>,\n> = {\n manifest: Manifest;\n table: Table;\n playerIds: PlayerIdOfTable<Table>[];\n rngSeed?: number | null;\n setup: SetupSelectionOfManifest<Manifest> | null;\n q: TableQueriesOfState<{ table: Table }>;\n};\n\nexport type InitSetupSelectionInput<\n Manifest extends ReducerManifestContract<\n RuntimeTableRecord,\n string,\n string,\n string,\n string,\n string\n > = GeneratedManifestContractLike,\n> = SetupSelectionInputOfManifest<Manifest>;\n\n// --- Setup Bootstrap Types ---\n\nexport type SetupBootstrapSharedZoneRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedZone\";\n zoneId: SharedZoneIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerZoneRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerZone\";\n zoneId: PlayerZoneIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapSharedBoardContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerBoardContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapSharedBoardSpaceRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedBoardSpace\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n spaceId: SpaceIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerBoardSpaceRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerBoardSpace\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n spaceId: SpaceIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | SetupBootstrapSharedZoneRef<Manifest>\n | SetupBootstrapPerPlayerZoneRef<Manifest>\n | SetupBootstrapSharedBoardContainerRef<Manifest>\n | SetupBootstrapPerPlayerBoardContainerRef<Manifest>;\n\nexport type SetupBootstrapDestinationRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | SetupBootstrapContainerRef<Manifest>\n | SetupBootstrapSharedBoardSpaceRef<Manifest>\n | SetupBootstrapPerPlayerBoardSpaceRef<Manifest>;\n\nexport type SetupBootstrapPerPlayerContainerTemplateRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | {\n type: \"playerZone\";\n zoneId: PlayerZoneIdOfManifest<Manifest>;\n }\n | {\n type: \"playerBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n };\n\nexport type SetupBootstrapStep<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | {\n type: \"shuffle\";\n container: SetupBootstrapContainerRef<Manifest>;\n }\n | {\n type: \"move\";\n from: SetupBootstrapContainerRef<Manifest>;\n to: SetupBootstrapDestinationRef<Manifest>;\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<Manifest>\n | PieceIdOfManifest<Manifest>\n | DieIdOfManifest<Manifest>\n )[];\n }\n | {\n type: \"deal\";\n from:\n | SetupBootstrapSharedZoneRef<Manifest>\n | SetupBootstrapSharedBoardContainerRef<Manifest>;\n to: SetupBootstrapPerPlayerContainerTemplateRef<Manifest>;\n count: number;\n playerIds?: readonly PlayerIdOfManifest<Manifest>[];\n };\n\nexport type SetupProfileDefinition<\n PhaseName extends string = string,\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n initialPhase?: PhaseName;\n bootstrap?: readonly SetupBootstrapStep<Manifest>[];\n};\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"./model\";\n\nexport type SparseMap<Key extends string, Value> = Partial<Record<Key, Value>>;\nexport type SparseCounts<Key extends string> = SparseMap<Key, number>;\n\ntype SparseSchemaMetadata = {\n keySchema: z.ZodType<string>;\n valueSchema: z.ZodTypeAny;\n};\n\nconst sparseSchemas = new WeakMap<object, SparseSchemaMetadata>();\n\nexport function sparseMap<\n KeySchema extends z.ZodType<string>,\n ValueSchema extends z.ZodTypeAny,\n>(\n keySchema: KeySchema,\n valueSchema: ValueSchema,\n): z.ZodType<SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>> {\n const schema = z.partialRecord(keySchema, valueSchema) as z.ZodType<\n SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>\n >;\n sparseSchemas.set(schema as unknown as object, {\n keySchema,\n valueSchema,\n });\n return schema;\n}\n\nexport function sparseCounts<KeySchema extends z.ZodType<string>>(\n keySchema: KeySchema,\n): z.ZodType<SparseCounts<z.infer<KeySchema>>> {\n return sparseMap(keySchema, z.number().int().min(0)) as z.ZodType<\n SparseCounts<z.infer<KeySchema>>\n >;\n}\n\nexport function getZodDef(schema: unknown): {\n type?: string;\n} & Record<string, unknown> {\n const anySchema = schema as {\n _zod?: { def?: Record<string, unknown> };\n def?: Record<string, unknown>;\n };\n const fromInternal = anySchema?._zod?.def;\n if (fromInternal && typeof fromInternal === \"object\") {\n return fromInternal;\n }\n const fromLegacy = anySchema?.def;\n if (fromLegacy && typeof fromLegacy === \"object\") {\n return fromLegacy;\n }\n return {};\n}\n\nexport function unwrapWrappers(schema: unknown): unknown {\n let current = schema;\n while (true) {\n const def = getZodDef(current);\n const innerType = def.innerType;\n if (\n (def.type === \"nullable\" ||\n def.type === \"optional\" ||\n def.type === \"default\" ||\n def.type === \"readonly\" ||\n def.type === \"catch\") &&\n innerType\n ) {\n current = innerType;\n continue;\n }\n return current;\n }\n}\n\nexport function isPlainZodString(schema: unknown): boolean {\n return getZodDef(schema).type === \"string\";\n}\n\nexport function isZodArray(schema: unknown): boolean {\n return getZodDef(schema).type === \"array\";\n}\n\nexport function isEnumKeyedRecordSchema(schema: unknown): boolean {\n const def = getZodDef(schema);\n const keyType = def.keyType;\n return (\n def.type === \"record\" &&\n typeof keyType === \"object\" &&\n keyType !== null &&\n getZodDef(keyType).type === \"enum\"\n );\n}\n\nexport function isSparseMapSchema(schema: unknown): boolean {\n const inner = unwrapWrappers(schema);\n return (\n typeof inner === \"object\" &&\n inner !== null &&\n sparseSchemas.has(inner as object)\n );\n}\n\nfunction getSparseSchemaMetadata(\n schema: unknown,\n): SparseSchemaMetadata | undefined {\n const inner = unwrapWrappers(schema);\n if (typeof inner !== \"object\" || inner === null) {\n return undefined;\n }\n return sparseSchemas.get(inner as object);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getObjectShape(\n schema: unknown,\n): Record<string, unknown> | null {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return null;\n }\n const shape = def.shape;\n if (typeof shape === \"function\") {\n const resolved = shape();\n return resolved && typeof resolved === \"object\"\n ? (resolved as Record<string, unknown>)\n : null;\n }\n return shape && typeof shape === \"object\"\n ? (shape as Record<string, unknown>)\n : null;\n}\n\nfunction normalizeSchemaInput(schema: unknown, input: unknown): unknown {\n const inner = unwrapWrappers(schema);\n const sparse = getSparseSchemaMetadata(inner);\n if (sparse && isPlainObject(input)) {\n const filtered = Object.fromEntries(\n Object.entries(input)\n .filter(\n ([key, value]) =>\n typeof value !== \"undefined\" &&\n sparse.keySchema.safeParse(key).success,\n )\n .map(([key, value]) => [\n key,\n normalizeSchemaInput(sparse.valueSchema, value),\n ]),\n );\n return filtered;\n }\n\n const shape = getObjectShape(inner);\n if (shape && isPlainObject(input)) {\n return Object.fromEntries(\n Object.entries(input).map(([key, value]) => {\n const fieldSchema = shape[key];\n return [\n key,\n typeof fieldSchema === \"undefined\"\n ? value\n : normalizeSchemaInput(fieldSchema, value),\n ];\n }),\n );\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && Array.isArray(input) && def.element) {\n return input.map((value) => normalizeSchemaInput(def.element, value));\n }\n\n return input;\n}\n\nexport function normalizeCommandParams<Output>(\n schema: SchemaLike<Output>,\n input: unknown,\n): Output {\n return schema.parse(normalizeSchemaInput(schema, input));\n}\n","import {\n isManifestScopedSchema,\n type ManifestContract,\n type RuntimeTableRecord,\n type SchemaLike,\n} from \"../model\";\nimport type { InputCollector } from \"../model\";\nimport {\n getObjectShape,\n getZodDef,\n isEnumKeyedRecordSchema,\n isPlainZodString,\n isSparseMapSchema,\n isZodArray,\n unwrapWrappers,\n} from \"../schema-helpers\";\nimport type { AnyReducerGameContract } from \"./types\";\n\n/**\n * Canonical set of manifest-scoped id field names. `defineGameContract`\n * uses this list to reject state schemas that describe one of these fields\n * with a raw `z.string()` instead of the corresponding branded enum from\n * `manifest.ids.*` (or `gameContract.schemas.*`).\n *\n * The rule of thumb is \"one way to do things\": if a field *is* a player id,\n * card id, zone id, etc. in the manifest, the authored state schema must\n * reuse the same literal/branded schema so generated types line up with the\n * runtime checks, instead of silently widening to `string`.\n */\nconst MANIFEST_SCOPED_ID_NAMES = [\n \"playerId\",\n \"cardId\",\n \"deckId\",\n \"handId\",\n \"zoneId\",\n \"sharedZoneId\",\n \"playerZoneId\",\n \"boardId\",\n \"boardContainerId\",\n \"boardTypeId\",\n \"boardBaseId\",\n \"edgeId\",\n \"edgeTypeId\",\n \"vertexId\",\n \"vertexTypeId\",\n \"spaceId\",\n \"spaceTypeId\",\n \"relationTypeId\",\n \"resourceId\",\n \"pieceId\",\n \"pieceTypeId\",\n \"dieId\",\n \"dieTypeId\",\n \"setupOptionId\",\n \"setupProfileId\",\n \"cardSetId\",\n \"cardType\",\n] as const;\n\ntype ManifestScopedIdName = (typeof MANIFEST_SCOPED_ID_NAMES)[number];\n\nfunction matchManifestScopedIdName(\n key: string,\n): { name: ManifestScopedIdName; kind: \"singular\" | \"plural\" } | null {\n for (const name of MANIFEST_SCOPED_ID_NAMES) {\n const capitalized = `${name.charAt(0).toUpperCase()}${name.slice(1)}`;\n if (key === name || key.endsWith(capitalized)) {\n return { name, kind: \"singular\" };\n }\n const plural = `${name}s`;\n const capitalizedPlural = `${capitalized}s`;\n if (key === plural || key.endsWith(capitalizedPlural)) {\n return { name, kind: \"plural\" };\n }\n }\n return null;\n}\n\nexport function validateInteractionParamsSchema(\n schema: unknown,\n context: \"defineInteraction\" | \"defineCardAction\",\n path: string,\n): void {\n const inner = unwrapWrappers(schema);\n if (isEnumKeyedRecordSchema(inner) && !isSparseMapSchema(inner)) {\n throw new Error(\n `${context}: ${path} uses an enum-keyed z.record(...), which parses as a total map at runtime. ` +\n `Use sparseMap(...) or sparseCounts(...) from @dreamboard-games/sdk/reducer instead so interaction params stay sparse and match runtime validation.`,\n );\n }\n\n const shape = getObjectShape(inner);\n if (shape) {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n validateInteractionParamsSchema(fieldSchema, context, `${path}.${key}`);\n }\n return;\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && def.element) {\n validateInteractionParamsSchema(def.element, context, `${path}[]`);\n return;\n }\n\n if (def.type === \"record\" && def.valueType) {\n validateInteractionParamsSchema(def.valueType, context, `${path}.*`);\n }\n}\n\nexport function validateInteractionInputsSchema(\n inputs: Record<string, InputCollector> | undefined,\n context: \"defineInteraction\" | \"defineCardAction\",\n): void {\n if (!inputs) return;\n for (const [key, collector] of Object.entries(inputs)) {\n validateInteractionParamsSchema(collector.schema, context, `inputs.${key}`);\n }\n}\n\nexport function validateManyCommitPolicy(input: {\n inputs: Record<string, InputCollector> | undefined;\n commit?: { mode: string };\n context: string;\n}): void {\n if (input.commit?.mode !== \"autoWhenReady\") return;\n if (\n Object.values(input.inputs ?? {}).some(\n (collector) => collector.selection?.mode === \"many\",\n )\n ) {\n throw new Error(\n `${input.context}: interactions with many(...) inputs must use commit: { mode: \"manual\" }.`,\n );\n }\n}\n\nexport function validateInteractionLikeDefinition(\n input: {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n context: \"defineInteraction\" | \"defineCardAction\",\n): void {\n validateInteractionInputsSchema(input.inputs, context);\n validateManyCommitPolicy({\n inputs: input.inputs,\n commit: input.commit,\n context,\n });\n if (input.paramsSchema) {\n validateInteractionParamsSchema(\n input.paramsSchema,\n context,\n \"paramsSchema\",\n );\n }\n}\n\nexport function validateStateSchemaIdBranding(\n schema: unknown,\n scope: \"public\" | \"private\" | \"hidden\",\n): void {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return;\n }\n const shape = def.shape as Record<string, unknown> | undefined;\n if (!shape) {\n return;\n }\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const match = matchManifestScopedIdName(key);\n if (!match) {\n continue;\n }\n const inner = unwrapWrappers(fieldSchema);\n if (match.kind === \"singular\") {\n if (isPlainZodString(inner) && !isManifestScopedSchema(inner)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses a raw z.string() ` +\n `but its name identifies it as a manifest-scoped '${match.name}'. ` +\n `Use gameContract.schemas.${match.name} (or manifest.ids.${match.name}) ` +\n `so the branded literal union flows through state types.`,\n );\n }\n continue;\n }\n if (match.kind === \"plural\" && isZodArray(inner)) {\n const element = unwrapWrappers(getZodDef(inner).element);\n if (isPlainZodString(element) && !isManifestScopedSchema(element)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses z.array(z.string()) ` +\n `but its name identifies it as manifest-scoped '${match.name}' values. ` +\n `Use z.array(gameContract.schemas.${match.name}) ` +\n `(or manifest.ids.${match.name}) so the branded literal union flows through state types.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGamePhaseNames(definition: {\n contract: AnyReducerGameContract;\n phases: Record<string, unknown>;\n initialPhase?: string;\n setupProfiles?: Record<string, { initialPhase?: string }>;\n}): void {\n const contractPhaseNames = (\n definition.contract as AnyReducerGameContract & {\n phaseNames?: readonly string[];\n }\n ).phaseNames;\n if (!Array.isArray(contractPhaseNames)) {\n return;\n }\n const declared = new Set(contractPhaseNames);\n const actual = new Set(Object.keys(definition.phases));\n const missing = [...declared].filter((name) => !actual.has(name));\n const extra = [...actual].filter((name) => !declared.has(name));\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = [];\n if (missing.length > 0) {\n parts.push(`missing: [${missing.join(\", \")}]`);\n }\n if (extra.length > 0) {\n parts.push(`extra: [${extra.join(\", \")}]`);\n }\n throw new Error(\n `defineGame: phases record does not match contract.phaseNames (${parts.join(\n \"; \",\n )}). Update contract.phaseNames or the phases record so they agree.`,\n );\n }\n if (\n definition.initialPhase !== undefined &&\n !declared.has(definition.initialPhase)\n ) {\n throw new Error(\n `defineGame: initialPhase '${definition.initialPhase}' is not declared in contract.phaseNames.`,\n );\n }\n if (definition.setupProfiles) {\n for (const [profileId, profile] of Object.entries(\n definition.setupProfiles,\n )) {\n const initial = profile?.initialPhase;\n if (initial !== undefined && !declared.has(initial)) {\n throw new Error(\n `defineGame: setupProfiles.${profileId}.initialPhase '${initial}' is not declared in contract.phaseNames.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGameZoneWiring(definition: {\n contract: {\n manifest: ManifestContract<RuntimeTableRecord>;\n };\n phases: Record<string, unknown>;\n}): void {\n const manifestPlayerZoneIds = new Set(\n definition.contract.manifest.literals.playerZoneIds ?? [],\n );\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n zones?: Record<string, unknown>;\n cardActions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord) continue;\n\n if (phaseRecord.zones !== undefined && !Array.isArray(phaseRecord.zones)) {\n const zonesRecord =\n typeof phaseRecord.zones === \"object\" && phaseRecord.zones !== null\n ? (phaseRecord.zones as Record<string, unknown>)\n : null;\n const hasRemovedZoneSpec =\n zonesRecord &&\n Object.values(zonesRecord).some(\n (zone) =>\n typeof zone === \"object\" &&\n zone !== null &&\n (\"cardsFrom\" in zone || \"playableVia\" in zone || \"from\" in zone),\n );\n if (hasRemovedZoneSpec) {\n throw new Error(\n `defineGame: phases.${phaseName}.zones uses removed zone spec objects. Use zones: [\"manifest-player-zone-id\"] and cardActions[*].playFrom instead.`,\n );\n }\n throw new Error(\n `defineGame: phases.${phaseName}.zones must be an array of manifest player zone ids.`,\n );\n }\n\n for (const [index, zoneId] of (phaseRecord.zones ?? []).entries()) {\n if (typeof zoneId !== \"string\") {\n throw new Error(\n `defineGame: phases.${phaseName}.zones[${index}] must be a manifest player zone id string.`,\n );\n }\n if (!manifestPlayerZoneIds.has(zoneId)) {\n throw new Error(\n `defineGame: phases.${phaseName}.zones[${index}] '${zoneId}' is not declared in manifest.literals.playerZoneIds.`,\n );\n }\n }\n\n for (const [actionId, action] of Object.entries(\n phaseRecord.cardActions ?? {},\n )) {\n const actionRecord =\n typeof action === \"object\" && action !== null\n ? (action as Record<string, unknown>)\n : null;\n const playFrom = actionRecord?.playFrom;\n if (\n typeof playFrom === \"string\" &&\n !manifestPlayerZoneIds.has(playFrom)\n ) {\n throw new Error(\n `defineGame: phases.${phaseName}.cardActions.${actionId}.playFrom '${playFrom}' is not declared in manifest.literals.playerZoneIds.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGameSimultaneousPhases(definition: {\n phases: Record<string, unknown>;\n}): void {\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n kind?: unknown;\n submit?: { inputs?: Record<string, InputCollector> };\n resolve?: unknown;\n interactions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord || phaseRecord.kind !== \"simultaneousPlayer\") {\n continue;\n }\n if (!phaseRecord.submit) {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare submit.`,\n );\n }\n if (typeof phaseRecord.resolve !== \"function\") {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare resolve.`,\n );\n }\n if (phaseRecord.interactions?.submit) {\n throw new Error(\n `defineGame: phases.${phaseName}.interactions.submit conflicts with the reserved simultaneous submit interaction id.`,\n );\n }\n validateInteractionInputsSchema(\n phaseRecord.submit.inputs,\n \"defineInteraction\",\n );\n validateManyCommitPolicy({\n inputs: phaseRecord.submit.inputs,\n commit: (phaseRecord.submit as { commit?: { mode: string } }).commit,\n context: `defineGame: phases.${phaseName}.submit`,\n });\n }\n}\n\nexport type ManifestIdSchemasOf<\n Ids extends Record<string, SchemaLike<unknown>>,\n> = {\n readonly [Key in keyof Ids]: Ids[Key] extends SchemaLike<infer Output>\n ? Ids[Key] & import(\"../model\").ManifestIdSchema<Output>\n : Ids[Key];\n};\n","import { z } from \"zod\";\nimport { createManifestStringLiteralSchema } from \"../model/manifest\";\nimport type {\n ReducerGameContract,\n ReducerManifestContract,\n RuntimeTableRecord,\n SchemaLike,\n StateDefinition,\n} from \"../model\";\nimport {\n type ManifestIdSchemasOf,\n validateStateSchemaIdBranding,\n} from \"./validation\";\n\n/**\n * Narrows a manifest's `literals.phaseNames` and `ids.phaseName` to the\n * author-supplied phase-name tuple. Lets `defineGameContract` override the\n * codegen-emitted `phaseNames: readonly string[]` / `phaseName: z.string()`\n * placeholders so `PhaseNameOfContract<Contract>` resolves to a literal\n * union and flows through `fx.transition`, `PhaseMapOf`, and the flow\n * state's `currentPhase`.\n */\ntype NarrowManifestPhaseNames<\n Manifest,\n PhaseNames extends readonly string[],\n> = Omit<Manifest, \"literals\" | \"ids\"> & {\n literals: Manifest extends { literals: infer L }\n ? Omit<L, \"phaseNames\"> & { phaseNames: PhaseNames }\n : { phaseNames: PhaseNames };\n ids: Manifest extends { ids: infer I }\n ? Omit<I, \"phaseName\"> & { phaseName: z.ZodType<PhaseNames[number]> }\n : { phaseName: z.ZodType<PhaseNames[number]> };\n};\n\ntype ReducerGameContractInput<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n Phases extends Record<string, SchemaLike<object>>,\n> = {\n manifest: Manifest;\n state: StateDefinition<PublicSchema, PrivateSchema, HiddenSchema>;\n phases: Phases;\n};\n\nexport function defineGameContract<\n Table extends RuntimeTableRecord,\n const Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n const Phases extends Record<string, SchemaLike<object>>,\n>(\n definition: ReducerGameContractInput<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases\n >,\n): ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases\n> & {\n readonly phases: Phases;\n readonly phaseNames: readonly (keyof Phases & string)[];\n /**\n * Ergonomic shortcut to the manifest-backed Zod id schemas. Equivalent to\n * `definition.manifest.ids`. Prefer `gameContract.schemas.playerId` etc.\n * over re-importing the generated `ids` namespace so that every authored\n * schema is anchored to the same SDK-guided source.\n */\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n} {\n validateStateSchemaIdBranding(definition.state.public, \"public\");\n validateStateSchemaIdBranding(definition.state.private, \"private\");\n validateStateSchemaIdBranding(definition.state.hidden, \"hidden\");\n const phaseNames = Object.keys(definition.phases) as (keyof Phases &\n string)[];\n if (phaseNames.length === 0) {\n throw new Error(\n \"defineGameContract: phases must be a non-empty record of phase schemas.\",\n );\n }\n for (const name of phaseNames) {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new Error(\n \"defineGameContract: phase names must be non-empty strings.\",\n );\n }\n }\n const phaseNameSchema = createManifestStringLiteralSchema(phaseNames);\n const narrowedManifest = {\n ...definition.manifest,\n literals: {\n ...definition.manifest.literals,\n phaseNames,\n },\n ids: {\n ...definition.manifest.ids,\n phaseName: phaseNameSchema,\n },\n } as unknown as NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >;\n const contract = {\n manifest: narrowedManifest,\n state: definition.state,\n phases: definition.phases,\n phaseNames,\n schemas: narrowedManifest.ids,\n } as ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases\n > & {\n readonly phases: Phases;\n readonly phaseNames: readonly (keyof Phases & string)[];\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n };\n return contract;\n}\n","import { z } from \"zod\";\nimport type {\n AnySchema,\n ContinuationCallable,\n EffectRollDieDefinition,\n EffectShuffleDefinition,\n EffectShufflePlayerZoneDefinition,\n ResumableEffectKind,\n} from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nfunction createContinuationCallable<\n DataSchema extends AnySchema,\n ResponseSchema extends AnySchema,\n State extends {\n table: import(\"../model\").RuntimeTableRecord;\n flow: { currentPhase: string };\n },\n Manifest extends import(\"../model\").ManifestContract<\n import(\"../model\").TableOfState<State>\n >,\n EffectType extends ResumableEffectKind = ResumableEffectKind,\n>(definition: {\n id: string;\n data: DataSchema;\n response: ResponseSchema;\n effectKind?: EffectType;\n reduce: ContinuationCallable<\n DataSchema,\n State,\n Manifest,\n string,\n EffectType\n >[\"reduce\"];\n}): ContinuationCallable<DataSchema, State, Manifest, string, EffectType> {\n const continuation = ((data: z.infer<DataSchema>) => {\n return {\n id: continuation.id,\n data,\n };\n }) as ContinuationCallable<DataSchema, State, Manifest, string, EffectType>;\n continuation.id = definition.id;\n continuation.source = \"effect\";\n continuation.dataSchema = definition.data;\n continuation.responseSchema = definition.response;\n continuation.reduce = definition.reduce;\n if (definition.effectKind !== undefined) {\n continuation.effectKind = definition.effectKind;\n }\n return continuation;\n}\n\n// --- `defineEffect` ---\n//\n// Authoring factory for engine-side resumable effects (cues). An effect\n// is the registered bundle of continuation callable + optional reduce,\n// discriminated by `type` which aligns directly with `ResumableEffectKind`:\n//\n// defineEffect<GameContract>()({ type: \"rollDie\", id, context?, reduce? })\n// defineEffect<GameContract>()({ type: \"shuffleSharedZone\", id, context?, reduce? })\n//\n// Authored effects are registered under `phase.effects` and invoked from\n// a reducer via `fx.effect(effect, options)`. The wire protocol already\n// isolates the continuation payload into the ingress bundle's\n// `continuations` map keyed by `effectId`, so `fx.effect` never attaches\n// `resume: undefined` to the wire effect.\n//\n// Addressed player requests are *not* effects. Author them as\n// prompt-kind interactions via `defineInteraction({ kind: \"prompt\",\n// to, options, ... })`.\n\ntype EffectRollDieInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"rollDie\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"rollDie\"\n >[\"reduce\"];\n};\n\ntype EffectShuffleInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shuffleSharedZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shuffleSharedZone\"\n >[\"reduce\"];\n};\n\ntype EffectShufflePlayerZoneInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shufflePlayerZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shufflePlayerZone\"\n >[\"reduce\"];\n};\n\nexport function defineEffect<Contract extends AnyReducerGameContract>() {\n type EffectInput =\n | EffectRollDieInput<Contract, string, AnySchema>\n | EffectShuffleInput<Contract, string, AnySchema>\n | EffectShufflePlayerZoneInput<Contract, string, AnySchema>;\n type EffectOutput =\n | EffectRollDieDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShuffleDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShufflePlayerZoneDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectRollDieInput<Contract, Id, ContextSchema>,\n ): EffectRollDieDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShuffleInput<Contract, Id, ContextSchema>,\n ): EffectShuffleDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShufflePlayerZoneInput<Contract, Id, ContextSchema>,\n ): EffectShufflePlayerZoneDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect(definition: EffectInput): EffectOutput {\n if (\n definition.type === \"rollDie\" ||\n definition.type === \"shuffleSharedZone\" ||\n definition.type === \"shufflePlayerZone\"\n ) {\n const effectKind: ResumableEffectKind = definition.type;\n if (!definition.reduce) {\n return {\n type: definition.type,\n id: definition.id,\n contextSchema: definition.context,\n } as EffectOutput;\n }\n const contextSchema = (definition.context ?? z.object({})) as AnySchema;\n const continuation = createContinuationCallable<\n AnySchema,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n ResumableEffectKind\n >({\n id: definition.id,\n data: contextSchema,\n response: z.unknown() as AnySchema,\n effectKind,\n reduce: definition.reduce,\n });\n return {\n type: definition.type,\n id: definition.id,\n contextSchema,\n __continuation: continuation,\n } as EffectOutput;\n }\n throw new Error(\n `defineEffect: unknown effect definition. Expected type 'rollDie' | 'shuffleSharedZone' | 'shufflePlayerZone'. Addressed prompts are authored as prompt-kind interactions via defineInteraction({ kind: \"prompt\" }).`,\n );\n }\n return effect;\n}\n","import type { PhaseMapOf, ReducerGameDefinition, ViewMapOf } from \"../model\";\nimport type { AnyReducerGameContract } from \"./types\";\nimport {\n validateDefineGamePhaseNames,\n validateDefineGameSimultaneousPhases,\n validateDefineGameZoneWiring,\n} from \"./validation\";\n\nexport function defineGame<\n const Contract extends AnyReducerGameContract,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract> = Record<string, never>,\n>(\n definition: { contract: Contract } & Omit<\n ReducerGameDefinition<NoInfer<Contract>, Definitions, Views>,\n \"contract\"\n >,\n): ReducerGameDefinition<Contract, Definitions, Views> {\n validateDefineGamePhaseNames(definition);\n validateDefineGameSimultaneousPhases(definition);\n validateDefineGameZoneWiring(definition);\n return definition;\n}\n","import type {\n CardActionSpec,\n InputCollector,\n InteractionRule,\n InteractionSpec,\n PlayerZoneIdOfManifest,\n ScopedPhaseState,\n} from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n InferPhaseState,\n PhaseStateInput,\n} from \"./types\";\nimport { validateInteractionLikeDefinition } from \"./validation\";\n\nexport function defineInteraction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <Collectors extends Record<string, InputCollector>>(\n definition: InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>\n >,\n ): InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineInteraction\",\n );\n return definition;\n };\n}\n\nexport function defineInteractionRule<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n >(\n definition: InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>\n >,\n ): InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>\n > => definition;\n}\n\nexport function defineCardAction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<string, never>,\n const PlayFrom extends PlayerZoneIdOfManifest<ContractManifest<Contract>> =\n PlayerZoneIdOfManifest<ContractManifest<Contract>>,\n >(\n definition: CardActionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n PlayFrom\n >,\n ): CardActionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n PlayFrom\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineCardAction\",\n );\n return definition;\n };\n}\n","import { z } from \"zod\";\nimport type {\n AnyCardActionSpec,\n AnyInteractionSpec,\n CardActionMap,\n EffectMap,\n InputCollector,\n ManifestContract,\n PhaseDefinition,\n PhaseZoneList,\n PlayerIdOfState,\n RuntimeTableRecord,\n SchemaLike,\n ScopedPhaseState,\n SetupSelectionOfManifest,\n StageMap,\n TableOfState,\n} from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\ntype StepPhaseState<\n PhaseStateSchema extends SchemaLike<object>,\n Steps extends readonly string[],\n> = z.infer<PhaseStateSchema> & { step: Steps[number] };\n\ntype StepPhaseInteractionEntry<Step extends string, Interaction> = {\n steps: readonly Step[];\n interaction: Interaction;\n};\n\ntype StepPhaseCardActionEntry<Step extends string, Action> = {\n steps: readonly Step[];\n action: Action;\n};\n\ntype StepPhaseInteractionMap<\n Step extends string,\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n> = Record<\n string,\n StepPhaseInteractionEntry<Step, AnyInteractionSpec<State, Manifest>>\n>;\n\ntype StepPhaseCardActionMap<\n Step extends string,\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n> = Record<\n string,\n StepPhaseCardActionEntry<Step, AnyCardActionSpec<State, Manifest>>\n>;\n\ntype UnwrappedStepInteractions<\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n Interactions extends Record<\n string,\n StepPhaseInteractionEntry<string, AnyInteractionSpec<State, Manifest>>\n >,\n> = {\n [Key in keyof Interactions]: Interactions[Key][\"interaction\"];\n};\n\ntype UnwrappedStepCardActions<\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n CardActions extends Record<\n string,\n StepPhaseCardActionEntry<string, AnyCardActionSpec<State, Manifest>>\n >,\n> = {\n [Key in keyof CardActions]: CardActions[Key][\"action\"];\n};\n\nfunction stepStateSchema<Steps extends readonly [string, ...string[]]>(\n schema: SchemaLike<object>,\n steps: Steps,\n): SchemaLike<object> {\n const stepSchema = z.enum(steps);\n const maybeObject = schema as {\n extend?: (shape: { step: typeof stepSchema }) => SchemaLike<object>;\n };\n if (typeof maybeObject.extend === \"function\") {\n return maybeObject.extend({ step: stepSchema });\n }\n return z.intersection(schema, z.object({ step: stepSchema }));\n}\n\nfunction unwrapStepInteractions<\n Step extends string,\n Interactions extends Record<string, StepPhaseInteractionEntry<Step, unknown>>,\n>(interactions: Interactions | undefined) {\n if (!interactions) return undefined;\n return Object.fromEntries(\n Object.entries(interactions).map(([key, entry]) => [\n key,\n {\n ...(entry.interaction as object),\n __steps: entry.steps,\n },\n ]),\n );\n}\n\nfunction unwrapStepCardActions<\n Step extends string,\n CardActions extends Record<string, StepPhaseCardActionEntry<Step, unknown>>,\n>(cardActions: CardActions | undefined) {\n if (!cardActions) return undefined;\n return Object.fromEntries(\n Object.entries(cardActions).map(([key, entry]) => [\n key,\n {\n ...(entry.action as object),\n __steps: entry.steps,\n },\n ]),\n );\n}\n\nexport function definePhase<Contract extends AnyReducerGameContract>() {\n return <\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<\n ContractState<Contract>,\n ContractManifest<Contract>\n > = Record<string, never>,\n Interactions extends Record<\n string,\n AnyInteractionSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<ContractManifest<Contract>> = readonly [],\n CardActions extends CardActionMap<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > = Record<string, never>,\n >(\n definition: PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >,\n ): PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n > => {\n return definition;\n };\n}\n\nexport function defineStepPhase<Contract extends AnyReducerGameContract>() {\n return <\n const Steps extends readonly [string, ...string[]],\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<\n ContractState<Contract>,\n ContractManifest<Contract>\n > = Record<string, never>,\n Interactions extends StepPhaseInteractionMap<\n Steps[number],\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<ContractManifest<Contract>> = readonly [],\n CardActions extends StepPhaseCardActionMap<\n Steps[number],\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n >(\n definition: Omit<\n PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n CardActions\n >\n >,\n \"state\" | \"initialState\" | \"interactions\" | \"cardActions\"\n > & {\n steps: Steps;\n state: PhaseStateSchema;\n initialState?: (ctx: {\n manifest: ContractManifest<Contract>;\n state: ContractState<Contract>;\n playerIds: PlayerIdOfState<ContractState<Contract>>[];\n setup: SetupSelectionOfManifest<ContractManifest<Contract>> | null;\n }) => z.infer<PhaseStateSchema>;\n interactions?: Interactions;\n cardActions?: CardActions;\n },\n ) => {\n const [initialStep] = definition.steps;\n const state = stepStateSchema(definition.state, definition.steps);\n const initialState = definition.initialState\n ? (ctx: Parameters<NonNullable<typeof definition.initialState>>[0]) => ({\n ...definition.initialState?.(ctx),\n step: initialStep,\n })\n : () => ({ step: initialStep });\n const { steps: _steps, ...rest } = definition;\n void _steps;\n const normalized = {\n ...rest,\n state,\n initialState,\n interactions: unwrapStepInteractions(definition.interactions),\n cardActions: unwrapStepCardActions(definition.cardActions),\n };\n return normalized as unknown as PhaseDefinition<\n SchemaLike<StepPhaseState<PhaseStateSchema, Steps>>,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n CardActions\n >\n >;\n };\n}\n","import type { z } from \"zod\";\nimport type {\n ExactManifestContractOf,\n SchemaLike,\n ScopedPhaseState,\n StageSpec,\n StaticViewDefinition,\n ViewDefinition,\n} from \"../model\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nexport function defineView<Contract extends AnyReducerGameContract>() {\n return <Projection>(\n definition: ViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n >,\n ): ViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n > => definition;\n}\n\n/**\n * Factory for the session-scoped static view (see {@link StaticViewDefinition}).\n * Kept separate from {@link defineView} because the argument shape is\n * structurally different: it exposes only the manifest and generated static\n * queries, with no `state`, `playerId`, `runtime`, `fx`, `ops`, or\n * `accept/reject`. That shape is what prevents authors from accidentally\n * projecting per-tick state into the once-per-session payload.\n */\nexport function defineStaticView<Contract extends AnyReducerGameContract>() {\n return <Projection>(\n definition: StaticViewDefinition<\n ExactManifestContractOf<Contract>,\n Projection\n >,\n ): StaticViewDefinition<ExactManifestContractOf<Contract>, Projection> =>\n definition;\n}\n\nexport function defineStage<Contract extends AnyReducerGameContract>() {\n return (\n definition: StageSpec<ContractState<Contract>, ContractManifest<Contract>>,\n ): StageSpec<ContractState<Contract>, ContractManifest<Contract>> =>\n definition;\n}\n\nexport function definePhaseStage<\n Contract extends AnyReducerGameContract,\n PhaseStateSchema extends SchemaLike<object>,\n>() {\n return (\n definition: StageSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >,\n ): StageSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > => definition;\n}\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"../model/table\";\nimport type { ManifestIdSchema } from \"../model/manifest\";\nimport type {\n BoundedNumberDomainDescriptor,\n ChoiceDomainDescriptor,\n ChoiceListDomainDescriptor,\n CollectorState,\n InputCollector,\n ResourceMapDomainDescriptor,\n} from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport type { DerivedResolver } from \"../derived\";\nimport { isPerPlayer } from \"../per-player\";\nimport type { DependencyValues, InputFieldRef } from \"./defineInputs\";\n\ntype DomainContext<\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n derived: DerivedResolver;\n values: Values;\n};\n\ntype ManifestFormInputSchema =\n | ManifestIdSchema<unknown>\n | z.ZodOptional<ManifestIdSchema<unknown>>\n | z.ZodNullable<ManifestIdSchema<unknown>>;\n\ntype DomainNumber<State extends CollectorState> =\n | number\n | ((context: DomainContext<State>) => number);\n\ntype ChoiceValue = string | null;\n\ntype FormInputDomainDescriptor =\n | ResourceMapDomainDescriptor\n | BoundedNumberDomainDescriptor\n | ChoiceDomainDescriptor\n | ChoiceListDomainDescriptor;\n\ntype DomainChoice<Value extends ChoiceValue, State extends CollectorState> = {\n value: Value;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype DomainChoicePresentation = {\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype ResourceMapChoiceDecorator<State extends CollectorState> = (\n context: DomainContext<State> & {\n resourceId: string;\n label: string;\n icon?: string;\n },\n) => DomainChoicePresentation | null | undefined;\n\ntype ResourceMapChoiceSource<State extends CollectorState> =\n | \"resourceMap\"\n | {\n source: \"resourceMap\";\n decorate?: ResourceMapChoiceDecorator<State>;\n };\n\ntype DomainChoices<Value extends ChoiceValue, State extends CollectorState> =\n | ReadonlyArray<DomainChoice<Value, State>>\n | ResourceMapChoiceSource<State>\n | ((\n context: DomainContext<State>,\n ) => ReadonlyArray<DomainChoice<Value, State>>);\n\ntype DependentDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n> =\n | ReadonlyArray<DomainChoice<Value, State>>\n | ((\n context: DomainContext<State, DependencyValues<Dependencies>>,\n ) => ReadonlyArray<DomainChoice<Value, State>>);\n\ntype ChoiceListDefaultValue<\n Value extends string,\n State extends CollectorState,\n> =\n | Value[]\n | \"all\"\n | ((\n context: DomainContext<State> & {\n choices: ReadonlyArray<DomainChoice<Value, State>>;\n },\n ) => Value[]);\n\ntype ChoiceDefaultValue<\n Value extends ChoiceValue,\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> =\n | Value\n | ((\n context: DomainContext<State, Values> & {\n choices: ReadonlyArray<DomainChoice<Value, State>>;\n },\n ) => Value);\n\ntype ChoiceDefaultResolver<\n Value extends ChoiceValue,\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = (\n context: DomainContext<State, Values> & {\n choices: ReadonlyArray<DomainChoice<Value, State>>;\n },\n) => Value | undefined;\n\nfunction isResourceMapChoiceSource<State extends CollectorState>(\n choices: DomainChoices<ChoiceValue, State>,\n): choices is ResourceMapChoiceSource<State> {\n return (\n choices === \"resourceMap\" ||\n (typeof choices === \"object\" &&\n choices !== null &&\n !Array.isArray(choices) &&\n \"source\" in choices &&\n choices.source === \"resourceMap\")\n );\n}\n\nfunction resolveDomainNumber<State extends CollectorState>(\n value: DomainNumber<State> | undefined,\n context: DomainContext<State>,\n fallback: number,\n): number {\n if (typeof value === \"function\") return value(context);\n return value ?? fallback;\n}\n\nfunction resolveDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n>(\n choices: DomainChoices<Value, State>,\n context: DomainContext<State>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n if (isResourceMapChoiceSource(choices)) {\n return resolveResourceMapChoices(choices, context);\n }\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction resolveDependentDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n>(\n choices: DependentDomainChoices<Value, State, Dependencies>,\n context: DomainContext<State, DependencyValues<Dependencies>>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction choiceValuesInclude(\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n value: ChoiceValue,\n): boolean {\n return choices.some((choice) => Object.is(choice.value, value));\n}\n\nfunction assertChoiceDefaultInChoices(\n inputName: string,\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n defaultValue: ChoiceValue,\n): void {\n if (choiceValuesInclude(choices, defaultValue)) return;\n const printable = defaultValue === null ? \"null\" : `'${defaultValue}'`;\n throw new Error(\n `${inputName} defaultValue ${printable} must be one of its choices. ` +\n \"If null is a valid value, add an explicit { value: null, label: ... } choice.\",\n );\n}\n\nfunction choiceSchema<Value extends ChoiceValue, State extends CollectorState>(\n choices: ReadonlyArray<DomainChoice<Value, State>>,\n): SchemaLike<Value> {\n const values = choices.map((choice) => choice.value);\n const stringValues = values.filter(\n (value): value is Exclude<Value, null> => value !== null,\n );\n const hasNull = values.some((value) => value === null);\n\n if (stringValues.length === 0) {\n return z.null() as unknown as SchemaLike<Value>;\n }\n\n const stringSchema = z.enum(\n stringValues as [Exclude<Value, null>, ...Array<Exclude<Value, null>>],\n );\n\n if (hasNull) {\n return z.union([stringSchema, z.null()]) as unknown as SchemaLike<Value>;\n }\n\n return stringSchema as unknown as SchemaLike<Value>;\n}\n\nfunction resolveResourceMapChoices<State extends CollectorState>(\n choices: ResourceMapChoiceSource<State>,\n context: DomainContext<State>,\n): Array<{\n value: string;\n label: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resources = context.state.table.resources as unknown;\n const firstResourceMap =\n isPerPlayer(resources) && resources.entries.length > 0\n ? resources.entries[0]?.[1]\n : resources;\n if (\n typeof firstResourceMap !== \"object\" ||\n firstResourceMap === null ||\n Array.isArray(firstResourceMap)\n ) {\n return [];\n }\n const decorate = choices === \"resourceMap\" ? undefined : choices.decorate;\n return Object.keys(firstResourceMap)\n .sort()\n .map((resourceId) => {\n const label = resourceId;\n const presentation = decorate?.({ ...context, resourceId, label });\n return {\n value: resourceId,\n label,\n badge: presentation?.badge,\n description: presentation?.description,\n disabled: presentation?.disabled,\n disabledReason: presentation?.disabledReason,\n };\n });\n}\n\nfunction createFormInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return {\n kind: \"form\",\n schema,\n ...(options && \"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n };\n}\n\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(schema: Schema): InputCollector<Schema, State, \"form\">;\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n};\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return createFormInput(schema, options);\n}\n\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n defaultValue: Record<string, number>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n};\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n defaultValue?: Record<string, number>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.record(z.string(), z.number().int().nonnegative()),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"resourceMap\",\n resources: options.resources.map((resource) => ({\n resourceId: resource.resourceId,\n label: resource.label,\n icon: resource.icon,\n min: resolveDomainNumber(resource.min, context, 0),\n max: resolveDomainNumber(resource.max, context, 0),\n })),\n };\n },\n };\n}\n\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n}): InputCollector<z.ZodNumber, State, \"form\">;\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> & {\n readonly defaultValue: number;\n};\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue?: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.number(),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"boundedNumber\",\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, 0),\n step:\n options.step === undefined\n ? undefined\n : resolveDomainNumber(options.step, context, 1),\n };\n },\n };\n}\n\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends ChoiceValue = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends ChoiceValue = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<string, unknown>[] =\n readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<string, unknown>[] =\n readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices:\n | DomainChoices<Value, State>\n | DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n defaultValue: ChoiceDefaultValue<\n Value,\n State,\n Readonly<Record<string, unknown>>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> {\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choice requires at least one choice.\");\n }\n const staticChoices = Array.isArray(options.choices) ? options.choices : null;\n const hasStaticDefault = typeof options.defaultValue !== \"function\";\n const staticDefault = options.defaultValue as ChoiceValue;\n if (staticChoices && hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n staticChoices,\n staticDefault,\n );\n }\n const schema = staticChoices\n ? (choiceSchema(staticChoices) as SchemaLike<Value>)\n : (z.string().nullable() as unknown as SchemaLike<Value>);\n const dynamicDefault =\n typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema,\n ...(hasStaticDefault ? { defaultValue: staticDefault as Value } : {}),\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state,\n playerId,\n q,\n derived,\n values,\n ): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n };\n const choices = dependsOn\n ? resolveDependentDomainChoices(\n options.choices as DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >,\n {\n ...context,\n values: (values ?? {}) as DependencyValues<\n readonly InputFieldRef<string, unknown>[]\n >,\n },\n )\n : resolveDomainChoices(options.choices as DomainChoices<Value, State>, {\n ...context,\n values: {},\n });\n if (hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n choices,\n staticDefault,\n );\n }\n return {\n type: \"choice\",\n choices,\n };\n },\n ...(dynamicDefault\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choice\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n const resolved = dynamicDefault({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n if (resolved === undefined) return undefined;\n assertChoiceDefaultInChoices(\"formInput.choice\", choices, resolved);\n return resolved;\n },\n }\n : {}),\n };\n}\n\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n};\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\">;\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> {\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choiceList requires at least one choice.\");\n }\n const staticDefaultValue = Array.isArray(options.defaultValue)\n ? options.defaultValue\n : undefined;\n const dynamicDefaultValue =\n options.defaultValue === \"all\" || typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema: z.array(z.string()) as unknown as SchemaLike<Value[]>,\n ...(staticDefaultValue !== undefined\n ? { defaultValue: staticDefaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n const choices = resolveDomainChoices(options.choices, context).map(\n (choice) => ({\n ...choice,\n value: choice.value as string,\n }),\n );\n return {\n type: \"choiceList\",\n choices,\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, choices.length),\n };\n },\n ...(dynamicDefaultValue\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choiceList\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n if (dynamicDefaultValue === \"all\") {\n return choices.map((choice) => choice.value);\n }\n return dynamicDefaultValue({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n },\n }\n : {}),\n };\n}\n\ntype FormInputForState<State extends CollectorState> = {\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n ): InputCollector<Schema, State, \"form\">;\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n ): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n };\n resourceMap(\n options: Parameters<typeof resourceMapInput<State>>[0],\n ): ReturnType<typeof resourceMapInput<State>>;\n resourceChoices(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State>;\n number(\n options: Parameters<typeof numberInput<State>>[0],\n ): ReturnType<typeof numberInput<State>>;\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n }): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n };\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n }): InputCollector<SchemaLike<Value>, State, \"form\">;\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n }): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n };\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n }): InputCollector<SchemaLike<Value[]>, State, \"form\">;\n};\n\nfunction formInputForState<\n State extends CollectorState,\n>(): FormInputForState<State> {\n return Object.assign(\n ((schema: ManifestFormInputSchema & SchemaLike<unknown>, options?: {}) =>\n baseFormInput(schema, options as never)) as FormInputForState<State>,\n {\n resourceMap: (options: Parameters<typeof resourceMapInput<State>>[0]) =>\n resourceMapInput<State>(options),\n resourceChoices: (options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }) => formInput.resourceChoices<State>(options),\n number: (options: Parameters<typeof numberInput<State>>[0]) =>\n numberInput<State>(options),\n choice: (options: never) => choiceInput(options),\n choiceList: (options: never) => choiceListInput(options),\n },\n );\n}\n\n/**\n * Manifest-backed id input. Free-form Zod schemas are intentionally explicit:\n * if the runtime cannot disclose valid values or numeric bounds through a\n * manifest id or domain helper, use a custom interaction surface with an\n * explicit `paramsSchema` instead of the default form renderer.\n */\nexport const formInput = Object.assign(baseFormInput, {\n resourceMap: resourceMapInput,\n resourceChoices: <State extends CollectorState = CollectorState>(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State> => ({\n source: \"resourceMap\",\n ...options,\n }),\n number: numberInput,\n choice: choiceInput,\n choiceList: choiceListInput,\n forState: formInputForState,\n});\n","import { z } from \"zod\";\nimport type { Brand } from \"./model/table\";\n\n/**\n * Opaque brand applied to a runtime player identifier.\n *\n * Generators produce a workspace-specific `PlayerId` alias (e.g.\n * `Brand<string, \"PlayerId\">` in `shared/manifest-contract.ts`). Authors\n * obtain `PlayerId` values only through:\n * - `q.player.order()` / `q.player.current()` (reducer queries),\n * - engine-injected callback arguments (actions, phases, prompts),\n * - `perPlayerKeys(...)` / entries iteration,\n * - `asPlayerId(raw)` as an explicit escape hatch (e.g. ingress parsing).\n *\n * The brand is a phantom type: at runtime a `PlayerId` is just a string.\n * Do not JSON-serialize the brand marker; it exists purely at the type\n * level to block accidental literal comparisons such as\n * `playerId === \"player-1\"`.\n */\nexport type PlayerId = Brand<string, \"PlayerId\">;\n\n/**\n * Explicit conversion from a raw string to a branded `PlayerId`.\n *\n * Use at trust boundaries only (wire ingress, tests, fixtures). Inside\n * reducer logic, obtain `PlayerId` values from the engine instead of\n * constructing them yourself.\n */\nexport function asPlayerId(raw: string): PlayerId {\n return raw as PlayerId;\n}\n\n/**\n * Type guard that narrows `unknown` to `PlayerId` when the value is a\n * non-empty string. Does not validate against a specific player roster;\n * use `perPlayerSchema`/ingress parsing for that.\n */\nexport function isPlayerId(value: unknown): value is PlayerId {\n return typeof value === \"string\" && value.length > 0;\n}\n\n/**\n * A runtime-accurate per-player map.\n *\n * `PerPlayer<Value>` is an opaque, ordered container whose entries are\n * exactly the players that exist at runtime (the seats passed to\n * `initialize`).\n *\n * The `__perPlayer` discriminator keeps the structural type nominal-ish\n * without depending on a symbol (symbols do not round-trip through JSON,\n * which this shape must).\n *\n * Construct with `perPlayer(ids, init)` and read with the accessors in\n * this module; do not reach into `entries` directly unless you need\n * ordered iteration.\n */\nexport interface PerPlayer<Value, Id extends PlayerId = PlayerId> {\n readonly __perPlayer: true;\n readonly entries: ReadonlyArray<readonly [Id, Value]>;\n}\n\n/**\n * Construct a `PerPlayer<Value>` with one entry per `id` in `ids`.\n *\n * `ids` is treated as the authoritative runtime seat list: the returned\n * `PerPlayer` contains exactly `ids.length` entries, in the same order.\n * Duplicate ids throw.\n */\nexport function perPlayer<Value, Id extends PlayerId = PlayerId>(\n ids: readonly Id[],\n init: (id: Id, index: number) => Value,\n): PerPlayer<Value, Id> {\n const seen = new Set<string>();\n const entries: Array<readonly [Id, Value]> = [];\n for (const [index, id] of ids.entries()) {\n if (seen.has(id)) {\n throw new Error(`perPlayer: duplicate player id '${id}'`);\n }\n seen.add(id);\n entries.push([id, init(id, index)] as const);\n }\n return { __perPlayer: true, entries };\n}\n\n/** Ordered list of seat ids present in the `PerPlayer`. */\nexport function perPlayerKeys<Id extends PlayerId>(\n value: PerPlayer<unknown, Id>,\n): Id[] {\n return value.entries.map((entry) => entry[0]);\n}\n\n/** Ordered list of values present in the `PerPlayer`. */\nexport function perPlayerValues<Value>(\n value: PerPlayer<Value, PlayerId>,\n): Value[] {\n return value.entries.map((entry) => entry[1]);\n}\n\n/**\n * Ordered `[id, value]` pairs. Returns the backing array as-is; callers\n * must not mutate it.\n */\nexport function perPlayerEntries<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n): ReadonlyArray<readonly [Id, Value]> {\n return value.entries;\n}\n\n/** Number of seats in the `PerPlayer`. */\nexport function perPlayerSize(value: PerPlayer<unknown, PlayerId>): number {\n return value.entries.length;\n}\n\n/** Whether `id` has a value. */\nexport function perPlayerHas<Id extends PlayerId>(\n value: PerPlayer<unknown, Id>,\n id: Id,\n): boolean {\n for (const [candidate] of value.entries) {\n if (candidate === id) {\n return true;\n }\n }\n return false;\n}\n\n/** Lookup with no fallback; returns `undefined` for missing seats. */\nexport function perPlayerGet<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n): Value | undefined {\n for (const [candidate, v] of value.entries) {\n if (candidate === id) {\n return v;\n }\n }\n return undefined;\n}\n\n/**\n * Lookup that throws if `id` is not present.\n *\n * Use when the caller has already established (via `q.player.order()`,\n * an action context, etc.) that `id` is an active runtime seat.\n */\nexport function perPlayerRequire<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n): Value {\n const found = perPlayerGet(value, id);\n if (found === undefined && !perPlayerHas(value, id)) {\n throw new Error(`perPlayerRequire: missing entry for player id '${id}'`);\n }\n return found as Value;\n}\n\n/**\n * Return a new `PerPlayer` with `id`'s value replaced (or added if the\n * id is not present). Preserves entry order; new entries are appended.\n */\nexport function perPlayerSet<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n next: Value,\n): PerPlayer<Value, Id> {\n const entries = value.entries.slice();\n const index = entries.findIndex((entry) => entry[0] === id);\n if (index >= 0) {\n entries[index] = [id, next] as const;\n } else {\n entries.push([id, next] as const);\n }\n return { __perPlayer: true, entries };\n}\n\n/**\n * Return a new `PerPlayer` where each value is replaced by `f(value, id)`.\n * Seat order is preserved.\n */\nexport function perPlayerMap<Value, Next, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n f: (v: Value, id: Id, index: number) => Next,\n): PerPlayer<Next, Id> {\n return {\n __perPlayer: true,\n entries: value.entries.map(\n ([id, v], index) => [id, f(v, id, index)] as const,\n ),\n };\n}\n\n/**\n * Structural check for a `PerPlayer` without a Zod schema. Useful in\n * debug paths and as a fast pre-filter before schema validation.\n */\nexport function isPerPlayer(value: unknown): value is PerPlayer<unknown> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const candidate = value as { __perPlayer?: unknown; entries?: unknown };\n if (candidate.__perPlayer !== true) {\n return false;\n }\n if (!Array.isArray(candidate.entries)) {\n return false;\n }\n return candidate.entries.every(\n (entry) =>\n Array.isArray(entry) &&\n entry.length === 2 &&\n typeof entry[0] === \"string\",\n );\n}\n\n/**\n * Options accepted by `perPlayerSchema`.\n *\n * Setting `players` locks the schema to an exact seat list: parse fails\n * if the input is missing any seat or has an unknown id. Leaving\n * `players` unset yields a schema that accepts any non-empty string as\n * a key, which is the right default for generic SDK types.\n *\n * `playerIdSchema` lets callers feed a manifest-scoped Zod id schema in\n * so parse errors carry the same message as other branded ids.\n */\nexport type PerPlayerSchemaOptions<Id extends PlayerId> = {\n readonly playerIdSchema?: z.ZodType<Id>;\n readonly players?: readonly Id[];\n};\n\n/**\n * Build a Zod schema that validates a wire-shaped `PerPlayer<Value>`.\n *\n * When `options.players` is supplied the schema enforces that entries\n * match that exact set (same cardinality, same ids, any order). This is\n * the mechanism that catches the class of bug where a 3-player session\n * produced a view shape the old `Record<PlayerId, T>` type claimed had\n * a `player-4` key.\n */\nexport function perPlayerSchema<Value, Id extends PlayerId = PlayerId>(\n valueSchema: z.ZodType<Value>,\n options: PerPlayerSchemaOptions<Id> = {},\n): z.ZodType<PerPlayer<Value, Id>> {\n const keySchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n\n const base = z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([keySchema, valueSchema])),\n })\n .transform(\n (value): PerPlayer<Value, Id> => ({\n __perPlayer: true as const,\n entries: value.entries as ReadonlyArray<readonly [Id, Value]>,\n }),\n );\n\n if (!options.players) {\n return base as unknown as z.ZodType<PerPlayer<Value, Id>>;\n }\n\n const expected = options.players;\n return base.superRefine((value, ctx) => {\n const seen = new Set<string>();\n for (const [id] of value.entries) {\n if (seen.has(id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate player id '${id}'`,\n });\n }\n seen.add(id);\n }\n for (const expectedId of expected) {\n if (!seen.has(expectedId)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Missing entry for player id '${expectedId}'`,\n });\n }\n }\n for (const id of seen) {\n if (!expected.some((expectedId) => expectedId === id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Unexpected player id '${id}' (allowed: ${expected.join(\", \")})`,\n });\n }\n }\n }) as unknown as z.ZodType<PerPlayer<Value, Id>>;\n}\n\n// ---------------------------------------------------------------------------\n// BoardRef: replacement for flat `\"board:player-N\"` literal unions.\n// ---------------------------------------------------------------------------\n\n/**\n * Reference to a board by its authored `baseId`, plus an optional seat\n * for per-player boards.\n *\n * Replaces the old generated `\"ring:player-1\" | \"ring:player-2\" | ...`\n * flat unions whose keys pretended to be static but were actually\n * derived from `maxPlayers` and therefore misaligned with the runtime\n * seat list.\n *\n * The discriminant is the *presence* of `seat`, not a `scope` field, so\n * authors can destructure and pass the ref directly without needing a\n * discriminator check for shared boards.\n */\nexport type BoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> = SharedBoardRef<BaseId> | PerPlayerBoardRef<BaseId, Id>;\n\nexport interface SharedBoardRef<BaseId extends string = string> {\n readonly baseId: BaseId;\n readonly seat?: undefined;\n}\n\nexport interface PerPlayerBoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> {\n readonly baseId: BaseId;\n readonly seat: Id;\n}\n\n/** Construct a shared board ref. */\nexport function sharedBoardRef<BaseId extends string>(\n baseId: BaseId,\n): SharedBoardRef<BaseId> {\n return { baseId };\n}\n\n/** Construct a per-player board ref. */\nexport function perPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat: Id,\n): PerPlayerBoardRef<BaseId, Id> {\n return { baseId, seat };\n}\n\n/**\n * Construct a `BoardRef` without knowing the scope ahead of time. Pass\n * `seat` for per-player boards; omit for shared boards.\n */\nexport function boardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat?: Id,\n): BoardRef<BaseId, Id> {\n if (seat === undefined) {\n return { baseId };\n }\n return { baseId, seat };\n}\n\n/** Stable string key for Maps/Records keyed by a `BoardRef`. */\nexport function boardRefKey(ref: BoardRef): string {\n return ref.seat === undefined ? ref.baseId : `${ref.baseId}:${ref.seat}`;\n}\n\n/**\n * Inverse of `boardRefKey`. Parses `\"base\"` as a shared ref and\n * `\"base:player-N\"` as a per-player ref. Returns `null` for malformed\n * input.\n */\nexport function parseBoardRefKey(key: string): BoardRef | null {\n if (!key.length) {\n return null;\n }\n const colon = key.indexOf(\":\");\n if (colon < 0) {\n return { baseId: key };\n }\n const baseId = key.slice(0, colon);\n const seat = key.slice(colon + 1);\n if (!baseId.length || !seat.length) {\n return null;\n }\n return { baseId, seat: seat as PlayerId };\n}\n\n/**\n * Zod schema for a `BoardRef` with free-form base and seat ids.\n *\n * Feed a manifest-scoped `baseIdSchema` and `playerIdSchema` to bind\n * the ref to a specific workspace.\n */\nexport function boardRefSchema<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n>(\n options: {\n readonly baseIdSchema?: z.ZodType<BaseId>;\n readonly playerIdSchema?: z.ZodType<Id>;\n } = {},\n): z.ZodType<BoardRef<BaseId, Id>> {\n const baseSchema =\n options.baseIdSchema ?? (z.string().min(1) as unknown as z.ZodType<BaseId>);\n const playerSchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n const shared = z.strictObject({ baseId: baseSchema });\n const perPlayer = z.strictObject({ baseId: baseSchema, seat: playerSchema });\n return z.union([perPlayer, shared]) as unknown as z.ZodType<\n BoardRef<BaseId, Id>\n >;\n}\n\n/** True when `ref` targets a shared board (no seat). */\nexport function isSharedBoardRef<BaseId extends string>(\n ref: BoardRef<BaseId, PlayerId>,\n): ref is SharedBoardRef<BaseId> {\n return ref.seat === undefined;\n}\n\n/** True when `ref` targets a per-player board (has a seat). */\nexport function isPerPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n ref: BoardRef<BaseId, Id>,\n): ref is PerPlayerBoardRef<BaseId, Id> {\n return ref.seat !== undefined;\n}\n","import type { z } from \"zod\";\nimport type { InputCollector } from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type InputFieldRef<\n Key extends string = string,\n Value = unknown,\n Collector extends InputCollector = InputCollector,\n> = {\n readonly key: Key;\n readonly collector: Collector;\n readonly __value?: Value;\n};\n\ntype RefValue<Ref> =\n Ref extends InputFieldRef<string, infer Value, InputCollector>\n ? Value\n : never;\n\ntype CollectorOfRef<Ref> =\n Ref extends InputFieldRef<string, unknown, infer Collector>\n ? Collector\n : never;\n\ntype CollectorValue<Collector> =\n Collector extends InputCollector<infer Schema> ? z.infer<Schema> : never;\n\nexport type DependencyValues<\n Dependencies extends readonly InputFieldRef<\n string,\n unknown,\n InputCollector\n >[],\n> = {\n readonly [Ref in Dependencies[number] as Ref[\"key\"]]: RefValue<Ref>;\n};\n\ntype DefinedInputRefs = Record<\n string,\n InputFieldRef<string, unknown, InputCollector>\n>;\n\nexport type DefinedInputs<Refs extends DefinedInputRefs> = {\n readonly [Key in keyof Refs]: CollectorOfRef<Refs[Key]>;\n};\n\nclass InputBuilder {\n add<\n const Key extends string,\n Collector extends InputCollector<SchemaLike<unknown>>,\n >(\n key: Key,\n collector: Collector,\n ): InputFieldRef<Key, CollectorValue<Collector>, Collector> {\n return { key, collector };\n }\n}\n\n/**\n * Define an interaction's inputs with typed field references. Field refs can be\n * passed to dependent input domains, and the returned collector map preserves\n * the original key/value types for interaction params.\n */\nexport function defineInputs<const Refs extends DefinedInputRefs>(\n define: (input: InputBuilder) => Refs,\n): DefinedInputs<Refs> {\n const refs = define(new InputBuilder());\n return Object.fromEntries(\n Object.entries(refs).map(([key, ref]) => [key, ref.collector]),\n ) as DefinedInputs<Refs>;\n}\n","import { z } from \"zod\";\nimport type {\n BoardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n TargetKind,\n} from \"../model/spec\";\nimport type { BoardTargetRule, PlayerBoardSpaceTarget } from \"./boardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `boardInput.*` helpers produce collectors that accept a board-element id\n * (vertex / edge / space / tile) scoped to one built `boardTarget` rule.\n *\n * Id typing:\n * The `Id` type parameter is the branded id for the board you target,\n * e.g. `HexVertexIdOfTable<Table, \"main\">` or\n * `SquareSpaceIdOfTable<Table, \"board\">`. Once tightened,\n * `ParamsOf<Collectors>` downstream typing reflects the branded id too.\n *\n * Eligibility:\n * Pass a built `boardTarget.*(...).where(...).build()` rule. The same rule\n * feeds server-authoritative eligible-target projection, submit validation,\n * and tests through its `bind({ state, playerId, q })` helper.\n *\n * Runtime vs. compile time:\n * At runtime the submitted value is a string. Branding is purely a\n * compile-time discipline.\n */\nfunction makeBoardCollector<\n Kind extends \"board-vertex\" | \"board-edge\" | \"board-tile\" | \"board-space\",\n>(kind: Kind) {\n return function collector<\n State extends CollectorState = CollectorState,\n Id extends string = string,\n >(options: {\n target: BoardTargetRule<State, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, State, Kind> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind,\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<BoardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state: CollectorState,\n playerId: string,\n q: unknown,\n _derived: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n } as unknown as InputCollector<z.ZodType<Id>, State, Kind>;\n };\n}\n\nexport const vertexInput = makeBoardCollector(\"board-vertex\");\nexport const edgeInput = makeBoardCollector(\"board-edge\");\nexport const tileInput = makeBoardCollector(\"board-tile\");\nexport const spaceInput = makeBoardCollector(\"board-space\");\n\nexport function playerSpaceInput<\n State extends CollectorState = CollectorState,\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = string,\n>(options: {\n target: BoardTargetRule<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<\n z.ZodType<PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>>,\n State,\n \"board-space\"\n> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"board-space\",\n schema: z.object({\n boardId: z.literal(target.boardId),\n playerId: z.string(),\n spaceId: z.string(),\n }) as unknown as z.ZodType<\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >,\n eligibleTargets: ((state, playerId, q, values) =>\n target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId)) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetValue, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetValue as PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<\n BoardTargetRule<\n CollectorState,\n PlayerBoardSpaceTarget<string, string, string>\n >[\"validate\"]\n >)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state: CollectorState,\n playerId: string,\n q: unknown,\n _derived: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n };\n}\n\nexport const boardInput = {\n vertex: vertexInput,\n edge: edgeInput,\n tile: tileInput,\n space: spaceInput,\n playerSpace: playerSpaceInput,\n};\n","import type { CollectorState, ValidationIssue } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\n\nexport type TargetContext<State extends CollectorState> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n values?: Readonly<Record<string, unknown>>;\n};\n\nexport type TargetPredicateArgs<\n State extends CollectorState,\n Target,\n> = TargetContext<State> & {\n targetId: Target;\n target: Target;\n};\n\nexport type TargetPredicate<State extends CollectorState, Target> = {\n id: string;\n errorCode: string;\n message?: string;\n test: (args: TargetPredicateArgs<State, Target>) => boolean;\n};\n\nexport type BoundTargetRule<Target> = {\n readonly eligible: () => readonly Target[];\n readonly validate: (target: Target) => ValidationIssue | null;\n readonly isEligible: (target: Target) => boolean;\n};\n\nexport type TargetRule<State extends CollectorState, Target> = {\n readonly eligible: (ctx: TargetContext<State>) => readonly Target[];\n readonly validate: (\n ctx: TargetContext<State>,\n target: Target,\n ) => ValidationIssue | null;\n readonly isEligible: (ctx: TargetContext<State>, target: Target) => boolean;\n readonly bind: (ctx: TargetContext<State>) => BoundTargetRule<Target>;\n};\n\nexport type TargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n> = {\n readonly where: (\n predicate: TargetPredicate<State, Target>,\n ) => TargetRuleBuilder<State, Target, Rule>;\n readonly build: () => Rule;\n};\n\nexport type TargetCandidateResolver<State extends CollectorState, Target> = (\n ctx: TargetContext<State>,\n) => readonly Target[];\n\nexport type TargetRuleOptions = {\n missingCandidateIssue?: ValidationIssue;\n equals?: (left: unknown, right: unknown) => boolean;\n};\n\nconst DEFAULT_MISSING_CANDIDATE_ISSUE: ValidationIssue = {\n errorCode: \"TARGET_NOT_ELIGIBLE\",\n message: \"Target is not eligible.\",\n};\n\nexport function createTargetRule<State extends CollectorState, Target>(\n candidates: TargetCandidateResolver<State, Target>,\n predicates: readonly TargetPredicate<State, Target>[],\n options: TargetRuleOptions = {},\n): TargetRule<State, Target> {\n const missingCandidateIssue =\n options.missingCandidateIssue ?? DEFAULT_MISSING_CANDIDATE_ISSUE;\n const equals = options.equals ?? Object.is;\n\n const validate = (\n ctx: TargetContext<State>,\n target: Target,\n ): ValidationIssue | null => {\n if (!candidates(ctx).some((candidate) => equals(candidate, target))) {\n return missingCandidateIssue;\n }\n for (const predicate of predicates) {\n if (!predicate.test({ ...ctx, targetId: target, target })) {\n return {\n errorCode: predicate.errorCode,\n message: predicate.message,\n };\n }\n }\n return null;\n };\n\n const rule: TargetRule<State, Target> = {\n eligible: (ctx) =>\n candidates(ctx).filter((targetId) => validate(ctx, targetId) == null),\n validate,\n isEligible: (ctx, target) => validate(ctx, target) == null,\n bind: (ctx) => ({\n eligible: () => rule.eligible(ctx),\n validate: (id) => rule.validate(ctx, id),\n isEligible: (id) => rule.isEligible(ctx, id),\n }),\n };\n\n return rule;\n}\n\nexport function createTargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n>(\n buildRule: (predicates: readonly TargetPredicate<State, Target>[]) => Rule,\n predicates: readonly TargetPredicate<State, Target>[] = [],\n): TargetRuleBuilder<State, Target, Rule> {\n return {\n where: (predicate) =>\n createTargetRuleBuilder(buildRule, [...predicates, predicate]),\n build: () => buildRule(predicates),\n };\n}\n","import type { CollectorState, TargetKind } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type BoardTargetPredicate<\n State extends CollectorState,\n Target,\n> = TargetPredicate<State, Target>;\n\nexport type BoardTargetRule<State extends CollectorState, Target> = TargetRule<\n State,\n Target\n> & {\n readonly boardId: string;\n readonly targetKind: TargetKind;\n readonly valueKind: \"board-id\" | \"player-board-space\";\n};\n\nexport type BoardTargetBuilder<\n State extends CollectorState,\n Target,\n> = TargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>;\n\nexport type PlayerBoardSpaceTarget<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string,\n> = {\n readonly boardId: BoardId;\n readonly playerId: PlayerId;\n readonly spaceId: SpaceId;\n};\n\nfunction candidateIdsForKind<State extends CollectorState, Id extends string>(\n q: TableQueriesOfState<State>,\n boardId: string,\n targetKind: TargetKind,\n): readonly Id[] {\n if (targetKind === \"edge\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).edges);\n }\n if (targetKind === \"vertex\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).vertices);\n }\n return idsFromCollection<Id>(q.board.get(boardId as never)?.spaces);\n}\n\nfunction idsFromCollection<Id extends string>(\n collection: unknown,\n): readonly Id[] {\n if (!collection) return [];\n const values = Array.isArray(collection)\n ? collection\n : Object.values(collection as Record<string, unknown>);\n return values.flatMap((value) => {\n if (typeof value === \"string\") return [value as Id];\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"id\" in value &&\n typeof (value as { id?: unknown }).id === \"string\"\n ) {\n return [(value as { id: string }).id as Id];\n }\n return [];\n });\n}\n\nfunction createBoardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(targetKind: TargetKind, boardId: string): BoardTargetBuilder<State, Id> {\n return createTargetRuleBuilder<State, Id, BoardTargetRule<State, Id>>(\n (predicates) => ({\n ...createTargetRule(\n ({ q }) => candidateIdsForKind<State, Id>(q, boardId, targetKind),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n },\n ),\n boardId,\n targetKind,\n valueKind: \"board-id\",\n }),\n );\n}\n\nfunction createPlayerSpaceTargetBuilder<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n>(\n boardId: BoardId,\n): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n> {\n type Target = PlayerBoardSpaceTarget<\n BoardId,\n SpaceId,\n PlayerIdOfState<State>\n >;\n return createTargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, q }) => {\n const spacesForPlayer = (playerId: string): readonly SpaceId[] =>\n candidateIdsForKind<State, SpaceId>(\n q,\n `${boardId}:${playerId}`,\n \"space\",\n );\n return state.table.playerOrder.flatMap((playerId) =>\n spacesForPlayer(playerId).map((spaceId) => ({\n boardId,\n playerId: playerId as PlayerIdOfState<State>,\n spaceId,\n })),\n );\n },\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n equals: (left, right) =>\n isPlayerBoardSpaceTarget(left) &&\n isPlayerBoardSpaceTarget(right) &&\n left.boardId === right.boardId &&\n left.playerId === right.playerId &&\n left.spaceId === right.spaceId,\n },\n ),\n boardId,\n targetKind: \"space\",\n valueKind: \"player-board-space\",\n }),\n );\n}\n\nfunction isPlayerBoardSpaceTarget(\n value: unknown,\n): value is PlayerBoardSpaceTarget<string, string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"boardId\" in value &&\n \"playerId\" in value &&\n \"spaceId\" in value\n );\n}\n\nfunction makeBoardTargetFactory(targetKind: TargetKind) {\n return function target<State extends CollectorState, Id extends string>(\n boardId: string,\n ): BoardTargetBuilder<State, Id> {\n return createBoardTargetBuilder<State, Id>(targetKind, boardId);\n };\n}\n\nexport const boardTarget = {\n edge: makeBoardTargetFactory(\"edge\"),\n vertex: makeBoardTargetFactory(\"vertex\"),\n space: makeBoardTargetFactory(\"space\"),\n tile: makeBoardTargetFactory(\"tile\"),\n playerSpace<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n >(\n boardId: BoardId,\n ): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n > {\n return createPlayerSpaceTargetBuilder<State, BoardId, SpaceId>(boardId);\n },\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type CardTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type CardTargetRule<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[] = readonly string[],\n> = TargetRule<State, Id> & {\n readonly zoneIds: ZoneIds;\n readonly zoneId: ZoneIds[number];\n readonly targetKind: \"card\";\n};\n\nexport type CardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[] = readonly string[],\n> = TargetRuleBuilder<State, Id, CardTargetRule<State, Id, ZoneIds>>;\n\nfunction cardIdsForZone<State extends CollectorState, Id extends string>(\n state: State,\n playerId: string,\n q: {\n zone: {\n sharedCards: (zoneId: never) => readonly unknown[];\n playerCards: (playerId: never, zoneId: never) => readonly unknown[];\n };\n },\n zoneId: string,\n): readonly Id[] {\n const table = state.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n if (\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {})\n ) {\n return q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly Id[];\n }\n if (zoneId in (table.decks ?? {}) || zoneId in (table.zones?.shared ?? {})) {\n return q.zone.sharedCards(zoneId as never) as readonly Id[];\n }\n return [];\n}\n\nfunction createCardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[],\n>(zoneIds: ZoneIds): CardTargetBuilder<State, Id, ZoneIds> {\n return createTargetRuleBuilder<State, Id, CardTargetRule<State, Id, ZoneIds>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, playerId, q }) =>\n zoneIds.flatMap((zoneId) =>\n cardIdsForZone<State, Id>(state, playerId, q, zoneId),\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CARD_TARGET_NOT_ELIGIBLE\",\n message: \"Card target is not eligible.\",\n },\n },\n ),\n zoneIds,\n zoneId: zoneIds[0] as ZoneIds[number],\n targetKind: \"card\",\n }),\n );\n}\n\nexport const cardTarget = {\n zones<\n State extends CollectorState,\n Id extends string = CardIdOfState<State>,\n const ZoneIds extends readonly string[] = readonly string[],\n >(zoneIds: ZoneIds): CardTargetBuilder<State, Id, ZoneIds> {\n return createCardTargetBuilder<State, Id, ZoneIds>(zoneIds);\n },\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetContext,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type ChoiceTargetOption<Id extends string> = {\n id: Id;\n label?: string;\n};\n\nexport type ChoiceOptionsFactory<\n State extends CollectorState,\n Id extends string,\n> = (\n state: State,\n playerId: PlayerIdOfState<State>,\n q: TableQueriesOfState<State>,\n) => ReadonlyArray<ChoiceTargetOption<Id>>;\n\nexport type ChoiceTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type ChoiceTargetRule<\n State extends CollectorState,\n Id extends string,\n> = TargetRule<State, Id> & {\n readonly targetKind: \"choice\";\n readonly options: (\n ctx: TargetContext<State>,\n ) => ReadonlyArray<ChoiceTargetOption<Id>>;\n readonly eligibleOptions: (\n ctx: TargetContext<State>,\n ) => ReadonlyArray<ChoiceTargetOption<Id>>;\n};\n\nexport type ChoiceTargetBuilder<\n State extends CollectorState,\n Id extends string,\n> = TargetRuleBuilder<State, Id, ChoiceTargetRule<State, Id>>;\n\nfunction normalizeOptions<State extends CollectorState, Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n): ChoiceOptionsFactory<State, Id> {\n if (typeof options === \"function\") return options;\n return () => options;\n}\n\nfunction createChoiceTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n): ChoiceTargetBuilder<State, Id> {\n const optionsFactory = normalizeOptions(options);\n return createTargetRuleBuilder<State, Id, ChoiceTargetRule<State, Id>>(\n (predicates) => {\n const baseRule = createTargetRule(\n (ctx) =>\n optionsFactory(ctx.state, ctx.playerId, ctx.q).map(\n (option) => option.id,\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CHOICE_TARGET_NOT_ELIGIBLE\",\n message: \"Choice target is not eligible.\",\n },\n },\n );\n return {\n ...baseRule,\n targetKind: \"choice\",\n options: (ctx) => optionsFactory(ctx.state, ctx.playerId, ctx.q),\n eligibleOptions: (ctx) =>\n optionsFactory(ctx.state, ctx.playerId, ctx.q).filter((option) =>\n baseRule.isEligible(ctx, option.id),\n ),\n };\n },\n );\n}\n\nexport const choiceTarget = {\n options<State extends CollectorState, Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n ): ChoiceTargetBuilder<State, Id> {\n return createChoiceTargetBuilder(options);\n },\n};\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport type { CardTargetRule } from \"./cardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `cardInput` produces a collector backed by one built `cardTarget` rule.\n * The submitted value is a manifest-branded card id.\n *\n * The target rule feeds server-authoritative eligible-card projection, submit\n * validation, and tests through its `bind({ state, playerId, q })` helper.\n */\nexport function cardInput<\n State extends CollectorState = CollectorState,\n Id extends string = CardIdOfState<State>,\n const ZoneIds extends readonly string[] = readonly string[],\n>(options: {\n target: CardTargetRule<State, Id, ZoneIds>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<z.ZodType<Id>, State, \"card\"> & {\n readonly meta: {\n readonly zoneId: ZoneIds[number];\n readonly zoneIds: ZoneIds;\n readonly targetKind: \"card\";\n };\n} {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"card\",\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<CardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (state, playerId, q, _derived, values) => ({\n type: \"cardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind,\n zoneIds: target.zoneIds,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n }),\n meta: {\n zoneId: target.zoneId,\n zoneIds: target.zoneIds,\n targetKind: target.targetKind,\n },\n };\n}\n","import type { SchemaLike } from \"../model/table\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { ChoiceTargetRule } from \"./choiceTarget\";\nimport type { z } from \"zod\";\n\ntype SchemaStringValue<Schema extends SchemaLike<unknown>> = Extract<\n Schema extends z.ZodType<infer V> ? V : never,\n string\n>;\n\n/**\n * `promptInput` marks an interaction as a prompt delivered to a player's\n * inbox. The submitted value is validated by the supplied Zod schema.\n *\n * Static or free-form prompts need only `schema`. Finite dynamic choices use\n * a built `choiceTarget.options(...).build()` rule so projected options and\n * submit validation share one source of truth.\n */\nexport function promptInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(options: {\n schema: Schema;\n target?: ChoiceTargetRule<State, SchemaStringValue<Schema>>;\n}): InputCollector<Schema, State, \"prompt\"> {\n const target = options.target;\n return {\n kind: \"prompt\",\n schema: options.schema,\n eligibleTargets: target\n ? (((state, playerId, q) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n ) => ReadonlyArray<unknown>)\n | undefined)\n : undefined,\n validateTarget: target\n ? (((state, playerId, q, targetId) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n },\n targetId as SchemaStringValue<Schema>,\n )) as InputCollector<Schema, State, \"prompt\">[\"validateTarget\"])\n : undefined,\n meta: target\n ? {\n options: (state: unknown, playerId: unknown, q: unknown) =>\n target.options({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n }),\n eligibleOptions: (state: unknown, playerId: unknown, q: unknown) =>\n target.eligibleOptions({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n }),\n }\n : undefined,\n domain: (state, playerId, q) => ({\n type: \"choice\" as const,\n choices: target\n ? target\n .options({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })\n .map((option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n }))\n : [],\n }),\n };\n}\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\n\n/**\n * `rngInput.*` helpers produce collectors whose value is *sampled by the\n * engine on submit* rather than supplied by the client. The schema pins\n * the exact output shape so `ParamsOf<Collectors>` sees precisely typed\n * results.\n *\n * Determinism:\n * Sampling happens inside `submitInteraction` only, never inside\n * `validateInteraction`. This lets clients dry-run a submission without\n * burning RNG state.\n */\n\ntype DieRoll = z.ZodObject<{ values: z.ZodArray<z.ZodNumber> }>;\ntype CoinFlip = z.ZodObject<{\n value: z.ZodEnum<{ heads: \"heads\"; tails: \"tails\" }>;\n}>;\n\n// The literal `kind: \"rng\"` is intentionally preserved in the return type\n// so `ClientParamsOf<Collectors>` can structurally detect engine-sampled\n// collectors and omit them from client-facing submit params.\ntype RngCollector<\n Schema extends DieRoll | CoinFlip,\n State extends CollectorState,\n> = InputCollector<Schema, State, \"rng\">;\n\n/**\n * Roll `count` d6s. The submitted value is `{ values: number[] }` with\n * `values.length === count` and each face `1..6`.\n */\nexport function d6<State extends CollectorState = CollectorState>(\n count: number = 1,\n): RngCollector<DieRoll, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n values: z.array(z.number().int().min(1).max(6)).length(count),\n }),\n meta: { rng: \"d6\", count },\n };\n}\n\n/** Flip a coin. The submitted value is `{ value: \"heads\" | \"tails\" }`. */\nexport function coin<\n State extends CollectorState = CollectorState,\n>(): RngCollector<CoinFlip, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n value: z.enum([\"heads\", \"tails\"]),\n }),\n meta: { rng: \"coin\" },\n };\n}\n\nexport const rngInput = { d6, coin };\n","import { z } from \"zod\";\nimport type {\n CollectorState,\n InputCollector,\n InputSelectionDescriptor,\n} from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type ManyOptions =\n | {\n count: number;\n distinct?: boolean;\n }\n | {\n min?: number;\n max?: number;\n distinct?: boolean;\n };\n\ntype NonRngCollector = InputCollector<SchemaLike<unknown>, CollectorState> & {\n readonly kind: Exclude<InputCollector[\"kind\"], \"rng\">;\n};\n\ntype CollectorSchema<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<infer Schema, CollectorState>,\n]\n ? Schema\n : never;\n\ntype CollectorStateOf<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<SchemaLike<unknown>, infer State>,\n]\n ? State\n : never;\n\ntype CollectorKindOf<Collector extends NonRngCollector> = [Collector] extends [\n {\n readonly kind: infer Kind extends Exclude<InputCollector[\"kind\"], \"rng\">;\n },\n]\n ? Kind\n : never;\n\nexport type ManyInputCollector<\n Schema extends SchemaLike<unknown> = SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n Kind extends Exclude<InputCollector[\"kind\"], \"rng\"> = Exclude<\n InputCollector[\"kind\"],\n \"rng\"\n >,\n> = InputCollector<z.ZodType<ReadonlyArray<z.infer<Schema>>>, State, Kind> & {\n readonly selection: Extract<InputSelectionDescriptor, { mode: \"many\" }>;\n};\n\nfunction normalizeManyOptions(\n options: ManyOptions,\n): Extract<InputSelectionDescriptor, { mode: \"many\" }> {\n if (\"count\" in options) {\n assertNonNegativeInteger(options.count, \"many(...).count\");\n return {\n mode: \"many\",\n min: options.count,\n max: options.count,\n distinct: options.distinct,\n };\n }\n const min = options.min ?? 0;\n assertNonNegativeInteger(min, \"many(...).min\");\n if (options.max !== undefined) {\n assertNonNegativeInteger(options.max, \"many(...).max\");\n if (options.max < min) {\n throw new Error(\"many(...).max must be greater than or equal to min.\");\n }\n }\n return {\n mode: \"many\",\n min,\n max: options.max,\n distinct: options.distinct,\n };\n}\n\nfunction assertNonNegativeInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative integer.`);\n }\n}\n\nexport function many<Collector extends NonRngCollector>(\n collector: Collector,\n options: ManyOptions,\n): ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n> &\n Pick<Collector, \"meta\"> {\n if ((collector as InputCollector).kind === \"rng\") {\n throw new Error(\"many(...) cannot wrap rngInput collectors.\");\n }\n const selection = normalizeManyOptions(options);\n const {\n schema: _schema,\n selection: _selection,\n defaultValue: _defaultValue,\n ...rest\n } = collector;\n return {\n ...rest,\n schema: z.array(collector.schema as z.ZodTypeAny) as unknown as z.ZodType<\n ReadonlyArray<z.infer<CollectorSchema<Collector>>>\n >,\n selection,\n } as unknown as ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n > &\n Pick<Collector, \"meta\">;\n}\n","import type {\n DispatchTraceEntry,\n TrustedReducerDispatchResult,\n TrustedRuntimeInput,\n} from \"../core/types\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\n\nexport function createRuntimeInstructionEngine<\n State,\n PlayerId extends string,\n Input extends TrustedRuntimeInput<PlayerId>,\n>({\n reduce,\n resolveInstruction,\n afterInput,\n}: {\n reduce: (\n state: State,\n input: Input,\n ) =>\n | { type: \"reject\"; errorCode: string; message?: string }\n | {\n type: \"accept\";\n state: State;\n instructions?: RuntimeInstructionForState<State>[];\n };\n resolveInstruction: (\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ) => {\n state: State;\n queuedInputs: Input[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n afterInput?: (\n state: State,\n input: Input,\n ) => {\n state: State;\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n}) {\n function drainInstructions(\n state: State,\n instructionsToDrain: RuntimeInstructionForState<State>[],\n ): State {\n let workingState = state;\n const instructionQueue = [...instructionsToDrain];\n const systemQueue: Input[] = [];\n\n while (instructionQueue.length > 0 || systemQueue.length > 0) {\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n systemQueue.push(...resolved.queuedInputs);\n }\n\n while (systemQueue.length > 0) {\n const input = systemQueue.shift();\n if (input === undefined) break;\n const result = reduce(workingState, input);\n if (result.type === \"reject\") {\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${input.kind}'.`,\n );\n }\n workingState = result.state;\n instructionQueue.push(...(result.instructions ?? []));\n }\n }\n\n return workingState;\n }\n\n function dispatch(\n state: State,\n input: Input,\n ): TrustedReducerDispatchResult<State, PlayerId> {\n let workingState = state;\n const pendingInputs: Input[] = [input];\n const trace: DispatchTraceEntry<State, PlayerId, Input>[] = [\n {\n type: \"acceptedClientInput\",\n input,\n },\n ];\n\n while (pendingInputs.length > 0) {\n const pendingInput = pendingInputs.shift();\n if (pendingInput === undefined) break;\n const result = reduce(workingState, pendingInput);\n if (result.type === \"reject\") {\n if (pendingInput === input) {\n return result;\n }\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${pendingInput.kind}'.`,\n );\n }\n\n workingState = result.state;\n\n if (afterInput) {\n const afterInputResult = afterInput(workingState, pendingInput);\n workingState = afterInputResult.state;\n trace.push(...afterInputResult.trace);\n }\n\n const instructionQueue = [...(result.instructions ?? [])];\n const continuationQueue: Input[] = [];\n while (instructionQueue.length > 0 || continuationQueue.length > 0) {\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n trace.push({\n type: \"appliedInstruction\",\n instruction,\n });\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n trace.push(...resolved.trace);\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n continuationQueue.push(...resolved.queuedInputs);\n }\n\n while (continuationQueue.length > 0) {\n const queued = continuationQueue.shift();\n if (queued === undefined) break;\n pendingInputs.push(queued);\n }\n }\n }\n\n return {\n type: \"accept\",\n state: workingState,\n trace,\n };\n }\n\n return {\n dispatch,\n drainInstructions,\n };\n}\n","import type {\n CardCollection,\n ViewCard,\n ViewSlotOccupant,\n} from \"../types/index.js\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n CardIdOfTable,\n CardIdOfState,\n ComponentLocationOfTable,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandCardsOfTable,\n HandIdOfTable,\n HexBoardIdOfTable,\n HexEdgeIdOfTable,\n HexSpaceIdOfTable,\n HexVertexIdOfTable,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RelationTypeIdOfTable,\n ResolvedContainerLocation,\n ResolvedDeckLocation,\n ResolvedEdgeLocation,\n ResolvedHandLocation,\n ResolvedSlotLocation,\n ResolvedSpaceLocation,\n ResolvedVertexLocation,\n ResolvedZoneLocation,\n ResourceBalancesOfTable,\n RuntimeBoardState,\n RuntimeComponentLocation,\n RuntimeRecord,\n RuntimeTableRecord,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeStateOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexStateOfTable,\n TiledVertexTypeIdOfTable,\n} from \"./model\";\nimport type { PerPlayer, PlayerId } from \"./per-player\";\nimport { perPlayerGet, perPlayerMap, perPlayerSet } from \"./per-player\";\n\n// Thin wrappers that preserve the existing \"look up by player id\" idiom used\n// throughout this file. `hands`, `zones.perPlayer`, and `resources` are\n// `PerPlayer<T>`-shaped at runtime (the ingress codec rejects anything else),\n// so these helpers assume the wrapper is always present.\nfunction ppRead<Value>(\n value: PerPlayer<Value> | undefined,\n playerId: string,\n): Value | undefined {\n if (value === undefined) return undefined;\n return perPlayerGet(value, playerId as PlayerId);\n}\n\nfunction ppWrite<Value>(\n value: PerPlayer<Value> | undefined,\n playerId: string,\n next: Value,\n): PerPlayer<Value> {\n const base: PerPlayer<Value> = value ?? { __perPlayer: true, entries: [] };\n return perPlayerSet(base, playerId as PlayerId, next);\n}\n\ntype ViewCardForTable<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<Table>,\n> =\n CardId extends CardIdOfTable<Table>\n ? ViewCard<\n CardId & string,\n Table[\"cards\"][CardId][\"cardType\"] & string,\n Extract<Table[\"cards\"][CardId][\"properties\"], Record<string, unknown>>\n >\n : never;\n\ntype ViewSlotOccupantForTable<Table extends RuntimeTableRecord> =\n ViewSlotOccupant<\n ComponentIdOfTable<Table> & string,\n PlayerIdOfTable<Table> & string,\n string,\n Record<string, unknown>\n >;\n\nexport function ensureArray<T>(value: readonly T[] | T[] | undefined): T[] {\n return Array.isArray(value) ? [...value] : [];\n}\n\nfunction locationPosition(location: RuntimeComponentLocation): number {\n return \"position\" in location && typeof location.position === \"number\"\n ? location.position\n : Number.MAX_SAFE_INTEGER;\n}\n\nfunction orderedComponentIdsForLocation(\n table: RuntimeTableRecord,\n predicate: (location: RuntimeComponentLocation) => boolean,\n): string[] {\n return Object.entries(table.componentLocations)\n .filter(([, location]) => predicate(location))\n .sort(\n (left, right) => locationPosition(left[1]) - locationPosition(right[1]),\n )\n .map(([componentId]) => componentId);\n}\n\nfunction allowedCardSetIdsForZone(\n table: RuntimeTableRecord,\n zoneId: string,\n): readonly string[] {\n return table.zones.cardSetIdsByZoneId?.[zoneId] ?? [];\n}\n\nfunction hasOwnKey(record: Record<string, unknown>, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, key);\n}\n\nfunction isSharedZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.decks, zoneId) || hasOwnKey(table.zones.shared, zoneId)\n );\n}\n\nfunction isPlayerZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.hands, zoneId) ||\n hasOwnKey(table.zones.perPlayer, zoneId) ||\n hasOwnKey(table.handVisibility, zoneId)\n );\n}\n\nfunction zoneScopeForId(\n table: RuntimeTableRecord,\n zoneId: string,\n): \"shared\" | \"perPlayer\" | null {\n if (isPlayerZoneId(table, zoneId)) {\n return \"perPlayer\";\n }\n if (isSharedZoneId(table, zoneId)) {\n return \"shared\";\n }\n return null;\n}\n\nfunction assertZoneScope(\n table: RuntimeTableRecord,\n zoneId: string,\n expectedScope: \"shared\" | \"perPlayer\",\n operation: string,\n argumentName: string,\n): void {\n const actualScope = zoneScopeForId(table, zoneId);\n if (actualScope === expectedScope) {\n return;\n }\n\n if (actualScope === null) {\n throw new Error(\n `Unknown zone '${zoneId}' passed as ${argumentName} to ${operation}.`,\n );\n }\n\n throw new Error(\n `Zone '${zoneId}' has scope '${actualScope}', but ${operation} requires ${argumentName} to be a ${expectedScope === \"shared\" ? \"shared\" : \"perPlayer\"} zone.`,\n );\n}\n\nfunction matchesSlotHost(\n location: RuntimeComponentLocation,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId?: string,\n): location is Extract<RuntimeComponentLocation, { type: \"InSlot\" }> {\n return (\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n (slotId === undefined || location.slotId === slotId)\n );\n}\n\nfunction componentPlayerId<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): (PlayerIdOfTable<Table> & string) | null {\n const piece = table.pieces[componentId];\n if (piece) {\n return (piece.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return (die.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const owner = table.ownerOfCard[componentId];\n if (owner !== undefined) {\n return (owner ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n return null;\n}\n\nfunction componentData<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): Record<string, unknown> | undefined {\n const piece = table.pieces[componentId];\n if (piece) {\n return piece.properties as Record<string, unknown>;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return die.properties as Record<string, unknown>;\n }\n\n const card = table.cards[componentId];\n if (card) {\n return card.properties as Record<string, unknown>;\n }\n\n return undefined;\n}\n\nexport function assertCardAllowedInZone<Table extends RuntimeTableRecord>(\n table: Table,\n zoneId: string,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds = allowedCardSetIdsForZone(table, zoneId);\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter zone '${zoneId}'.`,\n );\n }\n}\n\nfunction cloneRuntimeBoardState(board: RuntimeBoardState): RuntimeBoardState {\n if (board.layout !== \"generic\") {\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n edges: board.edges.map((edge) => ({\n ...edge,\n spaceIds: [...edge.spaceIds],\n fields: { ...edge.fields },\n })),\n vertices: board.vertices.map((vertex) => ({\n ...vertex,\n spaceIds: [...vertex.spaceIds],\n fields: { ...vertex.fields },\n })),\n };\n }\n\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n };\n}\n\nexport function cloneRuntimeTable<Table extends RuntimeTableRecord>(\n table: Table,\n): Table {\n return {\n ...table,\n zones: {\n shared: Object.fromEntries(\n Object.entries(table.zones.shared).map(([zoneId, componentIds]) => [\n zoneId,\n [...componentIds],\n ]),\n ) as Table[\"zones\"][\"shared\"],\n perPlayer: Object.fromEntries(\n Object.entries(table.zones.perPlayer).map(([zoneId, players]) => [\n zoneId,\n perPlayerMap(players as PerPlayer<string[]>, (componentIds) => [\n ...componentIds,\n ]),\n ]),\n ) as Table[\"zones\"][\"perPlayer\"],\n visibility: { ...table.zones.visibility },\n cardSetIdsByZoneId: table.zones.cardSetIdsByZoneId\n ? Object.fromEntries(\n Object.entries(table.zones.cardSetIdsByZoneId).map(\n ([zoneId, cardSetIds]) => [zoneId, [...cardSetIds]],\n ),\n )\n : table.zones.cardSetIdsByZoneId,\n } as Table[\"zones\"],\n decks: Object.fromEntries(\n Object.entries(table.decks).map(([deckId, cards]) => [\n deckId,\n [...cards],\n ]),\n ) as Table[\"decks\"],\n hands: Object.fromEntries(\n Object.entries(table.hands).map(([handId, players]) => [\n handId,\n perPlayerMap(players as PerPlayer<string[]>, (cards) => [...cards]),\n ]),\n ) as Table[\"hands\"],\n handVisibility: { ...table.handVisibility },\n pieces: Object.fromEntries(\n Object.entries(table.pieces).map(([pieceId, piece]) => [\n pieceId,\n { ...piece },\n ]),\n ) as Table[\"pieces\"],\n componentLocations: { ...table.componentLocations },\n ownerOfCard: { ...table.ownerOfCard },\n visibility: { ...table.visibility },\n resources: perPlayerMap(\n table.resources as PerPlayer<RuntimeRecord>,\n (resources) => ({ ...resources }),\n ) as Table[\"resources\"],\n boards: {\n ...table.boards,\n byId: Object.fromEntries(\n Object.entries(table.boards.byId).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n hex: Object.fromEntries(\n Object.entries(table.boards.hex ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n square: Object.fromEntries(\n Object.entries(table.boards.square ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n } as Table[\"boards\"],\n dice: Object.fromEntries(\n Object.entries(table.dice).map(([dieId, die]) => [dieId, { ...die }]),\n ) as Table[\"dice\"],\n };\n}\n\nfunction syncSharedZoneWithDeck<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId, nextCards: readonly string[]): void {\n table.decks[zoneId] = [...nextCards] as Table[\"decks\"][ZoneId];\n table.zones.shared[zoneId] = [\n ...nextCards,\n ] as Table[\"zones\"][\"shared\"][ZoneId];\n}\n\n/**\n * Read or write a per-player zone's card list by mutating `table` in place.\n * Called with no `nextCards` to read; called with `nextCards` to write the\n * new ordering. Returns the list at the read site as a plain array.\n *\n * Used by engine-side per-player shuffle resolution; authors should reach for\n * the named ops in this file.\n */\nexport function shufflePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n nextCards?: readonly string[],\n): string[] {\n if (nextCards === undefined) {\n const fromZone = ppRead(\n table.zones.perPlayer[zoneId] ?? table.hands[zoneId],\n playerId,\n ) as readonly string[] | undefined;\n return [...ensureArray(fromZone)];\n }\n table.hands[zoneId] = ppWrite(table.hands[zoneId], playerId, [\n ...nextCards,\n ]) as (typeof table.hands)[string];\n table.zones.perPlayer[zoneId] = ppWrite(\n table.zones.perPlayer[zoneId],\n playerId,\n [...nextCards],\n ) as (typeof table.zones.perPlayer)[string];\n return [...nextCards];\n}\n\nfunction syncPlayerZoneWithHand<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n playerId: PlayerId,\n nextCards: readonly string[],\n): void {\n table.hands[zoneId] = ppWrite(table.hands[zoneId], playerId as string, [\n ...nextCards,\n ]) as Table[\"hands\"][ZoneId];\n table.zones.perPlayer[zoneId] = ppWrite(\n table.zones.perPlayer[zoneId],\n playerId as string,\n [...nextCards],\n ) as Table[\"zones\"][\"perPlayer\"][ZoneId];\n}\n\nfunction reindexSpaceOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): void {\n getComponentsOnSpace(table, boardId, spaceId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnSpace\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexContainerOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, containerId: ContainerId): void {\n getComponentsInContainer(table, boardId, containerId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InContainer\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexEdgeOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n EdgeId extends HexEdgeIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnEdge\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexVertexOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n VertexId extends HexVertexIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, vertexId: VertexId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnVertex\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n location.slotId === slotId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InSlot\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction removeComponentFromCurrentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): void {\n const currentLocation = table.componentLocations[componentId];\n if (!currentLocation) {\n return;\n }\n\n if (currentLocation.type === \"InDeck\") {\n const nextCards = ensureArray(table.decks[currentLocation.deckId]).filter(\n (candidate) => candidate !== componentId,\n );\n syncSharedZoneWithDeck(\n table,\n currentLocation.deckId as SharedZoneIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InDeck\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"InHand\") {\n const nextCards = ensureArray(\n ppRead(table.hands[currentLocation.handId], currentLocation.playerId),\n ).filter((candidate) => candidate !== componentId);\n syncPlayerZoneWithHand(\n table,\n currentLocation.handId as PlayerZoneIdOfTable<Table>,\n currentLocation.playerId as PlayerIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InHand\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"OnSpace\") {\n delete table.componentLocations[componentId];\n reindexSpaceOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.spaceId as SpaceIdOfTable<Table, BoardIdOfTable<Table>>,\n );\n return;\n }\n\n if (currentLocation.type === \"InZone\") {\n if (currentLocation.zoneId in table.zones.shared) {\n const nextComponents = ensureArray(\n table.zones.shared[currentLocation.zoneId],\n ).filter((candidate) => candidate !== componentId);\n syncSharedZoneWithDeck(\n table,\n currentLocation.zoneId as SharedZoneIdOfTable<Table>,\n nextComponents,\n );\n nextComponents.forEach((currentComponentId, index) => {\n const location = table.componentLocations[currentComponentId];\n if (location?.type === \"InZone\") {\n table.componentLocations[currentComponentId] = {\n ...location,\n position: index,\n };\n }\n });\n }\n delete table.componentLocations[componentId];\n return;\n }\n\n if (currentLocation.type === \"InContainer\") {\n delete table.componentLocations[componentId];\n reindexContainerOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.containerId as BoardContainerIdOfTable<\n Table,\n BoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnEdge\") {\n delete table.componentLocations[componentId];\n reindexEdgeOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.edgeId as HexEdgeIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnVertex\") {\n delete table.componentLocations[componentId];\n reindexVertexOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.vertexId as HexVertexIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"InSlot\") {\n delete table.componentLocations[componentId];\n reindexSlotOccupants(table, currentLocation.host, currentLocation.slotId);\n return;\n }\n\n delete table.componentLocations[componentId];\n}\n\nfunction appendToDeck<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertZoneScope(\n nextTable,\n deckId as string,\n \"shared\",\n \"addCardToSharedZone\",\n \"zoneId\",\n );\n const deckCards = [\n ...ensureArray(nextTable.decks[deckId]),\n ] as DeckCardsOfTable<Table, DeckId>;\n assertCardAllowedInZone(nextTable, deckId, cardId);\n if (position === \"top\") {\n deckCards.unshift(cardId);\n } else {\n deckCards.push(cardId);\n }\n syncSharedZoneWithDeck(nextTable, deckId, deckCards);\n for (const [index, currentCardId] of deckCards.entries()) {\n if (currentCardId === cardId) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId,\n playedBy,\n position: index,\n };\n continue;\n }\n const existing = nextTable.componentLocations[currentCardId];\n nextTable.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId,\n playedBy: existing?.type === \"InDeck\" ? existing.playedBy : null,\n position: index,\n };\n }\n nextTable.ownerOfCard[cardId] = playedBy;\n nextTable.visibility[cardId] = {\n faceUp: true,\n };\n return nextTable;\n}\n\nfunction removeFromDeck<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertZoneScope(\n nextTable,\n deckId as string,\n \"shared\",\n \"removeCardFromSharedZone\",\n \"zoneId\",\n );\n const remaining = ensureArray(nextTable.decks[deckId]).filter(\n (candidate) => candidate !== cardId,\n );\n syncSharedZoneWithDeck(nextTable, deckId, remaining);\n for (const [index, currentCardId] of remaining.entries()) {\n const currentLocation = nextTable.componentLocations[currentCardId];\n if (currentLocation?.type === \"InDeck\") {\n nextTable.componentLocations[currentCardId] = {\n ...currentLocation,\n position: index,\n };\n }\n }\n return nextTable;\n}\n\nfunction computeVisibilityForPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction moveFromHandToDeck<\n Table extends RuntimeTableRecord,\n HandId extends HandIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends DeckIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n handId: HandId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n deckId: DeckId;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.handId as string,\n \"perPlayer\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.deckId as string,\n \"shared\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"toZoneId\",\n );\n const currentHand = ensureArray(\n ppRead(nextTable.hands[options.handId], options.playerId as string) as\n | readonly string[]\n | undefined,\n ).filter((candidate) => candidate !== options.cardId);\n syncPlayerZoneWithHand(\n nextTable,\n options.handId,\n options.playerId,\n currentHand,\n );\n for (const [index, currentCardId] of currentHand.entries()) {\n nextTable.componentLocations[currentCardId as string] = {\n type: \"InHand\",\n handId: options.handId,\n playerId: options.playerId,\n position: index,\n };\n }\n nextTable.ownerOfCard[options.cardId] = options.playedBy ?? options.playerId;\n nextTable.visibility[options.cardId] = {\n faceUp: true,\n };\n return appendToDeck(\n nextTable,\n options.deckId,\n options.cardId,\n options.playedBy ?? options.playerId,\n options.position ?? \"bottom\",\n );\n}\n\nexport function setActivePlayers<\n State extends { flow: { activePlayers: PlayerIdOfState<State>[] } },\n>(state: State, activePlayers: PlayerIdOfState<State>[]): State {\n return {\n ...state,\n flow: {\n ...state.flow,\n activePlayers,\n },\n };\n}\n\nexport function setPhaseState<State extends { phase: object }, PhaseState>(\n state: State,\n phaseState: PhaseState,\n): State {\n return {\n ...state,\n phase: phaseState,\n };\n}\n\ntype DeckCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends DeckIdOfTable<Table>,\n> = ZoneId extends infer Each extends DeckIdOfTable<Table>\n ? DeckCardsOfTable<Table, Each>\n : never;\n\ntype HandCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends HandIdOfTable<Table>,\n> = ZoneId extends infer Each extends HandIdOfTable<Table>\n ? HandCardsOfTable<Table, Each>\n : never;\n\nexport function getSharedZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId): DeckCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"shared\",\n \"getSharedZoneCards\",\n \"zoneId\",\n );\n return [\n ...ensureArray(table.zones.shared[zoneId] ?? table.decks[zoneId]),\n ] as DeckCardsForZone<Table, ZoneId>;\n}\n\nexport function getPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): HandCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"perPlayer\",\n \"getPlayerZoneCards\",\n \"zoneId\",\n );\n const cards =\n ppRead(table.zones.perPlayer[zoneId], playerId as string) ??\n ppRead(table.hands[zoneId], playerId as string);\n return [\n ...ensureArray(cards as readonly string[] | undefined),\n ] as unknown as HandCardsForZone<Table, ZoneId>;\n}\n\nfunction collectZoneIds(\n ...sources: ReadonlyArray<Record<string, unknown> | undefined>\n): string[] {\n const seen = new Set<string>();\n for (const source of sources) {\n if (!source) continue;\n for (const key of Object.keys(source)) {\n seen.add(key);\n }\n }\n return [...seen];\n}\n\nexport function getAllSharedZoneCards<Table extends RuntimeTableRecord>(\n table: Table,\n): {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n} {\n const zoneIds = collectZoneIds(\n table.zones.shared as Record<string, unknown> | undefined,\n table.decks as Record<string, unknown> | undefined,\n );\n const result: Record<string, readonly unknown[]> = {};\n for (const zoneId of zoneIds) {\n result[zoneId] = getSharedZoneCards(\n table,\n zoneId as SharedZoneIdOfTable<Table>,\n );\n }\n return result as {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n };\n}\n\nexport function getAllPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n} {\n const result: Record<string, readonly unknown[]> = {};\n for (const playerId of table.playerOrder) {\n result[playerId] = getPlayerZoneCards(\n table,\n playerId as PlayerIdOfTable<Table>,\n zoneId,\n );\n }\n return result as {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n };\n}\n\nexport function getCard<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): ViewCardForTable<Table, CardId> {\n const card = table.cards[cardId] as Table[\"cards\"][CardId];\n\n return {\n id: card.id,\n cardType: card.cardType,\n name: card.name,\n text: card.text,\n properties: card.properties,\n } as ViewCardForTable<Table, CardId>;\n}\n\nexport function getCardsById<\n Table extends RuntimeTableRecord,\n const CardIds extends readonly CardIdOfTable<NoInfer<Table>>[],\n>(\n table: Table,\n cardIds: CardIds,\n): Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id> | undefined;\n}> {\n return Object.fromEntries(\n cardIds.map((cardId) => [\n cardId,\n table.cards[cardId] ? getCard(table, cardId) : undefined,\n ]),\n ) as Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id> | undefined;\n }>;\n}\n\nexport function getSharedZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getSharedZoneCards(table, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getPlayerZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getPlayerZoneCards(table, playerId, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): ViewSlotOccupantForTable<Table>[] {\n return orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host, slotId),\n ).map((componentId) => ({\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n }));\n}\n\nexport function getSlotOccupantsByHost<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n): Readonly<Record<string, ViewSlotOccupantForTable<Table>[]>> {\n const occupantsBySlot: Record<string, ViewSlotOccupantForTable<Table>[]> = {};\n\n orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host),\n ).forEach((componentId) => {\n const location = table.componentLocations[componentId];\n if (!location || !matchesSlotHost(location, host)) {\n return;\n }\n\n const slotOccupant: ViewSlotOccupantForTable<Table> = {\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId: location.slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n };\n\n (occupantsBySlot[location.slotId] ??= []).push(slotOccupant);\n });\n\n return occupantsBySlot;\n}\n\nexport function getCardOwner<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"ownerOfCard\"][CardId] {\n return table.ownerOfCard[cardId] as Table[\"ownerOfCard\"][CardId];\n}\n\nexport function getCardVisibility<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"visibility\"][CardId] {\n return table.visibility[cardId] as Table[\"visibility\"][CardId];\n}\n\nexport function getPlayerOrder<Table extends RuntimeTableRecord>(\n table: Table,\n): Table[\"playerOrder\"] {\n return table.playerOrder;\n}\n\nexport function getPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: PlayerIdOfTable<NoInfer<Table>>,\n): ResourceBalancesOfTable<Table> {\n return perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as unknown as PlayerId,\n ) as ResourceBalancesOfTable<Table>;\n}\n\n/**\n * Read the amount a player holds of a single resource. Returns `0` when the\n * player has never accumulated that resource.\n */\nexport function getPlayerResourceAmount<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n): number {\n const playerResources = perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n );\n if (!playerResources) return 0;\n const value = (playerResources as Record<string, unknown>)[resourceId];\n return typeof value === \"number\" ? value : 0;\n}\n\n/**\n * Sum of every resource amount for a player (e.g. \"total cards in hand\"\n * games). Skips `undefined` and non-number values.\n */\nexport function getPlayerResourceTotal<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): number {\n const playerResources = perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n );\n if (!playerResources) return 0;\n let total = 0;\n for (const key of Object.keys(playerResources)) {\n const value = (playerResources as Record<string, unknown>)[key];\n if (typeof value === \"number\") total += value;\n }\n return total;\n}\n\n/**\n * Next player in seating order after `playerId`, wrapping around to the\n * first seat. Returns `null` when `playerId` is not in the player order or\n * the order is empty.\n */\nexport function getNextPlayerInOrder<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): PlayerIdOfTable<Table> | null {\n const order = table.playerOrder as unknown as ReadonlyArray<\n PlayerIdOfTable<Table>\n >;\n if (order.length === 0) return null;\n const idx = order.indexOf(playerId as PlayerIdOfTable<Table>);\n if (idx < 0) return null;\n return order[(idx + 1) % order.length] ?? null;\n}\n\n/**\n * Iterate a resource-amounts record, skipping undefined / non-positive entries.\n * Shared by the resource mutation helpers below.\n */\nfunction forEachResourceEntry(\n amounts: Readonly<Record<string, number | undefined>>,\n visit: (resourceId: string, amount: number) => void,\n): void {\n for (const resourceId of Object.keys(amounts)) {\n const amount = amounts[resourceId];\n if (typeof amount !== \"number\" || amount === 0) continue;\n visit(resourceId, amount);\n }\n}\n\n/**\n * Return `true` when `playerId` has at least the requested `amounts` of each\n * resource. Unknown resource ids are treated as zero-balance (i.e. requesting\n * one of them returns `false` unless the requested amount is also zero).\n */\nexport function canAffordResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): boolean {\n for (const resourceId of Object.keys(amounts)) {\n const required = amounts[resourceId];\n if (typeof required !== \"number\" || required <= 0) continue;\n if (getPlayerResourceAmount(table, playerId, resourceId) < required) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Return the subset of `amounts` that the player cannot afford. The returned\n * record maps resource id → shortfall. Empty when the player can afford the\n * full cost.\n */\nexport function getMissingResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Record<string, number> {\n const missing: Record<string, number> = {};\n for (const resourceId of Object.keys(amounts)) {\n const required = amounts[resourceId];\n if (typeof required !== \"number\" || required <= 0) continue;\n const have = getPlayerResourceAmount(table, playerId, resourceId);\n if (have < required) missing[resourceId] = required - have;\n }\n return missing;\n}\n\nfunction withPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n nextForPlayer: Record<string, number>,\n): Table {\n return {\n ...table,\n resources: perPlayerSet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n nextForPlayer as RuntimeRecord,\n ),\n } as Table;\n}\n\n/**\n * Increment each resource in `amounts` for `playerId`. Negative entries are\n * rejected — prefer {@link spendPlayerResources} for deductions so that\n * affordability is checked explicitly.\n */\nexport function addPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n forEachResourceEntry(amounts, (resourceId, amount) => {\n if (amount < 0) {\n throw new Error(\n `addPlayerResources: negative amount for resource '${resourceId}'. ` +\n `Use spendPlayerResources or transferPlayerResources instead.`,\n );\n }\n next[resourceId] = (next[resourceId] ?? 0) + amount;\n });\n return withPlayerResources(table, playerId, next);\n}\n\n/**\n * Deduct each resource in `amounts` from `playerId`. Throws when the player\n * cannot afford the full cost — callers must check `canAfford` in their\n * `validate` phase before invoking this op.\n */\nexport function spendPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n if (!canAffordResources(table, playerId, amounts)) {\n const missing = getMissingResources(table, playerId, amounts);\n throw new Error(\n `spendPlayerResources: player '${playerId}' cannot afford ${JSON.stringify(\n missing,\n )}. Check canAfford in your validate step first.`,\n );\n }\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n forEachResourceEntry(amounts, (resourceId, amount) => {\n if (amount < 0) {\n throw new Error(\n `spendPlayerResources: negative amount for resource '${resourceId}'. ` +\n `Pass positive amounts — the op deducts them from the player.`,\n );\n }\n next[resourceId] = Math.max(0, (next[resourceId] ?? 0) - amount);\n });\n return withPlayerResources(table, playerId, next);\n}\n\n/**\n * Transfer the specified `amounts` from one player to another. Fails when the\n * source player cannot afford the full cost; on success the destination\n * gains exactly what the source loses.\n */\nexport function transferPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n fromPlayerId: string,\n toPlayerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const afterSpend = spendPlayerResources(table, fromPlayerId, amounts);\n return addPlayerResources(afterSpend, toPlayerId, amounts);\n}\n\n/**\n * Overwrite a single resource balance for a player. Prefer the additive or\n * subtractive helpers — use this only when the new balance is an absolute\n * (e.g. \"set coins to 10\" for a scripted setup).\n */\nexport function setPlayerResource<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n amount: number,\n): Table {\n if (!Number.isFinite(amount) || amount < 0) {\n throw new Error(\n `setPlayerResource: amount must be a non-negative finite number, got ${amount}.`,\n );\n }\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n return withPlayerResources(table, playerId, {\n ...prev,\n [resourceId]: amount,\n });\n}\n\nexport function getComponentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ComponentLocationOfTable<Table, ComponentId> | undefined {\n return table.componentLocations[componentId] as\n | ComponentLocationOfTable<Table, ComponentId>\n | undefined;\n}\n\nexport function getComponentDeckLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedDeckLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InDeck\") {\n return null;\n }\n\n return {\n componentId,\n deckId: location.deckId as DeckIdOfTable<Table>,\n cards: table.decks[location.deckId as DeckIdOfTable<Table>],\n location,\n } as ResolvedDeckLocation<Table, ComponentId>;\n}\n\nexport function getComponentHandLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedHandLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InHand\") {\n return null;\n }\n\n return {\n componentId,\n handId: location.handId as HandIdOfTable<Table>,\n playerId: location.playerId as PlayerIdOfTable<Table>,\n cards: ppRead(\n table.hands[location.handId as HandIdOfTable<Table>],\n location.playerId as string,\n ),\n location,\n } as unknown as ResolvedHandLocation<Table, ComponentId>;\n}\n\nexport function getComponentZoneLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedZoneLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InZone\") {\n return null;\n }\n\n return {\n componentId,\n zoneId: location.zoneId,\n location,\n } as ResolvedZoneLocation<Table, ComponentId>;\n}\n\nexport function getComponentSpaceLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSpaceLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnSpace\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const spaceId = location.spaceId as SpaceIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n spaceId,\n space: getSpace(table, boardId, spaceId),\n location,\n } as ResolvedSpaceLocation<Table, ComponentId>;\n}\n\nexport function getComponentContainerLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedContainerLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InContainer\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const containerId = location.containerId as BoardContainerIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n containerId,\n container: getContainer(table, boardId, containerId),\n location,\n } as ResolvedContainerLocation<Table, ComponentId>;\n}\n\nexport function getComponentEdgeLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedEdgeLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnEdge\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const edgeId = location.edgeId as TiledEdgeIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n edgeId,\n edge: getEdge(table, boardId, edgeId),\n location,\n } as ResolvedEdgeLocation<Table, ComponentId>;\n}\n\nexport function getComponentVertexLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedVertexLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnVertex\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const vertexId = location.vertexId as TiledVertexIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n vertexId,\n vertex: getVertex(table, boardId, vertexId),\n location,\n } as ResolvedVertexLocation<Table, ComponentId>;\n}\n\nexport function getComponentSlotLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSlotLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InSlot\") {\n return null;\n }\n\n return {\n componentId,\n host: location.host,\n slotId: location.slotId,\n location,\n } as ResolvedSlotLocation<Table, ComponentId>;\n}\n\nexport function getBoard<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n>(table: Table, boardId: BoardId): Table[\"boards\"][\"byId\"][BoardId] {\n return table.boards.byId[boardId] as Table[\"boards\"][\"byId\"][BoardId];\n}\n\nexport function getHexBoard<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >;\n}\n\nexport function getTiledBoard<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" | \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" | \"square\" }\n >;\n}\n\nexport function getSquareBoard<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >;\n}\n\nexport function getSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId] {\n return getBoard(table, boardId).spaces[\n spaceId\n ] as Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId];\n}\n\nexport function getHexSpace<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends HexSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n>[\"spaces\"][SpaceId] {\n return getHexBoard(table, boardId).spaces[spaceId] as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getSquareSpace<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n>[\"spaces\"][SpaceId] {\n return getSquareBoard(table, boardId).spaces[spaceId] as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId] {\n return getBoard(table, boardId).containers[\n containerId\n ] as Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId];\n}\n\nexport function assertCardAllowedInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds =\n getContainer(table, boardId, containerId).allowedCardSetIds ?? [];\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter container '${containerId}' on board '${boardId}'.`,\n );\n }\n}\n\nexport function getEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledEdgeStateOfTable<Table, BoardId, EdgeId> {\n const edge = getTiledBoard(table, boardId).edges.find(\n (candidate) => candidate.id === edgeId,\n );\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n return edge as TiledEdgeStateOfTable<Table, BoardId, EdgeId>;\n}\n\nexport function getVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledVertexStateOfTable<Table, BoardId, VertexId> {\n const vertex = getTiledBoard(table, boardId).vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n return vertex as TiledVertexStateOfTable<Table, BoardId, VertexId>;\n}\n\nexport function getHexSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n q: number,\n r: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getHexBoard(table, boardId).spaces).find(\n (space) => space.q === q && space.r === r,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSquareSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n row: number,\n col: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getSquareBoard(table, boardId).spaces).find(\n (space) => space.row === row && space.col === col,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSpaceEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.spaceIds.includes(spaceId))\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getSpaceVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.spaceIds.includes(spaceId))\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n const vertex = tiledBoard.vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n const vertexSpaceIds = new Set(vertex.spaceIds);\n return tiledBoard.edges\n .filter((edge) =>\n edge.spaceIds.every((spaceId) => vertexSpaceIds.has(spaceId)),\n )\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n const edge = tiledBoard.edges.find((candidate) => candidate.id === edgeId);\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n const edgeSpaceIds = new Set(edge.spaceIds);\n return tiledBoard.vertices\n .filter((vertex) =>\n Array.from(edgeSpaceIds).every((spaceId) =>\n vertex.spaceIds.includes(spaceId),\n ),\n )\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getRelatedSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n TypeId extends RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n): SpaceId[] {\n const board = getBoard(table, boardId);\n const related = new Set<SpaceId>();\n\n for (const relation of board.relations) {\n if (relation.typeId !== relationTypeId) {\n continue;\n }\n if (relation.fromSpaceId === spaceId) {\n related.add(relation.toSpaceId as SpaceId);\n continue;\n }\n if (!relation.directed && relation.toSpaceId === spaceId) {\n related.add(relation.fromSpaceId as SpaceId);\n }\n }\n\n return [...related];\n}\n\nexport function getAdjacentSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): SpaceId[] {\n return getRelatedSpaces(\n table,\n boardId,\n spaceId,\n \"adjacent\" as RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n );\n}\n\nexport function getSpaceDistance<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n): number {\n if (fromSpaceId === toSpaceId) {\n return 0;\n }\n\n const visited = new Set<string>([fromSpaceId]);\n let frontier: string[] = [fromSpaceId];\n let distance = 0;\n\n while (frontier.length > 0) {\n distance += 1;\n const nextFrontier: string[] = [];\n\n for (const currentSpaceId of frontier) {\n for (const neighborId of getAdjacentSpaces(\n table,\n boardId,\n currentSpaceId as SpaceId,\n )) {\n if (neighborId === toSpaceId) {\n return distance;\n }\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n nextFrontier.push(neighborId);\n }\n }\n }\n\n frontier = nextFrontier;\n }\n\n return Number.POSITIVE_INFINITY;\n}\n\nexport function getSquareNeighbors<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n options: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" } = {},\n): SquareSpaceIdOfTable<Table, BoardId>[] {\n const board = getSquareBoard(table, boardId);\n const space = getSquareSpace(table, boardId, spaceId);\n const offsets: ReadonlyArray<readonly [number, number]> =\n options.mode === \"diagonal\"\n ? [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : options.mode === \"all\"\n ? [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n ];\n\n return offsets\n .map(([rowOffset, colOffset]) =>\n Object.values(board.spaces).find(\n (candidate) =>\n candidate.row === space.row + rowOffset &&\n candidate.col === space.col + colOffset,\n ),\n )\n .filter((candidate): candidate is typeof space => candidate !== undefined)\n .map((candidate) => candidate.id as SquareSpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getSquareDistance<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options: { metric?: \"manhattan\" | \"chebyshev\" } = {},\n): number {\n const from = getSquareSpace(table, boardId, fromSpaceId);\n const to = getSquareSpace(table, boardId, toSpaceId);\n const rowDistance = Math.abs(from.row - to.row);\n const colDistance = Math.abs(from.col - to.col);\n\n return options.metric === \"chebyshev\"\n ? Math.max(rowDistance, colDistance)\n : rowDistance + colDistance;\n}\n\nexport function getBoardsByTypeId<\n Table extends RuntimeTableRecord,\n TypeId extends BoardTypeIdOfTable<NoInfer<Table>>,\n>(table: Table, typeId: TypeId): BoardIdOfTable<Table>[] {\n return Object.entries(table.boards.byId)\n .filter(([, board]) => board.typeId === typeId)\n .map(([boardId]) => boardId as BoardIdOfTable<Table>);\n}\n\nexport function getSpacesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n TypeId extends SpaceTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): SpaceIdOfTable<Table, BoardId>[] {\n return Object.entries(getBoard(table, boardId).spaces)\n .filter(([, space]) => space.typeId === typeId)\n .map(([spaceId]) => spaceId as SpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getEdgesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledEdgeTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.typeId === typeId)\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getVerticesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledVertexTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.typeId === typeId)\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getComponentsOnSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getSpace(table, boardId, spaceId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"OnSpace\" &&\n location.boardId === boardId &&\n location.spaceId === spaceId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getContainer(table, boardId, containerId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"InContainer\" &&\n location.boardId === boardId &&\n location.containerId === containerId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function moveComponentToSpace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n const position = getComponentsOnSpace(nextTable, boardId, spaceId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToContainer<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n containerId: ContainerId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertCardAllowedInContainer(nextTable, boardId, containerId, componentId);\n const position = getComponentsInContainer(\n nextTable,\n boardId,\n containerId,\n ).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToDetached<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): Table {\n const nextTable = cloneRuntimeTable(table);\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = { type: \"Detached\" };\n return nextTable;\n}\n\nexport function moveComponentToEdge<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n edgeId: EdgeId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n getEdge(nextTable, boardId, edgeId);\n const position = getComponentsOnEdge(nextTable, boardId, edgeId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToVertex<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n vertexId: VertexId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n getVertex(nextTable, boardId, vertexId);\n const position = getComponentsOnVertex(nextTable, boardId, vertexId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position,\n };\n return nextTable;\n}\n\nexport function moveCardFromPlayerZoneToSharedZone<\n Table extends RuntimeTableRecord,\n HandId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: HandId;\n toZoneId: DeckId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n return moveFromHandToDeck({\n table: options.table,\n playerId: options.playerId,\n handId: options.fromZoneId,\n cardId: options.cardId,\n deckId: options.toZoneId,\n playedBy: options.playedBy,\n position: options.position,\n });\n}\n\n/**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer zone\n * (e.g. discard, hand, in-play). Use this for the \"gain\" verb — distinct from\n * `dealCardsToPlayerZone`, which draws an unspecified count of top cards from\n * a deck. Owner flips to the receiving player; visibility is recomputed from\n * the destination zone's `handVisibility` mode.\n */\n/**\n * Move the top `count` cards from one perPlayer zone to another for the same\n * player. Companion to {@link dealCardsFromDeckToHand} for the perPlayer →\n * perPlayer case (most importantly, \"draw N from your deck to your hand\"\n * in deck-builders). Visibility is recomputed for the destination; owner is\n * preserved.\n */\nexport function dealCardsBetweenPlayerZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n}): Table {\n let nextTable = options.table;\n for (let i = 0; i < options.count; i += 1) {\n const sourceCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.fromZoneId] ??\n nextTable.hands[options.fromZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const topCardId = sourceCards[0];\n if (topCardId === undefined) {\n break;\n }\n nextTable = moveCardBetweenPlayerZones({\n table: nextTable,\n playerId: options.playerId,\n fromZoneId: options.fromZoneId,\n toZoneId: options.toZoneId,\n cardId: topCardId as CompatibleCardIdForTwoPlayerZones<\n Table,\n FromZoneId,\n ToZoneId\n >,\n });\n }\n return nextTable;\n}\n\nexport function moveCardFromSharedZoneToPlayerZone<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<Table, ToZoneId, FromZoneId>;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.fromZoneId as string,\n \"shared\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"toZoneId\",\n );\n\n const sourceCards = ensureArray(\n nextTable.zones.shared[options.fromZoneId] ??\n nextTable.decks[options.fromZoneId],\n );\n if (!sourceCards.includes(options.cardId as string)) {\n throw new Error(\n `Card '${String(options.cardId)}' is not in shared zone '${String(\n options.fromZoneId,\n )}'.`,\n );\n }\n assertCardAllowedInZone(\n nextTable,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const remainingSource = sourceCards.filter(\n (candidate) => candidate !== options.cardId,\n );\n syncSharedZoneWithDeck(nextTable, options.fromZoneId, remainingSource);\n for (const [index, currentCardId] of remainingSource.entries()) {\n const existing = nextTable.componentLocations[currentCardId];\n if (existing?.type === \"InDeck\") {\n nextTable.componentLocations[currentCardId] = {\n ...existing,\n position: index,\n };\n }\n }\n\n const destinationCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.toZoneId] ??\n nextTable.hands[options.toZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const nextDestination =\n options.position === \"top\"\n ? [options.cardId as string, ...destinationCards]\n : [...destinationCards, options.cardId as string];\n syncPlayerZoneWithHand(\n nextTable,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const [index, currentCardId] of nextDestination.entries()) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: options.toZoneId as string,\n playerId: options.playerId as string,\n position: index,\n };\n }\n nextTable.ownerOfCard[options.cardId as string] = options.playerId as string;\n nextTable.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n nextTable,\n options.toZoneId as string,\n options.playerId as string,\n );\n\n return nextTable;\n}\n\n/**\n * Move a card between two perPlayer zones owned by the same player. Use this\n * for hand → in-play, in-play → discard, and similar same-player transitions\n * that do not change ownership. Owner is preserved; visibility is recomputed\n * from the destination zone's `handVisibility` mode.\n */\nexport function moveCardBetweenPlayerZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<Table, FromZoneId, ToZoneId>;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.fromZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"toZoneId\",\n );\n\n const sourceCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.fromZoneId] ??\n nextTable.hands[options.fromZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n if (!sourceCards.includes(options.cardId as string)) {\n throw new Error(\n `Card '${String(options.cardId)}' is not in zone '${String(\n options.fromZoneId,\n )}' for player '${String(options.playerId)}'.`,\n );\n }\n assertCardAllowedInZone(\n nextTable,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const remainingSource = sourceCards.filter(\n (candidate) => candidate !== options.cardId,\n );\n syncPlayerZoneWithHand(\n nextTable,\n options.fromZoneId,\n options.playerId,\n remainingSource,\n );\n for (const [index, currentCardId] of remainingSource.entries()) {\n const existing = nextTable.componentLocations[currentCardId];\n if (existing?.type === \"InHand\") {\n nextTable.componentLocations[currentCardId] = {\n ...existing,\n position: index,\n };\n }\n }\n\n const destinationCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.toZoneId] ??\n nextTable.hands[options.toZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const nextDestination =\n options.position === \"top\"\n ? [options.cardId as string, ...destinationCards]\n : [...destinationCards, options.cardId as string];\n syncPlayerZoneWithHand(\n nextTable,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const [index, currentCardId] of nextDestination.entries()) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: options.toZoneId as string,\n playerId: options.playerId as string,\n position: index,\n };\n }\n nextTable.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n nextTable,\n options.toZoneId as string,\n options.playerId as string,\n );\n\n return nextTable;\n}\n\nexport function moveCardBetweenSharedZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<Table, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n const removed = removeFromDeck(\n options.table,\n options.fromZoneId,\n options.cardId,\n );\n return appendToDeck(\n removed,\n options.toZoneId,\n options.cardId as DeckCardsOfTable<Table, ToZoneId>[number],\n options.playedBy ?? null,\n options.position ?? \"bottom\",\n );\n}\n\nexport function removeCardFromSharedZone<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): Table {\n return removeFromDeck(table, deckId, cardId);\n}\n\nexport function addCardToSharedZone<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): Table {\n return appendToDeck(table, deckId, cardId, playedBy, position);\n}\n\n/**\n * Deterministically draw the top `count` cards from a shared deck and deal\n * them into a player's hand zone. No RNG is consumed — call\n * {@link shuffleSharedZone} (via `fx.shuffleSharedZone`) first if the deck\n * needs randomising.\n */\nexport function dealCardsFromDeckToHand<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n HandId extends HandIdOfTable<Table>,\n>(\n table: Table,\n fromZoneId: DeckId,\n playerId: PlayerId,\n toZoneId: HandId,\n count: number,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n const publicHands = new Set(\n Object.entries(nextTable.handVisibility)\n .filter(([, mode]) => mode === \"all\" || mode === \"public\")\n .map(([handId]) => handId),\n );\n\n for (let index = 0; index < count; index += 1) {\n const nextCard = ensureArray(nextTable.decks[fromZoneId])[0];\n if (!nextCard) {\n break;\n }\n nextTable.decks[fromZoneId] = ensureArray(\n nextTable.decks[fromZoneId],\n ).slice(1) as (typeof nextTable.decks)[DeckId];\n nextTable.zones.shared[fromZoneId] = [\n ...ensureArray(nextTable.decks[fromZoneId]),\n ] as (typeof nextTable.zones.shared)[DeckId];\n const prevHand = ppRead(nextTable.hands[toZoneId], playerId as string) as\n | readonly string[]\n | undefined;\n const nextHand = [...ensureArray(prevHand), nextCard];\n assertCardAllowedInZone(nextTable, toZoneId, nextCard);\n nextTable.hands[toZoneId] = ppWrite(\n nextTable.hands[toZoneId],\n playerId as string,\n nextHand,\n ) as (typeof nextTable.hands)[HandId];\n nextTable.zones.perPlayer[toZoneId] = ppWrite(\n nextTable.zones.perPlayer[toZoneId],\n playerId as string,\n [...nextHand],\n ) as (typeof nextTable.zones.perPlayer)[HandId];\n nextTable.componentLocations[nextCard] = {\n type: \"InHand\",\n handId: toZoneId,\n playerId,\n position: nextHand.length - 1,\n };\n nextTable.ownerOfCard[nextCard] = playerId;\n nextTable.visibility[nextCard] = publicHands.has(toZoneId as string)\n ? {\n faceUp: true,\n }\n : {\n faceUp: false,\n visibleTo: [playerId],\n };\n }\n return nextTable;\n}\n\nexport type { RuntimeTableRecord, TableOfState, CardIdOfState };\n","import type { RuntimeRngState } from \"./model\";\n\n/**\n * Deterministic pseudo-random integer generator for reducer-native games.\n *\n * The public contract is `(rng.seed, rng.cursor) -> value`, with the cursor\n * advanced by one per call. Same `(seed, cursor)` tuple always produces the\n * same output, which is what makes session replay deterministic without\n * having to persist anything beyond the seed and cursor.\n *\n * Internally we hash `(seed, cursor)` through a Murmur3-style 32-bit\n * finalizer rather than computing a linear combination of the cursor. The\n * older `(seed * A + C + cursor) & 0x7fffffff` form was linear in `cursor`,\n * so consecutive samples differed by a fixed step — for a d6 that meant\n * every roll produced a simple `+1` counter through the faces. Mixing\n * `(seed, cursor)` with an avalanche finalizer is still pure and still\n * cheap, but now nearby cursors yield well-distributed outputs.\n *\n * Distribution note: the `% bound` step is biased when `bound` is not a\n * power of two. For gameplay-level bounds (≤ 64) the bias is negligible\n * and we leave it in to keep replay fixtures stable against future bound\n * changes. If a caller ever needs strict uniformity we can add an\n * explicit `nextUniformInt` without touching the existing consumers.\n */\nexport function nextRandomInt(\n bound: number,\n rng: RuntimeRngState,\n): [number, RuntimeRngState] {\n if (bound <= 0) {\n throw new Error(\"Random bound must be positive.\");\n }\n const seed = rng.seed ?? 1;\n const raw = hashSeedCursor(seed, rng.cursor);\n const value = raw % bound;\n return [\n value,\n {\n ...rng,\n cursor: rng.cursor + 1,\n trace: [\n ...rng.trace,\n `cursor=${rng.cursor};bound=${bound};value=${value}`,\n ],\n },\n ];\n}\n\n/**\n * Mix `(seed, cursor)` into a uniformly-distributed uint32 using a\n * Murmur3-style finalizer. The seed is split into its low and high 32-bit\n * halves so large 53-bit JS-integer seeds (including the negative seeds\n * the backend derives from its own 64-bit generator) don't collapse onto\n * the same bucket after a `| 0` truncation.\n */\nfunction hashSeedCursor(seed: number, cursor: number): number {\n const seedLo = seed | 0;\n // `Math.floor(seed / 2^32) | 0` keeps the upper bits of large seeds.\n // For small seeds this is 0 (or -1 for negatives), so the stir below is\n // still dominated by `seedLo` + `cursor` as you'd expect.\n const seedHi = Math.floor(seed / 0x1_0000_0000) | 0;\n let x = Math.imul(seedLo, 0x9e3779b1);\n x = (x + Math.imul(seedHi, 0x85ebca77)) | 0;\n x = (x + Math.imul(cursor | 0, 0xc2b2ae3d)) | 0;\n // Murmur3 32-bit finalizer.\n x = Math.imul(x ^ (x >>> 16), 0x85ebca6b);\n x = Math.imul(x ^ (x >>> 13), 0xc2b2ae35);\n x = x ^ (x >>> 16);\n return x >>> 0;\n}\n","import type {\n CollectorState,\n InputCollector,\n RandomHelpers,\n RuntimeRngState,\n SchemaLike,\n} from \"../../model\";\nimport { nextRandomInt } from \"../../rng\";\n\nexport type RngConsumption = {\n operation: string;\n traceEntry: string;\n};\n\nexport type MutableRandomHelpers = {\n random: RandomHelpers;\n currentRng: () => RuntimeRngState;\n};\n\nexport function sampleDieValue(\n sides: number,\n rng: RuntimeRngState,\n): {\n value: number;\n nextRng: RuntimeRngState;\n consumption: RngConsumption;\n} {\n const [offset, nextRng] = nextRandomInt(sides, rng);\n return {\n value: offset + 1,\n nextRng,\n consumption: {\n operation: \"rollDie\",\n traceEntry: nextRng.trace[nextRng.trace.length - 1] ?? \"\",\n },\n };\n}\n\nexport function shuffleWithRng<T>(\n values: readonly T[],\n rng: RuntimeRngState,\n operation:\n | \"shuffleSharedZone\"\n | \"shufflePlayerZone\"\n | \"randomSubset\" = \"shuffleSharedZone\",\n): {\n orderedValues: T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n const orderedValues = [...values];\n let nextRng = rng;\n const consumptions: RngConsumption[] = [];\n for (\n let lastIndex = orderedValues.length - 1;\n lastIndex > 0;\n lastIndex -= 1\n ) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n consumptions.push({\n operation,\n traceEntry: updatedRng.trace[updatedRng.trace.length - 1] ?? \"\",\n });\n nextRng = updatedRng;\n const current = orderedValues[lastIndex];\n const swap = orderedValues[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `shuffleWithRng: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${orderedValues.length})`,\n );\n }\n orderedValues[lastIndex] = swap;\n orderedValues[swapIndex] = current;\n }\n return { orderedValues, nextRng, consumptions };\n}\n\nexport function subsetWithRng<T>(\n values: readonly T[],\n count: number,\n rng: RuntimeRngState,\n): {\n values: readonly T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n if (!Number.isInteger(count) || count < 0) {\n throw new Error(\"random.subset count must be a non-negative integer.\");\n }\n if (count > values.length) {\n throw new Error(\n `random.subset count ${count} exceeds source length ${values.length}.`,\n );\n }\n const shuffled = shuffleWithRng(values, rng, \"randomSubset\");\n return {\n values: shuffled.orderedValues.slice(0, count),\n nextRng: shuffled.nextRng,\n consumptions: shuffled.consumptions,\n };\n}\n\nexport function createMutableRandomHelpers(\n rng: RuntimeRngState,\n): MutableRandomHelpers {\n let current = rng;\n return {\n random: {\n subset(options) {\n const sampled = subsetWithRng(options.from, options.count, current);\n current = sampled.nextRng;\n return sampled.values;\n },\n },\n currentRng: () => current,\n };\n}\n\nexport function sampleRngCollectorValue(\n collector: InputCollector<SchemaLike<unknown>, CollectorState, \"rng\">,\n rng: RuntimeRngState,\n): { value: unknown; nextRng: RuntimeRngState } {\n const meta = collector.meta;\n switch (meta.rng) {\n case \"d6\": {\n const count = meta.count > 0 ? meta.count : 1;\n const values: number[] = [];\n let nextRng = rng;\n for (let i = 0; i < count; i += 1) {\n const sampled = sampleDieValue(6, nextRng);\n values.push(sampled.value);\n nextRng = sampled.nextRng;\n }\n return { value: { values }, nextRng };\n }\n case \"coin\": {\n const [offset, nextRng] = nextRandomInt(2, rng);\n return {\n value: { value: offset === 0 ? \"heads\" : \"tails\" },\n nextRng,\n };\n }\n default: {\n const _exhaustive: never = meta;\n throw new Error(\n `Unknown rngInput kind '${String(_exhaustive)}'. Register a sampler in trusted rng-sampler.`,\n );\n }\n }\n}\n","import type { DispatchTraceEntry, TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport {\n cloneRuntimeTable,\n ensureArray,\n shufflePlayerZoneCards,\n} from \"../../table-ops\";\nimport {\n sampleDieValue,\n shuffleWithRng,\n type RngConsumption,\n} from \"./rng-sampler\";\nimport type {\n TrustedInput,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\nfunction toRngTrace<\n State,\n PlayerId extends string,\n ReducerInput extends TrustedRuntimeInput<PlayerId>,\n>(\n consumptions: readonly RngConsumption[],\n): DispatchTraceEntry<State, PlayerId, ReducerInput>[] {\n return consumptions.map((consumption) => ({\n type: \"rngConsumption\" as const,\n operation: consumption.operation,\n traceEntry: consumption.traceEntry,\n }));\n}\n\nexport function createEngineInstructionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>() {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveRollDie(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.rollDie\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const die = state.table.dice[instruction.dieId];\n if (!die) {\n throw new Error(`Cannot roll unknown die '${instruction.dieId}'.`);\n }\n if (!Number.isInteger(die.sides) || die.sides <= 0) {\n throw new Error(\n `Cannot roll die '${instruction.dieId}' with invalid sides '${die.sides}'.`,\n );\n }\n const nextTable = cloneRuntimeTable(state.table);\n const sampled = sampleDieValue(die.sides, state.runtime.rng);\n nextTable.dice[instruction.dieId] = {\n ...die,\n value: sampled.value,\n };\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"rollDie\",\n response: {\n dieId: instruction.dieId,\n value: sampled.value,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: sampled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>([sampled.consumption]),\n };\n }\n\n function resolveShuffleSharedZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shuffleSharedZone\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const nextTable = cloneRuntimeTable(state.table);\n const deckCards = [...ensureArray(nextTable.decks[instruction.zoneId])];\n const shuffled = shuffleWithRng(deckCards, state.runtime.rng);\n const orderedCardIds = [...shuffled.orderedValues];\n nextTable.decks[instruction.zoneId] = shuffled.orderedValues;\n nextTable.zones.shared[instruction.zoneId] = [...shuffled.orderedValues];\n for (const [index, cardId] of shuffled.orderedValues.entries()) {\n const currentLocation = nextTable.componentLocations[cardId];\n nextTable.componentLocations[cardId] =\n currentLocation?.type === \"InDeck\" || currentLocation?.type === \"InZone\"\n ? {\n ...currentLocation,\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: currentLocation.playedBy ?? null,\n position: index,\n }\n : {\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: null,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shuffleSharedZone\",\n response: {\n zoneId: instruction.zoneId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n function resolveShufflePlayerZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shufflePlayerZone\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const nextTable = cloneRuntimeTable(state.table);\n const zoneCards = shufflePlayerZoneCards(\n nextTable,\n instruction.zoneId,\n instruction.playerId,\n );\n const shuffled = shuffleWithRng(\n zoneCards,\n state.runtime.rng,\n \"shufflePlayerZone\",\n );\n const orderedCardIds = [...shuffled.orderedValues];\n shufflePlayerZoneCards(\n nextTable,\n instruction.zoneId,\n instruction.playerId,\n orderedCardIds,\n );\n for (const [index, cardId] of orderedCardIds.entries()) {\n const currentLocation = nextTable.componentLocations[cardId];\n nextTable.componentLocations[cardId] =\n currentLocation?.type === \"InHand\"\n ? {\n ...currentLocation,\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n }\n : {\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shufflePlayerZone\",\n response: {\n zoneId: instruction.zoneId,\n playerId: instruction.playerId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n return {\n resolveRollDie,\n resolveShuffleSharedZone,\n resolveShufflePlayerZone,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport type {\n TrustedInput,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createFlowInstructionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>) {\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveTransition(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"flow.transition\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const initialized = lifecycle.initializePhaseResult(\n {\n ...state,\n flow: {\n ...state.flow,\n currentPhase:\n instruction.to as unknown as State[\"flow\"][\"currentPhase\"],\n },\n runtime: {\n ...state.runtime,\n lastTransition: {\n from: state.flow.currentPhase,\n to: instruction.to,\n },\n } as State[\"runtime\"],\n },\n instruction.to as PhaseName,\n );\n return {\n state: initialized.state,\n queuedInputs: [],\n queuedInstructions: initialized.instructions,\n trace: [],\n };\n }\n\n return {\n resolveTransition,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\nexport const SIMULTANEOUS_SUBMIT_INTERACTION_ID = \"submit\";\n\ntype ErasedPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n TrustedRuntimeScope<Contract, Definitions, Views>[\"phaseByName\"]\n>;\n\nexport function isSimultaneousPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(phase: ErasedPhase<Contract, Definitions, Views>): boolean {\n return phase.kind === \"simultaneousPlayer\";\n}\n\nexport function simultaneousSubmitInteraction<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n phase: ErasedPhase<Contract, Definitions, Views>,\n):\n | AnyInteractionSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>\n | undefined {\n return (phase as { submit?: unknown }).submit as\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n}\n\nfunction resolvePromptToArray<PlayerId extends string>(\n value: unknown,\n): PlayerId[] {\n if (value === undefined || value === null) return [];\n if (Array.isArray(value)) return value as PlayerId[];\n if (typeof value === \"string\") return [value as PlayerId];\n return [];\n}\n\nexport function resolveSimultaneousActors<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n state: TrustedState<Contract>,\n phase: ErasedPhase<Contract, Definitions, Views>,\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >,\n): TrustedPlayerId<Contract>[] {\n type PlayerId = TrustedPlayerId<Contract>;\n const selector =\n (phase as { actors?: unknown; actor?: unknown }).actors ??\n (phase as { actor?: unknown }).actor;\n if (typeof selector === \"function\") {\n const selected = selector(\n scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n );\n const resolved = resolvePromptToArray<PlayerId>(selected);\n if (resolved.length > 0) {\n return resolved;\n }\n }\n const active = state.flow.activePlayers as PlayerId[];\n if (active.length > 0) {\n return [...active];\n }\n return [...(state.table.playerOrder as PlayerId[])];\n}\n","/**\n * Curried state writers for use with `pipe`.\n *\n * Each entry in the returned `ops` namespace is a curried transformation\n * `(args) => (state) => state` that can be composed with `pipe`:\n *\n * const ops = createReducerOps<GameState>();\n *\n * return accept(\n * pipe(state,\n * ops.setActivePlayers([playerId]),\n * ops.moveCardFromPlayerZoneToSharedZone({\n * playerId,\n * fromZoneId: \"things-hand\",\n * toZoneId: \"ring-1\",\n * cardId: \"a-dog\",\n * }),\n * ),\n * );\n *\n * The factory binds all ops to a specific `State` type so that ID arguments\n * (deck ids, card ids, etc.) are checked against the manifest-derived table\n * shape of the game.\n */\nimport type { Op } from \"./compose\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n CardIdOfTable,\n CompatibleHandIdForDeck,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HiddenStateOfState,\n PhaseStateOfState,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n PrivateStateOfState,\n PublicStateOfState,\n ResourceAmountsOfTable,\n ResourceIdOfTable,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"./model\";\nimport {\n asPlayerId,\n perPlayerGet,\n perPlayerSet,\n type PerPlayer,\n} from \"./per-player\";\nimport {\n addCardToSharedZone as tableAddCardToSharedZone,\n addPlayerResources as tableAddPlayerResources,\n cloneRuntimeTable,\n dealCardsFromDeckToHand as tableDealCardsFromDeckToHand,\n dealCardsBetweenPlayerZones as tableDealCardsBetweenPlayerZones,\n moveCardBetweenPlayerZones as tableMoveCardBetweenPlayerZones,\n moveCardBetweenSharedZones as tableMoveCardBetweenSharedZones,\n moveCardFromPlayerZoneToSharedZone as tableMoveCardFromPlayerZoneToSharedZone,\n moveCardFromSharedZoneToPlayerZone as tableMoveCardFromSharedZoneToPlayerZone,\n moveComponentToContainer as tableMoveComponentToContainer,\n moveComponentToDetached as tableMoveComponentToDetached,\n moveComponentToEdge as tableMoveComponentToEdge,\n moveComponentToSpace as tableMoveComponentToSpace,\n moveComponentToVertex as tableMoveComponentToVertex,\n removeCardFromSharedZone as tableRemoveCardFromSharedZone,\n setActivePlayers as stateSetActivePlayers,\n setPhaseState as stateSetPhaseState,\n setPlayerResource as tableSetPlayerResource,\n spendPlayerResources as tableSpendPlayerResources,\n transferPlayerResources as tableTransferPlayerResources,\n} from \"./table-ops\";\n\n/**\n * Minimum shape required for any state targeted by reducer ops.\n *\n * All curried writers operate on a game state with a `table` field.\n */\nexport type ReducerStateBase = {\n table: RuntimeTableRecord;\n};\n\ntype PipeTable<State extends ReducerStateBase> = TableOfState<State>;\n\n/**\n * A shallow patch for a slice of state. Either a partial object to merge\n * over the previous value, or a functional updater `(prev) => next`.\n */\nexport type StatePatch<T> = Partial<T> | ((prev: T) => T);\n\n/**\n * Curried writer namespace for a specific game state type.\n *\n * Created via {@link createReducerOps}.\n */\nexport interface ReducerOps<State extends ReducerStateBase> {\n // --- Flow ------------------------------------------------------------\n\n /** Set the list of players whose turn is currently active. */\n setActivePlayers(\n activePlayers: ReadonlyArray<PlayerIdOfState<State>>,\n ): Op<State>;\n\n /**\n * Advance `flow.activePlayers` to the single next seat in `playerOrder`.\n *\n * Uses `state.flow.activePlayers[0]` as the current seat (or the first\n * seat in `playerOrder` when `activePlayers` is empty) and sets\n * `activePlayers` to `[q.player.nextInOrder(current)]`. No-op when the\n * player order is empty.\n */\n advanceActivePlayer(): Op<State>;\n\n // --- Author-owned state slices --------------------------------------\n\n /**\n * Update the current phase's local state.\n *\n * Accepts either a `Partial<PhaseState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PhaseState`.\n */\n patchPhaseState(patch: StatePatch<PhaseStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.publicState`.\n *\n * Accepts either a `Partial<PublicState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PublicState`.\n */\n patchPublicState(patch: StatePatch<PublicStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.hiddenState`.\n *\n * Accepts either a `Partial<HiddenState>` or a functional updater.\n */\n patchHiddenState(patch: StatePatch<HiddenStateOfState<State>>): Op<State>;\n\n /**\n * Update a single player's entry in `state.privateState`.\n *\n * Accepts either a `Partial<PrivateState>` or a functional updater.\n */\n patchPlayerPrivateState(args: {\n playerId: PlayerIdOfState<State>;\n patch: StatePatch<PrivateStateOfState<State>>;\n }): Op<State>;\n\n // --- Shared zones / decks -------------------------------------------\n\n /**\n * Append a card to a shared zone (deck). Defaults to placing the card at the\n * bottom; pass `position: \"top\"` for top-of-deck placement (e.g. Bureaucrat-style).\n */\n addCardToSharedZone<\n DeckId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /** Remove a card from a shared zone (deck). */\n removeCardFromSharedZone<\n DeckId extends DeckIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n }): Op<State>;\n\n /**\n * Move a card between two shared zones (decks). Defaults to placing the card\n * at the bottom of the destination; pass `position: \"top\"` for top placement.\n */\n moveCardBetweenSharedZones<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<PipeTable<State>, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Draw the top `count` cards from one perPlayer zone into another for the\n * same player (e.g. deck → hand at the start of a turn). Companion to\n * {@link dealCardsToPlayerZone} for the perPlayer → perPlayer case. Stops\n * silently if the source runs out before `count` is reached.\n */\n dealCardsBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Move a card between two perPlayer zones owned by the same player (e.g.\n * hand → in-play → discard). Owner is preserved; visibility is recomputed\n * from the destination zone.\n */\n moveCardBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a card from a player zone (hand) to a shared zone (deck). Defaults to\n * placing the card at the bottom; pass `position: \"top\"` to topdeck.\n */\n moveCardFromPlayerZoneToSharedZone<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer\n * zone (e.g. discard). The \"gain\" verb in deck-builders. Distinct from\n * {@link dealCardsToPlayerZone}, which draws unspecified top-N cards from a\n * deck. Owner flips to the receiving player; visibility is recomputed.\n */\n moveCardFromSharedZoneToPlayerZone<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n ToZoneId,\n FromZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Deal the top `count` cards from a shared deck into a player's hand zone.\n *\n * This op does not consume RNG. If the deck needs to be random, shuffle it\n * first with `fx.shuffleSharedZone(...)`, then deal from the shuffled deck\n * inside the same reducer via this op.\n */\n dealCardsToPlayerZone<\n FromZoneId extends DeckIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n ToZoneId extends CompatibleHandIdForDeck<PipeTable<State>, FromZoneId> &\n HandIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n playerId: PlayerId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Atomically rotate cards in a per-player zone around the table.\n *\n * Defaults to rotating every card currently in `zoneId` for every player in\n * turn order. Pass `players` to use a smaller explicit order, or\n * `cardIdsByPlayer` to rotate only selected cards such as Hearts passes.\n */\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<PipeTable<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n // --- Board / component movement -------------------------------------\n\n /** Move a component onto a board space. */\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n SpaceId extends SpaceIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): Op<State>;\n\n /** Move a component into a board container. */\n moveComponentToContainer<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n ContainerId extends BoardContainerIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n containerId: ContainerId;\n }): Op<State>;\n\n /** Move a component onto a tiled board edge. */\n moveComponentToEdge<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n EdgeId extends TiledEdgeIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n edgeId: EdgeId;\n }): Op<State>;\n\n /** Move a component onto a tiled board vertex. */\n moveComponentToVertex<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n VertexId extends TiledVertexIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n vertexId: VertexId;\n }): Op<State>;\n\n /** Move a component back to the detached pool. */\n moveComponentToDetached<\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n }): Op<State>;\n\n // --- Resources ------------------------------------------------------\n\n /**\n * Credit the specified resources to a player.\n *\n * Amounts must be non-negative; use {@link spendResources} for deductions\n * so that affordability is checked explicitly.\n *\n * pipe(\n * state,\n * ops.addResources({ playerId, amounts: { wood: 1, brick: 1 } }),\n * )\n */\n addResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Debit the specified resources from a player.\n *\n * Throws when the player cannot afford the full cost — gate with\n * `q.player.canAfford(...)` in your `validate` step before invoking.\n *\n * pipe(\n * state,\n * ops.spendResources({ playerId, amounts: COST_DEV_CARD }),\n * ops.dealCardsToPlayerZone({ ... }),\n * )\n */\n spendResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Transfer the specified resources from one player to another.\n *\n * Throws when the source cannot afford the full amount. On success the\n * destination gains exactly what the source loses.\n */\n transferResources(args: {\n fromPlayerId: PlayerIdOfTable<PipeTable<State>>;\n toPlayerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Overwrite a single resource balance for a player. Prefer\n * {@link addResources} / {@link spendResources} — use this only when the\n * new balance is an absolute (e.g. scripted setup).\n */\n setResource(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n resourceId: ResourceIdOfTable<PipeTable<State>>;\n amount: number;\n }): Op<State>;\n}\n\n// --- Internal helpers -----------------------------------------------\n\ntype AnyTable = RuntimeTableRecord;\ntype AnyState = { table: AnyTable };\n\nfunction updateTable<S extends AnyState>(state: S, nextTable: AnyTable): S {\n return { ...state, table: nextTable };\n}\n\nfunction computePlayerZoneVisibility(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction readPlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): readonly string[] {\n const zone = table.zones.perPlayer[zoneId] ?? table.hands[zoneId];\n if (!zone) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n return (\n perPlayerGet(zone as PerPlayer<readonly string[]>, asPlayerId(playerId)) ??\n []\n );\n}\n\nfunction writePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n cards: readonly string[],\n): void {\n const currentZone = table.zones.perPlayer[zoneId];\n const currentHand = table.hands[zoneId];\n const player = asPlayerId(playerId);\n if (currentZone) {\n table.zones.perPlayer[zoneId] = perPlayerSet(\n currentZone as PerPlayer<string[]>,\n player,\n [...cards],\n );\n }\n if (currentHand) {\n table.hands[zoneId] = perPlayerSet(\n currentHand as PerPlayer<string[]>,\n player,\n [...cards],\n );\n }\n}\n\nfunction assertCardAllowedInPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n cardId: string,\n): void {\n const allowedCardSetIds = table.zones.cardSetIdsByZoneId?.[zoneId];\n if (!allowedCardSetIds || allowedCardSetIds.length === 0) {\n return;\n }\n const card = table.cards[cardId];\n if (!card) {\n throw new Error(`Card '${cardId}' does not exist.`);\n }\n if (!allowedCardSetIds.includes(card.cardSetId)) {\n throw new Error(\n `Card '${cardId}' from set '${card.cardSetId}' is not allowed in player zone '${zoneId}'.`,\n );\n }\n}\n\nfunction rotatePlayerZoneTable(options: {\n table: RuntimeTableRecord;\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n}): RuntimeTableRecord {\n const nextTable = cloneRuntimeTable(options.table);\n const zoneId = options.zoneId;\n if (!nextTable.zones.perPlayer[zoneId] && !nextTable.hands[zoneId]) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n const players = [...(options.players ?? nextTable.playerOrder)];\n if (players.length === 0) {\n return nextTable;\n }\n const playerSet = new Set(nextTable.playerOrder);\n for (const playerId of players) {\n if (!playerSet.has(playerId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': player '${playerId}' is not in player order.`,\n );\n }\n }\n\n const selectedByPlayer = new Map<string, readonly string[]>();\n for (const playerId of players) {\n const sourceCards = readPlayerZoneCards(nextTable, zoneId, playerId);\n const selected = options.cardIdsByPlayer?.[playerId] ?? sourceCards;\n for (const cardId of selected) {\n if (!sourceCards.includes(cardId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': card '${cardId}' is not in zone for player '${playerId}'.`,\n );\n }\n assertCardAllowedInPlayerZone(nextTable, zoneId, cardId);\n }\n selectedByPlayer.set(playerId, [...selected]);\n }\n\n const removeByPlayer = new Map<string, string[]>();\n for (const playerId of players) {\n const selected = new Set(selectedByPlayer.get(playerId) ?? []);\n removeByPlayer.set(\n playerId,\n readPlayerZoneCards(nextTable, zoneId, playerId).filter(\n (cardId) => !selected.has(cardId),\n ),\n );\n }\n\n const additionsByPlayer = new Map<string, string[]>(\n players.map((playerId) => [playerId, []]),\n );\n for (const [index, fromPlayerId] of players.entries()) {\n const offset = options.direction === \"left\" ? 1 : -1;\n const recipient =\n players[(index + offset + players.length) % players.length]!;\n additionsByPlayer\n .get(recipient)!\n .push(...(selectedByPlayer.get(fromPlayerId) ?? []));\n }\n\n for (const playerId of players) {\n const remaining = removeByPlayer.get(playerId) ?? [];\n const additions = additionsByPlayer.get(playerId) ?? [];\n const nextCards =\n options.position === \"top\"\n ? [...additions, ...remaining]\n : [...remaining, ...additions];\n writePlayerZoneCards(nextTable, zoneId, playerId, nextCards);\n for (const [position, cardId] of nextCards.entries()) {\n nextTable.componentLocations[cardId] = {\n type: \"InHand\",\n handId: zoneId,\n playerId,\n position,\n };\n nextTable.ownerOfCard[cardId] = playerId;\n nextTable.visibility[cardId] = computePlayerZoneVisibility(\n nextTable,\n zoneId,\n playerId,\n );\n }\n }\n\n return nextTable;\n}\n\n/**\n * Internal, id-type-erased signatures for the board writer family.\n *\n * The public `tableMove*` helpers constrain their id args to manifest-derived\n * unions such as `TiledBoardIdOfTable<Table>`, which collapse to `never` for\n * the unconstrained `RuntimeTableRecord`. Inside `createReducerOps<State>`\n * the `State` generic is not yet bound, so at this call site we only know\n * that all ids are plain strings. These aliases narrow that distinction to\n * one place instead of leaking `as never` casts across every op body.\n */\ntype TableMoveComponentToEdgeInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n) => RuntimeTableRecord;\n\ntype TableMoveComponentToVertexInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n) => RuntimeTableRecord;\n\ntype TableDealCardsFromDeckToHandInternal = (\n table: RuntimeTableRecord,\n fromZoneId: string,\n playerId: string,\n toZoneId: string,\n count: number,\n) => RuntimeTableRecord;\n\nconst moveComponentToEdgeInternal =\n tableMoveComponentToEdge as unknown as TableMoveComponentToEdgeInternal;\nconst moveComponentToVertexInternal =\n tableMoveComponentToVertex as unknown as TableMoveComponentToVertexInternal;\nconst dealCardsFromDeckToHandInternal =\n tableDealCardsFromDeckToHand as unknown as TableDealCardsFromDeckToHandInternal;\n\n/**\n * Create the `ops.*` namespace specialised to a game state.\n *\n * Call this once (typically in a shared reducer-support module) and reuse the\n * resulting object across phases:\n *\n * export const ops = createReducerOps<GameState>();\n */\nexport function createReducerOps<\n State extends ReducerStateBase,\n>(): ReducerOps<State> {\n // The implementation operates on the structural `AnyState` shape; the\n // public `ReducerOps<State>` interface adds manifest-aware argument\n // validation and polymorphic state preservation on top. The final\n // `as unknown as ReducerOps<State>` bridges the two: all runtime\n // correctness is still covered by the underlying table-ops writers.\n const applyPatch = <T extends object>(\n prev: T,\n patch: Partial<T> | ((prev: T) => T),\n ): T => {\n if (typeof patch === \"function\") {\n return (patch as (prev: T) => T)(prev);\n }\n return { ...prev, ...patch };\n };\n\n const impl = {\n setActivePlayers(activePlayers: ReadonlyArray<string>) {\n return <S extends AnyState>(state: S): S =>\n stateSetActivePlayers(\n state as unknown as never,\n [...activePlayers] as never,\n ) as unknown as S;\n },\n advanceActivePlayer() {\n return <S extends AnyState>(state: S): S => {\n const table = (state as unknown as { table: RuntimeTableRecord }).table;\n const order = table.playerOrder as ReadonlyArray<string>;\n if (order.length === 0) return state;\n const flow = (\n state as unknown as { flow?: { activePlayers?: readonly string[] } }\n ).flow;\n const current = flow?.activePlayers?.[0];\n const idx = current ? order.indexOf(current) : -1;\n const nextIdx = idx < 0 ? 0 : (idx + 1) % order.length;\n const nextId = order[nextIdx];\n if (nextId === undefined) return state;\n return stateSetActivePlayers(\n state as unknown as never,\n [nextId] as never,\n ) as unknown as S;\n };\n },\n patchPhaseState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev = (state as unknown as { phase?: object }).phase ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return stateSetPhaseState(\n state as unknown as { phase: object },\n next as object,\n ) as unknown as S;\n };\n },\n patchPublicState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { publicState?: object }).publicState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, publicState: next } as S;\n };\n },\n patchHiddenState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { hiddenState?: object }).hiddenState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, hiddenState: next } as S;\n };\n },\n patchPlayerPrivateState(args: { playerId: string; patch: unknown }) {\n return <S extends AnyState>(state: S): S => {\n const privateByPlayer =\n (state as unknown as { privateState?: Record<string, object> })\n .privateState ?? {};\n const prev = (privateByPlayer[args.playerId] ?? {}) as object;\n const next = applyPatch(\n prev,\n args.patch as Partial<object> | ((prev: object) => object),\n );\n return {\n ...state,\n privateState: {\n ...privateByPlayer,\n [args.playerId]: next,\n },\n } as S;\n };\n },\n addCardToSharedZone(args: {\n deckId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddCardToSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n args.playedBy ?? null,\n args.position ?? \"bottom\",\n );\n return updateTable(state, nextTable);\n };\n },\n removeCardFromSharedZone(args: { deckId: string; cardId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableRemoveCardFromSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenSharedZones(args: {\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenSharedZones({\n table: state.table,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableDealCardsBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n count: args.count,\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromPlayerZoneToSharedZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromPlayerZoneToSharedZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromSharedZoneToPlayerZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromSharedZoneToPlayerZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsToPlayerZone(args: {\n fromZoneId: string;\n playerId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = dealCardsFromDeckToHandInternal(\n state.table,\n args.fromZoneId,\n args.playerId,\n args.toZoneId,\n args.count,\n );\n return updateTable(state, nextTable);\n };\n },\n rotatePlayerZone(args: {\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = rotatePlayerZoneTable({\n table: state.table,\n zoneId: args.zoneId,\n direction: args.direction,\n players: args.players,\n cardIdsByPlayer: args.cardIdsByPlayer,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveComponentToSpace(args: {\n componentId: string;\n boardId: string;\n spaceId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToSpace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToContainer(args: {\n componentId: string;\n boardId: string;\n containerId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToContainer(\n state.table,\n args.componentId,\n args.boardId,\n args.containerId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToEdge(args: {\n componentId: string;\n boardId: string;\n edgeId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToEdgeInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToVertex(args: {\n componentId: string;\n boardId: string;\n vertexId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToVertexInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToDetached(args: { componentId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToDetached(\n state.table,\n args.componentId,\n );\n return updateTable(state, nextTable);\n };\n },\n addResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n spendResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSpendPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n transferResources(args: {\n fromPlayerId: string;\n toPlayerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableTransferPlayerResources(\n state.table,\n args.fromPlayerId,\n args.toPlayerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n setResource(args: {\n playerId: string;\n resourceId: string;\n amount: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSetPlayerResource(\n state.table,\n args.playerId,\n args.resourceId,\n args.amount,\n );\n return updateTable(state, nextTable);\n };\n },\n };\n\n return impl as unknown as ReducerOps<State>;\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n CardIdOfTable,\n ComponentDataOfTable,\n ComponentIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HexBoardIdOfTable,\n HexSpaceIdOfTable,\n PlayerIdOfTable,\n RelationTypeIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n TableQueries,\n TableQueriesOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexTypeIdOfTable,\n} from \"./model\";\nimport {\n getAdjacentSpaces,\n getAllPlayerZoneCards,\n getAllSharedZoneCards,\n getBoard,\n getBoardsByTypeId,\n getCard,\n getCardsById,\n getCardOwner,\n getCardVisibility,\n getSlotOccupants,\n getSlotOccupantsByHost,\n getComponentContainerLocation,\n getComponentDeckLocation,\n getComponentEdgeLocation,\n getComponentHandLocation,\n getComponentLocation,\n getComponentSlotLocation,\n getComponentSpaceLocation,\n getComponentVertexLocation,\n getComponentZoneLocation,\n getComponentsInContainer,\n getComponentsOnEdge,\n getComponentsOnSpace,\n getComponentsOnVertex,\n getContainer,\n getEdge,\n getEdgesByTypeId,\n getHexBoard,\n getHexSpace,\n getHexSpaceAt,\n getIncidentEdges,\n getIncidentVertices,\n canAffordResources,\n getMissingResources,\n getNextPlayerInOrder,\n getPlayerOrder,\n getPlayerResourceAmount,\n getPlayerResourceTotal,\n getPlayerResources,\n getPlayerZoneCardCollection,\n getPlayerZoneCards,\n getRelatedSpaces,\n getSharedZoneCardCollection,\n getSharedZoneCards,\n getSpace,\n getSpaceDistance,\n getSpaceEdges,\n getSpacesByTypeId,\n getSpaceVertices,\n getSquareBoard,\n getSquareDistance,\n getSquareNeighbors,\n getSquareSpace,\n getSquareSpaceAt,\n getTiledBoard,\n getVertex,\n getVerticesByTypeId,\n} from \"./table-ops\";\n\nexport function createTableQueries<Table extends RuntimeTableRecord>(\n table: Table,\n): TableQueries<Table> {\n return {\n board: {\n get: <BoardId extends BoardIdOfTable<Table>>(boardId: BoardId) =>\n getBoard(table, boardId),\n hex: <BoardId extends HexBoardIdOfTable<Table>>(boardId: BoardId) =>\n getHexBoard(table, boardId),\n square: <BoardId extends SquareBoardIdOfTable<Table>>(boardId: BoardId) =>\n getSquareBoard(table, boardId),\n tiled: <BoardId extends TiledBoardIdOfTable<Table>>(boardId: BoardId) =>\n getTiledBoard(table, boardId),\n space: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSpace(table, boardId, spaceId),\n hexSpace: <\n BoardId extends HexBoardIdOfTable<Table>,\n SpaceId extends HexSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getHexSpace(table, boardId, spaceId),\n squareSpace: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSquareSpace(table, boardId, spaceId),\n container: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getContainer(table, boardId, containerId),\n edge: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getEdge(table, boardId, edgeId),\n vertex: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getVertex(table, boardId, vertexId),\n byType: <TypeId extends BoardTypeIdOfTable<Table>>(typeId: TypeId) =>\n getBoardsByTypeId(table, typeId),\n spacesByType: <\n BoardId extends BoardIdOfTable<Table>,\n TypeId extends SpaceTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getSpacesByTypeId(table, boardId, typeId),\n edgesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledEdgeTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getEdgesByTypeId(table, boardId, typeId),\n verticesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledVertexTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getVerticesByTypeId(table, boardId, typeId),\n adjacentSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getAdjacentSpaces(table, boardId, spaceId),\n relatedSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n TypeId extends RelationTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n ) => getRelatedSpaces(table, boardId, spaceId, relationTypeId),\n incidentEdges: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getIncidentEdges(table, boardId, vertexId),\n incidentVertices: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getIncidentVertices(table, boardId, edgeId),\n spaceEdges: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceEdges(table, boardId, spaceId),\n spaceVertices: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceVertices(table, boardId, spaceId),\n spaceDistance: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n ) => getSpaceDistance(table, boardId, fromSpaceId, toSpaceId),\n hexSpaceAt: <BoardId extends HexBoardIdOfTable<Table>>(\n boardId: BoardId,\n q: number,\n r: number,\n ) => getHexSpaceAt(table, boardId, q, r),\n squareSpaceAt: <BoardId extends SquareBoardIdOfTable<Table>>(\n boardId: BoardId,\n row: number,\n col: number,\n ) => getSquareSpaceAt(table, boardId, row, col),\n squareNeighbors: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ) => getSquareNeighbors(table, boardId, spaceId, options),\n squareDistance: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ) => getSquareDistance(table, boardId, fromSpaceId, toSpaceId, options),\n spaceOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getComponentsOnSpace(table, boardId, spaceId),\n containerOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getComponentsInContainer(table, boardId, containerId),\n edgeOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getComponentsOnEdge(table, boardId, edgeId),\n vertexOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getComponentsOnVertex(table, boardId, vertexId),\n },\n zone: {\n sharedCards: <ZoneId extends DeckIdOfTable<Table>>(zoneId: ZoneId) =>\n getSharedZoneCards(table, zoneId),\n sharedCardCollection: <ZoneId extends DeckIdOfTable<Table>>(\n zoneId: ZoneId,\n ) => getSharedZoneCardCollection(table, zoneId),\n allSharedCards: () => getAllSharedZoneCards(table),\n playerCards: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCards(table, playerId, zoneId),\n playerCardCollection: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCardCollection(table, playerId, zoneId),\n allPlayerCards: <ZoneId extends HandIdOfTable<Table>>(zoneId: ZoneId) =>\n getAllPlayerZoneCards(table, zoneId),\n },\n card: {\n get: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCard(table, cardId),\n byIds: <CardIds extends readonly CardIdOfTable<Table>[]>(\n cardIds: CardIds,\n ) => getCardsById(table, cardIds),\n owner: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardOwner(table, cardId),\n visibility: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardVisibility(table, cardId),\n },\n slot: {\n occupants: (host, slotId) => getSlotOccupants(table, host, slotId),\n occupantsByHost: (host) => getSlotOccupantsByHost(table, host),\n pieceOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"piece\", id: hostId }, slotId),\n pieceOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"piece\", id: hostId }),\n dieOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"die\", id: hostId }, slotId),\n dieOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"die\", id: hostId }),\n },\n player: {\n order: () => getPlayerOrder(table),\n nextInOrder: (playerId) => getNextPlayerInOrder(table, playerId),\n resources: (playerId) => getPlayerResources(table, playerId),\n resource: (playerId, resourceId) =>\n getPlayerResourceAmount(table, playerId, resourceId),\n resourceTotal: (playerId) => getPlayerResourceTotal(table, playerId),\n canAfford: (playerId, amounts) =>\n canAffordResources(table, playerId, amounts),\n missingResources: (playerId, amounts) =>\n getMissingResources(table, playerId, amounts),\n },\n component: {\n data: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) =>\n (table.cards[componentId] ??\n table.pieces[componentId] ??\n table.dice[componentId]) as\n | ComponentDataOfTable<Table, ComponentId>\n | undefined,\n location: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentLocation(table, componentId),\n deck: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentDeckLocation(table, componentId),\n hand: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentHandLocation(table, componentId),\n zone: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentZoneLocation(table, componentId),\n space: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSpaceLocation(table, componentId),\n container: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentContainerLocation(table, componentId),\n edge: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentEdgeLocation(table, componentId),\n vertex: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentVertexLocation(table, componentId),\n slot: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSlotLocation(table, componentId),\n },\n };\n}\n\nexport function createStateQueries<State extends { table: RuntimeTableRecord }>(\n state: State,\n): TableQueriesOfState<State> {\n return createTableQueries(\n state.table,\n ) as unknown as TableQueriesOfState<State>;\n}\n","import type { Op } from \"./compose\";\nimport type {\n BoardIdOfTable,\n CardIdOfTable,\n ComponentIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n TableOfState,\n TableQueriesOfState,\n} from \"./model\";\nimport { createReducerOps, type ReducerOps } from \"./ops\";\nimport { createStateQueries } from \"./table-queries\";\n\nexport type RotatePlayerZoneArgs<\n State extends { table: RuntimeTableRecord },\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>> = PlayerZoneIdOfTable<\n TableOfState<State>\n >,\n PlayerId extends PlayerIdOfTable<TableOfState<State>> = PlayerIdOfTable<\n TableOfState<State>\n >,\n> = {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<TableOfState<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n};\n\ntype TransactionMethods<State extends { table: RuntimeTableRecord }> = {\n [Key in Exclude<\n keyof ReducerOps<State>,\n \"moveComponentToSpace\"\n >]: ReducerOps<State>[Key] extends (...args: infer Args) => Op<State>\n ? (...args: Args) => State\n : never;\n} & {\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<TableOfState<State>>,\n SpaceId extends SpaceIdOfTable<TableOfState<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): State;\n};\n\nexport type ReducerTransaction<State extends { table: RuntimeTableRecord }> =\n TransactionMethods<State> & {\n readonly state: State;\n readonly q: TableQueriesOfState<State>;\n apply(op: Op<State>): State;\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(\n args: RotatePlayerZoneArgs<State, ZoneId, PlayerId>,\n ): State;\n };\n\nexport type ReducerEdit<State extends { table: RuntimeTableRecord }> = <\n DraftState extends State,\n>(\n state: DraftState,\n) => ReducerTransaction<DraftState>;\n\nexport function createReducerTransaction<\n State extends { table: RuntimeTableRecord },\n>(initialState: State, ops: ReducerOps<State> = createReducerOps<State>()) {\n let currentState = initialState;\n let currentQueries = createStateQueries(currentState);\n\n const refresh = (nextState: State): State => {\n currentState = nextState;\n currentQueries = createStateQueries(currentState);\n return currentState;\n };\n\n const apply = (op: Op<State>): State => refresh(op(currentState));\n\n const base = {\n get state() {\n return currentState;\n },\n get q() {\n return currentQueries;\n },\n apply,\n };\n\n return new Proxy(base, {\n get(target, property, receiver) {\n if (property in target) {\n return Reflect.get(target, property, receiver);\n }\n const opFactory = ops[property as keyof ReducerOps<State>];\n if (typeof opFactory !== \"function\") {\n return undefined;\n }\n return (...args: readonly unknown[]) => {\n const op = (opFactory as (...args: readonly unknown[]) => Op<State>)(\n ...args,\n );\n return apply(op);\n };\n },\n }) as ReducerTransaction<State>;\n}\n\nexport function createReducerEdit<State extends { table: RuntimeTableRecord }>(\n ops: ReducerOps<State> = createReducerOps<State>(),\n): ReducerEdit<State> {\n return <DraftState extends State>(state: DraftState) =>\n createReducerTransaction(state, ops as unknown as ReducerOps<DraftState>);\n}\n","import { cardInput } from \"./inputs/cardInput\";\nimport { cardTarget } from \"./inputs/cardTarget\";\nimport type {\n AnyCardActionSpec,\n AnyContinuationCallable,\n AnyInteractionSpec,\n BaseGameStateOfContract,\n EffectMap,\n InputCollector,\n InteractionMap,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n StageMap,\n StageSpec,\n ViewMapOf,\n PhaseZoneList,\n PlayerZoneIdOfManifest,\n} from \"./model\";\n\nexport type ReducerIndexedPhase<Contract extends ReducerGameContractLike> =\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Record<string, InputCollector>,\n EffectMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n InteractionMap<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n StageMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n PhaseZoneList<ManifestContractOf<Contract>>\n >;\n\nexport type ReducerIndexedInteractionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyInteractionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport type ReducerIndexedStageEntry<Contract extends ReducerGameContractLike> =\n readonly [\n string,\n StageSpec<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n ];\n\nexport type ReducerIndexedZoneEntry<Contract extends ReducerGameContractLike> =\n PlayerZoneIdOfManifest<ManifestContractOf<Contract>>;\n\nexport type ReducerIndexedCardActionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyCardActionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport type ReducerIndexedEffectEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n {\n readonly id: string;\n readonly type: string;\n readonly continuation?: AnyContinuationCallable<\n BaseGameStateOfContract<Contract>\n > & {\n readonly id?: string;\n };\n },\n];\n\nexport interface ReducerDefinitionPhaseIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseName: PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n readonly phase: ReducerIndexedPhase<Contract>;\n readonly interactions: ReadonlyArray<\n ReducerIndexedInteractionEntry<Contract>\n >;\n readonly stages: ReadonlyArray<ReducerIndexedStageEntry<Contract>>;\n readonly zones: ReadonlyArray<ReducerIndexedZoneEntry<Contract>>;\n readonly cardActions: ReadonlyArray<ReducerIndexedCardActionEntry<Contract>>;\n readonly effects: ReadonlyArray<ReducerIndexedEffectEntry<Contract>>;\n}\n\nexport interface ReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n ReducerIndexedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>\n >;\n}\n\ntype RawEffectEntry<Contract extends ReducerGameContractLike> = readonly [\n string,\n {\n id?: string;\n type?: string;\n __continuation?: AnyContinuationCallable<\n BaseGameStateOfContract<Contract>\n > & {\n id?: string;\n };\n },\n];\n\nfunction phaseEntriesOf<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): Array<\n readonly [\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n ReducerIndexedPhase<Contract>,\n ]\n> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n return Object.entries(definition.phases) as unknown as Array<\n readonly [PhaseName, ReducerIndexedPhase<Contract>]\n >;\n}\n\nfunction interactionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n return Object.entries(\n (phase as { interactions?: Record<string, unknown> }).interactions ?? {},\n ) as Array<ReducerIndexedInteractionEntry<Contract>>;\n}\n\nfunction simultaneousSubmitEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n const submit = (phase as { submit?: unknown }).submit;\n if (!submit) return [];\n return [\n [\"submit\", submit] as unknown as ReducerIndexedInteractionEntry<Contract>,\n ];\n}\n\nfunction cardActionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedCardActionEntry<Contract>> {\n return Object.entries(\n (phase as { cardActions?: Record<string, unknown> }).cardActions ?? {},\n ) as Array<ReducerIndexedCardActionEntry<Contract>>;\n}\n\nfunction stageEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedStageEntry<Contract>> {\n return Object.entries(\n (phase as { stages?: Record<string, unknown> }).stages ?? {},\n ) as Array<ReducerIndexedStageEntry<Contract>>;\n}\n\nfunction zoneEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedZoneEntry<Contract>> {\n return Array.from(\n (phase as { zones?: readonly unknown[] }).zones ?? [],\n ) as Array<ReducerIndexedZoneEntry<Contract>>;\n}\n\nfunction effectEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<RawEffectEntry<Contract>> {\n return Object.entries(\n (phase as { effects?: Record<string, unknown> }).effects ?? {},\n ) as Array<RawEffectEntry<Contract>>;\n}\n\nexport function collectReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ReducerDefinitionIndex<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const phaseEntries = phaseEntriesOf(definition);\n const phasesByName = new Map<\n PhaseName,\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>\n >();\n\n for (const [phaseName, phase] of phaseEntries) {\n const interactionEntries = [\n ...interactionEntriesOf(phase),\n ...simultaneousSubmitEntriesOf(phase),\n ];\n const cardActionEntries: Array<ReducerIndexedInteractionEntry<Contract>> =\n cardActionEntriesOf(phase).map(([cardActionId, cardAction]) => [\n cardActionId,\n {\n ...cardAction,\n __steps: cardAction.__steps,\n inputs: {\n cardId: cardInput<State>({\n target: cardTarget\n .zones<State>([cardAction.playFrom])\n .where({\n id: \"card-type\",\n errorCode: \"WRONG_CARD_TYPE\",\n message: `Card must be ${cardAction.cardType}.`,\n test: ({ q, targetId }) =>\n q.card.get(targetId).cardType === cardAction.cardType,\n })\n .build(),\n }),\n ...(cardAction.inputs ?? {}),\n },\n } satisfies AnyInteractionSpec<State, Manifest>,\n ]);\n const effects: Array<ReducerIndexedEffectEntry<Contract>> = effectEntriesOf(\n phase,\n ).map(([effectKey, effectValue]) => [\n effectKey,\n {\n id: effectValue.id ?? effectKey,\n type: effectValue.type ?? \"rollDie\",\n continuation: effectValue.__continuation,\n },\n ]);\n\n phasesByName.set(phaseName, {\n phaseName,\n phase,\n interactions: [...interactionEntries, ...cardActionEntries],\n stages: stageEntriesOf(phase),\n zones: zoneEntriesOf(phase),\n cardActions: cardActionEntriesOf(phase),\n effects,\n });\n }\n\n return {\n phaseEntries,\n phasesByName,\n };\n}\n","import type {\n AnyContinuationCallable,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectReducerDefinitionIndex,\n type ReducerDefinitionPhaseIndex,\n type ReducerIndexedCardActionEntry,\n type ReducerIndexedInteractionEntry,\n type ReducerIndexedPhase,\n type ReducerIndexedStageEntry,\n type ReducerIndexedZoneEntry,\n} from \"../../definition-index\";\n\nexport type TrustedErasedPhase<Contract extends ReducerGameContractLike> =\n ReducerIndexedPhase<Contract>;\n\nexport type TrustedInteractionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedInteractionEntry<Contract>;\n\nexport type TrustedCardActionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedCardActionEntry<Contract>;\n\nexport type TrustedStageEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedStageEntry<Contract>;\n\nexport type TrustedZoneEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedZoneEntry<Contract>;\n\nexport type TrustedContinuationRegistry<\n Contract extends ReducerGameContractLike,\n> = ReadonlyMap<\n string,\n AnyContinuationCallable<BaseGameStateOfContract<Contract>>\n>;\n\nexport interface TrustedPhaseRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> extends Omit<\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>,\n \"effects\"\n> {}\n\nexport interface TrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n TrustedErasedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >;\n readonly continuationsById: TrustedContinuationRegistry<Contract>;\n readonly effectsById: ReadonlyMap<\n string,\n { readonly id: string; readonly type: string }\n >;\n}\n\nexport function collectTrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): TrustedRuntimeRegistry<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const index = collectReducerDefinitionIndex(definition);\n const phasesByName = new Map<\n PhaseName,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >();\n const continuationsById = new Map<string, AnyContinuationCallable<State>>();\n const effectsById = new Map<\n string,\n { readonly id: string; readonly type: string }\n >();\n\n for (const phaseIndex of index.phasesByName.values()) {\n const { effects: _effects, ...trustedPhase } = phaseIndex;\n phasesByName.set(phaseIndex.phaseName, trustedPhase);\n for (const [, effect] of phaseIndex.effects) {\n effectsById.set(effect.id, { id: effect.id, type: effect.type });\n if (effect.continuation) {\n const continuationId = effect.continuation.id ?? effect.id;\n continuationsById.set(\n continuationId,\n effect.continuation as AnyContinuationCallable<State>,\n );\n }\n }\n }\n\n return {\n phaseEntries: index.phaseEntries,\n phasesByName,\n continuationsById,\n effectsById,\n };\n}\n","import type { RuntimeTableRecord } from \"./model/table\";\nimport type { TableQueriesOfState } from \"./model/queries\";\nimport type { BaseGameStateOfContract } from \"./model/definition\";\nimport { createStateQueries } from \"./table-queries\";\n\n/**\n * A freestanding, memoized projection of immutable game state.\n *\n * Use `defineDerived` for values that are pure functions of component\n * locations, zone contents, resources, or other state fields - and are\n * consumed from multiple reducer or view call sites, or whose compute cost\n * is non-trivial (graph walks, aggregate reductions).\n *\n * Do NOT cache derived values in `publicState`. State fields should be\n * inputs to derivations, not mirrors of them.\n */\nexport type DerivedDefinition<Contract, Value> = {\n /** Optional label for debugging. Does not affect caching. */\n readonly name?: string;\n readonly compute: (ctx: {\n readonly state: BaseGameStateOfContract<Contract>;\n readonly q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n readonly derived: DerivedResolver;\n }) => Value;\n};\n\n/**\n * Resolves a `DerivedDefinition` to its value. Callers do not need to know\n * about memoization - the resolver handles caching internally.\n */\nexport type DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n) => Value;\n\ntype AnyDerivedDefinition = DerivedDefinition<unknown, unknown>;\n\n/**\n * Author-facing factory for creating a derived value tied to a game\n * contract. Usage:\n *\n * ```ts\n * export const longestRoad = defineDerived<GameContract>()({\n * name: \"longestRoad\",\n * compute: ({ q, derived }) => computeLongestRoad(q),\n * });\n * ```\n */\nexport function defineDerived<Contract>() {\n return <Value>(def: {\n name?: string;\n compute: (ctx: {\n state: BaseGameStateOfContract<Contract>;\n q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived: DerivedResolver;\n }) => Value;\n }): DerivedDefinition<Contract, Value> => def;\n}\n\n/**\n * Creates a resolver scoped to a single state snapshot. Each engine tick\n * and each view projection call creates its own resolver; cache lifetime\n * ends with the call. Cache key is the `DerivedDefinition` identity (the\n * object reference).\n *\n * Re-entry on an in-flight definition throws a readable error.\n */\nexport function createDerivedResolver<\n State extends { table: RuntimeTableRecord },\n>(\n state: State,\n options: { q?: TableQueriesOfState<State> } = {},\n): DerivedResolver {\n const cache = new Map<AnyDerivedDefinition, unknown>();\n const inflight = new Set<AnyDerivedDefinition>();\n const q = options.q ?? createStateQueries(state);\n\n const resolver: DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n ): Value => {\n const typedDef = def as unknown as AnyDerivedDefinition;\n if (cache.has(typedDef)) {\n return cache.get(typedDef) as Value;\n }\n if (inflight.has(typedDef)) {\n throw new Error(\n `Cyclic derived: '${def.name ?? \"<anonymous>\"}' depends on itself.`,\n );\n }\n inflight.add(typedDef);\n try {\n const value = (\n def.compute as unknown as (ctx: {\n state: unknown;\n q: unknown;\n derived: DerivedResolver;\n }) => Value\n )({ state, q, derived: resolver });\n cache.set(typedDef, value);\n return value;\n } finally {\n inflight.delete(typedDef);\n }\n };\n\n return resolver;\n}\n","import type {\n AnyContinuationToken,\n EffectSpecLike,\n ReducerFx,\n RuntimeTableRecord,\n} from \"./model\";\n\ntype FxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\ntype InternalEffectDefinition = EffectSpecLike;\n\nfunction buildResume(\n effect: InternalEffectDefinition,\n context: unknown,\n): AnyContinuationToken | undefined {\n if (!effect.__continuation) {\n return undefined;\n }\n return (effect.__continuation as unknown as (data: unknown) => unknown)(\n context ?? {},\n ) as AnyContinuationToken;\n}\n\nfunction invokeEffect(\n effect: InternalEffectDefinition,\n options: Record<string, unknown>,\n) {\n const continuation = buildResume(effect, options.context);\n if (effect.type === \"rollDie\") {\n return continuation === undefined\n ? {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n }\n : {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n continuation,\n };\n }\n if (effect.type === \"shuffleSharedZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n }\n : {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n continuation,\n };\n }\n if (effect.type === \"shufflePlayerZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n }\n : {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n continuation,\n };\n }\n throw new Error(\n `fx.effect: unsupported effect type '${(effect as InternalEffectDefinition).type}'.`,\n );\n}\n\nexport function createReducerFx<State extends FxState>(\n _state: State,\n): ReducerFx<State> {\n const fx: ReducerFx<State> = {\n transition(to) {\n return { kind: \"flow.transition\", to } as ReturnType<\n ReducerFx<State>[\"transition\"]\n >;\n },\n effect(effect, options) {\n return invokeEffect(\n effect as unknown as InternalEffectDefinition,\n options as Record<string, unknown>,\n ) as ReturnType<ReducerFx<State>[\"effect\"]>;\n },\n } as ReducerFx<State>;\n return fx;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n ActionContext,\n BaseGameStateOfContract,\n ManifestContractOf,\n PlayerIdOfState,\n RandomHelpers,\n ReducerGameContractLike,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { TrustedRuntimeHelpers, TrustedState } from \"./runtime-scope\";\n\nexport function fxForState<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n) {\n return createReducerFx<TrustedState<Contract>>(state);\n}\n\nexport function buildContext<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n): ActionContext<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n> {\n type DomainState = BaseGameStateOfContract<Contract>;\n type PlayerId = PlayerIdOfState<DomainState>;\n type Manifest = ManifestContractOf<Contract>;\n return {\n currentPhase: state.flow.currentPhase as ActionContext<\n DomainState,\n Manifest\n >[\"currentPhase\"],\n manifest,\n playerOrder: [...state.table.playerOrder] as PlayerId[],\n activePlayers: [...state.flow.activePlayers] as PlayerId[],\n runtime: publicRuntime(state.runtime),\n setup: (state.runtime.setup\n ? {\n profileId: state.runtime.setup.profileId,\n optionValues: {\n ...state.runtime.setup.optionValues,\n },\n }\n : null) as ActionContext<DomainState, Manifest>[\"setup\"],\n };\n}\n\nfunction publicRuntime<Runtime extends { rng?: unknown }>(\n runtime: Runtime,\n): Omit<Runtime, \"rng\"> {\n const { rng: _rng, ...rest } = runtime;\n return rest;\n}\n\nconst DISABLED_RANDOM_HELPERS: RandomHelpers = {\n subset() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n};\n\nexport function buildRuntimeArgs<\n Contract extends ReducerGameContractLike,\n Extra extends object,\n>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n helpers: TrustedRuntimeHelpers<Contract>,\n toDomainState: (\n state: TrustedState<Contract>,\n ) => BaseGameStateOfContract<Contract>,\n extra: Extra,\n options: {\n q?: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n } = {},\n) {\n const domainState = toDomainState(state);\n const q = options.q ?? createStateQueries(domainState);\n return {\n ...buildContext(state, manifest),\n ...helpers,\n fx: options.fx ?? fxForState(state),\n q,\n derived: options.derived ?? createDerivedResolver(domainState, { q }),\n runtime: publicRuntime(state.runtime),\n random: options.random ?? DISABLED_RANDOM_HELPERS,\n ...extra,\n };\n}\n","import type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { ReducerReject, ReducerResult } from \"../../model\";\n\nexport function acceptResult<State>(\n state: State,\n instructions: Array<RuntimeInstructionForState<State>> = [],\n) {\n return {\n type: \"accept\" as const,\n state,\n instructions,\n };\n}\n\nexport function rejectResult(\n errorCode: string,\n message?: string,\n): ReducerReject {\n return {\n type: \"reject\",\n errorCode,\n message,\n };\n}\n\nexport function normalizeResult<State>(\n result: ReducerResult<State> | void,\n fallbackState: State,\n): ReducerResult<State> {\n if (result === undefined || result === null) {\n return acceptResult(fallbackState);\n }\n return result;\n}\n\nexport const runtimeResultHelpers = {\n accept: acceptResult,\n reject: rejectResult,\n};\n","export function toDomainState<State extends { runtime: unknown }, DomainState>(\n state: State,\n): DomainState {\n const { runtime: _runtime, ...domain } = state;\n attachPhaseAccessor(domain);\n return domain as DomainState;\n}\n\nexport function toCombinedState<\n SessionState extends { domain: unknown; runtime: unknown },\n State,\n>(session: SessionState): State {\n const combined = {\n ...(session.domain as object),\n runtime: session.runtime,\n };\n attachPhaseAccessor(combined);\n return combined as State;\n}\n\nexport function toSessionState<\n State extends { runtime: unknown },\n DomainState,\n SessionState,\n>(state: State, toDomain: (state: State) => DomainState): SessionState {\n return {\n domain: toDomain(state),\n runtime: state.runtime,\n } as SessionState;\n}\n\nfunction attachPhaseAccessor(state: unknown): void {\n if (!state || typeof state !== \"object\") return;\n const candidate = state as {\n flow?: { currentPhase?: unknown };\n phase?: unknown;\n };\n const phase = candidate.phase;\n if (!phase || typeof phase !== \"object\") return;\n const descriptor = Object.getOwnPropertyDescriptor(phase, \"get\");\n if (descriptor && typeof descriptor.value === \"function\") return;\n Object.defineProperty(phase, \"get\", {\n enumerable: false,\n configurable: true,\n value: (phaseName: string) =>\n candidate.flow?.currentPhase === phaseName ? phase : null,\n });\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\n\nexport function resolveTrustedSetupProfiles<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(definition: ReducerGameDefinition<Contract, Definitions, Views>) {\n const manifestSetupProfilesById =\n definition.contract.manifest.setupProfilesById;\n const manifestSetupProfileIds = Object.keys(manifestSetupProfilesById).sort();\n const reducerSetupProfiles = definition.setupProfiles ?? {};\n const reducerSetupProfileIds = Object.keys(reducerSetupProfiles).sort();\n if (\n manifestSetupProfileIds.length !== reducerSetupProfileIds.length ||\n manifestSetupProfileIds.some(\n (profileId, index) => reducerSetupProfileIds[index] !== profileId,\n )\n ) {\n throw new Error(\n `Reducer setupProfiles must exactly match manifest setupProfiles. Manifest=[${manifestSetupProfileIds.join(\", \")}], reducer=[${reducerSetupProfileIds.join(\", \")}].`,\n );\n }\n return {\n manifestSetupProfilesById,\n reducerSetupProfiles,\n };\n}\n\nexport function resolveDefaultInitialPhase<PhaseName extends string>(\n explicitInitialPhase: PhaseName | undefined,\n phaseEntries: ReadonlyArray<readonly [PhaseName, unknown]>,\n): PhaseName {\n const defaultInitialPhase = explicitInitialPhase ?? phaseEntries[0]?.[0];\n if (!defaultInitialPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n return defaultInitialPhase;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createReducerOps } from \"../../ops\";\nimport { createReducerEdit } from \"../../transaction\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n ActionContext,\n AnyContinuationCallable,\n AnyInteractionSpec,\n BaseGameSessionOfContract,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n PlayerIdOfState,\n PlayerZoneIdOfManifest,\n RandomHelpers,\n ReducerGameContractLike,\n ReducerGameDefinition,\n StageSpec,\n TableQueriesOfState,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectTrustedRuntimeRegistry,\n type TrustedErasedPhase,\n type TrustedCardActionEntry,\n type TrustedInteractionEntry,\n type TrustedPhaseRegistry,\n type TrustedRuntimeRegistry,\n} from \"./runtime-registry\";\nimport {\n buildContext as buildTrustedContext,\n buildRuntimeArgs as buildTrustedRuntimeArgs,\n fxForState as trustedFxForState,\n} from \"./trusted-runtime-args\";\nimport {\n normalizeResult,\n rejectResult,\n runtimeResultHelpers,\n} from \"./trusted-runtime-result\";\nimport {\n toCombinedState as codecToCombinedState,\n toDomainState as codecToDomainState,\n toSessionState as codecToSessionState,\n} from \"./trusted-state-codec\";\nimport {\n resolveDefaultInitialPhase,\n resolveTrustedSetupProfiles,\n} from \"./trusted-setup-profiles\";\n\nexport { normalizeResult, rejectResult } from \"./trusted-runtime-result\";\n\nexport type TrustedDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReducerGameDefinition<Contract, Definitions, Views>;\n\nexport type TrustedDomainState<Contract extends ReducerGameContractLike> =\n BaseGameStateOfContract<Contract>;\n\nexport type TrustedSessionState<Contract extends ReducerGameContractLike> =\n BaseGameSessionOfContract<Contract>;\n\nexport type TrustedState<Contract extends ReducerGameContractLike> =\n TrustedDomainState<Contract> & {\n runtime: TrustedSessionState<Contract>[\"runtime\"];\n };\n\nexport type TrustedManifest<Contract extends ReducerGameContractLike> =\n ManifestContractOf<Contract>;\n\nexport type TrustedPhaseName<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = PhaseNamesOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type TrustedPlayerId<Contract extends ReducerGameContractLike> =\n PlayerIdOfState<TrustedDomainState<Contract>>;\n\nexport type TrustedInput<Contract extends ReducerGameContractLike> =\n TrustedRuntimeInput<TrustedPlayerId<Contract>>;\n\nexport type { TrustedErasedPhase } from \"./runtime-registry\";\n\nexport interface TrustedRuntimeHelpers<\n Contract extends ReducerGameContractLike,\n> {\n accept: (\n state: TrustedDomainState<Contract>,\n instructions?: Array<\n RuntimeInstructionForState<TrustedDomainState<Contract>>\n >,\n ) => {\n type: \"accept\";\n state: TrustedDomainState<Contract>;\n instructions: Array<\n RuntimeInstructionForState<TrustedDomainState<Contract>>\n >;\n };\n reject: typeof rejectResult;\n ops: ReturnType<typeof createReducerOps<TrustedDomainState<Contract>>>;\n edit: ReturnType<typeof createReducerEdit<TrustedDomainState<Contract>>>;\n}\n\nexport interface TrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n definition: TrustedDefinition<Contract, Definitions, Views>;\n registry: TrustedRuntimeRegistry<Contract, Definitions, Views>;\n phaseEntries: ReadonlyArray<\n readonly [\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedErasedPhase<Contract>,\n ]\n >;\n defaultInitialPhase: TrustedPhaseName<Contract, Definitions, Views>;\n manifestSetupProfilesById: TrustedManifest<Contract>[\"setupProfilesById\"];\n reducerSetupProfiles: NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >;\n runtimeHelpers: TrustedRuntimeHelpers<Contract>;\n toDomainState(state: TrustedState<Contract>): TrustedDomainState<Contract>;\n toCombinedState(\n session: TrustedSessionState<Contract>,\n ): TrustedState<Contract>;\n toSessionState(state: TrustedState<Contract>): TrustedSessionState<Contract>;\n phaseRegistryByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined;\n phaseByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedErasedPhase<Contract>;\n findInteractionInPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n interactionId: string,\n ):\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n interactionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedInteractionEntry<Contract>>;\n stagesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<\n readonly [\n string,\n StageSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>,\n ]\n >;\n zonesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<PlayerZoneIdOfManifest<TrustedManifest<Contract>>>;\n cardActionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedCardActionEntry<Contract>>;\n continuationById(\n id: string,\n ): AnyContinuationCallable<TrustedDomainState<Contract>> | undefined;\n fxForState(\n state: TrustedState<Contract>,\n ): ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n buildContext(\n state: TrustedState<Contract>,\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>>;\n buildRuntimeArgs<Extra extends object>(\n state: TrustedState<Contract>,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<TrustedDomainState<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n },\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>> &\n TrustedRuntimeHelpers<Contract> & {\n fx: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n q: ReturnType<typeof createStateQueries<TrustedDomainState<Contract>>>;\n derived: ReturnType<\n typeof createDerivedResolver<TrustedDomainState<Contract>>\n >;\n runtime: Omit<TrustedState<Contract>[\"runtime\"], \"rng\">;\n random: RandomHelpers;\n } & Extra;\n}\n\nexport function createTrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: TrustedDefinition<Contract, Definitions, Views>,\n): TrustedRuntimeScope<Contract, Definitions, Views> {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n const registry = collectTrustedRuntimeRegistry(definition);\n const { phaseEntries } = registry;\n const defaultInitialPhase = resolveDefaultInitialPhase(\n definition.initialPhase as PhaseName | undefined,\n phaseEntries,\n );\n const { manifestSetupProfilesById, reducerSetupProfiles } =\n resolveTrustedSetupProfiles(definition);\n\n function toDomainState(state: State): DomainState {\n return codecToDomainState<State, DomainState>(state);\n }\n\n function toCombinedState(session: SessionState): State {\n return codecToCombinedState<SessionState, State>(session);\n }\n\n function toSessionState(state: State): SessionState {\n return codecToSessionState<State, DomainState, SessionState>(\n state,\n toDomainState,\n );\n }\n\n function phaseRegistryByName(\n phaseName: PhaseName,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined {\n return registry.phasesByName.get(phaseName);\n }\n\n function phaseByName(phaseName: PhaseName): TrustedErasedPhase<Contract> {\n const phaseRegistry = phaseRegistryByName(phaseName);\n if (!phaseRegistry) {\n throw new Error(`Unknown reducer phase '${phaseName}'.`);\n }\n return phaseRegistry.phase;\n }\n\n function findInteractionInPhase(\n phaseName: PhaseName,\n interactionId: string,\n ): AnyInteractionSpec<DomainState, Manifest> | undefined {\n const found = interactionEntriesForPhase(phaseName).find(\n ([id]) => id === interactionId,\n );\n return found?.[1];\n }\n\n function interactionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.interactions ?? [];\n }\n\n function stagesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.stages ?? [];\n }\n\n function zonesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.zones ?? [];\n }\n\n function cardActionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.cardActions ?? [];\n }\n\n function continuationById(id: string) {\n return registry.continuationsById.get(id);\n }\n\n const helpers: TrustedRuntimeHelpers<Contract> = {\n ...runtimeResultHelpers,\n ops: createReducerOps<DomainState>(),\n edit: createReducerEdit<DomainState>(),\n };\n\n function fxForState(state: State) {\n return trustedFxForState<Contract>(state);\n }\n\n function buildContext(state: State): ActionContext<DomainState, Manifest> {\n return buildTrustedContext<Contract>(state, definition.contract.manifest);\n }\n\n function buildRuntimeArgs<Extra extends object>(\n state: State,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<DomainState>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<State>>;\n random?: RandomHelpers;\n },\n ) {\n return buildTrustedRuntimeArgs<Contract, Extra>(\n state,\n definition.contract.manifest,\n helpers,\n toDomainState,\n extra,\n options,\n );\n }\n\n return {\n definition,\n registry,\n phaseEntries,\n defaultInitialPhase,\n manifestSetupProfilesById,\n reducerSetupProfiles: reducerSetupProfiles as NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >,\n runtimeHelpers: helpers,\n toDomainState,\n toCombinedState,\n toSessionState,\n phaseRegistryByName,\n phaseByName,\n findInteractionInPhase,\n interactionEntriesForPhase,\n stagesForPhase,\n zonesForPhase,\n cardActionEntriesForPhase,\n continuationById,\n fxForState,\n buildContext,\n buildRuntimeArgs,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { RuntimePayload } from \"../../model\";\nimport { createRuntimeInstructionEngine } from \"../../engine/runtime-instruction-engine\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerResult,\n RuntimeRngState,\n ViewMapOf,\n} from \"../../model\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport { createEngineInstructionResolver } from \"./engine-instruction-resolver\";\nimport { createFlowInstructionResolver } from \"./flow-instruction-resolver\";\nimport {\n createMutableRandomHelpers,\n sampleRngCollectorValue,\n} from \"./rng-sampler\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n simultaneousSubmitInteraction,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport {\n normalizeResult,\n rejectResult,\n type TrustedDomainState,\n type TrustedInput,\n type TrustedManifest,\n type TrustedPhaseName,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createTrustedInstructionRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const flowInstructions = createFlowInstructionResolver(lifecycle);\n const engineInstructions = createEngineInstructionResolver<\n Contract,\n Definitions,\n Views\n >();\n\n type RuntimeRngResult = { runtimeRng?: RuntimeRngState };\n\n function reduceInternal(\n state: State,\n input: ReducerInput,\n ): ReducerResult<DomainState> & RuntimeRngResult {\n const ctx = scope.buildContext(state);\n\n if (input.kind === \"interaction\") {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) {\n return rejectResult(\n \"unsupported-action\",\n `Interaction '${input.interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n );\n }\n const parsed = interactions.parseInteractionParams(\n interaction,\n input.params,\n { playerId: input.playerId },\n );\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n interaction.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n playerId: input.playerId,\n params: parsed.params,\n },\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n if (input.kind === \"continuation\") {\n const continuation = scope.continuationById(input.continuationId);\n if (!continuation) {\n return rejectResult(\n \"missing-continuation\",\n `Continuation '${input.continuationId}' was not registered.`,\n );\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n continuation.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n source: \"effect\" as const,\n effectKind: input.effectKind,\n data: input.resumeData,\n response: input.response,\n },\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n return scope.runtimeHelpers.accept(scope.toDomainState(state));\n }\n\n function preSampleRngForAction(\n state: State,\n input: ReducerInput,\n ): { state: State; input: ReducerInput } {\n if (input.kind !== \"interaction\") return { state, input };\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) return { state, input };\n const collectors = interaction.inputs as Record<string, InputCollector>;\n let nextRng = state.runtime.rng;\n const sampled: Record<string, unknown> = {};\n let anySampled = false;\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind !== \"rng\") continue;\n const { value, nextRng: advanced } = sampleRngCollectorValue(\n collector,\n nextRng,\n );\n sampled[key] = value;\n nextRng = advanced;\n anySampled = true;\n }\n if (!anySampled) return { state, input };\n const mergedParams: Record<string, unknown> = {\n ...((input.params ?? {}) as Record<string, unknown>),\n ...sampled,\n };\n return {\n state: {\n ...state,\n runtime: { ...state.runtime, rng: nextRng },\n } as State,\n input: { ...input, params: mergedParams } as ReducerInput,\n };\n }\n\n function clearSimultaneousCurrent(state: State): State {\n return {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: { current: null },\n },\n } as State;\n }\n\n function reduceSimultaneousSubmit(\n state: State,\n input: ReducerInput,\n ): ReducerResult<State> | null {\n if (\n input.kind !== \"interaction\" ||\n input.interactionId !== SIMULTANEOUS_SUBMIT_INTERACTION_ID\n ) {\n return null;\n }\n\n const phaseName = state.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) {\n return null;\n }\n\n const submit = simultaneousSubmitInteraction(scope.phaseByName(phaseName));\n if (!submit) {\n return rejectResult(\n \"missing-submit-interaction\",\n `Simultaneous phase '${phaseName}' does not declare submit.`,\n );\n }\n const resolve = (phase as { resolve?: unknown }).resolve;\n if (typeof resolve !== \"function\") {\n return rejectResult(\n \"missing-simultaneous-resolve\",\n `Simultaneous phase '${phaseName}' does not declare resolve.`,\n );\n }\n\n const actors = resolveSimultaneousActors(scope, state, phase);\n if (!actors.includes(input.playerId as PlayerId)) {\n return rejectResult(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${input.interactionId}').`,\n );\n }\n\n const parsed = interactions.parseInteractionParams(submit, input.params);\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n\n const current =\n state.runtime.simultaneous?.current?.phaseName === phaseName\n ? state.runtime.simultaneous.current\n : {\n phaseName,\n actors,\n submissions: {},\n };\n const existing = current.submissions[input.playerId as PlayerId];\n const canResubmit =\n (phase as { canResubmit?: boolean }).canResubmit === true;\n if (existing && !canResubmit) {\n return rejectResult(\n \"ALREADY_SUBMITTED\",\n `Interaction '${input.interactionId}' has already been submitted by '${input.playerId}'.`,\n );\n }\n\n const submissions: Record<\n string,\n { interactionId: string; params: RuntimePayload }\n > = {\n ...current.submissions,\n [input.playerId]: {\n interactionId: input.interactionId,\n params: parsed.params as RuntimePayload,\n },\n };\n const stateWithSubmission = {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: {\n current: {\n phaseName,\n actors,\n submissions,\n },\n },\n },\n } as State;\n const waitingPlayerIds = actors.filter((actor) => !submissions[actor]);\n if (waitingPlayerIds.length > 0) {\n return {\n type: \"accept\",\n state: stateWithSubmission,\n instructions: [],\n };\n }\n\n const resolvedSubmissions = Object.fromEntries(\n actors.map((actor) => [\n actor,\n {\n playerId: actor,\n params: submissions[actor]?.params ?? {},\n },\n ]),\n );\n const random = createMutableRandomHelpers(stateWithSubmission.runtime.rng);\n const resolved = normalizeResult(\n resolve(\n scope.buildRuntimeArgs(\n stateWithSubmission,\n {\n state: scope.toDomainState(stateWithSubmission),\n submissions: resolvedSubmissions,\n submittedPlayerIds: [...actors],\n waitingPlayerIds: [],\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(stateWithSubmission),\n );\n if (resolved.type === \"reject\") {\n return resolved;\n }\n return {\n type: \"accept\",\n state: clearSimultaneousCurrent({\n ...resolved.state,\n runtime: { ...stateWithSubmission.runtime, rng: random.currentRng() },\n } as State),\n instructions: resolved.instructions ?? [],\n };\n }\n\n function reduceOnce(state: State, input: ReducerInput): ReducerResult<State> {\n const sampled = preSampleRngForAction(state, input);\n const simultaneousResult = reduceSimultaneousSubmit(\n sampled.state,\n sampled.input,\n );\n if (simultaneousResult) {\n return simultaneousResult;\n }\n const result = reduceInternal(sampled.state, sampled.input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: {\n ...result.state,\n runtime: {\n ...sampled.state.runtime,\n rng: result.runtimeRng ?? sampled.state.runtime.rng,\n },\n } as State,\n instructions: result.instructions ?? [],\n };\n }\n\n function resolveInstruction(\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n switch (instruction.kind) {\n case \"flow.transition\":\n return flowInstructions.resolveTransition(state, instruction);\n case \"engine.rollDie\":\n return engineInstructions.resolveRollDie(state, instruction);\n case \"engine.shuffleSharedZone\":\n return engineInstructions.resolveShuffleSharedZone(state, instruction);\n case \"engine.shufflePlayerZone\":\n return engineInstructions.resolveShufflePlayerZone(state, instruction);\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `Unknown runtime instruction kind: ${(_exhaustive as { kind: string }).kind}`,\n );\n }\n }\n }\n\n const instructionEngine = createRuntimeInstructionEngine<\n State,\n PlayerId,\n ReducerInput\n >({\n reduce(state, input) {\n return reduceOnce(state, input);\n },\n resolveInstruction,\n });\n\n return {\n resolveInstruction,\n dispatch: instructionEngine.dispatch,\n drainInstructions: instructionEngine.drainInstructions,\n reduceInternal,\n reduceOnce,\n };\n}\n","import { z } from \"zod\";\n\nexport function formatIssue(\n label: string,\n issue: { path: PropertyKey[]; message: string },\n): string {\n const path = issue.path\n .map((segment) =>\n typeof segment === \"symbol\" ? segment.toString() : String(segment),\n )\n .join(\".\");\n return `${path || label}: ${issue.message}`;\n}\n\nexport function safeParseOrThrow<Schema extends z.ZodTypeAny>(\n schema: Schema,\n value: unknown,\n label: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n const message = parsed.error.issues\n .map((issue) => formatIssue(label, issue))\n .join(\"; \");\n throw new Error(message || `Invalid ${label}`);\n }\n return parsed.data;\n}\n","import type {\n AnyInteractionSpec,\n InputCollectorKind,\n InputDomainDescriptor,\n InteractionIdOfDefinition,\n InteractionKind,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDefinition,\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport type TrustedInteractionId<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionIdOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type InteractionDescriptorContext<PlayerId extends string = string> = {\n to: PlayerId;\n title?: string;\n options?: Array<{ id: string; label?: string }>;\n};\n\nexport type InteractionCommitPolicyShape =\n | { mode: \"manual\" }\n | { mode: \"autoWhenReady\" };\n\nexport type InteractionAvailabilityShape =\n | { status: \"available\" }\n | { status: \"notYourTurn\"; reason: string }\n | {\n status: \"insufficientResources\";\n reason: string;\n missingResources: Record<string, number>;\n }\n | { status: \"blocked\"; reason: string; code?: string };\n\ntype InteractionDescriptorBaseShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = {\n phaseName: PhaseName;\n interactionKey: `${PhaseName}.${InteractionId}`;\n interactionId: InteractionId;\n commit: InteractionCommitPolicyShape;\n zoneId?: ZoneId;\n zoneIds?: readonly ZoneId[];\n inputs: InteractionInputDescriptorShape[];\n cost?: Record<string, number>;\n currentResources?: Record<string, number>;\n availability: InteractionAvailabilityShape;\n};\n\nexport type ActionInteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = InteractionDescriptorBaseShape<PhaseName, InteractionId, ZoneId> & {\n kind: \"action\";\n};\n\nexport type PromptInteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> = InteractionDescriptorBaseShape<PhaseName, InteractionId, ZoneId> & {\n kind: \"prompt\";\n context: InteractionDescriptorContext<PlayerId>;\n};\n\nexport type InteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> =\n | ActionInteractionDescriptorShape<PhaseName, InteractionId, ZoneId>\n | PromptInteractionDescriptorShape<\n PhaseName,\n InteractionId,\n PlayerId,\n ZoneId\n >;\n\nexport type TrustedInteractionDescriptorShape<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionDescriptorShape<\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedInteractionId<Contract, Definitions, Views>,\n TrustedPlayerId<Contract>\n>;\n\nexport type InteractionInputDescriptorShape = {\n key: string;\n kind: InputCollectorKind;\n domain: InputDomainDescriptor;\n defaultValue?: unknown;\n};\n\nexport type InteractionActorAuthorization<PlayerId extends string> =\n | { readonly mode: \"addressees\"; readonly addressees: ReadonlySet<PlayerId> }\n | { readonly mode: \"actors\"; readonly actors: ReadonlySet<PlayerId> }\n | { readonly mode: \"active\" };\n\nexport type ResolveDecisionMode = \"descriptor\" | \"card\" | \"submit\";\n\nexport type ResolveDecisionInput<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = {\n state: TrustedState<Contract>;\n playerId: TrustedPlayerId<Contract>;\n interactionId: string;\n params?: Record<string, unknown>;\n mode: ResolveDecisionMode;\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >;\n};\n\nexport type InteractionDecisionResult<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> =\n | {\n found: false;\n validation: ReducerValidationResult;\n }\n | {\n found: true;\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >;\n parsedParams: Record<string, unknown>;\n visible: boolean;\n descriptor: TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n validation: ReducerValidationResult;\n };\n\nexport function makeValidationError(\n errorCode: string,\n message?: string,\n): ReducerValidationResult {\n return {\n valid: false,\n errorCode,\n message,\n };\n}\n","import { formatIssue } from \"../../parse-utils\";\nimport { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n BoardTargetDomainDescriptor,\n CardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n InputSelectionDescriptor,\n ManifestContract,\n ReducerValidationResult,\n TableQueriesOfState,\n TableOfState,\n} from \"../../model\";\nimport { makeValidationError } from \"./interaction-types\";\nimport type { InteractionInputDescriptorShape } from \"./interaction-types\";\n\nconst MAX_EAGER_DEPENDENT_DOMAIN_CASES = 64;\n\ntype CollectorProjectionOptions<DomainState extends CollectorState> = {\n readonly queries?: TableQueriesOfState<DomainState>;\n readonly derived?: DerivedResolver;\n readonly eligibleTargetCache?: Map<string, string[]>;\n readonly eligibleTargetCachePrefix?: string;\n readonly includeEligibleTargets?: boolean;\n};\n\nfunction collectTargetDomainMetadata(collector: InputCollector): {\n targetKind?: string;\n boardId?: string;\n valueKind?: \"board-id\" | \"player-board-space\";\n zoneId?: string;\n zoneIds?: readonly string[];\n} {\n switch (collector.kind) {\n case \"card\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? \"card\",\n zoneId: meta.zoneId,\n zoneIds:\n meta.zoneIds ??\n (meta.zoneId === undefined ? undefined : [meta.zoneId]),\n };\n }\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? collector.kind.replace(\"board-\", \"\"),\n boardId: meta.boardId,\n valueKind: meta.valueKind,\n };\n }\n default:\n return {};\n }\n}\n\nfunction withSelection(\n domain: InputDomainDescriptor,\n collector: InputCollector,\n): InputDomainDescriptor {\n if (!collector.selection) return domain;\n return { ...domain, selection: collector.selection };\n}\n\nfunction lazyTargetDomainFromCollectorMetadata(\n key: string,\n collector: InputCollector,\n dependencies: readonly string[],\n): CardTargetDomainDescriptor | BoardTargetDomainDescriptor | null {\n const metadata = collectTargetDomainMetadata(collector);\n if (collector.kind === \"card\") {\n return withSelection(\n {\n type: \"cardTarget\",\n projection: \"lazy\",\n targetKind: \"card\",\n zoneIds:\n metadata.zoneIds ??\n (metadata.zoneId === undefined ? [] : [metadata.zoneId]),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n },\n collector,\n ) as CardTargetDomainDescriptor;\n }\n if (\n collector.kind === \"board-edge\" ||\n collector.kind === \"board-space\" ||\n collector.kind === \"board-tile\" ||\n collector.kind === \"board-vertex\"\n ) {\n return withSelection(\n {\n type: \"boardTarget\",\n projection: \"lazy\",\n targetKind: (metadata.targetKind ??\n collector.kind.replace(\"board-\", \"\")) as\n | \"edge\"\n | \"vertex\"\n | \"space\"\n | \"tile\",\n boardId: metadata.boardId ?? \"\",\n ...(metadata.valueKind ? { valueKind: metadata.valueKind } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n },\n collector,\n ) as BoardTargetDomainDescriptor;\n }\n return null;\n}\n\nfunction finiteValuesForDependency(\n key: string,\n domain: InputDomainDescriptor | undefined,\n): string[] {\n if (!domain) {\n throw new Error(\n `Interaction input '${key}' is declared as a dependency before it has a projected domain.`,\n );\n }\n if (domain.type === \"cardTarget\" || domain.type === \"boardTarget\") {\n if (domain.projection !== \"resolved\") {\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency because its target domain is not finite.`,\n );\n }\n return [...domain.eligibleTargets];\n }\n if (domain.type === \"choice\") {\n return domain.choices.flatMap((choice) =>\n choice.value === null ? [] : [choice.value],\n );\n }\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency. V1 supports finite target and choice dependencies only.`,\n );\n}\n\nfunction cartesianDependencyTuples(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): Array<Record<string, string>> {\n return dependencies.reduce<Array<Record<string, string>>>(\n (tuples, key) => {\n const values = finiteValuesForDependency(key, domainsByKey[key]);\n return tuples.flatMap((tuple) =>\n values.map((value) => ({ ...tuple, [key]: value })),\n );\n },\n [{}],\n );\n}\n\nfunction withoutDependentProjection(\n domain: InputDomainDescriptor,\n): InputDomainDescriptor {\n const { dependencies: _dependencies, ...rest } =\n domain as InputDomainDescriptor & { dependencies?: unknown };\n return rest as InputDomainDescriptor;\n}\n\nfunction toLazyTargetDomain(\n key: string,\n domain: InputDomainDescriptor,\n dependencies: readonly string[],\n): CardTargetDomainDescriptor | BoardTargetDomainDescriptor | null {\n if (domain.type === \"cardTarget\") {\n return {\n type: \"cardTarget\",\n projection: \"lazy\",\n targetKind: \"card\",\n zoneIds: domain.zoneIds,\n ...(domain.selection ? { selection: domain.selection } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n };\n }\n if (domain.type === \"boardTarget\") {\n return {\n type: \"boardTarget\",\n projection: \"lazy\",\n targetKind: domain.targetKind,\n boardId: domain.boardId,\n ...(domain.valueKind ? { valueKind: domain.valueKind } : {}),\n ...(domain.selection ? { selection: domain.selection } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n };\n }\n return null;\n}\n\nfunction dependencyCaseCount(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): number {\n return dependencies\n .map((key) => finiteValuesForDependency(key, domainsByKey[key]).length)\n .reduce((total, count) => total * count, 1);\n}\n\nfunction unsupportedDefaultInputError(key: string, collector: InputCollector) {\n return new Error(\n `Interaction input '${key}' uses a '${collector.kind}' collector without a default-renderable domain or target metadata. ` +\n \"Use formInput.choice(...), formInput.choiceList(...), formInput.number(...), formInput.resourceMap(...), cardInput(...), or boardInput(...). \" +\n \"For custom payloads, use a custom interaction surface with paramsSchema instead of the default InteractionForm.\",\n );\n}\n\nexport function interactionInputsOf<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<string, InputCollector> {\n return interaction.inputs as Record<string, InputCollector>;\n}\n\nexport function collectEligibleTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, string[]> {\n const collectors = interactionInputsOf(interaction);\n const result: Record<string, string[]> = {};\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n for (const [key, collector] of Object.entries(collectors)) {\n if (!collector.eligibleTargets) continue;\n const cacheKey = options.eligibleTargetCachePrefix\n ? `${options.eligibleTargetCachePrefix}:${key}`\n : null;\n const cached = cacheKey\n ? options.eligibleTargetCache?.get(cacheKey)\n : undefined;\n if (cached) {\n result[key] = cached;\n continue;\n }\n const targets = collector.eligibleTargets(\n domainState as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[0],\n playerId as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[1],\n queries() as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[2],\n );\n const resolved = Array.from(targets as ReadonlyArray<unknown>).map((t) =>\n String(t),\n );\n result[key] = resolved;\n if (cacheKey) {\n options.eligibleTargetCache?.set(cacheKey, resolved);\n }\n }\n return result;\n}\n\nexport function collectInputMetadata<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<\n string,\n {\n kind: string;\n targetKind?: string;\n boardId?: string;\n zoneId?: string;\n zoneIds?: readonly string[];\n }\n> {\n const collectors = interactionInputsOf(interaction);\n return Object.fromEntries(\n Object.entries(collectors).map(([key, collector]) => [\n key,\n {\n kind: collector.kind,\n ...collectTargetDomainMetadata(collector),\n },\n ]),\n );\n}\n\nexport function collectInputDomains<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n eligibleTargets: Record<string, string[]>,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, InputDomainDescriptor> {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n const result: Record<string, InputDomainDescriptor> = {};\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") {\n continue;\n }\n if (collector.kind === \"prompt\") {\n const optionFactory = collector.meta?.options;\n if (!optionFactory) continue;\n result[key] = {\n type: \"choice\",\n choices: optionFactory(domainState, playerId, queries() as unknown).map(\n (option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n ...(() => {\n const issue = collector.validateTarget?.(\n domainState,\n playerId,\n queries() as unknown,\n String(option.id),\n );\n return issue\n ? {\n disabled: true,\n disabledReason: issue.message ?? issue.errorCode,\n }\n : {};\n })(),\n }),\n ),\n };\n continue;\n }\n if (collector.domain) {\n const domainProjector = collector.domain;\n const dependencies = collector.dependsOn ?? [];\n if (\n options.includeEligibleTargets === false &&\n !Object.prototype.hasOwnProperty.call(eligibleTargets, key)\n ) {\n const lazyDomain = lazyTargetDomainFromCollectorMetadata(\n key,\n collector,\n dependencies,\n );\n if (lazyDomain) {\n result[key] = lazyDomain;\n continue;\n }\n }\n const baseDomain = withSelection(\n domainProjector(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n {},\n ),\n collector,\n );\n if (dependencies.length === 0) {\n result[key] = baseDomain;\n continue;\n }\n const caseCount = dependencyCaseCount(dependencies, result);\n const lazyDomain =\n caseCount > MAX_EAGER_DEPENDENT_DOMAIN_CASES\n ? toLazyTargetDomain(key, baseDomain, dependencies)\n : null;\n if (lazyDomain) {\n result[key] = lazyDomain;\n continue;\n }\n const dependentCases = cartesianDependencyTuples(\n dependencies,\n result,\n ).map((values) => ({\n when: values,\n domain: withoutDependentProjection(\n withSelection(\n domainProjector(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n values,\n ),\n collector,\n ),\n ),\n }));\n result[key] = {\n ...baseDomain,\n dependencies: {\n mode: \"eager\",\n dependentCases,\n },\n } as InputDomainDescriptor;\n continue;\n }\n throw unsupportedDefaultInputError(key, collector);\n }\n return result;\n}\n\nexport function collectInteractionInputs<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): InteractionInputDescriptorShape[] {\n const collectors = interactionInputsOf(interaction);\n const dependencyKeys = new Set(\n Object.values(collectors).flatMap((collector) => [\n ...(collector.dependsOn ?? []),\n ]),\n );\n const collectedEligibleTargets =\n options.includeEligibleTargets === false && dependencyKeys.size === 0\n ? {}\n : collectEligibleTargets(interaction, domainState, playerId, options);\n const eligibleTargets =\n options.includeEligibleTargets === false\n ? Object.fromEntries(\n Object.entries(collectedEligibleTargets).filter(([key]) =>\n dependencyKeys.has(key),\n ),\n )\n : collectedEligibleTargets;\n const domainsByKey = collectInputDomains(\n interaction,\n domainState,\n playerId,\n eligibleTargets,\n options,\n );\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n return Object.entries(collectors).flatMap(([key, collector]) => {\n if (collector.kind === \"rng\") {\n return [];\n }\n const domain = domainsByKey[key];\n if (!domain && collector.kind === \"prompt\") {\n return [];\n }\n if (!domain) {\n throw unsupportedDefaultInputError(key, collector);\n }\n const dynamicDefault = collector.resolveDefaultValue?.(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n domain,\n );\n const defaultValue =\n \"defaultValue\" in collector ? collector.defaultValue : dynamicDefault;\n warnConcreteDependentChoiceDefault({\n inputKey: key,\n collector,\n domain,\n defaultValue,\n dependencyKeys,\n });\n return [\n {\n key,\n kind: collector.kind,\n domain,\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n },\n ];\n });\n}\n\nconst concreteDependentChoiceDefaultWarnings = new Set<string>();\n\nfunction shouldEmitAuthoringWarning(): boolean {\n const env = (\n globalThis as typeof globalThis & {\n process?: { env?: Record<string, string | undefined> };\n }\n ).process?.env;\n return (\n env?.NODE_ENV !== \"production\" &&\n env?.DREAMBOARD_SUPPRESS_AUTHORING_WARNINGS !== \"1\"\n );\n}\n\nfunction warnConcreteDependentChoiceDefault({\n inputKey,\n collector,\n domain,\n defaultValue,\n dependencyKeys,\n}: {\n inputKey: string;\n collector: InputCollector;\n domain: InputDomainDescriptor;\n defaultValue: unknown;\n dependencyKeys: ReadonlySet<string>;\n}): void {\n if (\n !shouldEmitAuthoringWarning() ||\n !dependencyKeys.has(inputKey) ||\n collector.kind !== \"form\" ||\n domain.type !== \"choice\" ||\n defaultValue === undefined ||\n defaultValue === null\n ) {\n return;\n }\n\n const warningKey = `${inputKey}:${String(defaultValue)}`;\n if (concreteDependentChoiceDefaultWarnings.has(warningKey)) {\n return;\n }\n concreteDependentChoiceDefaultWarnings.add(warningKey);\n console.warn(\n `[dreamboard] Form choice input \"${inputKey}\" feeds another collector and defaulted to \"${String(\n defaultValue,\n )}\". Dependent choices that select the object an action applies to should usually use defaultValue: () => undefined so collection stays explicit.`,\n );\n}\n\nexport function collectFirstCardZoneId<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): string | undefined {\n const collectors = interactionInputsOf(interaction);\n for (const collector of Object.values(collectors)) {\n if (collector.kind === \"card\") {\n if (collector.meta.zoneId.length > 0) {\n return collector.meta.zoneId;\n }\n }\n }\n return undefined;\n}\n\nexport function collectCardZoneIds<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): readonly string[] {\n const collectors = interactionInputsOf(interaction);\n const zoneIds = new Set<string>();\n for (const collector of Object.values(collectors)) {\n if (collector.kind === \"card\") {\n for (const zoneId of collector.meta.zoneIds ?? [collector.meta.zoneId]) {\n if (zoneId.length > 0) zoneIds.add(zoneId);\n }\n }\n }\n return [...zoneIds];\n}\n\nexport function collectPromptOptions(\n interaction: {\n inputs: Record<string, InputCollector>;\n },\n domainState: unknown,\n playerId: string,\n queries: unknown,\n): Array<{ id: string; label?: string }> | undefined {\n for (const collector of Object.values(interaction.inputs)) {\n if (collector.kind !== \"prompt\") continue;\n const factory = collector.meta?.options;\n if (!factory) continue;\n return factory(domainState, playerId, queries).map((option) => ({\n id: String(option.id),\n ...(option.label !== undefined ? { label: option.label } : {}),\n }));\n }\n return undefined;\n}\n\nexport function parseInteractionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n options: { skipRng?: boolean; playerId?: string } = {},\n):\n | { ok: true; params: Record<string, unknown> }\n | { ok: false; message: string } {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n if (options.skipRng && interaction.paramsSchema) {\n const result = interaction.paramsSchema.safeParse(record);\n if (!result.success) {\n return {\n ok: false,\n message: result.error.issues\n .map((issue) => formatIssue(\"params\", issue))\n .join(\"; \"),\n };\n }\n return { ok: true, params: result.data as Record<string, unknown> };\n }\n const parsed: Record<string, unknown> = {};\n const issues: string[] = [];\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\" && options.skipRng) continue;\n const rawValueBase =\n record[key] === undefined && \"defaultValue\" in collector\n ? collector.defaultValue\n : record[key];\n const rawValue =\n collector.kind === \"board-space\" &&\n collector.meta?.valueKind === \"player-board-space\" &&\n typeof rawValueBase === \"string\" &&\n options.playerId\n ? {\n boardId: collector.meta.boardId,\n playerId: options.playerId,\n spaceId: rawValueBase,\n }\n : rawValueBase;\n const result = collector.schema.safeParse(rawValue);\n if (!result.success) {\n for (const issue of result.error.issues) {\n issues.push(formatIssue(`params.${key}`, issue));\n }\n continue;\n }\n parsed[key] = result.data;\n }\n if (issues.length > 0) {\n return { ok: false, message: issues.join(\"; \") };\n }\n return { ok: true, params: parsed };\n}\n\nexport function prepareInteractionProjectionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n): Record<string, unknown> {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n const prepared: Record<string, unknown> = { ...record };\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n if (record[key] !== undefined) {\n const result = collector.schema.safeParse(record[key]);\n if (result.success) {\n prepared[key] = result.data;\n }\n continue;\n }\n if (\"defaultValue\" in collector) {\n prepared[key] = collector.defaultValue;\n continue;\n }\n const defaultResult = collector.schema.safeParse(undefined);\n if (defaultResult.success) {\n prepared[key] = defaultResult.data;\n }\n }\n return prepared;\n}\n\nexport function validateCollectorTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n params: Record<string, unknown>,\n): ReducerValidationResult {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: ReturnType<typeof createStateQueries> | null = null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ));\n for (const [key, collector] of Object.entries(collectors)) {\n const selectionIssue = validateCollectorSelection(collector, params[key]);\n if (selectionIssue) {\n return makeValidationError(\n selectionIssue.errorCode,\n selectionIssue.message,\n );\n }\n if (!collector.validateTarget) continue;\n const rawTarget = params[key];\n if (rawTarget === null || rawTarget === undefined) continue;\n const dependencyValues = dependencyValuesForCollector(collector, params);\n const targetValues = valuesForCollectorValidation(\n collector.selection,\n rawTarget,\n );\n for (const value of targetValues) {\n const issue = collector.validateTarget(\n domainState as unknown as Parameters<\n typeof collector.validateTarget\n >[0],\n playerId as unknown as Parameters<typeof collector.validateTarget>[1],\n queries() as unknown as Parameters<typeof collector.validateTarget>[2],\n value,\n dependencyValues,\n );\n if (issue) {\n return makeValidationError(issue.errorCode, issue.message);\n }\n }\n }\n return { valid: true };\n}\n\nfunction dependencyValuesForCollector(\n collector: InputCollector,\n params: Record<string, unknown>,\n): Readonly<Record<string, unknown>> | undefined {\n const dependencies = collector.dependsOn ?? [];\n if (dependencies.length === 0) return undefined;\n return Object.fromEntries(\n dependencies.map((dependencyKey) => [dependencyKey, params[dependencyKey]]),\n );\n}\n\nfunction valuesForCollectorValidation(\n selection: InputSelectionDescriptor | undefined,\n value: unknown,\n): readonly unknown[] {\n if (selection?.mode === \"many\") {\n return Array.isArray(value) ? value : [];\n }\n return [value];\n}\n\nfunction validateCollectorSelection(\n collector: InputCollector,\n value: unknown,\n): { errorCode: string; message?: string } | null {\n const selection = collector.selection;\n if (selection?.mode !== \"many\") return null;\n if (!Array.isArray(value)) return null;\n if (value.length < selection.min) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at least ${selection.min} value${selection.min === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.max !== undefined && value.length > selection.max) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at most ${selection.max} value${selection.max === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.distinct) {\n const seen = new Set<string>();\n for (const item of value) {\n const key = stableValueKey(item);\n if (seen.has(key)) {\n return {\n errorCode: \"DUPLICATE_INPUT_VALUE\",\n message: \"Input values must be distinct.\",\n };\n }\n seen.add(key);\n }\n }\n return null;\n}\n\nfunction stableValueKey(value: unknown): string {\n if (value === null) return \"null\";\n switch (typeof value) {\n case \"string\":\n return `string:${value}`;\n case \"number\":\n case \"boolean\":\n case \"undefined\":\n return `${typeof value}:${String(value)}`;\n default:\n return `json:${JSON.stringify(value)}`;\n }\n}\n\nexport function findCardInputKey<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): string | undefined {\n return Object.entries(interactionInputsOf(interaction)).find(\n ([, collector]) => collector.kind === \"card\",\n )?.[0];\n}\n\nexport function findCardInputKeyForZone<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n zoneId: string,\n): string | undefined {\n return Object.entries(interactionInputsOf(interaction)).find(\n ([, collector]) =>\n collector.kind === \"card\" &&\n (collector.meta.zoneIds ?? [collector.meta.zoneId])\n .map(String)\n .includes(zoneId),\n )?.[0];\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { InteractionActorAuthorization } from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n} from \"./simultaneous-player\";\n\nfunction resolvePromptToSet<PlayerId extends string>(\n to: unknown,\n): ReadonlySet<PlayerId> {\n if (to === undefined || to === null) return new Set();\n if (Array.isArray(to)) {\n return new Set(to as PlayerId[]);\n }\n if (typeof to === \"string\") {\n return new Set([to as PlayerId]);\n }\n return new Set();\n}\n\nexport function createInteractionAuthorization<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInteractionActorAuthorization(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): InteractionActorAuthorization<PlayerId> {\n if (interaction.to) {\n const resolved = interaction.to({\n ...scope.buildContext(state),\n state: projection?.domainState ?? scope.toDomainState(state),\n });\n return {\n mode: \"addressees\",\n addressees: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n if (interaction.actor) {\n const resolved = interaction.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n const phase = scope.phaseByName(state.flow.currentPhase as PhaseName);\n if (isSimultaneousPhase(phase)) {\n return {\n mode: \"actors\",\n actors: new Set(\n resolveSimultaneousActors(scope, state, phase, projection),\n ),\n };\n }\n if (phase.actor) {\n const resolved = phase.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n return { mode: \"active\" };\n }\n\n function isActorAuthorized(\n state: State,\n playerId: PlayerId,\n authorization: InteractionActorAuthorization<PlayerId>,\n ): boolean {\n if (authorization.mode === \"addressees\") {\n return authorization.addressees.has(playerId);\n }\n if (authorization.mode === \"actors\") {\n return authorization.actors.has(playerId);\n }\n const active = state.flow.activePlayers as readonly PlayerId[];\n if (active.length === 0) {\n return true;\n }\n return active.includes(playerId);\n }\n\n function isInteractionVisible(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n authorization: InteractionActorAuthorization<PlayerId>,\n authorized: boolean,\n ): boolean {\n return (\n !(authorization.mode === \"addressees\" && !authorized) &&\n !(interaction.visibility === \"actorsOnly\" && !authorized)\n );\n }\n\n return {\n isActorAuthorized,\n isInteractionVisible,\n resolveInteractionActorAuthorization,\n };\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectCardZoneIds,\n collectFirstCardZoneId,\n collectInteractionInputs,\n collectPromptOptions,\n interactionInputsOf,\n parseInteractionParams,\n prepareInteractionProjectionParams,\n validateCollectorTargets,\n} from \"./interaction-collectors\";\nimport type { createInteractionAuthorization } from \"./interaction-authorization\";\nimport type { createStageResolver } from \"./stage-resolver\";\nimport {\n makeValidationError,\n type InteractionDecisionResult,\n type InteractionAvailabilityShape,\n type InteractionDescriptorShape,\n type ResolveDecisionInput,\n type TrustedInteractionDescriptorShape,\n type TrustedInteractionId,\n} from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype StageResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createStageResolver<Contract, Definitions, Views>>;\n\ntype AuthorizationFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n typeof createInteractionAuthorization<Contract, Definitions, Views>\n>;\n\ntype InteractionRuleIssue = {\n errorCode: string;\n message?: string;\n};\n\nfunction issueFromRule(rule: InteractionRuleIssue): InteractionRuleIssue {\n return { errorCode: rule.errorCode, message: rule.message };\n}\n\nfunction issueFromRuleValidationResult(\n rule: InteractionRuleIssue,\n result: boolean | InteractionRuleIssue | null | undefined,\n): InteractionRuleIssue | undefined {\n if (result === false) return issueFromRule(rule);\n if (result && typeof result === \"object\") return result;\n return undefined;\n}\n\nfunction humanizeInteractionId(id: string): string {\n if (!id) return id;\n const withSpaces = id\n .replace(/[-_]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .trim();\n if (!withSpaces) return id;\n return withSpaces\n .split(/\\s+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction deriveInteractionKind(\n inputs: Record<string, InputCollector>,\n): \"action\" | \"prompt\" {\n for (const collector of Object.values(inputs)) {\n if (collector.kind === \"prompt\") {\n return \"prompt\";\n }\n }\n return \"action\";\n}\n\nfunction isTargetCollector(collector: InputCollector): boolean {\n switch (collector.kind) {\n case \"card\":\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isManyCollector(collector: InputCollector): boolean {\n return collector.selection?.mode === \"many\";\n}\n\nfunction terminalCollectorsForInputs(\n inputs: Record<string, InputCollector>,\n): InputCollector[] {\n const terminalKeys = new Set(Object.keys(inputs));\n for (const collector of Object.values(inputs)) {\n for (const dependencyKey of collector.dependsOn ?? []) {\n terminalKeys.delete(dependencyKey);\n }\n }\n const collectors: InputCollector[] = [];\n for (const key of terminalKeys) {\n const collector = inputs[key];\n if (collector) collectors.push(collector);\n }\n return collectors;\n}\n\nfunction deriveCommitPolicy(\n inputs: Record<string, InputCollector>,\n explicit: InteractionDescriptorShape[\"commit\"] | undefined,\n): InteractionDescriptorShape[\"commit\"] {\n const collectors = Object.values(inputs);\n const hasManyCollector = collectors.some(isManyCollector);\n if (explicit) {\n if (explicit.mode === \"autoWhenReady\" && hasManyCollector) {\n throw new Error(\n 'Interactions with many(...) inputs must use commit: { mode: \"manual\" }.',\n );\n }\n return explicit;\n }\n if (hasManyCollector) {\n return { mode: \"manual\" };\n }\n if (collectors.length === 0 || !collectors.some(isTargetCollector)) {\n return { mode: \"manual\" };\n }\n const terminalCollectors = terminalCollectorsForInputs(inputs);\n if (terminalCollectors.length === 0) {\n return { mode: \"manual\" };\n }\n return terminalCollectors.every(\n (collector) => isTargetCollector(collector) || collector.kind === \"rng\",\n ) && terminalCollectors.some(isTargetCollector)\n ? { mode: \"autoWhenReady\" }\n : { mode: \"manual\" };\n}\n\nfunction projectInteractionMetadata(interaction: {\n inputs: Record<string, InputCollector>;\n commit?: InteractionDescriptorShape[\"commit\"];\n}): Pick<InteractionDescriptorShape, \"kind\" | \"commit\"> {\n return {\n kind: deriveInteractionKind(interaction.inputs),\n commit: deriveCommitPolicy(interaction.inputs, interaction.commit),\n };\n}\n\nfunction enrichResourceInputPresentation(\n inputs: InteractionDescriptorShape[\"inputs\"],\n manifest: { literals?: { resourcePresentationById?: unknown } },\n): InteractionDescriptorShape[\"inputs\"] {\n const presentationById = manifest.literals?.resourcePresentationById;\n if (!presentationById || typeof presentationById !== \"object\") {\n return inputs;\n }\n const resources = presentationById as Record<\n string,\n { label?: unknown; icon?: unknown }\n >;\n const enrichChoice = <\n Choice extends { value: string | null; label: string; icon?: string },\n >(\n choice: Choice,\n ): Choice & { icon?: string } => {\n const presentation =\n choice.value === null ? undefined : resources[choice.value];\n return {\n ...choice,\n label:\n typeof presentation?.label === \"string\" &&\n (!choice.label || choice.label === choice.value)\n ? presentation.label\n : choice.label ||\n (typeof presentation?.label === \"string\" ? presentation.label : \"\"),\n icon:\n choice.icon ??\n (typeof presentation?.icon === \"string\"\n ? presentation.icon\n : undefined),\n };\n };\n return inputs.map((input) => {\n if (input.domain.type === \"choice\") {\n return {\n ...input,\n domain: {\n ...input.domain,\n choices: input.domain.choices.map(enrichChoice),\n },\n };\n }\n if (input.domain.type === \"choiceList\") {\n return {\n ...input,\n domain: {\n ...input.domain,\n choices: input.domain.choices.map(enrichChoice),\n },\n };\n }\n if (input.domain.type !== \"resourceMap\") return input;\n return {\n ...input,\n domain: {\n ...input.domain,\n resources: input.domain.resources.map((entry) => {\n const presentation = resources[entry.resourceId];\n return {\n ...entry,\n label:\n entry.label ??\n (typeof presentation?.label === \"string\"\n ? presentation.label\n : undefined),\n icon:\n entry.icon ??\n (typeof presentation?.icon === \"string\"\n ? presentation.icon\n : undefined),\n };\n }),\n },\n };\n });\n}\n\nfunction interactionAvailabilityFromDecision(decision: {\n available: boolean;\n unavailableReason?: string;\n missingResources?: Record<string, number>;\n}): InteractionAvailabilityShape {\n if (decision.available) return { status: \"available\" };\n if (decision.unavailableReason === \"Not your turn\") {\n return { status: \"notYourTurn\", reason: decision.unavailableReason };\n }\n if (decision.unavailableReason === \"INSUFFICIENT_RESOURCES\") {\n return {\n status: \"insufficientResources\",\n reason: decision.unavailableReason,\n missingResources: { ...(decision.missingResources ?? {}) },\n };\n }\n return {\n status: \"blocked\",\n reason: decision.unavailableReason ?? \"Interaction unavailable\",\n };\n}\n\nexport function createInteractionDecisionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n stages: StageResolverFor<Contract, Definitions, Views>,\n authorization: AuthorizationFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type InteractionId = TrustedInteractionId<Contract, Definitions, Views>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n\n function evaluateInteractionCost(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n playerId: PlayerId,\n params: Record<string, unknown>,\n projection?: ProjectionContext<DomainState, State>,\n ):\n | { cost?: Record<string, number>; missing?: Record<string, number> }\n | { error: unknown } {\n if (!interaction.cost) {\n return {};\n }\n const args = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId, params },\n },\n projection,\n );\n try {\n const cost = { ...interaction.cost(args) };\n const typedCost = cost as Parameters<typeof args.q.player.canAfford>[1];\n const missing = args.q.player.canAfford(playerId, typedCost)\n ? {}\n : { ...args.q.player.missingResources(playerId, typedCost) };\n return { cost, missing };\n } catch (error) {\n return { error };\n }\n }\n\n function buildBaseDescriptor(\n state: State,\n playerId: PlayerId,\n interactionId: InteractionId,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n decision: {\n available: boolean;\n unavailableReason?: string;\n cost?: Record<string, number>;\n missingResources?: Record<string, number>;\n },\n options: {\n projection?: ProjectionContext<DomainState, State>;\n includeEligibleTargets?: boolean;\n } = {},\n ): Descriptor {\n const domainState =\n options.projection?.domainState ?? scope.toDomainState(state);\n const phaseName = state.flow.currentPhase as PhaseName;\n const interactionInputs = interactionInputsOf(interaction);\n const metadata = projectInteractionMetadata({\n ...interaction,\n inputs: interactionInputs,\n });\n const queries = options.projection?.q ?? createStateQueries(domainState);\n const derived = options.projection?.derived;\n const shouldMaterializeInputDomains =\n decision.available || decision.unavailableReason !== \"Not your turn\";\n const promptContext =\n metadata.kind === \"prompt\"\n ? {\n to: playerId,\n title: humanizeInteractionId(interactionId),\n options: shouldMaterializeInputDomains\n ? collectPromptOptions(\n { inputs: interactionInputs },\n domainState,\n playerId as unknown as string,\n queries,\n )\n : undefined,\n }\n : undefined;\n const inputs = shouldMaterializeInputDomains\n ? enrichResourceInputPresentation(\n collectInteractionInputs(interaction, domainState, playerId, {\n queries,\n derived,\n eligibleTargetCache: options.projection?.eligibleTargets,\n eligibleTargetCachePrefix: `${phaseName}:${String(\n interactionId,\n )}:${String(playerId)}`,\n includeEligibleTargets: options.includeEligibleTargets,\n }),\n scope.definition.contract.manifest,\n )\n : [];\n const baseDescriptor = {\n phaseName,\n interactionKey: `${phaseName}.${interactionId}`,\n interactionId,\n commit: metadata.commit,\n zoneId: collectFirstCardZoneId(interaction),\n zoneIds: collectCardZoneIds(interaction),\n inputs,\n cost: decision.cost ? { ...decision.cost } : undefined,\n currentResources: decision.cost\n ? {\n ...(queries.player.resources(playerId) as\n | Record<string, number>\n | undefined),\n }\n : undefined,\n availability: interactionAvailabilityFromDecision(decision),\n };\n if (metadata.kind === \"prompt\") {\n return {\n ...baseDescriptor,\n kind: \"prompt\",\n context: promptContext ?? {\n to: playerId,\n title: humanizeInteractionId(interactionId),\n },\n } as Descriptor;\n }\n return {\n ...baseDescriptor,\n kind: \"action\",\n } as Descriptor;\n }\n\n function resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params = {},\n mode,\n projection,\n }: ResolveDecisionInput<\n Contract,\n Definitions,\n Views\n >): InteractionDecisionResult<Contract, Definitions, Views> {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) {\n return {\n found: false,\n validation: makeValidationError(\n \"unsupported-action\",\n `Interaction '${interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n ),\n };\n }\n const trustedInteractionId = interactionId as InteractionId;\n\n const parseForSubmit = mode === \"submit\";\n const parsed = parseForSubmit\n ? parseInteractionParams(interaction, params, {\n skipRng: true,\n playerId,\n })\n : ({\n ok: true,\n params: prepareInteractionProjectionParams(interaction, params),\n } as const);\n if (!parsed.ok) {\n return {\n found: true,\n interaction,\n parsedParams: {},\n visible: true,\n descriptor: buildBaseDescriptor(\n state,\n playerId,\n trustedInteractionId,\n interaction,\n {\n available: false,\n unavailableReason: parsed.message,\n },\n { projection, includeEligibleTargets: false },\n ),\n validation: makeValidationError(\n \"invalid-action-params\",\n parsed.message,\n ),\n };\n }\n\n const phase = scope.phaseByName(phaseName);\n const isSimultaneousSubmit =\n isSimultaneousPhase(phase) &&\n interactionId === SIMULTANEOUS_SUBMIT_INTERACTION_ID;\n const alreadySubmitted =\n isSimultaneousSubmit &&\n state.runtime.simultaneous?.current?.phaseName === phaseName &&\n Boolean(state.runtime.simultaneous.current.submissions[playerId]);\n const canResubmit =\n isSimultaneousSubmit &&\n (phase as { canResubmit?: boolean }).canResubmit === true;\n\n const actorAuthorization =\n authorization.resolveInteractionActorAuthorization(\n state,\n interaction,\n projection,\n );\n const authorized = authorization.isActorAuthorized(\n state,\n playerId,\n actorAuthorization,\n );\n let visible = authorization.isInteractionVisible(\n interaction,\n actorAuthorization,\n authorized,\n );\n if (alreadySubmitted && !canResubmit && mode !== \"submit\") {\n visible = false;\n }\n const stageAllow = stages.resolveActiveStageAllowlist(\n state,\n phaseName,\n projection,\n );\n const stageAllowed = !stageAllow || stageAllow.has(interactionId);\n const stepAllowed = stages.isInteractionAllowedInStep(\n state,\n interaction,\n projection,\n );\n\n let validation: ReducerValidationResult = { valid: true };\n if (!authorized) {\n validation =\n actorAuthorization.mode === \"addressees\"\n ? makeValidationError(\n \"prompt-not-owned\",\n `Interaction '${interactionId}' is not addressed to '${playerId}'.`,\n )\n : makeValidationError(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${interactionId}').`,\n );\n } else if (alreadySubmitted && !canResubmit) {\n validation = makeValidationError(\n \"ALREADY_SUBMITTED\",\n `Interaction '${interactionId}' has already been submitted by '${playerId}'.`,\n );\n } else if (!stageAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current stage.`,\n );\n } else if (!stepAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current step.`,\n );\n }\n\n const canEvaluateProjectionDetails =\n mode !== \"submit\" && visible && authorized && stageAllowed && stepAllowed;\n const canContinueSubmitValidation = mode === \"submit\" && validation.valid;\n let cost: Record<string, number> | undefined;\n let missingResources: Record<string, number> | undefined;\n let costAffordable = true;\n if (canContinueSubmitValidation || canEvaluateProjectionDetails) {\n const costDecision = evaluateInteractionCost(\n state,\n interaction,\n playerId,\n parsed.params,\n projection,\n );\n if (\"error\" in costDecision) {\n costAffordable = false;\n validation = makeValidationError(\n \"cost-unavailable\",\n `Interaction '${interactionId}' cost could not be evaluated.`,\n );\n } else {\n cost = costDecision.cost ?? undefined;\n missingResources = costDecision.missing ?? undefined;\n costAffordable =\n !missingResources ||\n Object.values(missingResources).every((amount) => amount <= 0);\n if (!costAffordable) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n \"INSUFFICIENT_RESOURCES\",\n `Interaction '${interactionId}' cannot be afforded.`,\n );\n }\n }\n }\n }\n\n let ruleAvailabilityIssue: InteractionRuleIssue | undefined;\n if (\n (canContinueSubmitValidation || canEvaluateProjectionDetails) &&\n interaction.rules\n ) {\n const availabilityArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId },\n },\n projection,\n );\n for (const rule of interaction.rules) {\n if (!rule.available) continue;\n if (!rule.available(availabilityArgs)) {\n ruleAvailabilityIssue = issueFromRule(rule);\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n ruleAvailabilityIssue.errorCode,\n ruleAvailabilityIssue.message,\n );\n }\n break;\n }\n }\n }\n\n let authoredValidation:\n | {\n errorCode: string;\n message?: string;\n }\n | undefined;\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n if (validation.valid && mode === \"submit\") {\n validation = validateCollectorTargets(\n interaction,\n projection?.domainState ?? scope.toDomainState(state),\n playerId,\n parsed.params,\n );\n }\n }\n\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n const validateArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: {\n playerId,\n params: parsed.params,\n },\n },\n projection,\n );\n for (const rule of interaction.rules ?? []) {\n if (!rule.validate) continue;\n authoredValidation = issueFromRuleValidationResult(\n rule,\n rule.validate(validateArgs),\n );\n if (authoredValidation) break;\n }\n if (authoredValidation) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n authoredValidation.errorCode,\n authoredValidation.message,\n );\n }\n }\n }\n\n const available =\n stageAllowed &&\n stepAllowed &&\n authorized &&\n !ruleAvailabilityIssue &&\n costAffordable &&\n !authoredValidation;\n const unavailableReason = available\n ? undefined\n : !authorized\n ? \"Not your turn\"\n : !stageAllowed\n ? \"Interaction not allowed in current stage\"\n : !stepAllowed\n ? \"Interaction not allowed in current step\"\n : ruleAvailabilityIssue\n ? (ruleAvailabilityIssue.message ??\n ruleAvailabilityIssue.errorCode)\n : !costAffordable\n ? \"INSUFFICIENT_RESOURCES\"\n : mode === \"card\"\n ? (authoredValidation?.message ?? \"Interaction unavailable\")\n : \"Interaction unavailable\";\n const descriptor = buildBaseDescriptor(\n state,\n playerId,\n trustedInteractionId,\n interaction,\n {\n available,\n unavailableReason,\n cost,\n missingResources,\n },\n {\n projection,\n includeEligibleTargets: available || mode === \"card\",\n },\n );\n return {\n found: true,\n interaction,\n parsedParams: parsed.params,\n visible,\n descriptor,\n validation,\n };\n }\n\n function resolveAvailableInteractionsFor(\n state: State,\n playerId: PlayerId,\n options: { projection?: ProjectionContext<DomainState, State> } = {},\n ) {\n const phaseName = state.flow.currentPhase as PhaseName;\n const descriptors: Descriptor[] = [];\n for (const [interactionId] of scope.interactionEntriesForPhase(phaseName)) {\n const decision = resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params: {},\n mode: \"descriptor\",\n projection: options.projection,\n });\n if (!decision.found || !decision.visible) continue;\n descriptors.push(decision.descriptor);\n }\n return descriptors;\n }\n\n return {\n evaluateInteractionCost,\n resolveAvailableInteractionsFor,\n resolveInteractionDecision,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n StageSpec,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport function createStageResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n\n function resolveActiveStage(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): { id: string; stage: StageSpec<DomainState, Manifest> } | null {\n const stages = scope.stagesForPhase(phaseName);\n if (stages.length === 0) return null;\n const domainState = projection?.domainState ?? scope.toDomainState(state);\n const context = scope.buildContext(state);\n for (const [stageId, stage] of stages) {\n const matches = stage.when\n ? stage.when({\n ...context,\n state: domainState,\n })\n : true;\n if (matches) return { id: stageId, stage };\n }\n return null;\n }\n\n function resolveActiveStageAllowlist(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): Set<string> | null {\n const cacheKey = String(phaseName);\n if (projection?.stageAllowlists.has(cacheKey)) {\n return projection.stageAllowlists.get(cacheKey) ?? null;\n }\n const activeStage = resolveActiveStage(state, phaseName, projection);\n const allowlist = activeStage ? new Set(activeStage.stage.allow) : null;\n projection?.stageAllowlists.set(cacheKey, allowlist);\n return allowlist;\n }\n\n function isInteractionAllowedInStep(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): boolean {\n const allowedSteps = interaction.__steps ?? [];\n if (allowedSteps.length === 0) {\n return true;\n }\n const currentStep = (\n (projection?.domainState ?? scope.toDomainState(state)).phase as {\n step?: unknown;\n }\n ).step;\n return (\n typeof currentStep === \"string\" && allowedSteps.includes(currentStep)\n );\n }\n\n return {\n isInteractionAllowedInStep,\n resolveActiveStage,\n resolveActiveStageAllowlist,\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerReject,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectEligibleTargets,\n collectFirstCardZoneId,\n findCardInputKey,\n findCardInputKeyForZone,\n parseInteractionParams,\n} from \"./interaction-collectors\";\nimport { createInteractionAuthorization } from \"./interaction-authorization\";\nimport { createInteractionDecisionResolver } from \"./interaction-decision\";\nimport { createStageResolver } from \"./stage-resolver\";\nimport {\n rejectResult,\n type TrustedInput,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\nexport type { InteractionDescriptorShape } from \"./interaction-types\";\n\nexport function createInteractionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const stages = createStageResolver(scope);\n const authorization = createInteractionAuthorization(scope);\n const decisions = createInteractionDecisionResolver(\n scope,\n stages,\n authorization,\n );\n\n function validateClientInput(\n state: State,\n input: ReducerInput,\n ): ReducerValidationResult {\n if (input.kind === \"interaction\") {\n const decision = decisions.resolveInteractionDecision({\n state,\n playerId: input.playerId as PlayerId,\n interactionId: input.interactionId,\n params: (input.params ?? {}) as Record<string, unknown>,\n mode: \"submit\",\n });\n return decision.validation;\n }\n return { valid: true };\n }\n\n function validateOrReject(\n state: State,\n input: ReducerInput,\n ): ReducerReject | null {\n const validation = validateClientInput(state, input);\n if (validation.valid) {\n return null;\n }\n const invalidValidation = validation as Exclude<\n ReducerValidationResult,\n { valid: true }\n >;\n return rejectResult(invalidValidation.errorCode, invalidValidation.message);\n }\n\n return {\n collectEligibleTargets,\n collectFirstCardZoneId,\n evaluateInteractionCost: decisions.evaluateInteractionCost,\n findCardInputKey,\n findCardInputKeyForZone,\n isActorAuthorized: authorization.isActorAuthorized,\n isInteractionAllowedInStep: stages.isInteractionAllowedInStep,\n parseInteractionParams,\n resolveActiveStage: stages.resolveActiveStage,\n resolveActiveStageAllowlist: stages.resolveActiveStageAllowlist,\n resolveAvailableInteractionsFor: decisions.resolveAvailableInteractionsFor,\n resolveInteractionActorAuthorization:\n authorization.resolveInteractionActorAuthorization,\n resolveInteractionDecision: decisions.resolveInteractionDecision,\n validateClientInput,\n validateOrReject,\n };\n}\n","import {\n assertCardAllowedInContainer,\n assertCardAllowedInZone,\n cloneRuntimeTable,\n ensureArray,\n getComponentsInContainer,\n getComponentsOnSpace,\n} from \"./table-ops\";\nimport { nextRandomInt } from \"./rng\";\nimport type {\n RuntimeComponentLocation,\n RuntimeRngState,\n RuntimeTableRecord,\n SetupBootstrapContainerRef,\n SetupBootstrapDestinationRef,\n SetupBootstrapPerPlayerContainerTemplateRef,\n SetupBootstrapStep,\n} from \"./model\";\nimport type { PlayerId } from \"./per-player\";\nimport { perPlayerGet, perPlayerSet } from \"./per-player\";\n\ntype StatefulBootstrapContext = {\n table: RuntimeTableRecord;\n runtime: {\n rng: RuntimeRngState;\n };\n};\n\ntype ResolvedSharedZoneRef = {\n kind: \"sharedZone\";\n zoneId: string;\n};\n\ntype ResolvedPlayerZoneRef = {\n kind: \"playerZone\";\n zoneId: string;\n playerId: string;\n};\n\ntype ResolvedBoardZoneRef = {\n kind: \"container\";\n boardId: string;\n containerId: string;\n zoneId: string;\n};\n\ntype ResolvedBoardSpaceRef = {\n kind: \"space\";\n boardId: string;\n spaceId: string;\n};\n\ntype ResolvedContainerRef =\n | ResolvedSharedZoneRef\n | ResolvedPlayerZoneRef\n | ResolvedBoardZoneRef\n | ResolvedBoardSpaceRef;\n\nfunction isCardComponent(\n table: RuntimeTableRecord,\n componentId: string,\n): boolean {\n return componentId in table.cards;\n}\n\nfunction resolveRuntimeBoardId(\n table: RuntimeTableRecord,\n boardId: string,\n playerId?: string,\n): string {\n if (playerId) {\n const perPlayerBoardId = `${boardId}:${playerId}`;\n if (table.boards.byId[perPlayerBoardId]) {\n return perPlayerBoardId;\n }\n }\n if (table.boards.byId[boardId]) {\n return boardId;\n }\n throw new Error(`Unknown board '${boardId}'.`);\n}\n\nfunction resolveContainerRef(\n table: RuntimeTableRecord,\n ref: SetupBootstrapContainerRef | SetupBootstrapDestinationRef,\n): ResolvedContainerRef {\n if (ref.type === \"sharedZone\") {\n return {\n kind: \"sharedZone\",\n zoneId: ref.zoneId,\n };\n }\n\n if (ref.type === \"playerZone\") {\n return {\n kind: \"playerZone\",\n zoneId: ref.zoneId,\n playerId: ref.playerId,\n };\n }\n\n if (ref.type === \"sharedBoardContainer\") {\n const board = table.boards.byId[resolveRuntimeBoardId(table, ref.boardId)];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n }\n\n if (ref.type === \"playerBoardContainer\") {\n const board =\n table.boards.byId[\n resolveRuntimeBoardId(table, ref.boardId, ref.playerId)\n ];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}' for '${ref.playerId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n }\n\n if (ref.type === \"sharedBoardSpace\") {\n const board = table.boards.byId[resolveRuntimeBoardId(table, ref.boardId)];\n if (!board) {\n throw new Error(`Unknown board '${ref.boardId}'.`);\n }\n const space = board?.spaces[ref.spaceId];\n if (!space) {\n throw new Error(\n `Unknown board space '${ref.spaceId}' on board '${ref.boardId}'.`,\n );\n }\n return {\n kind: \"space\",\n boardId: board.id,\n spaceId: ref.spaceId,\n };\n }\n\n const board =\n table.boards.byId[resolveRuntimeBoardId(table, ref.boardId, ref.playerId)];\n if (!board) {\n throw new Error(\n `Unknown board '${ref.boardId}' for player '${ref.playerId}'.`,\n );\n }\n const space = board?.spaces[ref.spaceId];\n if (!space) {\n throw new Error(\n `Unknown board space '${ref.spaceId}' on board '${ref.boardId}' for '${ref.playerId}'.`,\n );\n }\n return {\n kind: \"space\",\n boardId: board.id,\n spaceId: ref.spaceId,\n };\n}\n\nfunction readContainerComponents(\n table: RuntimeTableRecord,\n ref: ResolvedContainerRef,\n): string[] {\n if (ref.kind === \"sharedZone\") {\n return [\n ...ensureArray(table.zones.shared[ref.zoneId] ?? table.decks[ref.zoneId]),\n ];\n }\n\n if (ref.kind === \"playerZone\") {\n const zoneValue = table.zones.perPlayer[ref.zoneId];\n const handValue = table.hands[ref.zoneId];\n const seat = ref.playerId as PlayerId;\n return [\n ...ensureArray(\n (zoneValue !== undefined ? perPlayerGet(zoneValue, seat) : undefined) ??\n (handValue !== undefined ? perPlayerGet(handValue, seat) : undefined),\n ),\n ];\n }\n\n if (ref.kind === \"space\") {\n return getComponentsOnSpace(table, ref.boardId, ref.spaceId);\n }\n\n return getComponentsInContainer(table, ref.boardId, ref.containerId);\n}\n\nfunction sharedZoneLocationFor(\n table: RuntimeTableRecord,\n componentId: string,\n zoneId: string,\n position: number,\n): RuntimeComponentLocation {\n if (isCardComponent(table, componentId)) {\n return {\n type: \"InDeck\",\n deckId: zoneId,\n playedBy: null,\n position,\n };\n }\n\n return {\n type: \"InZone\",\n zoneId,\n playedBy: null,\n position,\n };\n}\n\nfunction updateCardVisibilityForZone(\n table: RuntimeTableRecord,\n componentId: string,\n ref: ResolvedContainerRef,\n): void {\n if (!isCardComponent(table, componentId)) {\n return;\n }\n\n if (ref.kind === \"playerZone\") {\n const visibility = table.zones.visibility[ref.zoneId];\n table.ownerOfCard[componentId] = ref.playerId;\n table.visibility[componentId] =\n visibility === \"all\" || visibility === \"public\"\n ? { faceUp: true }\n : { faceUp: false, visibleTo: [ref.playerId] };\n return;\n }\n\n if (ref.kind === \"sharedZone\") {\n const visibility = table.zones.visibility[ref.zoneId];\n if (visibility === \"hidden\" || visibility === \"ownerOnly\") {\n table.visibility[componentId] = { faceUp: false };\n return;\n }\n table.visibility[componentId] = { faceUp: true };\n }\n}\n\nfunction writeContainerComponents(\n table: RuntimeTableRecord,\n ref: ResolvedContainerRef,\n componentIds: readonly string[],\n): void {\n if (ref.kind === \"sharedZone\") {\n componentIds.forEach((componentId) => {\n assertCardAllowedInZone(table, ref.zoneId, componentId);\n });\n table.decks[ref.zoneId] = [...componentIds];\n table.zones.shared[ref.zoneId] = [...componentIds];\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = sharedZoneLocationFor(\n table,\n componentId,\n ref.zoneId,\n index,\n );\n updateCardVisibilityForZone(table, componentId, ref);\n });\n return;\n }\n\n if (ref.kind === \"playerZone\") {\n componentIds.forEach((componentId) => {\n assertCardAllowedInZone(table, ref.zoneId, componentId);\n });\n const seat = ref.playerId as PlayerId;\n const prevHand = table.hands[ref.zoneId] ?? {\n __perPlayer: true as const,\n entries: [],\n };\n table.hands[ref.zoneId] = perPlayerSet(prevHand, seat, [...componentIds]);\n\n const prevZone = table.zones.perPlayer[ref.zoneId] ?? {\n __perPlayer: true as const,\n entries: [],\n };\n table.zones.perPlayer[ref.zoneId] = perPlayerSet(prevZone, seat, [\n ...componentIds,\n ]);\n\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"InHand\",\n handId: ref.zoneId,\n playerId: ref.playerId,\n position: index,\n };\n updateCardVisibilityForZone(table, componentId, ref);\n });\n return;\n }\n\n if (ref.kind === \"space\") {\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId: ref.boardId,\n spaceId: ref.spaceId,\n position: index,\n };\n });\n return;\n }\n\n componentIds.forEach((componentId) => {\n assertCardAllowedInContainer(\n table,\n ref.boardId,\n ref.containerId,\n componentId,\n );\n });\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId: ref.boardId,\n containerId: ref.containerId,\n position: index,\n };\n });\n}\n\nfunction selectMovedComponents(\n current: readonly string[],\n step: Extract<SetupBootstrapStep, { type: \"move\" }>,\n): string[] {\n if (step.componentIds && typeof step.count === \"number\") {\n throw new Error(\n \"Setup bootstrap move step cannot specify both count and componentIds.\",\n );\n }\n\n if (step.componentIds) {\n const missing = step.componentIds.filter(\n (componentId) => !current.includes(componentId),\n );\n if (missing.length > 0) {\n throw new Error(\n `Setup bootstrap move step references missing components: ${missing.join(\", \")}`,\n );\n }\n return [...step.componentIds];\n }\n\n if (typeof step.count === \"number\") {\n return current.slice(0, step.count);\n }\n\n return [...current];\n}\n\nfunction resolveDealTargetRef(\n table: RuntimeTableRecord,\n ref: SetupBootstrapPerPlayerContainerTemplateRef,\n playerId: string,\n): ResolvedContainerRef {\n if (ref.type === \"playerZone\") {\n return {\n kind: \"playerZone\",\n zoneId: ref.zoneId,\n playerId,\n };\n }\n\n const board =\n table.boards.byId[resolveRuntimeBoardId(table, ref.boardId, playerId)];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}' for '${playerId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n}\n\nexport function applySetupBootstrap<State extends StatefulBootstrapContext>(\n state: State,\n steps: readonly SetupBootstrapStep[],\n): State {\n if (steps.length === 0) {\n return state;\n }\n\n const nextTable = cloneRuntimeTable(state.table);\n let nextRng = state.runtime.rng;\n\n for (const step of steps) {\n if (step.type === \"shuffle\") {\n const container = resolveContainerRef(nextTable, step.container);\n const shuffled = readContainerComponents(nextTable, container);\n for (let lastIndex = shuffled.length - 1; lastIndex > 0; lastIndex -= 1) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n nextRng = updatedRng;\n const current = shuffled[lastIndex];\n const swap = shuffled[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `setup shuffle: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${shuffled.length})`,\n );\n }\n shuffled[lastIndex] = swap;\n shuffled[swapIndex] = current;\n }\n writeContainerComponents(nextTable, container, shuffled);\n continue;\n }\n\n if (step.type === \"move\") {\n const from = resolveContainerRef(nextTable, step.from);\n const to = resolveContainerRef(nextTable, step.to);\n const currentFrom = readContainerComponents(nextTable, from);\n const moved = selectMovedComponents(currentFrom, step);\n const remaining = currentFrom.filter(\n (componentId) => !moved.includes(componentId),\n );\n const currentTo = readContainerComponents(nextTable, to);\n\n writeContainerComponents(nextTable, from, remaining);\n writeContainerComponents(nextTable, to, [...currentTo, ...moved]);\n continue;\n }\n\n const from = resolveContainerRef(nextTable, step.from);\n if (from.kind === \"playerZone\") {\n throw new Error(\n \"Setup bootstrap deal steps require a shared source container.\",\n );\n }\n const playerIds = step.playerIds\n ? [...step.playerIds]\n : [...nextTable.playerOrder];\n let sourceComponents = readContainerComponents(nextTable, from);\n\n for (const playerId of playerIds) {\n if (sourceComponents.length === 0) {\n break;\n }\n const dealt = sourceComponents.slice(0, step.count);\n if (dealt.length === 0) {\n break;\n }\n sourceComponents = sourceComponents.slice(dealt.length);\n const target = resolveDealTargetRef(nextTable, step.to, playerId);\n const currentTo = readContainerComponents(nextTable, target);\n writeContainerComponents(nextTable, target, [...currentTo, ...dealt]);\n }\n\n writeContainerComponents(nextTable, from, sourceComponents);\n }\n\n return {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: nextRng,\n },\n };\n}\n","import { safeParseOrThrow } from \"../../parse-utils\";\nimport { applySetupBootstrap } from \"../../setup-bootstrap\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n ExactManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeSetupSelection,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../../model\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport { isPerPlayer } from \"../../per-player\";\nimport { normalizeResult } from \"./runtime-scope\";\nimport { createMutableRandomHelpers } from \"./rng-sampler\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createLifecycleRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type ExactManifest = ExactManifestContractOf<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveSelectedSetup(\n setup: RuntimeSetupSelectionInput<Manifest> | null | undefined,\n ): State[\"runtime\"][\"setup\"] {\n if (!setup) {\n return null;\n }\n const manifestProfile = scope.manifestSetupProfilesById[setup.profileId];\n if (!manifestProfile) {\n throw new Error(`Unknown setup profile '${setup.profileId}'.`);\n }\n const resolvedOptionValues: Record<string, string | null> =\n Object.fromEntries(\n scope.definition.contract.manifest.literals.setupOptionIds.map(\n (optionId: string) => [optionId, null] as const,\n ),\n );\n\n for (const [optionId, choiceId] of Object.entries(\n manifestProfile.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId;\n }\n for (const [optionId, choiceId] of Object.entries(\n setup.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId ?? null;\n }\n\n return {\n profileId: setup.profileId,\n optionValues:\n resolvedOptionValues as RuntimeSetupSelection<Manifest>[\"optionValues\"],\n };\n }\n\n function resolveInitialPhase(setup: State[\"runtime\"][\"setup\"]): PhaseName {\n const setupProfile = setup\n ? scope.reducerSetupProfiles[setup.profileId]\n : null;\n const resolvedPhase = (setupProfile?.initialPhase ??\n scope.defaultInitialPhase ??\n scope.phaseEntries[0]?.[0]) as PhaseName | undefined;\n if (!resolvedPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n if (!scope.definition.phases[resolvedPhase]) {\n throw new Error(`Unknown initial phase '${resolvedPhase}'.`);\n }\n return resolvedPhase;\n }\n\n function applySelectedSetupBootstrap(state: State): State {\n const setup = state.runtime.setup;\n if (!setup) {\n return state;\n }\n\n const bootstrap = scope.reducerSetupProfiles[setup.profileId]?.bootstrap;\n if (!bootstrap || bootstrap.length === 0) {\n return state;\n }\n\n return applySetupBootstrap(state, bootstrap) as State;\n }\n\n function initPhaseState(\n state: State,\n phaseName: PhaseName,\n playerIds: PlayerId[],\n ): State {\n const phase = scope.phaseByName(phaseName);\n const phaseState = phase.initialState\n ? phase.initialState({\n manifest: scope.definition.contract.manifest,\n state,\n playerIds,\n setup: state.runtime.setup,\n })\n : safeParseOrThrow(phase.state, {}, `phase:${phaseName}:initialState`);\n return {\n ...state,\n phase: safeParseOrThrow(\n phase.state,\n phaseState,\n `phase:${phaseName}`,\n ) as State[\"phase\"],\n flow: {\n ...state.flow,\n currentPhase: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n };\n }\n\n function enterPhase({\n state,\n phaseName,\n playerIds,\n event,\n }: {\n state: State;\n phaseName: PhaseName;\n playerIds: PlayerId[];\n event: \"initialize\" | \"transition\";\n }): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n const workingState = initPhaseState(state, phaseName, playerIds);\n const phase = scope.phaseByName(phaseName);\n let nextState: State = workingState;\n const instructions: RuntimeInstructionForState<State>[] = [];\n if (phase.enter) {\n const random = createMutableRandomHelpers(workingState.runtime.rng);\n const entered = normalizeResult(\n phase.enter(\n scope.buildRuntimeArgs(\n workingState,\n {\n event,\n state: scope.toDomainState(workingState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(workingState),\n );\n if (entered.type === \"reject\") {\n throw new Error(\n entered.message ??\n (event === \"initialize\"\n ? `Reducer phase '${phaseName}' rejected during initialization.`\n : `Reducer phase '${phaseName}' rejected during phase initialization.`),\n );\n }\n nextState = {\n ...entered.state,\n runtime: { ...workingState.runtime, rng: random.currentRng() },\n } as State;\n if (entered.instructions) instructions.push(...entered.instructions);\n }\n\n const activeStage = interactions.resolveActiveStage(nextState, phaseName);\n if (activeStage?.stage.onEnter) {\n const random = createMutableRandomHelpers(nextState.runtime.rng);\n const stageEntered = normalizeResult(\n activeStage.stage.onEnter(\n scope.buildRuntimeArgs(\n nextState,\n {\n event,\n state: scope.toDomainState(nextState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(nextState),\n );\n if (stageEntered.type === \"reject\") {\n throw new Error(\n stageEntered.message ??\n (event === \"initialize\"\n ? `Reducer stage '${phaseName}.${activeStage.id}' rejected during initialization.`\n : `Reducer stage '${phaseName}.${activeStage.id}' rejected during stage initialization.`),\n );\n }\n nextState = {\n ...stageEntered.state,\n runtime: { ...nextState.runtime, rng: random.currentRng() },\n } as State;\n if (stageEntered.instructions) {\n instructions.push(...stageEntered.instructions);\n }\n }\n return { state: nextState, instructions };\n }\n\n function initializePhaseResult(\n state: State,\n phaseName: PhaseName,\n ): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n return enterPhase({\n state,\n phaseName,\n playerIds: scope.buildContext(state).playerOrder as PlayerId[],\n event: \"transition\",\n });\n }\n\n function createInitialState({\n table,\n playerIds,\n rngSeed,\n setup,\n }: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n }): { state: State; initialPhase: PhaseName } {\n const tableWithManifestDefaults = applyManifestTableDefaults(\n table,\n playerIds,\n );\n const parsedTable = safeParseOrThrow(\n scope.definition.contract.manifest.tableSchema,\n tableWithManifestDefaults,\n \"table\",\n ) as State[\"table\"];\n const selectedSetup = resolveSelectedSetup(setup);\n const initialSetup =\n selectedSetup as RuntimeSetupSelection<ExactManifest> | null;\n const initialPhase = resolveInitialPhase(selectedSetup);\n const initialQueries = createStateQueries({ table: parsedTable });\n return {\n initialPhase,\n state: {\n table: parsedTable,\n publicState: safeParseOrThrow(\n scope.definition.contract.state.public,\n scope.definition.initial?.public?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"publicState\",\n ) as State[\"publicState\"],\n privateState: Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n scope.definition.contract.state.private,\n scope.definition.initial?.private?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n playerId,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"privateState\"],\n hiddenState: safeParseOrThrow(\n scope.definition.contract.state.hidden,\n scope.definition.initial?.hidden?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"hiddenState\",\n ) as State[\"hiddenState\"],\n flow: {\n currentPhase: initialPhase as State[\"flow\"][\"currentPhase\"],\n turn: 0,\n round: 0,\n activePlayers: [],\n },\n phase: {} as State[\"phase\"],\n runtime: {\n rng: {\n seed: rngSeed ?? null,\n cursor: 0,\n trace: [],\n },\n setup: selectedSetup,\n simultaneous: { current: null },\n lastTransition: null,\n } as State[\"runtime\"],\n },\n };\n }\n\n function applyManifestTableDefaults(\n table: State[\"table\"],\n playerIds: PlayerId[],\n ): State[\"table\"] {\n const manifest = scope.definition.contract.manifest;\n const defaultZones = manifest.defaults.zones(playerIds);\n const tableZones = table.zones ?? {};\n const tableResources = table.resources;\n return {\n ...table,\n playerOrder:\n table.playerOrder && table.playerOrder.length > 0\n ? table.playerOrder\n : playerIds,\n zones: {\n ...defaultZones,\n ...tableZones,\n shared: {\n ...(defaultZones.shared ?? {}),\n ...(tableZones.shared ?? {}),\n },\n perPlayer: {\n ...(defaultZones.perPlayer ?? {}),\n ...(tableZones.perPlayer ?? {}),\n },\n visibility: {\n ...(defaultZones.visibility ?? {}),\n ...(tableZones.visibility ?? {}),\n },\n cardSetIdsByZoneId: {\n ...(defaultZones.cardSetIdsByZoneId ?? {}),\n ...(tableZones.cardSetIdsByZoneId ?? {}),\n },\n },\n decks: {\n ...manifest.defaults.decks(playerIds),\n ...table.decks,\n },\n hands: {\n ...manifest.defaults.hands(playerIds),\n ...table.hands,\n },\n handVisibility: {\n ...manifest.defaults.handVisibility(playerIds),\n ...table.handVisibility,\n },\n ownerOfCard: {\n ...manifest.defaults.ownerOfCard(playerIds),\n ...table.ownerOfCard,\n },\n visibility: {\n ...manifest.defaults.visibility(playerIds),\n ...table.visibility,\n },\n resources:\n isPerPlayer(tableResources) && tableResources.entries.length > 0\n ? tableResources\n : manifest.defaults.resources(playerIds),\n } as State[\"table\"];\n }\n\n function initializeSession(\n input: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n },\n drainInstructions: (\n state: State,\n instructions: RuntimeInstructionForState<State>[],\n ) => State,\n ): SessionState {\n const initial = createInitialState(input);\n const bootstrappedState = applySelectedSetupBootstrap(initial.state);\n const entered = enterPhase({\n state: bootstrappedState,\n phaseName: initial.initialPhase,\n playerIds: input.playerIds,\n event: \"initialize\",\n });\n return scope.toSessionState(\n drainInstructions(entered.state, entered.instructions),\n );\n }\n\n return {\n createInitialState,\n enterPhase,\n initializePhaseResult,\n initializeSession,\n initPhaseState,\n resolveInitialPhase,\n resolveSelectedSetup,\n };\n}\n","import { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { RuntimeTableRecord, TableQueriesOfState } from \"../../model\";\n\ntype ProjectionFxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\nexport type ProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState = ProjectionFxState,\n> = {\n readonly domainState: State;\n readonly q: TableQueriesOfState<State>;\n readonly derived: DerivedResolver;\n readonly fx: ReturnType<typeof createReducerFx<FxState>>;\n readonly eligibleTargets: Map<string, string[]>;\n readonly stageAllowlists: Map<string, Set<string> | null>;\n};\n\nexport function createProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState,\n>(options: {\n domainState: State;\n combinedState: FxState;\n}): ProjectionContext<State, FxState> {\n const q = createStateQueries(options.domainState);\n return {\n domainState: options.domainState,\n q,\n derived: createDerivedResolver(options.domainState, { q }),\n fx: createReducerFx(options.combinedState),\n eligibleTargets: new Map(),\n stageAllowlists: new Map(),\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n InteractionDescriptorShape,\n createInteractionResolver,\n} from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\nimport {\n createProjectionContext,\n type ProjectionContext,\n} from \"./projection-context\";\nimport { collectCardZoneIds } from \"./interaction-collectors\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n simultaneousSubmitInteraction,\n} from \"./simultaneous-player\";\n\ntype ProjectionMode = \"full\" | \"actionsOnly\";\ntype DescriptorRegistry = {\n add(descriptor: InteractionDescriptorShape): string;\n entries(): Record<string, InteractionDescriptorShape>;\n};\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function createDescriptorRegistry(): DescriptorRegistry {\n const byRef: Record<string, InteractionDescriptorShape> = {};\n const byHash = new Map<string, string>();\n return {\n add(descriptor) {\n const fingerprint = stableStringify(descriptor);\n const existing = byHash.get(fingerprint);\n if (existing) return existing;\n const base =\n typeof descriptor.interactionId === \"string\" &&\n descriptor.interactionId.length > 0\n ? descriptor.interactionId\n : \"interaction\";\n const ref = `${base}:${fnv1a64(fingerprint)}`;\n byHash.set(fingerprint, ref);\n byRef[ref] = descriptor;\n return ref;\n },\n entries() {\n return byRef;\n },\n };\n }\n\n function resolveZoneHandlesFor(\n combinedState: State,\n playerId: PlayerId,\n projection: ProjectionContext<DomainState, State>,\n registry: DescriptorRegistry,\n ) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const zoneIds = new Set<string>(scope.zonesForPhase(phaseName).map(String));\n for (const [, interaction] of scope.interactionEntriesForPhase(phaseName)) {\n for (const zoneId of collectCardZoneIds(interaction)) {\n zoneIds.add(String(zoneId));\n }\n }\n const zones = [...zoneIds];\n if (zones.length === 0) return {};\n const q = projection.q;\n const result: Record<\n string,\n {\n cardIds: string[];\n cardViewsById: Record<string, string>;\n playableByCardId: Record<string, string[]>;\n }\n > = {};\n for (const zoneId of zones) {\n const table = combinedState.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n const isPlayerZone =\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {});\n const cardIds = Array.from(\n isPlayerZone\n ? (q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly string[])\n : (q.zone.sharedCards(zoneId as never) as readonly string[]),\n );\n const cardInteractionIds = scope\n .interactionEntriesForPhase(phaseName)\n .filter(([, interaction]) =>\n collectCardZoneIds(interaction).map(String).includes(zoneId),\n )\n .map(([interactionId]) => interactionId);\n const cardViewsById: Record<string, string> = {};\n const playableByCardId: Record<string, string[]> = {};\n for (const cardId of cardIds) {\n cardViewsById[cardId] = JSON.stringify(q.card.get(cardId as never));\n const perCard: string[] = [];\n for (const interactionId of cardInteractionIds) {\n const interaction = scope.findInteractionInPhase(\n phaseName,\n interactionId,\n );\n if (!interaction) continue;\n const cardKey = interactions.findCardInputKeyForZone(\n interaction,\n zoneId,\n );\n const params = cardKey ? { [cardKey]: cardId } : {};\n const decision = interactions.resolveInteractionDecision({\n state: combinedState,\n playerId,\n interactionId,\n params,\n mode: \"card\",\n projection,\n });\n if (!decision.found || !decision.visible) continue;\n const cardDomain = cardKey\n ? decision.descriptor.inputs.find((input) => input.key === cardKey)\n ?.domain\n : undefined;\n const cardTargets =\n cardDomain?.type === \"cardTarget\" &&\n cardDomain.projection === \"resolved\"\n ? cardDomain.eligibleTargets\n : undefined;\n if (cardKey && !cardTargets?.includes(cardId)) {\n continue;\n }\n perCard.push(\n registry.add({\n ...decision.descriptor,\n zoneId,\n }),\n );\n }\n playableByCardId[cardId] = perCard;\n }\n result[zoneId] = {\n cardIds,\n cardViewsById,\n playableByCardId,\n };\n }\n return result;\n }\n\n function resolveCurrentStageFor(\n combinedState: State,\n projection?: ProjectionContext<DomainState, State>,\n ): string {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n return (\n interactions.resolveActiveStage(combinedState, phaseName, projection)\n ?.id ?? phaseName\n );\n }\n\n function resolveStageSeatsFor(state: SessionState): string[] {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (isSimultaneousPhase(phase)) {\n return resolveSimultaneousActors(scope, combinedState, phase).map(String);\n }\n return [...state.domain.flow.activePlayers];\n }\n\n function resolveSimultaneousPhaseFor(state: SessionState) {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) return null;\n const current = state.runtime.simultaneous?.current;\n if (!current || current.phaseName !== phaseName) return null;\n const submit = simultaneousSubmitInteraction(phase);\n if (!submit) return null;\n const actorIds = current.actors.map(String);\n const sealedPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] !== undefined,\n );\n const pendingPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] === undefined,\n );\n return {\n phaseName: String(current.phaseName),\n interactionId: SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n actorIds,\n sealedPlayerIds,\n pendingPlayerIds,\n };\n }\n\n function resolveViewFor(\n combinedState: State,\n playerId: PlayerId,\n viewId: string,\n projection: ProjectionContext<DomainState, State>,\n ): unknown {\n const views = scope.definition.views;\n const view = views?.[viewId as keyof typeof views];\n if (!view) {\n return null;\n }\n const viewArgs = {\n ...scope.buildContext(combinedState),\n ...scope.runtimeHelpers,\n fx: projection.fx,\n q: projection.q,\n derived: projection.derived,\n state: projection.domainState,\n playerId,\n } as Parameters<typeof view.project>[0];\n return view.project(viewArgs);\n }\n\n function projectSeatsDynamic({\n state,\n playerIds,\n viewId = \"player\",\n projectionMode = \"full\",\n }: {\n state: SessionState;\n playerIds: PlayerId[];\n viewId?: string;\n projectionMode?: ProjectionMode;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n const registry = createDescriptorRegistry();\n type SeatProjection = {\n view?: ReturnType<typeof resolveViewFor>;\n availableInteractionRefs: string[];\n zones?: ReturnType<typeof resolveZoneHandlesFor>;\n };\n const seats: Record<string, SeatProjection> = {};\n for (const playerId of playerIds) {\n const availableInteractionRefs = interactions\n .resolveAvailableInteractionsFor(combinedState, playerId, {\n projection,\n })\n .map((descriptor) => registry.add(descriptor));\n seats[playerId as unknown as string] = {\n ...(projectionMode === \"full\"\n ? {\n view: resolveViewFor(combinedState, playerId, viewId, projection),\n zones: resolveZoneHandlesFor(\n combinedState,\n playerId,\n projection,\n registry,\n ),\n }\n : {}),\n availableInteractionRefs,\n };\n }\n return {\n currentStage: resolveCurrentStageFor(combinedState, projection),\n stageSeats: resolveStageSeatsFor(state),\n simultaneousPhase: resolveSimultaneousPhaseFor(state),\n interactionsByRef: registry.entries(),\n seats,\n };\n }\n\n function projectSeatViewDynamic({\n state,\n playerId,\n viewId = \"player\",\n }: {\n state: SessionState;\n playerId: PlayerId;\n viewId?: string;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n return resolveViewFor(combinedState, playerId, viewId, projection);\n }\n\n return {\n projectSeatsDynamic,\n projectSeatViewDynamic,\n resolveCurrentStageFor,\n resolveStageSeatsFor,\n resolveViewFor,\n resolveZoneHandlesFor,\n };\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableStringify(entry)).join(\",\")}]`;\n }\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n .join(\",\")}}`;\n}\n\nfunction fnv1a64(value: string): string {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= BigInt(value.charCodeAt(index));\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash.toString(16).padStart(16, \"0\");\n}\n","import type {\n ManifestContract,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeTableRecord,\n StaticViewQueries,\n ViewMapOf,\n} from \"../../model\";\nimport type { TrustedRuntimeScope } from \"./runtime-scope\";\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return `{${entries\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`)\n .join(\",\")}}`;\n}\n\nfunction hashProjection(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\");\n}\n\nfunction readManifestVersion(manifest: unknown): string {\n const m = manifest as { version?: unknown; literals?: unknown };\n if (typeof m.version === \"string\" && m.version.length > 0) {\n return m.version;\n }\n if (m.literals && typeof m.literals === \"object\") {\n return hashProjection(stableStringify(m.literals));\n }\n return \"0\";\n}\n\nfunction createStaticViewQueries<\n Manifest extends ManifestContract<RuntimeTableRecord>,\n>(manifest: Manifest): StaticViewQueries<Manifest> {\n const staticBoards = manifest.staticBoards ?? {\n byId: {},\n hex: {},\n square: {},\n };\n const requireBoard = (\n boards: Record<string, unknown>,\n boardId: string,\n layout: \"board\" | \"hex\" | \"square\",\n ) => {\n const board = boards[boardId];\n if (!board) {\n throw new Error(`Unknown static ${layout} board '${boardId}'.`);\n }\n return board;\n };\n\n return {\n board: {\n get: (boardId) =>\n requireBoard(\n staticBoards.byId as Record<string, unknown>,\n boardId,\n \"board\",\n ) as never,\n hex: (boardId) =>\n requireBoard(\n staticBoards.hex as Record<string, unknown>,\n boardId,\n \"hex\",\n ) as never,\n square: (boardId) =>\n requireBoard(\n staticBoards.square as Record<string, unknown>,\n boardId,\n \"square\",\n ) as never,\n },\n };\n}\n\nexport function createStaticProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n return {\n projectStatic(): {\n view: unknown;\n hash: string;\n manifestVersion: string;\n } | null {\n const staticView = scope.definition.staticView;\n if (!staticView) return null;\n const manifest = scope.definition.contract.manifest;\n const view = staticView.project({\n manifest,\n q: createStaticViewQueries(manifest),\n });\n const serialized = stableStringify(view);\n return {\n view: JSON.parse(serialized) as unknown,\n hash: hashProjection(serialized),\n manifestVersion: readManifestVersion(manifest),\n };\n },\n };\n}\n","import type { TrustedReducerBundle } from \"./types\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../model\";\nimport { createTrustedInstructionRunner } from \"./trusted/instruction-runner\";\nimport { createInteractionResolver } from \"./trusted/interaction-resolver\";\nimport { createLifecycleRunner } from \"./trusted/lifecycle-runner\";\nimport { createProjectionBuilder } from \"./trusted/projection-builder\";\nimport { createTrustedRuntimeScope } from \"./trusted/runtime-scope\";\nimport { createStaticProjectionBuilder } from \"./trusted/static-projection\";\n\nexport function createTrustedReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): TrustedReducerBundle<Contract, Definitions, Views> {\n const scope = createTrustedRuntimeScope(definition);\n const interactions = createInteractionResolver(scope);\n const lifecycle = createLifecycleRunner(scope, interactions);\n const instructions = createTrustedInstructionRunner(\n scope,\n interactions,\n lifecycle,\n );\n const staticProjection = createStaticProjectionBuilder(scope);\n const projection = createProjectionBuilder(scope, interactions);\n\n return {\n async initialize(input) {\n return lifecycle.initializeSession(input, instructions.drainInstructions);\n },\n async initializePhase({ state, to }) {\n const initialized = lifecycle.initializePhaseResult(\n scope.toCombinedState(state),\n to,\n );\n return scope.toSessionState(\n instructions.drainInstructions(\n initialized.state,\n initialized.instructions,\n ),\n );\n },\n async validateInput({ state, input }) {\n return interactions.validateClientInput(\n scope.toCombinedState(state),\n input,\n );\n },\n async reduce({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n return reject;\n }\n const result = instructions.reduceOnce(combinedState, input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n instructions: result.instructions ?? [],\n };\n },\n async dispatch({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n return reject;\n }\n const result = instructions.dispatch(combinedState, input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n trace: result.trace,\n };\n },\n projectStatic() {\n return staticProjection.projectStatic();\n },\n projectSeatsDynamic(input) {\n return projection.projectSeatsDynamic(input);\n },\n projectSeatViewDynamic(input) {\n return projection.projectSeatViewDynamic(input);\n },\n };\n}\n","import { z } from \"zod\";\nimport * as ContractZod from \"../../generated/reducer-contract/zod\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport type {\n BaseGameSessionOfContract,\n GameStateOf,\n HiddenSchemaOfContract,\n ManifestContractOf,\n ManifestOf,\n PhaseMapOf,\n PhaseNameOfContract,\n PlayerIdOfState,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n RuntimeSetupSelection,\n TableOfManifest,\n ViewMapOf,\n} from \"../model\";\nimport type { IngressRuntimeCodec, RawReducerSessionState } from \"./raw-types\";\nimport { createRuntimeInputParser } from \"./input-codec\";\nimport { collectIngressPhaseSchemas } from \"./phase-schemas\";\n\nconst runtimePayloadSchema: z.ZodType<unknown> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(runtimePayloadSchema),\n z.record(z.string(), runtimePayloadSchema),\n ]),\n);\nconst runtimeRecordSchema = z.record(z.string(), runtimePayloadSchema);\nconst perPlayerSchema = <Value extends z.ZodTypeAny>(valueSchema: Value) =>\n z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([z.string(), valueSchema])),\n })\n .strict();\nconst runtimeComponentLocationSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"Detached\") }).strict(),\n z\n .object({\n type: z.literal(\"InDeck\"),\n deckId: z.string(),\n playedBy: z.string().nullable(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InHand\"),\n handId: z.string(),\n playerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: z.string().nullable().optional(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnSpace\"),\n boardId: z.string(),\n spaceId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InContainer\"),\n boardId: z.string(),\n containerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnEdge\"),\n boardId: z.string(),\n edgeId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnVertex\"),\n boardId: z.string(),\n vertexId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InSlot\"),\n host: z.union([\n z.object({ kind: z.literal(\"piece\"), id: z.string() }).strict(),\n z.object({ kind: z.literal(\"die\"), id: z.string() }).strict(),\n ]),\n slotId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n]);\nconst currentRuntimeTableSchema = z\n .object({\n playerOrder: z.array(z.string()),\n zones: z\n .object({\n shared: z.record(z.string(), z.array(z.string())),\n perPlayer: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n visibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cardSetIdsByZoneId: z\n .record(z.string(), z.array(z.string()))\n .optional(),\n })\n .strict(),\n decks: z.record(z.string(), z.array(z.string())),\n hands: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n handVisibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n cardSetId: z.string(),\n cardType: z.string(),\n name: z.string().optional(),\n text: z.string().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n pieces: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n pieceTypeId: z.string(),\n pieceName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n componentLocations: z.record(z.string(), runtimeComponentLocationSchema),\n ownerOfCard: z.record(z.string(), z.string().nullable()),\n visibility: z.record(\n z.string(),\n z\n .object({\n faceUp: z.boolean(),\n visibleTo: z.array(z.string()).nullable().optional(),\n })\n .strict(),\n ),\n resources: perPlayerSchema(runtimeRecordSchema),\n boards: z\n .object({\n byId: z.record(z.string(), runtimeRecordSchema),\n hex: z.record(z.string(), runtimeRecordSchema),\n square: z.record(z.string(), runtimeRecordSchema),\n network: z.record(z.string(), runtimeRecordSchema).optional(),\n track: z.record(z.string(), runtimeRecordSchema).optional(),\n })\n .strict(),\n dice: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n dieTypeId: z.string(),\n dieName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n sides: z.number().int(),\n value: z.number().int().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n })\n .strict();\n\nexport function createIngressRuntimeCodec<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n ManifestContractOf<Contract>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseNameOfContract<Contract>\n> {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n type DomainState = GameStateOf<Definition>;\n type State = BaseGameSessionOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNameOfContract<Contract>;\n type ReturnType = IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n Manifest,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseName\n >;\n type PlayerId = PlayerIdOfState<DomainState>;\n\n const { phaseNameSchema } = collectIngressPhaseSchemas(definition);\n const playerIdSchema = definition.contract.manifest.ids\n .playerId as z.ZodType<PlayerId>;\n\n const flowSchema = z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n });\n const runtimeStateSchema = z.object({\n rng: z.object({\n seed: z.number().int().nullable(),\n cursor: z.number().int(),\n trace: z.array(z.string()),\n }),\n setup: z\n .object({\n profileId: z.string(),\n optionValues: z.record(z.string(), z.string().nullable()),\n })\n .nullable(),\n simultaneous: z.object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: runtimePayloadSchema,\n }),\n ),\n })\n .nullable(),\n }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable(),\n });\n const parseRuntimeInput = createRuntimeInputParser(playerIdSchema);\n\n // The return type uses branded/mapped types derived from the contract generic.\n // TypeScript cannot verify that plain objects satisfy these deep mapped types,\n // but the runtime Zod parsing ensures correctness.\n return {\n defaultRuntimeState(\n seed: number | null = null,\n setup: RuntimeSetupSelection<Manifest> | null = null,\n ) {\n const runtimeState: State[\"runtime\"] = {\n rng: {\n seed,\n cursor: 0,\n trace: [],\n },\n setup,\n simultaneous: { current: null },\n lastTransition: null,\n };\n return runtimeState;\n },\n parseInitialTable(rawTable: unknown, playerIds: string[] | undefined) {\n const table = safeParseOrThrow(\n currentRuntimeTableSchema,\n rawTable,\n \"table\",\n ) as unknown as TableOfManifest<ManifestOf<Contract>>;\n return {\n table,\n playerIds: safeParseOrThrow(\n z.array(playerIdSchema),\n playerIds && playerIds.length > 0 ? playerIds : table.playerOrder,\n \"table.playerOrder\",\n ),\n };\n },\n parseState(rawState: RawReducerSessionState) {\n const envelope = safeParseOrThrow(\n ContractZod.ReducerSessionStateSchema,\n rawState,\n \"state\",\n );\n const table = safeParseOrThrow(\n definition.contract.manifest.tableSchema,\n envelope.domain.table,\n \"domain.table\",\n );\n const playerIds = [...table.playerOrder] as PlayerId[];\n const privateState = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n definition.contract.state.private,\n envelope.domain.privateState[playerId] ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"domain\"][\"privateState\"];\n const flow = safeParseOrThrow(\n flowSchema,\n {\n currentPhase: envelope.domain.flow.currentPhase,\n turn: envelope.domain.flow.turn,\n round: envelope.domain.flow.round,\n activePlayers: envelope.domain.flow.activePlayers,\n },\n \"domain.flow\",\n );\n const currentPhaseDefinition = definition.phases[flow.currentPhase];\n if (!currentPhaseDefinition) {\n throw new Error(`Unknown reducer phase '${flow.currentPhase}'.`);\n }\n const rawPhaseState = envelope.domain.phase;\n const phase = safeParseOrThrow(\n currentPhaseDefinition.state,\n rawPhaseState ?? {},\n `phase:${flow.currentPhase}`,\n ) as State[\"domain\"][\"phase\"];\n\n const parsedState: State = {\n domain: {\n table,\n publicState: safeParseOrThrow(\n definition.contract.state.public,\n envelope.domain.publicState,\n \"domain.publicState\",\n ) as State[\"domain\"][\"publicState\"],\n privateState,\n hiddenState: safeParseOrThrow(\n definition.contract.state.hidden,\n envelope.domain.hiddenState,\n \"domain.hiddenState\",\n ) as State[\"domain\"][\"hiddenState\"],\n flow,\n phase,\n },\n runtime: safeParseOrThrow(\n runtimeStateSchema,\n envelope.runtime,\n \"runtime\",\n ) as unknown as State[\"runtime\"],\n };\n return parsedState;\n },\n serializeState(state: State) {\n return {\n domain: { ...state.domain },\n runtime: state.runtime,\n } as RawReducerSessionState;\n },\n parsePlayerId(rawPlayerId: string) {\n return safeParseOrThrow(playerIdSchema, rawPlayerId, \"playerId\");\n },\n parseInput(rawInput: unknown) {\n return parseRuntimeInput(rawInput);\n },\n } as unknown as ReturnType;\n}\n","import { z } from \"zod\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport type { RawRuntimeInput } from \"./raw-types\";\nimport { runtimePayloadSchema } from \"./runtime-payload\";\n\nexport function createRuntimeInputParser<PlayerId extends string>(\n playerIdSchema: z.ZodType<PlayerId>,\n): (rawInput: unknown) => RawRuntimeInput {\n const rawRuntimeInputSchema = z.object({\n kind: z.literal(\"interaction\"),\n playerId: playerIdSchema,\n interactionId: z.string(),\n params: runtimePayloadSchema.default({}),\n });\n\n return (rawInput: unknown) =>\n safeParseOrThrow(rawRuntimeInputSchema, rawInput, \"input\");\n}\n","import { z } from \"zod\";\nimport type { RuntimePayload } from \"../model\";\n\nexport const runtimePayloadSchema: z.ZodType<RuntimePayload> = z.lazy(() =>\n z.union([\n z.boolean(),\n z.number(),\n z.string(),\n z.null(),\n z.array(runtimePayloadSchema),\n z.record(z.string(), z.union([runtimePayloadSchema, z.undefined()])),\n ]),\n);\n","import { z } from \"zod\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewMapOf,\n} from \"../model\";\n\nfunction createPhaseNameSchema<PhaseName extends string>(\n phaseNames: readonly PhaseName[],\n): z.ZodType<PhaseName> {\n const allowed = new Set(phaseNames);\n return z.custom<PhaseName>(\n (value: unknown) =>\n typeof value === \"string\" && allowed.has(value as PhaseName),\n { message: \"Invalid phase name\" },\n );\n}\n\nexport function collectIngressPhaseSchemas<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): {\n phaseEntries: Array<\n [\n PhaseNameOfContract<Contract>,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n phaseNames: PhaseNameOfContract<Contract>[];\n phaseNameSchema: z.ZodType<PhaseNameOfContract<Contract>>;\n} {\n type PhaseName = PhaseNameOfContract<Contract>;\n const phaseEntries = Object.entries(definition.phases) as Array<\n [\n PhaseName,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n const phaseNames = phaseEntries.map(([phaseName]) => phaseName);\n return {\n phaseEntries,\n phaseNames,\n phaseNameSchema: createPhaseNameSchema(phaseNames),\n };\n}\n","// @generated by packages/reducer-contract/scripts/generate-ts.mjs\n// DO NOT EDIT BY HAND. Edit schema/reducer-runtime.schema.json and rerun `pnpm generate`.\n\n/* eslint-disable */\nimport type * as Wire from \"./wire\";\n\n/**\n * Typed effect constructors. Authors MUST go through these; hand-constructing\n * Wire.Effect objects is banned by convention because it's how wire drift\n * re-enters the codebase.\n *\n * The `effectId` is minted by the runtime (see createEffectIdMinter below),\n * not by the author. Each builder returns a `PendingEffect` that carries\n * the optional continuation; the reducer bundle's accept materializer splits\n * pending effects into the wire's `effects[]` + `continuations` map.\n */\n\nexport type PendingEffect = Wire.Effect & {\n readonly __continuation?: Wire.ContinuationToken;\n};\n\nexport type EffectIdMinter = () => Wire.EffectId;\n\n/**\n * Produces sequential, deterministic effect ids scoped to a single accept\n * payload: \"ef0\", \"ef1\", ... . Uniqueness only needs to be local to the\n * payload because the host consumes and discards them per dispatch.\n */\nexport function createEffectIdMinter(): EffectIdMinter {\n let i = 0;\n return () => `ef${i++}` as Wire.EffectId;\n}\n\nexport type EffectBuilders = {\n transition(args: { to: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n rollDie(args: { dieId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n shuffleSharedZone(args: { zoneId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n shufflePlayerZone(args: { zoneId: string; playerId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n};\n\nexport function createEffectBuilders(mint: EffectIdMinter): EffectBuilders {\n return {\n transition(args, continuation) {\n const effect = { effectId: mint(), type: \"transition\" as const, to: args.to };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n rollDie(args, continuation) {\n const effect = { effectId: mint(), type: \"rollDie\" as const, dieId: args.dieId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n shuffleSharedZone(args, continuation) {\n const effect = { effectId: mint(), type: \"shuffleSharedZone\" as const, zoneId: args.zoneId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n shufflePlayerZone(args, continuation) {\n const effect = { effectId: mint(), type: \"shufflePlayerZone\" as const, zoneId: args.zoneId, playerId: args.playerId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n };\n}\n\n/**\n * Takes a list of PendingEffects and splits them into the canonical wire\n * shape: `effects[]` (stripped of `__continuation`) + `continuations` map\n * keyed by effectId. Use at the boundary where reduce/dispatch results leave\n * author code and enter the wire.\n */\nexport function materializeAccept(pending: ReadonlyArray<PendingEffect>): {\n effects: Wire.Effect[];\n continuations: Wire.ContinuationMap;\n} {\n const effects: Wire.Effect[] = [];\n const continuations: Wire.ContinuationMap = {};\n for (const pe of pending) {\n const { __continuation, ...effect } = pe as PendingEffect & { __continuation?: Wire.ContinuationToken };\n effects.push(effect as Wire.Effect);\n if (__continuation !== undefined) {\n continuations[(effect as Wire.Effect).effectId] = __continuation;\n }\n }\n return { effects, continuations };\n}\n","import { createTrustedReducerBundle } from \"./trusted-bundle\";\nimport { createIngressRuntimeCodec } from \"../ingress/runtime-codec\";\nimport * as Builders from \"../../generated/reducer-contract/builders\";\nimport { REDUCER_CONTRACT_VERSION } from \"../../generated/reducer-contract/version\";\nimport * as Wire from \"../../generated/reducer-contract/wire\";\nimport type {\n ManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ReducerReject,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../model\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\nimport type { DispatchTraceEntry } from \"../core/types\";\nimport type {\n UntrustedReducerSessionState,\n UntrustedRuntimeInput,\n UntrustedRuntimeTable,\n} from \"../ingress/types\";\nimport type { ReducerBundle } from \"./types\";\n\n/**\n * Pass the wire-validated `interaction` input through to the trusted\n * bundle. Both layers speak the same single-kind shape now — the routing\n * here only normalizes `params` to a concrete object when the caller\n * elided it.\n *\n * The wire schema admits exactly one player-originated variant\n * (`{ kind: \"interaction\" }`) and the engine's `TrustedRuntimeInput`\n * uses the same discriminator, so this is a straight pass-through.\n * Continuation inputs are engine-internal and never traverse this routing.\n */\nfunction routeInteraction(input: UntrustedRuntimeInput): {\n kind: \"interaction\";\n playerId: string;\n interactionId: string;\n params: unknown;\n} {\n return {\n kind: \"interaction\",\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.params,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Wire-protocol adapter.\n//\n// The trusted bundle (see ./trusted-bundle.ts) keeps the SDK reducer runtime\n// instruction shape at reducer boundaries where:\n// - Results discriminate on `type: \"accept\" | \"reject\"`.\n// - Reducer-returned instructions carry `kind`.\n// - Dispatch traces use normalized runtime instructions.\n// The generated reducer-contract (`packages/reducer-contract`) defines the\n// canonical wire shape consumed by the Kotlin host:\n// - Results discriminate on `kind: \"accept\" | \"reject\"`.\n// - Each effect carries an `effectId`, never an inline `resume`.\n// - Continuations live in a sibling `continuations: Record<effectId, ...>`\n// map on reduce results, or on the matching `appliedEffect` trace entry\n// for dispatch results.\n// - Each DispatchTrace entry discriminates on `kind` (no `type` field).\n//\n// This module is the ONLY place in the SDK reducer that converts runtime\n// instructions into wire effects. It does so through\n// `@dreamboard-games/sdk/infrastructure/reducer-bundle-abi` (the single source of truth for\n// wire-effect construction) rather than hand-rolling the mapping locally —\n// hand-rolled mappings are how wire drift sneaks in (see the catan\n// rollDie regression).\n// ---------------------------------------------------------------------------\n\ntype InternalInstruction<State> = RuntimeInstructionForState<State>;\n\nfunction extractContinuation<State>(\n instruction: InternalInstruction<State>,\n): Wire.ContinuationToken | undefined {\n const continuation = (\n instruction as {\n continuation?: Wire.ContinuationToken | null | undefined;\n }\n ).continuation;\n if (continuation === undefined || continuation === null) return undefined;\n return {\n id: continuation.id,\n data: continuation.data as Wire.JsonValue,\n };\n}\n\n/**\n * Route one engine-internal effect through the generated builder that owns\n * its wire shape. The builder mints the effectId, enforces the correct\n * required/optional key set, and attaches the continuation privately via\n * `__continuation` so `materializeAccept` can split it out at the wire\n * boundary.\n *\n * Why dispatch through the builder instead of constructing `Wire.Effect`\n * directly? The schema + builders are the SSOT for wire shapes. Duplicating\n * that knowledge here once caused the catan rollDie bug; never again.\n */\nfunction toPendingEffect<State>(\n instruction: InternalInstruction<State>,\n fx: Builders.EffectBuilders,\n): Builders.PendingEffect {\n const continuation = extractContinuation<State>(instruction);\n switch (instruction.kind) {\n case \"flow.transition\":\n return fx.transition({ to: instruction.to as string }, continuation);\n case \"engine.rollDie\":\n return fx.rollDie(\n { dieId: (instruction as { dieId: string }).dieId },\n continuation,\n );\n case \"engine.shuffleSharedZone\":\n return fx.shuffleSharedZone(\n { zoneId: (instruction as { zoneId: string }).zoneId as string },\n continuation,\n );\n case \"engine.shufflePlayerZone\":\n return fx.shufflePlayerZone(\n {\n zoneId: (instruction as { zoneId: string }).zoneId as string,\n playerId: (instruction as { playerId: string }).playerId as string,\n },\n continuation,\n );\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `toPendingEffect: unsupported instruction kind '${(_exhaustive as { kind: string }).kind}'.`,\n );\n }\n }\n}\n\nfunction toWireReduceResult<State>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n instructions?: InternalInstruction<State>[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.ReduceResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const pending = (result.instructions ?? []).map((instruction) =>\n toPendingEffect<State>(instruction, fx),\n );\n const { effects, continuations } = Builders.materializeAccept(pending);\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n effects,\n continuations,\n };\n}\n\nfunction toWireDispatchResult<State, PlayerId extends string>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n trace: DispatchTraceEntry<State, PlayerId>[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.DispatchResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const trace: Wire.DispatchTrace[] = [];\n for (const entry of result.trace) {\n switch (entry.type) {\n case \"acceptedClientInput\": {\n const engineInput = entry.input as {\n kind: \"interaction\" | \"continuation\";\n playerId?: string;\n interactionId?: string;\n params?: Wire.JsonValue;\n };\n let wireInput: Wire.GameInput;\n if (engineInput.kind === \"interaction\") {\n wireInput = {\n kind: \"interaction\",\n playerId: engineInput.playerId ?? \"\",\n interactionId: engineInput.interactionId ?? \"\",\n params: engineInput.params ?? {},\n };\n } else {\n // Continuation inputs are engine-internal and shouldn't appear in\n // client-addressed dispatch traces; synthesize a best-effort wire\n // shape so the trace stays well-typed.\n wireInput = {\n kind: \"interaction\",\n playerId: \"\",\n interactionId: \"\",\n params: {},\n };\n }\n trace.push({\n kind: \"acceptedClientInput\",\n input: wireInput,\n });\n break;\n }\n case \"appliedInstruction\": {\n const pending = toPendingEffect<State>(\n entry.instruction as InternalInstruction<State>,\n fx,\n );\n const { effects, continuations } = Builders.materializeAccept([\n pending,\n ]);\n const [wireEffect] = effects;\n if (wireEffect === undefined) {\n throw new Error(\n \"materializeAccept returned no effects for a single pending effect\",\n );\n }\n const continuation = continuations[wireEffect.effectId];\n trace.push(\n continuation === undefined\n ? { kind: \"appliedEffect\", effect: wireEffect }\n : { kind: \"appliedEffect\", effect: wireEffect, continuation },\n );\n break;\n }\n case \"rngConsumption\":\n trace.push({\n kind: \"rngConsumption\",\n operation: entry.operation,\n traceEntry: entry.traceEntry,\n });\n break;\n default: {\n const _exhaustive: never = entry;\n throw new Error(\n `toWireDispatchResult: unknown trace entry type '${(_exhaustive as { type: string }).type}'.`,\n );\n }\n }\n }\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n trace,\n };\n}\n\nfunction toWireDispatchTrace<State, PlayerId extends string>(result: {\n type: \"accept\";\n state: State;\n trace: DispatchTraceEntry<State, PlayerId>[];\n}): Wire.DispatchTrace[] {\n return (\n toWireDispatchResult(result, (state) => state as never) as {\n kind: \"accept\";\n trace: Wire.DispatchTrace[];\n }\n ).trace;\n}\n\nexport function createReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ReducerBundle {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n const trustedBundle = createTrustedReducerBundle(definition);\n const codec = createIngressRuntimeCodec(definition);\n type Manifest = ManifestContractOf<Definition[\"contract\"]>;\n type TrustedState = Awaited<ReturnType<typeof trustedBundle.initialize>>;\n\n function parseTrustedState(state: unknown): TrustedState {\n return codec.parseState(\n state as UntrustedReducerSessionState,\n ) as TrustedState;\n }\n\n function parseRuntimePlayerId(playerId: unknown) {\n if (typeof playerId !== \"string\") {\n throw new Error(\"Expected a string playerId.\");\n }\n return codec.parsePlayerId(playerId);\n }\n\n const bundle = {\n ...trustedBundle,\n // Top-level protocol version. The Kotlin ReducerBundleAdapter reads this\n // on bundle load and rejects bundles whose major version does not match\n // the host's compiled-in REDUCER_CONTRACT_VERSION.\n reducerContractVersion: REDUCER_CONTRACT_VERSION,\n async initialize({\n table,\n playerIds,\n rngSeed,\n setup,\n }: Wire.InitializeRequest) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as unknown as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n return codec.serializeState(\n await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n }),\n );\n },\n async initializePhase({ state, to }: Wire.InitializePhaseRequest) {\n const decodedState = parseTrustedState(state);\n return codec.serializeState(\n await trustedBundle.initializePhase({\n state: decodedState,\n to: to as never,\n }),\n );\n },\n async validateInput({ state, input }: Wire.ValidateInputRequest) {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n return trustedBundle.validateInput({\n state: parseTrustedState(state),\n input: routed as never,\n });\n },\n async reduce({\n state,\n input,\n }: Wire.ReduceRequest): Promise<Wire.ReduceResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.reduce({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireReduceResult<TrustedState>(result as never, (nextState) =>\n codec.serializeState(nextState as never),\n );\n },\n async dispatch({\n state,\n input,\n }: Wire.DispatchRequest): Promise<Wire.DispatchResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireDispatchResult(result as never, (nextState: TrustedState) =>\n codec.serializeState(nextState as never),\n );\n },\n /**\n * Wire-side passthrough for the session-scoped static projection. The\n * host calls this once per reducer session, caches the payload, and\n * thereafter merges it back into every seat view on the client. Returns\n * `null` when `defineGame` did not declare a `staticView`.\n */\n projectStatic() {\n return trustedBundle.projectStatic() as Wire.BoardStaticProjection | null;\n },\n /**\n * Wire-side passthrough for per-tick seat projection. The seat views carry\n * only the fields produced by `defineView`; static topology, when present,\n * was served once via `projectStatic` and is re-merged on the client.\n */\n projectSeatsDynamic({\n state,\n playerIds,\n viewId = \"player\",\n }: Wire.ProjectSeatsDynamicRequest) {\n const parsedState = parseTrustedState(state);\n const parsedPlayerIds = playerIds.map((pid) => codec.parsePlayerId(pid));\n return trustedBundle.projectSeatsDynamic({\n state: parsedState,\n playerIds: parsedPlayerIds,\n viewId,\n }) as Wire.SeatProjectionBundle;\n },\n projectSeatViewDynamic({ state, playerId, viewId = \"player\" }) {\n const parsedState = parseTrustedState(state);\n return trustedBundle.projectSeatViewDynamic({\n state: parsedState,\n playerId: parseRuntimePlayerId(playerId),\n viewId,\n });\n },\n createInProcessRuntime() {\n let state: TrustedState | null = null;\n const requireState = () => {\n if (!state) {\n throw new Error(\"In-process reducer runtime has no state.\");\n }\n return state;\n };\n return {\n async initialize({ table, playerIds, rngSeed, setup }) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n state = await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n });\n },\n hydrate({ state: snapshot }) {\n state = parseTrustedState(snapshot);\n },\n async dispatch({ input }) {\n const validatedWire = codec.parseInput(\n input as UntrustedRuntimeInput,\n );\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: requireState(),\n input: routed as never,\n });\n if (result.type === \"reject\") {\n return {\n kind: \"reject\" as const,\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n state = result.state;\n return {\n kind: \"accept\" as const,\n state: codec.serializeState(state as never),\n trace: toWireDispatchTrace(result as never),\n };\n },\n projectSeatViewDynamic({ playerId, viewId = \"player\" }) {\n return trustedBundle.projectSeatViewDynamic({\n state: requireState(),\n playerId: parseRuntimePlayerId(playerId),\n viewId,\n });\n },\n projectSeatsDynamic({ playerIds, viewId = \"player\" }) {\n const parsedPlayerIds = playerIds.map((pid) =>\n parseRuntimePlayerId(pid),\n );\n return trustedBundle.projectSeatsDynamic({\n state: requireState(),\n playerIds: parsedPlayerIds,\n viewId,\n });\n },\n snapshot() {\n return codec.serializeState(requireState());\n },\n unsafeState() {\n return requireState();\n },\n };\n },\n } satisfies ReducerBundle;\n\n return bundle;\n}\n","import { z } from \"zod\";\nimport { collectReducerDefinitionIndex } from \"./definition-index\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"./model\";\n\nexport type ClientParamSchema = {\n safeParse: (value: unknown) =>\n | { success: true; data: Record<string, unknown> }\n | {\n success: false;\n error: { issues: Array<{ path: PropertyKey[]; message: string }> };\n };\n};\n\nexport type ClientParamSchemasByPhase = Readonly<\n Record<string, Readonly<Record<string, ClientParamSchema>>>\n>;\n\nfunction schemaForCollectors(\n collectors: Record<string, InputCollector>,\n): ClientParamSchema {\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n const schema = collector.schema as z.ZodTypeAny;\n shape[key] =\n \"defaultValue\" in collector\n ? schema.default(collector.defaultValue)\n : schema;\n }\n return z.object(shape) as unknown as ClientParamSchema;\n}\n\nexport function createClientParamSchemasByPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ClientParamSchemasByPhase {\n const index = collectReducerDefinitionIndex(definition);\n const out: Record<string, Record<string, ClientParamSchema>> = {};\n for (const phaseIndex of index.phasesByName.values()) {\n const phaseSchemas: Record<string, ClientParamSchema> = {};\n for (const [id, interaction] of phaseIndex.interactions) {\n phaseSchemas[id] =\n interaction.paramsSchema ?? schemaForCollectors(interaction.inputs);\n }\n out[String(phaseIndex.phaseName)] = phaseSchemas;\n }\n return out;\n}\n","import type {\n CardIdOfManifest,\n DieIdOfManifest,\n GeneratedManifestContractLike,\n PieceIdOfManifest,\n PlayerIdOfManifest,\n SetupBootstrapContainerRef,\n SetupBootstrapPerPlayerContainerTemplateRef,\n SetupBootstrapStep,\n SetupBootstrapDestinationRef,\n} from \"./model\";\n\nexport function shuffle<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>(\n container: SetupBootstrapContainerRef<Manifest>,\n): SetupBootstrapStep<Manifest> {\n return {\n type: \"shuffle\",\n container,\n };\n}\n\nexport function dealToPlayerZone<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>({\n from,\n zoneId,\n count,\n playerIds,\n}: {\n from: Extract<\n SetupBootstrapContainerRef<Manifest>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n zoneId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n { type: \"playerZone\" }\n >[\"zoneId\"];\n count: number;\n playerIds?: readonly PlayerIdOfManifest<Manifest>[];\n}): SetupBootstrapStep<Manifest> {\n return {\n type: \"deal\",\n from,\n to: {\n type: \"playerZone\",\n zoneId,\n } as SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n count,\n playerIds,\n };\n}\n\nexport function dealToPlayerBoardContainer<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>({\n from,\n boardId,\n containerId,\n count,\n playerIds,\n}: {\n from: Extract<\n SetupBootstrapContainerRef<Manifest>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n boardId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n { type: \"playerBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n { type: \"playerBoardContainer\" }\n >[\"containerId\"];\n count: number;\n playerIds?: readonly PlayerIdOfManifest<Manifest>[];\n}): SetupBootstrapStep<Manifest> {\n return {\n type: \"deal\",\n from,\n to: {\n type: \"playerBoardContainer\",\n boardId,\n containerId,\n } as SetupBootstrapPerPlayerContainerTemplateRef<Manifest>,\n count,\n playerIds,\n };\n}\n\nexport function seedSharedBoardContainer<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>({\n from,\n boardId,\n containerId,\n count,\n componentIds,\n}: {\n from: SetupBootstrapContainerRef<Manifest>;\n boardId: Extract<\n SetupBootstrapDestinationRef<Manifest>,\n { type: \"sharedBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapDestinationRef<Manifest>,\n { type: \"sharedBoardContainer\" }\n >[\"containerId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<Manifest>\n | PieceIdOfManifest<Manifest>\n | DieIdOfManifest<Manifest>\n )[];\n}): SetupBootstrapStep<Manifest> {\n return {\n type: \"move\",\n from,\n to: {\n type: \"sharedBoardContainer\",\n boardId,\n containerId,\n } as SetupBootstrapDestinationRef<Manifest>,\n count,\n componentIds,\n };\n}\n\nexport function seedSharedBoardSpace<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n>({\n from,\n boardId,\n spaceId,\n count,\n componentIds,\n}: {\n from: SetupBootstrapContainerRef<Manifest>;\n boardId: Extract<\n SetupBootstrapDestinationRef<Manifest>,\n { type: \"sharedBoardSpace\" }\n >[\"boardId\"];\n spaceId: Extract<\n SetupBootstrapDestinationRef<Manifest>,\n { type: \"sharedBoardSpace\" }\n >[\"spaceId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<Manifest>\n | PieceIdOfManifest<Manifest>\n | DieIdOfManifest<Manifest>\n )[];\n}): SetupBootstrapStep<Manifest> {\n return {\n type: \"move\",\n from,\n to: {\n type: \"sharedBoardSpace\",\n boardId,\n spaceId,\n } as SetupBootstrapDestinationRef<Manifest>,\n count,\n componentIds,\n };\n}\n","/**\n * State composition primitives.\n *\n * `pipe` threads a seed state through a sequence of `State -> State`\n * transformations, left to right. It is the preferred way to compose curried\n * writers (the `ops.*` namespace) in reducers:\n *\n * return accept(\n * pipe(state,\n * ops.spendPlayerResources({ playerId, resources: cost }),\n * ops.placePieceOnVertex({ boardId, vertexId, pieceId, ownerId: playerId }),\n * ),\n * );\n */\n/**\n * A state-preserving transformation.\n *\n * `Op<State>` is polymorphic in the exact input subtype — given a state `S`\n * that extends `State`, it returns the same `S`. This lets curried writers\n * from `ops.*` and author-written helpers thread through phase-scoped `pipe`\n * calls without losing the narrowed phase state type.\n */\nexport type Op<State> = <S extends State>(state: S) => S;\n\nexport function pipe<State>(\n state: State,\n ...ops: ReadonlyArray<Op<NoInfer<State>>>\n): State {\n let result = state;\n for (const op of ops) {\n result = op(result);\n }\n return result;\n}\n"],"mappings":"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","names":["z","z","z","z","z","perPlayer","z","z","z","z","z","toDomainState","toDomainState","toCombinedState","toSessionState","fxForState","buildContext","buildRuntimeArgs","lazyDomain","board","space","from","stableStringify","z","z","z","z","z","runtimePayloadSchema","z","perPlayerSchema","z","z"]}
|