@dreamboard-games/sdk 0.5.0-alpha.21 → 0.5.0-alpha.23
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/{chunk-DMSXVMYY.js → chunk-UUJSLFIJ.js} +6 -2
- package/dist/chunk-UUJSLFIJ.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/react.d.ts +20 -1
- package/dist/react.js +357 -60
- package/dist/react.js.map +1 -1
- package/dist/reducer.js +1 -1
- package/dist/testing.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-DMSXVMYY.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/reducer/model/error-codes.ts","../src/reducer/model/manifest.ts","../src/reducer/model/definition.ts","../src/reducer/schema-helpers.ts","../src/shared/worker-contract.ts","../src/reducer/diagnostics.ts","../src/reducer/table/zones.ts","../src/reducer/table/zone-queries.ts","../src/reducer/table/internal.ts","../src/reducer/table/board-queries.ts","../src/reducer/table/clone.ts","../src/reducer/table/component-locations.ts","../src/reducer/table/numeric.ts","../src/reducer/table/resource-ops.ts","../src/reducer/table/tile-mutations.ts","../src/reducer/table/component-mutations.ts","../src/reducer/table/card-mutations.ts","../src/reducer/table-queries.ts","../src/shared/domain/event-admission.ts","../src/shared/domain/manifest-schema.ts","../src/reducer/definition-index.ts","../src/reducer/ingress/session-codec.ts","../src/reducer/parse-utils.ts","../src/reducer/ingress/runtime-payload.ts","../src/runtime-json.ts","../src/reducer/ingress/input-codec.ts","../src/reducer/ingress/phase-schemas.ts","../src/reducer/table/relation-mutations.ts","../src/reducer/transaction-mutations.ts","../src/reducer/transaction.ts","../src/reducer/bundle/trusted/runtime-registry.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/runtime-scope.ts","../src/reducer/bundle/trusted/collector-introspection.ts","../src/reducer/bundle/trusted/interaction-types.ts","../src/reducer/bundle/trusted/collector-params.ts","../src/reducer/bundle/trusted/simultaneous-player.ts","../src/reducer/bundle/trusted/interaction-authorization.ts","../src/reducer/client-param-schemas.ts","../src/reducer/bundle/trusted/step-prefix.ts","../src/reducer/bundle/trusted/collector-input-solver.ts","../src/reducer/bundle/trusted/interaction-domain-metadata.ts","../src/reducer/bundle/trusted/collector-domains.ts","../src/reducer/bundle/trusted/interaction-descriptor.ts","../src/reducer/bundle/trusted/interaction-decision.ts","../src/reducer/bundle/trusted/interaction-resolver.ts","../src/reducer/rng.ts","../src/reducer/bundle/trusted/rng-sampler.ts","../src/reducer/bundle/trusted/lifecycle-runner.ts","../src/reducer/bundle/trusted/tile-disclosure.ts","../src/reducer/bundle/trusted/card-concealment.ts","../src/reducer/bundle/trusted/seat-interactions.ts","../src/reducer/bundle/trusted/pending-selection.ts","../src/reducer/bundle/trusted/reducer-executor.ts","../src/reducer/bundle/trusted/projection-context.ts","../src/reducer/bundle/trusted/projection-builder.ts","../src/reducer/bundle/create-reducer-bundle.ts"],"sourcesContent":["export const FrameworkErrorCodes = {\n NOT_YOUR_TURN: \"NOT_YOUR_TURN\",\n WRONG_PHASE: \"WRONG_PHASE\",\n WRONG_STEP: \"WRONG_STEP\",\n NO_LEGAL_INPUT: \"NO_LEGAL_INPUT\",\n INVALID_PARAMS: \"INVALID_PARAMS\",\n UNKNOWN_INTERACTION: \"UNKNOWN_INTERACTION\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type FrameworkErrorCode =\n (typeof FrameworkErrorCodes)[keyof typeof FrameworkErrorCodes];\n","import type { RuntimeRecord } from \"./table\";\nimport * as z from \"zod\";\nimport type {\n AnySchema,\n ZoneDefinitions,\n RuntimeTableRecord,\n SchemaLike,\n} from \"./table\";\nimport type { CardIdOfTable, ZoneIdOfTable, PlayerIdOfTable } from \"./extract\";\nimport type { TableQueriesOfState } from \"./queries\";\n\ndeclare const manifestIdSchemaBrand: unique symbol;\n\nexport type ManifestIdFamily = keyof ManifestIds<\n string,\n string,\n string,\n string\n>;\n\nexport type ManifestIdSchema<\n Output = unknown,\n Family extends ManifestIdFamily | undefined = ManifestIdFamily | undefined,\n> = z.ZodType<Output> & {\n readonly [manifestIdSchemaBrand]: Family;\n};\n\nexport type ManifestLiterals<\n PlayerId extends string,\n ZoneId 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 cardSetIds: readonly string[];\n cardTypes: readonly string[];\n zoneIds: readonly ZoneId[];\n cardIds: readonly CardId[];\n resourceIds: readonly string[];\n resourcePresentationById?: Record<\n string,\n { label: string; icon?: string | null }\n >;\n /** Resources whose balances are projected only to their holder. */\n ownerResourceIds?: readonly string[];\n pieceTypeIds: readonly string[];\n pieceIds: readonly string[];\n dieTypeIds: readonly string[];\n dieIds: readonly string[];\n tileTypeIds: readonly string[];\n tileIds: readonly string[];\n boardTypeIds: readonly string[];\n boardBaseIds: readonly string[];\n boardIds: 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 cardSetIdByCardId: Record<CardId, string>;\n cardTypeByCardId: Record<CardId, string>;\n};\n\nexport type ManifestIds<\n PlayerId extends string,\n ZoneId 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 cardSetId: AnySchema;\n cardType: AnySchema;\n cardId: z.ZodType<CardId>;\n zoneId: z.ZodType<ZoneId>;\n resourceId: AnySchema;\n pieceTypeId: AnySchema;\n pieceId: AnySchema;\n dieId: AnySchema;\n dieTypeId: AnySchema;\n tileId: AnySchema;\n tileTypeId: AnySchema;\n boardTypeId: AnySchema;\n boardId: AnySchema;\n boardBaseId: 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 ownerOfCard: (playerIds?: readonly string[]) => Table[\"ownerOfCard\"];\n visibility: (playerIds?: readonly string[]) => Table[\"visibility\"];\n resources: (playerIds?: readonly string[]) => Table[\"resources\"];\n};\n\nexport type ManifestNormalSetup<Table extends RuntimeTableRecord> = {\n readonly minPlayers: number;\n readonly maxPlayers: number;\n readonly createInitialTable: (options: {\n readonly playerIds: readonly string[];\n }) => Table;\n};\n\nexport type ReducerManifestContract<\n Table extends RuntimeTableRecord,\n PhaseName extends string,\n PlayerId extends string,\n ZoneId extends string,\n CardId extends string,\n Definitions extends ZoneDefinitions = ZoneDefinitions,\n> = Definitions & {\n literals: ManifestLiterals<PlayerId, ZoneId, CardId, PhaseName>;\n ids: ManifestIds<PlayerId, ZoneId, CardId, PhaseName>;\n defaults: ManifestDefaults<Table>;\n normalSetup: ManifestNormalSetup<Table>;\n tableSchema: z.ZodType<Table>;\n};\n\nexport type ReducerManifestContractLike<\n Table extends RuntimeTableRecord = RuntimeTableRecord,\n PhaseName extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n CardId extends string = string,\n> = ReducerManifestContract<Table, PhaseName, PlayerId, ZoneId, CardId>;\n\nexport type ManifestContract<\n Table extends RuntimeTableRecord,\n Definitions extends ZoneDefinitions = ZoneDefinitions,\n> = ReducerManifestContract<\n Table,\n string,\n PlayerIdOfTable<Table>,\n ZoneIdOfTable<Table>,\n CardIdOfTable<Table>,\n Definitions\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, ...(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 WeakMap lets `defineGameContract` recognise\n * the manifest-supplied case and lets schema-aware consumers distinguish\n * semantic ID families without inferring them from authored field names. A\n * schema marked without a family remains manifest-scoped for compatibility.\n */\nconst manifestScopedSchemas = new WeakMap<\n object,\n ManifestIdFamily | undefined\n>();\n\nexport function markManifestScopedSchema<\n Schema extends z.ZodTypeAny,\n const Family extends ManifestIdFamily | undefined = undefined,\n>(\n schema: Schema,\n family?: Family,\n): Schema & ManifestIdSchema<z.infer<Schema>, Family> {\n manifestScopedSchemas.set(schema, family);\n return schema as Schema & ManifestIdSchema<z.infer<Schema>, Family>;\n}\n\nexport function isManifestScopedSchema(schema: unknown): boolean {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n manifestScopedSchemas.has(schema)\n );\n}\n\nexport function manifestSchemaFamily(\n schema: unknown,\n): ManifestIdFamily | undefined {\n if (typeof schema !== \"object\" || schema === null) {\n return undefined;\n }\n return manifestScopedSchemas.get(schema);\n}\n\nexport function createManifestStringLiteralSchema<\n Values extends readonly string[],\n const Family extends ManifestIdFamily | undefined = undefined,\n>(\n values: Values,\n family?: Family,\n): ManifestIdSchema<\n Values[number] extends never ? string : Values[number],\n Family\n> {\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, family);\n}\n\nexport function assumeManifestSchema<\n Output,\n Family extends ManifestIdFamily | undefined,\n>(schema: ManifestIdSchema<unknown, Family>): ManifestIdSchema<Output, Family>;\nexport function assumeManifestSchema<Output>(\n schema: z.ZodTypeAny,\n): z.ZodType<Output>;\nexport function assumeManifestSchema<Output>(\n schema: z.ZodTypeAny,\n): z.ZodType<Output> {\n return schema as z.ZodType<Output>;\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 > = ManifestContract<Table>,\n Options extends RuntimeRecord = RuntimeRecord,\n> = {\n manifest: Manifest;\n table: Table;\n playerIds: PlayerIdOfTable<Table>[];\n rngSeed?: number | null;\n options: Options;\n q: TableQueriesOfState<{ table: Table }, Manifest>;\n};\n","import type { ClientCollectorValueOf, CollectorValueOf } from \"./spec/inputs\";\nimport type { HiddenCardId } from \"../../shared/domain/cards\";\nimport type { ViewData } from \"./spec/views\";\nimport type { z } from \"zod\";\nimport type { RuntimeTableRecord, SchemaLike, RuntimeRecord } from \"./table\";\nimport type {\n InitContext,\n ReducerManifestContract,\n ReducerManifestContractLike,\n StateDefinition,\n} from \"./manifest\";\nimport type {\n ExactManifestContractOf,\n HiddenSchemaOfContract,\n ManifestContractOf,\n ManifestOf,\n PhaseNameOfContract,\n PhaseStateMapOfContract,\n PlayerIdOfTable,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n OptionsOfContract,\n TableOfManifest,\n} from \"./extract\";\nimport type {\n ReducerGameState,\n ReducerSessionState,\n RuntimePhaseState,\n} from \"./runtime\";\nimport type {\n InputCollector,\n InteractionMap,\n PhaseDefinition,\n ViewDefinition,\n} from \"./spec\";\n\nexport type ReducerGameContract<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n Phases extends Record<string, SchemaLike<object>>,\n Errors extends Record<string, string> | undefined = undefined,\n OptionsSchema extends SchemaLike<RuntimeRecord> = SchemaLike<\n Record<string, never>\n >,\n> = {\n manifest: Manifest;\n state: StateDefinition<PublicSchema, PrivateSchema, HiddenSchema>;\n phases: Phases;\n errors?: Errors;\n options: OptionsSchema;\n /** Derived from `phases`; retained as an internal runtime convenience. */\n phaseNames: readonly string[];\n};\n\nexport type ReducerStateForConfig<\n Table extends RuntimeTableRecord,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n PhaseName extends string,\n> = ReducerGameState<\n Table,\n z.infer<PublicSchema>,\n z.infer<PrivateSchema>,\n z.infer<HiddenSchema>,\n RuntimePhaseState,\n PhaseName,\n Record<PhaseName, RuntimePhaseState>\n>;\n\nexport type ReducerSessionForConfig<\n Table extends RuntimeTableRecord,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n PhaseName extends string,\n Options extends RuntimeRecord = RuntimeRecord,\n> = ReducerSessionState<\n ReducerStateForConfig<\n Table,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n PhaseName\n >,\n Options\n>;\n\nexport type BaseGameStateOfContract<Contract> = ReducerGameState<\n TableOfManifest<ManifestOf<Contract>>,\n z.infer<PublicSchemaOfContract<Contract>>,\n z.infer<PrivateSchemaOfContract<Contract>>,\n z.infer<HiddenSchemaOfContract<Contract>>,\n PhaseStateMapOfContract<Contract>[PhaseNameOfContract<Contract>],\n PhaseNameOfContract<Contract>,\n PhaseStateMapOfContract<Contract>\n>;\n\nexport type BaseGameSessionOfContract<Contract> = ReducerSessionState<\n BaseGameStateOfContract<Contract>,\n OptionsOfContract<Contract>\n>;\n\n/**\n * Heterogeneous phase map for a contract. Each phase carries its own local\n * `PhaseStateSchema` plus authoring-time Actions/Flows/Interactions/\n * interaction and zone maps. The registries are bound to the contract's base state +\n * manifest so the runtime can iterate them through a single index type\n * without reaching for `any`.\n */\nexport type PhaseMapOf<Contract> = {\n [Name in PhaseNameOfContract<Contract>]: PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Record<string, InputCollector>,\n InteractionMap<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n OptionsOfContract<Contract>\n >;\n};\n\nexport type AnyPhaseDefinitionForContract<Contract> =\n PhaseMapOf<Contract>[PhaseNameOfContract<Contract>];\n\n/** Extract phase state schemas without coupling to phase callbacks or registries. */\nexport type PhaseStateMapOfDefinitions<\n Definitions extends Record<string, { state: SchemaLike<object> }>,\n> = Partial<{\n [Name in keyof Definitions & string]: Definitions[Name] extends {\n state: infer PhaseStateSchema extends SchemaLike<object>;\n }\n ? z.infer<PhaseStateSchema>\n : never;\n}>;\n\nexport type PhaseStateOfDefinitions<\n Definitions extends Record<string, { state: SchemaLike<object> }>,\n> = {\n [Name in keyof Definitions & string]: Definitions[Name] extends {\n state: infer PhaseStateSchema extends SchemaLike<object>;\n }\n ? z.infer<PhaseStateSchema>\n : never;\n}[keyof Definitions & string];\n\nexport type ResolvedGameStateOf<\n Contract,\n Definitions extends PhaseMapOf<Contract>,\n> = {\n [Name in keyof Definitions & string]: ReducerGameState<\n TableOfManifest<ManifestOf<Contract>>,\n z.infer<PublicSchemaOfContract<Contract>>,\n z.infer<PrivateSchemaOfContract<Contract>>,\n z.infer<HiddenSchemaOfContract<Contract>>,\n Definitions[Name] extends {\n state: infer PhaseStateSchema extends SchemaLike<object>;\n }\n ? z.infer<PhaseStateSchema>\n : never,\n PhaseNameOfContract<Contract>\n > & {\n flow: ReducerGameState<\n TableOfManifest<ManifestOf<Contract>>,\n z.infer<PublicSchemaOfContract<Contract>>,\n z.infer<PrivateSchemaOfContract<Contract>>,\n z.infer<HiddenSchemaOfContract<Contract>>,\n PhaseStateOfDefinitions<Definitions>,\n PhaseNameOfContract<Contract>\n >[\"flow\"] & {\n currentPhase: Name;\n };\n };\n}[keyof Definitions & string];\n\nexport type ResolvedGameSessionOf<\n Contract,\n Definitions extends PhaseMapOf<Contract>,\n> = ReducerSessionState<\n ResolvedGameStateOf<Contract, Definitions>,\n OptionsOfContract<Contract>\n>;\n\nexport type ViewOfContract<\n Contract,\n Projection extends ViewData = ViewData,\n> = ViewDefinition<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Projection\n>;\n\ntype PhasesOfDefinition<Definition> = Definition extends {\n phases: infer Definitions extends Record<string, unknown>;\n}\n ? Definitions\n : never;\n\ntype NonNeverKeys<Registry> = {\n [Key in keyof Registry]-?: [Registry[Key]] extends [never] ? never : Key;\n}[keyof Registry];\n\nexport type ViewOfDefinition<Definition> = Definition extends {\n view: (...args: never[]) => infer Projection;\n}\n ? Projection\n : never;\n\nexport type PhaseNamesOfDefinition<Definition> =\n keyof PhasesOfDefinition<Definition> & string;\n\nexport type PhaseDefinitionByName<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n> = PhaseName extends keyof PhasesOfDefinition<Definition> & string\n ? PhasesOfDefinition<Definition>[PhaseName]\n : never;\n\n/* eslint-disable @typescript-eslint/no-explicit-any -- Infer a game contract from arbitrary authored phase callback types. */\nexport type GameStateOf<Source> = Source extends {\n contract: infer Contract extends ReducerGameContractLike;\n phases: infer Definitions;\n}\n ? Definitions extends PhaseMapOf<Contract>\n ? ResolvedGameStateOf<Contract, Definitions>\n : never\n : Source extends ReducerGameContract<any, any, any, any, any, any, any, any>\n ? BaseGameStateOfContract<Source>\n : never;\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\n/** Structural contract used by the runtime; authored generics retain their exact schemas. */\nexport type ReducerGameContractLike = {\n manifest: ReducerManifestContractLike<RuntimeTableRecord>;\n options: SchemaLike<RuntimeRecord>;\n state: StateDefinition<\n SchemaLike<object>,\n SchemaLike<object>,\n SchemaLike<object>\n >;\n};\n\ntype InitialStateContextOf<Contract extends ReducerGameContractLike> =\n InitContext<\n TableOfManifest<ManifestOf<Contract>>,\n ExactManifestContractOf<Contract>,\n OptionsOfContract<Contract>\n >;\n\nexport type InitialStateCallbacks<Contract extends ReducerGameContractLike> = {\n public?: (\n ctx: InitialStateContextOf<Contract>,\n ) => z.infer<PublicSchemaOfContract<Contract>>;\n private?: (\n ctx: InitialStateContextOf<Contract> & {\n playerId: PlayerIdOfTable<TableOfManifest<ManifestOf<Contract>>>;\n },\n ) => z.infer<PrivateSchemaOfContract<Contract>>;\n hidden?: (\n ctx: InitialStateContextOf<Contract>,\n ) => z.infer<HiddenSchemaOfContract<Contract>>;\n};\n\nexport const validatedReducerDefinition: unique symbol = Symbol(\n \"validatedReducerDefinition\",\n);\n\n/** Authored input to game.assemble; no runtime contract or validation marker. */\nexport type ReducerGameDefinitionInput<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = {\n initial?: InitialStateCallbacks<Contract>;\n initialPhase?: PhaseNameOfContract<Contract>;\n // The phase map requires declared keys; this also rejects extra keys in variables.\n phases: Definitions &\n Record<Exclude<keyof Definitions, PhaseNameOfContract<Contract>>, never>;\n view: View;\n};\n\n/** Assembled definition accepted by reducer runtime consumers. */\nexport type ReducerGameDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = {\n readonly [validatedReducerDefinition]: true;\n contract: Contract;\n initial?: InitialStateCallbacks<Contract>;\n initialPhase?: PhaseNameOfContract<Contract>;\n phases: Definitions;\n view: View;\n};\n\nexport type AnyReducerGameDefinition<\n Contract extends ReducerGameContractLike = ReducerGameContractLike,\n> = ReducerGameDefinition<\n Contract,\n PhaseMapOf<Contract>,\n ViewOfContract<Contract>\n>;\n\n// --- Interaction / Zone extractors -------------------------------\n\ntype InteractionRegistriesOfDefinition<Definition> =\n PhasesOfDefinition<Definition>[keyof PhasesOfDefinition<Definition> &\n string] extends {\n interactions?: infer Interactions;\n }\n ? NonNullable<Interactions>\n : never;\n\ntype SimultaneousSubmitRegistriesOfDefinition<Definition> =\n PhasesOfDefinition<Definition>[keyof PhasesOfDefinition<Definition> &\n string] extends {\n submit?: infer Submit;\n }\n ? { submit: NonNullable<Submit> }\n : never;\n\nexport type InteractionIdOfDefinition<Definition> =\n | RegistryKeys<InteractionRegistriesOfDefinition<Definition>>\n | RegistryKeys<SimultaneousSubmitRegistriesOfDefinition<Definition>>;\ntype RegistryKeys<Registry> =\n Registry extends Record<string, unknown>\n ? NonNeverKeys<Registry> & string\n : never;\n\ntype InteractionRegistryOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n> =\n PhaseDefinitionByName<Definition, PhaseName> extends {\n interactions?: infer Interactions;\n }\n ? NonNullable<Interactions>\n : Record<string, never>;\n\ntype SimultaneousSubmitRegistryOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n> =\n PhaseDefinitionByName<Definition, PhaseName> extends {\n submit?: infer Submit;\n }\n ? { submit: NonNullable<Submit> }\n : Record<string, never>;\n\ntype NonNeverRegistryValue<Registry, Key extends string> =\n Registry extends Record<string, unknown>\n ? Key extends keyof Registry\n ? [Registry[Key]] extends [never]\n ? never\n : Registry[Key]\n : never\n : never;\n\nexport type InteractionIdOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n> =\n PhaseDefinitionByName<Definition, PhaseName> extends { kind: \"auto\" }\n ? never\n : InteractionRegistryOfDefinitionPhase<\n Definition,\n PhaseName\n > extends infer Interactions\n ? SimultaneousSubmitRegistryOfDefinitionPhase<\n Definition,\n PhaseName\n > extends infer Submit\n ? RegistryKeys<Interactions> | RegistryKeys<Submit>\n : never\n : never;\n\nexport type InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n> =\n | NonNeverRegistryValue<\n InteractionRegistryOfDefinitionPhase<Definition, PhaseName>,\n InteractionId\n >\n | NonNeverRegistryValue<\n SimultaneousSubmitRegistryOfDefinitionPhase<Definition, PhaseName>,\n InteractionId\n >;\n\ntype CollectorKindsOf<Collectors> =\n Collectors extends Record<string, InputCollector>\n ? Collectors[keyof Collectors] extends infer Collector\n ? Collector extends { kind: infer Kind extends string }\n ? Kind\n : never\n : never\n : never;\n\ntype CollectorKeysWithKind<Collectors, Kind extends string> =\n Collectors extends Record<string, InputCollector>\n ? {\n [K in keyof Collectors]: Collectors[K] extends {\n kind: infer CollectorKind;\n }\n ? Extract<CollectorKind, Kind> extends never\n ? never\n : K\n : never;\n }[keyof Collectors]\n : never;\n\ntype CardCollectorZoneIds<Collector> = Collector extends {\n kind: \"card\";\n meta: infer Meta;\n}\n ? Meta extends { readonly zoneIds: infer ZoneIds extends readonly string[] }\n ? ZoneIds[number]\n : Meta extends { readonly zoneId: infer ZoneId extends string }\n ? ZoneId\n : never\n : never;\n\ntype CollectorCardZoneIds<Collectors, Input extends string> =\n Collectors extends Record<string, InputCollector>\n ? Input extends keyof Collectors\n ? CardCollectorZoneIds<Collectors[Input]>\n : never\n : never;\n\ntype CollectorsOfInteractionDefinition<Spec> = Spec extends {\n readonly steps: {\n readonly collectors: infer Collectors extends Record<\n string,\n InputCollector\n >;\n };\n}\n ? Collectors\n : Spec extends {\n readonly inputs?: infer Collectors;\n }\n ? NonNullable<Collectors> extends Record<string, InputCollector>\n ? NonNullable<Collectors>\n : Record<string, never>\n : Record<string, never>;\n\n/** The canonical collector for a named interaction input, including step inputs. */\nexport type InputCollectorOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n Input extends string,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? Input extends keyof CollectorsOfInteractionDefinition<Spec>\n ? CollectorsOfInteractionDefinition<Spec>[Input]\n : never\n : never;\n\ntype CollectorKindsOfInteractionDefinition<Spec> = CollectorKindsOf<\n CollectorsOfInteractionDefinition<Spec>\n>;\n\ntype InputKeysWithCollectorKindOfInteractionDefinition<\n Spec,\n Kind extends string,\n> = CollectorKeysWithKind<CollectorsOfInteractionDefinition<Spec>, Kind> &\n string;\n\ntype CardInputZoneIdsOfInteractionDefinition<\n Spec,\n Input extends string,\n> = CollectorCardZoneIds<CollectorsOfInteractionDefinition<Spec>, Input>;\n\ntype ParamsOfCollectors<Collectors> =\n Collectors extends Record<string, InputCollector>\n ? {\n [K in keyof Collectors]: CollectorValueOf<Collectors[K]>;\n }\n : never;\n\n/** A seat names the cards hidden from it by position. */\ntype ClientValueOf<Collector> = Collector extends { readonly kind: \"card\" }\n ? CollectorValueOf<Collector> extends readonly (infer CardId)[]\n ? (CardId | HiddenCardId)[]\n : CollectorValueOf<Collector> | HiddenCardId\n : ClientCollectorValueOf<Collector>;\n\ntype ClientParamsOfCollectors<Collectors> =\n Collectors extends Record<string, InputCollector>\n ? {\n [\n K in keyof Collectors as Collectors[K] extends {\n readonly kind: \"rng\";\n }\n ? never\n : K\n ]: ClientValueOf<Collectors[K]>;\n }\n : never;\n\ntype InteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n Kind extends string,\n> = {\n [\n InteractionId in InteractionIdOfDefinitionPhase<Definition, PhaseName>\n ]: InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? Extract<CollectorKindsOfInteractionDefinition<Spec>, Kind> extends never\n ? never\n : InteractionId\n : never;\n}[InteractionIdOfDefinitionPhase<Definition, PhaseName>];\n\ntype QualifiedInteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n Kind extends string,\n> =\n InteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName,\n Kind\n > extends infer InteractionId extends string\n ? `${PhaseName}.${InteractionId}`\n : never;\n\nexport type BoardInteractionKeyOfDefinition<Definition> = {\n [\n PhaseName in PhaseNamesOfDefinition<Definition>\n ]: QualifiedInteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName,\n \"board-edge\" | \"board-space\" | \"board-vertex\"\n >;\n}[PhaseNamesOfDefinition<Definition>];\n\nexport type CardInteractionKeyOfDefinition<Definition> = {\n [\n PhaseName in PhaseNamesOfDefinition<Definition>\n ]: QualifiedInteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName,\n \"card\"\n >;\n}[PhaseNamesOfDefinition<Definition>];\n\nexport type InputKeysWithCollectorKindOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n Kind extends string,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? InputKeysWithCollectorKindOfInteractionDefinition<Spec, Kind>\n : never;\n\nexport type CardInputZoneIdsOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n Input extends string,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? CardInputZoneIdsOfInteractionDefinition<Spec, Input>\n : never;\n\nexport type ParamsOfInteractionOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? ParamsOfCollectors<CollectorsOfInteractionDefinition<Spec>>\n : never;\n\n/**\n * Client-facing params shape for an interaction. Omits engine-sampled\n * collectors (`rngInput.*`) — clients never supply those fields; the\n * trusted reducer bundle fills them during `submitInteraction`.\n *\n * This is the type that drives `submit(playerId, id, params)`,\n * `handle.submit(params)`, and the generated `InteractionParams` surface\n * through `createGameUi(game)`. The `reduce`-input counterpart is\n * {@link ParamsOfInteractionOfDefinition}, which includes every field\n * because the engine has already filled the sampled ones by then.\n */\ntype CurrentStepParams<Collectors extends Record<string, InputCollector>> = {\n [Key in keyof Collectors]: Pick<\n ClientParamsOfCollectors<Collectors>,\n Key & keyof ClientParamsOfCollectors<Collectors>\n > & { [Other in Exclude<keyof Collectors, Key>]?: never };\n}[keyof Collectors];\n\nexport type ClientParamsOfInteractionOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? Spec extends { readonly steps: unknown }\n ? CurrentStepParams<CollectorsOfInteractionDefinition<Spec>>\n : ClientParamsOfCollectors<CollectorsOfInteractionDefinition<Spec>>\n : never;\n\ntype DefaultedClientCollectorKeys<\n Collectors extends Record<string, InputCollector>,\n> = {\n [K in keyof Collectors]: Collectors[K] extends {\n readonly kind: \"rng\";\n }\n ? never\n : Collectors[K] extends { readonly defaultValue: unknown }\n ? K\n : never;\n}[keyof Collectors];\n\nexport type DefaultedClientParamKeysOfInteractionOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? DefaultedClientCollectorKeys<CollectorsOfInteractionDefinition<Spec>> &\n string\n : never;\n\ntype ZoneRegistriesOfDefinition<Definition> =\n PhasesOfDefinition<Definition>[keyof PhasesOfDefinition<Definition> &\n string] extends {\n zones?: infer Zones;\n }\n ? NonNullable<Zones>\n : never;\n\nexport type ZoneIdsOfDefinition<Definition> =\n ZoneRegistriesOfDefinition<Definition> extends infer Zones\n ? Zones extends readonly (infer ZoneId)[]\n ? Extract<ZoneId, string>\n : never\n : never;\n","import * as 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, {\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));\n}\n\n/** Zod 4 core definitions are the sole introspection vocabulary. */\nexport function getZodDef(schema: z.core.$ZodType) {\n // Zod's base class erases the definition discriminant. All authored schemas\n // use the installed Zod 4 vocabulary; validation tests cover nested wrappers.\n return (schema as z.core.$ZodTypes)._zod.def;\n}\n\nexport function unwrapWrappers(schema: z.core.$ZodType): z.core.$ZodType {\n let current = schema;\n while (true) {\n const def = getZodDef(current);\n switch (def.type) {\n case \"nullable\":\n case \"optional\":\n case \"default\":\n case \"prefault\":\n case \"readonly\":\n case \"catch\":\n case \"nonoptional\":\n current = def.innerType;\n break;\n default:\n return current;\n }\n }\n}\nexport function isPlainZodString(schema: z.core.$ZodType): boolean {\n return getZodDef(schema).type === \"string\";\n}\nexport function isEnumKeyedRecordSchema(schema: z.core.$ZodType): boolean {\n const def = getZodDef(schema);\n return def.type === \"record\" && getZodDef(def.keyType).type === \"enum\";\n}\nexport function isSparseMapSchema(schema: z.core.$ZodType): boolean {\n return sparseSchemas.has(unwrapWrappers(schema));\n}\nfunction getSparseSchemaMetadata(\n schema: z.core.$ZodType,\n): SparseSchemaMetadata | undefined {\n return sparseSchemas.get(unwrapWrappers(schema));\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(schema: z.core.$ZodType) {\n const def = getZodDef(schema);\n return def.type === \"object\" ? def.shape : null;\n}\n\nfunction normalizeSchemaInput(\n schema: z.core.$ZodType,\n input: unknown,\n): 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 * as z from \"zod\";\nimport type * as Wire from \"./runtime-types.js\";\n\n/** Exact worker ABI version; hosts must reject mismatched bundles. */\nexport const REDUCER_CONTRACT_VERSION = \"0.11.0\" as const;\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface ReducerBundleContract {\n readonly reducerContractVersion: Wire.ReducerContractVersion;\n initialize(\n input: Wire.InitializeRequest,\n ): MaybePromise<Wire.InitializeResult>;\n dispatch(input: Wire.DispatchRequest): MaybePromise<Wire.DispatchResult>;\n project(input: Wire.ProjectRequest): Wire.SeatProjectionBundle;\n}\n\nconst callable = z.custom<(...args: never[]) => unknown>(\n (value) => typeof value === \"function\",\n);\n// Admission checks identity and callables without wrapping/replacing methods.\nconst bundleSchema = z.object({\n reducerContractVersion: z.literal(REDUCER_CONTRACT_VERSION),\n initialize: callable,\n dispatch: callable,\n project: callable,\n});\n\nexport function assertReducerBundleContract(\n value: unknown,\n source: string,\n): asserts value is ReducerBundleContract {\n const result = bundleSchema.safeParse(value);\n if (result.success) return;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`Reducer bundle ${source} did not export an object.`);\n }\n const bundle = value as Record<string, unknown>;\n if (bundle.reducerContractVersion !== REDUCER_CONTRACT_VERSION) {\n throw new Error(\n `Reducer bundle ${source} requires exact contract ${REDUCER_CONTRACT_VERSION}; received ${String(bundle.reducerContractVersion ?? \"missing\")}.`,\n );\n }\n const method = result.error.issues[0]?.path[0];\n throw new Error(`Reducer bundle ${source} is missing ${String(method)}().`);\n}\n","import type { DispatchTraceEntry } from \"./core/types\";\n\nexport type DispatchTraceSummaryEntry =\n | { kind: \"acceptedClientInput\"; interactionId: string; playerId: string }\n | { kind: \"phaseEntered\"; from: string; to: string }\n | {\n kind: \"rngConsumption\";\n version: 2;\n operation: string;\n drawIndex: number;\n };\n\nexport type ReducerDiagnosticEvent =\n | {\n type: \"submitReceived\";\n submissionId: string;\n playerId: string;\n interactionId: string;\n phase: string;\n }\n | {\n type: \"submitRejected\";\n submissionId: string;\n errorCode: string;\n ruleId?: string;\n message?: string;\n }\n | {\n type: \"submitAccepted\";\n submissionId: string;\n trace: readonly DispatchTraceSummaryEntry[];\n }\n | {\n type: \"phaseTransition\";\n from: string;\n to: string;\n reason: \"effect\" | \"lifecycle\";\n }\n | { type: \"authoringWarning\"; code: string; message: string }\n | {\n type: \"internalError\";\n submissionId?: string;\n message: string;\n stack?: string;\n };\n\nexport type ReducerDiagnosticsSink = {\n event(event: ReducerDiagnosticEvent): void;\n};\n\nexport const noopDiagnosticsSink: ReducerDiagnosticsSink = {\n event() {},\n};\n\nexport type ReducerDiagnosticsEmitter = ReducerDiagnosticsSink & {\n readonly disabled: boolean;\n};\n\nfunction messageFromUnknown(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction stackFromUnknown(error: unknown): string | undefined {\n return error instanceof Error ? error.stack : undefined;\n}\n\nexport function createReducerDiagnosticsEmitter(\n sink: ReducerDiagnosticsSink | undefined,\n): ReducerDiagnosticsEmitter {\n const target = sink ?? noopDiagnosticsSink;\n let disabled = false;\n return {\n get disabled() {\n return disabled;\n },\n event(event) {\n if (disabled) return;\n try {\n target.event(event);\n } catch (error) {\n disabled = true;\n try {\n target.event({\n type: \"internalError\",\n submissionId:\n \"submissionId\" in event ? event.submissionId : undefined,\n message: `Reducer diagnostics sink threw: ${messageFromUnknown(\n error,\n )}`,\n stack: stackFromUnknown(error),\n });\n } catch {\n // A diagnostics sink must never break reducer execution.\n }\n }\n },\n };\n}\n\nexport function summarizeDispatchTrace<State, PlayerId extends string>(\n trace: readonly DispatchTraceEntry<State, PlayerId>[],\n): DispatchTraceSummaryEntry[] {\n return trace.map((entry) => {\n switch (entry.type) {\n case \"acceptedClientInput\":\n return {\n kind: \"acceptedClientInput\" as const,\n interactionId:\n entry.input.kind === \"interaction\"\n ? entry.input.interactionId\n : entry.input.kind,\n playerId:\n entry.input.kind === \"interaction\" ? entry.input.playerId : \"\",\n };\n case \"phaseEntered\":\n return {\n kind: \"phaseEntered\" as const,\n from: String(entry.from),\n to: String(entry.to),\n };\n case \"rngConsumption\":\n return {\n kind: \"rngConsumption\" as const,\n version: entry.version,\n operation: entry.operation,\n drawIndex: entry.drawIndex,\n };\n default: {\n const _exhaustive: never = entry;\n return _exhaustive;\n }\n }\n });\n}\n","import { isCardReferenceNamespace } from \"../../shared/domain/cards.js\";\nimport { deriveBoardTopology } from \"../../shared/board-topology.js\";\nimport {\n tileSpaceId,\n parseTileSpaceId,\n} from \"../../shared/domain/tile-space.js\";\nimport type { TopologyDefinitions } from \"../../shared/domain/topology-definitions.js\";\nimport { parsePerPlayerInstanceId } from \"../../shared/domain/per-player-instance.js\";\nimport {\n boardSpaceHostId,\n parseBoardSpaceHostId,\n} from \"../../shared/domain/board-space-host\";\nimport type {\n RuntimeTableRecord,\n ZoneDefinition,\n ZoneDefinitions,\n ZoneRef,\n} from \"../model\";\n\n/** Only state needed to admit zone hosts, memberships, and containment. */\nexport type ZoneTable = {\n readonly playerOrder: readonly string[];\n readonly zones: Readonly<\n Record<string, Readonly<Record<string, readonly string[]>>>\n >;\n readonly cards: Record<string, { id: string; cardSetId: string }>;\n readonly pieces: Record<\n string,\n { id: string; pieceTypeId: string; ownerId?: string | null }\n >;\n readonly tiles: Record<\n string,\n { id: string; tileTypeId: string; ownerId: string | null }\n >;\n readonly dice: Record<\n string,\n { id: string; dieTypeId: string; ownerId?: string | null }\n >;\n readonly componentLocations: Readonly<\n Record<string, RuntimeTableRecord[\"componentLocations\"][string]>\n >;\n readonly boards: import(\"../model/table.js\").RuntimeQueryTable[\"boards\"];\n};\n\nexport type ZoneHostTable = Pick<\n ZoneTable,\n \"playerOrder\" | \"boards\" | \"pieces\" | \"dice\" | \"tiles\"\n>;\n\nexport type ZoneInput = { readonly zoneId: string; readonly hostId?: string };\n\n/** The actual state graph, rather than identity syntax, owns host membership. */\nexport function enumerateZoneHosts(\n table: ZoneHostTable,\n definitions: TopologyDefinitions,\n definition: ZoneDefinition,\n): readonly string[] {\n if (\"scope\" in definition)\n return definition.scope === \"shared\" ? [\"table\"] : table.playerOrder;\n const attachment = definition.attachedTo;\n if (\"board\" in attachment) {\n const definition = definitions.boardDefinitions[attachment.board];\n return Object.entries(table.boards)\n .filter(([, board]) => board.baseId === attachment.board)\n .flatMap(([id]) =>\n attachment.space === undefined\n ? [id]\n : definition?.layout === \"generic\" &&\n Object.hasOwn(definition.spaces, attachment.space)\n ? [boardSpaceHostId(id, attachment.space)]\n : [],\n );\n }\n if (\"tileType\" in attachment)\n return Object.entries(table.tiles)\n .filter(([, tile]) => tile.tileTypeId === attachment.tileType)\n .flatMap(([id]) =>\n definitions.tileDefinitions[attachment.tileType]?.cells.some(\n (cell) => cell.id === attachment.cell,\n )\n ? [tileSpaceId(id, attachment.cell)]\n : [],\n );\n\n if (\"pieceType\" in attachment)\n return Object.values(table.pieces)\n .filter((piece) => piece.pieceTypeId === attachment.pieceType)\n .map((piece) => piece.id);\n return Object.values(table.dice)\n .filter((die) => die.dieTypeId === attachment.dieType)\n .map((die) => die.id);\n}\n\n/** Resolve one live host without scanning its inventory family. */\nexport function resolveZoneHost(\n table: ZoneHostTable,\n definitions: TopologyDefinitions,\n definition: ZoneDefinition,\n hostId: string,\n): { owner: string | null; shared: boolean; componentId: string | null } {\n const invalid = () => new Error(`Invalid zone host '${hostId}'.`);\n if (\"scope\" in definition) {\n if (definition.scope === \"shared\") {\n if (hostId !== \"table\") throw invalid();\n return { owner: null, shared: true, componentId: null };\n }\n if (!table.playerOrder.includes(hostId)) throw invalid();\n return { owner: hostId, shared: false, componentId: null };\n }\n const attachment = definition.attachedTo;\n if (\"board\" in attachment) {\n const spaceHost =\n attachment.space === undefined ? null : parseBoardSpaceHostId(hostId);\n const boardId =\n attachment.space === undefined ? hostId : spaceHost?.boardId;\n const board =\n boardId && Object.hasOwn(table.boards, boardId)\n ? table.boards[boardId]\n : undefined;\n const declared = Object.hasOwn(\n definitions.boardDefinitions,\n attachment.board,\n )\n ? definitions.boardDefinitions[attachment.board]\n : undefined;\n if (\n !board ||\n board.baseId !== attachment.board ||\n !declared ||\n (attachment.space !== undefined &&\n (declared.layout !== \"generic\" ||\n spaceHost?.spaceId !== attachment.space ||\n !Object.hasOwn(declared.spaces, attachment.space)))\n )\n throw invalid();\n const owner =\n declared.scope === \"perPlayer\"\n ? (parsePerPlayerInstanceId(boardId)?.playerId ?? null)\n : null;\n return { owner, shared: declared.scope === \"shared\", componentId: null };\n }\n if (\"tileType\" in attachment) {\n const parsed = parseTileSpaceId(hostId);\n const tile =\n parsed && Object.hasOwn(table.tiles, parsed.tileId)\n ? table.tiles[parsed.tileId]\n : undefined;\n const declared = Object.hasOwn(\n definitions.tileDefinitions,\n attachment.tileType,\n )\n ? definitions.tileDefinitions[attachment.tileType]\n : undefined;\n if (\n !parsed ||\n !tile ||\n tile.id !== parsed.tileId ||\n tile.tileTypeId !== attachment.tileType ||\n parsed.cellId !== attachment.cell ||\n !declared?.cells.some((cell) => cell.id === attachment.cell)\n )\n throw invalid();\n return { owner: tile.ownerId, shared: false, componentId: tile.id };\n }\n\n const component =\n \"pieceType\" in attachment\n ? Object.hasOwn(table.pieces, hostId) &&\n table.pieces[hostId].pieceTypeId === attachment.pieceType\n ? table.pieces[hostId]\n : undefined\n : Object.hasOwn(table.dice, hostId) &&\n table.dice[hostId].dieTypeId === attachment.dieType\n ? table.dice[hostId]\n : undefined;\n if (!component || component.id !== hostId) throw invalid();\n return {\n owner: component.ownerId ?? null,\n shared: false,\n componentId: hostId,\n };\n}\n\nexport function resolveZoneOwner(\n table: ZoneHostTable,\n definitions: TopologyDefinitions,\n definition: ZoneDefinition,\n hostId: string,\n): string | null {\n return resolveZoneHost(table, definitions, definition, hostId).owner;\n}\n\n/** Audience admission is independent from individual card face visibility. */\nexport function resolveZoneAccess(\n table: ZoneHostTable,\n definitions: TopologyDefinitions,\n definition: ZoneDefinition,\n hostId: string,\n viewerId: string,\n): boolean {\n if (definition.visibility === \"public\") {\n resolveZoneHost(table, definitions, definition, hostId);\n return true;\n }\n const { owner, shared } = resolveZoneHost(\n table,\n definitions,\n definition,\n hostId,\n );\n return (definition.visibility === \"hidden\" && shared) || owner === viewerId;\n}\n\n/** Validate the final parent graph before mutating any ordered memberships. */\nexport function assertContainmentAcyclic(\n table: ZoneTable,\n definitions: ZoneDefinitions,\n proposedLocations: Readonly<\n Record<string, RuntimeTableRecord[\"componentLocations\"][string]>\n > = {},\n): void {\n const parents = new Map<string, string>();\n for (const [componentId, current] of Object.entries(\n table.componentLocations,\n )) {\n const location = Object.hasOwn(proposedLocations, componentId)\n ? proposedLocations[componentId]\n : current;\n if (location.type !== \"InZone\") continue;\n const definition = Object.hasOwn(\n definitions.zoneDefinitions,\n location.zoneId,\n )\n ? definitions.zoneDefinitions[location.zoneId]\n : undefined;\n if (!definition) throw new Error(`Unknown zone '${location.zoneId}'.`);\n const host = resolveZoneHost(\n table,\n definitions,\n definition,\n location.hostId,\n );\n if (host.componentId !== null) parents.set(componentId, host.componentId);\n }\n const complete = new Set<string>();\n for (const start of parents.keys()) {\n const chain = new Set<string>();\n let cursor: string | undefined = start;\n while (cursor !== undefined && !complete.has(cursor)) {\n if (chain.has(cursor))\n throw new Error(`Containment cycle involving component '${cursor}'.`);\n chain.add(cursor);\n cursor = parents.get(cursor);\n }\n for (const id of chain) complete.add(id);\n }\n}\n\n/** Resolve one declared, instantiated host; never infer scope from state keys. */\ntype ResolvedZone = {\n ref: ZoneRef;\n definition: ZoneDefinition;\n ids: readonly string[];\n};\nexport type MutableZoneTable = Omit<ZoneTable, \"zones\"> & {\n readonly zones: Record<string, Record<string, string[]>>;\n};\nexport function resolveZone(\n table: MutableZoneTable,\n definitions: ZoneDefinitions,\n zone: ZoneInput,\n): Omit<ResolvedZone, \"ids\"> & { ids: string[] };\nexport function resolveZone(\n table: ZoneTable,\n definitions: ZoneDefinitions,\n zone: ZoneInput,\n): ResolvedZone;\nexport function resolveZone(\n table: ZoneTable,\n definitions: ZoneDefinitions,\n zone: ZoneInput,\n): {\n ref: ZoneRef;\n definition: ZoneDefinition;\n ids: readonly string[];\n} {\n const definition = Object.hasOwn(definitions.zoneDefinitions, zone.zoneId)\n ? definitions.zoneDefinitions[zone.zoneId]\n : undefined;\n if (!definition) throw new Error(`Unknown zone '${zone.zoneId}'.`);\n const hostId =\n zone.hostId ??\n (\"scope\" in definition && definition.scope === \"shared\"\n ? \"table\"\n : undefined);\n if (!hostId) throw new Error(`Invalid host '' for zone '${zone.zoneId}'.`);\n resolveZoneHost(table, definitions, definition, hostId);\n const hosts = Object.hasOwn(table.zones, zone.zoneId)\n ? table.zones[zone.zoneId]\n : undefined;\n const ids = hosts && Object.hasOwn(hosts, hostId) ? hosts[hostId] : undefined;\n if (!ids)\n throw new Error(\n `Zone '${zone.zoneId}' has no instantiated host '${hostId}'.`,\n );\n if (ids.length) assertZoneHostLive(table, definitions, definition, hostId);\n return { ref: { zoneId: zone.zoneId, hostId }, definition, ids };\n}\n\n/** Empty tile-cell hosts exist independently of placement; contents require a live cell. */\nexport function assertZoneHostLive(\n table: ZoneTable,\n definitions: TopologyDefinitions,\n definition: ZoneDefinition,\n hostId: string,\n): void {\n resolveZoneHost(table, definitions, definition, hostId);\n if (!(\"attachedTo\" in definition) || !(\"tileType\" in definition.attachedTo))\n return;\n const host = parseTileSpaceId(hostId);\n const location =\n host && Object.hasOwn(table.componentLocations, host.tileId)\n ? table.componentLocations[host.tileId]\n : undefined;\n if (location?.type !== \"OnBoard\")\n throw new Error(`Tile cell host '${hostId}' is not placed on a board.`);\n}\n\nexport function resolveZoneDestination(\n table: MutableZoneTable,\n definitions: ZoneDefinitions,\n zone: ZoneInput,\n) {\n const resolved = resolveZone(table, definitions, zone);\n assertZoneHostLive(\n table,\n definitions,\n resolved.definition,\n resolved.ref.hostId,\n );\n return resolved;\n}\n\nexport function assertComponent(table: ZoneTable, componentId: string): void {\n if (\n ![table.cards, table.pieces, table.dice, table.tiles].some((family) =>\n Object.hasOwn(family, componentId),\n )\n )\n throw new Error(`Unknown component '${componentId}'.`);\n if (!Object.hasOwn(table.componentLocations, componentId))\n throw new Error(`Missing location for component '${componentId}'.`);\n}\n\nexport function assertComponentAllowed(\n table: ZoneTable,\n definition: ZoneDefinition,\n componentId: string,\n): void {\n assertComponent(table, componentId);\n const card = Object.hasOwn(table.cards, componentId)\n ? table.cards[componentId]\n : undefined;\n if (\n card &&\n definition.allowedCardSetIds.length &&\n !definition.allowedCardSetIds.includes(card.cardSetId)\n )\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter this zone.`,\n );\n}\n\n/** Admission for externally restored state, including the reverse membership index. */\nexport function assertZoneConsistency(\n table: ZoneTable,\n definitions: ZoneDefinitions,\n): void {\n const components = new Set<string>();\n const families: readonly Record<string, { id: string }>[] = [\n table.cards,\n table.pieces,\n table.dice,\n table.tiles,\n ];\n for (const family of families)\n for (const [id, component] of Object.entries(family)) {\n if (isCardReferenceNamespace(id))\n throw new Error(\n `Component id '${id}' uses the reserved hidden-card namespace.`,\n );\n if (components.has(id))\n throw new Error(\n `Duplicate component id '${id}' across component families.`,\n );\n if (component.id !== id)\n throw new Error(`Component key '${id}' does not match its id.`);\n components.add(id);\n }\n const membership = new Set<string>();\n for (const [zoneId, hosts] of Object.entries(table.zones)) {\n const definition = Object.hasOwn(definitions.zoneDefinitions, zoneId)\n ? definitions.zoneDefinitions[zoneId]\n : undefined;\n if (!definition) throw new Error(`Unknown zone '${zoneId}'.`);\n const expected = enumerateZoneHosts(table, definitions, definition);\n if (\n Object.keys(hosts).length !== expected.length ||\n expected.some((host) => !Object.hasOwn(hosts, host))\n )\n throw new Error(\n `Zone '${zoneId}' hosts do not match its declared scope and roster.`,\n );\n for (const [hostId, ids] of Object.entries(hosts)) {\n resolveZone(table, definitions, { zoneId, hostId });\n for (const id of ids) {\n assertComponentAllowed(table, definition, id);\n if (membership.has(id))\n throw new Error(\n `Component '${id}' occurs in more than one zone membership.`,\n );\n membership.add(id);\n const location = table.componentLocations[id];\n if (\n location.type !== \"InZone\" ||\n location.zoneId !== zoneId ||\n location.hostId !== hostId\n )\n throw new Error(\n `Zone membership disagrees with location for '${id}'.`,\n );\n }\n }\n }\n for (const zoneId of Object.keys(definitions.zoneDefinitions))\n if (!Object.hasOwn(table.zones, zoneId))\n throw new Error(`Missing zone '${zoneId}'.`);\n for (const id of components)\n if (!Object.hasOwn(table.componentLocations, id))\n throw new Error(`Missing location for component '${id}'.`);\n const topologies = new Map(\n Object.keys(table.boards).map((boardId) => [\n boardId,\n deriveBoardTopology(table, definitions, boardId),\n ]),\n );\n for (const [id, location] of Object.entries(table.componentLocations)) {\n if (location.type === \"OnBoard\") {\n if (\n !Object.hasOwn(table.tiles, id) ||\n !Object.hasOwn(table.boards, location.boardId)\n )\n throw new Error(\n `OnBoard requires a tile and a current board for '${id}'.`,\n );\n } else if (\n location.type === \"OnSpace\" ||\n location.type === \"OnEdge\" ||\n location.type === \"OnVertex\"\n ) {\n if (Object.hasOwn(table.tiles, id))\n throw new Error(\"Tiles require OnBoard placement.\");\n const board = topologies.get(location.boardId);\n if (!board) throw new Error(`Unknown board '${location.boardId}'.`);\n const exists =\n location.type === \"OnSpace\"\n ? Object.hasOwn(board.spaces, location.spaceId)\n : board.layout !== \"generic\" &&\n (location.type === \"OnEdge\"\n ? board.edges.some((edge) => edge.id === location.edgeId)\n : board.vertices.some(\n (vertex) => vertex.id === location.vertexId,\n ));\n if (!exists)\n throw new Error(\n `Component '${id}' references an absent board element.`,\n );\n }\n if (\n Object.hasOwn(table.tiles, id) &&\n location.type !== \"Detached\" &&\n location.type !== \"InZone\" &&\n location.type !== \"OnBoard\"\n )\n throw new Error(\n \"Tiles may only be detached, in public zones, or placed on a compatible board.\",\n );\n if (\n location.type === \"InZone\" &&\n location.playedBy !== null &&\n !table.playerOrder.includes(location.playedBy)\n )\n throw new Error(`Inactive playedBy player for component '${id}'.`);\n if (!components.has(id))\n throw new Error(`Unknown located component '${id}'.`);\n if (location.type === \"InZone\" && !membership.has(id))\n throw new Error(`Missing zone membership for '${id}'.`);\n }\n assertContainmentAcyclic(table, definitions);\n}\n","import { requireLookup } from \"../../shared/lookup.js\";\nimport type {\n CardCollection,\n ViewCardOfTable,\n} from \"../../shared/domain/cards.js\";\nimport type { CardIdOfTable, RuntimeQueryTable } from \"../model\";\nimport { enumerateZoneHosts, resolveZone, type ZoneInput } from \"./zones\";\nimport type { ZoneDefinitions } from \"../model\";\n\nexport function getZoneComponents(\n table: RuntimeQueryTable,\n definitions: ZoneDefinitions,\n zone: ZoneInput,\n): readonly string[] {\n return [...resolveZone(table, definitions, zone).ids];\n}\nexport function getZones(\n table: RuntimeQueryTable,\n definitions: ZoneDefinitions,\n zoneId: string,\n): Readonly<Record<string, readonly string[]>> {\n const definition = Object.hasOwn(definitions.zoneDefinitions, zoneId)\n ? definitions.zoneDefinitions[zoneId]\n : undefined;\n if (!definition) throw new Error(`Unknown zone '${zoneId}'.`);\n return Object.fromEntries(\n enumerateZoneHosts(table, definitions, definition).map((hostId) => [\n hostId,\n getZoneComponents(table, definitions, { zoneId, hostId }),\n ]),\n );\n}\nexport function getZoneCardCollection(\n table: RuntimeQueryTable,\n definitions: ZoneDefinitions,\n zone: ZoneInput,\n): CardCollection<string, ViewCardOfTable<RuntimeQueryTable, string>> {\n const cardIds = getZoneComponents(table, definitions, zone).filter((id) =>\n Object.hasOwn(table.cards, id),\n );\n return {\n cardIds,\n cardsById: Object.fromEntries(\n cardIds.map((id) => [id, getCard(table, id)]),\n ),\n };\n}\n\nexport function getCard<\n Table extends RuntimeQueryTable,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): ViewCardOfTable<Table, CardId> {\n const card = requireLookup(\n table.cards[cardId],\n \"Card\",\n cardId,\n ) as Table[\"cards\"][CardId];\n\n return {\n id: card.id,\n cardType: card.cardType,\n name: card.name,\n text: card.text,\n frontImage: card.frontImage,\n backImage: card.backImage,\n properties: card.properties,\n } as ViewCardOfTable<Table, CardId>;\n}\n\nexport function getCardsById<\n Table extends RuntimeQueryTable,\n const CardIds extends readonly CardIdOfTable<NoInfer<Table>>[],\n>(\n table: Table,\n cardIds: CardIds,\n): Readonly<{\n [Id in CardIds[number]]: ViewCardOfTable<Table, Id>;\n}> {\n return Object.fromEntries(\n cardIds.map((cardId) => [cardId, getCard(table, cardId)]),\n );\n}\n\nexport function getCardOwner<\n Table extends RuntimeQueryTable,\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 RuntimeQueryTable,\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","import type { RuntimeComponentLocation, RuntimeQueryTable } from \"../model\";\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\nexport function orderedComponentIdsForLocation(\n table: RuntimeQueryTable,\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","import {\n createBoardTopologyCache,\n type BoardTopology,\n type GenericBoardTopology,\n type BoardSpace,\n type HexSpace,\n type SquareSpace,\n type HexBoardTopology,\n type SquareBoardTopology,\n type TiledBoardTopology,\n} from \"../../shared/board-topology.js\";\nimport {\n createHexTopology,\n createHexTopologyCache,\n} from \"../../shared/hex-board.js\";\nimport type { TopologyDefinitions } from \"../../shared/domain/topology-definitions.js\";\nimport type { BoardTopologyOf } from \"../model/topology.js\";\nimport type {\n BoardIdOfTable,\n ComponentIdOfTable,\n RuntimeQueryTable,\n} from \"../model\";\nimport { orderedComponentIdsForLocation } from \"./internal\";\n\nconst geometryOf = createHexTopologyCache();\nconst topologyOf = createBoardTopologyCache();\nexport function getBoard(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n) {\n return topologyOf(table, definitions, boardId);\n}\nexport function getHexBoard(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n): HexBoardTopology {\n const board = getBoard(table, definitions, boardId);\n if (board.layout !== \"hex\") throw new Error(`Board '${boardId}' is not hex.`);\n return board;\n}\nexport function getSquareBoard(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n): SquareBoardTopology {\n const board = getBoard(table, definitions, boardId);\n if (board.layout !== \"square\")\n throw new Error(`Board '${boardId}' is not square.`);\n return board;\n}\nexport function getTiledBoard(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n): TiledBoardTopology {\n const board = getBoard(table, definitions, boardId);\n if (board.layout === \"generic\")\n throw new Error(`Board '${boardId}' is not tiled.`);\n return board;\n}\nfunction requireSpace(board: HexBoardTopology, id: string): HexSpace;\nfunction requireSpace(board: SquareBoardTopology, id: string): SquareSpace;\nfunction requireSpace(board: GenericBoardTopology, id: string): BoardSpace;\nfunction requireSpace(\n board: BoardTopology,\n id: string,\n): BoardSpace | HexSpace | SquareSpace;\nfunction requireSpace(\n board: BoardTopology,\n id: string,\n): BoardSpace | HexSpace | SquareSpace {\n if (!Object.hasOwn(board.spaces, id))\n throw new Error(`Unknown space '${id}' on board '${board.id}'.`);\n return board.spaces[id];\n}\nexport function getSpace(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n spaceId: string,\n) {\n return requireSpace(getBoard(table, definitions, boardId), spaceId);\n}\nexport function getHexSpace(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n spaceId: string,\n) {\n return requireSpace(getHexBoard(table, definitions, boardId), spaceId);\n}\nexport function getSquareSpace(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n spaceId: string,\n) {\n return requireSpace(getSquareBoard(table, definitions, boardId), spaceId);\n}\nexport function getHexSpaceAt(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n q: number,\n r: number,\n) {\n return (\n Object.values(getHexBoard(table, definitions, boardId).spaces).find(\n (space) => space.q === q && space.r === r,\n ) ?? null\n );\n}\nexport function getSquareSpaceAt(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n row: number,\n col: number,\n) {\n return (\n Object.values(getSquareBoard(table, definitions, boardId).spaces).find(\n (space) => space.row === row && space.col === col,\n ) ?? null\n );\n}\nexport function getEdge(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n edgeId: string,\n) {\n const edge = getTiledBoard(table, definitions, boardId).edges.find(\n (edge) => edge.id === edgeId,\n );\n if (!edge) throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n return edge;\n}\nexport function getVertex(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n vertexId: string,\n) {\n const vertex = getTiledBoard(table, definitions, boardId).vertices.find(\n (vertex) => vertex.id === vertexId,\n );\n if (!vertex)\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n return vertex;\n}\nexport function getSpaceEdges(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n spaceId: string,\n) {\n const board = getTiledBoard(table, definitions, boardId);\n requireSpace(board, spaceId);\n return board.edges\n .filter((edge) => edge.spaceIds.includes(spaceId))\n .map((edge) => edge.id);\n}\nexport function getSpaceVertices(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n spaceId: string,\n) {\n const board = getTiledBoard(table, definitions, boardId);\n requireSpace(board, spaceId);\n return board.vertices\n .filter((vertex) => vertex.spaceIds.includes(spaceId))\n .map((vertex) => vertex.id);\n}\nexport function getIncidentEdges(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n vertexId: string,\n) {\n return [...getVertex(table, definitions, boardId, vertexId).edgeIds];\n}\nexport function getIncidentVertices(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n edgeId: string,\n) {\n return [...getEdge(table, definitions, boardId, edgeId).vertexIds];\n}\nfunction relatedSpaces(board: BoardTopology, spaceId: string, typeId: string) {\n requireSpace(board, spaceId);\n return [\n ...new Set(\n board.relations.flatMap((relation) =>\n relation.typeId !== typeId\n ? []\n : relation.fromSpaceId === spaceId\n ? [relation.toSpaceId]\n : !relation.directed && relation.toSpaceId === spaceId\n ? [relation.fromSpaceId]\n : [],\n ),\n ),\n ];\n}\nexport function getRelatedSpaces(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n spaceId: string,\n typeId: string,\n) {\n return relatedSpaces(getBoard(table, definitions, boardId), spaceId, typeId);\n}\nfunction squareNeighbors(\n board: SquareBoardTopology,\n id: string,\n options: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" } = {},\n) {\n const space = requireSpace(board, id);\n return Object.values(board.spaces)\n .filter((candidate) => {\n const x = Math.abs(candidate.col - space.col),\n y = Math.abs(candidate.row - space.row);\n return options.mode === \"diagonal\"\n ? x === 1 && y === 1\n : options.mode === \"all\"\n ? Math.max(x, y) === 1\n : x + y === 1;\n })\n .map((space) => space.id);\n}\nfunction neighbors(board: BoardTopology, id: string): string[] {\n requireSpace(board, id);\n if (board.layout === \"hex\")\n return geometryOf({\n ...board,\n spaces: Object.values(board.spaces),\n }).neighbors(id);\n if (board.layout === \"square\") return squareNeighbors(board, id);\n return relatedSpaces(board, id, \"adjacent\");\n}\nexport function getAdjacentSpaces(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n id: string,\n) {\n return neighbors(getBoard(table, definitions, boardId), id);\n}\nfunction distance(board: BoardTopology, from: string, to: string): number {\n requireSpace(board, from);\n requireSpace(board, to);\n const queue = [from],\n distances = new Map([[from, 0]]);\n for (let index = 0; index < queue.length; index++) {\n const id = queue[index],\n value = distances.get(id)!;\n if (id === to) return value;\n for (const next of neighbors(board, id))\n if (!distances.has(next)) {\n distances.set(next, value + 1);\n queue.push(next);\n }\n }\n return Number.POSITIVE_INFINITY;\n}\nexport function getSpaceDistance(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n from: string,\n to: string,\n) {\n return distance(getBoard(table, definitions, boardId), from, to);\n}\nexport function getSquareNeighbors(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n id: string,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n) {\n return squareNeighbors(\n getSquareBoard(table, definitions, boardId),\n id,\n options,\n );\n}\nexport function getSquareDistance(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n from: string,\n to: string,\n options: { metric?: \"manhattan\" | \"chebyshev\" } = {},\n) {\n const board = getSquareBoard(table, definitions, boardId),\n a = requireSpace(board, from),\n b = requireSpace(board, to);\n const x = Math.abs(a.col - b.col),\n y = Math.abs(a.row - b.row);\n return options.metric === \"chebyshev\" ? Math.max(x, y) : x + y;\n}\nexport function getBoardsByTypeId(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n typeId: string,\n) {\n return Object.keys(table.boards).filter(\n (id) => getBoard(table, definitions, id).typeId === typeId,\n );\n}\nexport function getSpacesByTypeId(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n typeId: string,\n) {\n return Object.values(getBoard(table, definitions, boardId).spaces)\n .filter((space) => space.typeId === typeId)\n .map((space) => space.id);\n}\nexport function getEdgesByTypeId(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n typeId: string,\n) {\n return getTiledBoard(table, definitions, boardId)\n .edges.filter((edge) => edge.typeId === typeId)\n .map((edge) => edge.id);\n}\nexport function getVerticesByTypeId(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n typeId: string,\n) {\n return getTiledBoard(table, definitions, boardId)\n .vertices.filter((vertex) => vertex.typeId === typeId)\n .map((vertex) => vertex.id);\n}\nexport function getComponentsOnSpace(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n spaceId: string,\n) {\n getSpace(table, definitions, boardId, spaceId);\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnSpace\" &&\n location.boardId === boardId &&\n location.spaceId === spaceId,\n );\n}\nexport function getComponentsOnEdge(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n edgeId: string,\n) {\n getEdge(table, definitions, boardId, edgeId);\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n );\n}\nexport function getComponentsOnVertex(\n table: RuntimeQueryTable,\n definitions: TopologyDefinitions,\n boardId: string,\n vertexId: string,\n) {\n getVertex(table, definitions, boardId, vertexId);\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n );\n}\nexport function bindBoardQueries<\n Table extends RuntimeQueryTable,\n Definitions extends TopologyDefinitions,\n BoardId extends BoardIdOfTable<Table>,\n>(\n table: Table,\n definitions: Definitions,\n boardId: BoardId,\n): BoundBoardQueries<\n BoardTopologyOf<Table, Definitions, BoardId>,\n ComponentIdOfTable<Table>\n> {\n const state = getBoard(table, definitions, boardId);\n const common = {\n state,\n space: (id: string) => requireSpace(state, id),\n spacesByType: (typeId: string) =>\n Object.values(state.spaces)\n .filter((space) => space.typeId === typeId)\n .map((space) => space.id),\n relatedSpaces: (id: string, typeId: string) =>\n relatedSpaces(state, id, typeId),\n neighbors: (id: string) => neighbors(state, id),\n distance: (from: string, to: string) => distance(state, from, to),\n spaceOccupants: (id: string) =>\n getComponentsOnSpace(table, definitions, boardId, id),\n };\n let result: unknown = common;\n if (state.layout === \"hex\") {\n const {\n edgesOf: spaceEdges,\n verticesOf: spaceVertices,\n incidentEdges: edgesOf,\n incidentVertices: verticesOf,\n ...geometry\n } = geometryOf({ ...state, spaces: Object.values(state.spaces) });\n result = {\n ...common,\n ...geometry,\n spaceEdges,\n spaceVertices,\n edgesOf,\n verticesOf,\n };\n } else if (state.layout === \"square\") {\n result = {\n ...common,\n edgesOf: (id: string) =>\n getIncidentEdges(table, definitions, boardId, id),\n verticesOf: (id: string) =>\n getIncidentVertices(table, definitions, boardId, id),\n spaceEdges: (id: string) =>\n getSpaceEdges(table, definitions, boardId, id),\n spaceVertices: (id: string) =>\n getSpaceVertices(table, definitions, boardId, id),\n spacesAt: (id: string) =>\n getVertex(table, definitions, boardId, id).spaceIds,\n spacesAlong: (id: string) =>\n getEdge(table, definitions, boardId, id).spaceIds,\n neighbors: (\n id: string,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ) => squareNeighbors(state, id, options),\n distance: (\n from: string,\n to: string,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ) => getSquareDistance(table, definitions, boardId, from, to, options),\n };\n }\n\n return result as BoundBoardQueries<\n BoardTopologyOf<Table, Definitions, BoardId>,\n ComponentIdOfTable<Table>\n >;\n}\ntype SpaceType<Space> = Space extends { typeId: infer Type }\n ? Extract<Type, string>\n : Space extends { typeId?: infer Type }\n ? Extract<Type, string>\n : never;\ntype SpaceId<Board extends BoardTopology> = keyof Board[\"spaces\"] & string;\ntype CommonBoardQueries<\n Board extends BoardTopology,\n ComponentId extends string,\n> = {\n state: Board;\n space<Id extends SpaceId<Board>>(id: Id): Board[\"spaces\"][Id];\n spacesByType(\n id: SpaceType<Board[\"spaces\"][keyof Board[\"spaces\"]]>,\n ): SpaceId<Board>[];\n relatedSpaces(\n id: SpaceId<Board>,\n typeId: Board[\"relations\"][number][\"typeId\"],\n ): SpaceId<Board>[];\n neighbors(id: SpaceId<Board>): SpaceId<Board>[];\n distance(from: SpaceId<Board>, to: SpaceId<Board>): number;\n spaceOccupants(id: SpaceId<Board>): ComponentId[];\n};\ntype HexQueries<Board extends BoardTopology> = ReturnType<\n typeof createHexTopology<Extract<Board[\"id\"], string>, SpaceId<Board>>\n>;\nexport type BoundBoardQueries<\n Board extends BoardTopology,\n ComponentId extends string,\n> = CommonBoardQueries<Board, ComponentId> &\n (Board extends { layout: \"hex\" }\n ? Omit<\n HexQueries<Board>,\n \"edgesOf\" | \"verticesOf\" | \"incidentEdges\" | \"incidentVertices\"\n > & {\n spaceEdges: HexQueries<Board>[\"edgesOf\"];\n spaceVertices: HexQueries<Board>[\"verticesOf\"];\n edgesOf: HexQueries<Board>[\"incidentEdges\"];\n verticesOf: HexQueries<Board>[\"incidentVertices\"];\n }\n : Board extends {\n layout: \"square\";\n edges: readonly { id: infer EdgeId extends string }[];\n vertices: readonly { id: infer VertexId extends string }[];\n }\n ? {\n edgesOf(id: VertexId): EdgeId[];\n verticesOf(id: EdgeId): VertexId[];\n spaceEdges(id: SpaceId<Board>): EdgeId[];\n spaceVertices(id: SpaceId<Board>): VertexId[];\n spacesAt(id: VertexId): SpaceId<Board>[];\n spacesAlong(id: EdgeId): SpaceId<Board>[];\n neighbors(\n id: SpaceId<Board>,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ): SpaceId<Board>[];\n distance(\n from: SpaceId<Board>,\n to: SpaceId<Board>,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ): number;\n }\n : unknown);\n","import type { RuntimeTableRecord } from \"../model\";\n\nlet cloneRuntimeTableCallCount = 0;\n\nexport function resetCloneRuntimeTableCallCount(): void {\n cloneRuntimeTableCallCount = 0;\n}\n\nexport function getCloneRuntimeTableCallCount(): number {\n return cloneRuntimeTableCallCount;\n}\n\nexport function cloneRuntimeTable<Table extends RuntimeTableRecord>(\n table: Table,\n): Table {\n cloneRuntimeTableCallCount += 1;\n return {\n ...table,\n zones: Object.fromEntries(\n Object.entries(table.zones).map(([zoneId, hosts]) => [\n zoneId,\n Object.fromEntries(\n Object.entries(hosts).map(([hostId, ids]) => [hostId, [...ids]]),\n ),\n ]),\n ),\n tiles: structuredClone(table.tiles),\n pieces: Object.fromEntries(\n Object.entries(table.pieces).map(([pieceId, piece]) => [\n pieceId,\n { ...piece },\n ]),\n ),\n componentLocations: { ...table.componentLocations },\n ownerOfCard: { ...table.ownerOfCard },\n visibility: { ...table.visibility },\n resources: Object.fromEntries(\n table.playerOrder.map((playerId) => [\n playerId,\n { ...table.resources[playerId] },\n ]),\n ),\n boards: structuredClone(table.boards),\n dice: Object.fromEntries(\n Object.entries(table.dice).map(([dieId, die]) => [dieId, { ...die }]),\n ),\n };\n}\n","import type { ZoneDefinitions } from \"../model/table.js\";\nimport { requireLookup } from \"../../shared/lookup.js\";\nimport type {\n BoardIdOfTable,\n ComponentLocationOfTable,\n ComponentIdOfTable,\n ResolvedEdgeLocation,\n ResolvedSpaceLocation,\n ResolvedVertexLocation,\n ResolvedZoneLocation,\n RuntimeQueryTable,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"../model\";\nimport {\n getBoard,\n getEdge,\n getSpace,\n getTiledBoard,\n getVertex,\n} from \"./board-queries\";\n\nexport function getComponentLocation<\n Table extends RuntimeQueryTable,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ComponentLocationOfTable<Table, ComponentId> {\n return requireLookup(\n table.componentLocations[componentId],\n \"Component location\",\n componentId,\n ) as ComponentLocationOfTable<Table, ComponentId>;\n}\n\nexport function getComponentZoneLocation<\n Table extends RuntimeQueryTable,\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 hostId: location.hostId,\n location,\n } as ResolvedZoneLocation<Table, ComponentId>;\n}\n\nexport function getComponentSpaceLocation<\n Table extends RuntimeQueryTable,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n Definitions extends ZoneDefinitions,\n>(\n table: Table,\n definitions: Definitions,\n componentId: ComponentId,\n): ResolvedSpaceLocation<Table, ComponentId, Definitions> | 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;\n return {\n componentId,\n boardId,\n board: getBoard(table, definitions, boardId),\n spaceId,\n space: getSpace(table, definitions, boardId, spaceId),\n location,\n } as ResolvedSpaceLocation<Table, ComponentId, Definitions>;\n}\n\nexport function getComponentEdgeLocation<\n Table extends RuntimeQueryTable,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n Definitions extends ZoneDefinitions,\n>(\n table: Table,\n definitions: Definitions,\n componentId: ComponentId,\n): ResolvedEdgeLocation<Table, ComponentId, Definitions> | 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, definitions, boardId),\n edgeId,\n edge: getEdge(table, definitions, boardId, edgeId),\n location,\n } as ResolvedEdgeLocation<Table, ComponentId, Definitions>;\n}\n\nexport function getComponentVertexLocation<\n Table extends RuntimeQueryTable,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n Definitions extends ZoneDefinitions,\n>(\n table: Table,\n definitions: Definitions,\n componentId: ComponentId,\n): ResolvedVertexLocation<Table, ComponentId, Definitions> | 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, definitions, boardId),\n vertexId,\n vertex: getVertex(table, definitions, boardId, vertexId),\n location,\n } as ResolvedVertexLocation<Table, ComponentId, Definitions>;\n}\n","export function assertNonNegativeSafeInteger(\n value: number,\n label: string,\n): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative safe integer.`);\n }\n}\n","import type {\n PlayerIdOfTable,\n ResourceBalancesOfTable,\n RuntimeTableRecord,\n RuntimeQueryTable,\n} from \"../model\";\n\nimport { assertNonNegativeSafeInteger } from \"./numeric\";\n\nexport function getPlayerOrder<Table extends RuntimeQueryTable>(\n table: Table,\n): Table[\"playerOrder\"] {\n return table.playerOrder;\n}\n\nexport function getPlayerResources<Table extends RuntimeQueryTable>(\n table: Table,\n playerId: PlayerIdOfTable<NoInfer<Table>>,\n): ResourceBalancesOfTable<Table> {\n return table.resources[playerId] 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 RuntimeQueryTable>(\n table: Table,\n playerId: string,\n resourceId: string,\n): number {\n const playerResources = table.resources[playerId];\n if (!playerResources) return 0;\n const value = (playerResources as Record<string, unknown>)[resourceId];\n if (value === undefined) return 0;\n if (typeof value !== \"number\") {\n throw new Error(\n `Resource '${resourceId}' balance must be a non-negative safe integer.`,\n );\n }\n assertNonNegativeSafeInteger(value, `Resource '${resourceId}' balance`);\n return value;\n}\n\n/**\n * Sum of every resource amount for a player (e.g. \"total cards in hand\"\n * games). Skips omitted keys but rejects malformed stored balances.\n */\nexport function getPlayerResourceTotal<Table extends RuntimeQueryTable>(\n table: Table,\n playerId: string,\n): number {\n const playerResources = table.resources[playerId];\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 (value === undefined) continue;\n if (typeof value !== \"number\") {\n throw new Error(\n `Resource '${key}' balance must be a non-negative safe integer.`,\n );\n }\n assertNonNegativeSafeInteger(value, `Resource '${key}' balance`);\n const nextTotal = total + value;\n assertNonNegativeSafeInteger(nextTotal, \"Resource total\");\n total = nextTotal;\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 RuntimeQueryTable>(\n table: Table,\n playerId: string,\n): PlayerIdOfTable<Table> | null {\n // eslint-disable-next-line no-restricted-syntax -- The table roster owns PlayerIdOfTable; reading its seating order preserves that manifest-specific player ID union.\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 / zero entries.\n * Shared by the resource mutation helpers below.\n */\nfunction resourceEntries(\n amounts: Readonly<Record<string, number | undefined>>,\n): [resourceId: string, amount: number][] {\n const entries: [string, number][] = [];\n for (const resourceId of Object.keys(amounts)) {\n const amount = amounts[resourceId];\n if (amount === undefined || amount === 0) continue;\n if (typeof amount !== \"number\") {\n throw new Error(\n `Resource '${resourceId}' amount must be a non-negative safe integer.`,\n );\n }\n assertNonNegativeSafeInteger(amount, `Resource '${resourceId}' amount`);\n entries.push([resourceId, amount]);\n }\n return entries;\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 RuntimeQueryTable>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): boolean {\n for (const [resourceId, required] of resourceEntries(amounts)) {\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 RuntimeQueryTable>(\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, required] of resourceEntries(amounts)) {\n const have = getPlayerResourceAmount(table, playerId, resourceId);\n if (have < required) missing[resourceId] = required - have;\n }\n return missing;\n}\n\nfunction writePlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n nextForPlayer: Record<string, number>,\n): void {\n table.resources = {\n ...table.resources,\n [playerId]: nextForPlayer,\n };\n}\n\nexport function addPlayerResourcesInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n const prev = (table.resources[playerId] ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n for (const [resourceId, amount] of resourceEntries(amounts)) {\n const nextAmount =\n getPlayerResourceAmount(table, playerId, resourceId) + amount;\n assertNonNegativeSafeInteger(\n nextAmount,\n `Resource '${resourceId}' balance`,\n );\n next[resourceId] = nextAmount;\n }\n writePlayerResources(table, playerId, next);\n}\n\nexport function spendPlayerResourcesInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n const entries = resourceEntries(amounts);\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 = (table.resources[playerId] ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n for (const [resourceId, amount] of entries) {\n const nextAmount =\n getPlayerResourceAmount(table, playerId, resourceId) - amount;\n assertNonNegativeSafeInteger(\n nextAmount,\n `Resource '${resourceId}' balance`,\n );\n next[resourceId] = nextAmount;\n }\n writePlayerResources(table, playerId, next);\n}\n\nexport function transferPlayerResourcesInPlace<\n Table extends RuntimeTableRecord,\n>(\n table: Table,\n fromPlayerId: string,\n toPlayerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n const entries = resourceEntries(amounts);\n if (!canAffordResources(table, fromPlayerId, amounts)) {\n const missing = getMissingResources(table, fromPlayerId, amounts);\n throw new Error(\n `spendPlayerResources: player '${fromPlayerId}' cannot afford ${JSON.stringify(\n missing,\n )}. Check canAfford in your validate step first.`,\n );\n }\n if (fromPlayerId === toPlayerId) return;\n\n const fromPrev = (table.resources[fromPlayerId] ?? {}) as Record<\n string,\n number\n >;\n const toPrev = (table.resources[toPlayerId] ?? {}) as Record<string, number>;\n const fromNext: Record<string, number> = { ...fromPrev };\n const toNext: Record<string, number> = { ...toPrev };\n\n for (const [resourceId, amount] of entries) {\n const sourceBalance =\n getPlayerResourceAmount(table, fromPlayerId, resourceId) - amount;\n const destinationBalance =\n getPlayerResourceAmount(table, toPlayerId, resourceId) + amount;\n assertNonNegativeSafeInteger(\n sourceBalance,\n `Resource '${resourceId}' balance`,\n );\n assertNonNegativeSafeInteger(\n destinationBalance,\n `Resource '${resourceId}' balance`,\n );\n fromNext[resourceId] = sourceBalance;\n toNext[resourceId] = destinationBalance;\n }\n\n writePlayerResources(table, fromPlayerId, fromNext);\n writePlayerResources(table, toPlayerId, toNext);\n}\n\nexport function setPlayerResourceInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n amount: number,\n): void {\n assertNonNegativeSafeInteger(amount, `Resource '${resourceId}' amount`);\n const prev = (table.resources[playerId] ?? {}) as Record<string, number>;\n writePlayerResources(table, playerId, {\n ...prev,\n [resourceId]: amount,\n });\n}\n","import { getPublicTileFootprint } from \"../../shared/tile-appearance.js\";\nimport type { RuntimeTableRecord, ZoneDefinitions } from \"../model\";\nimport { deriveBoardTopology } from \"../../shared/board-topology\";\nimport {\n TilePlacementSchema,\n type TilePlacement,\n} from \"../../shared/domain/tile-placement\";\nimport { parseTileSpaceId } from \"../../shared/domain/tile-space\";\nimport { resolveZone } from \"./zones\";\nimport { encodeCanonicalPluginRuntimeJson } from \"../../shared/protocol/json\";\n\nexport type TilePlacementAt =\n | Omit<\n Extract<TilePlacement, { layout: \"hex\" }>,\n \"type\" | \"boardId\" | \"layout\"\n >\n | Omit<\n Extract<TilePlacement, { layout: \"square\" }>,\n \"type\" | \"boardId\" | \"layout\"\n >;\n\ntype TileMutation = {\n table: RuntimeTableRecord;\n definitions: ZoneDefinitions;\n boardId: string;\n tileId: string;\n};\n\nfunction assertTile(table: RuntimeTableRecord, tileId: string): void {\n if (!Object.hasOwn(table.tiles, tileId))\n throw new Error(`Unknown tile '${tileId}'.`);\n}\n\n/** Stable cell contents may follow a same-board move; world occupants cannot. */\nfunction assertDependencies(\n table: RuntimeTableRecord,\n definitions: ZoneDefinitions,\n tileId: string,\n sameBoardMove: boolean,\n): void {\n const location = Object.hasOwn(table.componentLocations, tileId)\n ? table.componentLocations[tileId]\n : undefined;\n if (location?.type !== \"OnBoard\") return;\n const topology = deriveBoardTopology(table, definitions, location.boardId);\n if (topology.layout === \"generic\")\n throw new Error(\"Tiles require a tiled board.\");\n const spaces = new Set<string>(\n Object.keys(topology.spaces).filter(\n (id) => parseTileSpaceId(id)?.tileId === tileId,\n ),\n );\n const edges = new Set<string>(\n topology.edges\n .filter((edge) => edge.spaceIds.some((id) => spaces.has(id)))\n .map((edge) => edge.id),\n );\n const vertices = new Set<string>(\n topology.vertices\n .filter((vertex) => vertex.spaceIds.some((id) => spaces.has(id)))\n .map((vertex) => vertex.id),\n );\n for (const [id, occupant] of Object.entries(table.componentLocations)) {\n if (!(\"boardId\" in occupant) || occupant.boardId !== location.boardId)\n continue;\n if (\n !sameBoardMove &&\n occupant.type === \"OnSpace\" &&\n spaces.has(occupant.spaceId)\n )\n throw new Error(`Tile '${tileId}' has cell occupant '${id}'.`);\n if (\n (occupant.type === \"OnEdge\" && edges.has(occupant.edgeId)) ||\n (occupant.type === \"OnVertex\" && vertices.has(occupant.vertexId))\n )\n throw new Error(`Tile '${tileId}' has world-element occupant '${id}'.`);\n }\n if (sameBoardMove) return;\n for (const [zoneId, hosts] of Object.entries(table.zones)) {\n const definition = definitions.zoneDefinitions[zoneId];\n if (\n !definition ||\n !(\"attachedTo\" in definition) ||\n !(\"tileType\" in definition.attachedTo)\n )\n continue;\n for (const [hostId, ids] of Object.entries(hosts)) {\n if (parseTileSpaceId(hostId)?.tileId === tileId && ids.length)\n throw new Error(\n `Tile '${tileId}' has nonempty attached zone '${zoneId}'.`,\n );\n }\n }\n if (\n topology.relations.some(\n (relation) =>\n spaces.has(relation.fromSpaceId) || spaces.has(relation.toSpaceId),\n )\n )\n throw new Error(`Tile '${tileId}' has incident relations.`);\n}\n\nfunction candidateWithLocation(\n table: RuntimeTableRecord,\n tileId: string,\n location: TilePlacement | { type: \"Detached\" },\n): RuntimeTableRecord {\n return {\n ...table,\n componentLocations: { ...table.componentLocations, [tileId]: location },\n };\n}\n\n/** Used by every outgoing component move, so no API bypasses removal dependencies. */\nexport function assertTileCanLeaveBoard(\n table: RuntimeTableRecord,\n definitions: ZoneDefinitions,\n tileId: string,\n): void {\n const source = Object.hasOwn(table.componentLocations, tileId)\n ? table.componentLocations[tileId]\n : undefined;\n if (source?.type !== \"OnBoard\") return;\n assertTile(table, tileId);\n assertDependencies(table, definitions, tileId, false);\n deriveBoardTopology(\n candidateWithLocation(table, tileId, { type: \"Detached\" }),\n definitions,\n source.boardId,\n );\n}\n\nexport function placeTileInPlace(\n options: TileMutation & { at: TilePlacementAt },\n): void {\n const { table, definitions, boardId, tileId, at } = options;\n assertTile(table, tileId);\n const board = Object.hasOwn(table.boards, boardId)\n ? table.boards[boardId]\n : undefined;\n const definition =\n board && Object.hasOwn(definitions.boardDefinitions, board.baseId)\n ? definitions.boardDefinitions[board.baseId]\n : undefined;\n if (!definition || definition.layout === \"generic\")\n throw new Error(\n `Tile placement requires a current tiled board '${boardId}'.`,\n );\n const placement = TilePlacementSchema.parse({\n ...at,\n type: \"OnBoard\",\n boardId,\n layout: definition.layout,\n });\n const source = Object.hasOwn(table.componentLocations, tileId)\n ? table.componentLocations[tileId]\n : undefined;\n if (!source) throw new Error(`Missing location for tile '${tileId}'.`);\n if (\n source.type !== \"Detached\" &&\n source.type !== \"InZone\" &&\n source.type !== \"OnBoard\"\n )\n throw new Error(`Invalid source location for tile '${tileId}'.`);\n const appearance = table.tiles[tileId].disclosure.appearance;\n if (appearance) getPublicTileFootprint(appearance, placement);\n const sameBoard = source.type === \"OnBoard\" && source.boardId === boardId;\n const candidate = candidateWithLocation(table, tileId, placement);\n deriveBoardTopology(candidate, definitions, boardId);\n // A validated identical placement does not move occupied world elements.\n if (\n sameBoard &&\n encodeCanonicalPluginRuntimeJson(source) ===\n encodeCanonicalPluginRuntimeJson(placement)\n )\n return;\n assertDependencies(table, definitions, tileId, sameBoard);\n if (source.type === \"OnBoard\" && !sameBoard)\n deriveBoardTopology(candidate, definitions, source.boardId);\n // Resolve and validate the old ordered membership before the first write.\n const sourceIds =\n source.type === \"InZone\"\n ? resolveZone(table, definitions, source).ids\n : null;\n if (sourceIds && sourceIds.filter((id) => id === tileId).length !== 1)\n throw new Error(`Zone membership disagrees with location for '${tileId}'.`);\n if (sourceIds) sourceIds.splice(sourceIds.indexOf(tileId), 1);\n table.componentLocations[tileId] = placement;\n}\n\nexport function removeTileInPlace(options: TileMutation): void {\n const { table, definitions, boardId, tileId } = options;\n assertTile(table, tileId);\n const source = Object.hasOwn(table.componentLocations, tileId)\n ? table.componentLocations[tileId]\n : undefined;\n if (source?.type !== \"OnBoard\" || source.boardId !== boardId)\n throw new Error(`Tile '${tileId}' is not placed on board '${boardId}'.`);\n assertTileCanLeaveBoard(table, definitions, tileId);\n table.componentLocations[tileId] = { type: \"Detached\" };\n}\n","import { resolveZone, assertComponent } from \"./zones\";\nimport type {\n BoardIdOfTable,\n ComponentIdOfTable,\n SpatialComponentIdOfTable,\n RuntimeTableRecord,\n ZoneDefinitions,\n SpaceIdOfTable,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"../model\";\nimport {\n getComponentsOnEdge,\n getComponentsOnSpace,\n getComponentsOnVertex,\n getEdge,\n getVertex,\n} from \"./board-queries\";\nimport { orderedComponentIdsForLocation } from \"./internal\";\nimport { assertTileCanLeaveBoard } from \"./tile-mutations\";\n\nfunction reindexSpaceOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n definitions: ZoneDefinitions,\n): void {\n getComponentsOnSpace(table, definitions, 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 reindexEdgeOccupants(\n table: RuntimeTableRecord,\n boardId: string,\n edgeId: string,\n): 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: RuntimeTableRecord,\n boardId: string,\n vertexId: string,\n): 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\nexport function removeComponentFromCurrentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId, definitions: ZoneDefinitions): void {\n assertComponent(table, componentId);\n const currentLocation = table.componentLocations[componentId];\n if (currentLocation?.type === \"OnBoard\")\n assertTileCanLeaveBoard(table, definitions, componentId);\n if (!currentLocation) {\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,\n definitions,\n );\n return;\n }\n\n if (currentLocation.type === \"InZone\") {\n const { ids } = resolveZone(table, definitions, currentLocation);\n if (!ids || ids.filter((id) => id === componentId).length !== 1)\n throw new Error(\n `Zone membership disagrees with location for '${componentId}'.`,\n );\n ids.splice(ids.indexOf(componentId), 1);\n delete table.componentLocations[componentId];\n return;\n }\n\n if (currentLocation.type === \"OnEdge\") {\n delete table.componentLocations[componentId];\n reindexEdgeOccupants(\n table,\n currentLocation.boardId,\n currentLocation.edgeId,\n );\n return;\n }\n\n if (currentLocation.type === \"OnVertex\") {\n delete table.componentLocations[componentId];\n reindexVertexOccupants(\n table,\n currentLocation.boardId,\n currentLocation.vertexId,\n );\n return;\n }\n\n delete table.componentLocations[componentId];\n}\n\nexport function moveComponentToSpaceInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends SpatialComponentIdOfTable<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 definitions: ZoneDefinitions,\n): void {\n if (Object.hasOwn(table.tiles, componentId))\n throw new Error(\n \"Tiles cannot use spatial component locations before board placement is supported.\",\n );\n const position = getComponentsOnSpace(\n table,\n definitions,\n boardId,\n spaceId,\n ).length;\n removeComponentFromCurrentLocation(table, componentId, definitions);\n table.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId,\n position,\n };\n}\n\nexport function moveComponentToDetachedInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId, definitions: ZoneDefinitions): void {\n removeComponentFromCurrentLocation(table, componentId, definitions);\n table.componentLocations[componentId] = { type: \"Detached\" };\n}\n\nexport function moveComponentToEdgeInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends SpatialComponentIdOfTable<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 definitions: ZoneDefinitions,\n): void {\n if (Object.hasOwn(table.tiles, componentId))\n throw new Error(\n \"Tiles cannot use spatial component locations before board placement is supported.\",\n );\n getEdge(table, definitions, boardId, edgeId);\n const position = getComponentsOnEdge(\n table,\n definitions,\n boardId,\n edgeId,\n ).length;\n removeComponentFromCurrentLocation(table, componentId, definitions);\n table.componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position,\n };\n}\n\nexport function moveComponentToVertexInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends SpatialComponentIdOfTable<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 definitions: ZoneDefinitions,\n): void {\n if (Object.hasOwn(table.tiles, componentId))\n throw new Error(\n \"Tiles cannot use spatial component locations before board placement is supported.\",\n );\n getVertex(table, definitions, boardId, vertexId);\n const position = getComponentsOnVertex(\n table,\n definitions,\n boardId,\n vertexId,\n ).length;\n removeComponentFromCurrentLocation(table, componentId, definitions);\n table.componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position,\n };\n}\n","import type { PositionTarget } from \"../../shared/position-target.js\";\nimport type { RuntimeTableRecord, ZoneDefinitions } from \"../model\";\nimport { removeComponentFromCurrentLocation } from \"./component-mutations\";\nimport { assertTileCanLeaveBoard } from \"./tile-mutations\";\nimport {\n assertContainmentAcyclic,\n assertComponent,\n assertComponentAllowed,\n resolveZone,\n resolveZoneDestination,\n type ZoneInput,\n} from \"./zones\";\nimport { assertNonNegativeSafeInteger } from \"./numeric\";\n\nexport type ZonePosition = \"top\" | \"bottom\" | number;\n\nfunction insertionIndex(\n position: ZonePosition | undefined,\n length: number,\n): number {\n if (position === undefined || position === \"bottom\") return length;\n if (position === \"top\") return 0;\n assertNonNegativeSafeInteger(position, \"Zone insertion position\");\n if (position > length)\n throw new Error(\"Zone insertion position exceeds its length.\");\n return position;\n}\n\nfunction validateSource(\n table: RuntimeTableRecord,\n definitions: ZoneDefinitions,\n id: string,\n): void {\n assertComponent(table, id);\n const source = table.componentLocations[id];\n if (source.type === \"OnBoard\")\n assertTileCanLeaveBoard(table, definitions, id);\n if (source.type === \"InZone\") {\n const { ids } = resolveZone(table, definitions, source);\n if (ids.filter((candidate) => candidate === id).length !== 1)\n throw new Error(`Zone membership disagrees with location for '${id}'.`);\n }\n}\n\nfunction place(\n table: RuntimeTableRecord,\n definitions: ZoneDefinitions,\n id: string,\n zone: ZoneInput,\n playedBy: string | null,\n): void {\n const { ref, definition } = resolveZone(table, definitions, zone);\n table.componentLocations[id] = { type: \"InZone\", ...ref, playedBy };\n if (Object.hasOwn(table.cards, id)) {\n table.visibility[id] = { faceUp: definition.visibility !== \"hidden\" };\n }\n}\n\nexport function moveComponentToZoneInPlace(options: {\n table: RuntimeTableRecord;\n definitions: ZoneDefinitions;\n componentId: string;\n to: ZoneInput;\n position?: ZonePosition;\n playedBy?: string | null;\n}): void {\n const { table, definitions, componentId } = options;\n const destination = resolveZoneDestination(table, definitions, options.to);\n assertComponentAllowed(table, destination.definition, componentId);\n validateSource(table, definitions, componentId);\n if (options.playedBy != null && !table.playerOrder.includes(options.playedBy))\n throw new Error(\"playedBy must name an active player.\");\n const source = table.componentLocations[componentId];\n const same =\n source.type === \"InZone\" &&\n source.zoneId === destination.ref.zoneId &&\n source.hostId === destination.ref.hostId;\n if (!same && destination.ids.includes(componentId))\n throw new Error(\n `Component '${componentId}' already occurs at the destination.`,\n );\n const index = insertionIndex(\n options.position,\n destination.ids.length - (same ? 1 : 0),\n );\n const playedBy =\n options.playedBy === undefined\n ? source.type === \"InZone\"\n ? source.playedBy\n : null\n : options.playedBy;\n assertContainmentAcyclic(table, definitions, {\n [componentId]: { type: \"InZone\", ...destination.ref, playedBy },\n });\n removeComponentFromCurrentLocation(table, componentId, definitions);\n destination.ids.splice(index, 0, componentId);\n if (same) {\n // Reordering keeps the existing face; only entering a zone applies its default.\n table.componentLocations[componentId] = { ...source, playedBy };\n } else {\n place(table, definitions, componentId, destination.ref, playedBy);\n }\n}\n\n/**\n * Inserts at a position input's point. The point counts the zone as it is\n * now, including the component itself when it is already there, so a later\n * point within the same zone lands one place earlier once it is lifted out.\n */\nexport function moveComponentToPositionInPlace(options: {\n table: RuntimeTableRecord;\n definitions: ZoneDefinitions;\n componentId: string;\n at: PositionTarget;\n playedBy?: string | null;\n}): void {\n const { table, definitions, componentId, at, playedBy } = options;\n const to = { zoneId: at.zoneId, hostId: at.hostId };\n const source = table.componentLocations[componentId];\n const from =\n source?.type === \"InZone\" &&\n source.zoneId === at.zoneId &&\n source.hostId === at.hostId\n ? resolveZone(table, definitions, to).ids.indexOf(componentId)\n : -1;\n moveComponentToZoneInPlace({\n table,\n definitions,\n componentId,\n to,\n position: from >= 0 && from < at.index ? at.index - 1 : at.index,\n playedBy,\n });\n}\n\nexport function dealComponentsInPlace(options: {\n table: RuntimeTableRecord;\n definitions: ZoneDefinitions;\n from: ZoneInput;\n to: ZoneInput;\n count: number;\n}): void {\n const { table, definitions } = options;\n assertNonNegativeSafeInteger(options.count, \"Deal count\");\n const source = resolveZone(table, definitions, options.from);\n const destination = resolveZoneDestination(table, definitions, options.to);\n if (\n source.ref.zoneId === destination.ref.zoneId &&\n source.ref.hostId === destination.ref.hostId\n )\n throw new Error(\"Deal source and destination must differ.\");\n const selected = source.ids.slice(0, options.count);\n for (const id of selected) {\n validateSource(table, definitions, id);\n const location = table.componentLocations[id];\n if (\n location.type !== \"InZone\" ||\n location.zoneId !== source.ref.zoneId ||\n location.hostId !== source.ref.hostId\n )\n throw new Error(`Source membership disagrees with location for '${id}'.`);\n assertComponentAllowed(table, destination.definition, id);\n if (destination.ids.includes(id))\n throw new Error(`Component '${id}' already occurs at destination.`);\n }\n if (new Set(selected).size !== selected.length)\n throw new Error(\"Duplicate source membership.\");\n assertContainmentAcyclic(\n table,\n definitions,\n Object.fromEntries(\n selected.map((id) => [\n id,\n { type: \"InZone\", ...destination.ref, playedBy: null },\n ]),\n ),\n );\n source.ids.splice(0, selected.length);\n destination.ids.push(...selected);\n for (const id of selected)\n place(table, definitions, id, destination.ref, null);\n}\n\nexport function rotateZoneInPlace(options: {\n table: RuntimeTableRecord;\n definitions: ZoneDefinitions;\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n componentIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n}): void {\n const { table, definitions, zoneId } = options;\n const definition = Object.hasOwn(definitions.zoneDefinitions, zoneId)\n ? definitions.zoneDefinitions[zoneId]\n : undefined;\n if (\n !definition ||\n !(\"scope\" in definition) ||\n definition.scope !== \"perPlayer\"\n )\n throw new Error(`Zone '${zoneId}' must have perPlayer scope.`);\n if (options.direction !== \"left\" && options.direction !== \"right\")\n throw new Error(\"Rotation direction must be left or right.\");\n if (\n options.position !== undefined &&\n options.position !== \"top\" &&\n options.position !== \"bottom\"\n )\n throw new Error(\"Rotation position must be top or bottom.\");\n const players = [...(options.players ?? table.playerOrder)];\n for (const hostId of Object.keys(options.componentIdsByPlayer ?? {})) {\n if (!players.includes(hostId))\n throw new Error(\n `Rotation selection host '${hostId}' is not a selected player.`,\n );\n }\n if (new Set(players).size !== players.length)\n throw new Error(\"Rotation players must be unique.\");\n const snapshots = players.map((hostId) => {\n const source = resolveZone(table, definitions, { zoneId, hostId });\n const selected = [\n ...(options.componentIdsByPlayer?.[hostId] ?? source.ids),\n ];\n if (new Set(selected).size !== selected.length)\n throw new Error(\"Rotation selections must be unique.\");\n for (const id of selected) {\n if (!source.ids.includes(id))\n throw new Error(`Component '${id}' is absent from rotation source.`);\n validateSource(table, definitions, id);\n const location = table.componentLocations[id];\n if (\n location.type !== \"InZone\" ||\n location.zoneId !== zoneId ||\n location.hostId !== hostId\n )\n throw new Error(\n `Rotation membership disagrees with location for '${id}'.`,\n );\n assertComponentAllowed(table, definition, id);\n }\n return {\n source,\n selected,\n remaining: source.ids.filter((id) => !selected.includes(id)),\n };\n });\n const proposed: RuntimeTableRecord[\"componentLocations\"] = {};\n snapshots.forEach(({ source }, index) => {\n const offset = options.direction === \"left\" ? -1 : 1;\n for (const id of snapshots[\n (index + offset + snapshots.length) % snapshots.length\n ].selected)\n proposed[id] = { type: \"InZone\", ...source.ref, playedBy: null };\n });\n assertContainmentAcyclic(table, definitions, proposed);\n snapshots.forEach(({ source, remaining }, index) => {\n const offset = options.direction === \"left\" ? -1 : 1;\n const additions =\n snapshots[(index + offset + snapshots.length) % snapshots.length]\n .selected;\n source.ids.splice(\n 0,\n source.ids.length,\n ...(options.position === \"top\"\n ? [...additions, ...remaining]\n : [...remaining, ...additions]),\n );\n for (const id of additions) place(table, definitions, id, source.ref, null);\n });\n}\n\nexport function flipCardInPlace(\n table: RuntimeTableRecord,\n cardId: string,\n faceUp: boolean,\n): void {\n if (!Object.hasOwn(table.cards, cardId))\n throw new Error(`Unknown card '${cardId}'.`);\n if (table.componentLocations[cardId]?.type !== \"InZone\")\n throw new Error(\"Only cards in zones can be flipped.\");\n table.visibility[cardId] = { ...table.visibility[cardId], faceUp };\n}\n","import {\n getZoneComponents,\n getZoneCardCollection,\n getZones,\n} from \"./table/zone-queries\";\nimport { requireLookup } from \"../shared/lookup.js\";\nimport { bindBoardQueries } from \"./table/board-queries\";\nimport type {\n ZoneDefinitions,\n TileIdOfTable,\n BoardIdOfTable,\n CardIdOfTable,\n ComponentDataOfTable,\n ComponentIdOfTable,\n RuntimeQueryTable,\n TableQueries,\n TableQueriesOfState,\n} from \"./model\";\nimport {\n getCard,\n getCardsById,\n getCardOwner,\n getCardVisibility,\n getComponentEdgeLocation,\n getComponentLocation,\n getComponentSpaceLocation,\n getComponentVertexLocation,\n getComponentZoneLocation,\n canAffordResources,\n getMissingResources,\n getNextPlayerInOrder,\n getPlayerOrder,\n getPlayerResourceAmount,\n getPlayerResourceTotal,\n getPlayerResources,\n} from \"./table\";\n\nexport function createTableQueries<\n Table extends RuntimeQueryTable,\n Definitions extends ZoneDefinitions,\n>(table: Table, definitions: Definitions): TableQueries<Table, Definitions> {\n return {\n tile: <Id extends TileIdOfTable<Table>>(tileId: Id) =>\n requireLookup(\n Object.hasOwn(table.tiles, tileId) ? table.tiles[tileId] : undefined,\n \"Tile\",\n tileId,\n ) as Table[\"tiles\"][Id],\n board: <BoardId extends BoardIdOfTable<Table>>(boardId: BoardId) =>\n bindBoardQueries(table, definitions, boardId),\n // Query construction boundary: compiled definitions admit hosts and canonical\n // memberships supply component IDs; the card path filters own card entries.\n // eslint-disable-next-line no-restricted-syntax -- Construction boundary binding admitted runtime memberships to exact table IDs.\n zone: Object.assign(\n (zoneId: string, hostId?: string) =>\n getZoneComponents(table, definitions, { zoneId, hostId }),\n {\n cards: (zoneId: string, hostId?: string) =>\n getZoneCardCollection(table, definitions, { zoneId, hostId }),\n },\n ) as unknown as TableQueries<Table, Definitions>[\"zone\"],\n zones: ((zoneId: string) =>\n getZones(table, definitions, zoneId)) as TableQueries<Table>[\"zones\"],\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 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 requireLookup(\n Object.hasOwn(table.cards, componentId)\n ? table.cards[componentId]\n : Object.hasOwn(table.pieces, componentId)\n ? table.pieces[componentId]\n : Object.hasOwn(table.dice, componentId)\n ? table.dice[componentId]\n : Object.hasOwn(table.tiles, componentId)\n ? table.tiles[componentId]\n : undefined,\n \"Component\",\n componentId,\n ) as ComponentDataOfTable<Table, ComponentId>,\n location: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentLocation(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, definitions, componentId),\n edge: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentEdgeLocation(table, definitions, componentId),\n vertex: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentVertexLocation(table, definitions, componentId),\n },\n };\n}\n\nexport function createStateQueries<\n State extends { table: RuntimeQueryTable },\n Definitions extends ZoneDefinitions,\n>(\n state: State,\n definitions: Definitions,\n): TableQueriesOfState<State, Definitions> {\n // eslint-disable-next-line no-restricted-syntax -- Queries are constructed from this State.table; the conditional TableOfState type denotes that same table.\n return createTableQueries(\n state.table,\n definitions,\n ) as unknown as TableQueriesOfState<State, Definitions>;\n}\n","import type { GameEvent } from \"./results.js\";\n\n/** Shape admission is canonical wire schema work; current references belong to session authority. */\nexport function assertGameEventReferences(\n events: readonly GameEvent[],\n table: {\n readonly playerOrder: readonly string[];\n readonly tiles: Readonly<Record<string, unknown>>;\n },\n): void {\n const roster = new Set(table.playerOrder);\n for (const [index, event] of events.entries()) {\n if (event.audience.kind === \"seats\")\n for (const playerId of event.audience.playerIds)\n if (!roster.has(playerId))\n throw new Error(\n `runtime.events[${index}].audience.playerIds: unknown session player '${playerId}'.`,\n );\n for (const [detailIndex, detail] of (event.details ?? []).entries())\n if (\n typeof detail.value === \"object\" &&\n !Object.hasOwn(table.tiles, detail.value.tileId)\n )\n throw new Error(\n `runtime.events[${index}].details[${detailIndex}]: unknown tile '${detail.value.tileId}'.`,\n );\n }\n}\n","import { AuthoredTileDisclosureSchema } from \"./tile-disclosure.js\";\nimport { TilePlacementSchema } from \"./tile-placement.js\";\nimport { MAXIMUM_BOARD_COORDINATE } from \"./board-coordinates.js\";\nimport * as z from \"zod\";\nimport { RuntimeJsonSchema } from \"../runtime-json.js\";\n\n// The SDK owns the structural manifest contract here. Game-owned schemas and\n// values remain JSON; reducer validation supplies their semantic rules.\nconst id = z.string().min(1);\nconst positiveInteger = z\n .int({ error: \"Expected a positive safe integer.\" })\n .positive({ error: \"Expected a positive safe integer.\" });\nexport const FieldSchemaJsonSchema = z.record(z.string(), RuntimeJsonSchema);\nexport const CardSchemaJsonSchema = z.union([\n FieldSchemaJsonSchema,\n z.strictObject({ byCardType: z.record(id, FieldSchemaJsonSchema) }),\n]);\nconst fields = FieldSchemaJsonSchema;\nexport const PlayersDefinitionSchema = z.strictObject({\n minPlayers: positiveInteger,\n maxPlayers: positiveInteger,\n optimalPlayers: positiveInteger.optional(),\n});\nexport const TopologyScopeSchema = z.enum([\"shared\", \"perPlayer\"]);\nexport const ZoneVisibilitySchema = z.enum([\"ownerOnly\", \"public\", \"hidden\"]);\nexport const ComponentVisibilitySpecSchema = z.strictObject({\n faceUp: z.boolean().optional(),\n});\nexport const BoardEdgeRefSchema = z.strictObject({ spaces: z.array(id) });\nexport const BoardVertexRefSchema = z.strictObject({ spaces: z.array(id) });\nexport const DetachedHomeSpecSchema = z.strictObject({\n type: z.literal(\"detached\"),\n});\nexport const ZoneHomeSpecSchema = z.strictObject({\n type: z.literal(\"zone\"),\n zoneId: id,\n component: id.optional(),\n});\nexport const SpaceHomeSpecSchema = z.strictObject({\n type: z.literal(\"space\"),\n boardId: id,\n spaceId: id,\n});\nexport const EdgeHomeSpecSchema = z.strictObject({\n type: z.literal(\"edge\"),\n boardId: id,\n ref: BoardEdgeRefSchema,\n});\nexport const VertexHomeSpecSchema = z.strictObject({\n type: z.literal(\"vertex\"),\n boardId: id,\n ref: BoardVertexRefSchema,\n});\nexport const ComponentHomeSpecSchema = z.discriminatedUnion(\"type\", [\n DetachedHomeSpecSchema,\n ZoneHomeSpecSchema,\n SpaceHomeSpecSchema,\n EdgeHomeSpecSchema,\n VertexHomeSpecSchema,\n]);\nexport const BoardCardSchema = z.strictObject({\n /** With multiple copies, runtime IDs expand to '{id}-1', '{id}-2', etc. */\n id,\n name: z.string(),\n count: positiveInteger,\n cardType: id,\n scope: TopologyScopeSchema.optional(),\n /** Values are checked against this card type's authored card schema. */\n properties: fields,\n /** Repository path under assets/, presented to game UIs as a loadable URL. */\n frontImage: z.string().optional(),\n /** Card back uses the same assets/ path contract as the front. */\n backImage: z.string().optional(),\n text: z.string().optional(),\n /** Overrides the card set's default home. Player distribution belongs in setup. */\n home: ComponentHomeSpecSchema.optional(),\n visibility: ComponentVisibilitySpecSchema.optional(),\n});\nexport const CardSetDefinitionSchema = z.strictObject({\n id,\n name: z.string(),\n cardSchema: CardSchemaJsonSchema,\n /** Initial placement for cards without a home override; compatibility never implies placement. */\n defaultHome: ComponentHomeSpecSchema,\n cards: z.array(BoardCardSchema),\n});\nexport const ZoneAttachmentSchema = z.union([\n z.strictObject({ board: id }),\n z.strictObject({ board: id, space: id }),\n z.strictObject({ pieceType: id }),\n z.strictObject({ dieType: id }),\n z.strictObject({ tileType: id, cell: id }),\n]);\nconst zoneBase = {\n id,\n name: z.string(),\n allowedCardSetIds: z.array(id).optional(),\n visibility: ZoneVisibilitySchema.optional(),\n};\nexport const ZoneSpecSchema = z.union([\n z.strictObject({ ...zoneBase, scope: TopologyScopeSchema }),\n z.strictObject({ ...zoneBase, attachedTo: ZoneAttachmentSchema }),\n]);\nexport const BoardSpaceSpecSchema = z.strictObject({\n id,\n name: z.string().optional(),\n typeId: id.optional(),\n fields: fields.optional(),\n});\nexport const BoardRelationSpecSchema = z.strictObject({\n id,\n typeId: id,\n fromSpaceId: id,\n toSpaceId: id,\n directed: z.boolean().optional(),\n fields: fields.optional(),\n});\nexport const HexOrientationSchema = z.enum([\"pointy\", \"flat\"]);\nexport const HexCoordinateSchema = z.strictObject({ q: z.int(), r: z.int() });\nconst side = z.union([\n z.literal(0),\n z.literal(1),\n z.literal(2),\n z.literal(3),\n z.literal(4),\n z.literal(5),\n]);\nconst boardBase = {\n id,\n visibility: ZoneVisibilitySchema.optional(),\n name: z.string(),\n scope: TopologyScopeSchema,\n typeId: id.optional(),\n boardFieldsSchema: fields.optional(),\n fields: fields.optional(),\n relationFieldsSchema: fields.optional(),\n relations: z.array(BoardRelationSpecSchema).optional(),\n};\nexport const GenericBoardSpecSchema = z.strictObject({\n ...boardBase,\n layout: z.literal(\"generic\"),\n spaceFieldsSchema: fields.optional(),\n spaces: z.array(BoardSpaceSpecSchema).optional(),\n});\nexport const HexBoardSpecSchema = z.strictObject({\n ...boardBase,\n layout: z.literal(\"hex\"),\n orientation: HexOrientationSchema.optional(),\n});\nexport const SquareBoardSpecSchema = z.strictObject({\n ...boardBase,\n layout: z.literal(\"square\"),\n});\nexport const BoardSpecSchema = z.discriminatedUnion(\"layout\", [\n GenericBoardSpecSchema,\n HexBoardSpecSchema,\n SquareBoardSpecSchema,\n]);\nexport const PieceTypeSpecSchema = z.strictObject({\n id,\n name: z.string(),\n fieldsSchema: fields.optional(),\n});\nexport const PieceSeedSpecSchema = z.strictObject({\n /** With multiple copies, runtime IDs expand to '{id}-1', '{id}-2', etc. */\n id: id.optional(),\n name: z.string().optional(),\n typeId: id,\n count: positiveInteger.optional(),\n scope: TopologyScopeSchema.optional(),\n home: ComponentHomeSpecSchema.optional(),\n visibility: ComponentVisibilitySpecSchema.optional(),\n fields: fields.optional(),\n});\nexport const DieTypeSpecSchema = PieceTypeSpecSchema.extend({\n sides: positiveInteger.optional(),\n});\nexport const DieSeedSpecSchema = PieceSeedSpecSchema;\nconst tileCoordinate = z\n .int()\n .min(-MAXIMUM_BOARD_COORDINATE)\n .max(MAXIMUM_BOARD_COORDINATE);\nconst tileCell = {\n id,\n name: z.string().optional(),\n typeId: id.optional(),\n fields: fields.optional(),\n};\nconst tileAnnotation = {\n cellId: id,\n typeId: id.optional(),\n label: z.string().optional(),\n fields: fields.optional(),\n};\nconst tileType = {\n id,\n name: z.string(),\n fieldsSchema: fields.optional(),\n fields: fields.optional(),\n propertiesSchema: fields.optional(),\n frontImage: z.string().optional(),\n cellFieldsSchema: fields.optional(),\n edgeFieldsSchema: fields.optional(),\n vertexFieldsSchema: fields.optional(),\n};\nexport const HexTileTypeSpecSchema = z.strictObject({\n ...tileType,\n layout: z.literal(\"hex\"),\n cells: z\n .array(\n z.strictObject({\n ...tileCell,\n at: z.strictObject({ q: tileCoordinate, r: tileCoordinate }),\n }),\n )\n .nonempty(),\n edges: z.array(z.strictObject({ ...tileAnnotation, side })).optional(),\n vertices: z\n .array(z.strictObject({ ...tileAnnotation, corner: side }))\n .optional(),\n});\nconst squareTileSide = z.union([\n z.literal(0),\n z.literal(1),\n z.literal(2),\n z.literal(3),\n]);\nexport const SquareTileTypeSpecSchema = z.strictObject({\n ...tileType,\n layout: z.literal(\"square\"),\n cells: z\n .array(\n z.strictObject({\n ...tileCell,\n at: z.strictObject({ col: tileCoordinate, row: tileCoordinate }),\n }),\n )\n .nonempty(),\n edges: z\n .array(z.strictObject({ ...tileAnnotation, side: squareTileSide }))\n .optional(),\n vertices: z\n .array(z.strictObject({ ...tileAnnotation, corner: squareTileSide }))\n .optional(),\n});\nexport const TileTypeSpecSchema = z.discriminatedUnion(\"layout\", [\n HexTileTypeSpecSchema,\n SquareTileTypeSpecSchema,\n]);\nexport const TileBoardHomeSpecSchema = z.discriminatedUnion(\"layout\", [\n TilePlacementSchema.options[0].extend({ type: z.literal(\"board\") }),\n TilePlacementSchema.options[1].extend({ type: z.literal(\"board\") }),\n]);\nexport const TileSeedSpecSchema = z.strictObject({\n id,\n disclosure: AuthoredTileDisclosureSchema.optional(),\n typeId: id,\n count: positiveInteger.optional(),\n scope: TopologyScopeSchema.optional(),\n properties: fields.optional(),\n home: z\n .union([\n DetachedHomeSpecSchema,\n ZoneHomeSpecSchema,\n TileBoardHomeSpecSchema,\n ])\n .optional(),\n});\nexport const ResourceDefinitionSchema = z.strictObject({\n id,\n name: z.string(),\n icon: z.string().optional(),\n /** Defaults to public; owner balances reach only the player who holds them. */\n visibility: z.enum([\"public\", \"owner\"]).optional(),\n});\nexport const GameTopologyManifestSchema = z.strictObject({\n players: PlayersDefinitionSchema,\n cardSets: z.array(CardSetDefinitionSchema),\n zones: z.array(ZoneSpecSchema).optional(),\n boards: z.array(BoardSpecSchema).optional(),\n pieceTypes: z.array(PieceTypeSpecSchema).optional(),\n pieceSeeds: z.array(PieceSeedSpecSchema).optional(),\n dieTypes: z.array(DieTypeSpecSchema).optional(),\n dieSeeds: z.array(DieSeedSpecSchema).optional(),\n tileTypes: z.array(TileTypeSpecSchema).optional(),\n tileSeeds: z.array(TileSeedSpecSchema).optional(),\n resources: z.array(ResourceDefinitionSchema).optional(),\n});\n","import type {\n AnyInteractionSpec,\n BaseGameStateOfContract,\n InputCollector,\n InteractionMap,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewOfContract,\n OptionsOfContract,\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 InteractionMap<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n OptionsOfContract<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 interface ReducerDefinitionPhaseIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> {\n readonly phaseName: PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >;\n readonly phase: ReducerIndexedPhase<Contract>;\n readonly interactions: ReadonlyArray<\n ReducerIndexedInteractionEntry<Contract>\n >;\n}\n\nexport interface ReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >,\n ReducerIndexedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, View>>,\n ReducerDefinitionPhaseIndex<Contract, Definitions, View>\n >;\n}\n\nfunction phaseEntriesOf<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): Array<\n readonly [\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, View>>,\n ReducerIndexedPhase<Contract>,\n ]\n> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >;\n // eslint-disable-next-line no-restricted-syntax -- Each entry comes from the assembled definition phases; enumeration erases their correlated phase-name and contract types.\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 // eslint-disable-next-line no-restricted-syntax -- The assembled phase owns submit; indexing it preserves the same Contract while erasing its specific collector map.\n [\"submit\", submit] as unknown as ReducerIndexedInteractionEntry<Contract>,\n ];\n}\n\nexport function collectReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): ReducerDefinitionIndex<Contract, Definitions, View> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >;\n\n const phaseEntries = phaseEntriesOf(definition);\n const phasesByName = new Map<\n PhaseName,\n ReducerDefinitionPhaseIndex<Contract, Definitions, View>\n >();\n\n for (const [phaseName, phase] of phaseEntries) {\n const interactionEntries = [\n ...interactionEntriesOf(phase),\n ...simultaneousSubmitEntriesOf(phase),\n ];\n phasesByName.set(phaseName, {\n phaseName,\n phase,\n interactions: interactionEntries,\n });\n }\n\n return {\n phaseEntries,\n phasesByName,\n };\n}\n","import { assertGameEventReferences } from \"../../shared/domain/event-admission.js\";\nimport { TileDisclosureSchema } from \"../../shared/domain/tile-disclosure.js\";\nimport { ZoneVisibilitySchema } from \"../../shared/domain/manifest-schema.js\";\nimport { BoardRelationSchema } from \"../../shared/board-topology-schema.js\";\nimport { TilePlacementSchema } from \"../../shared/domain/tile-placement.js\";\nimport { PlayerRosterSchema } from \"../../shared/domain/player-identity\";\nimport { assertZoneConsistency } from \"../table/zones\";\nimport { collectReducerDefinitionIndex } from \"../definition-index\";\nimport * as z from \"zod\";\nimport * as ContractZod from \"../../shared/runtime-schema\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport { runtimePayloadSchema } from \"./runtime-payload\";\nimport type {\n BaseGameSessionOfContract,\n GameStateOf,\n HiddenSchemaOfContract,\n ManifestOf,\n PhaseMapOf,\n PhaseNameOfContract,\n PlayerIdOfState,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n OptionsOfContract,\n TableOfManifest,\n ViewOfContract,\n} from \"../model\";\nimport type { IngressRuntimeCodec, RawReducerSessionState } from \"./raw-types\";\nimport { createRuntimeInputParser } from \"./input-codec\";\nimport { collectIngressPhaseSchemas } from \"./phase-schemas\";\n\nconst runtimeRecordSchema = z.record(z.string(), runtimePayloadSchema);\nconst runtimeComponentLocationSchema = z.discriminatedUnion(\"type\", [\n TilePlacementSchema,\n z.object({ type: z.literal(\"Detached\") }).strict(),\n z\n .object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n hostId: z.string(),\n playedBy: z.string().nullable(),\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(\"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]);\nconst currentRuntimeTableSchema = z\n .object({\n playerOrder: z.array(z.string()),\n zones: z.record(z.string(), z.record(z.string(), z.array(z.string()))),\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 frontImage: z.string().optional(),\n backImage: 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: z.record(z.string().min(1), runtimeRecordSchema),\n boards: z.record(\n z.string(),\n z.strictObject({\n baseId: z.string(),\n visibility: ZoneVisibilitySchema,\n relations: z.array(BoardRelationSchema),\n }),\n ),\n tiles: z.record(\n z.string(),\n z\n .object({\n disclosure: TileDisclosureSchema,\n componentType: z.literal(\"tile\"),\n id: z.string(),\n tileTypeId: z.string(),\n ownerId: z.string().nullable(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\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 View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseNameOfContract<Contract>,\n OptionsOfContract<Contract>\n> {\n type Definition = ReducerGameDefinition<Contract, Definitions, View>;\n type DomainState = GameStateOf<Definition>;\n type State = BaseGameSessionOfContract<Contract>;\n type PhaseName = PhaseNameOfContract<Contract>;\n type ReturnType = IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseName,\n OptionsOfContract<Contract>\n >;\n type PlayerId = PlayerIdOfState<DomainState>;\n\n // This schema belongs to Contract; preserve its exact table output where\n // the generic contract enters the codec. All parsed tables use this schema.\n const tableSchema = definition.contract.manifest.tableSchema as z.ZodType<\n TableOfManifest<ManifestOf<Contract>>\n >;\n\n const { phaseNameSchema } = collectIngressPhaseSchemas(definition);\n const definitionIndex = collectReducerDefinitionIndex(definition);\n const playerIdSchema = definition.contract.manifest.ids\n .playerId as z.ZodType<PlayerId>;\n\n function parseSessionRoster(rawRoster: unknown, label: string): PlayerId[] {\n const roster = safeParseOrThrow(PlayerRosterSchema, rawRoster, label).map(\n (id) => safeParseOrThrow(playerIdSchema, id, label),\n );\n if (roster.length === 0)\n throw new Error(`${label}: session roster must not be empty.`);\n const setup = definition.contract.manifest.normalSetup;\n if (roster.length < setup.minPlayers || roster.length > setup.maxPlayers) {\n throw new Error(\n `${label}: session roster must contain ${setup.minPlayers} through ${setup.maxPlayers} players.`,\n );\n }\n return roster;\n }\n\n // This header only reads the roster; parseState admits the full state later.\n const stateRosterHeader = z.object({\n domain: z.object({ table: z.object({ playerOrder: z.unknown() }) }),\n });\n function parseStatePlayerIds(rawState: unknown) {\n const header = safeParseOrThrow(\n stateRosterHeader,\n rawState,\n \"state roster\",\n );\n return parseSessionRoster(\n header.domain.table.playerOrder,\n \"domain.table.playerOrder\",\n );\n }\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 function parseOptions(rawOptions: unknown): OptionsOfContract<Contract> {\n const jsonInput = runtimeRecordSchema.parse(rawOptions);\n const parsed = safeParseOrThrow(\n definition.contract.options,\n jsonInput,\n \"options\",\n );\n return runtimeRecordSchema.parse(parsed) as OptionsOfContract<Contract>;\n }\n const runtimeStateSchema = z.object({\n events: z.array(ContractZod.GameEventSchema).max(32),\n rng: z.object({\n seed: z.number().int().nullable(),\n cursor: z.number().int(),\n trace: z.array(z.string()),\n draws: z.array(ContractZod.RngDrawSchema).default([]),\n }),\n options: z.unknown().transform(parseOptions),\n pending: z.partialRecord(\n playerIdSchema,\n z\n .object({\n phaseName: phaseNameSchema,\n interactionId: z.string().min(1),\n values: z.array(runtimePayloadSchema).min(1),\n concealedBasis: ContractZod.ReferenceBasisSchema.optional(),\n })\n .strict()\n .refine((pending) => {\n const phase = definitionIndex.phasesByName.get(pending.phaseName);\n const steps = phase?.interactions.find(\n ([id]) => id === pending.interactionId,\n )?.[1].steps;\n return !!steps && pending.values.length < steps.entries.length;\n }, \"Pending interaction must name an authored stepped interaction with an unfinished prefix.\"),\n ),\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 // eslint-disable-next-line no-restricted-syntax -- Every codec method is constructed from this Contract's schemas; the return binding restores its conditional state and identity types.\n return {\n defaultRuntimeState(\n seed: number | null = null,\n options: OptionsOfContract<Contract>,\n ) {\n const runtimeState: State[\"runtime\"] = {\n events: [],\n rng: {\n seed,\n cursor: 0,\n trace: [],\n draws: [],\n },\n options,\n pending: {},\n simultaneous: { current: null },\n lastTransition: null,\n };\n return runtimeState;\n },\n parseInitialOptions(rawOptions: unknown) {\n return parseOptions(rawOptions === undefined ? {} : rawOptions);\n },\n parseInitialTable(rawTable: unknown, playerIds: string[] | undefined) {\n // eslint-disable-next-line no-restricted-syntax -- The ingress schema checks table syntax here; initialization applies this Contract's manifest defaults and table schema before trusted use.\n const table = safeParseOrThrow(\n currentRuntimeTableSchema,\n rawTable,\n \"table\",\n ) as unknown as TableOfManifest<ManifestOf<Contract>>;\n const roster = parseSessionRoster(\n playerIds === undefined ? table.playerOrder : playerIds,\n \"table.playerOrder\",\n );\n if (\n table.playerOrder.length > 0 &&\n (table.playerOrder.length !== roster.length ||\n table.playerOrder.some((id, index) => id !== roster[index]))\n ) {\n throw new Error(\n \"table.playerOrder: provided roster disagrees with the table roster.\",\n );\n }\n return { table, playerIds: roster };\n },\n isStatePlayer(rawState: unknown, playerId: string) {\n return new Set<string>(parseStatePlayerIds(rawState)).has(playerId);\n },\n parseStatePerspectives(rawState: unknown, rawPlayerIds: readonly string[]) {\n const roster = parseStatePlayerIds(rawState);\n const perspectives = PlayerRosterSchema.parse(rawPlayerIds).map((id) =>\n safeParseOrThrow(playerIdSchema, id, \"perspectivePlayerId\"),\n );\n for (const id of perspectives)\n if (!roster.includes(id))\n throw new Error(\n `Projection player '${id}' is not seated in this session.`,\n );\n return perspectives;\n },\n parseState(rawState: unknown) {\n const envelope = safeParseOrThrow(\n ContractZod.ReducerSessionStateSchema,\n rawState,\n \"state\",\n );\n const rawTable = safeParseOrThrow(\n currentRuntimeTableSchema,\n envelope.domain.table,\n \"domain.table\",\n );\n const playerIds = parseSessionRoster(\n rawTable.playerOrder,\n \"domain.table.playerOrder\",\n );\n const activeRoster = new Set<string>(playerIds);\n const assertSeated = (id: string, path: string) => {\n if (!activeRoster.has(id))\n throw new Error(`${path}: unknown session player '${id}'.`);\n };\n for (const id of envelope.domain.flow.activePlayers)\n assertSeated(id, \"domain.flow.activePlayers\");\n for (const id of Object.keys(envelope.domain.privateState))\n assertSeated(id, \"domain.privateState\");\n for (const id of playerIds)\n if (!Object.hasOwn(envelope.domain.privateState, id))\n throw new Error(\n `domain.privateState: missing private state player '${id}'.`,\n );\n for (const id of Object.keys(envelope.runtime.pending))\n assertSeated(id, \"runtime.pending\");\n const simultaneous = envelope.runtime.simultaneous.current;\n if (simultaneous) {\n for (const id of simultaneous.actors)\n assertSeated(id, \"runtime.simultaneous.actors\");\n for (const id of Object.keys(simultaneous.submissions))\n assertSeated(id, \"runtime.simultaneous.submissions\");\n }\n assertZoneConsistency(rawTable, definition.contract.manifest);\n const table = safeParseOrThrow(tableSchema, rawTable, \"domain.table\");\n assertGameEventReferences(envelope.runtime.events, table);\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 ),\n };\n return parsedState;\n },\n serializeState(state: State) {\n // eslint-disable-next-line no-restricted-syntax -- The serialized domain and runtime come from this codec's typed session; the wire envelope erases the authored state generics.\n return {\n domain: { ...state.domain },\n runtime: state.runtime,\n } as unknown 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 * as 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 * as z from \"zod\";\nimport { assertJsonWithinLimits } from \"../../runtime-json\";\nimport { RuntimeJsonSchema } from \"../../shared/runtime-json.js\";\nimport type { RuntimePayload } from \"../model\";\n\nexport { RuntimeJsonSchema } from \"../../shared/runtime-json.js\";\nexport { parseTransportJson } from \"../../runtime-json\";\n\nexport const runtimePayloadSchema = z.preprocess((value) => {\n if (value === undefined) return value;\n assertJsonWithinLimits(\n value,\n {\n maxDepth: 64,\n maxNodes: 100_000,\n maxStringBytes: 1_048_576,\n maxCollectionEntries: 50_000,\n },\n \"Runtime payload\",\n );\n return value;\n}, RuntimeJsonSchema) as z.ZodType<RuntimePayload>;\n","import { RuntimeJsonSchema, type RuntimeJson } from \"./shared/runtime-json.js\";\n\nexport type JsonLimits = {\n maxDepth: number;\n maxNodes: number;\n maxStringBytes: number;\n maxCollectionEntries: number;\n};\n\nexport type JsonValidationCode =\n | \"cycle\"\n | \"depth\"\n | \"nodes\"\n | \"string-bytes\"\n | \"collection-entries\"\n | \"non-json\";\n\nexport class JsonValidationError extends Error {\n constructor(\n public readonly code: JsonValidationCode,\n message: string,\n ) {\n super(message);\n this.name = \"JsonValidationError\";\n }\n}\n\nexport const TRANSPORT_JSON_LIMITS = {\n maxDepth: 64,\n maxNodes: 100_000,\n maxStringBytes: 1_048_576,\n maxCollectionEntries: 50_000,\n} as const satisfies JsonLimits;\n\nexport const BROWSER_ATTRIBUTE_JSON_LIMITS = {\n maxDepth: 32,\n maxNodes: 10_000,\n maxStringBytes: 65_536,\n maxCollectionEntries: 5_000,\n} as const satisfies JsonLimits;\n\nfunction jsonError(\n code: JsonValidationCode,\n label: string,\n detail: string,\n): JsonValidationError {\n return new JsonValidationError(code, `${label} ${detail}.`);\n}\n\nfunction requirePlainObject(\n value: object,\n label: string,\n): Record<string, unknown> {\n const prototype: unknown = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw jsonError(\"non-json\", label, \"contains a non-plain object\");\n }\n return value as Record<string, unknown>;\n}\n\nexport function assertJsonWithinLimits(\n root: unknown,\n limits: JsonLimits,\n label: string,\n): void {\n const stack: Array<{ value: unknown; depth: number }> = [\n { value: root, depth: 0 },\n ];\n const seen = new WeakSet<object>();\n const encoder = new TextEncoder();\n let nodes = 0;\n let stringBytes = 0;\n let collectionEntries = 0;\n\n while (stack.length > 0) {\n const item = stack.pop();\n if (!item) continue;\n const { value, depth } = item;\n\n nodes += 1;\n if (nodes > limits.maxNodes) {\n throw jsonError(\"nodes\", label, \"exceeds the node limit\");\n }\n if (depth > limits.maxDepth) {\n throw jsonError(\"depth\", label, \"exceeds the depth limit\");\n }\n\n switch (typeof value) {\n case \"string\":\n stringBytes += encoder.encode(value).byteLength;\n if (stringBytes > limits.maxStringBytes) {\n throw jsonError(\n \"string-bytes\",\n label,\n \"exceeds the string-byte limit\",\n );\n }\n continue;\n case \"number\":\n if (!Number.isFinite(value)) {\n throw jsonError(\"non-json\", label, \"contains a non-finite number\");\n }\n continue;\n case \"boolean\":\n continue;\n case \"object\":\n if (value === null) continue;\n break;\n default:\n throw jsonError(\"non-json\", label, \"contains a non-JSON value\");\n }\n\n if (seen.has(value)) {\n throw jsonError(\"cycle\", label, \"contains a cycle\");\n }\n seen.add(value);\n\n const children = Array.isArray(value)\n ? value\n : Object.values(requirePlainObject(value, label));\n collectionEntries += children.length;\n if (collectionEntries > limits.maxCollectionEntries) {\n throw jsonError(\n \"collection-entries\",\n label,\n \"exceeds the collection-entry limit\",\n );\n }\n for (const child of children) {\n stack.push({ value: child, depth: depth + 1 });\n }\n }\n}\n\nexport function parseJsonWithLimits(\n value: unknown,\n limits: JsonLimits,\n label: string,\n): RuntimeJson {\n assertJsonWithinLimits(value, limits, label);\n return RuntimeJsonSchema.parse(value);\n}\n\nexport function parseTransportJson(value: unknown): RuntimeJson {\n return parseJsonWithLimits(value, TRANSPORT_JSON_LIMITS, \"Runtime payload\");\n}\n\nexport function parseBrowserAttributeJson(value: unknown): RuntimeJson {\n return parseJsonWithLimits(\n value,\n BROWSER_ATTRIBUTE_JSON_LIMITS,\n \"Browser interaction attribute\",\n );\n}\n","import * as z from \"zod\";\nimport * as ContractZod from \"../../shared/runtime-schema\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport type { RawRuntimeInput } from \"./raw-types\";\n\nexport function createRuntimeInputParser<PlayerId extends string>(\n playerIdSchema: z.ZodType<PlayerId>,\n): (rawInput: unknown) => RawRuntimeInput {\n return (rawInput: unknown) => {\n const input = safeParseOrThrow(\n ContractZod.GameInputSchema,\n rawInput,\n \"input\",\n );\n const playerId = safeParseOrThrow(\n playerIdSchema,\n input.playerId,\n \"input.playerId\",\n );\n\n return {\n ...input,\n playerId,\n };\n };\n}\n","import * as z from \"zod\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewOfContract,\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 View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\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","import * as z from \"zod\";\nimport { BoardRelationSchema } from \"../../shared/board-topology-schema.js\";\nimport type { TopologyDefinitions } from \"../../shared/domain/topology-definitions.js\";\nimport type { RuntimeTableRecord } from \"../model/table.js\";\nimport { getBoard } from \"./board-queries.js\";\n\nconst additionSchema = BoardRelationSchema.extend({\n id: z.string().min(1),\n directed: z.boolean().default(false),\n fields: BoardRelationSchema.shape.fields.default({}),\n});\ntype RelationDefinitions = TopologyDefinitions & {\n readonly tableSchema: z.ZodType<RuntimeTableRecord>;\n};\nexport function addRelationInPlace({\n table,\n definitions,\n boardId,\n relation,\n}: {\n table: RuntimeTableRecord;\n definitions: RelationDefinitions;\n boardId: string;\n relation: unknown;\n}): void {\n const board = getBoard(table, definitions, boardId);\n const parsed = additionSchema.parse(relation);\n if (board.relations.some((value) => value.id === parsed.id))\n throw new Error(\n `Duplicate relation identity '${parsed.id}' on board '${boardId}'.`,\n );\n for (const endpoint of [parsed.fromSpaceId, parsed.toSpaceId])\n if (!Object.hasOwn(board.spaces, endpoint))\n throw new Error(\n `Unknown relation endpoint '${endpoint}' on board '${boardId}'.`,\n );\n const candidate = definitions.tableSchema.parse({\n ...table,\n boards: {\n ...table.boards,\n [boardId]: {\n ...table.boards[boardId],\n relations: [...table.boards[boardId].relations, parsed],\n },\n },\n });\n // Full admission applies the board's compiled fields, defaults and live reference constraints.\n getBoard(candidate, definitions, boardId);\n table.boards[boardId] = candidate.boards[boardId];\n}\n\nexport function removeRelationInPlace({\n table,\n definitions,\n boardId,\n relationId,\n}: {\n table: RuntimeTableRecord;\n definitions: TopologyDefinitions;\n boardId: string;\n relationId: string;\n}): void {\n const board = getBoard(table, definitions, boardId);\n z.string().min(1).parse(relationId);\n if (!board.relations.some((relation) => relation.id === relationId))\n throw new Error(`Unknown relation '${relationId}' on board '${boardId}'.`);\n table.boards[boardId] = {\n ...table.boards[boardId],\n relations: table.boards[boardId].relations.filter(\n (relation) => relation.id !== relationId,\n ),\n };\n}\n","import { getPublicTileFootprint } from \"../shared/tile-appearance.js\";\nimport type { z } from \"zod\";\nimport type { TilePlacement } from \"../shared/domain/tile-placement.js\";\nimport type { BoardDefinitionOf } from \"./model/topology.js\";\nimport type { RelationInputForBoard } from \"./manifest/types.js\";\nimport {\n placeTileInPlace,\n removeTileInPlace,\n type TilePlacementAt,\n} from \"./table/tile-mutations.js\";\nimport {\n addRelationInPlace,\n removeRelationInPlace,\n} from \"./table/relation-mutations.js\";\nimport { ZoneVisibilitySchema } from \"../shared/domain/manifest-schema.js\";\nimport {\n TileDisclosureSchema,\n type TileDisclosure,\n} from \"../shared/domain/tile-disclosure.js\";\nimport type { ReadonlyRuntimeData } from \"../shared/runtime-json.js\";\nimport type { TopologyDefinitions } from \"../shared/domain/topology-definitions.js\";\nimport type {\n ZoneDefinitions,\n ZoneArg,\n ZoneIdOfTable,\n ZoneComponentsOfTable,\n BoardIdOfTable,\n CardIdOfTable,\n ComponentIdOfTable,\n TileIdOfTable,\n SpatialComponentIdOfTable,\n HiddenStateOfState,\n PhaseStateOfState,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n PrivateStateOfState,\n PublicStateOfState,\n ResourceAmountsOfTable,\n ResourceIdOfTable,\n RuntimeTableRecord,\n ReducerGameState,\n SpaceIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"./model\";\nimport type { PositionTarget } from \"../shared/position-target.js\";\nimport {\n moveComponentToZoneInPlace,\n moveComponentToPositionInPlace,\n dealComponentsInPlace,\n rotateZoneInPlace,\n type ZonePosition,\n} from \"./table/card-mutations\";\nimport {\n addPlayerResourcesInPlace as tableAddPlayerResourcesInPlace,\n flipCardInPlace as tableFlipCardInPlace,\n moveComponentToDetachedInPlace as tableMoveComponentToDetachedInPlace,\n moveComponentToEdgeInPlace as tableMoveComponentToEdgeInPlace,\n moveComponentToSpaceInPlace as tableMoveComponentToSpaceInPlace,\n moveComponentToVertexInPlace as tableMoveComponentToVertexInPlace,\n setPlayerResourceInPlace as tableSetPlayerResourceInPlace,\n spendPlayerResourcesInPlace as tableSpendPlayerResourcesInPlace,\n transferPlayerResourcesInPlace as tableTransferPlayerResourcesInPlace,\n} from \"./table\";\n\ntype PlacementAt<Layout> = Layout extends \"hex\" | \"square\"\n ? Omit<\n Extract<TilePlacement, { layout: Layout }>,\n \"type\" | \"boardId\" | \"layout\"\n >\n : never;\ntype BoardBase<Table, Board extends BoardIdOfTable<Table>> = Table extends {\n boards: Record<Board, { baseId: infer Base extends string }>;\n}\n ? Base\n : never;\ntype CompatibleTileId<\n Table,\n Definitions extends TopologyDefinitions,\n Board extends BoardIdOfTable<Table>,\n> = {\n [Tile in TileIdOfTable<Table>]: Table extends {\n tiles: Record<Tile, { tileTypeId: infer Type }>;\n }\n ? Type extends keyof Definitions[\"tileDefinitions\"]\n ? Definitions[\"tileDefinitions\"][Type] extends { layout: infer Layout }\n ? BoardDefinitionOf<Table, Definitions, Board> extends {\n layout: Layout;\n }\n ? Tile\n : never\n : never\n : never\n : never;\n}[TileIdOfTable<Table>];\n\nexport type RotateZoneArgs<\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 componentIdsByPlayer?: Partial<\n Record<\n PlayerId,\n readonly ZoneComponentsOfTable<TableOfState<State>, NoInfer<ZoneId>>[]\n >\n >;\n position?: \"top\" | \"bottom\";\n};\n\n/**\n * Shallow patch or functional updater for one state slice. The updater is a\n * method-style callable so a transaction over a phase-scoped state stays\n * assignable to one over the base game state; a plain function type would be\n * invariant in `T` under `strictFunctionTypes`.\n */\nexport type StatePatch<T> = Partial<T> | { update(prev: T): T }[\"update\"];\n\n/**\n * Mutations available on a transaction-owned draft.\n */\n/** A position may name any of its zones, so the component must fit each. */\ntype ComponentOfEveryZone<Table, Z extends ZoneIdOfTable<Table>> = (\n Z extends unknown\n ? (component: ZoneComponentsOfTable<Table, Z>) => void\n : never\n) extends (component: infer Component) => void\n ? Component\n : never;\n\nexport interface TransactionMutations<\n State extends { table: RuntimeTableRecord },\n Definitions extends TopologyDefinitions = TopologyDefinitions,\n> {\n // --- Flow ------------------------------------------------------------\n\n /** Set the list of players whose turn is currently active. */\n setActivePlayers(activePlayers: ReadonlyArray<PlayerIdOfState<State>>): 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(): 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>>): 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>>): 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>>): 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 }): State;\n\n moveComponentToZone<Z extends ZoneIdOfTable<TableOfState<State>>>(args: {\n componentId: ZoneComponentsOfTable<TableOfState<State>, NoInfer<Z>>;\n to: ZoneArg<TableOfState<State>, Z>;\n position?: ZonePosition;\n playedBy?: PlayerIdOfState<State> | null;\n }): State;\n /**\n * Moves a component to a position input's insertion point. The point\n * counts the zone as it is now, so a card moved within its own zone lands\n * between the two cards the point was between.\n */\n moveComponentToPosition<Z extends ZoneIdOfTable<TableOfState<State>>>(args: {\n componentId: ComponentOfEveryZone<TableOfState<State>, NoInfer<Z>>;\n at: PositionTarget<Z>;\n playedBy?: PlayerIdOfState<State> | null;\n }): State;\n deal<\n From extends ZoneIdOfTable<TableOfState<State>>,\n To extends ZoneIdOfTable<TableOfState<State>>,\n >(args: {\n from: ZoneArg<TableOfState<State>, From>;\n to: ZoneArg<TableOfState<State>, To> &\n ([\n Extract<\n ZoneComponentsOfTable<TableOfState<State>, From>,\n ZoneComponentsOfTable<TableOfState<State>, To>\n >,\n ] extends [never]\n ? never\n : unknown);\n count: number;\n }): State;\n rotateZone<Z extends PlayerZoneIdOfTable<TableOfState<State>>>(\n args: RotateZoneArgs<State, Z>,\n ): State;\n setComponentOwner(args: {\n componentId: ComponentIdOfTable<TableOfState<State>>;\n ownerId: PlayerIdOfState<State> | null;\n }): State;\n setBoardVisibility(args: {\n boardId: BoardIdOfTable<TableOfState<State>>;\n visibility: RuntimeTableRecord[\"boards\"][string][\"visibility\"];\n }): State;\n setTileDisclosure(args: {\n tileId: TileIdOfTable<TableOfState<State>>;\n disclosure: ReadonlyRuntimeData<TileDisclosure>;\n }): State;\n flipCard(args: {\n cardId: CardIdOfTable<TableOfState<State>>;\n faceUp: boolean;\n }): State;\n\n /** Place or relocate an inventory tile without duplicating its membership. */\n placeTile<\n Board extends TiledBoardIdOfTable<TableOfState<State>, Definitions>,\n >(args: {\n boardId: Board;\n tileId: CompatibleTileId<TableOfState<State>, Definitions, NoInfer<Board>>;\n at: PlacementAt<\n BoardDefinitionOf<\n TableOfState<State>,\n Definitions,\n NoInfer<Board>\n >[\"layout\"]\n >;\n }): State;\n /** Detach a placed tile only after all dependent state has been removed. */\n removeTile<\n Board extends TiledBoardIdOfTable<TableOfState<State>, Definitions>,\n >(args: {\n boardId: Board;\n tileId: CompatibleTileId<TableOfState<State>, Definitions, NoInfer<Board>>;\n }): State;\n addRelation<Board extends BoardIdOfTable<TableOfState<State>>>(args: {\n boardId: Board;\n relation: RelationInputForBoard<\n Definitions,\n BoardBase<TableOfState<State>, NoInfer<Board>>\n >;\n }): State;\n removeRelation(args: {\n boardId: BoardIdOfTable<TableOfState<State>>;\n relationId: string;\n }): State;\n\n // --- Board / component movement -------------------------------------\n\n /** Move a component onto a board space. */\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<TableOfState<State>>,\n SpaceId extends SpaceIdOfTable<TableOfState<State>, BoardId, Definitions>,\n ComponentId extends SpatialComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): State;\n\n /** Move a component onto a tiled board edge. */\n moveComponentToEdge<\n BoardId extends TiledBoardIdOfTable<TableOfState<State>, Definitions>,\n EdgeId extends TiledEdgeIdOfTable<\n TableOfState<State>,\n BoardId,\n Definitions\n >,\n ComponentId extends SpatialComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n edgeId: EdgeId;\n }): State;\n\n /** Move a component onto a tiled board vertex. */\n moveComponentToVertex<\n BoardId extends TiledBoardIdOfTable<TableOfState<State>, Definitions>,\n VertexId extends TiledVertexIdOfTable<\n TableOfState<State>,\n BoardId,\n Definitions\n >,\n ComponentId extends SpatialComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n vertexId: VertexId;\n }): State;\n\n /** Move a component back to the detached pool. */\n moveComponentToDetached<\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n }): 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 * tx.addResources({ playerId, amounts: { wood: 1, brick: 1 } });\n */\n addResources(args: {\n playerId: PlayerIdOfTable<TableOfState<State>>;\n amounts: ResourceAmountsOfTable<TableOfState<State>>;\n }): 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 * tx.spendResources({ playerId, amounts: COST_DEV_CARD });\n * tx.deal({ ... });\n */\n spendResources(args: {\n playerId: PlayerIdOfTable<TableOfState<State>>;\n amounts: ResourceAmountsOfTable<TableOfState<State>>;\n }): 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<TableOfState<State>>;\n toPlayerId: PlayerIdOfTable<TableOfState<State>>;\n amounts: ResourceAmountsOfTable<TableOfState<State>>;\n }): 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<TableOfState<State>>;\n resourceId: ResourceIdOfTable<TableOfState<State>>;\n amount: number;\n }): State;\n}\n\ntype AnyTable = RuntimeTableRecord;\ntype RuntimeState = ReducerGameState<\n AnyTable,\n object,\n object,\n object,\n object,\n string\n>;\ntype AnyState = Pick<RuntimeState, \"table\">;\n\n/**\n * Internal, id-type-erased signatures for the board writer family.\n *\n * The table mutation helpers constrain their id args to manifest-derived\n * unions such as `TiledBoardIdOfTable<Table>`, which collapse to `never` for\n * the unconstrained `RuntimeTableRecord`. Inside the transaction mutation implementation\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 */\n\ntype TableMoveComponentToEdgeInPlaceInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n definitions: ZoneDefinitions,\n) => void;\n\ntype TableMoveComponentToVertexInPlaceInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n definitions: ZoneDefinitions,\n) => void;\n\nconst moveComponentToEdgeInPlaceInternal =\n // eslint-disable-next-line no-restricted-syntax -- The typed transaction edge method supplies IDs from its State; this internal adapter erases only those manifest-derived ID unions.\n tableMoveComponentToEdgeInPlace as unknown as TableMoveComponentToEdgeInPlaceInternal;\nconst moveComponentToVertexInPlaceInternal =\n // eslint-disable-next-line no-restricted-syntax -- The typed transaction vertex method supplies IDs from its State; this internal adapter erases only those manifest-derived ID unions.\n tableMoveComponentToVertexInPlace as unknown as TableMoveComponentToVertexInPlaceInternal;\n\nconst applyPatch = <T extends object>(\n prev: T,\n patch: Partial<T> | ((prev: T) => T),\n): T => {\n if (typeof patch === \"function\") {\n return patch(prev);\n }\n return { ...prev, ...patch };\n};\n\nexport const transactionMutations = {\n setActivePlayers<S extends AnyState & Pick<RuntimeState, \"flow\">>(\n state: S,\n activePlayers: ReadonlyArray<string>,\n ): S {\n return Object.assign(state, {\n flow: { ...state.flow, activePlayers: [...activePlayers] },\n });\n },\n advanceActivePlayer<S extends AnyState & Pick<RuntimeState, \"flow\">>(\n state: S,\n ): S {\n const order = state.table.playerOrder;\n if (order.length === 0) return state;\n const current = state.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 transactionMutations.setActivePlayers(state, [nextId]);\n },\n patchPhaseState<S extends AnyState & Pick<RuntimeState, \"phase\">>(\n state: S,\n patch: StatePatch<S[\"phase\"]>,\n ): S {\n return Object.assign(state, { phase: applyPatch(state.phase, patch) });\n },\n patchPublicState<S extends AnyState & Pick<RuntimeState, \"publicState\">>(\n state: S,\n patch: StatePatch<S[\"publicState\"]>,\n ): S {\n return Object.assign(state, {\n publicState: applyPatch(state.publicState, patch),\n });\n },\n patchHiddenState<S extends AnyState & Pick<RuntimeState, \"hiddenState\">>(\n state: S,\n patch: StatePatch<S[\"hiddenState\"]>,\n ): S {\n return Object.assign(state, {\n hiddenState: applyPatch(state.hiddenState, patch),\n });\n },\n patchPlayerPrivateState<\n Private extends object,\n S extends AnyState &\n Pick<\n ReducerGameState<AnyTable, object, Private, object, object, string>,\n \"privateState\"\n >,\n >(state: S, args: { playerId: string; patch: StatePatch<Private> }): S {\n const privateByPlayer = state.privateState;\n // The transaction player id belongs to the initialized roster.\n const prev = privateByPlayer[args.playerId];\n const next = applyPatch(prev, args.patch);\n return Object.assign(state, {\n privateState: { ...privateByPlayer, [args.playerId]: next },\n });\n },\n moveComponentToZone<S extends AnyState>(\n state: S,\n args: Omit<\n Parameters<typeof moveComponentToZoneInPlace>[0],\n \"table\" | \"definitions\"\n >,\n definitions: ZoneDefinitions,\n ): S {\n moveComponentToZoneInPlace({ table: state.table, definitions, ...args });\n return state;\n },\n moveComponentToPosition<S extends AnyState>(\n state: S,\n args: Omit<\n Parameters<typeof moveComponentToPositionInPlace>[0],\n \"table\" | \"definitions\"\n >,\n definitions: ZoneDefinitions,\n ): S {\n moveComponentToPositionInPlace({\n table: state.table,\n definitions,\n ...args,\n });\n return state;\n },\n deal<S extends AnyState>(\n state: S,\n args: Omit<\n Parameters<typeof dealComponentsInPlace>[0],\n \"table\" | \"definitions\"\n >,\n definitions: ZoneDefinitions,\n ): S {\n dealComponentsInPlace({ table: state.table, definitions, ...args });\n return state;\n },\n rotateZone<S extends AnyState>(\n state: S,\n args: Omit<\n Parameters<typeof rotateZoneInPlace>[0],\n \"table\" | \"definitions\"\n >,\n definitions: ZoneDefinitions,\n ): S {\n rotateZoneInPlace({ table: state.table, definitions, ...args });\n return state;\n },\n setComponentOwner<S extends AnyState>(\n state: S,\n args: { componentId: string; ownerId: string | null },\n ): S {\n const { componentId, ownerId } = args;\n if (ownerId !== null && !state.table.playerOrder.includes(ownerId))\n throw new Error(\"Component owner must name an active player.\");\n if (Object.hasOwn(state.table.cards, componentId))\n state.table.ownerOfCard[componentId] = ownerId;\n else if (Object.hasOwn(state.table.pieces, componentId))\n state.table.pieces[componentId] = {\n ...state.table.pieces[componentId],\n ownerId,\n };\n else if (Object.hasOwn(state.table.dice, componentId))\n state.table.dice[componentId] = {\n ...state.table.dice[componentId],\n ownerId,\n };\n else if (Object.hasOwn(state.table.tiles, componentId))\n state.table.tiles[componentId] = {\n ...state.table.tiles[componentId],\n ownerId,\n };\n else throw new Error(`Unknown component '${componentId}'.`);\n return state;\n },\n setBoardVisibility<S extends AnyState>(\n state: S,\n args: { boardId: string; visibility: unknown },\n definitions: ZoneDefinitions,\n ): S {\n const board = Object.hasOwn(state.table.boards, args.boardId)\n ? state.table.boards[args.boardId]\n : undefined;\n if (!board) throw new Error(`Unknown board '${args.boardId}'.`);\n const visibility = ZoneVisibilitySchema.parse(args.visibility);\n const definition = Object.hasOwn(definitions.boardDefinitions, board.baseId)\n ? definitions.boardDefinitions[board.baseId]\n : undefined;\n if (!definition)\n throw new Error(`Unknown board definition '${board.baseId}'.`);\n if (visibility === \"ownerOnly\" && definition.scope === \"shared\")\n throw new Error(\"ownerOnly board visibility requires perPlayer scope.\");\n state.table.boards[args.boardId] = { ...board, visibility };\n return state;\n },\n setTileDisclosure<S extends AnyState>(\n state: S,\n args: { tileId: string; disclosure: unknown },\n ): S {\n const tile = Object.hasOwn(state.table.tiles, args.tileId)\n ? state.table.tiles[args.tileId]\n : undefined;\n if (!tile) throw new Error(`Unknown tile '${args.tileId}'.`);\n const disclosure = TileDisclosureSchema.parse(args.disclosure);\n if (\n disclosure.face.audience === \"seats\" &&\n disclosure.face.playerIds.some(\n (playerId) => !state.table.playerOrder.includes(playerId),\n )\n )\n throw new Error(\"Tile face audience must name active roster players.\");\n const location = state.table.componentLocations[args.tileId];\n if (location?.type === \"OnBoard\" && disclosure.appearance)\n getPublicTileFootprint(disclosure.appearance, location);\n state.table.tiles[args.tileId] = { ...tile, disclosure };\n return state;\n },\n flipCard<S extends AnyState>(\n state: S,\n args: { cardId: string; faceUp: boolean },\n ): S {\n tableFlipCardInPlace(state.table, args.cardId, args.faceUp);\n return state;\n },\n placeTile<S extends AnyState>(\n state: S,\n args: { boardId: string; tileId: string; at: TilePlacementAt },\n definitions: ZoneDefinitions,\n ): S {\n placeTileInPlace({ table: state.table, definitions, ...args });\n return state;\n },\n removeTile<S extends AnyState>(\n state: S,\n args: { boardId: string; tileId: string },\n definitions: ZoneDefinitions,\n ): S {\n removeTileInPlace({ table: state.table, definitions, ...args });\n return state;\n },\n addRelation<S extends AnyState>(\n state: S,\n args: { boardId: string; relation: unknown },\n definitions: ZoneDefinitions & {\n readonly tableSchema: z.ZodType<RuntimeTableRecord>;\n },\n ): S {\n addRelationInPlace({ table: state.table, definitions, ...args });\n return state;\n },\n removeRelation<S extends AnyState>(\n state: S,\n args: { boardId: string; relationId: string },\n definitions: ZoneDefinitions,\n ): S {\n removeRelationInPlace({ table: state.table, definitions, ...args });\n return state;\n },\n moveComponentToSpace<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; spaceId: string },\n definitions: ZoneDefinitions,\n ): S {\n tableMoveComponentToSpaceInPlace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n definitions,\n );\n return state;\n },\n moveComponentToEdge<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; edgeId: string },\n definitions: ZoneDefinitions,\n ): S {\n moveComponentToEdgeInPlaceInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n definitions,\n );\n return state;\n },\n moveComponentToVertex<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; vertexId: string },\n definitions: ZoneDefinitions,\n ): S {\n moveComponentToVertexInPlaceInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n definitions,\n );\n return state;\n },\n moveComponentToDetached<S extends AnyState>(\n state: S,\n args: { componentId: string },\n definitions: ZoneDefinitions,\n ): S {\n tableMoveComponentToDetachedInPlace(\n state.table,\n args.componentId,\n definitions,\n );\n return state;\n },\n addResources<S extends AnyState>(\n state: S,\n args: { playerId: string; amounts: Record<string, number | undefined> },\n ): S {\n tableAddPlayerResourcesInPlace(state.table, args.playerId, args.amounts);\n return state;\n },\n spendResources<S extends AnyState>(\n state: S,\n args: { playerId: string; amounts: Record<string, number | undefined> },\n ): S {\n tableSpendPlayerResourcesInPlace(state.table, args.playerId, args.amounts);\n return state;\n },\n transferResources<S extends AnyState>(\n state: S,\n args: {\n fromPlayerId: string;\n toPlayerId: string;\n amounts: Record<string, number | undefined>;\n },\n ): S {\n tableTransferPlayerResourcesInPlace(\n state.table,\n args.fromPlayerId,\n args.toPlayerId,\n args.amounts,\n );\n return state;\n },\n setResource<S extends AnyState>(\n state: S,\n args: { playerId: string; resourceId: string; amount: number },\n ): S {\n tableSetPlayerResourceInPlace(\n state.table,\n args.playerId,\n args.resourceId,\n args.amount,\n );\n return state;\n },\n};\n","import type {\n GameEvent,\n GameOutcome,\n PhaseNameOfState,\n PlayerIdOfState,\n ReducerAccept,\n ReducerReject,\n ReducerResult,\n RuntimeTableRecord,\n TableQueriesOfState,\n} from \"./model\";\nimport {\n transactionMutations,\n type TransactionMutations,\n} from \"./transaction-mutations\";\nimport type { TableOfState, StringKeyOf } from \"./model\";\nimport { resolveZone, type ZoneInput } from \"./table/zones\";\nimport type { ZoneDefinitions, ZoneArg } from \"./model\";\n\nexport type TransactionRandom = {\n roll(sides: number): number;\n shuffle<Value>(\n values: readonly Value[],\n operation: \"shuffleSharedZone\" | \"shufflePlayerZone\",\n ): Value[];\n};\nimport { createStateQueries } from \"./table-queries\";\n\ntype IsAny<Value> = 0 extends 1 & Value ? true : false;\n\n/** Phase names a transaction may transition to; `string` when state is erased. */\ntype TransitionTarget<State> =\n IsAny<State> extends true ? string : PhaseNameOfState<State>;\nimport { cloneRuntimeTable } from \"./table/clone\";\n\nexport type { RotateZoneArgs } from \"./transaction-mutations\";\n\n/**\n * Outcome setters on the transaction. A mutation callback ends with one of\n * these or with a bare `return` (accept the transaction as it stands).\n */\nexport type ReducerTransactionOutcome<\n State extends { table: RuntimeTableRecord },\n ErrorCode extends string = string,\n> = {\n /** Emit display events with an explicit public or named-seat audience. */\n emit(...events: GameEvent[]): void;\n /** Accept with the current transaction state. Same as a bare `return`. */\n accept(): undefined;\n /** Accept and move the flow to another declared phase. */\n transition<To extends TransitionTarget<State>>(to: To): undefined;\n /**\n * Accept and end the game with a terminal outcome. Pass `transition` to\n * also move the flow to a terminal phase in the same result.\n */\n endGame(\n outcome: GameOutcome<PlayerIdOfState<State>>,\n options?: { transition?: TransitionTarget<State> },\n ): undefined;\n /** Reject with a declared error code. The transaction is discarded. */\n reject(errorCode: ErrorCode, message?: string): undefined;\n};\n\nexport type ReducerTransaction<\n State extends { table: RuntimeTableRecord },\n ErrorCode extends string = string,\n Definitions extends ZoneDefinitions = ZoneDefinitions,\n> = TransactionMutations<State, Definitions> &\n ReducerTransactionOutcome<State, ErrorCode> & {\n readonly state: State;\n readonly q: TableQueriesOfState<State, Definitions>;\n roll(dieId: StringKeyOf<TableOfState<State>[\"dice\"]>): number;\n shuffle(args: { zone: ZoneArg<TableOfState<State>> }): void;\n };\n\nexport type ReducerEdit<\n State extends { table: RuntimeTableRecord },\n Definitions extends ZoneDefinitions = ZoneDefinitions,\n> = <DraftState extends State>(\n state: DraftState,\n random: TransactionRandom,\n) => ReducerTransaction<DraftState, string, Definitions>;\n\nconst transactionContext = Symbol(\"dreamboard.reducerTransactionContext\");\n\ntype TransactionContext<State extends { table: RuntimeTableRecord }> = {\n currentState: State;\n currentQueries: TableQueriesOfState<State> | null;\n methodCache: Record<string, (...args: readonly unknown[]) => State>;\n events: GameEvent[];\n disposition: Omit<ReducerAccept<State>, \"state\" | \"events\"> | ReducerReject;\n random: TransactionRandom;\n definitions: ZoneDefinitions;\n rollMethod?: (dieId: string) => number;\n shuffleMethod?: (args: { zone: ZoneInput }) => void;\n outcome?: ReducerTransactionOutcome<State>;\n};\n\nfunction createOutcomeMethods<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n): ReducerTransactionOutcome<State> {\n return {\n emit(...events) {\n context.events.push(...events);\n },\n accept() {\n context.disposition = { type: \"accept\" };\n return undefined;\n },\n transition(to) {\n context.disposition = {\n type: \"accept\",\n transition: to as PhaseNameOfState<State>,\n };\n return undefined;\n },\n endGame(outcome, options) {\n context.disposition = {\n type: \"accept\",\n terminal: outcome,\n ...(options?.transition\n ? { transition: options.transition as PhaseNameOfState<State> }\n : {}),\n };\n return undefined;\n },\n reject(errorCode, message) {\n context.disposition = { type: \"reject\", errorCode, message };\n return undefined;\n },\n };\n}\n\n/** Capture the completed transaction for the runtime commit boundary. */\nexport function finishReducerTransaction<\n State extends { table: RuntimeTableRecord },\n Definitions extends ZoneDefinitions,\n>(tx: ReducerTransaction<State, string, Definitions>): ReducerResult<State> {\n const context = getTransactionContext<State>(tx);\n return context.disposition.type === \"reject\"\n ? context.disposition\n : {\n ...context.disposition,\n state: context.currentState,\n events: [...context.events],\n };\n}\n\ntype TransactionHost<State extends { table: RuntimeTableRecord }> = {\n [transactionContext]: TransactionContext<State>;\n};\n\nfunction getTransactionContext<State extends { table: RuntimeTableRecord }>(\n host: unknown,\n): TransactionContext<State> {\n const context = (host as Partial<TransactionHost<State>>)[transactionContext];\n if (!context) {\n throw new TypeError(\"Reducer transaction method called without a receiver\");\n }\n return context;\n}\n\nfunction invalidate<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n): void {\n context.currentQueries = null;\n}\n\nfunction runInternal<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n key: keyof TransactionMutations<State>,\n args: readonly unknown[],\n): State {\n // eslint-disable-next-line no-restricted-syntax -- The transaction surface forwards each typed method to the identically keyed mutation with the same State and arguments, followed by the explicit compiled definition context.\n const mutate = transactionMutations[key] as unknown as (\n state: State,\n ...args: readonly unknown[]\n ) => State;\n mutate(context.currentState, ...args, context.definitions);\n invalidate(context);\n return context.currentState;\n}\n\nfunction createReducerTransactionSurface<\n State extends { table: RuntimeTableRecord },\n>() {\n const surface = {};\n const descriptors: PropertyDescriptorMap = {\n state: {\n enumerable: true,\n get(this: unknown) {\n return getTransactionContext<State>(this).currentState;\n },\n },\n q: {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n context.currentQueries ??= createStateQueries(\n context.currentState,\n context.definitions,\n );\n return context.currentQueries;\n },\n },\n };\n\n for (const key of [\n \"emit\",\n \"accept\",\n \"transition\",\n \"endGame\",\n \"reject\",\n ] as const) {\n descriptors[key] = {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n context.outcome ??= createOutcomeMethods(context);\n return context.outcome[key];\n },\n };\n }\n\n for (const key of Object.keys(transactionMutations) as Array<\n keyof TransactionMutations<State>\n >) {\n descriptors[String(key)] = {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n const cacheKey = String(key);\n context.methodCache[cacheKey] ??= (...args: readonly unknown[]) =>\n runInternal(context, key, args);\n return context.methodCache[cacheKey];\n },\n };\n }\n\n descriptors.roll = {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n return (context.rollMethod ??= (dieId: string) => {\n const die = context.currentState.table.dice[dieId];\n if (!die) throw new Error(`Cannot roll unknown die '${dieId}'.`);\n const value = context.random.roll(die.sides);\n context.currentState.table.dice[dieId] = { ...die, value };\n invalidate(context);\n return value;\n });\n },\n };\n descriptors.shuffle = {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n return (context.shuffleMethod ??= (args: { zone: ZoneInput }) => {\n const table = context.currentState.table;\n const { ids, definition } = resolveZone(\n table,\n context.definitions,\n args.zone,\n );\n const shuffled = context.random.shuffle(\n [...ids],\n \"scope\" in definition && definition.scope === \"shared\"\n ? \"shuffleSharedZone\"\n : \"shufflePlayerZone\",\n );\n if (\n shuffled.length !== ids.length ||\n new Set(shuffled).size !== ids.length ||\n shuffled.some((id) => !ids.includes(id))\n )\n throw new Error(\"Shuffle must preserve zone membership.\");\n ids.splice(0, ids.length, ...shuffled);\n invalidate(context);\n });\n },\n };\n Object.defineProperties(surface, descriptors);\n return surface;\n}\n\nfunction createReducerTransactionFromSurface<\n State extends { table: RuntimeTableRecord },\n Definitions extends ZoneDefinitions,\n>(\n initialState: State,\n surface: object,\n random: TransactionRandom,\n definitions: Definitions,\n): ReducerTransaction<State, string, Definitions> {\n const transaction = Object.create(surface) as ReducerTransaction<\n State,\n string,\n Definitions\n > &\n TransactionHost<State>;\n Object.defineProperty(transaction, transactionContext, {\n value: {\n currentState: {\n ...initialState,\n table: cloneRuntimeTable(initialState.table),\n },\n currentQueries: null,\n methodCache: {},\n events: [],\n disposition: { type: \"accept\" },\n random,\n definitions,\n } satisfies TransactionContext<State>,\n });\n return transaction;\n}\n\nexport function createReducerTransaction<\n State extends { table: RuntimeTableRecord },\n Definitions extends ZoneDefinitions,\n>(\n initialState: State,\n random: TransactionRandom,\n definitions: Definitions,\n): ReducerTransaction<State, string, Definitions> {\n return createReducerTransactionFromSurface(\n initialState,\n createReducerTransactionSurface<State>(),\n random,\n definitions,\n );\n}\n\nexport function createReducerEdit<\n State extends { table: RuntimeTableRecord },\n Definitions extends ZoneDefinitions,\n>(definitions: Definitions): ReducerEdit<State, Definitions> {\n const surface = createReducerTransactionSurface<State>();\n return <DraftState extends State>(\n state: DraftState,\n random: TransactionRandom,\n ) => createReducerTransactionFromSurface(state, surface, random, definitions);\n}\n","import type {\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewOfContract,\n} from \"../../model\";\nimport {\n collectReducerDefinitionIndex,\n type ReducerDefinitionPhaseIndex,\n type ReducerIndexedInteractionEntry,\n type ReducerIndexedPhase,\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 TrustedPhaseRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReducerDefinitionPhaseIndex<Contract, Definitions, View>;\n\nexport interface TrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >,\n TrustedErasedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, View>>,\n TrustedPhaseRegistry<Contract, Definitions, View>\n >;\n}\n\nexport function collectTrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): TrustedRuntimeRegistry<Contract, Definitions, View> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >;\n\n const index = collectReducerDefinitionIndex(definition);\n const phasesByName = new Map<\n PhaseName,\n TrustedPhaseRegistry<Contract, Definitions, View>\n >();\n for (const phaseIndex of index.phasesByName.values()) {\n const trustedPhase: TrustedPhaseRegistry<Contract, Definitions, View> = {\n phaseName: phaseIndex.phaseName,\n phase: phaseIndex.phase,\n interactions: phaseIndex.interactions,\n };\n phasesByName.set(phaseIndex.phaseName, trustedPhase);\n }\n\n return {\n phaseEntries: index.phaseEntries,\n phasesByName,\n };\n}\n","import { finishReducerTransaction } from \"../../transaction\";\nimport type { ReducerTransaction, ReducerEdit } from \"../../transaction\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PlayerIdOfState,\n ReducerGameContractLike,\n RuntimeTableRecord,\n ZoneDefinitions,\n ReducerResult,\n TableQueriesOfState,\n} from \"../../model\";\nimport type {\n ActionContext,\n RandomHelpers,\n} from \"../../model/spec/runtime-args\";\nimport type { TrustedState } from \"./runtime-scope\";\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 return {\n currentPhase: state.flow.currentPhase,\n manifest,\n playerOrder: [...state.table.playerOrder] as PlayerId[],\n activePlayers: [...state.flow.activePlayers] as PlayerId[],\n runtime: publicRuntime(state.runtime),\n };\n}\n\nfunction publicRuntime<Runtime extends { rng?: unknown }>(\n runtime: Runtime,\n): Omit<Runtime, \"rng\"> {\n const rest = { ...runtime } as Omit<Runtime, \"rng\"> & { rng?: unknown };\n delete rest.rng;\n return rest;\n}\n\nconst DISABLED_RANDOM_HELPERS: RandomHelpers = {\n integer() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n subset() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n};\n\nconst transactionResultSymbol = Symbol(\"dreamboard.transactionResult\");\n\nexport type RuntimeArgsWithTransaction<\n DomainState extends { table: RuntimeTableRecord },\n Definitions extends ZoneDefinitions,\n> = {\n tx: ReducerTransaction<DomainState, string, Definitions>;\n [transactionResultSymbol]: () => ReducerResult<DomainState>;\n};\n\n/**\n * Capture the complete transaction after the callback returns, without opening a\n * transaction when the callback never used one.\n */\nexport function transactionResultOf<\n DomainState extends { table: RuntimeTableRecord },\n>(args: {\n [transactionResultSymbol]: () => ReducerResult<DomainState>;\n}): ReducerResult<DomainState> {\n return args[transactionResultSymbol]();\n}\n\nexport function buildRuntimeArgs<\n Contract extends ReducerGameContractLike,\n Extra extends object,\n>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n createTransaction: ReducerEdit<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n toDomainState: (\n state: TrustedState<Contract>,\n ) => BaseGameStateOfContract<Contract>,\n extra: Extra,\n options: {\n q?: TableQueriesOfState<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >;\n random?: import(\"./rng-sampler\").MutableRandomHelpers;\n } = {},\n) {\n type DomainState = BaseGameStateOfContract<Contract>;\n const domainState = toDomainState(state);\n const q = options.q ?? createStateQueries(domainState, manifest);\n const args = {\n ...buildContext(state, manifest),\n q,\n runtime: publicRuntime(state.runtime),\n random: options.random?.random ?? DISABLED_RANDOM_HELPERS,\n ...extra,\n };\n // The transaction clones the table, so open it only when a callback reads\n // `tx`. Views, actor selectors, and rules never pay for it.\n let transaction:\n | ReducerTransaction<DomainState, string, ManifestContractOf<Contract>>\n | undefined;\n Object.defineProperty(args, \"tx\", {\n enumerable: true,\n get: () => {\n if (!options.random)\n throw new Error(\n \"Transactions are only available in reducer mutation callbacks.\",\n );\n return (transaction ??= createTransaction(domainState, options.random));\n },\n });\n Object.defineProperty(args, transactionResultSymbol, {\n enumerable: false,\n value: () =>\n transaction\n ? finishReducerTransaction(transaction)\n : { type: \"accept\", state: domainState, events: [] },\n });\n return args as typeof args &\n RuntimeArgsWithTransaction<DomainState, ManifestContractOf<Contract>>;\n}\n","import type { RuntimeTableRecord } from \"../../model\";\nimport { assertJsonWithinLimits } from \"../../../runtime-json\";\nimport { GameEventSchema } from \"../../../shared/runtime-schema.js\";\nimport type {\n GameEvent,\n GameEventDetail,\n GameOutcome,\n OutcomeScoreComponent,\n OutcomeStanding,\n OutcomeTieBreak,\n ReducerReject,\n ReducerResult,\n SystemActionEvent,\n} from \"../../model\";\n\nconst OUTCOME_STRING_LIMIT = 256;\nconst OUTCOME_LABEL_LIMIT = 128;\nconst OUTCOME_MAX_STANDINGS = 32;\nconst OUTCOME_MAX_COMPONENTS = 32;\nconst OUTCOME_MAX_TIE_BREAKS = 16;\nconst GAME_EVENT_STRING_LIMIT = 256;\nconst GAME_EVENT_LABEL_LIMIT = 128;\nconst GAME_EVENT_MAX_EVENTS = 32;\nconst GAME_EVENT_MAX_DETAILS = 16;\n\nfunction failOutcome(message: string): never {\n throw new Error(`Invalid GameOutcome: ${message}`);\n}\n\nfunction failGameEvent(message: string): never {\n throw new Error(`Invalid GameEvent: ${message}`);\n}\n\nfunction assertNonEmptyBoundedString(\n value: unknown,\n label: string,\n maxLength = OUTCOME_STRING_LIMIT,\n): asserts value is string {\n if (typeof value !== \"string\" || value.length === 0) {\n failOutcome(`${label} must be a non-empty string`);\n }\n if (value.length > maxLength) {\n failOutcome(`${label} is too long`);\n }\n}\n\nfunction assertGameEventString(\n value: unknown,\n label: string,\n maxLength = GAME_EVENT_STRING_LIMIT,\n): asserts value is string {\n if (typeof value !== \"string\" || value.length === 0) {\n failGameEvent(`${label} must be a non-empty string`);\n }\n if (value.length > maxLength) {\n failGameEvent(`${label} is too long`);\n }\n}\n\nfunction assertFiniteNumber(\n value: unknown,\n label: string,\n): asserts value is number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n failOutcome(`${label} must be a finite number`);\n }\n}\n\nfunction assertUniqueIds(\n entries: readonly (OutcomeScoreComponent | OutcomeTieBreak)[] | undefined,\n label: string,\n): void {\n if (!entries) return;\n const seen = new Set<string>();\n for (const entry of entries) {\n assertNonEmptyBoundedString(entry.id, `${label}.id`, OUTCOME_LABEL_LIMIT);\n assertNonEmptyBoundedString(\n entry.label,\n `${label}.label`,\n OUTCOME_LABEL_LIMIT,\n );\n if (seen.has(entry.id)) {\n failOutcome(`${label} contains duplicate id '${entry.id}'`);\n }\n seen.add(entry.id);\n }\n}\n\nfunction assertStandingValues<PlayerId extends string>(\n standing: OutcomeStanding<PlayerId>,\n): void {\n if (!Number.isInteger(standing.rank) || standing.rank < 1) {\n failOutcome(`standing for '${standing.playerId}' has invalid rank`);\n }\n if (\n standing.result !== \"win\" &&\n standing.result !== \"draw\" &&\n standing.result !== \"loss\" &&\n standing.result !== \"eliminated\"\n ) {\n failOutcome(`standing for '${standing.playerId}' has invalid result`);\n }\n if (standing.score !== undefined) {\n assertFiniteNumber(standing.score, `standing '${standing.playerId}'.score`);\n }\n if ((standing.scoreBreakdown?.length ?? 0) > OUTCOME_MAX_COMPONENTS) {\n failOutcome(\n `standing '${standing.playerId}' has too many score components`,\n );\n }\n if ((standing.tieBreaks?.length ?? 0) > OUTCOME_MAX_TIE_BREAKS) {\n failOutcome(`standing '${standing.playerId}' has too many tie-breaks`);\n }\n assertUniqueIds(standing.scoreBreakdown, \"scoreBreakdown\");\n assertUniqueIds(standing.tieBreaks, \"tieBreaks\");\n for (const component of standing.scoreBreakdown ?? []) {\n assertFiniteNumber(\n component.value,\n `standing '${standing.playerId}'.scoreBreakdown '${component.id}'`,\n );\n }\n for (const tieBreak of standing.tieBreaks ?? []) {\n if (typeof tieBreak.value === \"number\") {\n assertFiniteNumber(\n tieBreak.value,\n `standing '${standing.playerId}'.tieBreak '${tieBreak.id}'`,\n );\n } else {\n assertNonEmptyBoundedString(\n tieBreak.value,\n `standing '${standing.playerId}'.tieBreak '${tieBreak.id}'`,\n OUTCOME_LABEL_LIMIT,\n );\n }\n }\n}\n\nexport function normalizeGameOutcome<\n State extends { table: Pick<RuntimeTableRecord, \"playerOrder\"> },\n PlayerId extends string,\n>(state: State, outcome: GameOutcome<PlayerId>): GameOutcome<PlayerId> {\n assertJsonWithinLimits(\n outcome,\n {\n maxDepth: 16,\n maxNodes: 2_000,\n maxStringBytes: 32_768,\n maxCollectionEntries: 1_000,\n },\n \"GameOutcome\",\n );\n assertNonEmptyBoundedString(\n outcome.reason?.code,\n \"reason.code\",\n OUTCOME_LABEL_LIMIT,\n );\n if (outcome.reason.message !== undefined) {\n assertNonEmptyBoundedString(outcome.reason.message, \"reason.message\");\n }\n if (outcome.standings.length === 0) {\n failOutcome(\"standings must not be empty\");\n }\n if (outcome.standings.length > OUTCOME_MAX_STANDINGS) {\n failOutcome(\"standings contains too many rows\");\n }\n\n const playerOrder = state.table.playerOrder;\n if (playerOrder.length === 0) {\n failOutcome(\"state.table.playerOrder must list configured players\");\n }\n const playerOrderIndex = new Map(\n playerOrder.map((playerId, index) => [playerId, index]),\n );\n const seen = new Set<string>();\n for (const standing of outcome.standings) {\n assertNonEmptyBoundedString(\n standing.playerId,\n \"standing.playerId\",\n OUTCOME_LABEL_LIMIT,\n );\n if (!playerOrderIndex.has(standing.playerId)) {\n failOutcome(`unknown player '${standing.playerId}'`);\n }\n if (seen.has(standing.playerId)) {\n failOutcome(`duplicate player '${standing.playerId}'`);\n }\n seen.add(standing.playerId);\n assertStandingValues(standing);\n }\n for (const playerId of playerOrder) {\n if (!seen.has(playerId)) {\n failOutcome(`missing player '${playerId}'`);\n }\n }\n\n return {\n reason: { ...outcome.reason },\n standings: [...outcome.standings].sort((left, right) => {\n const rank = left.rank - right.rank;\n if (rank !== 0) return rank;\n return (\n (playerOrderIndex.get(left.playerId) ?? Number.MAX_SAFE_INTEGER) -\n (playerOrderIndex.get(right.playerId) ?? Number.MAX_SAFE_INTEGER)\n );\n }),\n };\n}\n\nfunction normalizeGameEventDetail(\n detail: GameEventDetail,\n index: number,\n): GameEventDetail {\n assertGameEventString(\n detail.label,\n `details[${index}].label`,\n GAME_EVENT_LABEL_LIMIT,\n );\n if (typeof detail.value === \"number\") {\n assertFiniteNumber(detail.value, `details[${index}].value`);\n } else if (typeof detail.value === \"string\") {\n assertGameEventString(\n detail.value,\n `details[${index}].value`,\n GAME_EVENT_STRING_LIMIT,\n );\n } else if (\n typeof detail.value === \"object\" &&\n detail.value?.kind === \"tile\"\n ) {\n assertGameEventString(\n detail.value.tileId,\n `details[${index}].value.tileId`,\n );\n } else if (typeof detail.value !== \"boolean\") {\n failGameEvent(\n `details[${index}].value must be a scalar or typed tile reference`,\n );\n }\n return {\n label: detail.label,\n value: detail.value,\n };\n}\n\nfunction normalizeSystemActionEvent(\n input: SystemActionEvent,\n): SystemActionEvent {\n const event = GameEventSchema.parse(input);\n assertGameEventString(\n event.procedureId,\n \"procedureId\",\n GAME_EVENT_LABEL_LIMIT,\n );\n assertGameEventString(event.title, \"title\", GAME_EVENT_STRING_LIMIT);\n if (event.summary !== undefined) {\n assertGameEventString(event.summary, \"summary\", GAME_EVENT_STRING_LIMIT);\n }\n if ((event.details?.length ?? 0) > GAME_EVENT_MAX_DETAILS) {\n failGameEvent(\"systemAction has too many details\");\n }\n return {\n kind: \"systemAction\",\n audience: event.audience,\n procedureId: event.procedureId,\n title: event.title,\n ...(event.summary !== undefined ? { summary: event.summary } : {}),\n ...(event.details !== undefined\n ? {\n details: event.details.map((detail, index) =>\n normalizeGameEventDetail(detail, index),\n ),\n }\n : {}),\n };\n}\n\nexport function normalizeGameEvents(\n events: readonly GameEvent[] = [],\n): GameEvent[] {\n assertJsonWithinLimits(\n events,\n {\n maxDepth: 8,\n maxNodes: 1_000,\n maxStringBytes: 32_768,\n maxCollectionEntries: 1_000,\n },\n \"GameEvent\",\n );\n if (events.length > GAME_EVENT_MAX_EVENTS) {\n failGameEvent(\"accepted result has too many events\");\n }\n return events.map((event, index) => {\n if (event.kind !== \"systemAction\") {\n failGameEvent(`events[${index}].kind is unsupported`);\n }\n return normalizeSystemActionEvent(event);\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<\n State extends { table: Pick<RuntimeTableRecord, \"playerOrder\"> },\n>(result: ReducerResult<State>): ReducerResult<State> {\n if (result.type === \"accept\") {\n // Enforce canonical event and terminal limits before committing.\n return {\n ...result,\n\n events: normalizeGameEvents(result.events),\n ...(result.terminal\n ? { terminal: normalizeGameOutcome(result.state, result.terminal) }\n : {}),\n };\n }\n return result;\n}\n","export function toDomainState<State extends { runtime: unknown }, DomainState>(\n state: State,\n): DomainState {\n const domain = { ...state } as Omit<State, \"runtime\"> & { runtime?: unknown };\n delete domain.runtime;\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 { createReducerEdit } from \"../../transaction\";\nimport type { TrustedRuntimeInput } from \"../../core/types\";\nimport { createReducerDiagnosticsEmitter } from \"../../diagnostics\";\nimport type {\n ReducerDiagnosticsEmitter,\n ReducerDiagnosticsSink,\n} from \"../../diagnostics\";\nimport type {\n AnyInteractionSpec,\n BaseGameSessionOfContract,\n BaseGameStateOfContract,\n ManifestContractOf,\n ExactManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n PlayerIdOfState,\n ReducerGameContractLike,\n ReducerGameDefinition,\n TableQueriesOfState,\n ViewOfContract,\n} from \"../../model\";\nimport type {\n ActionContext,\n RandomHelpers,\n} from \"../../model/spec/runtime-args\";\nimport {\n collectTrustedRuntimeRegistry,\n type TrustedErasedPhase,\n type TrustedInteractionEntry,\n type TrustedPhaseRegistry,\n type TrustedRuntimeRegistry,\n} from \"./runtime-registry\";\nimport {\n buildContext as buildTrustedContext,\n buildRuntimeArgs as buildTrustedRuntimeArgs,\n type RuntimeArgsWithTransaction,\n} from \"./trusted-runtime-args\";\nimport { rejectResult } from \"./trusted-runtime-result\";\nimport {\n toCombinedState as codecToCombinedState,\n toDomainState as codecToDomainState,\n toSessionState as codecToSessionState,\n} from \"./trusted-state-codec\";\n\nexport { normalizeResult } from \"./trusted-runtime-result\";\nexport { rejectResult };\n\nexport type TrustedDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReducerGameDefinition<Contract, Definitions, View>;\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 { ManifestContractOf as TrustedManifest } from \"../../model/extract.js\";\n\nexport type TrustedPhaseName<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = PhaseNamesOfDefinition<TrustedDefinition<Contract, Definitions, View>>;\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 TrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> {\n definition: TrustedDefinition<Contract, Definitions, View>;\n manifest: ManifestContractOf<Contract> & ExactManifestContractOf<Contract>;\n diagnostics: ReducerDiagnosticsEmitter;\n registry: TrustedRuntimeRegistry<Contract, Definitions, View>;\n phaseEntries: ReadonlyArray<\n readonly [\n TrustedPhaseName<Contract, Definitions, View>,\n TrustedErasedPhase<Contract>,\n ]\n >;\n defaultInitialPhase: TrustedPhaseName<Contract, Definitions, View>;\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, View>,\n ): TrustedPhaseRegistry<Contract, Definitions, View> | undefined;\n phaseByName(\n phaseName: TrustedPhaseName<Contract, Definitions, View>,\n ): TrustedErasedPhase<Contract>;\n findInteractionInPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, View>,\n interactionId: string,\n ):\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n ManifestContractOf<Contract>\n >\n | undefined;\n interactionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, View>,\n ): ReadonlyArray<TrustedInteractionEntry<Contract>>;\n\n buildContext(\n state: TrustedState<Contract>,\n ): ActionContext<TrustedDomainState<Contract>, ManifestContractOf<Contract>>;\n buildRuntimeArgs<Extra extends object>(\n state: TrustedState<Contract>,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<\n TrustedDomainState<Contract>,\n ManifestContractOf<Contract>\n >;\n random?: import(\"./rng-sampler\").MutableRandomHelpers;\n },\n ): ActionContext<\n TrustedDomainState<Contract>,\n ManifestContractOf<Contract>\n > & {\n q: TableQueriesOfState<\n TrustedDomainState<Contract>,\n ManifestContractOf<Contract>\n >;\n runtime: Omit<TrustedState<Contract>[\"runtime\"], \"rng\">;\n random: RandomHelpers;\n } & RuntimeArgsWithTransaction<\n TrustedDomainState<Contract>,\n ManifestContractOf<Contract>\n > &\n Extra;\n}\n\nexport function createTrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: TrustedDefinition<Contract, Definitions, View>,\n options: { diagnostics?: ReducerDiagnosticsSink } = {},\n): TrustedRuntimeScope<Contract, Definitions, View> {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n // The manifest is supplied by this same Contract. Bind its conditional\n // table and identity projections once at the runtime composition boundary.\n const manifest = definition.contract\n .manifest as ManifestContractOf<Contract> &\n ExactManifestContractOf<Contract>;\n const registry = collectTrustedRuntimeRegistry(definition);\n const { phaseEntries } = registry;\n const defaultInitialPhase = definition.initialPhase ?? phaseEntries[0]?.[0];\n if (!defaultInitialPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\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, View> | 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 const createTransaction = createReducerEdit<DomainState, Manifest>(manifest);\n\n function buildContext(state: State): ActionContext<DomainState, Manifest> {\n return buildTrustedContext<Contract>(state, manifest);\n }\n\n function buildRuntimeArgs<Extra extends object>(\n state: State,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<DomainState, Manifest>;\n random?: import(\"./rng-sampler\").MutableRandomHelpers;\n },\n ) {\n return buildTrustedRuntimeArgs<Contract, Extra>(\n state,\n manifest,\n createTransaction,\n toDomainState,\n extra,\n options,\n );\n }\n\n return {\n definition,\n manifest,\n diagnostics: createReducerDiagnosticsEmitter(options.diagnostics),\n registry,\n phaseEntries,\n defaultInitialPhase,\n\n toDomainState,\n toCombinedState,\n toSessionState,\n phaseRegistryByName,\n phaseByName,\n findInteractionInPhase,\n interactionEntriesForPhase,\n buildContext,\n buildRuntimeArgs,\n };\n}\n","import type {\n AnyInteractionSpec,\n CollectorState,\n InputCollector,\n ManifestContract,\n TableOfState,\n} from \"../../model\";\n\nexport function collectTargetDomainMetadata(collector: InputCollector): {\n targetKind?: string;\n boardId?: string;\n boardBaseId?: string;\n boardIds?: readonly string[];\n valueKind?: \"board-id\" | \"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 \"tile\":\n return {\n targetKind: \"tile\",\n zoneIds: collector.meta.zoneIds,\n boardIds: collector.meta.boardIds,\n };\n case \"board-edge\":\n case \"board-space\":\n case \"board-vertex\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? collector.kind.replace(\"board-\", \"\"),\n ...(meta.valueKind === \"board-space\"\n ? { boardBaseId: meta.boardBaseId }\n : { boardId: \"boardId\" in meta ? meta.boardId : undefined }),\n valueKind: meta.valueKind,\n };\n }\n default:\n return {};\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 ?? {};\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 boardBaseId?: string;\n boardIds?: readonly 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 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 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\n/** Declared reference positions; arbitrary game strings are never scanned. */\nexport function collectTileInputKeys<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): ReadonlySet<string> {\n return new Set(\n Object.entries(interactionInputsOf(interaction))\n .filter(([, collector]) => collector.kind === \"tile\")\n .map(([key]) => key),\n );\n}\n\nexport function collectTileZoneIds<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): readonly string[] {\n return [\n ...new Set(\n Object.values(interactionInputsOf(interaction)).flatMap((collector) =>\n collector.kind === \"tile\" ? collector.meta.zoneIds : [],\n ),\n ),\n ];\n}\n","import type {\n InteractionDescriptor,\n InteractionCommitPolicy,\n InteractionAvailability,\n InteractionDiagnosticReason,\n InteractionInputDescriptor,\n} from \"../../../shared/interaction-schema\";\nimport type {\n InputDomainDescriptor,\n AnyInteractionSpec,\n InteractionIdOfDefinition,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewOfContract,\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\";\nimport type {\n CollectorInputEnumeration,\n CollectorInputSatisfiability,\n} from \"./collector-input-solver\";\n\nexport type TrustedInteractionId<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = InteractionIdOfDefinition<TrustedDefinition<Contract, Definitions, View>>;\n\nexport type InteractionCommitPolicyShape = InteractionCommitPolicy;\nexport type InteractionAvailabilityShape = InteractionAvailability;\n\nexport type InteractionDecision =\n | { available: true }\n | {\n available: false;\n code: string;\n ruleId?: string;\n message?: string;\n };\n\nexport type InteractionDiagnosticReasonShape = InteractionDiagnosticReason;\n\nexport type InteractionExplanation = {\n interactionId: string;\n phase: string;\n step: string | null;\n availability:\n \"available\" | \"notYourTurn\" | \"wrongPhase\" | \"wrongStep\" | \"blocked\";\n rules: ReadonlyArray<{\n ruleId: string;\n outcome: \"passed\" | \"failed\" | \"notEvaluated\";\n errorCode?: string;\n message?: string;\n }>;\n actor: { required: readonly string[]; playerIsActor: boolean };\n inputs: ReadonlyArray<{\n key: string;\n kind: string;\n eligibleCount: number | \"unknown\";\n }>;\n};\n\n// Before projection admission, authored collectors may still return unknown values.\n// All transport fields derive from the admitting schema; only game identity and\n// the not-yet-admitted authored values are narrowed here.\nexport type InteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = Omit<\n InteractionDescriptor,\n | \"phaseName\"\n | \"interactionKey\"\n | \"interactionId\"\n | \"zoneId\"\n | \"zoneIds\"\n | \"inputs\"\n | \"step\"\n> & {\n phaseName: PhaseName;\n interactionKey: `${PhaseName}.${InteractionId}`;\n interactionId: InteractionId;\n zoneId?: ZoneId;\n zoneIds?: readonly ZoneId[];\n inputs: readonly InteractionInputDescriptorShape[];\n step?: Omit<NonNullable<InteractionDescriptor[\"step\"]>, \"selected\"> & {\n selected: Record<string, unknown>;\n };\n};\n\nexport type TrustedInteractionDescriptorShape<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = InteractionDescriptorShape<\n TrustedPhaseName<Contract, Definitions, View>,\n TrustedInteractionId<Contract, Definitions, View>\n>;\n\nexport type InteractionInputDescriptorShape = Omit<\n InteractionInputDescriptor,\n \"defaultValue\" | \"domain\"\n> & { defaultValue?: unknown; domain: InputDomainDescriptor };\n\nexport type InteractionActorAuthorization<PlayerId extends string> =\n | { readonly mode: \"actors\"; readonly actors: ReadonlySet<PlayerId> }\n | { readonly mode: \"active\" };\n\nexport type ResolveDecisionMode = \"descriptor\" | \"card\" | \"submit\";\n\nexport type InteractionDiagnosticsMode = \"verbose\" | undefined;\n\nexport type ResolveDecisionInput<Contract extends ReducerGameContractLike> = {\n state: TrustedState<Contract>;\n playerId: TrustedPlayerId<Contract>;\n interactionId: string;\n params?: Record<string, unknown>;\n mode: ResolveDecisionMode;\n /**\n * Internal finite-domain optimization. The caller has already proven the\n * param-independent actor, stage, step, and availability-rule invariants;\n * concrete submit validation still parses params and evaluates targets,\n * cost, and authored validate rules.\n */\n candidateInvariantsValidated?: boolean;\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >;\n};\n\nexport type InteractionDecisionResult<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<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 stepResult?: { values: unknown[]; complete: boolean };\n visible: boolean;\n descriptor: TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n View\n >;\n /** Trusted collector/domain satisfiability used by inspect/explore. */\n inputSatisfiability?: CollectorInputSatisfiability;\n validation: ReducerValidationResult;\n };\n\nexport type InteractionActionabilityResult =\n | { readonly found: false }\n | { readonly found: true; readonly visible: false }\n | {\n readonly found: true;\n readonly visible: true;\n readonly descriptor: InteractionDescriptorShape;\n readonly inputSatisfiability?: CollectorInputSatisfiability;\n };\n\nexport type InteractionInputEnumerationResult =\n | { readonly found: false }\n | { readonly found: true; readonly visible: false }\n | {\n readonly found: true;\n readonly visible: true;\n readonly descriptor: InteractionDescriptorShape;\n readonly inputSatisfiability?: CollectorInputSatisfiability;\n /** Null when trusted availability fails before input enumeration. */\n readonly enumeration: CollectorInputEnumeration | null;\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 type { ZoneDefinitions } from \"../../model\";\nimport {\n inputValueInDomain,\n inputValueKey,\n} from \"../../../shared/input-domain\";\nimport { formatIssue } from \"../../parse-utils\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n InputCollector,\n InputSelectionDescriptor,\n ManifestContract,\n ReducerValidationResult,\n TableOfState,\n} from \"../../model\";\nimport { makeValidationError } from \"./interaction-types\";\nimport { interactionInputsOf } from \"./collector-introspection\";\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 } = {},\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 (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 };\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 rawValue =\n record[key] === undefined && \"defaultValue\" in collector\n ? collector.defaultValue\n : record[key];\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 definitions: ZoneDefinitions,\n): ReducerValidationResult {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: ReturnType<typeof createStateQueries> | null = null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(domainState, definitions));\n for (const [key, collector] of Object.entries(collectors)) {\n const issue = validateCollectorValue(\n collector,\n domainState,\n playerId,\n queries(),\n params[key],\n );\n if (issue) return makeValidationError(issue.errorCode, issue.message);\n }\n return { valid: true };\n}\n\nexport function validateCollectorValue(\n collector: InputCollector,\n state: CollectorState,\n playerId: string,\n q: unknown,\n value: unknown,\n domain = collector.domain?.(state, playerId, q),\n): { errorCode: string; message?: string } | null {\n const selectionIssue = validateCollectorSelection(collector, value);\n if (selectionIssue) return selectionIssue;\n if (value === undefined || collector.kind === \"rng\") return null;\n if (value !== null) {\n for (const target of valuesForCollectorValidation(\n collector.selection,\n value,\n )) {\n const issue = collector.validateTarget?.(state, playerId, q, target);\n if (issue) return issue;\n }\n }\n return domain && !inputValueInDomain(domain, value, collector.selection)\n ? {\n errorCode: \"INVALID_INPUT_VALUE\",\n message: \"Selected value is outside the current input domain.\",\n }\n : null;\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\nexport function 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 = inputValueKey(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","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\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 View extends ViewOfContract<Contract>,\n> = ReturnType<TrustedRuntimeScope<Contract, Definitions, View>[\"phaseByName\"]>;\n\nexport function isSimultaneousPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(phase: ErasedPhase<Contract, Definitions, View>): boolean {\n return phase.kind === \"simultaneousPlayer\";\n}\n\nexport function simultaneousSubmitInteraction<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n phase: ErasedPhase<Contract, Definitions, View>,\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: PlayerId | readonly PlayerId[] | null | undefined,\n): PlayerId[] {\n if (value === undefined || value === null) return [];\n return typeof value === \"string\" ? [value] : [...value];\n}\n\nexport function resolveSimultaneousActors<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n state: TrustedState<Contract>,\n phase: ErasedPhase<Contract, Definitions, View>,\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >,\n): TrustedPlayerId<Contract>[] {\n type PlayerId = TrustedPlayerId<Contract>;\n const selector = phase.actors ?? phase.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","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\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 resolveActorSet<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 View extends ViewOfContract<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, View>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInteractionActorAuthorization(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, TrustedManifest<Contract>>,\n ): InteractionActorAuthorization<PlayerId> {\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: resolveActorSet<PlayerId>(resolved),\n };\n }\n const phase = scope.phaseByName(state.flow.currentPhase);\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: resolveActorSet<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 === \"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 return {\n isActorAuthorized,\n resolveInteractionActorAuthorization,\n };\n}\n","import * as z from \"zod\";\nimport { SeatTileRefSchema } from \"../shared/domain/seat-reference.js\";\nimport { getZodDef } from \"./schema-helpers\";\nimport { collectReducerDefinitionIndex } from \"./definition-index\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewOfContract,\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\nexport function 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 if (collector.kind === \"tile\") {\n shape[key] = clientTileSchema(collector);\n continue;\n }\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);\n}\n\n/** Schemas for trusted authored commands before seat-reference adaptation. */\nexport function schemaForAuthorCollectors(\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);\n}\n\nexport function createAuthorParamSchemasByPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\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 schemas: Record<string, ClientParamSchema> = {};\n for (const [id, interaction] of phaseIndex.interactions) {\n if (interaction.steps) continue;\n schemas[id] =\n interaction.paramsSchema ??\n schemaForAuthorCollectors(interaction.inputs);\n }\n out[String(phaseIndex.phaseName)] = schemas;\n }\n return out;\n}\n\nexport function createClientParamSchemasByPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\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 if (interaction.steps) continue;\n const tileInputs = Object.entries(interaction.inputs).filter(\n ([, collector]) => collector.kind === \"tile\",\n );\n if (tileInputs.length && interaction.paramsSchema) {\n const schema = interaction.paramsSchema;\n const def = getZodDef(schema);\n if (\n !(schema instanceof z.ZodObject) ||\n (def.checks?.length ?? 0) > 0 ||\n tileInputs.some(([key]) => !Object.hasOwn(schema.shape, key))\n )\n throw new Error(\n \"Tile inputs with custom paramsSchema require an unrefined object containing each declared tile input key.\",\n );\n // Replace only declared tile positions; game-authored strings remain untouched.\n phaseSchemas[id] = schema.extend(\n Object.fromEntries(\n tileInputs.map(([key, collector]) => [\n key,\n clientTileSchema(collector),\n ]),\n ),\n );\n } else {\n phaseSchemas[id] =\n interaction.paramsSchema ?? schemaForCollectors(interaction.inputs);\n }\n }\n out[String(phaseIndex.phaseName)] = phaseSchemas;\n }\n return out;\n}\n\nfunction clientTileSchema(collector: InputCollector): z.ZodType {\n if (collector.kind !== \"tile\") throw new Error(\"Expected tile collector.\");\n // Trusted defaults name inventory. Only the projected descriptor can supply a seat default.\n if (collector.selection?.mode !== \"many\") return SeatTileRefSchema;\n const selection = collector.selection;\n let schema = z.array(SeatTileRefSchema).min(selection.min);\n if (selection.max !== undefined) schema = schema.max(selection.max);\n return selection.distinct\n ? schema.refine(\n (values) => new Set(values).size === values.length,\n \"Tile references must be distinct.\",\n )\n : schema;\n}\n","import type { ZoneDefinitions } from \"../../model\";\nimport type { StepDefinition } from \"../../authoring/steps\";\nimport type {\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n PlayerIdOfState,\n} from \"../../model\";\nimport { createStateQueries } from \"../../table-queries\";\nimport { validateCollectorValue } from \"./collector-params\";\n\nexport type StepPrefix = {\n selected: Record<string, unknown>;\n collectors: Record<string, InputCollector>;\n values: unknown[];\n current:\n | { key: string; collector: InputCollector; domain?: InputDomainDescriptor }\n | undefined;\n issue: string | undefined;\n complete: boolean;\n};\n\n/** Evaluate in order against authoritative state. Never samples RNG or applies defaults. */\nexport function evaluateStepPrefix<\n State extends CollectorState,\n Definitions extends ZoneDefinitions,\n>(\n steps: StepDefinition<Record<string, InputCollector>, Definitions>,\n state: State,\n playerId: PlayerIdOfState<State>,\n values: readonly unknown[],\n definitions: Definitions,\n): StepPrefix {\n const q = createStateQueries<CollectorState, Definitions>(state, definitions);\n const selected: Record<string, unknown> = {};\n const collectors: Record<string, InputCollector> = {};\n const validValues: unknown[] = [];\n let current:\n | { key: string; collector: InputCollector; domain?: InputDomainDescriptor }\n | undefined;\n let issue: string | undefined;\n for (const entry of steps.entries) {\n const collector = entry.resolve({ state, playerId, q, selected });\n const domain = collector.domain?.(state, playerId, q);\n current = { key: entry.key, collector, domain };\n if (validValues.length === values.length) break;\n const value = values[validValues.length];\n const parsed = collector.schema.safeParse(value);\n if (!parsed.success || value === undefined || parsed.data === undefined) {\n issue = `Invalid value for step '${entry.key}'.`;\n break;\n }\n if (\n validateCollectorValue(collector, state, playerId, q, parsed.data, domain)\n ) {\n issue = `Value for step '${entry.key}' is no longer eligible.`;\n break;\n }\n selected[entry.key] = parsed.data;\n collectors[entry.key] = collector;\n validValues.push(value);\n current = undefined;\n }\n if (values.length > steps.entries.length)\n issue = \"Too many committed step values.\";\n return {\n selected,\n collectors,\n values: validValues,\n current,\n issue,\n complete: !current && validValues.length === steps.entries.length,\n };\n}\n","import { zonePositions } from \"../../../shared/position-target.js\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n ManifestContract,\n TableOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport { interactionInputsOf } from \"./collector-introspection\";\n\nexport type CollectorInputSatisfiability =\n | { readonly status: \"yes\" }\n | { readonly status: \"no\"; readonly inputKey?: string }\n | { readonly status: \"notEnumerable\"; readonly inputKey?: string };\n\nexport type CollectorInputEnumeration =\n | {\n readonly status: \"enumerated\";\n readonly assignments: readonly Readonly<Record<string, unknown>>[];\n readonly evaluated: number;\n }\n | {\n readonly status: \"notEnumerable\";\n readonly assignments: readonly [];\n readonly evaluated: number;\n readonly inputKey?: string;\n }\n | {\n readonly status: \"budget\";\n readonly assignments: readonly [];\n readonly evaluated: number;\n readonly inputKey?: string;\n };\n\nexport type CollectorInputSolverOptions<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n> = {\n readonly interaction: AnyInteractionSpec<DomainState, Manifest>;\n readonly domainState: DomainState;\n readonly playerId: PlayerId;\n readonly definitions: Manifest;\n readonly queries?: TableQueriesOfState<DomainState, Manifest>;\n /** Values already selected by a trusted caller, such as a card projection. */\n readonly initialValues?: Readonly<Record<string, unknown>>;\n /**\n * Final trusted acceptance check for one structurally complete assignment.\n * The decision layer supplies the normal submit validator here so collector\n * domains cannot advertise commands rejected by rules, costs, or targets.\n */\n readonly acceptsAssignment?: (\n assignment: Readonly<Record<string, unknown>>,\n ) => boolean;\n};\n\ntype ValueSource = {\n /** False means the yielded values are witnesses, not an exhaustive domain. */\n readonly complete: boolean;\n readonly values: () => Iterable<unknown>;\n};\n\nconst ABSENT_COLLECTOR_VALUE = Symbol(\"absentCollectorValue\");\n\ntype SolverContext = {\n readonly interaction: Pick<\n AnyInteractionSpec<\n CollectorState,\n ManifestContract<CollectorState[\"table\"]>\n >,\n \"paramsSchema\"\n >;\n readonly domainState: CollectorState;\n readonly playerId: string;\n readonly collectors: readonly (readonly [string, InputCollector])[];\n readonly initialValues: Readonly<Record<string, unknown>>;\n readonly acceptsAssignment: (\n assignment: Readonly<Record<string, unknown>>,\n ) => boolean;\n readonly queries: () => unknown;\n};\n\ntype RecursiveSatisfiability =\n | {\n readonly status: \"yes\";\n readonly assignment: Readonly<Record<string, unknown>>;\n }\n | { readonly status: \"no\"; readonly inputKey?: string }\n | { readonly status: \"notEnumerable\"; readonly inputKey?: string };\n\nclass EnumerationBudgetError extends Error {\n readonly inputKey?: string;\n\n constructor(inputKey?: string) {\n super(\"Collector input enumeration exceeded its evaluation budget.\");\n this.name = \"EnumerationBudgetError\";\n this.inputKey = inputKey;\n }\n}\n\nclass DomainNotEnumerableError extends Error {\n readonly inputKey?: string;\n\n constructor(inputKey?: string) {\n super(\"Collector input domain is not completely enumerable.\");\n this.name = \"DomainNotEnumerableError\";\n this.inputKey = inputKey;\n }\n}\n\n/**\n * Proves whether collector/domain authority contains at least one complete\n * client parameter assignment. This operation has no pagination or evaluation\n * budget: changing an explore page can never change production actionability.\n */\nexport function hasAnyCollectorInputAssignment<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n options: CollectorInputSolverOptions<DomainState, Manifest, PlayerId>,\n): CollectorInputSatisfiability {\n const context = createSolverContext(options);\n const result = findFirstAssignment(context, 0, {});\n return result.status === \"yes\" ? { status: \"yes\" } : result;\n}\n\n/**\n * Materializes the complete finite collector domain in deterministic order.\n * Results are all-or-nothing: an opaque/unbounded branch or exhausted budget\n * returns an omission status instead of a misleading partial domain.\n */\nexport function enumerateCollectorInputAssignments<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n options: CollectorInputSolverOptions<DomainState, Manifest, PlayerId> & {\n readonly maxEvaluations: number;\n },\n): CollectorInputEnumeration {\n assertEvaluationBudget(options.maxEvaluations);\n const context = createSolverContext(options);\n const assignments: Array<Readonly<Record<string, unknown>>> = [];\n let evaluated = 0;\n\n const accountEvaluation = (inputKey?: string): void => {\n if (evaluated >= options.maxEvaluations) {\n throw new EnumerationBudgetError(inputKey);\n }\n evaluated += 1;\n };\n\n const visit = (\n collectorIndex: number,\n assignment: Readonly<Record<string, unknown>>,\n ): void => {\n const entry = context.collectors[collectorIndex];\n if (!entry) {\n accountEvaluation();\n const complete = completeAssignment(context, assignment);\n if (complete.status === \"yes\") assignments.push(complete.assignment);\n if (complete.status === \"notEnumerable\") {\n throw new DomainNotEnumerableError(complete.inputKey);\n }\n return;\n }\n\n const [inputKey, collector] = entry;\n if (collector.kind === \"rng\") {\n visit(collectorIndex + 1, assignment);\n return;\n }\n\n const source = valueSourceForCollector(context, inputKey, collector);\n if (!source.complete) {\n throw new DomainNotEnumerableError(inputKey);\n }\n for (const value of source.values()) {\n accountEvaluation(inputKey);\n visit(\n collectorIndex + 1,\n value === ABSENT_COLLECTOR_VALUE\n ? assignment\n : { ...assignment, [inputKey]: value },\n );\n }\n };\n\n try {\n visit(0, {});\n } catch (error) {\n if (error instanceof DomainNotEnumerableError) {\n return {\n status: \"notEnumerable\",\n assignments: [],\n evaluated,\n inputKey: error.inputKey,\n };\n }\n if (error instanceof EnumerationBudgetError) {\n return {\n status: \"budget\",\n assignments: [],\n evaluated,\n inputKey: error.inputKey,\n };\n }\n throw error;\n }\n\n const byCanonicalValue = new Map<string, Readonly<Record<string, unknown>>>();\n for (const assignment of assignments) {\n byCanonicalValue.set(canonicalJson(assignment), assignment);\n }\n return {\n status: \"enumerated\",\n assignments: [...byCanonicalValue.entries()]\n .sort(([left], [right]) => compareCanonicalStrings(left, right))\n .map(([, assignment]) => assignment),\n evaluated,\n };\n}\n\nfunction createSolverContext<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n options: CollectorInputSolverOptions<DomainState, Manifest, PlayerId>,\n): SolverContext {\n let queriesLazy: TableQueriesOfState<DomainState, Manifest> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n options.domainState,\n options.definitions,\n ));\n return {\n interaction: options.interaction,\n domainState: options.domainState,\n playerId: options.playerId,\n collectors: Object.entries(interactionInputsOf(options.interaction)),\n initialValues: options.initialValues ?? {},\n acceptsAssignment: options.acceptsAssignment ?? (() => true),\n queries,\n };\n}\n\nfunction findFirstAssignment(\n context: SolverContext,\n collectorIndex: number,\n assignment: Readonly<Record<string, unknown>>,\n): RecursiveSatisfiability {\n const entry = context.collectors[collectorIndex];\n if (!entry) return completeAssignment(context, assignment);\n\n const [inputKey, collector] = entry;\n if (collector.kind === \"rng\") {\n return findFirstAssignment(context, collectorIndex + 1, assignment);\n }\n\n const source = valueSourceForCollector(context, inputKey, collector);\n let sawUnknown = !source.complete;\n for (const value of source.values()) {\n const result = findFirstAssignment(\n context,\n collectorIndex + 1,\n value === ABSENT_COLLECTOR_VALUE\n ? assignment\n : { ...assignment, [inputKey]: value },\n );\n if (result.status === \"yes\") return result;\n if (result.status === \"notEnumerable\") sawUnknown = true;\n }\n return sawUnknown\n ? { status: \"notEnumerable\", inputKey }\n : { status: \"no\", inputKey };\n}\n\nfunction completeAssignment(\n context: SolverContext,\n assignment: Readonly<Record<string, unknown>>,\n): RecursiveSatisfiability {\n const candidate = { ...context.initialValues, ...assignment };\n if (!context.interaction.paramsSchema) {\n return context.acceptsAssignment(candidate)\n ? { status: \"yes\", assignment: candidate }\n : { status: \"no\" };\n }\n const parsed = context.interaction.paramsSchema.safeParse(candidate);\n if (parsed.success) {\n return context.acceptsAssignment(candidate)\n ? { status: \"yes\", assignment: candidate }\n : { status: \"no\" };\n }\n if (context.collectors.length === 0) {\n return { status: \"notEnumerable\" };\n }\n return { status: \"no\" };\n}\n\nfunction valueSourceForCollector(\n context: SolverContext,\n inputKey: string,\n collector: InputCollector,\n): ValueSource {\n const hasFixedValue = Object.prototype.hasOwnProperty.call(\n context.initialValues,\n inputKey,\n );\n const fixedValue = context.initialValues[inputKey];\n if (!collector.domain) {\n return hasFixedValue\n ? fixedCollectorValueSource(context, collector, fixedValue)\n : incompleteValueSource();\n }\n\n const domain = collector.domain(\n context.domainState,\n context.playerId,\n context.queries(),\n );\n const base = baseValuesForDomain(domain, collector, context);\n const selection = collector.selection ?? domain.selection;\n const selected = applySelection(base, selection);\n const resolved = collector.schema.safeParse(undefined).success\n ? withAbsentCollectorValue(selected)\n : selected;\n if (!hasFixedValue) return resolved;\n\n // A complete selection is checked against its members, not the power set.\n if (\n selection?.mode === \"many\" &&\n Array.isArray(fixedValue) &&\n base.complete\n ) {\n const keys = fixedValue.map(canonicalJson);\n const valid =\n collector.schema.safeParse(fixedValue).success &&\n fixedValue.length >= selection.min &&\n (selection.max === undefined || fixedValue.length <= selection.max) &&\n (!selection.distinct || new Set(keys).size === keys.length) &&\n fixedValue.every((value) => sourceContainsValue(base, value));\n return { complete: true, values: () => (valid ? [fixedValue] : []) };\n }\n if (!resolved.complete) {\n return fixedCollectorValueSource(context, collector, fixedValue);\n }\n if (selection?.mode === \"many\" && !Array.isArray(fixedValue)) {\n const eligible = sourceContainsValue(base, fixedValue);\n return {\n complete: true,\n values: function* () {\n if (!eligible) return;\n for (const candidate of resolved.values()) {\n if (\n Array.isArray(candidate) &&\n candidate.some(\n (value) => canonicalJson(value) === canonicalJson(fixedValue),\n )\n )\n yield candidate;\n }\n },\n };\n }\n const matches = sourceContainsValue(resolved, fixedValue);\n return { complete: true, values: () => (matches ? [fixedValue] : []) };\n}\n\nfunction sourceContainsValue(source: ValueSource, value: unknown): boolean {\n const key = canonicalJson(value);\n for (const candidate of source.values()) {\n if (canonicalJson(candidate) === key) return true;\n }\n return false;\n}\n\nfunction fixedCollectorValueSource(\n context: SolverContext,\n collector: InputCollector,\n fixedValue: unknown,\n): ValueSource {\n const schemaResult = collector.schema.safeParse(fixedValue);\n const targetValues =\n collector.selection?.mode === \"many\" && Array.isArray(fixedValue)\n ? fixedValue\n : [fixedValue];\n const targetValid = targetValues.every(\n (target) =>\n !collector.validateTarget ||\n collector.validateTarget(\n context.domainState,\n context.playerId,\n context.queries(),\n target,\n ) == null,\n );\n return {\n complete: true,\n values: function* () {\n if (schemaResult.success && targetValid) yield fixedValue;\n },\n };\n}\n\nfunction withAbsentCollectorValue(source: ValueSource): ValueSource {\n return {\n complete: source.complete,\n values: function* () {\n yield ABSENT_COLLECTOR_VALUE;\n yield* source.values();\n },\n };\n}\n\nfunction baseValuesForDomain(\n domain: InputDomainDescriptor,\n collector: InputCollector,\n context: SolverContext,\n): ValueSource {\n switch (domain.type) {\n case \"tileTarget\":\n case \"cardTarget\":\n case \"boardTarget\": {\n if (collector.eligibleTargets) {\n return finiteValueSource(\n collector.eligibleTargets(\n context.domainState,\n context.playerId,\n context.queries(),\n ),\n );\n }\n return domain.projection === \"resolved\"\n ? finiteValueSource(domain.eligibleTargets)\n : incompleteValueSource();\n }\n case \"choice\": {\n const eligibleTargetKeys = collector.eligibleTargets\n ? new Set(\n collector\n .eligibleTargets(\n context.domainState,\n context.playerId,\n context.queries(),\n )\n .map((value) => canonicalJson(value)),\n )\n : null;\n return finiteValueSource(\n domain.choices.flatMap((choice) =>\n choice.disabled ||\n (eligibleTargetKeys &&\n !eligibleTargetKeys.has(canonicalJson(choice.value)))\n ? []\n : [choice.value],\n ),\n );\n }\n case \"zonePosition\":\n return finiteValueSource(\n collector.eligibleTargets\n ? collector.eligibleTargets(\n context.domainState,\n context.playerId,\n context.queries(),\n )\n : zonePositions(domain.zones),\n );\n case \"choiceList\":\n return choiceListValueSource(domain);\n case \"boundedNumber\":\n return boundedNumberValueSource(domain.min, domain.max, domain.step ?? 1);\n case \"resourceMap\":\n return resourceMapValueSource(domain.resources);\n }\n}\n\nfunction finiteValueSource(values: Iterable<unknown>): ValueSource {\n const byCanonicalValue = new Map<string, unknown>();\n for (const value of values) {\n byCanonicalValue.set(canonicalJson(value), value);\n }\n const ordered = [...byCanonicalValue.entries()]\n .sort(([left], [right]) => compareCanonicalStrings(left, right))\n .map(([, value]) => value);\n return {\n complete: true,\n values: () => ordered,\n };\n}\n\nfunction incompleteValueSource(values: readonly unknown[] = []): ValueSource {\n return {\n complete: false,\n values: () => values,\n };\n}\n\nfunction boundedNumberValueSource(\n min: number,\n max: number,\n step: number,\n): ValueSource {\n if (![min, max, step].every(Number.isFinite) || step <= 0) {\n return incompleteValueSource();\n }\n if (max < min) return finiteValueSource([]);\n const count = Math.floor((max - min) / step) + 1;\n if (!Number.isSafeInteger(count)) {\n return incompleteValueSource([min]);\n }\n return {\n complete: true,\n values: function* () {\n for (let index = 0; index < count; index += 1) {\n yield min + index * step;\n }\n },\n };\n}\n\nfunction resourceMapValueSource(\n resources: readonly {\n readonly resourceId: string;\n readonly min: number;\n readonly max: number;\n }[],\n): ValueSource {\n const orderedResources = [...resources].sort((left, right) =>\n compareCanonicalStrings(left.resourceId, right.resourceId),\n );\n if (\n orderedResources.some(\n ({ min, max }) =>\n !Number.isSafeInteger(min) || !Number.isSafeInteger(max),\n )\n ) {\n return incompleteValueSource();\n }\n if (orderedResources.some(({ min, max }) => max < min)) {\n return finiteValueSource([]);\n }\n return {\n complete: true,\n values: function* () {\n yield* enumerateResourceMaps(orderedResources, 0, {});\n },\n };\n}\n\nfunction* enumerateResourceMaps(\n resources: readonly {\n readonly resourceId: string;\n readonly min: number;\n readonly max: number;\n }[],\n index: number,\n current: Readonly<Record<string, number>>,\n): Iterable<Record<string, number>> {\n const resource = resources[index];\n if (!resource) {\n yield { ...current };\n return;\n }\n for (let value = resource.min; value <= resource.max; value += 1) {\n yield* enumerateResourceMaps(resources, index + 1, {\n ...current,\n [resource.resourceId]: value,\n });\n }\n}\n\nfunction choiceListValueSource(domain: {\n readonly choices: readonly {\n readonly value: string;\n readonly disabled?: boolean;\n }[];\n readonly min?: number;\n readonly max?: number;\n}): ValueSource {\n const choices = [\n ...new Set(\n domain.choices\n .filter((choice) => !choice.disabled)\n .map((choice) => choice.value),\n ),\n ].sort((left, right) =>\n compareCanonicalStrings(canonicalJson(left), canonicalJson(right)),\n );\n const min = domain.min ?? 0;\n const max = domain.max ?? choices.length;\n if (\n !Number.isSafeInteger(min) ||\n !Number.isSafeInteger(max) ||\n min < 0 ||\n max < min\n ) {\n return incompleteValueSource();\n }\n if (min > choices.length) return finiteValueSource([]);\n const cappedMax = Math.min(max, choices.length);\n return {\n complete: true,\n values: function* () {\n for (let count = min; count <= cappedMax; count += 1) {\n yield* enumerateCombinations(choices, count, 0, []);\n }\n },\n };\n}\n\nfunction applySelection(\n source: ValueSource,\n selection:\n | {\n readonly mode: \"single\";\n }\n | {\n readonly mode: \"many\";\n readonly min: number;\n readonly max?: number;\n readonly distinct?: boolean;\n }\n | undefined,\n): ValueSource {\n if (selection?.mode !== \"many\") return source;\n if (!source.complete) return incompleteValueSource();\n const min = selection.min;\n const max = selection.max;\n if (!Number.isSafeInteger(min) || min < 0) return incompleteValueSource();\n if (max !== undefined && (!Number.isSafeInteger(max) || max < min)) {\n return incompleteValueSource();\n }\n if (max === undefined && !selection.distinct) {\n return {\n complete: false,\n values: function* () {\n yield* enumerateSequencesFromSource(source.values, min, []);\n },\n };\n }\n return {\n complete: true,\n values: function* () {\n if (selection.distinct && max === undefined) {\n for (let count = min; ; count += 1) {\n let yielded = false;\n for (const combination of enumerateCombinationsFromSource(\n source.values,\n count,\n 0,\n [],\n )) {\n yielded = true;\n yield combination;\n }\n if (!yielded) return;\n }\n }\n const finiteMax = max ?? min;\n for (let count = min; count <= finiteMax; count += 1) {\n if (selection.distinct) {\n yield* enumerateCombinationsFromSource(source.values, count, 0, []);\n } else {\n yield* enumerateSequencesFromSource(source.values, count, []);\n }\n }\n },\n };\n}\n\nfunction* enumerateCombinationsFromSource<Value>(\n values: () => Iterable<Value>,\n count: number,\n start: number,\n current: readonly Value[],\n): Iterable<Value[]> {\n if (current.length === count) {\n yield [...current];\n return;\n }\n let index = 0;\n for (const value of values()) {\n if (index >= start) {\n yield* enumerateCombinationsFromSource(values, count, index + 1, [\n ...current,\n value,\n ]);\n }\n index += 1;\n }\n}\n\nfunction* enumerateSequencesFromSource<Value>(\n values: () => Iterable<Value>,\n count: number,\n current: readonly Value[],\n): Iterable<Value[]> {\n if (current.length === count) {\n yield [...current];\n return;\n }\n for (const value of values()) {\n yield* enumerateSequencesFromSource(values, count, [...current, value]);\n }\n}\n\nfunction* enumerateCombinations<Value>(\n values: readonly Value[],\n count: number,\n start: number,\n current: readonly Value[],\n): Iterable<Value[]> {\n if (current.length === count) {\n yield [...current];\n return;\n }\n for (let index = start; index < values.length; index += 1) {\n yield* enumerateCombinations(values, count, index + 1, [\n ...current,\n values[index],\n ]);\n }\n}\n\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(canonicalizeJson(value));\n}\n\nfunction canonicalizeJson(value: unknown): unknown {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"Collector input domain contains a non-finite number.\");\n }\n return value;\n }\n if (Array.isArray(value)) return value.map(canonicalizeJson);\n if (typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .sort(([left], [right]) => compareCanonicalStrings(left, right))\n .map(([key, item]) => [key, canonicalizeJson(item)]),\n );\n }\n throw new Error(\"Collector input domain contains a non-JSON value.\");\n}\n\nfunction compareCanonicalStrings(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction assertEvaluationBudget(value: number): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(\"maxEvaluations must be a positive safe integer.\");\n }\n}\n","export function interactionDomainEligibleCount(\n domain: unknown,\n): number | \"unknown\" {\n if (!domain || typeof domain !== \"object\") return \"unknown\";\n const typed = domain as {\n type?: string;\n projection?: string;\n eligibleTargets?: readonly unknown[];\n choices?: readonly { disabled?: boolean }[];\n resources?: readonly unknown[];\n min?: number;\n max?: number;\n step?: number;\n };\n if (\n (typed.type === \"cardTarget\" || typed.type === \"boardTarget\") &&\n typed.projection === \"resolved\"\n ) {\n return typed.eligibleTargets?.length ?? 0;\n }\n if (typed.type === \"choice\" || typed.type === \"choiceList\") {\n return (typed.choices ?? []).filter((choice) => !choice.disabled).length;\n }\n if (typed.type === \"resourceMap\") {\n return typed.resources?.length ?? 0;\n }\n if (\n typed.type === \"boundedNumber\" &&\n typeof typed.min === \"number\" &&\n typeof typed.max === \"number\"\n ) {\n const step =\n typeof typed.step === \"number\" && typed.step > 0 ? typed.step : 1;\n return Math.max(0, Math.floor((typed.max - typed.min) / step) + 1);\n }\n return \"unknown\";\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n ManifestContract,\n TableOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { InteractionInputDescriptorShape } from \"./interaction-types\";\nimport { interactionInputsOf } from \"./collector-introspection\";\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: {\n readonly queries?: TableQueriesOfState<DomainState, Manifest>;\n readonly definitions: Manifest;\n },\n): InteractionInputDescriptorShape[] {\n const q =\n options.queries ?? createStateQueries(domainState, options.definitions);\n return Object.entries(interactionInputsOf(interaction)).flatMap(\n ([key, collector]) => {\n if (collector.kind === \"rng\") return [];\n if (!collector.domain)\n throw new Error(`Interaction input '${key}' has no renderable domain.`);\n const resolved = collector.domain(domainState, playerId, q);\n const domain = collector.selection\n ? { ...resolved, selection: collector.selection }\n : resolved;\n const defaultValue =\n \"defaultValue\" in collector\n ? collector.defaultValue\n : collector.resolveDefaultValue?.(domainState, playerId, q, domain);\n return [\n {\n key,\n kind: collector.kind,\n domain,\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n },\n ];\n },\n );\n}\n","import { evaluateStepPrefix, type StepPrefix } from \"./step-prefix\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\n} from \"../../model\";\nimport {\n collectCardZoneIds,\n collectFirstCardZoneId,\n interactionInputsOf,\n} from \"./collector-introspection\";\nimport { collectInteractionInputs } from \"./collector-domains\";\nimport type {\n InteractionDecision,\n InteractionAvailabilityShape,\n InteractionDescriptorShape,\n TrustedInteractionDescriptorShape,\n TrustedInteractionId,\n} from \"./interaction-types\";\nimport { FrameworkErrorCodes } from \"../../model\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\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 isTargetCollector(collector: InputCollector): boolean {\n switch (collector.kind) {\n case \"card\":\n case \"board-edge\":\n case \"board-space\":\n case \"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 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 = Object.values(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 presentation?: { label?: string; help?: string };\n interactionId: string;\n}): Pick<InteractionDescriptorShape, \"kind\" | \"commit\" | \"label\" | \"help\"> {\n const label = normalizePresentationText(interaction.presentation?.label);\n const help = normalizePresentationText(interaction.presentation?.help);\n return {\n kind: \"action\",\n commit: deriveCommitPolicy(interaction.inputs, interaction.commit),\n label: label ?? humanizeInteractionId(interaction.interactionId),\n help,\n };\n}\n\nfunction normalizePresentationText(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\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(\n decision: InteractionDecision,\n): InteractionAvailabilityShape {\n if (decision.available) return { status: \"available\" };\n switch (decision.code) {\n case FrameworkErrorCodes.NOT_YOUR_TURN:\n return {\n status: \"notYourTurn\",\n reason: decision.message ?? \"Not your turn\",\n };\n case FrameworkErrorCodes.NO_LEGAL_INPUT:\n return {\n status: \"blocked\",\n reason: decision.message ?? \"No legal input is currently available.\",\n code: FrameworkErrorCodes.NO_LEGAL_INPUT,\n };\n default:\n return {\n status: \"blocked\",\n reason: decision.message ?? \"Interaction unavailable\",\n code: decision.code,\n };\n }\n}\n\nexport function buildInteractionDescriptor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n state: TrustedState<Contract>,\n playerId: TrustedPlayerId<Contract>,\n interactionId: TrustedInteractionId<Contract, Definitions, View>,\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >,\n decision: InteractionDecision,\n options: {\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >;\n includeDiagnosticReasons?: boolean;\n stepPrefix?: StepPrefix;\n } = {},\n): TrustedInteractionDescriptorShape<Contract, Definitions, View> {\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n View\n >;\n const domainState =\n options.projection?.domainState ?? scope.toDomainState(state);\n const phaseName = state.flow.currentPhase as PhaseName;\n const saved = state.runtime.pending[playerId];\n const prefix =\n options.stepPrefix ??\n (interaction.steps &&\n (decision.available || decision.code === FrameworkErrorCodes.NO_LEGAL_INPUT)\n ? evaluateStepPrefix(\n interaction.steps,\n domainState,\n playerId,\n saved?.interactionId === interactionId &&\n saved.phaseName === phaseName\n ? saved.values\n : [],\n scope.manifest,\n )\n : undefined);\n const projectedInteraction = prefix\n ? {\n ...interaction,\n steps: undefined,\n paramsSchema: undefined,\n inputs: prefix.current\n ? { [prefix.current.key]: prefix.current.collector }\n : {},\n }\n : interaction;\n const interactionInputs = interactionInputsOf(projectedInteraction);\n const metadata = projectInteractionMetadata({\n ...interaction,\n inputs: interactionInputs,\n interactionId: String(interactionId),\n });\n const queries =\n options.projection?.q ??\n createStateQueries<TrustedDomainState<Contract>, TrustedManifest<Contract>>(\n domainState,\n scope.manifest,\n );\n\n const shouldMaterializeInputDomains =\n decision.available || decision.code === FrameworkErrorCodes.NO_LEGAL_INPUT;\n const inputs = shouldMaterializeInputDomains\n ? enrichResourceInputPresentation(\n collectInteractionInputs(projectedInteraction, domainState, playerId, {\n queries,\n definitions: scope.manifest,\n }),\n scope.manifest,\n )\n : [];\n const baseDescriptor = {\n phaseName,\n interactionKey: `${phaseName}.${interactionId}`,\n interactionId,\n label: metadata.label,\n help: metadata.help,\n commit: metadata.commit,\n zoneId: collectFirstCardZoneId(projectedInteraction),\n zoneIds: collectCardZoneIds(projectedInteraction),\n inputs,\n ...(prefix\n ? {\n step: {\n index: prefix.values.length,\n total: interaction.steps!.entries.length,\n selected: prefix.selected,\n canCancel: !!saved,\n },\n }\n : {}),\n availability: interactionAvailabilityFromDecision(decision),\n reasons:\n options.includeDiagnosticReasons && !decision.available && decision.ruleId\n ? [{ ruleId: decision.ruleId, errorCode: decision.code }]\n : undefined,\n };\n return {\n ...baseDescriptor,\n kind: \"action\",\n } as Descriptor;\n}\n","import {\n schemaForCollectors,\n schemaForAuthorCollectors,\n} from \"../../client-param-schemas\";\nimport { evaluateStepPrefix } from \"./step-prefix\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewOfContract,\n} from \"../../model\";\nimport { FrameworkErrorCodes } from \"../../model\";\nimport {\n parseInteractionParams,\n prepareInteractionProjectionParams,\n validateCollectorTargets,\n} from \"./collector-params\";\nimport {\n enumerateCollectorInputAssignments,\n hasAnyCollectorInputAssignment,\n} from \"./collector-input-solver\";\nimport { interactionDomainEligibleCount } from \"./interaction-domain-metadata\";\nimport { buildInteractionDescriptor } from \"./interaction-descriptor\";\nimport type { createInteractionAuthorization } from \"./interaction-authorization\";\nimport {\n makeValidationError,\n type InteractionDecision,\n type InteractionActionabilityResult,\n type InteractionDiagnosticsMode,\n type InteractionExplanation,\n type InteractionDecisionResult,\n type InteractionInputEnumerationResult,\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 AuthorizationFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReturnType<\n typeof createInteractionAuthorization<Contract, Definitions, View>\n>;\n\ntype InteractionRuleIssue = {\n ruleId: string;\n errorCode: string;\n message?: string;\n};\n\ntype RuleValidationIssue = {\n errorCode: string;\n message?: string;\n};\n\nfunction readStep(state: { phase?: unknown }): string | null {\n const phase = state.phase;\n if (!phase || typeof phase !== \"object\") return null;\n const step = (phase as { step?: unknown }).step;\n return typeof step === \"string\" ? step : null;\n}\n\nfunction explanationAvailability(\n decision: InteractionDecision,\n): InteractionExplanation[\"availability\"] {\n if (decision.available) return \"available\";\n switch (decision.code) {\n case FrameworkErrorCodes.NOT_YOUR_TURN:\n return \"notYourTurn\";\n case FrameworkErrorCodes.WRONG_PHASE:\n return \"wrongPhase\";\n case FrameworkErrorCodes.WRONG_STEP:\n return \"wrongStep\";\n default:\n return \"blocked\";\n }\n}\n\nexport function createInteractionDecisionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n authorization: AuthorizationFor<Contract, Definitions, View>,\n options: { diagnostics?: InteractionDiagnosticsMode } = {},\n) {\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n type InteractionId = TrustedInteractionId<Contract, Definitions, View>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n View\n >;\n\n const contractErrors =\n (scope.definition.contract as { errors?: Record<string, string> }).errors ??\n {};\n\n function defaultMessageForCode(code: string): string | undefined {\n return contractErrors[code];\n }\n\n function issueFromRule(\n rule: InteractionRuleIssue,\n message?: string,\n ): InteractionRuleIssue {\n return {\n ruleId: rule.ruleId,\n errorCode: rule.errorCode,\n message: message ?? rule.message ?? defaultMessageForCode(rule.errorCode),\n };\n }\n\n function issueFromRuleValidationResult(\n rule: InteractionRuleIssue,\n result: boolean | string | RuleValidationIssue | null | undefined,\n ): InteractionRuleIssue | undefined {\n if (result === false) return issueFromRule(rule);\n if (typeof result === \"string\") return issueFromRule(rule, result);\n if (result && typeof result === \"object\") {\n return {\n ruleId: rule.ruleId,\n errorCode: result.errorCode,\n message:\n result.message ??\n rule.message ??\n defaultMessageForCode(result.errorCode),\n };\n }\n return undefined;\n }\n\n function acceptsSubmitAssignment(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n assignment: Readonly<Record<string, unknown>>;\n projection?: ProjectionContext<DomainState, TrustedManifest<Contract>>;\n }): boolean {\n const decision = resolveInteractionDecision({\n state: input.state,\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.assignment,\n mode: \"submit\",\n candidateInvariantsValidated: true,\n projection: input.projection,\n });\n return decision.found && decision.validation.valid;\n }\n\n function resolveInteractionEligibility({\n state,\n playerId,\n interactionId,\n mode = \"descriptor\",\n candidateInvariantsValidated = false,\n projection,\n }: Omit<ResolveDecisionInput<Contract>, \"params\" | \"mode\"> & {\n mode?: ResolveDecisionInput<Contract>[\"mode\"];\n }) {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction)\n return {\n found: false as const,\n validation: makeValidationError(\n \"unsupported-action\",\n `Unknown interaction '${interactionId}'.`,\n ),\n };\n const pending = state.runtime.pending[playerId];\n const pendingMatches =\n pending?.phaseName === phaseName &&\n pending.interactionId === interactionId;\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 = candidateInvariantsValidated\n ? ({ mode: \"active\" } as const)\n : authorization.resolveInteractionActorAuthorization(\n state,\n interaction,\n projection,\n );\n const authorized = candidateInvariantsValidated\n ? true\n : authorization.isActorAuthorized(state, playerId, actorAuthorization);\n let visible = authorized;\n if (alreadySubmitted && !canResubmit && mode !== \"submit\") {\n visible = false;\n }\n let validation: ReducerValidationResult = { valid: true };\n const otherPending = pending !== undefined && !pendingMatches;\n if (otherPending) {\n visible = false;\n validation = makeValidationError(\n \"PENDING_INTERACTION\",\n \"Finish or cancel the pending interaction first.\",\n );\n }\n if (!authorized) {\n validation = 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 }\n\n const canEvaluateProjectionDetails =\n mode !== \"submit\" && visible && authorized;\n const canContinueSubmitValidation = mode === \"submit\" && validation.valid;\n let ruleAvailabilityIssue: InteractionRuleIssue | undefined;\n if (\n (canContinueSubmitValidation || canEvaluateProjectionDetails) &&\n !candidateInvariantsValidated &&\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({\n ruleId: rule.id,\n errorCode: rule.errorCode,\n message: rule.message,\n });\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n ruleAvailabilityIssue.errorCode,\n ruleAvailabilityIssue.message,\n );\n }\n break;\n }\n }\n }\n\n return {\n found: true as const,\n interaction,\n authorized,\n visible,\n validation,\n ruleAvailabilityIssue,\n otherPending,\n canEvaluateProjectionDetails,\n };\n }\n\n function resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params = {},\n mode,\n candidateInvariantsValidated = false,\n projection,\n }: ResolveDecisionInput<Contract>): InteractionDecisionResult<\n Contract,\n Definitions,\n View\n > {\n const phaseName = state.flow.currentPhase as PhaseName;\n let 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 const originalInteraction = interaction;\n const pending = state.runtime.pending[playerId];\n const pendingMatches =\n pending?.phaseName === phaseName &&\n pending.interactionId === interactionId;\n const eligibility = resolveInteractionEligibility({\n state,\n playerId,\n interactionId,\n mode,\n candidateInvariantsValidated,\n projection,\n });\n if (!eligibility.found) return eligibility;\n const { authorized, visible, ruleAvailabilityIssue, otherPending } =\n eligibility;\n let validation = eligibility.validation;\n if (!validation.valid) {\n const code =\n \"errorCode\" in validation ? validation.errorCode : \"action-unavailable\";\n return {\n found: true,\n interaction,\n parsedParams: {},\n visible,\n descriptor: buildInteractionDescriptor(\n scope,\n state,\n playerId,\n trustedInteractionId,\n interaction,\n {\n available: false,\n code,\n message: validation.message ?? code,\n ...(ruleAvailabilityIssue\n ? { ruleId: ruleAvailabilityIssue.ruleId }\n : {}),\n },\n {\n projection,\n includeDiagnosticReasons: options.diagnostics === \"verbose\",\n },\n ),\n validation,\n };\n }\n const previousValues = pendingMatches ? pending.values : [];\n const submittedKey = interaction.steps?.entries[previousValues.length]?.key;\n const paramsRecord =\n params !== null && typeof params === \"object\" && !Array.isArray(params)\n ? params\n : {};\n const prefix = interaction.steps\n ? evaluateStepPrefix(\n interaction.steps,\n scope.toDomainState(state),\n playerId,\n mode === \"submit\"\n ? [...previousValues, paramsRecord[submittedKey ?? \"\"]]\n : previousValues,\n scope.manifest,\n )\n : undefined;\n const submittedPrefix = mode === \"submit\" ? prefix : undefined;\n const stepComplete = submittedPrefix?.complete === true;\n const stepParamsValid =\n !prefix ||\n mode !== \"submit\" ||\n (!!submittedKey &&\n Object.keys(paramsRecord).length === 1 &&\n Object.prototype.hasOwnProperty.call(paramsRecord, submittedKey) &&\n prefix.values.length === previousValues.length + 1 &&\n !prefix.issue);\n if (prefix) {\n interaction = {\n ...interaction,\n steps: undefined,\n inputs: stepComplete\n ? submittedPrefix.collectors\n : prefix.current\n ? { [prefix.current.key]: prefix.current.collector }\n : {},\n paramsSchema: stepComplete ? interaction.paramsSchema : undefined,\n };\n }\n\n const parseForSubmit = mode === \"submit\";\n const finalStepSchema =\n stepComplete && originalInteraction.paramsSchema\n ? originalInteraction.paramsSchema.safeParse(submittedPrefix.selected)\n : undefined;\n const parsed = !stepParamsValid\n ? {\n ok: false as const,\n message: \"Submit exactly the current eligible step value.\",\n }\n : submittedPrefix\n ? finalStepSchema && !finalStepSchema.success\n ? {\n ok: false as const,\n message:\n \"Complete step parameters do not match the interaction schema.\",\n }\n : {\n ok: true as const,\n params: finalStepSchema?.success\n ? finalStepSchema.data\n : submittedPrefix.selected,\n }\n : parseForSubmit\n ? parseInteractionParams(interaction, params, {\n skipRng: true,\n })\n : ({\n ok: true,\n params: prepareInteractionProjectionParams(interaction, params),\n } as const);\n if (!parsed.ok) {\n const descriptorDecision: InteractionDecision = {\n available: false,\n code: FrameworkErrorCodes.INVALID_PARAMS,\n message: parsed.message,\n };\n return {\n found: true,\n interaction,\n parsedParams: {},\n visible: true,\n descriptor: buildInteractionDescriptor(\n scope,\n state,\n playerId,\n trustedInteractionId,\n interaction,\n descriptorDecision,\n { projection },\n ),\n validation: makeValidationError(\n \"invalid-action-params\",\n parsed.message,\n ),\n };\n }\n\n let authoredValidation:\n | {\n ruleId: string;\n errorCode: string;\n message?: string;\n }\n | undefined;\n if (validation.valid && mode === \"submit\" && (!prefix || stepComplete)) {\n validation = validateCollectorTargets(\n interaction,\n projection?.domainState ?? scope.toDomainState(state),\n playerId,\n parsed.params,\n scope.manifest,\n );\n }\n\n if (validation.valid && mode === \"submit\" && (!prefix || stepComplete)) {\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 {\n ruleId: rule.id,\n errorCode: rule.errorCode,\n message: rule.message,\n },\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 candidateInvariantAvailable =\n authorized && !otherPending && !ruleAvailabilityIssue;\n const inputSatisfiability =\n candidateInvariantAvailable && mode !== \"submit\"\n ? hasAnyCollectorInputAssignment({\n interaction,\n domainState: projection?.domainState ?? scope.toDomainState(state),\n playerId,\n queries: projection?.q,\n definitions: scope.manifest,\n initialValues: params,\n acceptsAssignment: () => true,\n })\n : undefined;\n const available =\n candidateInvariantAvailable &&\n (inputSatisfiability?.status === \"yes\" ||\n (inputSatisfiability?.status !== \"no\" && !authoredValidation));\n const descriptorDecision: InteractionDecision = available\n ? { available: true }\n : !authorized\n ? {\n available: false,\n code: FrameworkErrorCodes.NOT_YOUR_TURN,\n message: \"Not your turn\",\n }\n : ruleAvailabilityIssue\n ? {\n available: false,\n code: ruleAvailabilityIssue.errorCode,\n ruleId: ruleAvailabilityIssue.ruleId,\n message:\n ruleAvailabilityIssue.message ??\n ruleAvailabilityIssue.errorCode,\n }\n : authoredValidation\n ? {\n available: false,\n code: authoredValidation.errorCode,\n ruleId: authoredValidation.ruleId,\n message:\n authoredValidation.message ?? \"Interaction unavailable\",\n }\n : inputSatisfiability?.status === \"no\"\n ? {\n available: false,\n code: FrameworkErrorCodes.NO_LEGAL_INPUT,\n message: \"No legal input is currently available.\",\n }\n : {\n available: false,\n code: \"action-unavailable\",\n message: \"Interaction unavailable\",\n };\n const descriptor = buildInteractionDescriptor(\n scope,\n state,\n playerId,\n trustedInteractionId,\n originalInteraction,\n descriptorDecision,\n {\n projection,\n stepPrefix: mode === \"submit\" ? undefined : prefix,\n includeDiagnosticReasons: options.diagnostics === \"verbose\",\n },\n );\n return {\n found: true,\n interaction,\n parsedParams: parsed.params,\n ...(submittedPrefix\n ? {\n stepResult: {\n values: submittedPrefix.values,\n complete: submittedPrefix.complete,\n },\n }\n : {}),\n visible,\n descriptor,\n inputSatisfiability,\n validation,\n };\n }\n\n function resolveAvailableInteractionsFor(\n state: State,\n playerId: PlayerId,\n options: {\n projection?: ProjectionContext<DomainState, TrustedManifest<Contract>>;\n } = {},\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 function resolveInteractionActionability(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n projection?: ProjectionContext<DomainState, TrustedManifest<Contract>>;\n }): InteractionActionabilityResult {\n const decision = resolveInteractionDecision({\n ...input,\n params: {},\n mode: \"descriptor\",\n });\n if (!decision.found) return { found: false };\n if (!decision.visible) return { found: true, visible: false };\n return {\n found: true,\n visible: true,\n descriptor: decision.descriptor,\n inputSatisfiability: decision.inputSatisfiability,\n };\n }\n\n function currentClientParamSchema(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n }) {\n const decision = resolveInteractionDecision({\n ...input,\n mode: \"descriptor\",\n });\n if (!decision.found || !decision.visible || !decision.descriptor.step)\n return null;\n return schemaForCollectors(decision.interaction.inputs ?? {});\n }\n\n function currentAuthorParamSchema(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n }) {\n const decision = resolveInteractionDecision({\n ...input,\n mode: \"descriptor\",\n });\n if (!decision.found || !decision.visible || !decision.descriptor.step)\n return null;\n return schemaForAuthorCollectors(decision.interaction.inputs ?? {});\n }\n\n function enumerateInteractionParams(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n maxEvaluations: number;\n projection?: ProjectionContext<DomainState, TrustedManifest<Contract>>;\n }): InteractionInputEnumerationResult {\n const decision = resolveInteractionDecision({\n state: input.state,\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: {},\n mode: \"descriptor\",\n projection: input.projection,\n });\n if (!decision.found) return { found: false };\n if (!decision.visible) return { found: true, visible: false };\n const enumeration =\n decision.descriptor.availability.status === \"available\"\n ? enumerateCollectorInputAssignments({\n interaction: decision.interaction,\n domainState:\n input.projection?.domainState ?? scope.toDomainState(input.state),\n playerId: input.playerId,\n queries: input.projection?.q,\n definitions: scope.manifest,\n acceptsAssignment: (assignment) =>\n acceptsSubmitAssignment({\n state: input.state,\n playerId: input.playerId,\n interactionId: input.interactionId,\n assignment,\n projection: input.projection,\n }),\n maxEvaluations: input.maxEvaluations,\n })\n : null;\n return {\n found: true,\n visible: true,\n descriptor: decision.descriptor,\n inputSatisfiability: decision.inputSatisfiability,\n enumeration,\n };\n }\n\n function explainInteraction(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n projection?: ProjectionContext<DomainState, TrustedManifest<Contract>>;\n }): InteractionExplanation {\n const { state, playerId, interactionId, projection } = input;\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) {\n return {\n interactionId,\n phase: String(state.flow.currentPhase),\n step: readStep(state),\n availability: \"blocked\",\n rules: [],\n actor: { required: [], playerIsActor: false },\n inputs: [],\n };\n }\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 const required =\n actorAuthorization.mode === \"actors\"\n ? [...actorAuthorization.actors]\n : [...(state.flow.activePlayers as readonly string[])];\n\n const decision = resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params: {},\n mode: \"descriptor\",\n projection,\n });\n const descriptorDecision: InteractionDecision =\n decision.found && decision.descriptor.availability.status === \"available\"\n ? { available: true }\n : decision.found &&\n decision.descriptor.availability.status === \"notYourTurn\"\n ? {\n available: false,\n code: FrameworkErrorCodes.NOT_YOUR_TURN,\n message: decision.descriptor.availability.reason,\n }\n : decision.found &&\n decision.descriptor.availability.status === \"blocked\" &&\n decision.descriptor.availability.code\n ? {\n available: false,\n code: decision.descriptor.availability.code,\n message: decision.descriptor.availability.reason,\n }\n : {\n available: false,\n code: \"action-unavailable\",\n message: \"Interaction unavailable\",\n };\n\n const ruleOutcomes: Array<InteractionExplanation[\"rules\"][number]> = [];\n const canEvaluateRules = authorized;\n let sawFailure = false;\n const availabilityArgs = canEvaluateRules\n ? scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId },\n },\n projection,\n )\n : null;\n for (const rule of interaction.rules ?? []) {\n if (sawFailure || !canEvaluateRules || !rule.available) {\n ruleOutcomes.push({\n ruleId: rule.id,\n outcome: \"notEvaluated\",\n errorCode: rule.errorCode,\n message: rule.message ?? defaultMessageForCode(rule.errorCode),\n });\n continue;\n }\n const passed = rule.available(availabilityArgs!);\n const issue = passed\n ? undefined\n : issueFromRule({\n ruleId: rule.id,\n errorCode: rule.errorCode,\n message: rule.message,\n });\n ruleOutcomes.push({\n ruleId: rule.id,\n outcome: passed ? \"passed\" : \"failed\",\n errorCode: passed ? undefined : issue?.errorCode,\n message: passed ? undefined : issue?.message,\n });\n if (!passed) sawFailure = true;\n }\n\n const domainDescriptor = buildInteractionDescriptor(\n scope,\n state,\n playerId,\n interactionId as InteractionId,\n interaction,\n { available: true },\n {\n projection,\n },\n );\n\n return {\n interactionId,\n phase: String(state.flow.currentPhase),\n step: readStep(state),\n availability: explanationAvailability(descriptorDecision),\n rules: ruleOutcomes,\n actor: { required, playerIsActor: authorized },\n inputs: domainDescriptor.inputs.map((entry) => ({\n key: entry.key,\n kind: entry.kind,\n eligibleCount: interactionDomainEligibleCount(entry.domain),\n })),\n };\n }\n\n return {\n currentClientParamSchema,\n currentAuthorParamSchema,\n enumerateInteractionParams,\n explainInteraction,\n resolveAvailableInteractionsFor,\n resolveInteractionActionability,\n resolveInteractionDecision,\n resolveInteractionEligibility,\n };\n}\n","import type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerReject,\n ReducerValidationResult,\n ViewOfContract,\n} from \"../../model\";\nimport {\n collectFirstCardZoneId,\n findCardInputKey,\n findCardInputKeyForZone,\n interactionInputsOf,\n} from \"./collector-introspection\";\nimport { parseInteractionParams } from \"./collector-params\";\nimport { createInteractionAuthorization } from \"./interaction-authorization\";\nimport { createInteractionDecisionResolver } from \"./interaction-decision\";\nimport {\n rejectResult,\n type TrustedInput,\n type TrustedPhaseName,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\nimport { evaluateStepPrefix } from \"./step-prefix\";\nimport type { InteractionDiagnosticsMode } from \"./interaction-types\";\n\nexport type { InteractionDescriptorShape } from \"./interaction-types\";\n\nexport function createInteractionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n options: { diagnostics?: InteractionDiagnosticsMode } = {},\n) {\n type State = TrustedState<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n\n const authorization = createInteractionAuthorization(scope);\n const decisions = createInteractionDecisionResolver(\n scope,\n authorization,\n options,\n );\n\n function validateClientInput(\n state: State,\n input: ReducerInput,\n ): ReducerValidationResult {\n if (input.kind === \"interaction.cancel\") {\n const pending = state.runtime.pending[input.playerId];\n return pending?.interactionId === input.interactionId\n ? { valid: true }\n : {\n valid: false,\n errorCode: \"NO_PENDING_INTERACTION\",\n message: \"There is no matching unsealed interaction to cancel.\",\n };\n }\n if (input.kind === \"interaction\") {\n const decision = decisions.resolveInteractionDecision({\n state,\n playerId: input.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;\n return rejectResult(invalidValidation.errorCode, invalidValidation.message);\n }\n\n /** The selected prefix and current step share one collector evaluation. */\n function inputCollectors(\n state: State,\n playerId: TrustedPlayerId<Contract>,\n interactionId: string,\n ): Readonly<Record<string, InputCollector>> {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) return {};\n const pending = state.runtime.pending[playerId];\n const prefix = interaction.steps\n ? evaluateStepPrefix(\n interaction.steps,\n scope.toDomainState(state),\n playerId,\n pending?.phaseName === phaseName &&\n pending.interactionId === interactionId\n ? pending.values\n : [],\n scope.manifest,\n )\n : undefined;\n return prefix\n ? {\n ...prefix.collectors,\n ...(prefix.current\n ? { [prefix.current.key]: prefix.current.collector }\n : {}),\n }\n : interactionInputsOf(interaction);\n }\n\n function inputKeys(\n kind: \"card\" | \"tile\",\n state: State,\n playerId: TrustedPlayerId<Contract>,\n interactionId: string,\n ): ReadonlySet<string> {\n return new Set(\n Object.entries(inputCollectors(state, playerId, interactionId))\n .filter(([, collector]) => collector.kind === kind)\n .map(([key]) => key),\n );\n }\n const cardInputKeys = (\n state: State,\n playerId: TrustedPlayerId<Contract>,\n interactionId: string,\n ) => inputKeys(\"card\", state, playerId, interactionId);\n const tileInputKeys = (\n state: State,\n playerId: TrustedPlayerId<Contract>,\n interactionId: string,\n ) => inputKeys(\"tile\", state, playerId, interactionId);\n\n return {\n inputCollectors,\n cardInputKeys,\n tileInputKeys,\n currentClientParamSchema: decisions.currentClientParamSchema,\n currentAuthorParamSchema: decisions.currentAuthorParamSchema,\n collectFirstCardZoneId,\n enumerateInteractionParams: decisions.enumerateInteractionParams,\n explainInteraction: decisions.explainInteraction,\n findCardInputKey,\n findCardInputKeyForZone,\n isActorAuthorized: authorization.isActorAuthorized,\n parseInteractionParams,\n resolveAvailableInteractionsFor: decisions.resolveAvailableInteractionsFor,\n resolveInteractionActionability: decisions.resolveInteractionActionability,\n resolveInteractionActorAuthorization:\n authorization.resolveInteractionActorAuthorization,\n resolveInteractionDecision: decisions.resolveInteractionDecision,\n resolveInteractionEligibility: decisions.resolveInteractionEligibility,\n validateClientInput,\n validateOrReject,\n };\n}\n","import type {\n RuntimeRngDraw,\n RuntimeRngOperation,\n RuntimeRngState,\n} 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 operation: RuntimeRngOperation = {\n kind: \"integer\",\n parameters: { minInclusive: 0, maxInclusive: bound - 1 },\n },\n): [number, RuntimeRngState, RuntimeRngDraw] {\n if (!Number.isSafeInteger(bound) || bound <= 0) {\n throw new Error(\"Random bound must be a positive safe integer.\");\n }\n const seed = rng.seed ?? 1;\n const raw = hashSeedCursor(seed, rng.cursor);\n const value = raw % bound;\n const draw: RuntimeRngDraw = {\n index: rng.draws.length,\n cursorBefore: rng.cursor,\n cursorAfter: rng.cursor + 1,\n operation: {\n kind: operation.kind,\n parameters: { ...operation.parameters },\n },\n };\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 draws: [...rng.draws, draw],\n },\n draw,\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 RuntimeRngState,\n SchemaLike,\n} from \"../../model\";\nimport type { RandomHelpers } from \"../../model/spec/runtime-args\";\nimport { nextRandomInt } from \"../../rng\";\n\nexport type RngConsumption = {\n operation: string;\n drawIndex: number;\n traceEntry: string;\n};\n\nexport type MutableRandomHelpers =\n import(\"../../transaction\").TransactionRandom & {\n random: RandomHelpers;\n currentRng: () => RuntimeRngState;\n consumptions: () => readonly RngConsumption[];\n };\n\nconst MAX_INTEGER_RANGE = 0x1_0000_0000;\n\nfunction assertIntegerRange(options: {\n minInclusive: number;\n maxInclusive: number;\n}): number {\n const { minInclusive, maxInclusive } = options;\n if (\n !Number.isSafeInteger(minInclusive) ||\n !Number.isSafeInteger(maxInclusive)\n ) {\n throw new Error(\"random.integer bounds must be safe integers.\");\n }\n if (minInclusive > maxInclusive) {\n throw new Error(\n \"random.integer minInclusive must be less than or equal to maxInclusive.\",\n );\n }\n const range = maxInclusive - minInclusive + 1;\n if (!Number.isSafeInteger(range) || range > MAX_INTEGER_RANGE) {\n throw new Error(\n `random.integer range must contain at most ${MAX_INTEGER_RANGE} values.`,\n );\n }\n return range;\n}\n\nfunction traceEntry(nextRng: RuntimeRngState): string {\n return nextRng.trace[nextRng.trace.length - 1] ?? \"\";\n}\n\nexport function sampleIntegerValue(\n options: { minInclusive: number; maxInclusive: number },\n rng: RuntimeRngState,\n operation = \"random.integer\",\n): {\n value: number;\n nextRng: RuntimeRngState;\n consumption: RngConsumption;\n} {\n const range = assertIntegerRange(options);\n const [offset, nextRng, draw] = nextRandomInt(range, rng, {\n kind: \"integer\",\n parameters: {\n minInclusive: options.minInclusive,\n maxInclusive: options.maxInclusive,\n },\n });\n return {\n value: options.minInclusive + offset,\n nextRng,\n consumption: {\n operation,\n drawIndex: draw.index,\n traceEntry: traceEntry(nextRng),\n },\n };\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, draw] = nextRandomInt(sides, rng, {\n kind: \"integer\",\n parameters: { minInclusive: 1, maxInclusive: sides },\n });\n return {\n value: offset + 1,\n nextRng,\n consumption: {\n operation: \"rollDie\",\n drawIndex: draw.index,\n traceEntry: traceEntry(nextRng),\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, draw] = nextRandomInt(\n lastIndex + 1,\n nextRng,\n {\n kind: \"integer\",\n parameters: { minInclusive: 0, maxInclusive: lastIndex },\n },\n );\n consumptions.push({\n operation,\n drawIndex: draw.index,\n traceEntry: traceEntry(updatedRng),\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 const recordedConsumptions: RngConsumption[] = [];\n return {\n random: {\n integer(options) {\n const sampled = sampleIntegerValue(options, current);\n current = sampled.nextRng;\n recordedConsumptions.push(sampled.consumption);\n return sampled.value;\n },\n subset(options) {\n const sampled = subsetWithRng(options.from, options.count, current);\n current = sampled.nextRng;\n recordedConsumptions.push(...sampled.consumptions);\n return sampled.values;\n },\n },\n roll(sides) {\n const sampled = sampleDieValue(sides, current);\n current = sampled.nextRng;\n recordedConsumptions.push(sampled.consumption);\n return sampled.value;\n },\n shuffle(values, operation) {\n const sampled = shuffleWithRng(values, current, operation);\n current = sampled.nextRng;\n recordedConsumptions.push(...sampled.consumptions);\n return sampled.orderedValues;\n },\n currentRng: () => current,\n consumptions: () => [...recordedConsumptions],\n };\n}\n\nexport function sampleRngCollectorValue(\n collector: InputCollector<SchemaLike<unknown>, CollectorState, \"rng\">,\n rng: RuntimeRngState,\n): {\n value: unknown;\n nextRng: RuntimeRngState;\n consumptions: readonly RngConsumption[];\n} {\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 const consumptions: RngConsumption[] = [];\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 consumptions.push({\n operation: \"rngInput.d6\",\n drawIndex: sampled.consumption.drawIndex,\n traceEntry: sampled.consumption.traceEntry,\n });\n }\n return { value: { values }, nextRng, consumptions };\n }\n case \"coin\": {\n const [offset, nextRng, draw] = nextRandomInt(2, rng, {\n kind: \"integer\",\n parameters: { minInclusive: 0, maxInclusive: 1 },\n });\n return {\n value: { value: offset === 0 ? \"heads\" : \"tails\" },\n nextRng,\n consumptions: [\n {\n operation: \"rngInput.coin\",\n drawIndex: draw.index,\n traceEntry: traceEntry(nextRng),\n },\n ],\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 { assertZoneConsistency } from \"../../table/zones\";\nimport { transactionResultOf } from \"./trusted-runtime-args\";\nimport { safeParseOrThrow } from \"../../parse-utils\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n GameEvent,\n ExactManifestContractOf,\n GameOutcome,\n PhaseMapOf,\n ReducerGameContractLike,\n OptionsOfContract,\n ViewOfContract,\n} from \"../../model\";\n\nimport { normalizeResult } from \"./runtime-scope\";\nimport { createMutableRandomHelpers, type RngConsumption } from \"./rng-sampler\";\nimport type {\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\n\nexport function createLifecycleRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, View>) {\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInitialPhase(): PhaseName {\n const resolvedPhase = (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 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.manifest,\n state,\n playerIds,\n options: state.runtime.options,\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 };\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 transition?: PhaseName;\n consumptions: RngConsumption[];\n terminal?: GameOutcome<PlayerId>;\n events: GameEvent[];\n } {\n const enteringState = {\n ...state,\n flow: {\n ...state.flow,\n currentPhase: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n runtime: {\n ...state.runtime,\n pending: {},\n simultaneous: { current: null },\n lastTransition:\n event === \"initialize\"\n ? null\n : {\n from: state.flow.currentPhase,\n to: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n },\n } as State;\n const workingState = initPhaseState(enteringState, phaseName, playerIds);\n const phase = scope.phaseByName(phaseName);\n let nextState: State = workingState;\n let transition: PhaseName | undefined;\n const consumptions: RngConsumption[] = [];\n let terminal: GameOutcome<PlayerId> | undefined;\n const events: GameEvent[] = [];\n if (phase.enter) {\n const random = createMutableRandomHelpers(workingState.runtime.rng);\n const enterArgs = scope.buildRuntimeArgs(\n workingState,\n {\n event,\n state: scope.toDomainState(workingState),\n },\n { random },\n );\n phase.enter(enterArgs);\n const entered = normalizeResult(transactionResultOf(enterArgs));\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 };\n terminal ??= entered.terminal;\n events.push(...(entered.events ?? []));\n consumptions.push(...random.consumptions());\n transition = entered.transition;\n }\n\n return {\n state: nextState,\n transition,\n consumptions,\n ...(terminal ? { terminal } : {}),\n events,\n };\n }\n\n function initializePhaseResult(\n state: State,\n phaseName: PhaseName,\n ): {\n state: State;\n transition?: PhaseName;\n consumptions: RngConsumption[];\n terminal?: GameOutcome<PlayerId>;\n events: GameEvent[];\n } {\n return enterPhase({\n state,\n phaseName,\n playerIds: scope.buildContext(state).playerOrder,\n event: \"transition\",\n });\n }\n\n function createInitialState({\n table,\n playerIds,\n rngSeed,\n options,\n }: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n options: OptionsOfContract<Contract>;\n }): { state: State; initialPhase: PhaseName } {\n const tableWithManifestDefaults = applyManifestTableDefaults(\n table,\n playerIds,\n );\n const parsedTable = safeParseOrThrow(\n scope.manifest.tableSchema,\n tableWithManifestDefaults,\n \"table\",\n ) as State[\"table\"];\n assertZoneConsistency(parsedTable, scope.definition.contract.manifest);\n const initialPhase = resolveInitialPhase();\n const initialQueries = createStateQueries<\n { table: State[\"table\"] },\n ExactManifestContractOf<Contract>\n >({ table: parsedTable }, scope.manifest);\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.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n options,\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.manifest,\n table: parsedTable,\n playerIds,\n playerId,\n rngSeed,\n options,\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.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n options,\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 events: [],\n rng: {\n seed: rngSeed ?? null,\n cursor: 0,\n trace: [],\n draws: [],\n },\n options,\n pending: {},\n simultaneous: { current: null },\n lastTransition: null,\n },\n },\n };\n }\n\n function applyManifestTableDefaults(\n table: State[\"table\"],\n playerIds: PlayerId[],\n ): State[\"table\"] {\n const manifest = scope.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: { ...defaultZones, ...tableZones },\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 Object.keys(tableResources).length > 0\n ? tableResources\n : manifest.defaults.resources(playerIds),\n };\n }\n\n function initializeSession(\n input: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n options: OptionsOfContract<Contract>;\n },\n complete: (\n result: ReturnType<typeof enterPhase>,\n entries: number,\n ) => {\n state: State;\n terminal?: GameOutcome<PlayerId>;\n events: GameEvent[];\n },\n ): {\n state: SessionState;\n terminal?: GameOutcome<PlayerId>;\n events: GameEvent[];\n } {\n const initial = createInitialState(input);\n const entered = enterPhase({\n state: initial.state,\n phaseName: initial.initialPhase,\n playerIds: input.playerIds,\n event: \"initialize\",\n });\n const drained = complete(entered, 1);\n const terminal = entered.terminal ?? drained.terminal;\n return {\n state: scope.toSessionState(drained.state),\n ...(terminal ? { terminal } : {}),\n events: drained.events,\n };\n }\n\n return {\n createInitialState,\n enterPhase,\n initializePhaseResult,\n initializeSession,\n initPhaseState,\n resolveInitialPhase,\n };\n}\n","import { CARD_REFERENCE_PREFIX } from \"../../../shared/domain/cards.js\";\nimport type { RuntimeQueryTable, ZoneDefinitions } from \"../../model/table.js\";\nimport type {\n HexSpace,\n SquareSpace,\n} from \"../../../shared/board-topology-schema.js\";\nimport { createBoardTopologyCache } from \"../../../shared/board-topology.js\";\nimport {\n digestPluginRuntimeJson,\n encodeCanonicalPluginRuntimeJson,\n} from \"../../../shared/protocol/json.js\";\nimport type { ReferenceBasis } from \"../../../shared/runtime-types.js\";\nimport {\n SeatTileRefSchema,\n SeatSpaceRefSchema,\n type SeatTileRef,\n type SeatSpaceRef,\n} from \"../../../shared/domain/seat-reference.js\";\nimport {\n tileSpaceId,\n parseTileSpaceId,\n} from \"../../../shared/domain/tile-space.js\";\nimport { parsePerPlayerInstanceId } from \"../../../shared/domain/per-player-instance.js\";\nimport { parseBoardSpaceHostId } from \"../../../shared/domain/board-space-host.js\";\nimport {\n BoardProjectionSchema,\n type ProjectedTile,\n type SeatBoardTopology,\n} from \"../../../shared/seat-topology-schema.js\";\nimport {\n enumerateZoneHosts,\n resolveZoneAccess,\n resolveZoneHost,\n} from \"../../table/zones.js\";\n\ntype Access = { readonly inventory: boolean; readonly face: boolean };\nconst denied: Access = { inventory: false, face: false };\nconst visible: Access = { inventory: true, face: true };\nconst topologyOf = createBoardTopologyCache();\nexport type SeatZoneInventory = {\n readonly zoneId: string;\n readonly hostId: string;\n readonly seatHostId: string;\n readonly componentIds: readonly string[];\n readonly tiles: readonly ProjectedTile[];\n};\n\n/** One disclosure decision and reference domain shared by projection and ingress. */\nexport function createSeatDisclosure(\n table: RuntimeQueryTable,\n definitions: ZoneDefinitions,\n playerId: string,\n referenceBasis: ReferenceBasis,\n) {\n const tileRefs = new Map<string, SeatTileRef>();\n const tileIds = new Map<string, string>();\n const spaceRefs = new Map<string, SeatSpaceRef>();\n const spaceIds = new Map<string, string>();\n const projectedTiles = new Map<string, ProjectedTile>();\n const boards: Record<string, SeatBoardTopology> = {};\n const accessMemo = new Map<string, Access>();\n const visiting = new Set<string>();\n const zones: SeatZoneInventory[] = [];\n\n const token = (kind: string, location: unknown, ordinal: number) =>\n digestPluginRuntimeJson({\n kind,\n referenceBasis,\n playerId,\n location,\n ordinal,\n });\n function boardAccess(boardId: string): Access {\n const board = table.boards[boardId];\n if (!board) return denied;\n if (board.visibility === \"public\") return visible;\n if (board.visibility === \"hidden\") return denied;\n return parsePerPlayerInstanceId(boardId)?.playerId === playerId\n ? visible\n : denied;\n }\n function tileFace(tileId: string): boolean {\n const tile = table.tiles[tileId];\n if (!tile) return false;\n const face = tile.disclosure.face;\n return (\n face.audience === \"public\" ||\n (face.audience === \"owner\" && tile.ownerId === playerId) ||\n (face.audience === \"seats\" && face.playerIds.includes(playerId))\n );\n }\n function hostAccess(zoneId: string, hostId: string): Access {\n const definition = definitions.zoneDefinitions[zoneId];\n if (!definition) return denied;\n const host = resolveZoneHost(table, definitions, definition, hostId);\n if (host.componentId !== null) {\n const access = locationAccess(host.componentId);\n if (!access.face) return denied;\n if (Object.hasOwn(table.tiles, host.componentId))\n return tileFace(host.componentId) &&\n table.componentLocations[host.componentId]?.type === \"OnBoard\"\n ? visible\n : denied;\n const restriction = table.visibility[host.componentId];\n return !restriction ||\n restriction.faceUp ||\n restriction.visibleTo?.includes(playerId)\n ? visible\n : denied;\n }\n if (\"attachedTo\" in definition && \"board\" in definition.attachedTo) {\n const boardId =\n definition.attachedTo.space === undefined\n ? hostId\n : parseBoardSpaceHostId(hostId)?.boardId;\n return boardId ? boardAccess(boardId) : denied;\n }\n return visible;\n }\n function zoneAccess(zoneId: string, hostId: string): Access {\n const definition = definitions.zoneDefinitions[zoneId];\n if (\n !definition ||\n !resolveZoneAccess(table, definitions, definition, hostId, playerId)\n )\n return denied;\n const host = hostAccess(zoneId, hostId);\n return {\n inventory: host.inventory,\n face: host.face && definition.visibility !== \"hidden\",\n };\n }\n function locationAccess(componentId: string): Access {\n const cached = accessMemo.get(componentId);\n if (cached) return cached;\n if (visiting.has(componentId))\n throw new Error(\"Cyclic disclosure dependency.\");\n visiting.add(componentId);\n const location = table.componentLocations[componentId];\n let access: Access = denied;\n if (\n location?.type === \"Detached\" &&\n !Object.hasOwn(table.tiles, componentId)\n )\n access = visible;\n if (location?.type === \"InZone\")\n access = zoneAccess(location.zoneId, location.hostId);\n else if (location?.type === \"OnBoard\")\n access = boardAccess(location.boardId);\n else if (\n location?.type === \"OnSpace\" ||\n location?.type === \"OnEdge\" ||\n location?.type === \"OnVertex\"\n ) {\n const board = boards[location.boardId];\n const exists =\n location.type === \"OnSpace\"\n ? board &&\n (board.layout === \"generic\"\n ? Object.hasOwn(board.spaces, location.spaceId)\n : Object.hasOwn(\n board.spaces,\n spaceRefs.get(location.spaceId) ?? \"\",\n ))\n : board &&\n board.layout !== \"generic\" &&\n (location.type === \"OnEdge\"\n ? board.edges.some((edge) => edge.id === location.edgeId)\n : board.vertices.some(\n (vertex) => vertex.id === location.vertexId,\n ));\n access = exists ? boardAccess(location.boardId) : denied;\n }\n visiting.delete(componentId);\n accessMemo.set(componentId, access);\n return access;\n }\n function disclosure(tileId: string): \"visible\" | \"concealed\" | null {\n const access = locationAccess(tileId);\n if (!access.inventory) return null;\n if (access.face && tileFace(tileId)) return \"visible\";\n return table.tiles[tileId]?.disclosure.appearance ? \"concealed\" : null;\n }\n function tilePresentation(\n tileId: string,\n ):\n | Omit<Extract<ProjectedTile, { disclosure: \"visible\" }>, \"ref\">\n | Omit<Extract<ProjectedTile, { disclosure: \"concealed\" }>, \"ref\">\n | null {\n const tile = table.tiles[tileId];\n const state = disclosure(tileId);\n if (!tile || state === null) return null;\n if (state === \"concealed\") {\n const appearance = tile.disclosure.appearance;\n return appearance ? { disclosure: state, appearance } : null;\n }\n const definition = definitions.tileDefinitions[tile.tileTypeId];\n return {\n disclosure: state,\n tileTypeId: tile.tileTypeId,\n name: definition.name,\n ...(definition.frontImage === undefined\n ? {}\n : { frontImage: definition.frontImage }),\n ownerId: tile.ownerId,\n fields: definition.fields,\n properties: tile.properties,\n };\n }\n function issueTile(\n tileId: string,\n location: unknown,\n ordinal: number,\n ): ProjectedTile | null {\n const presentation = tilePresentation(tileId);\n if (!presentation) return null;\n const ref = SeatTileRefSchema.parse(\n `tile-ref:${token(\"tile\", location, ordinal)}`,\n );\n const projected = { ...presentation, ref };\n tileRefs.set(tileId, ref);\n tileIds.set(ref, tileId);\n projectedTiles.set(tileId, projected);\n return projected;\n }\n\n // Board slots depend only on disclosed placement and presentation, not inventory IDs.\n // Equal public slots are indistinguishable; their ordinal reveals only disclosed count.\n for (const boardId of Object.keys(table.boards).sort()) {\n if (!boardAccess(boardId).inventory) continue;\n const instance = table.boards[boardId];\n const definition = definitions.boardDefinitions[instance.baseId];\n const candidates = Object.keys(table.tiles)\n .flatMap((tileId) => {\n const location = table.componentLocations[tileId];\n if (location?.type !== \"OnBoard\" || location.boardId !== boardId)\n return [];\n const presentation = tilePresentation(tileId);\n return presentation\n ? [\n {\n tileId,\n location,\n presentation,\n key: encodeCanonicalPluginRuntimeJson({\n location,\n presentation,\n }),\n },\n ]\n : [];\n })\n .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n const placed = candidates.flatMap(({ tileId, location }, index) => {\n const tile = issueTile(tileId, { boardId }, index);\n if (!tile) return [];\n const placement =\n location.layout === \"hex\"\n ? {\n layout: location.layout,\n q: location.q,\n r: location.r,\n rotation: location.rotation,\n }\n : {\n layout: location.layout,\n col: location.col,\n row: location.row,\n rotation: location.rotation,\n };\n return [{ ...tile, placement }];\n });\n const visibleIds = candidates\n .filter(({ tileId }) => disclosure(tileId) === \"visible\")\n .map(({ tileId }) => tileId);\n const visibleSpaces = new Set(\n definition.layout === \"generic\"\n ? Object.keys(definition.spaces)\n : visibleIds.flatMap((tileId) =>\n definitions.tileDefinitions[\n table.tiles[tileId].tileTypeId\n ].cells.map((cell) => tileSpaceId(tileId, cell.id)),\n ),\n );\n const topology = topologyOf(\n {\n boards: {\n [boardId]: {\n ...instance,\n relations: instance.relations.filter(\n (relation) =>\n visibleSpaces.has(relation.fromSpaceId) &&\n visibleSpaces.has(relation.toSpaceId),\n ),\n },\n },\n tiles: Object.fromEntries(\n visibleIds.map((id) => [id, table.tiles[id]]),\n ),\n componentLocations: Object.fromEntries(\n visibleIds.map((id) => [id, table.componentLocations[id]]),\n ),\n },\n definitions,\n boardId,\n );\n if (topology.layout === \"generic\") {\n boards[boardId] = topology;\n continue;\n }\n for (const space of Object.values<HexSpace | SquareSpace>(\n topology.spaces,\n )) {\n const ref = tileRefs.get(space.tileId);\n if (!ref) throw new Error(\"Visible cell has no issued tile reference.\");\n const spaceRef = SeatSpaceRefSchema.parse(\n `space-ref:${digestPluginRuntimeJson({ ref, cell: space.localCellId })}`,\n );\n spaceRefs.set(space.id, spaceRef);\n spaceIds.set(spaceRef, space.id);\n }\n const projectedSpaceId = (id: string) => {\n const ref = spaceRefs.get(id);\n if (!ref)\n throw new Error(\"Projected topology references an undisclosed cell.\");\n return ref;\n };\n const projected = {\n ...topology,\n tiles: placed,\n spaces: Object.fromEntries(\n Object.values<HexSpace | SquareSpace>(topology.spaces).map((space) => {\n const { tileId, ...cell } = space;\n const id = projectedSpaceId(space.id);\n return [id, { ...cell, id, tileRef: tileRefs.get(tileId) }];\n }),\n ),\n relations: topology.relations.map((relation) => ({\n ...relation,\n fromSpaceId: projectedSpaceId(relation.fromSpaceId),\n toSpaceId: projectedSpaceId(relation.toSpaceId),\n })),\n edges: topology.edges.map((edge) => ({\n ...edge,\n spaceIds: edge.spaceIds.map(projectedSpaceId),\n })),\n vertices: topology.vertices.map((vertex) => ({\n ...vertex,\n spaceIds: vertex.spaceIds.map(projectedSpaceId),\n })),\n };\n boards[boardId] = BoardProjectionSchema.parse({ [boardId]: projected })[\n boardId\n ];\n }\n\n for (const zoneId of Object.keys(definitions.zoneDefinitions).sort()) {\n const definition = definitions.zoneDefinitions[zoneId];\n const hosts = enumerateZoneHosts(table, definitions, definition)\n .flatMap((hostId) => {\n if (!zoneAccess(zoneId, hostId).inventory) return [];\n const parsed =\n \"attachedTo\" in definition && \"tileType\" in definition.attachedTo\n ? parseTileSpaceId(hostId)\n : null;\n const seatHostId = parsed ? spaceRefs.get(hostId) : hostId;\n return seatHostId ? [{ hostId, seatHostId }] : [];\n })\n .sort((a, b) =>\n a.seatHostId < b.seatHostId ? -1 : a.seatHostId > b.seatHostId ? 1 : 0,\n );\n for (const { hostId, seatHostId } of hosts) {\n const componentIds = table.zones[zoneId]?.[hostId] ?? [];\n const tiles: ProjectedTile[] = [];\n for (const id of componentIds) {\n if (!Object.hasOwn(table.tiles, id)) continue;\n const projected = issueTile(\n id,\n { zoneId, hostId: seatHostId },\n tiles.length,\n );\n if (projected) tiles.push(projected);\n }\n zones.push({ zoneId, hostId, seatHostId, componentIds, tiles });\n }\n }\n\n function boardTarget(\n kind: \"space\" | \"edge\" | \"vertex\",\n boardId: string,\n id: string,\n ): string | null {\n const board = boards[boardId];\n if (!board) return null;\n if (kind === \"space\") {\n const ref = board.layout === \"generic\" ? id : spaceRefs.get(id);\n return ref && Object.hasOwn(board.spaces, ref) ? ref : null;\n }\n if (board.layout === \"generic\") return null;\n return (kind === \"edge\" ? board.edges : board.vertices).some(\n (item) => item.id === id,\n )\n ? id\n : null;\n }\n return {\n boards,\n zones,\n locationAccess,\n referenceBasis,\n tile: (id: string) => projectedTiles.get(id) ?? null,\n tileRef: (id: string) => tileRefs.get(id) ?? null,\n tileId: (ref: string) => tileIds.get(ref) ?? null,\n boardTarget,\n authoritativeBoardTarget(\n kind: \"space\" | \"edge\" | \"vertex\",\n boardId: string,\n ref: string,\n ): string | null {\n const board = boards[boardId];\n const id =\n kind === \"space\" && board?.layout !== \"generic\"\n ? spaceIds.get(ref)\n : ref;\n return id && boardTarget(kind, boardId, id) === ref ? id : null;\n },\n cardRef: (location: unknown, ordinal: number) =>\n `${CARD_REFERENCE_PREFIX}${token(\"card\", location, ordinal)}`,\n };\n}\nexport type SeatDisclosure = ReturnType<typeof createSeatDisclosure>;\n","import { isCardReferenceNamespace } from \"../../../shared/domain/cards.js\";\nimport type { RuntimeTableRecord } from \"../../model\";\nimport type { SeatDisclosure, SeatZoneInventory } from \"./tile-disclosure.js\";\nimport { encodeCanonicalPluginRuntimeJson } from \"../../../shared/protocol/json.js\";\n\ntype SeatZone = Pick<SeatZoneInventory, \"zoneId\" | \"hostId\" | \"seatHostId\"> & {\n readonly cardIds: readonly string[];\n};\n\n/** Card faces and location access use the same seat disclosure decisions as tiles. */\nexport type CardConcealment = {\n /** Zone hosts whose projected card inventory this seat may access. */\n zones: readonly SeatZone[];\n /** The id the seat knows a card by. */\n seatCardId(cardId: string): string;\n isHidden(cardId: string): boolean;\n canTarget(cardId: string): boolean;\n /**\n * The card a submitted id names, or `null` when it is the table id of a\n * card hidden from the seat.\n */\n tableCardId(id: string): string | null;\n};\n\nexport function concealCards(\n table: RuntimeTableRecord,\n playerId: string,\n disclosure: SeatDisclosure,\n): CardConcealment {\n const zones: SeatZone[] = [];\n const seatIds = new Map<string, string>();\n const tableIds = new Map<string, string>();\n const denied = new Set<string>();\n const hidden = (cardId: string) => {\n const restriction = table.visibility[cardId];\n return (\n !disclosure.locationAccess(cardId).face ||\n (restriction &&\n !restriction.faceUp &&\n !restriction.visibleTo?.includes(playerId))\n );\n };\n const issue = (cardId: string, location: unknown, ordinal: number) => {\n const seatId = disclosure.cardRef(location, ordinal);\n if (Object.hasOwn(table.cards, seatId))\n throw new Error(\n \"Card id conflicts with the reserved seat-reference namespace.\",\n );\n seatIds.set(cardId, seatId);\n tableIds.set(seatId, cardId);\n };\n for (const cardId of Object.keys(table.cards)) {\n if (\n !disclosure.locationAccess(cardId).inventory ||\n (hidden(cardId) && table.componentLocations[cardId]?.type === \"Detached\")\n )\n denied.add(cardId);\n }\n for (const zone of disclosure.zones) {\n const cardIds = zone.componentIds.filter((id) =>\n Object.hasOwn(table.cards, id),\n );\n const { zoneId, hostId, seatHostId } = zone;\n zones.push({ zoneId, hostId, seatHostId, cardIds });\n cardIds.forEach((id, index) => {\n if (hidden(id)) issue(id, { zoneId, hostId: seatHostId }, index);\n });\n }\n const spatial = Object.keys(table.cards)\n .flatMap((cardId) => {\n const location = table.componentLocations[cardId];\n if (\n denied.has(cardId) ||\n !hidden(cardId) ||\n !location ||\n location.type === \"InZone\" ||\n location.type === \"Detached\"\n )\n return [];\n const publicLocation =\n location.type === \"OnSpace\"\n ? {\n ...location,\n spaceId: disclosure.boardTarget(\n \"space\",\n location.boardId,\n location.spaceId,\n ),\n }\n : location;\n return [\n {\n cardId,\n publicLocation,\n key: encodeCanonicalPluginRuntimeJson(publicLocation),\n },\n ];\n })\n .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n spatial.forEach(({ cardId, publicLocation }, index) =>\n issue(cardId, publicLocation, index),\n );\n return {\n zones,\n seatCardId: (cardId) => seatIds.get(cardId) ?? cardId,\n isHidden: (cardId) =>\n Object.hasOwn(table.cards, cardId) && Boolean(hidden(cardId)),\n canTarget: (cardId) =>\n Object.hasOwn(table.cards, cardId) && !denied.has(cardId),\n tableCardId: (id) =>\n tableIds.get(id) ??\n (!Object.hasOwn(table.cards, id) ||\n seatIds.has(id) ||\n denied.has(id) ||\n isCardReferenceNamespace(id)\n ? null\n : id),\n };\n}\n","import { isBoardSpaceTarget } from \"../../../shared/board-target.js\";\nimport { inputValueInDomain } from \"../../../shared/input-domain.js\";\nimport { isPositionTarget } from \"../../../shared/position-target.js\";\nimport type {\n InputCollector,\n InputDomainDescriptor,\n} from \"../../model/spec/inputs.js\";\nimport type { CardConcealment } from \"./card-concealment.js\";\nimport type { SeatDisclosure } from \"./tile-disclosure.js\";\nimport type {\n InteractionDescriptorShape,\n InteractionInputDescriptorShape,\n} from \"./interaction-types.js\";\n\ntype Collectors = Readonly<Record<string, InputCollector>>;\ntype ReferenceMapper = (value: unknown) => unknown;\nconst denied = Symbol(\"unauthorized component reference\");\n\n/** Map one declared scalar or flat many field; never inspect arbitrary game data. */\nfunction mapSelection(\n value: unknown,\n many: boolean,\n map: ReferenceMapper,\n): unknown {\n if (!many) return map(value);\n if (!Array.isArray(value)) return denied;\n const mapped = value.map(map);\n return mapped.includes(denied) ? denied : mapped;\n}\n\nfunction cardReference(\n id: unknown,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n decode: boolean,\n): unknown {\n if (typeof id !== \"string\") return denied;\n const cardId = decode ? cards.tableCardId(id) : id;\n if (\n cardId === null ||\n !cards.canTarget(cardId) ||\n !disclosure.locationAccess(cardId).inventory\n )\n return denied;\n return decode ? cardId : cards.seatCardId(cardId);\n}\n\nfunction boardReference(\n value: unknown,\n domain: Extract<InputDomainDescriptor, { type: \"boardTarget\" }>,\n disclosure: SeatDisclosure,\n decode: boolean,\n): unknown {\n const map = decode\n ? disclosure.authoritativeBoardTarget\n : disclosure.boardTarget;\n if (domain.valueKind === \"board-space\") {\n if (!isBoardSpaceTarget(value)) return denied;\n const spaceId = map(\"space\", value.boardId, value.spaceId);\n return spaceId === null ? denied : { boardId: value.boardId, spaceId };\n }\n if (typeof value !== \"string\") return denied;\n return map(domain.targetKind, domain.boardId, value) ?? denied;\n}\n\nfunction zoneHostReference(\n zoneId: string,\n hostId: string,\n disclosure: SeatDisclosure,\n decode: boolean,\n): string | null {\n const zone = disclosure.zones.find(\n (zone) =>\n zone.zoneId === zoneId &&\n (decode ? zone.seatHostId : zone.hostId) === hostId,\n );\n return zone ? (decode ? zone.hostId : zone.seatHostId) : null;\n}\n\nfunction positionReference(\n value: unknown,\n disclosure: SeatDisclosure,\n decode: boolean,\n): unknown {\n if (!isPositionTarget(value)) return denied;\n const hostId = zoneHostReference(\n value.zoneId,\n value.hostId,\n disclosure,\n decode,\n );\n return hostId === null ? denied : { ...value, hostId };\n}\n\nfunction domainMapper(\n domain: InputDomainDescriptor,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n decode: boolean,\n): ReferenceMapper | undefined {\n switch (domain.type) {\n case \"tileTarget\":\n return (value) =>\n typeof value === \"string\"\n ? ((decode ? disclosure.tileId(value) : disclosure.tileRef(value)) ??\n denied)\n : denied;\n case \"cardTarget\":\n return (value) => cardReference(value, disclosure, cards, decode);\n case \"boardTarget\":\n return (value) => boardReference(value, domain, disclosure, decode);\n case \"zonePosition\":\n return (value) => positionReference(value, disclosure, decode);\n default:\n return undefined;\n }\n}\n\n/** Collector metadata describes reference positions even for earlier selected steps. */\nfunction collectorMapper(\n collector: InputCollector,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n decode: boolean,\n): ReferenceMapper | undefined {\n switch (collector.kind) {\n case \"position\":\n return (value) => positionReference(value, disclosure, decode);\n case \"tile\":\n return (value) =>\n typeof value === \"string\"\n ? ((decode ? disclosure.tileId(value) : disclosure.tileRef(value)) ??\n denied)\n : denied;\n case \"card\":\n return (value) => cardReference(value, disclosure, cards, decode);\n case \"board-space\":\n case \"board-edge\":\n case \"board-vertex\": {\n const meta = collector.meta;\n const domain =\n meta.valueKind === \"board-space\"\n ? {\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: \"space\" as const,\n valueKind: \"board-space\" as const,\n boardBaseId: meta.boardBaseId,\n eligibleTargets: [],\n }\n : {\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: meta.targetKind,\n valueKind: \"board-id\" as const,\n boardId: meta.boardId,\n eligibleTargets: [],\n };\n return (value) => boardReference(value, domain, disclosure, decode);\n }\n default:\n return undefined;\n }\n}\n\n/** An identity-specific default would track a concealed component across hidden reorder. */\nfunction defaultMapper(\n domain: InputDomainDescriptor,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n map: ReferenceMapper,\n): ReferenceMapper {\n if (domain.type === \"tileTarget\")\n return (value) =>\n typeof value === \"string\" &&\n disclosure.tile(value)?.disclosure === \"visible\"\n ? map(value)\n : denied;\n if (domain.type === \"cardTarget\")\n return (value) =>\n typeof value === \"string\" && !cards.isHidden(value) ? map(value) : denied;\n return map;\n}\n\nfunction projectInput(\n input: InteractionInputDescriptorShape,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n): InteractionInputDescriptorShape {\n const map = domainMapper(input.domain, disclosure, cards, false);\n if (!map) return input;\n const domain = input.domain;\n if (\n domain.type !== \"tileTarget\" &&\n domain.type !== \"cardTarget\" &&\n domain.type !== \"boardTarget\" &&\n domain.type !== \"zonePosition\"\n )\n return input;\n // The domain discriminator and mapper preserve the domain's scalar/object representation.\n const projectedDomain = (\n domain.type === \"zonePosition\"\n ? {\n ...domain,\n zones: domain.zones.flatMap((zone) => {\n const hostId = zoneHostReference(\n zone.zoneId,\n zone.hostId,\n disclosure,\n false,\n );\n return hostId === null ? [] : [{ ...zone, hostId }];\n }),\n }\n : {\n ...domain,\n eligibleTargets: domain.eligibleTargets.flatMap((value) => {\n const mapped = map(value);\n return mapped === denied ? [] : [mapped];\n }),\n }\n ) as InputDomainDescriptor;\n const { defaultValue, ...rest } = input;\n const mappedDefault =\n defaultValue === undefined\n ? denied\n : mapSelection(\n defaultValue,\n domain.selection?.mode === \"many\",\n defaultMapper(domain, disclosure, cards, map),\n );\n return {\n ...rest,\n domain: projectedDomain,\n ...(mappedDefault !== denied &&\n inputValueInDomain(projectedDomain, mappedDefault, domain.selection)\n ? { defaultValue: mappedDefault }\n : {}),\n };\n}\n\n/** Project targets, defaults and drafts through the same seat reference authority. */\nexport function projectSeatDescriptor(\n descriptor: InteractionDescriptorShape,\n collectors: Collectors,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n): InteractionDescriptorShape | null {\n let selected: Record<string, unknown> | undefined;\n if (descriptor.step) {\n selected = {};\n for (const [key, value] of Object.entries(descriptor.step.selected)) {\n const collector = collectors[key];\n if (!collector) return null;\n const map = collectorMapper(collector, disclosure, cards, false);\n const mapped = map\n ? mapSelection(value, collector.selection?.mode === \"many\", map)\n : value;\n if (mapped === denied) return null;\n selected[key] = mapped;\n }\n }\n return {\n ...descriptor,\n inputs: descriptor.inputs.map((input) =>\n projectInput(input, disclosure, cards),\n ),\n ...(descriptor.step && selected\n ? { step: { ...descriptor.step, selected } }\n : {}),\n };\n}\n\n/** Resolve only declared reference fields before the authoritative parameter schema runs. */\nexport function decodeSeatParams(\n params: Readonly<Record<string, unknown>>,\n collectors: Collectors,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n): Record<string, unknown> | null {\n const decoded: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n const collector = collectors[key];\n const map =\n collector && collectorMapper(collector, disclosure, cards, true);\n const mapped = map\n ? mapSelection(value, collector.selection?.mode === \"many\", map)\n : value;\n if (mapped === denied) return null;\n decoded[key] = mapped;\n }\n return decoded;\n}\n\n/** Full-knowledge test adapter only: invalid references stay invalid for normal ingress rejection. */\nexport function encodeSeatParams(\n params: Readonly<Record<string, unknown>>,\n collectors: Collectors,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(params).map(([key, value]) => {\n const collector = collectors[key];\n const map =\n collector && collectorMapper(collector, disclosure, cards, false);\n if (!map) return [key, value];\n const mapped = mapSelection(\n value,\n collector.selection?.mode === \"many\",\n (item) => {\n const result = map(item);\n return result === denied ? item : result;\n },\n );\n return [key, mapped === denied ? value : mapped];\n }),\n );\n}\n\n/** Pending selection admission uses the same declared reference positions as projection. */\nexport function canDiscloseSelection(\n params: Readonly<Record<string, unknown>>,\n collectors: Collectors,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n): boolean {\n return Object.entries(params).every(([key, value]) => {\n const collector = collectors[key];\n if (!collector) return false;\n const map = collectorMapper(collector, disclosure, cards, false);\n return (\n !map ||\n mapSelection(value, collector.selection?.mode === \"many\", map) !== denied\n );\n });\n}\n\n/** A concealed draft cannot carry its authoritative identity into another reference basis. */\nexport function selectionHasConcealedReferences(\n params: Readonly<Record<string, unknown>>,\n collectors: Collectors,\n disclosure: SeatDisclosure,\n cards: CardConcealment,\n): boolean {\n return Object.entries(params).some(([key, value]) => {\n const collector = collectors[key];\n if (!collector || (collector.kind !== \"tile\" && collector.kind !== \"card\"))\n return false;\n let concealed = false;\n mapSelection(value, collector.selection?.mode === \"many\", (id) => {\n if (\n typeof id === \"string\" &&\n (collector.kind === \"tile\"\n ? disclosure.tile(id)?.disclosure === \"concealed\"\n : cards.isHidden(id))\n )\n concealed = true;\n return id;\n });\n return concealed;\n });\n}\n","import type { ReferenceBasis } from \"../../../shared/runtime-types.js\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimePayload,\n ViewOfContract,\n} from \"../../model.js\";\nimport type {\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope.js\";\nimport type { createInteractionResolver } from \"./interaction-resolver.js\";\nimport { evaluateStepPrefix } from \"./step-prefix.js\";\nimport { createSeatDisclosure } from \"./tile-disclosure.js\";\nimport { concealCards } from \"./card-concealment.js\";\nimport {\n canDiscloseSelection,\n selectionHasConcealedReferences,\n} from \"./seat-interactions.js\";\n\n/** Reconcile pending references before any projection, inspection or action decision. */\nexport function createPendingSelectionReconciler<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n interactions: ReturnType<\n typeof createInteractionResolver<Contract, Definitions, View>\n >,\n) {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n function reconcilePending(\n state: State,\n referenceBasis?: ReferenceBasis,\n ): State {\n const pending = { ...state.runtime.pending };\n for (const [seat, choice] of Object.entries(state.runtime.pending)) {\n const playerId = seat as PlayerId;\n const saved = choice as NonNullable<\n State[\"runtime\"][\"pending\"][PlayerId]\n >;\n const interaction = scope.findInteractionInPhase(\n state.flow.currentPhase,\n saved.interactionId,\n );\n const eligibility = interactions.resolveInteractionEligibility({\n state,\n playerId,\n interactionId: saved.interactionId,\n });\n if (\n saved.phaseName !== state.flow.currentPhase ||\n !interaction?.steps ||\n !eligibility.found ||\n !eligibility.validation.valid\n ) {\n delete pending[playerId];\n continue;\n }\n const prefix = evaluateStepPrefix(\n interaction.steps,\n scope.toDomainState(state),\n playerId,\n saved.values,\n scope.manifest,\n );\n if (!referenceBasis)\n throw new Error(\n \"Pending selections require an authority reference basis.\",\n );\n const disclosure = createSeatDisclosure(\n state.table,\n scope.manifest,\n playerId,\n referenceBasis,\n );\n const cards = concealCards(state.table, playerId, disclosure);\n const concealed = selectionHasConcealedReferences(\n prefix.selected,\n prefix.collectors,\n disclosure,\n cards,\n );\n const current = saved.concealedBasis\n ? saved.concealedBasis.sessionId === referenceBasis.sessionId &&\n saved.concealedBasis.version === referenceBasis.version\n : !concealed;\n if (\n prefix.values.length === 0 ||\n !current ||\n !canDiscloseSelection(\n prefix.selected,\n prefix.collectors,\n disclosure,\n cards,\n )\n )\n delete pending[playerId];\n else\n pending[playerId] = {\n ...saved,\n values: prefix.values as RuntimePayload[],\n };\n }\n return { ...state, runtime: { ...state.runtime, pending } };\n }\n\n return reconcilePending;\n}\n","import { assertGameEventReferences } from \"../../../shared/domain/event-admission.js\";\nimport { createPendingSelectionReconciler } from \"./pending-selection.js\";\nimport { normalizeGameEvents } from \"./trusted-runtime-result\";\nimport { evaluateStepPrefix } from \"./step-prefix\";\nimport { concealCards } from \"./card-concealment\";\nimport { createSeatDisclosure } from \"./tile-disclosure.js\";\nimport {\n decodeSeatParams,\n selectionHasConcealedReferences,\n} from \"./seat-interactions.js\";\nimport type { ReferenceBasis } from \"../../../shared/runtime-types.js\";\nimport { transactionResultOf } from \"./trusted-runtime-args\";\nimport type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimePayload } from \"../../model\";\nimport type {\n GameEvent,\n GameOutcome,\n InputCollector,\n SimultaneousResolveArgs,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerResult,\n RuntimeRngState,\n ViewOfContract,\n} from \"../../model\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport {\n createMutableRandomHelpers,\n sampleRngCollectorValue,\n type RngConsumption,\n} from \"./rng-sampler\";\nimport {\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 View extends ViewOfContract<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, View>>;\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, View>>;\n\nexport function createReducerExecutor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n interactions: InteractionResolverFor<Contract, Definitions, View>,\n lifecycle: LifecycleRunnerFor<Contract, Definitions, View>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n type RuntimeRngResult = {\n runtimeRng?: RuntimeRngState;\n rngConsumptions?: readonly RngConsumption[];\n };\n\n function rngTrace(\n consumptions: readonly RngConsumption[],\n ): DispatchTraceEntry<State, PlayerId, ReducerInput>[] {\n return consumptions.map((consumption) => ({\n type: \"rngConsumption\" as const,\n version: 2 as const,\n operation: consumption.operation,\n drawIndex: consumption.drawIndex,\n traceEntry: consumption.traceEntry,\n }));\n }\n\n function reduceInternal(\n state: State,\n input: Extract<ReducerInput, { kind: \"interaction\" }>,\n ): ReducerResult<DomainState> & RuntimeRngResult {\n const ctx = scope.buildContext(state);\n\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 params = input.params as Record<string, unknown>;\n const random = createMutableRandomHelpers(state.runtime.rng);\n const reduceArgs = scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n playerId: input.playerId,\n params,\n },\n },\n { random },\n );\n interaction.reduce(reduceArgs);\n const result = normalizeResult(transactionResultOf(reduceArgs));\n return result.type === \"accept\"\n ? {\n ...result,\n runtimeRng: random.currentRng(),\n rngConsumptions: random.consumptions(),\n }\n : result;\n }\n\n function preSampleRngForAction(\n state: State,\n input: Extract<ReducerInput, { kind: \"interaction\" }>,\n ): {\n state: State;\n input: Extract<ReducerInput, { kind: \"interaction\" }>;\n error?: string;\n consumptions: readonly {\n operation: string;\n drawIndex: number;\n traceEntry: string;\n }[];\n } {\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, consumptions: [] };\n const collectors = interaction.inputs ?? {};\n let nextRng = state.runtime.rng;\n const sampled: Record<string, unknown> = {};\n const consumptions: RngConsumption[] = [];\n let anySampled = false;\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind !== \"rng\") continue;\n const {\n value,\n nextRng: advanced,\n consumptions: collectorConsumptions,\n } = sampleRngCollectorValue(collector, nextRng);\n const parsed = collector.schema.safeParse(value);\n if (!parsed.success) {\n return {\n state,\n input,\n consumptions: [],\n error: parsed.error.issues\n .map((issue) => `params.${key}: ${issue.message}`)\n .join(\"; \"),\n };\n }\n sampled[key] = parsed.data;\n nextRng = advanced;\n consumptions.push(...collectorConsumptions);\n anySampled = true;\n }\n if (!anySampled) return { state, input, consumptions: [] };\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 },\n input: { ...input, params: mergedParams } as Extract<\n ReducerInput,\n { kind: \"interaction\" }\n >,\n consumptions,\n };\n }\n\n function clearSimultaneousCurrent(state: State): State {\n return {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: { current: null },\n },\n };\n }\n\n function reduceSimultaneousSubmit(\n state: State,\n input: Extract<ReducerInput, { kind: \"interaction\" }>,\n ):\n | (ReducerResult<State> & {\n trace?: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n })\n | null {\n if (input.interactionId !== SIMULTANEOUS_SUBMIT_INTERACTION_ID) {\n return null;\n }\n\n const phaseName = state.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (phase.kind !== \"simultaneousPlayer\") {\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.resolve;\n\n const actors = resolveSimultaneousActors(scope, state, phase);\n if (!actors.includes(input.playerId)) {\n return rejectResult(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${input.interactionId}').`,\n );\n }\n\n const params = input.params;\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,\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 };\n }\n\n // Each stored submission passed collector validation; the barrier above\n // establishes an entry for every actor. Bind that validated record once.\n const resolvedSubmissions = Object.fromEntries(\n actors.map((actor) => [\n actor,\n {\n playerId: actor,\n params: submissions[actor]?.params ?? {},\n },\n ]),\n ) as SimultaneousResolveArgs<\n Record<string, InputCollector>,\n DomainState,\n TrustedManifest<Contract>\n >[\"submissions\"];\n const random = createMutableRandomHelpers(stateWithSubmission.runtime.rng);\n const resolveArgs = scope.buildRuntimeArgs(\n stateWithSubmission,\n {\n state: scope.toDomainState(stateWithSubmission),\n submissions: resolvedSubmissions,\n submittedPlayerIds: [...actors],\n waitingPlayerIds: [],\n },\n { random },\n );\n resolve(resolveArgs);\n const resolved = normalizeResult(transactionResultOf(resolveArgs));\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 }),\n ...(resolved.transition ? { transition: resolved.transition } : {}),\n ...(resolved.terminal ? { terminal: resolved.terminal } : {}),\n events: resolved.events ?? [],\n trace: rngTrace(random.consumptions()),\n };\n }\n\n function reduceOnce(\n state: State,\n input: Extract<ReducerInput, { kind: \"interaction\" }>,\n ) {\n const sampled = preSampleRngForAction(state, input);\n if (sampled.error)\n return rejectResult(\"invalid-action-params\", sampled.error);\n const simultaneousResult = reduceSimultaneousSubmit(\n sampled.state,\n sampled.input,\n );\n if (simultaneousResult) {\n return simultaneousResult.type === \"reject\"\n ? simultaneousResult\n : {\n ...simultaneousResult,\n trace: [\n ...rngTrace(sampled.consumptions),\n ...(simultaneousResult.trace ?? []),\n ],\n };\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 ...(result.transition ? { transition: result.transition } : {}),\n ...(result.terminal ? { terminal: result.terminal } : {}),\n events: result.events ?? [],\n trace: rngTrace([\n ...sampled.consumptions,\n ...(result.rngConsumptions ?? []),\n ]),\n };\n }\n\n const reconcilePending = createPendingSelectionReconciler(\n scope,\n interactions,\n );\n\n const MAX_PHASE_ENTRIES = 1_000;\n\n type Accepted = {\n state: State;\n transition?: PhaseName;\n terminal?: GameOutcome<PlayerId>;\n events?: readonly GameEvent[];\n trace?: readonly DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n };\n\n function complete(\n initial: Accepted,\n entries = 0,\n referenceBasis?: ReferenceBasis,\n ) {\n let state = initial.state;\n let transition = initial.transition;\n let terminal = initial.terminal;\n const events = [...(initial.events ?? [])];\n const trace = [...(initial.trace ?? [])];\n while (transition !== undefined) {\n if (entries >= MAX_PHASE_ENTRIES) {\n throw new Error(\n `Reducer exceeded ${MAX_PHASE_ENTRIES} phase entries in one dispatch.`,\n );\n }\n entries += 1;\n const finalEntry = terminal !== undefined;\n const from = state.flow.currentPhase;\n const entered = lifecycle.initializePhaseResult(state, transition);\n trace.push({\n type: \"phaseEntered\",\n from,\n to: entered.state.flow.currentPhase,\n });\n trace.push(...rngTrace(entered.consumptions));\n state = entered.state;\n events.push(...entered.events);\n terminal ??= entered.terminal;\n if (finalEntry && entered.transition !== undefined) {\n throw new Error(\n \"A terminal phase entry cannot request another transition.\",\n );\n }\n transition = entered.transition;\n }\n const committedEvents = normalizeGameEvents(events);\n assertGameEventReferences(committedEvents, state.table);\n return {\n type: \"accept\" as const,\n state: reconcilePending(\n {\n ...state,\n runtime: { ...state.runtime, events: committedEvents },\n },\n referenceBasis,\n ),\n events: committedEvents,\n trace,\n ...(terminal ? { terminal } : {}),\n };\n }\n\n function dispatch(\n state: State,\n input: ReducerInput,\n referenceBasis: ReferenceBasis,\n ) {\n if (\n input.basis.sessionId !== referenceBasis.sessionId ||\n input.basis.version !== referenceBasis.version ||\n input.basis.perspectivePlayerId !== input.playerId\n )\n return rejectResult(\n \"STALE_REFERENCE_BASIS\",\n \"The action no longer belongs to this seat frame.\",\n );\n state = reconcilePending(state, referenceBasis);\n const nextBasis = {\n ...referenceBasis,\n version: referenceBasis.version + 1,\n };\n const pending = { ...state.runtime.pending };\n if (input.kind === \"interaction.cancel\") {\n const rejected = interactions.validateOrReject(state, input);\n if (rejected) return rejected;\n delete pending[input.playerId];\n return complete(\n {\n state: { ...state, runtime: { ...state.runtime, pending } },\n trace: [{ type: \"acceptedClientInput\", input }],\n },\n 0,\n nextBasis,\n );\n }\n const disclosure = createSeatDisclosure(\n state.table,\n scope.manifest,\n input.playerId,\n referenceBasis,\n );\n const params = decodeSeatParams(\n input.params as Record<string, unknown>,\n interactions.inputCollectors(state, input.playerId, input.interactionId),\n disclosure,\n concealCards(state.table, input.playerId, disclosure),\n );\n if (params === null)\n return rejectResult(\n \"COMPONENT_TARGET_NOT_ELIGIBLE\",\n \"Component target is not eligible.\",\n );\n const decision = interactions.resolveInteractionDecision({\n state,\n playerId: input.playerId,\n interactionId: input.interactionId,\n params,\n mode: \"submit\",\n });\n if (!decision.validation.valid)\n return rejectResult(\n decision.validation.errorCode,\n decision.validation.message,\n );\n if (!decision.found) return rejectResult(\"unsupported-action\");\n let workingState = state;\n const workingInput = {\n ...input,\n params: decision.parsedParams as RuntimePayload,\n };\n if (decision.stepResult) {\n if (!decision.stepResult.complete) {\n const interaction = scope.findInteractionInPhase(\n state.flow.currentPhase,\n input.interactionId,\n );\n if (!interaction?.steps)\n throw new Error(\"A step result requires authored steps.\");\n const prefix = evaluateStepPrefix(\n interaction.steps,\n scope.toDomainState(state),\n input.playerId,\n decision.stepResult.values,\n scope.manifest,\n );\n const concealed = selectionHasConcealedReferences(\n prefix.selected,\n prefix.collectors,\n disclosure,\n concealCards(state.table, input.playerId, disclosure),\n );\n pending[input.playerId] = {\n ...(concealed ? { concealedBasis: nextBasis } : {}),\n phaseName: state.flow.currentPhase,\n interactionId: input.interactionId,\n values: decision.stepResult.values as RuntimePayload[],\n };\n return complete(\n {\n state: { ...state, runtime: { ...state.runtime, pending } },\n trace: [{ type: \"acceptedClientInput\", input }],\n },\n 0,\n nextBasis,\n );\n }\n delete pending[input.playerId];\n workingState = { ...state, runtime: { ...state.runtime, pending } };\n }\n const result = reduceOnce(workingState, workingInput);\n if (result.type === \"reject\") return result;\n return complete(\n {\n ...result,\n transition: result.transition,\n trace: [\n { type: \"acceptedClientInput\", input },\n ...(result.trace ?? []),\n ],\n },\n 0,\n nextBasis,\n );\n }\n\n return { dispatch, complete, reconcilePending };\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n RuntimeTableRecord,\n TableQueriesOfState,\n ZoneDefinitions,\n} from \"../../model\";\n\nexport type ProjectionContext<\n State extends { table: RuntimeTableRecord },\n Definitions extends ZoneDefinitions,\n> = {\n readonly domainState: State;\n readonly q: TableQueriesOfState<State, Definitions>;\n};\n\nexport function createProjectionContext<\n State extends { table: RuntimeTableRecord },\n Definitions extends ZoneDefinitions,\n>(options: {\n domainState: State;\n definitions: Definitions;\n}): ProjectionContext<State, Definitions> {\n const q = createStateQueries(options.domainState, options.definitions);\n return {\n domainState: options.domainState,\n q,\n };\n}\n","import type { RuntimeTableRecord } from \"../../model\";\nimport {\n createSeatDisclosure,\n type SeatDisclosure,\n} from \"./tile-disclosure.js\";\nimport { projectSeatDescriptor } from \"./seat-interactions.js\";\nimport type { ProjectedTile } from \"../../../shared/seat-topology-schema.js\";\nimport { BoardProjectionSchema } from \"../../../shared/seat-topology-schema.js\";\nimport type { GameEvent } from \"../../../shared/domain/results.js\";\nimport type { ViewCard } from \"../../../shared/domain/cards.js\";\nimport { createTableQueries } from \"../../table-queries\";\nimport type { RuntimeJson } from \"../../../shared/runtime-json\";\nimport {\n canonicalizePluginRuntimeJson as toCanonicalJson,\n encodeCanonicalPluginRuntimeJson as canonicalJson,\n digestPluginRuntimeJson as hashJson,\n} from \"../../../shared/protocol/json\";\nimport type * as Wire from \"../../../shared/runtime-types\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\n} from \"../../model\";\nimport type {\n InteractionDescriptorShape,\n createInteractionResolver,\n} from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\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 \"./collector-introspection\";\nimport { concealCards, type CardConcealment } from \"./card-concealment\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n simultaneousSubmitInteraction,\n} from \"./simultaneous-player\";\n\ntype ProjectionMode = \"full\" | \"actionsOnly\";\n\nfunction projectEvents(\n events: readonly GameEvent[],\n playerId: string,\n disclosure: SeatDisclosure,\n): Wire.ProjectedGameEvent[] {\n return events.flatMap(({ audience, details, ...event }) => {\n if (audience.kind === \"seats\" && !audience.playerIds.includes(playerId))\n return [];\n const projected = (details ?? []).flatMap<Wire.ProjectedGameEventDetail>(\n (detail) => {\n if (typeof detail.value !== \"object\")\n return [{ ...detail, value: detail.value }];\n const tile = disclosure.tile(detail.value.tileId);\n return tile?.disclosure === \"visible\"\n ? [\n {\n label: detail.label,\n value: { kind: \"tile\" as const, ref: tile.ref },\n },\n ]\n : [];\n },\n );\n return [{ ...event, ...(projected.length ? { details: projected } : {}) }];\n });\n}\ntype ProjectionTimingMetadata = {\n resolveAvailableInteractionsMs: number;\n resolveViewMs: number;\n resolveZoneHandlesMs: number;\n descriptorHashMs: number;\n};\ntype DescriptorRegistry = {\n add(descriptor: InteractionDescriptorShape, actorSeat: number): string;\n entries(): Record<string, InteractionDescriptorShape>;\n};\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, View>>;\n\nexport function createProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n interactions: InteractionResolverFor<Contract, Definitions, View>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function createDescriptorRegistry(\n timing: ProjectionTimingMetadata,\n ): DescriptorRegistry {\n const byRef: Record<string, InteractionDescriptorShape> = {};\n const byHash = new Map<string, string>();\n return {\n add(descriptor, actorSeat) {\n return measureProjectionTiming(timing, \"descriptorHashMs\", () => {\n const enriched = descriptorWithBrowserReplayDigests(\n descriptor,\n actorSeat,\n );\n const fingerprint = canonicalJson(enriched);\n const existing = byHash.get(fingerprint);\n if (existing) return existing;\n const base =\n typeof enriched.interactionId === \"string\" &&\n enriched.interactionId.length > 0\n ? enriched.interactionId\n : \"interaction\";\n const ref = `${base}:${fnv1a64(fingerprint)}`;\n byHash.set(fingerprint, ref);\n byRef[ref] = enriched;\n return ref;\n });\n },\n entries() {\n return byRef;\n },\n };\n }\n\n function concealFor(\n combinedState: State,\n playerId: PlayerId,\n concealment: CardConcealment,\n disclosure: SeatDisclosure,\n descriptor: InteractionDescriptorShape,\n ) {\n return projectSeatDescriptor(\n descriptor,\n interactions.inputCollectors(\n combinedState,\n playerId,\n descriptor.interactionId,\n ),\n disclosure,\n concealment,\n );\n }\n\n function resolveZoneHandlesFor(\n combinedState: State,\n playerId: PlayerId,\n actorSeat: number,\n projection: ProjectionContext<DomainState, TrustedManifest<Contract>>,\n registry: DescriptorRegistry,\n concealment: CardConcealment,\n disclosure: SeatDisclosure,\n ) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const q = createTableQueries<RuntimeTableRecord, typeof scope.manifest>(\n combinedState.table,\n scope.manifest,\n );\n const result: Record<\n string,\n Record<\n string,\n {\n tiles: readonly ProjectedTile[];\n cardIds: string[];\n cardViewsById: Record<string, ViewCard>;\n cardBacksById: Record<string, string>;\n playableByCardId: Record<string, string[]>;\n }\n >\n > = {};\n for (const {\n zoneId,\n seatHostId,\n componentIds,\n tiles,\n } of disclosure.zones) {\n const zoneCardIds = componentIds.filter((id) =>\n Object.hasOwn(combinedState.table.cards, id),\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 cardIds: string[] = [];\n const cardViewsById: Record<string, ViewCard> = {};\n const cardBacksById: Record<string, string> = {};\n const playableByCardId: Record<string, string[]> = {};\n for (const cardId of zoneCardIds) {\n const seatCardId = concealment.seatCardId(cardId);\n cardIds.push(seatCardId);\n const card = q.card.get(cardId);\n if (!concealment.isHidden(cardId)) {\n cardViewsById[cardId] = card;\n } else if (card.backImage !== undefined) {\n cardBacksById[seatCardId] = card.backImage;\n }\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 const descriptor = concealFor(\n combinedState,\n playerId,\n concealment,\n disclosure,\n {\n ...decision.descriptor,\n zoneId,\n },\n );\n if (descriptor) perCard.push(registry.add(descriptor, actorSeat));\n }\n playableByCardId[seatCardId] = perCard;\n }\n (result[zoneId] ??= {})[seatHostId] = {\n tiles,\n cardIds,\n cardViewsById,\n cardBacksById,\n playableByCardId,\n };\n }\n return result;\n }\n\n function resolveSchedulerFlowFor(\n state: SessionState,\n projection?: ProjectionContext<DomainState, TrustedManifest<Contract>>,\n ): Wire.SchedulerFlowAuthorityProjection {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (phase.kind === \"auto\") {\n return emptySchedulerFlow();\n }\n\n if (isSimultaneousPhase(phase)) {\n const current = state.runtime.simultaneous?.current;\n const actors = orderKnownPlayerIds(\n combinedState,\n current?.phaseName === phaseName\n ? current.actors.map(String)\n : resolveSimultaneousActors(\n scope,\n combinedState,\n phase,\n projection,\n ).map(String),\n );\n const submissions =\n current?.phaseName === phaseName ? current.submissions : {};\n const sealedPlayerIds = actors.filter(\n (playerId) =>\n submissions[playerId as keyof typeof submissions] !== undefined,\n );\n const pendingPlayerIds = actors.filter(\n (playerId) =>\n submissions[playerId as keyof typeof submissions] === undefined,\n );\n const activePlayerIds =\n (phase as { canResubmit?: boolean }).canResubmit === true\n ? actors\n : pendingPlayerIds;\n return {\n version: 1,\n activePlayerIds,\n pendingPlayerIds,\n continuationDependencies: sealedPlayerIds.flatMap((waiterPlayerId) => {\n const blockerPlayerIds = pendingPlayerIds.filter(\n (playerId) => playerId !== waiterPlayerId,\n );\n return blockerPlayerIds.length > 0\n ? [{ waiterPlayerId, blockerPlayerIds }]\n : [];\n }),\n };\n }\n\n const activePlayerIds = new Set<string>();\n const pendingPlayerIds = new Set<string>();\n let sawScheduledInteraction = false;\n for (const [, interaction] of scope.interactionEntriesForPhase(phaseName)) {\n sawScheduledInteraction = true;\n const actorAuthorization =\n interactions.resolveInteractionActorAuthorization(\n combinedState,\n interaction,\n projection,\n );\n if (actorAuthorization.mode === \"actors\") {\n for (const playerId of actorAuthorization.actors) {\n activePlayerIds.add(String(playerId));\n if (interaction.actor) {\n pendingPlayerIds.add(String(playerId));\n }\n }\n continue;\n }\n const active = combinedState.flow.activePlayers;\n for (const playerId of active.length > 0\n ? active\n : combinedState.table.playerOrder) {\n activePlayerIds.add(String(playerId));\n }\n }\n\n if (!sawScheduledInteraction) {\n for (const playerId of combinedState.flow.activePlayers) {\n activePlayerIds.add(String(playerId));\n }\n }\n\n const orderedActivePlayerIds = orderKnownPlayerIds(\n combinedState,\n activePlayerIds,\n );\n const orderedPendingPlayerIds = orderKnownPlayerIds(\n combinedState,\n pendingPlayerIds,\n );\n const continuationDependencies = orderKnownPlayerIds(\n combinedState,\n combinedState.flow.activePlayers,\n ).flatMap((waiterPlayerId) => {\n const blockerPlayerIds = orderedPendingPlayerIds.filter(\n (playerId) => playerId !== waiterPlayerId,\n );\n return blockerPlayerIds.length > 0\n ? [{ waiterPlayerId, blockerPlayerIds }]\n : [];\n });\n return {\n version: 1,\n activePlayerIds: orderedActivePlayerIds,\n pendingPlayerIds: orderedPendingPlayerIds,\n continuationDependencies,\n };\n }\n\n function emptySchedulerFlow(): Wire.SchedulerFlowAuthorityProjection {\n return {\n version: 1,\n activePlayerIds: [],\n pendingPlayerIds: [],\n continuationDependencies: [],\n };\n }\n\n function orderKnownPlayerIds(\n state: State,\n playerIds: Iterable<string>,\n ): string[] {\n const selected = new Set([...playerIds].map(String));\n return state.table.playerOrder\n .map(String)\n .filter((playerId) => selected.has(playerId));\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 /** Every player's public balances plus the seat's own owner-only ones. */\n function resolveResourcesFor(\n combinedState: State,\n playerId: PlayerId,\n ): Record<string, Record<string, number>> {\n const ownerOnly = new Set<string>(\n scope.manifest.literals.ownerResourceIds ?? [],\n );\n const balances = combinedState.table.resources as Record<\n string,\n Record<string, number>\n >;\n return Object.fromEntries(\n Object.entries(balances).map(([holder, resources]) => [\n holder,\n holder === playerId\n ? { ...resources }\n : Object.fromEntries(\n Object.entries(resources).filter(([id]) => !ownerOnly.has(id)),\n ),\n ]),\n );\n }\n\n function resolvePlayerViewFor(\n combinedState: State,\n playerId: PlayerId,\n projection: ProjectionContext<DomainState, TrustedManifest<Contract>>,\n disclosure: SeatDisclosure,\n ): unknown {\n const view = scope.definition.view;\n // eslint-disable-next-line no-restricted-syntax -- Context, projected state, queries, and player all come from the same Contract bound to this view callback.\n const viewArgs = {\n ...scope.buildContext(combinedState),\n q: projection.q,\n state: projection.domainState,\n playerId,\n references: {\n tile: (id: string) => {\n const tile = disclosure.tile(id);\n return tile?.disclosure === \"visible\" ? tile.ref : null;\n },\n space: (boardId: string, spaceId: string) =>\n disclosure.boardTarget(\"space\", boardId, spaceId),\n },\n } as unknown as Parameters<typeof view>[0];\n return view(viewArgs);\n }\n\n function project({\n state,\n playerIds,\n projectionMode = \"full\",\n referenceBasis,\n }: {\n state: SessionState;\n playerIds: PlayerId[];\n projectionMode?: ProjectionMode;\n referenceBasis: Wire.ReferenceBasis;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext<\n DomainState,\n TrustedManifest<Contract>\n >({\n domainState: scope.toDomainState(combinedState),\n definitions: scope.manifest,\n });\n const timing = createProjectionTimingMetadata();\n const registry = createDescriptorRegistry(timing);\n type SeatProjection = {\n events: Wire.ProjectedGameEvent[];\n view?: ReturnType<typeof resolvePlayerViewFor>;\n boards?: Wire.SeatProjection[\"boards\"];\n availableInteractionRefs: string[];\n zones?: ReturnType<typeof resolveZoneHandlesFor>;\n resources?: ReturnType<typeof resolveResourcesFor>;\n };\n const seats: Record<string, SeatProjection> = {};\n for (const [actorSeat, playerId] of playerIds.entries()) {\n const disclosure = createSeatDisclosure(\n combinedState.table,\n scope.manifest,\n playerId,\n referenceBasis,\n );\n const concealment = concealCards(\n combinedState.table,\n playerId,\n disclosure,\n );\n const availableInteractions = measureProjectionTiming(\n timing,\n \"resolveAvailableInteractionsMs\",\n () =>\n interactions.resolveAvailableInteractionsFor(\n combinedState,\n playerId,\n {\n projection,\n },\n ),\n );\n const availableInteractionRefs = availableInteractions.flatMap(\n (descriptor) => {\n const projected = concealFor(\n combinedState,\n playerId,\n concealment,\n disclosure,\n descriptor,\n );\n return projected ? [registry.add(projected, actorSeat)] : [];\n },\n );\n const fullProjection =\n projectionMode === \"full\"\n ? {\n boards: BoardProjectionSchema.parse(disclosure.boards),\n view: measureProjectionTiming(timing, \"resolveViewMs\", () =>\n resolvePlayerViewFor(\n combinedState,\n playerId,\n projection,\n disclosure,\n ),\n ),\n zones: measureProjectionTiming(\n timing,\n \"resolveZoneHandlesMs\",\n () =>\n resolveZoneHandlesFor(\n combinedState,\n playerId,\n actorSeat,\n projection,\n registry,\n concealment,\n disclosure,\n ),\n ),\n resources: resolveResourcesFor(combinedState, playerId),\n }\n : {};\n seats[playerId] = {\n events: projectEvents(state.runtime.events, playerId, disclosure),\n ...fullProjection,\n availableInteractionRefs,\n };\n }\n return withProjectionTiming(\n {\n referenceBasis,\n simultaneousPhase: resolveSimultaneousPhaseFor(state),\n schedulerFlow: resolveSchedulerFlowFor(state, projection),\n interactionsByRef: registry.entries(),\n seats,\n },\n timing,\n );\n }\n\n return {\n project,\n resolveSchedulerFlowFor,\n resolvePlayerViewFor,\n resolveZoneHandlesFor,\n };\n}\n\nfunction createProjectionTimingMetadata(): ProjectionTimingMetadata {\n return {\n resolveAvailableInteractionsMs: 0,\n resolveViewMs: 0,\n resolveZoneHandlesMs: 0,\n descriptorHashMs: 0,\n };\n}\n\nfunction measureProjectionTiming<T>(\n timing: ProjectionTimingMetadata,\n field: keyof ProjectionTimingMetadata,\n block: () => T,\n): T {\n const startedAt = performance.now();\n try {\n return block();\n } finally {\n timing[field] += performance.now() - startedAt;\n }\n}\n\nfunction withProjectionTiming<T extends object>(\n projection: T,\n timing: ProjectionTimingMetadata,\n): T & { timing: ProjectionTimingMetadata } {\n Object.defineProperty(projection, \"timing\", {\n value: timing,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return projection as T & { timing: ProjectionTimingMetadata };\n}\n\nfunction descriptorWithBrowserReplayDigests(\n descriptor: InteractionDescriptorShape,\n actorSeat: number,\n): InteractionDescriptorShape {\n const descriptorDigestValue =\n descriptor.descriptorDigest ?? interactionDescriptorDigest(descriptor);\n return {\n ...descriptor,\n descriptorDigest: descriptorDigestValue,\n actorSeat,\n draftDigest:\n descriptor.draftDigest ??\n interactionDraftDigest({\n actorSeat,\n descriptor,\n descriptorDigest: descriptorDigestValue,\n }),\n };\n}\n\nfunction interactionDescriptorDigest(\n descriptor: InteractionDescriptorShape,\n): string {\n return hashJson({\n commitMode: descriptor.commit.mode,\n defaults: toDescriptorDigestJson(defaultsForDescriptor(descriptor)),\n inputKeys: descriptor.inputs.map((input) => input.key),\n inputs: descriptor.inputs.map((input) => ({\n key: input.key,\n kind: input.kind,\n domain: toDescriptorDigestJson(input.domain),\n defaultValue:\n input.defaultValue === undefined\n ? null\n : toDescriptorDigestJson(input.defaultValue),\n })),\n interactionId: descriptor.interactionId,\n interactionKey: descriptor.interactionKey,\n stableIdentity: `${descriptor.interactionKey}:${descriptor.interactionId}`,\n });\n}\n\nfunction interactionDraftDigest({\n actorSeat,\n descriptor,\n descriptorDigest,\n}: {\n actorSeat: number;\n descriptor: InteractionDescriptorShape;\n descriptorDigest: string;\n}): string {\n return hashJson({\n digestVersion: \"interaction-draft@2\",\n actorSeat,\n descriptorDigest,\n emitted: false,\n interactionId: descriptor.interactionId,\n interactionKey: descriptor.interactionKey,\n values: defaultsForDescriptor(descriptor),\n });\n}\n\nfunction toDescriptorDigestJson(value: unknown): RuntimeJson {\n const canonical = toCanonicalJson(value);\n return normalizeOrderInsensitiveDescriptorFields(canonical);\n}\n\nfunction normalizeOrderInsensitiveDescriptorFields(\n value: RuntimeJson,\n): RuntimeJson {\n if (Array.isArray(value)) {\n return value.map(normalizeOrderInsensitiveDescriptorFields);\n }\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => {\n const normalized = normalizeOrderInsensitiveDescriptorFields(item);\n if (key === \"eligibleTargets\" && Array.isArray(normalized)) {\n return [\n key,\n [...normalized].sort((left, right) =>\n compareCanonicalJson(canonicalJson(left), canonicalJson(right)),\n ),\n ];\n }\n return [key, normalized];\n }),\n );\n}\n\nfunction defaultsForDescriptor(\n descriptor: InteractionDescriptorShape,\n): Record<string, RuntimeJson> {\n return Object.fromEntries(\n descriptor.inputs.flatMap((input) =>\n input.defaultValue === undefined\n ? []\n : [[input.key, toCanonicalJson(input.defaultValue)]],\n ),\n );\n}\n\nfunction compareCanonicalJson(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\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 * as Wire from \"../../shared/runtime-types\";\nimport { REDUCER_CONTRACT_VERSION } from \"../../shared/worker-contract\";\nimport type { GameEvent, GameOutcome } from \"../../shared/domain/results\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ReducerReject,\n ViewOfContract,\n} from \"../model\";\nimport type { DispatchTraceEntry } from \"../core/types\";\nimport type { UntrustedReducerSessionState } from \"../ingress/types\";\nimport { createIngressRuntimeCodec } from \"../ingress/session-codec\";\nimport { summarizeDispatchTrace } from \"../diagnostics\";\nimport type { ReducerBundle, ReducerBundleOptions } from \"./types\";\nimport {\n createTrustedRuntimeScope,\n type TrustedInput,\n type TrustedSessionState,\n} from \"./trusted/runtime-scope\";\nimport { createInteractionResolver } from \"./trusted/interaction-resolver\";\nimport { createLifecycleRunner } from \"./trusted/lifecycle-runner\";\nimport { createReducerExecutor } from \"./trusted/reducer-executor\";\nimport { createProjectionBuilder } from \"./trusted/projection-builder\";\n\nfunction wireOutcome(outcome: GameOutcome): Wire.GameOutcome {\n return {\n reason: outcome.reason,\n standings: outcome.standings.map(\n ({ scoreBreakdown, tieBreaks, ...standing }) => ({\n ...standing,\n ...(scoreBreakdown ? { scoreBreakdown: [...scoreBreakdown] } : {}),\n ...(tieBreaks ? { tieBreaks: [...tieBreaks] } : {}),\n }),\n ),\n };\n}\nfunction wireEvents(events: readonly GameEvent[]): Wire.GameEvent[] {\n return events.map(({ details, ...event }) => ({\n ...event,\n ...(details ? { details: [...details] } : {}),\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 terminal?: GameOutcome<PlayerId>;\n events?: readonly GameEvent[];\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 trace: Wire.DispatchTrace[] = [];\n for (const entry of result.trace) {\n switch (entry.type) {\n case \"acceptedClientInput\":\n trace.push({\n kind: \"acceptedClientInput\",\n input: entry.input as Wire.GameInput,\n });\n break;\n case \"phaseEntered\":\n trace.push({\n kind: \"phaseEntered\",\n from: String(entry.from),\n to: String(entry.to),\n });\n break;\n case \"rngConsumption\":\n trace.push({\n kind: \"rngConsumption\",\n version: entry.version,\n operation: entry.operation,\n drawIndex: entry.drawIndex,\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 ...(result.terminal ? { terminal: wireOutcome(result.terminal) } : {}),\n trace,\n events: wireEvents(result.events ?? []),\n };\n}\n\n/** The single validated production execution and projection boundary. */\nexport function createReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n options: ReducerBundleOptions = {},\n): ReducerBundle {\n const codec = createIngressRuntimeCodec(definition);\n // The codec validates the authored schemas; its erased phase return type\n // cannot express the contract-specific phase-state mapping.\n const parseState = (state: Wire.ReducerSessionState) =>\n // eslint-disable-next-line no-restricted-syntax -- This codec parses the same Contract schemas and current phase before the trusted runtime receives its session state.\n codec.parseState(state) as unknown as TrustedSessionState<Contract>;\n const parseInput = (input: Wire.GameInput) =>\n codec.parseInput(input) as TrustedInput<Contract>;\n const scope = createTrustedRuntimeScope(definition, {\n diagnostics:\n typeof options.diagnostics === \"object\" ? options.diagnostics : undefined,\n });\n const interactions = createInteractionResolver(scope, {\n diagnostics:\n options.descriptorDiagnostics ??\n (options.diagnostics === \"verbose\" ? \"verbose\" : undefined),\n });\n const lifecycle = createLifecycleRunner(scope);\n const executor = createReducerExecutor(scope, interactions, lifecycle);\n const projection = createProjectionBuilder(scope, interactions);\n let submissionCounter = 0;\n return {\n reducerContractVersion: REDUCER_CONTRACT_VERSION,\n async initialize({ table, playerIds, rngSeed, options }) {\n const parsed = codec.parseInitialTable(table, playerIds);\n const result = lifecycle.initializeSession(\n { ...parsed, rngSeed, options: codec.parseInitialOptions(options) },\n executor.complete,\n );\n return {\n state: codec.serializeState(result.state),\n ...(result.terminal ? { terminal: wireOutcome(result.terminal) } : {}),\n events: wireEvents(result.events),\n };\n },\n async dispatch({ state, input: rawInput, referenceBasis }) {\n const input = parseInput(rawInput);\n if (!codec.isStatePlayer(state, input.playerId))\n return {\n kind: \"reject\",\n errorCode: \"NOT_YOUR_TURN\",\n message: \"Player is not seated in this session.\",\n };\n const combinedState = scope.toCombinedState(parseState(state));\n const submissionId = `sub-${++submissionCounter}`;\n scope.diagnostics.event({\n type: \"submitReceived\",\n submissionId,\n playerId: input.playerId,\n interactionId: input.interactionId,\n phase: String(combinedState.flow.currentPhase),\n });\n const result = executor.dispatch(combinedState, input, referenceBasis);\n if (result.type === \"reject\") {\n scope.diagnostics.event({\n type: \"submitRejected\",\n submissionId,\n errorCode: result.errorCode,\n ...(result.message ? { message: result.message } : {}),\n });\n } else {\n scope.diagnostics.event({\n type: \"submitAccepted\",\n submissionId,\n trace: summarizeDispatchTrace(result.trace),\n });\n const from = combinedState.flow.currentPhase;\n const to = result.state.flow.currentPhase;\n if (String(from) !== String(to))\n scope.diagnostics.event({\n type: \"phaseTransition\",\n from: String(from),\n to: String(to),\n reason: \"effect\",\n });\n }\n return toWireDispatchResult(result, (next) =>\n codec.serializeState(scope.toSessionState(next)),\n );\n },\n project({ state, playerIds, referenceBasis }) {\n const perspectives = codec.parseStatePerspectives(state, playerIds);\n // eslint-disable-next-line no-restricted-syntax -- This game-bound projector assembles the seat bundle from parsed session and player IDs; the wire facade erases its generic view type.\n return projection.project({\n state: scope.toSessionState(\n executor.reconcilePending(\n scope.toCombinedState(parseState(state)),\n referenceBasis,\n ),\n ),\n playerIds: perspectives,\n referenceBasis,\n }) as unknown as Wire.SeatProjectionBundle;\n },\n };\n}\n"],"mappings":"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","names":["z","z","definition","id","id","id","id","edge","vertex","id","space","id","id","id","id","id","z","z","z","z","id","z","id","toDomainState","toDomainState","toCombinedState","toSessionState","id","buildContext","buildRuntimeArgs","options","record","z","id","id","visible","descriptorDecision","options","topologyOf","id","denied","id","denied","id","zone","id","pendingPlayerIds","activePlayerIds","options"]}
|