@dreamboard-games/sdk 0.4.0-alpha.7 → 0.4.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/REFERENCE.md +153 -51
  2. package/dist/authoring/index.js +2 -2
  3. package/dist/{chunk-52DH7VQF.js → chunk-2TAKLJJD.js} +5 -2
  4. package/dist/{chunk-52DH7VQF.js.map → chunk-2TAKLJJD.js.map} +1 -1
  5. package/dist/{chunk-TGMXBRKY.js → chunk-3BLN5POZ.js} +5 -3
  6. package/dist/chunk-3BLN5POZ.js.map +1 -0
  7. package/dist/{chunk-RKGJ64UN.js → chunk-44N3T2A5.js} +2 -2
  8. package/dist/{chunk-IU6KGPY7.js → chunk-5CQIJHGF.js} +6 -2
  9. package/dist/{chunk-IU6KGPY7.js.map → chunk-5CQIJHGF.js.map} +1 -1
  10. package/dist/{chunk-5IHU5CUK.js → chunk-IYX5OO2K.js} +12 -22
  11. package/dist/chunk-IYX5OO2K.js.map +1 -0
  12. package/dist/{chunk-Q322XCY2.js → chunk-VTK4TIXC.js} +3 -3
  13. package/dist/{chunk-KYEWGZ2Y.js → chunk-VTNEWMWJ.js} +2 -2
  14. package/dist/{chunk-KYEWGZ2Y.js.map → chunk-VTNEWMWJ.js.map} +1 -1
  15. package/dist/{chunk-3QIZKXJ2.js → chunk-XV27IQHA.js} +3 -3
  16. package/dist/{chunk-NO537WSS.js → chunk-YGQTL63W.js} +2 -2
  17. package/dist/{chunk-VLG4YST5.js → chunk-ZYONCTZ2.js} +2 -2
  18. package/dist/codegen.js +1 -1
  19. package/dist/{index.d-DMASeF6M.d.ts → index.d-C0PKOVbh.d.ts} +25 -4
  20. package/dist/index.js +2 -2
  21. package/dist/package-set.d.ts +2 -2
  22. package/dist/package-set.js +2 -2
  23. package/dist/{protocol-835hEGne.d.ts → protocol-nS2ojsGr.d.ts} +5 -0
  24. package/dist/reducer/advanced.d.ts +2 -2
  25. package/dist/reducer-contract.d.ts +1 -1
  26. package/dist/reducer-contract.js +2 -2
  27. package/dist/reducer.d.ts +23 -20
  28. package/dist/reducer.js +131 -84
  29. package/dist/reducer.js.map +1 -1
  30. package/dist/runtime/primitives.js +3 -3
  31. package/dist/runtime/workspace-contract.js +4 -4
  32. package/dist/runtime.d.ts +3 -3
  33. package/dist/runtime.js +9 -9
  34. package/dist/testing-runtime.d.ts +2 -2
  35. package/dist/testing-runtime.js +2 -2
  36. package/dist/testing.d.ts +5 -5
  37. package/dist/testing.js +4 -4
  38. package/dist/{types-DcADVHe9.d.ts → types-B_3pObUV.d.ts} +1 -1
  39. package/dist/{types-aI4V9CWe.d.ts → types-CTeN_QAk.d.ts} +1 -1
  40. package/dist/types.d.ts +4 -0
  41. package/dist/{views-32rSsfeU.d.ts → views-Qx-EHBP8.d.ts} +27 -10
  42. package/package.json +1 -2
  43. package/dist/chunk-5IHU5CUK.js.map +0 -1
  44. package/dist/chunk-TGMXBRKY.js.map +0 -1
  45. /package/dist/{chunk-RKGJ64UN.js.map → chunk-44N3T2A5.js.map} +0 -0
  46. /package/dist/{chunk-Q322XCY2.js.map → chunk-VTK4TIXC.js.map} +0 -0
  47. /package/dist/{chunk-3QIZKXJ2.js.map → chunk-XV27IQHA.js.map} +0 -0
  48. /package/dist/{chunk-NO537WSS.js.map → chunk-YGQTL63W.js.map} +0 -0
  49. /package/dist/{chunk-VLG4YST5.js.map → chunk-ZYONCTZ2.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/reducer/schema-helpers.ts","../src/reducer/authoring/validation.ts","../src/reducer/authoring/contract.ts","../src/reducer/inputs/formInput.ts","../src/reducer/inputs/defineInputs.ts","../src/reducer/inputs/boardInput.ts","../src/reducer/inputs/boardTarget.ts","../src/reducer/inputs/choiceTarget.ts","../src/reducer/inputs/promptInput.ts","../src/reducer/inputs/rngInput.ts","../src/reducer/inputs/many.ts","../src/reducer/authoring/game.ts","../src/reducer/authoring/interaction.ts","../src/reducer/authoring/phase.ts","../src/reducer/authoring/view-stage.ts","../src/reducer/authoring/contract-authoring.ts","../src/reducer/authoring/effect.ts","../src/reducer/game-event.ts","../src/reducer/diagnostics.ts","../src/reducer/engine/runtime-instruction-engine.ts","../src/reducer/bundle/trusted/rng-sampler.ts","../src/reducer/bundle/trusted/engine-instruction-resolver.ts","../src/reducer/bundle/trusted/flow-instruction-resolver.ts","../src/reducer/bundle/trusted/simultaneous-player.ts","../src/reducer/ops.ts","../src/reducer/table-queries.ts","../src/reducer/transaction.ts","../src/reducer/bundle/trusted/runtime-registry.ts","../src/reducer/derived.ts","../src/reducer/effects.ts","../src/reducer/bundle/trusted/trusted-runtime-args.ts","../src/reducer/bundle/trusted/trusted-runtime-result.ts","../src/reducer/bundle/trusted/trusted-state-codec.ts","../src/reducer/bundle/trusted/trusted-setup-profiles.ts","../src/reducer/bundle/trusted/runtime-scope.ts","../src/reducer/bundle/trusted/instruction-runner.ts","../src/reducer/bundle/trusted/collector-introspection.ts","../src/reducer/bundle/trusted/collector-eligibility.ts","../src/reducer/parse-utils.ts","../src/reducer/bundle/trusted/interaction-types.ts","../src/reducer/bundle/trusted/collector-params.ts","../src/reducer/bundle/trusted/interaction-authorization.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/stage-resolver.ts","../src/reducer/bundle/trusted/interaction-resolver.ts","../src/reducer/bundle/trusted/lifecycle-runner.ts","../src/reducer/bundle/trusted/projection-context.ts","../src/reducer/bundle/trusted/projection-builder.ts","../src/reducer/bundle/trusted/static-projection.ts","../src/reducer/bundle/trusted-bundle.ts","../src/reducer/ingress/session-codec.ts","../src/reducer/ingress/runtime-payload.ts","../src/reducer/contract-fingerprint.ts","../src/reducer/ingress/input-codec.ts","../src/reducer/ingress/phase-schemas.ts","../src/reducer/bundle/ingress-bundle.ts","../src/reducer/compose.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { SchemaLike } from \"./model\";\n\nexport type SparseMap<Key extends string, Value> = Partial<Record<Key, Value>>;\nexport type SparseCounts<Key extends string> = SparseMap<Key, number>;\n\ntype SparseSchemaMetadata = {\n keySchema: z.ZodType<string>;\n valueSchema: z.ZodTypeAny;\n};\n\nconst sparseSchemas = new WeakMap<object, SparseSchemaMetadata>();\n\nexport function sparseMap<\n KeySchema extends z.ZodType<string>,\n ValueSchema extends z.ZodTypeAny,\n>(\n keySchema: KeySchema,\n valueSchema: ValueSchema,\n): z.ZodType<SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>> {\n const schema = z.partialRecord(keySchema, valueSchema) as z.ZodType<\n SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>\n >;\n sparseSchemas.set(schema as unknown as object, {\n keySchema,\n valueSchema,\n });\n return schema;\n}\n\nexport function sparseCounts<KeySchema extends z.ZodType<string>>(\n keySchema: KeySchema,\n): z.ZodType<SparseCounts<z.infer<KeySchema>>> {\n return sparseMap(keySchema, z.number().int().min(0)) as z.ZodType<\n SparseCounts<z.infer<KeySchema>>\n >;\n}\n\nexport function getZodDef(schema: unknown): {\n type?: string;\n} & Record<string, unknown> {\n const anySchema = schema as {\n _zod?: { def?: Record<string, unknown> };\n def?: Record<string, unknown>;\n };\n const fromInternal = anySchema?._zod?.def;\n if (fromInternal && typeof fromInternal === \"object\") {\n return fromInternal;\n }\n const fromLegacy = anySchema?.def;\n if (fromLegacy && typeof fromLegacy === \"object\") {\n return fromLegacy;\n }\n return {};\n}\n\nexport function unwrapWrappers(schema: unknown): unknown {\n let current = schema;\n while (true) {\n const def = getZodDef(current);\n const innerType = def.innerType;\n if (\n (def.type === \"nullable\" ||\n def.type === \"optional\" ||\n def.type === \"default\" ||\n def.type === \"readonly\" ||\n def.type === \"catch\") &&\n innerType\n ) {\n current = innerType;\n continue;\n }\n return current;\n }\n}\n\nexport function isPlainZodString(schema: unknown): boolean {\n return getZodDef(schema).type === \"string\";\n}\n\nexport function isZodArray(schema: unknown): boolean {\n return getZodDef(schema).type === \"array\";\n}\n\nexport function isEnumKeyedRecordSchema(schema: unknown): boolean {\n const def = getZodDef(schema);\n const keyType = def.keyType;\n return (\n def.type === \"record\" &&\n typeof keyType === \"object\" &&\n keyType !== null &&\n getZodDef(keyType).type === \"enum\"\n );\n}\n\nexport function isSparseMapSchema(schema: unknown): boolean {\n const inner = unwrapWrappers(schema);\n return (\n typeof inner === \"object\" &&\n inner !== null &&\n sparseSchemas.has(inner as object)\n );\n}\n\nfunction getSparseSchemaMetadata(\n schema: unknown,\n): SparseSchemaMetadata | undefined {\n const inner = unwrapWrappers(schema);\n if (typeof inner !== \"object\" || inner === null) {\n return undefined;\n }\n return sparseSchemas.get(inner as object);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getObjectShape(\n schema: unknown,\n): Record<string, unknown> | null {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return null;\n }\n const shape = def.shape;\n if (typeof shape === \"function\") {\n const resolved = shape();\n return resolved && typeof resolved === \"object\"\n ? (resolved as Record<string, unknown>)\n : null;\n }\n return shape && typeof shape === \"object\"\n ? (shape as Record<string, unknown>)\n : null;\n}\n\nfunction normalizeSchemaInput(schema: unknown, input: unknown): unknown {\n const inner = unwrapWrappers(schema);\n const sparse = getSparseSchemaMetadata(inner);\n if (sparse && isPlainObject(input)) {\n const filtered = Object.fromEntries(\n Object.entries(input)\n .filter(\n ([key, value]) =>\n typeof value !== \"undefined\" &&\n sparse.keySchema.safeParse(key).success,\n )\n .map(([key, value]) => [\n key,\n normalizeSchemaInput(sparse.valueSchema, value),\n ]),\n );\n return filtered;\n }\n\n const shape = getObjectShape(inner);\n if (shape && isPlainObject(input)) {\n return Object.fromEntries(\n Object.entries(input).map(([key, value]) => {\n const fieldSchema = shape[key];\n return [\n key,\n typeof fieldSchema === \"undefined\"\n ? value\n : normalizeSchemaInput(fieldSchema, value),\n ];\n }),\n );\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && Array.isArray(input) && def.element) {\n return input.map((value) => normalizeSchemaInput(def.element, value));\n }\n\n return input;\n}\n\nexport function normalizeCommandParams<Output>(\n schema: SchemaLike<Output>,\n input: unknown,\n): Output {\n return schema.parse(normalizeSchemaInput(schema, input));\n}\n","import {\n isManifestScopedSchema,\n type ManifestContract,\n type RuntimeTableRecord,\n type SchemaLike,\n} from \"../model\";\nimport type { InputCollector } from \"../model\";\nimport {\n getObjectShape,\n getZodDef,\n isEnumKeyedRecordSchema,\n isPlainZodString,\n isSparseMapSchema,\n isZodArray,\n unwrapWrappers,\n} from \"../schema-helpers\";\nimport type { AnyReducerGameContract } from \"./types\";\n\n/**\n * Canonical set of manifest-scoped id field names. `defineGameContract`\n * uses this list to reject state schemas that describe one of these fields\n * with a raw `z.string()` instead of the corresponding branded enum from\n * `manifest.ids.*` (or `gameContract.schemas.*`).\n *\n * The rule of thumb is \"one way to do things\": if a field *is* a player id,\n * card id, zone id, etc. in the manifest, the authored state schema must\n * reuse the same literal/branded schema so generated types line up with the\n * runtime checks, instead of silently widening to `string`.\n */\nconst MANIFEST_SCOPED_ID_NAMES = [\n \"playerId\",\n \"cardId\",\n \"deckId\",\n \"handId\",\n \"zoneId\",\n \"sharedZoneId\",\n \"playerZoneId\",\n \"boardId\",\n \"boardContainerId\",\n \"boardTypeId\",\n \"boardBaseId\",\n \"edgeId\",\n \"edgeTypeId\",\n \"vertexId\",\n \"vertexTypeId\",\n \"spaceId\",\n \"spaceTypeId\",\n \"relationTypeId\",\n \"resourceId\",\n \"pieceId\",\n \"pieceTypeId\",\n \"dieId\",\n \"dieTypeId\",\n \"setupOptionId\",\n \"setupProfileId\",\n \"cardSetId\",\n \"cardType\",\n] as const;\n\ntype ManifestScopedIdName = (typeof MANIFEST_SCOPED_ID_NAMES)[number];\n\nfunction matchManifestScopedIdName(\n key: string,\n): { name: ManifestScopedIdName; kind: \"singular\" | \"plural\" } | null {\n for (const name of MANIFEST_SCOPED_ID_NAMES) {\n const capitalized = `${name.charAt(0).toUpperCase()}${name.slice(1)}`;\n if (key === name || key.endsWith(capitalized)) {\n return { name, kind: \"singular\" };\n }\n const plural = `${name}s`;\n const capitalizedPlural = `${capitalized}s`;\n if (key === plural || key.endsWith(capitalizedPlural)) {\n return { name, kind: \"plural\" };\n }\n }\n return null;\n}\n\nexport function validateInteractionParamsSchema(\n schema: unknown,\n context: \"defineInteraction\" | \"defineCardAction\",\n path: string,\n): void {\n const inner = unwrapWrappers(schema);\n if (isEnumKeyedRecordSchema(inner) && !isSparseMapSchema(inner)) {\n throw new Error(\n `${context}: ${path} uses an enum-keyed z.record(...), which parses as a total map at runtime. ` +\n `Use sparseMap(...) or sparseCounts(...) from @dreamboard-games/sdk/reducer instead so interaction params stay sparse and match runtime validation.`,\n );\n }\n\n const shape = getObjectShape(inner);\n if (shape) {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n validateInteractionParamsSchema(fieldSchema, context, `${path}.${key}`);\n }\n return;\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && def.element) {\n validateInteractionParamsSchema(def.element, context, `${path}[]`);\n return;\n }\n\n if (def.type === \"record\" && def.valueType) {\n validateInteractionParamsSchema(def.valueType, context, `${path}.*`);\n }\n}\n\nexport function validateInteractionInputsSchema(\n inputs: Record<string, InputCollector> | undefined,\n context: \"defineInteraction\" | \"defineCardAction\",\n): void {\n if (!inputs) return;\n for (const [key, collector] of Object.entries(inputs)) {\n validateInteractionParamsSchema(collector.schema, context, `inputs.${key}`);\n }\n}\n\nexport function validateManyCommitPolicy(input: {\n inputs: Record<string, InputCollector> | undefined;\n commit?: { mode: string };\n context: string;\n}): void {\n if (input.commit?.mode !== \"autoWhenReady\") return;\n if (\n Object.values(input.inputs ?? {}).some(\n (collector) => collector.selection?.mode === \"many\",\n )\n ) {\n throw new Error(\n `${input.context}: interactions with many(...) inputs must use commit: { mode: \"manual\" }.`,\n );\n }\n}\n\nexport function validateInteractionLikeDefinition(\n input: {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n context: \"defineInteraction\" | \"defineCardAction\",\n): void {\n validateInteractionInputsSchema(input.inputs, context);\n validateManyCommitPolicy({\n inputs: input.inputs,\n commit: input.commit,\n context,\n });\n if (input.paramsSchema) {\n validateInteractionParamsSchema(\n input.paramsSchema,\n context,\n \"paramsSchema\",\n );\n }\n}\n\nexport function validateStateSchemaIdBranding(\n schema: unknown,\n scope: \"public\" | \"private\" | \"hidden\",\n): void {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return;\n }\n const shape = def.shape as Record<string, unknown> | undefined;\n if (!shape) {\n return;\n }\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const match = matchManifestScopedIdName(key);\n if (!match) {\n continue;\n }\n const inner = unwrapWrappers(fieldSchema);\n if (match.kind === \"singular\") {\n if (isPlainZodString(inner) && !isManifestScopedSchema(inner)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses a raw z.string() ` +\n `but its name identifies it as a manifest-scoped '${match.name}'. ` +\n `Use gameContract.schemas.${match.name} (or manifest.ids.${match.name}) ` +\n `so the branded literal union flows through state types.`,\n );\n }\n continue;\n }\n if (match.kind === \"plural\" && isZodArray(inner)) {\n const element = unwrapWrappers(getZodDef(inner).element);\n if (isPlainZodString(element) && !isManifestScopedSchema(element)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses z.array(z.string()) ` +\n `but its name identifies it as manifest-scoped '${match.name}' values. ` +\n `Use z.array(gameContract.schemas.${match.name}) ` +\n `(or manifest.ids.${match.name}) so the branded literal union flows through state types.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGamePhaseNames(definition: {\n contract: AnyReducerGameContract;\n phases: Record<string, unknown>;\n initialPhase?: string;\n setupProfiles?: Record<string, { initialPhase?: string }>;\n}): void {\n const contractPhaseNames = (\n definition.contract as AnyReducerGameContract & {\n phaseNames?: readonly string[];\n }\n ).phaseNames;\n if (!Array.isArray(contractPhaseNames)) {\n return;\n }\n const declared = new Set(contractPhaseNames);\n const actual = new Set(Object.keys(definition.phases));\n const missing = [...declared].filter((name) => !actual.has(name));\n const extra = [...actual].filter((name) => !declared.has(name));\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = [];\n if (missing.length > 0) {\n parts.push(`missing: [${missing.join(\", \")}]`);\n }\n if (extra.length > 0) {\n parts.push(`extra: [${extra.join(\", \")}]`);\n }\n throw new Error(\n `defineGame: phases record does not match contract.phaseNames (${parts.join(\n \"; \",\n )}). Update contract.phaseNames or the phases record so they agree.`,\n );\n }\n if (\n definition.initialPhase !== undefined &&\n !declared.has(definition.initialPhase)\n ) {\n throw new Error(\n `defineGame: initialPhase '${definition.initialPhase}' is not declared in contract.phaseNames.`,\n );\n }\n if (definition.setupProfiles) {\n for (const [profileId, profile] of Object.entries(\n definition.setupProfiles,\n )) {\n const initial = profile?.initialPhase;\n if (initial !== undefined && !declared.has(initial)) {\n throw new Error(\n `defineGame: setupProfiles.${profileId}.initialPhase '${initial}' is not declared in contract.phaseNames.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGameZoneWiring(definition: {\n contract: {\n manifest: ManifestContract<RuntimeTableRecord>;\n };\n phases: Record<string, unknown>;\n}): void {\n const manifestPlayerZoneIds = new Set(\n definition.contract.manifest.literals.playerZoneIds ?? [],\n );\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n zones?: Record<string, unknown>;\n cardActions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord) continue;\n\n if (phaseRecord.zones !== undefined && !Array.isArray(phaseRecord.zones)) {\n const zonesRecord =\n typeof phaseRecord.zones === \"object\" && phaseRecord.zones !== null\n ? (phaseRecord.zones as Record<string, unknown>)\n : null;\n const hasRemovedZoneSpec =\n zonesRecord &&\n Object.values(zonesRecord).some(\n (zone) =>\n typeof zone === \"object\" &&\n zone !== null &&\n (\"cardsFrom\" in zone || \"playableVia\" in zone || \"from\" in zone),\n );\n if (hasRemovedZoneSpec) {\n throw new Error(\n `defineGame: phases.${phaseName}.zones uses removed zone spec objects. Use zones: [\"manifest-player-zone-id\"] and cardActions[*].playFrom instead.`,\n );\n }\n throw new Error(\n `defineGame: phases.${phaseName}.zones must be an array of manifest player zone ids.`,\n );\n }\n\n for (const [index, zoneId] of (phaseRecord.zones ?? []).entries()) {\n if (typeof zoneId !== \"string\") {\n throw new Error(\n `defineGame: phases.${phaseName}.zones[${index}] must be a manifest player zone id string.`,\n );\n }\n if (!manifestPlayerZoneIds.has(zoneId)) {\n throw new Error(\n `defineGame: phases.${phaseName}.zones[${index}] '${zoneId}' is not declared in manifest.literals.playerZoneIds.`,\n );\n }\n }\n\n for (const [actionId, action] of Object.entries(\n phaseRecord.cardActions ?? {},\n )) {\n const actionRecord =\n typeof action === \"object\" && action !== null\n ? (action as Record<string, unknown>)\n : null;\n const playFrom = actionRecord?.playFrom;\n if (\n typeof playFrom === \"string\" &&\n !manifestPlayerZoneIds.has(playFrom)\n ) {\n throw new Error(\n `defineGame: phases.${phaseName}.cardActions.${actionId}.playFrom '${playFrom}' is not declared in manifest.literals.playerZoneIds.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGameSimultaneousPhases(definition: {\n phases: Record<string, unknown>;\n}): void {\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n kind?: unknown;\n submit?: { inputs?: Record<string, InputCollector> };\n resolve?: unknown;\n interactions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord || phaseRecord.kind !== \"simultaneousPlayer\") {\n continue;\n }\n if (!phaseRecord.submit) {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare submit.`,\n );\n }\n if (typeof phaseRecord.resolve !== \"function\") {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare resolve.`,\n );\n }\n if (phaseRecord.interactions?.submit) {\n throw new Error(\n `defineGame: phases.${phaseName}.interactions.submit conflicts with the reserved simultaneous submit interaction id.`,\n );\n }\n validateInteractionInputsSchema(\n phaseRecord.submit.inputs,\n \"defineInteraction\",\n );\n validateManyCommitPolicy({\n inputs: phaseRecord.submit.inputs,\n commit: (phaseRecord.submit as { commit?: { mode: string } }).commit,\n context: `defineGame: phases.${phaseName}.submit`,\n });\n }\n}\n\nexport type ManifestIdSchemasOf<\n Ids extends Record<string, SchemaLike<unknown>>,\n> = {\n readonly [Key in keyof Ids]: Ids[Key] extends SchemaLike<infer Output>\n ? Ids[Key] & import(\"../model\").ManifestIdSchema<Output>\n : Ids[Key];\n};\n","import { z } from \"zod\";\nimport { createManifestStringLiteralSchema } from \"../model/manifest\";\nimport type {\n ReducerGameContract,\n ReducerManifestContract,\n RuntimeTableRecord,\n SchemaLike,\n StateDefinition,\n} from \"../model\";\nimport {\n type ManifestIdSchemasOf,\n validateStateSchemaIdBranding,\n} from \"./validation\";\n\n/**\n * Narrows a manifest's `literals.phaseNames` and `ids.phaseName` to the\n * author-supplied phase-name tuple. Lets `defineGameContract` override the\n * codegen-emitted `phaseNames: readonly string[]` / `phaseName: z.string()`\n * placeholders so `PhaseNameOfContract<Contract>` resolves to a literal\n * union and flows through `fx.transition`, `PhaseMapOf`, and the flow\n * state's `currentPhase`.\n */\ntype NarrowManifestPhaseNames<\n Manifest,\n PhaseNames extends readonly string[],\n> = Manifest & {\n literals: Manifest extends { literals: infer L }\n ? Omit<L, \"phaseNames\"> & { phaseNames: PhaseNames }\n : { phaseNames: PhaseNames };\n ids: Manifest extends { ids: infer I }\n ? Omit<I, \"phaseName\"> & { phaseName: z.ZodType<PhaseNames[number]> }\n : { phaseName: z.ZodType<PhaseNames[number]> };\n};\n\ntype ReducerGameContractInput<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n Phases extends Record<string, SchemaLike<object>>,\n Errors extends Record<string, string> | undefined = undefined,\n> = {\n manifest: Manifest;\n state: StateDefinition<PublicSchema, PrivateSchema, HiddenSchema>;\n phases: Phases;\n errors?: Errors;\n};\n\nfunction validateErrorMap(errors: Record<string, string> | undefined): void {\n if (!errors) return;\n const codePattern = /^[A-Z][A-Z0-9_]*$/;\n for (const [code, message] of Object.entries(errors)) {\n if (!codePattern.test(code)) {\n throw new Error(\n `defineGameContract: error code '${code}' must use UPPER_SNAKE_CASE.`,\n );\n }\n if (typeof message !== \"string\" || message.length === 0) {\n throw new Error(\n `defineGameContract: error code '${code}' must declare a non-empty default message.`,\n );\n }\n }\n}\n\nexport function defineGameContract<\n Table extends RuntimeTableRecord,\n const Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n const Phases extends Record<string, SchemaLike<object>>,\n const Errors extends Record<string, string> | undefined = undefined,\n>(\n definition: ReducerGameContractInput<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors\n >,\n): ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors\n> & {\n readonly phases: Phases;\n readonly errors: Errors;\n readonly phaseNames: readonly (keyof Phases & string)[];\n /**\n * Ergonomic shortcut to the manifest-backed Zod id schemas. Equivalent to\n * `definition.manifest.ids`. Prefer `gameContract.schemas.playerId` etc.\n * over re-importing the generated `ids` namespace so that every authored\n * schema is anchored to the same SDK-guided source.\n */\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n} {\n validateStateSchemaIdBranding(definition.state.public, \"public\");\n validateStateSchemaIdBranding(definition.state.private, \"private\");\n validateStateSchemaIdBranding(definition.state.hidden, \"hidden\");\n validateErrorMap(definition.errors);\n const phaseNames = Object.keys(definition.phases) as (keyof Phases &\n string)[];\n if (phaseNames.length === 0) {\n throw new Error(\n \"defineGameContract: phases must be a non-empty record of phase schemas.\",\n );\n }\n for (const name of phaseNames) {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new Error(\n \"defineGameContract: phase names must be non-empty strings.\",\n );\n }\n }\n const phaseNameSchema = createManifestStringLiteralSchema(phaseNames);\n const narrowedManifest = {\n ...definition.manifest,\n literals: {\n ...definition.manifest.literals,\n phaseNames,\n },\n ids: {\n ...definition.manifest.ids,\n phaseName: phaseNameSchema,\n },\n } as unknown as NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >;\n const contract = {\n manifest: narrowedManifest,\n state: definition.state,\n phases: definition.phases,\n errors: definition.errors,\n phaseNames,\n schemas: narrowedManifest.ids,\n } as ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors\n > & {\n readonly phases: Phases;\n readonly errors: Errors;\n readonly phaseNames: readonly (keyof Phases & string)[];\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n };\n return contract;\n}\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"../model/table\";\nimport type { ManifestIdSchema } from \"../model/manifest\";\nimport type {\n BoundedNumberDomainDescriptor,\n ChoiceDomainDescriptor,\n ChoiceListDomainDescriptor,\n CollectorState,\n InputCollector,\n ResourceMapDomainDescriptor,\n} from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport type { DerivedResolver } from \"../derived\";\nimport { isPerPlayer } from \"../per-player\";\nimport type { DependencyValues, InputFieldRef } from \"./defineInputs\";\n\ntype DomainContext<\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n derived: DerivedResolver;\n values: Values;\n};\n\ntype ManifestFormInputSchema =\n | ManifestIdSchema<unknown>\n | z.ZodOptional<ManifestIdSchema<unknown>>\n | z.ZodNullable<ManifestIdSchema<unknown>>;\n\ntype DomainNumber<State extends CollectorState> =\n | number\n | ((context: DomainContext<State>) => number);\n\ntype ResourceMapInputOptions<State extends CollectorState> = {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n};\n\ntype ChoiceValue = string | null;\n\ntype FormInputDomainDescriptor =\n | ResourceMapDomainDescriptor\n | BoundedNumberDomainDescriptor\n | ChoiceDomainDescriptor\n | ChoiceListDomainDescriptor;\n\ntype DomainChoice<Value extends ChoiceValue> = {\n value: Value;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype DomainChoicePresentation = {\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype ResourceMapChoiceDecorator<State extends CollectorState> = (\n context: DomainContext<State> & {\n resourceId: string;\n label: string;\n icon?: string;\n },\n) => DomainChoicePresentation | null | undefined;\n\ntype ResourceMapChoiceSource<State extends CollectorState> =\n | \"resourceMap\"\n | {\n source: \"resourceMap\";\n decorate?: ResourceMapChoiceDecorator<State>;\n };\n\ntype DomainChoices<Value extends ChoiceValue, State extends CollectorState> =\n | ReadonlyArray<DomainChoice<Value>>\n | ResourceMapChoiceSource<State>\n | ((context: DomainContext<State>) => ReadonlyArray<DomainChoice<Value>>);\n\ntype DependentDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n> =\n | ReadonlyArray<DomainChoice<Value>>\n | ((\n context: DomainContext<State, DependencyValues<Dependencies>>,\n ) => ReadonlyArray<DomainChoice<Value>>);\n\ntype ChoiceListDefaultValue<\n Value extends string,\n State extends CollectorState,\n> =\n | Value[]\n | \"all\"\n | ((\n context: DomainContext<State> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n ) => Value[]);\n\ntype ChoiceDefaultValue<\n Value extends ChoiceValue,\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> =\n | Value\n | ((\n context: DomainContext<State, Values> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n ) => Value);\n\ntype ChoiceDefaultResolver<\n Value extends ChoiceValue,\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = (\n context: DomainContext<State, Values> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n) => Value | undefined;\n\nfunction isResourceMapChoiceSource<State extends CollectorState>(\n choices: DomainChoices<ChoiceValue, State>,\n): choices is ResourceMapChoiceSource<State> {\n return (\n choices === \"resourceMap\" ||\n (typeof choices === \"object\" &&\n choices !== null &&\n !Array.isArray(choices) &&\n \"source\" in choices &&\n choices.source === \"resourceMap\")\n );\n}\n\nfunction resolveDomainNumber<State extends CollectorState>(\n value: DomainNumber<State> | undefined,\n context: DomainContext<State>,\n fallback: number,\n): number {\n if (typeof value === \"function\") return value(context);\n return value ?? fallback;\n}\n\nfunction resolveDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n>(\n choices: DomainChoices<Value, State>,\n context: DomainContext<State>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n if (isResourceMapChoiceSource(choices)) {\n return resolveResourceMapChoices(choices, context);\n }\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction resolveDependentDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n>(\n choices: DependentDomainChoices<Value, State, Dependencies>,\n context: DomainContext<State, DependencyValues<Dependencies>>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction choiceValuesInclude(\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n value: ChoiceValue,\n): boolean {\n return choices.some((choice) => Object.is(choice.value, value));\n}\n\nfunction assertChoiceDefaultInChoices(\n inputName: string,\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n defaultValue: ChoiceValue,\n): void {\n if (choiceValuesInclude(choices, defaultValue)) return;\n const printable = defaultValue === null ? \"null\" : `'${defaultValue}'`;\n throw new Error(\n `${inputName} defaultValue ${printable} must be one of its choices. ` +\n \"If null is a valid value, add an explicit { value: null, label: ... } choice.\",\n );\n}\n\nfunction choiceSchema<Value extends ChoiceValue>(\n choices: ReadonlyArray<DomainChoice<Value>>,\n): SchemaLike<Value> {\n const values = choices.map((choice) => choice.value);\n const stringValues = values.filter(\n (value): value is Exclude<Value, null> => value !== null,\n );\n const hasNull = values.some((value) => value === null);\n\n if (stringValues.length === 0) {\n return z.null() as unknown as SchemaLike<Value>;\n }\n\n const stringSchema = z.enum(\n stringValues as [Exclude<Value, null>, ...Array<Exclude<Value, null>>],\n );\n\n if (hasNull) {\n return z.union([stringSchema, z.null()]) as unknown as SchemaLike<Value>;\n }\n\n return stringSchema as unknown as SchemaLike<Value>;\n}\n\nfunction resolveResourceMapChoices<State extends CollectorState>(\n choices: ResourceMapChoiceSource<State>,\n context: DomainContext<State>,\n): Array<{\n value: string;\n label: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resources = context.state.table.resources as unknown;\n const firstResourceMap =\n isPerPlayer(resources) && resources.entries.length > 0\n ? resources.entries[0]?.[1]\n : resources;\n if (\n typeof firstResourceMap !== \"object\" ||\n firstResourceMap === null ||\n Array.isArray(firstResourceMap)\n ) {\n return [];\n }\n const decorate = choices === \"resourceMap\" ? undefined : choices.decorate;\n return Object.keys(firstResourceMap)\n .sort()\n .map((resourceId) => {\n const label = resourceId;\n const presentation = decorate?.({ ...context, resourceId, label });\n return {\n value: resourceId,\n label,\n badge: presentation?.badge,\n description: presentation?.description,\n disabled: presentation?.disabled,\n disabledReason: presentation?.disabledReason,\n };\n });\n}\n\nfunction createFormInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return {\n kind: \"form\",\n schema,\n ...(options && \"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n };\n}\n\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(schema: Schema): InputCollector<Schema, State, \"form\">;\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n};\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return createFormInput(schema, options);\n}\n\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State>,\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State> & {\n defaultValue: Record<string, number>;\n },\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n};\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State> & {\n defaultValue?: Record<string, number>;\n },\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.record(z.string(), z.number().int().nonnegative()),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"resourceMap\",\n resources: options.resources.map((resource) => ({\n resourceId: resource.resourceId,\n label: resource.label,\n icon: resource.icon,\n min: resolveDomainNumber(resource.min, context, 0),\n max: resolveDomainNumber(resource.max, context, 0),\n })),\n };\n },\n };\n}\n\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n}): InputCollector<z.ZodNumber, State, \"form\">;\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> & {\n readonly defaultValue: number;\n};\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue?: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.number(),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"boundedNumber\",\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, 0),\n step:\n options.step === undefined\n ? undefined\n : resolveDomainNumber(options.step, context, 1),\n };\n },\n };\n}\n\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends ChoiceValue = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends ChoiceValue = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<string, unknown>[] =\n readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<string, unknown>[] =\n readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices:\n | DomainChoices<Value, State>\n | DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n defaultValue: ChoiceDefaultValue<\n Value,\n State,\n Readonly<Record<string, unknown>>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> {\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choice requires at least one choice.\");\n }\n const staticChoices = Array.isArray(options.choices) ? options.choices : null;\n const hasStaticDefault = typeof options.defaultValue !== \"function\";\n const staticDefault = options.defaultValue as ChoiceValue;\n if (staticChoices && hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n staticChoices,\n staticDefault,\n );\n }\n const schema = staticChoices\n ? (choiceSchema(staticChoices) as SchemaLike<Value>)\n : (z.string().nullable() as unknown as SchemaLike<Value>);\n const dynamicDefault =\n typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema,\n ...(hasStaticDefault ? { defaultValue: staticDefault as Value } : {}),\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state,\n playerId,\n q,\n derived,\n values,\n ): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n };\n const choices = dependsOn\n ? resolveDependentDomainChoices(\n options.choices as DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >,\n {\n ...context,\n values: (values ?? {}) as DependencyValues<\n readonly InputFieldRef<string, unknown>[]\n >,\n },\n )\n : resolveDomainChoices(options.choices as DomainChoices<Value, State>, {\n ...context,\n values: {},\n });\n if (hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n choices,\n staticDefault,\n );\n }\n return {\n type: \"choice\",\n choices,\n };\n },\n ...(dynamicDefault\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choice\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n const resolved = dynamicDefault({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n if (resolved === undefined) return undefined;\n assertChoiceDefaultInChoices(\"formInput.choice\", choices, resolved);\n return resolved;\n },\n }\n : {}),\n };\n}\n\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n};\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\">;\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> {\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choiceList requires at least one choice.\");\n }\n const staticDefaultValue = Array.isArray(options.defaultValue)\n ? options.defaultValue\n : undefined;\n const dynamicDefaultValue =\n options.defaultValue === \"all\" || typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema: z.array(z.string()) as unknown as SchemaLike<Value[]>,\n ...(staticDefaultValue !== undefined\n ? { defaultValue: staticDefaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n const choices = resolveDomainChoices(options.choices, context).map(\n (choice) => ({\n ...choice,\n value: choice.value as string,\n }),\n );\n return {\n type: \"choiceList\",\n choices,\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, choices.length),\n };\n },\n ...(dynamicDefaultValue\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choiceList\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n if (dynamicDefaultValue === \"all\") {\n return choices.map((choice) => choice.value);\n }\n return dynamicDefaultValue({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n },\n }\n : {}),\n };\n}\n\ntype FormInputForState<State extends CollectorState> = {\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n ): InputCollector<Schema, State, \"form\">;\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n ): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n };\n resourceMap(\n options: ResourceMapInputOptions<State>,\n ): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\n resourceMap(\n options: ResourceMapInputOptions<State> & {\n defaultValue: Record<string, number>;\n },\n ): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n };\n resourceChoices(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State>;\n number(\n options: Parameters<typeof numberInput<State>>[0],\n ): ReturnType<typeof numberInput<State>>;\n choice<\n Value extends ChoiceValue,\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n >(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n }): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n };\n choice<\n Value extends ChoiceValue,\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n >(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n }): InputCollector<SchemaLike<Value>, State, \"form\">;\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n }): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n };\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n }): InputCollector<SchemaLike<Value>, State, \"form\">;\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n }): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n };\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n }): InputCollector<SchemaLike<Value[]>, State, \"form\">;\n};\n\nfunction formInputForState<\n State extends CollectorState,\n>(): FormInputForState<State> {\n return Object.assign(\n ((\n schema: ManifestFormInputSchema & SchemaLike<unknown>,\n options?: object,\n ) => baseFormInput(schema, options as never)) as FormInputForState<State>,\n {\n resourceMap: (\n options: ResourceMapInputOptions<State> & {\n defaultValue?: Record<string, number>;\n },\n ) => resourceMapInput<State>(options),\n resourceChoices: (options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }) => formInput.resourceChoices<State>(options),\n number: (options: Parameters<typeof numberInput<State>>[0]) =>\n numberInput<State>(options),\n choice: (options: never) => choiceInput(options),\n choiceList: (options: never) => choiceListInput(options),\n },\n );\n}\n\n/**\n * Manifest-backed id input. Free-form Zod schemas are intentionally explicit:\n * if the runtime cannot disclose valid values or numeric bounds through a\n * manifest id or domain helper, use a custom interaction surface with an\n * explicit `paramsSchema` instead of the default form renderer.\n */\nexport const formInput = Object.assign(baseFormInput, {\n resourceMap: resourceMapInput,\n resourceChoices: <State extends CollectorState = CollectorState>(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State> => ({\n source: \"resourceMap\",\n ...options,\n }),\n number: numberInput,\n choice: choiceInput,\n choiceList: choiceListInput,\n forState: formInputForState,\n});\n","import type { z } from \"zod\";\nimport type { InputCollector } from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type InputFieldRef<\n Key extends string = string,\n Value = unknown,\n Collector extends InputCollector = InputCollector,\n> = {\n readonly key: Key;\n readonly collector: Collector;\n readonly __value?: Value;\n};\n\ntype RefValue<Ref> =\n Ref extends InputFieldRef<string, infer Value, InputCollector>\n ? Value\n : never;\n\ntype CollectorOfRef<Ref> =\n Ref extends InputFieldRef<string, unknown, infer Collector>\n ? Collector\n : never;\n\ntype CollectorValue<Collector> =\n Collector extends InputCollector<infer Schema> ? z.infer<Schema> : never;\n\nexport type DependencyValues<\n Dependencies extends readonly InputFieldRef<\n string,\n unknown,\n InputCollector\n >[],\n> = {\n readonly [Ref in Dependencies[number] as Ref[\"key\"]]: RefValue<Ref>;\n};\n\ntype DefinedInputRefs = Record<\n string,\n InputFieldRef<string, unknown, InputCollector>\n>;\n\nexport type DefinedInputs<Refs extends DefinedInputRefs> = {\n readonly [Key in keyof Refs]: CollectorOfRef<Refs[Key]>;\n};\n\nclass InputBuilder {\n add<\n const Key extends string,\n Collector extends InputCollector<SchemaLike<unknown>>,\n >(\n key: Key,\n collector: Collector,\n ): InputFieldRef<Key, CollectorValue<Collector>, Collector> {\n return { key, collector };\n }\n}\n\n/**\n * Define an interaction's inputs with typed field references. Field refs can be\n * passed to dependent input domains, and the returned collector map preserves\n * the original key/value types for interaction params.\n */\nexport function defineInputs<const Refs extends DefinedInputRefs>(\n define: (input: InputBuilder) => Refs,\n): DefinedInputs<Refs> {\n const refs = define(new InputBuilder());\n return Object.fromEntries(\n Object.entries(refs).map(([key, ref]) => [key, ref.collector]),\n ) as DefinedInputs<Refs>;\n}\n","import { z } from \"zod\";\nimport type {\n BoardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n TargetKind,\n} from \"../model/spec\";\nimport type { BoardTargetRule, PlayerBoardSpaceTarget } from \"./boardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `boardInput.*` helpers produce collectors that accept a board-element id\n * (vertex / edge / space / tile) scoped to one built `boardTarget` rule.\n *\n * Id typing:\n * The `Id` type parameter is the branded id for the board you target,\n * e.g. `HexVertexIdOfTable<Table, \"main\">` or\n * `SquareSpaceIdOfTable<Table, \"board\">`. Once tightened,\n * `ParamsOf<Collectors>` downstream typing reflects the branded id too.\n *\n * Eligibility:\n * Pass a built `boardTarget.*(...).where(...).build()` rule. The same rule\n * feeds server-authoritative eligible-target projection, submit validation,\n * and tests through its `bind({ state, playerId, q })` helper.\n *\n * Runtime vs. compile time:\n * At runtime the submitted value is a string. Branding is purely a\n * compile-time discipline.\n */\nfunction makeBoardCollector<\n Kind extends \"board-vertex\" | \"board-edge\" | \"board-tile\" | \"board-space\",\n>(kind: Kind) {\n return function collector<\n State extends CollectorState = CollectorState,\n Id extends string = string,\n >(options: {\n target: BoardTargetRule<State, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, State, Kind> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind,\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<BoardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state: CollectorState,\n playerId: string,\n q: unknown,\n _derived: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n } as unknown as InputCollector<z.ZodType<Id>, State, Kind>;\n };\n}\n\nexport const vertexInput = makeBoardCollector(\"board-vertex\");\nexport const edgeInput = makeBoardCollector(\"board-edge\");\nexport const tileInput = makeBoardCollector(\"board-tile\");\nexport const spaceInput = makeBoardCollector(\"board-space\");\n\nexport function playerSpaceInput<\n State extends CollectorState = CollectorState,\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = string,\n>(options: {\n target: BoardTargetRule<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<\n z.ZodType<PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>>,\n State,\n \"board-space\"\n> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"board-space\",\n schema: z.object({\n boardId: z.literal(target.boardId),\n playerId: z.string(),\n spaceId: z.string(),\n }) as unknown as z.ZodType<\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >,\n eligibleTargets: ((state, playerId, q, values) =>\n target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId)) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetValue, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetValue as PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<\n BoardTargetRule<\n CollectorState,\n PlayerBoardSpaceTarget<string, string, string>\n >[\"validate\"]\n >)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state: CollectorState,\n playerId: string,\n q: unknown,\n _derived: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n };\n}\n\nexport const boardInput = {\n vertex: vertexInput,\n edge: edgeInput,\n tile: tileInput,\n space: spaceInput,\n playerSpace: playerSpaceInput,\n};\n","import type { CollectorState, TargetKind } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type BoardTargetPredicate<\n State extends CollectorState,\n Target,\n> = TargetPredicate<State, Target>;\n\nexport type BoardTargetRule<State extends CollectorState, Target> = TargetRule<\n State,\n Target\n> & {\n readonly boardId: string;\n readonly targetKind: TargetKind;\n readonly valueKind: \"board-id\" | \"player-board-space\";\n};\n\nexport type BoardTargetBuilder<\n State extends CollectorState,\n Target,\n> = TargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>;\n\nexport type PlayerBoardSpaceTarget<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string,\n> = {\n readonly boardId: BoardId;\n readonly playerId: PlayerId;\n readonly spaceId: SpaceId;\n};\n\nfunction candidateIdsForKind<State extends CollectorState, Id extends string>(\n q: TableQueriesOfState<State>,\n boardId: string,\n targetKind: TargetKind,\n): readonly Id[] {\n if (targetKind === \"edge\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).edges);\n }\n if (targetKind === \"vertex\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).vertices);\n }\n return idsFromCollection<Id>(q.board.get(boardId as never)?.spaces);\n}\n\nfunction idsFromCollection<Id extends string>(\n collection: unknown,\n): readonly Id[] {\n if (!collection) return [];\n const values = Array.isArray(collection)\n ? collection\n : Object.values(collection as Record<string, unknown>);\n return values.flatMap((value) => {\n if (typeof value === \"string\") return [value as Id];\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"id\" in value &&\n typeof (value as { id?: unknown }).id === \"string\"\n ) {\n return [(value as { id: string }).id as Id];\n }\n return [];\n });\n}\n\nfunction createBoardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(targetKind: TargetKind, boardId: string): BoardTargetBuilder<State, Id> {\n return createTargetRuleBuilder<State, Id, BoardTargetRule<State, Id>>(\n (predicates) => ({\n ...createTargetRule(\n ({ q }) => candidateIdsForKind<State, Id>(q, boardId, targetKind),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n },\n ),\n boardId,\n targetKind,\n valueKind: \"board-id\",\n }),\n );\n}\n\nfunction createPlayerSpaceTargetBuilder<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n>(\n boardId: BoardId,\n): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n> {\n type Target = PlayerBoardSpaceTarget<\n BoardId,\n SpaceId,\n PlayerIdOfState<State>\n >;\n return createTargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, q }) => {\n const spacesForPlayer = (playerId: string): readonly SpaceId[] =>\n candidateIdsForKind<State, SpaceId>(\n q,\n `${boardId}:${playerId}`,\n \"space\",\n );\n return state.table.playerOrder.flatMap((playerId) =>\n spacesForPlayer(playerId).map((spaceId) => ({\n boardId,\n playerId: playerId as PlayerIdOfState<State>,\n spaceId,\n })),\n );\n },\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n equals: (left, right) =>\n isPlayerBoardSpaceTarget(left) &&\n isPlayerBoardSpaceTarget(right) &&\n left.boardId === right.boardId &&\n left.playerId === right.playerId &&\n left.spaceId === right.spaceId,\n },\n ),\n boardId,\n targetKind: \"space\",\n valueKind: \"player-board-space\",\n }),\n );\n}\n\nfunction isPlayerBoardSpaceTarget(\n value: unknown,\n): value is PlayerBoardSpaceTarget<string, string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"boardId\" in value &&\n \"playerId\" in value &&\n \"spaceId\" in value\n );\n}\n\nfunction makeBoardTargetFactory(targetKind: TargetKind) {\n return function target<State extends CollectorState, Id extends string>(\n boardId: string,\n ): BoardTargetBuilder<State, Id> {\n return createBoardTargetBuilder<State, Id>(targetKind, boardId);\n };\n}\n\nexport const boardTarget = {\n edge: makeBoardTargetFactory(\"edge\"),\n vertex: makeBoardTargetFactory(\"vertex\"),\n space: makeBoardTargetFactory(\"space\"),\n tile: makeBoardTargetFactory(\"tile\"),\n playerSpace<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n >(\n boardId: BoardId,\n ): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n > {\n return createPlayerSpaceTargetBuilder<State, BoardId, SpaceId>(boardId);\n },\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetContext,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type ChoiceTargetOption<Id extends string> = {\n id: Id;\n label?: string;\n};\n\nexport type ChoiceOptionsFactory<\n State extends CollectorState,\n Id extends string,\n> = (\n state: State,\n playerId: PlayerIdOfState<State>,\n q: TableQueriesOfState<State>,\n) => ReadonlyArray<ChoiceTargetOption<Id>>;\n\nexport type ChoiceTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type ChoiceTargetRule<\n State extends CollectorState,\n Id extends string,\n> = TargetRule<State, Id> & {\n readonly targetKind: \"choice\";\n readonly options: (\n ctx: TargetContext<State>,\n ) => ReadonlyArray<ChoiceTargetOption<Id>>;\n readonly eligibleOptions: (\n ctx: TargetContext<State>,\n ) => ReadonlyArray<ChoiceTargetOption<Id>>;\n};\n\nexport type ChoiceTargetBuilder<\n State extends CollectorState,\n Id extends string,\n> = TargetRuleBuilder<State, Id, ChoiceTargetRule<State, Id>>;\n\nfunction normalizeOptions<State extends CollectorState, Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n): ChoiceOptionsFactory<State, Id> {\n if (typeof options === \"function\") return options;\n return () => options;\n}\n\nfunction createChoiceTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n): ChoiceTargetBuilder<State, Id> {\n const optionsFactory = normalizeOptions(options);\n return createTargetRuleBuilder<State, Id, ChoiceTargetRule<State, Id>>(\n (predicates) => {\n const baseRule = createTargetRule(\n (ctx) =>\n optionsFactory(ctx.state, ctx.playerId, ctx.q).map(\n (option) => option.id,\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CHOICE_TARGET_NOT_ELIGIBLE\",\n message: \"Choice target is not eligible.\",\n },\n },\n );\n return {\n ...baseRule,\n targetKind: \"choice\",\n options: (ctx) => optionsFactory(ctx.state, ctx.playerId, ctx.q),\n eligibleOptions: (ctx) =>\n optionsFactory(ctx.state, ctx.playerId, ctx.q).filter((option) =>\n baseRule.isEligible(ctx, option.id),\n ),\n };\n },\n );\n}\n\nexport const choiceTarget = {\n options<State extends CollectorState, Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n ): ChoiceTargetBuilder<State, Id> {\n return createChoiceTargetBuilder(options);\n },\n};\n","import type { SchemaLike } from \"../model/table\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { ChoiceTargetRule } from \"./choiceTarget\";\nimport type { z } from \"zod\";\n\ntype SchemaStringValue<Schema extends SchemaLike<unknown>> = Extract<\n Schema extends z.ZodType<infer V> ? V : never,\n string\n>;\n\n/**\n * `promptInput` marks an interaction as a prompt delivered to a player's\n * inbox. The submitted value is validated by the supplied Zod schema.\n *\n * Static or free-form prompts need only `schema`. Finite dynamic choices use\n * a built `choiceTarget.options(...).build()` rule so projected options and\n * submit validation share one source of truth.\n */\nexport function promptInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(options: {\n schema: Schema;\n target?: ChoiceTargetRule<State, SchemaStringValue<Schema>>;\n}): InputCollector<Schema, State, \"prompt\"> {\n const target = options.target;\n return {\n kind: \"prompt\",\n schema: options.schema,\n eligibleTargets: target\n ? (((state, playerId, q) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n ) => ReadonlyArray<unknown>)\n | undefined)\n : undefined,\n validateTarget: target\n ? (((state, playerId, q, targetId) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n },\n targetId as SchemaStringValue<Schema>,\n )) as InputCollector<Schema, State, \"prompt\">[\"validateTarget\"])\n : undefined,\n meta: target\n ? {\n options: (state: unknown, playerId: unknown, q: unknown) =>\n target.options({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n }),\n eligibleOptions: (state: unknown, playerId: unknown, q: unknown) =>\n target.eligibleOptions({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n }),\n }\n : undefined,\n domain: (state, playerId, q) => ({\n type: \"choice\" as const,\n choices: target\n ? target\n .options({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })\n .map((option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n }))\n : [],\n }),\n };\n}\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\n\n/**\n * `rngInput.*` helpers produce collectors whose value is *sampled by the\n * engine on submit* rather than supplied by the client. The schema pins\n * the exact output shape so `ParamsOf<Collectors>` sees precisely typed\n * results.\n *\n * Determinism:\n * Sampling happens inside `submitInteraction` only, never inside\n * `validateInteraction`. This lets clients dry-run a submission without\n * burning RNG state.\n */\n\ntype DieRoll = z.ZodObject<{ values: z.ZodArray<z.ZodNumber> }>;\ntype CoinFlip = z.ZodObject<{\n value: z.ZodEnum<{ heads: \"heads\"; tails: \"tails\" }>;\n}>;\n\n// The literal `kind: \"rng\"` is intentionally preserved in the return type\n// so `ClientParamsOf<Collectors>` can structurally detect engine-sampled\n// collectors and omit them from client-facing submit params.\ntype RngCollector<\n Schema extends DieRoll | CoinFlip,\n State extends CollectorState,\n> = InputCollector<Schema, State, \"rng\">;\n\n/**\n * Roll `count` d6s. The submitted value is `{ values: number[] }` with\n * `values.length === count` and each face `1..6`.\n */\nexport function d6<State extends CollectorState = CollectorState>(\n count: number = 1,\n): RngCollector<DieRoll, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n values: z.array(z.number().int().min(1).max(6)).length(count),\n }),\n meta: { rng: \"d6\", count },\n };\n}\n\n/** Flip a coin. The submitted value is `{ value: \"heads\" | \"tails\" }`. */\nexport function coin<\n State extends CollectorState = CollectorState,\n>(): RngCollector<CoinFlip, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n value: z.enum([\"heads\", \"tails\"]),\n }),\n meta: { rng: \"coin\" },\n };\n}\n\nexport const rngInput = { d6, coin };\n","import { z } from \"zod\";\nimport type {\n CollectorState,\n InputCollector,\n InputSelectionDescriptor,\n} from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type ManyOptions =\n | {\n count: number;\n distinct?: boolean;\n }\n | {\n min?: number;\n max?: number;\n distinct?: boolean;\n };\n\ntype NonRngCollector = InputCollector<SchemaLike<unknown>, CollectorState> & {\n readonly kind: Exclude<InputCollector[\"kind\"], \"rng\">;\n};\n\ntype CollectorSchema<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<infer Schema, CollectorState>,\n]\n ? Schema\n : never;\n\ntype CollectorStateOf<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<SchemaLike<unknown>, infer State>,\n]\n ? State\n : never;\n\ntype CollectorKindOf<Collector extends NonRngCollector> = [Collector] extends [\n {\n readonly kind: infer Kind extends Exclude<InputCollector[\"kind\"], \"rng\">;\n },\n]\n ? Kind\n : never;\n\nexport type ManyInputCollector<\n Schema extends SchemaLike<unknown> = SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n Kind extends Exclude<InputCollector[\"kind\"], \"rng\"> = Exclude<\n InputCollector[\"kind\"],\n \"rng\"\n >,\n> = InputCollector<z.ZodType<ReadonlyArray<z.infer<Schema>>>, State, Kind> & {\n readonly selection: Extract<InputSelectionDescriptor, { mode: \"many\" }>;\n};\n\nfunction normalizeManyOptions(\n options: ManyOptions,\n): Extract<InputSelectionDescriptor, { mode: \"many\" }> {\n if (\"count\" in options) {\n assertNonNegativeInteger(options.count, \"many(...).count\");\n return {\n mode: \"many\",\n min: options.count,\n max: options.count,\n distinct: options.distinct,\n };\n }\n const min = options.min ?? 0;\n assertNonNegativeInteger(min, \"many(...).min\");\n if (options.max !== undefined) {\n assertNonNegativeInteger(options.max, \"many(...).max\");\n if (options.max < min) {\n throw new Error(\"many(...).max must be greater than or equal to min.\");\n }\n }\n return {\n mode: \"many\",\n min,\n max: options.max,\n distinct: options.distinct,\n };\n}\n\nfunction assertNonNegativeInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative integer.`);\n }\n}\n\nexport function many<Collector extends NonRngCollector>(\n collector: Collector,\n options: ManyOptions,\n): ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n> &\n Pick<Collector, \"meta\"> {\n if ((collector as InputCollector).kind === \"rng\") {\n throw new Error(\"many(...) cannot wrap rngInput collectors.\");\n }\n const selection = normalizeManyOptions(options);\n const rest = { ...collector } as Omit<\n Collector,\n \"schema\" | \"selection\" | \"defaultValue\"\n > & {\n schema?: unknown;\n selection?: unknown;\n defaultValue?: unknown;\n };\n delete rest.schema;\n delete rest.selection;\n delete rest.defaultValue;\n return {\n ...rest,\n schema: z.array(collector.schema as z.ZodTypeAny) as unknown as z.ZodType<\n ReadonlyArray<z.infer<CollectorSchema<Collector>>>\n >,\n selection,\n } as unknown as ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n > &\n Pick<Collector, \"meta\">;\n}\n","import type { PhaseMapOf, ReducerGameDefinition, ViewMapOf } from \"../model\";\nimport type { AnyReducerGameContract } from \"./types\";\nimport {\n validateDefineGamePhaseNames,\n validateDefineGameSimultaneousPhases,\n validateDefineGameZoneWiring,\n} from \"./validation\";\n\nexport function defineGame<\n const Contract extends AnyReducerGameContract,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract> = Record<string, never>,\n>(\n definition: { contract: Contract } & Omit<\n ReducerGameDefinition<NoInfer<Contract>, Definitions, Views>,\n \"contract\"\n >,\n): ReducerGameDefinition<Contract, Definitions, Views> {\n validateDefineGamePhaseNames(definition);\n validateDefineGameSimultaneousPhases(definition);\n validateDefineGameZoneWiring(definition);\n return definition;\n}\n","import type {\n CardActionSpec,\n InputCollector,\n InteractionRule,\n InteractionSpec,\n PlayerZoneIdOfManifest,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractErrorCode,\n ContractManifest,\n ContractState,\n InferPhaseState,\n PhaseStateInput,\n} from \"./types\";\nimport { validateInteractionLikeDefinition } from \"./validation\";\n\nexport function defineInteraction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <Collectors extends Record<string, InputCollector>>(\n definition: InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineInteraction\",\n );\n return definition;\n };\n}\n\nexport function defineInteractionRule<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n >(\n definition: InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n > => definition;\n}\n\nexport function defineCardAction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<string, never>,\n const PlayFrom extends PlayerZoneIdOfManifest<ContractManifest<Contract>> =\n PlayerZoneIdOfManifest<ContractManifest<Contract>>,\n >(\n definition: CardActionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n PlayFrom,\n ContractErrorCode<Contract>\n >,\n ): CardActionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n PlayFrom,\n ContractErrorCode<Contract>\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineCardAction\",\n );\n return definition;\n };\n}\n","import { z } from \"zod\";\nimport type {\n AnyCardActionSpec,\n AnyInteractionSpec,\n CardActionMap,\n EffectMap,\n InputCollector,\n ManifestContract,\n PhaseDefinition,\n PhaseZoneList,\n PlayerIdOfState,\n RuntimeTableRecord,\n SchemaLike,\n SetupSelectionOfManifest,\n StageMap,\n TableOfState,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nexport type StepPhaseState<\n PhaseStateSchema extends SchemaLike<object>,\n Steps extends readonly string[],\n> = z.infer<PhaseStateSchema> & { step: Steps[number] };\n\ntype StepPhaseInteractionEntry<Step extends string, Interaction> = {\n steps: readonly Step[];\n interaction: Interaction;\n};\n\ntype StepPhaseCardActionEntry<Step extends string, Action> = {\n steps: readonly Step[];\n action: Action;\n};\n\nexport type StepPhaseInteractionMap<\n Step extends string,\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n> = Record<\n string,\n StepPhaseInteractionEntry<Step, AnyInteractionSpec<State, Manifest>>\n>;\n\nexport type StepPhaseCardActionMap<\n Step extends string,\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n> = Record<\n string,\n StepPhaseCardActionEntry<Step, AnyCardActionSpec<State, Manifest>>\n>;\n\nexport type UnwrappedStepInteractions<\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n Interactions extends Record<\n string,\n StepPhaseInteractionEntry<string, AnyInteractionSpec<State, Manifest>>\n >,\n> = {\n [Key in keyof Interactions]: Interactions[Key][\"interaction\"];\n};\n\nexport type UnwrappedStepCardActions<\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n CardActions extends Record<\n string,\n StepPhaseCardActionEntry<string, AnyCardActionSpec<State, Manifest>>\n >,\n> = {\n [Key in keyof CardActions]: CardActions[Key][\"action\"];\n};\n\nfunction stepStateSchema<Steps extends readonly [string, ...string[]]>(\n schema: SchemaLike<object>,\n steps: Steps,\n): SchemaLike<object> {\n const stepSchema = z.enum(steps);\n const maybeObject = schema as {\n extend?: (shape: { step: typeof stepSchema }) => SchemaLike<object>;\n };\n if (typeof maybeObject.extend === \"function\") {\n return maybeObject.extend({ step: stepSchema });\n }\n return z.intersection(schema, z.object({ step: stepSchema }));\n}\n\nfunction unwrapStepInteractions<\n Step extends string,\n Interactions extends Record<string, StepPhaseInteractionEntry<Step, unknown>>,\n>(interactions: Interactions | undefined) {\n if (!interactions) return undefined;\n return Object.fromEntries(\n Object.entries(interactions).map(([key, entry]) => [\n key,\n {\n ...(entry.interaction as object),\n __steps: entry.steps,\n },\n ]),\n );\n}\n\nfunction unwrapStepCardActions<\n Step extends string,\n CardActions extends Record<string, StepPhaseCardActionEntry<Step, unknown>>,\n>(cardActions: CardActions | undefined) {\n if (!cardActions) return undefined;\n return Object.fromEntries(\n Object.entries(cardActions).map(([key, entry]) => [\n key,\n {\n ...(entry.action as object),\n __steps: entry.steps,\n },\n ]),\n );\n}\n\nexport function definePhase<Contract extends AnyReducerGameContract>() {\n return <\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<\n ContractState<Contract>,\n ContractManifest<Contract>\n > = Record<string, never>,\n Interactions extends Record<\n string,\n AnyInteractionSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<ContractManifest<Contract>> = readonly [],\n CardActions extends CardActionMap<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > = Record<string, never>,\n >(\n definition: PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >,\n ): PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n > => {\n return definition;\n };\n}\n\nexport function defineStepPhase<Contract extends AnyReducerGameContract>() {\n return <\n const Steps extends readonly [string, ...string[]],\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<\n ContractState<Contract>,\n ContractManifest<Contract>\n > = Record<string, never>,\n Interactions extends StepPhaseInteractionMap<\n Steps[number],\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<ContractManifest<Contract>> = readonly [],\n CardActions extends StepPhaseCardActionMap<\n Steps[number],\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n >(\n definition: Omit<\n PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n CardActions\n >\n >,\n \"state\" | \"initialState\" | \"interactions\" | \"cardActions\"\n > & {\n steps: Steps;\n state: PhaseStateSchema;\n initialState?: (ctx: {\n manifest: ContractManifest<Contract>;\n state: ContractState<Contract>;\n playerIds: PlayerIdOfState<ContractState<Contract>>[];\n setup: SetupSelectionOfManifest<ContractManifest<Contract>> | null;\n }) => z.infer<PhaseStateSchema>;\n interactions?: Interactions;\n cardActions?: CardActions;\n },\n ) => {\n const [initialStep] = definition.steps;\n const state = stepStateSchema(definition.state, definition.steps);\n const initialState = definition.initialState\n ? (ctx: Parameters<NonNullable<typeof definition.initialState>>[0]) => ({\n ...definition.initialState?.(ctx),\n step: initialStep,\n })\n : () => ({ step: initialStep });\n const { steps: _steps, ...rest } = definition;\n void _steps;\n const normalized = {\n ...rest,\n state,\n initialState,\n interactions: unwrapStepInteractions(definition.interactions),\n cardActions: unwrapStepCardActions(definition.cardActions),\n };\n return normalized as unknown as PhaseDefinition<\n SchemaLike<StepPhaseState<PhaseStateSchema, Steps>>,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n CardActions\n >\n >;\n };\n}\n","import type { z } from \"zod\";\nimport type {\n ExactManifestContractOf,\n SchemaLike,\n StageSpec,\n StaticViewDefinition,\n ViewDefinition,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nexport function defineView<Contract extends AnyReducerGameContract>() {\n return <Projection>(\n definition: ViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n >,\n ): ViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n > => definition;\n}\n\n/**\n * Factory for the session-scoped static view (see {@link StaticViewDefinition}).\n * Kept separate from {@link defineView} because the argument shape is\n * structurally different: it exposes only the manifest and generated static\n * queries, with no `state`, `playerId`, `runtime`, `fx`, `ops`, or\n * `accept/reject`. That shape is what prevents authors from accidentally\n * projecting per-tick state into the once-per-session payload.\n */\nexport function defineStaticView<Contract extends AnyReducerGameContract>() {\n return <Projection>(\n definition: StaticViewDefinition<\n ExactManifestContractOf<Contract>,\n Projection\n >,\n ): StaticViewDefinition<ExactManifestContractOf<Contract>, Projection> =>\n definition;\n}\n\nexport function defineStage<Contract extends AnyReducerGameContract>() {\n return (\n definition: StageSpec<ContractState<Contract>, ContractManifest<Contract>>,\n ): StageSpec<ContractState<Contract>, ContractManifest<Contract>> =>\n definition;\n}\n\nexport function definePhaseStage<\n Contract extends AnyReducerGameContract,\n PhaseStateSchema extends SchemaLike<object>,\n>() {\n return (\n definition: StageSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >,\n ): StageSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > => definition;\n}\n","import type { z } from \"zod\";\nimport type {\n CardActionMap,\n CardActionSpec,\n CardIdOfManifest,\n CardIdOfState,\n EffectMap,\n InputCollector,\n InteractionMap,\n InteractionRule,\n InteractionSpec,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n PhaseSchemasOfContract,\n PhaseZoneList,\n PlayerIdOfState,\n PlayerZoneIdOfManifest,\n SchemaLike,\n SetupSelectionOfManifest,\n StageMap,\n StaticViewDefinition,\n TableOfManifest,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledSpaceIdOfTable,\n TiledVertexIdOfTable,\n ViewDefinition,\n ViewMapOf,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n BoardTargetBuilder,\n BoardTargetRule,\n CardTargetBuilder,\n CardTargetRule,\n ChoiceOptionsFactory,\n ChoiceTargetBuilder,\n ChoiceTargetOption,\n ChoiceTargetRule,\n InputFieldRef,\n PlayerBoardSpaceTarget,\n} from \"../inputs\";\nimport {\n boardInput,\n boardTarget,\n cardInput,\n cardTarget,\n choiceTarget,\n formInput,\n promptInput,\n rngInput,\n} from \"../inputs\";\nimport type {\n AnyReducerGameContract,\n ContractErrorCode,\n ContractManifest,\n ContractState,\n InferPhaseState,\n} from \"./types\";\nimport { defineGame } from \"./game\";\nimport {\n defineCardAction,\n defineInteraction,\n defineInteractionRule,\n} from \"./interaction\";\nimport {\n definePhase,\n defineStepPhase,\n type StepPhaseCardActionMap,\n type StepPhaseInteractionMap,\n type StepPhaseState,\n type UnwrappedStepCardActions,\n type UnwrappedStepInteractions,\n} from \"./phase\";\nimport { defineStaticView, defineView } from \"./view-stage\";\n\nexport type ContractWithPhases = AnyReducerGameContract & {\n readonly phases: Record<string, SchemaLike<object>>;\n};\n\ntype BoundState<Contract extends ContractWithPhases> = ContractState<Contract>;\n\ntype BoundManifest<Contract extends ContractWithPhases> =\n ContractManifest<Contract>;\n\ntype BoundTable<Contract extends ContractWithPhases> = TableOfManifest<\n BoundManifest<Contract>\n>;\n\ntype BoundPhaseState<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n> = ScopedPhaseState<BoundState<Contract>, z.infer<PhaseStateSchema>>;\n\ntype BoundFormInputs<Contract extends ContractWithPhases> = ReturnType<\n typeof formInput.forState<BoundState<Contract>>\n>;\n\ntype BoundBoardInputs<Contract extends ContractWithPhases> = {\n vertex<\n Id extends string = TiledVertexIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(options: {\n target: BoardTargetRule<BoundState<Contract>, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-vertex\">;\n edge<\n Id extends string = TiledEdgeIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(options: {\n target: BoardTargetRule<BoundState<Contract>, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-edge\">;\n tile<Id extends string = string>(options: {\n target: BoardTargetRule<BoundState<Contract>, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-tile\">;\n space<\n Id extends string = TiledSpaceIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(options: {\n target: BoardTargetRule<BoundState<Contract>, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-space\">;\n playerSpace<\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = PlayerIdOfState<BoundState<Contract>>,\n >(options: {\n target: BoardTargetRule<\n BoundState<Contract>,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<\n z.ZodType<PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>>,\n BoundState<Contract>,\n \"board-space\"\n >;\n};\n\ntype BoundCardInput<Contract extends ContractWithPhases> = <\n Id extends string = CardIdOfManifest<BoundManifest<Contract>>,\n const ZoneIds extends readonly string[] = readonly string[],\n>(options: {\n target: CardTargetRule<BoundState<Contract>, Id, ZoneIds>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}) => InputCollector<z.ZodType<Id>, BoundState<Contract>, \"card\"> & {\n readonly meta: {\n readonly zoneId: ZoneIds[number];\n readonly zoneIds: ZoneIds;\n readonly targetKind: \"card\";\n };\n};\n\ntype BoundPromptInput<Contract extends ContractWithPhases> = <\n Schema extends SchemaLike<unknown>,\n>(options: {\n schema: Schema;\n target?: ChoiceTargetRule<\n BoundState<Contract>,\n Extract<Schema extends z.ZodType<infer Value> ? Value : never, string>\n >;\n}) => InputCollector<Schema, BoundState<Contract>, \"prompt\">;\n\ntype BoundRngInputs<Contract extends ContractWithPhases> = {\n d6(count?: number): ReturnType<typeof rngInput.d6<BoundState<Contract>>>;\n coin(): ReturnType<typeof rngInput.coin<BoundState<Contract>>>;\n};\n\ntype BoundChoiceTarget<Contract extends ContractWithPhases> = {\n options<Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<BoundState<Contract>, Id>,\n ): ChoiceTargetBuilder<BoundState<Contract>, Id>;\n};\n\ntype BoundBoardTarget<Contract extends ContractWithPhases> = {\n edge<Id extends string = string>(\n boardId: string,\n ): BoardTargetBuilder<BoundState<Contract>, Id>;\n vertex<Id extends string = string>(\n boardId: string,\n ): BoardTargetBuilder<BoundState<Contract>, Id>;\n space<Id extends string = string>(\n boardId: string,\n ): BoardTargetBuilder<BoundState<Contract>, Id>;\n tile<Id extends string = string>(\n boardId: string,\n ): BoardTargetBuilder<BoundState<Contract>, Id>;\n playerSpace<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string = PlayerIdOfState<BoundState<Contract>>,\n >(\n boardId: BoardId,\n ): BoardTargetBuilder<\n BoundState<Contract>,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n};\n\ntype BoundCardTarget<Contract extends ContractWithPhases> = {\n zones<\n Id extends string = CardIdOfState<BoundState<Contract>>,\n const ZoneIds extends readonly string[] = readonly string[],\n >(\n zoneIds: ZoneIds,\n ): CardTargetBuilder<BoundState<Contract>, Id, ZoneIds>;\n};\n\nexport type BoundInputBuilders<Contract extends ContractWithPhases> = {\n readonly board: BoundBoardInputs<Contract>;\n readonly boardTarget: BoundBoardTarget<Contract>;\n readonly card: BoundCardInput<Contract>;\n readonly cardTarget: BoundCardTarget<Contract>;\n readonly choiceTarget: BoundChoiceTarget<Contract>;\n readonly form: BoundFormInputs<Contract>;\n readonly prompt: BoundPromptInput<Contract>;\n readonly rng: BoundRngInputs<Contract>;\n};\n\ntype StepPhaseInput<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n Steps extends readonly [string, ...string[]],\n SubmitCollectors extends Record<string, InputCollector>,\n Effects extends EffectMap<BoundState<Contract>, BoundManifest<Contract>>,\n Interactions extends StepPhaseInteractionMap<\n Steps[number],\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n >,\n Stages extends StageMap<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n >,\n Zones extends PhaseZoneList<BoundManifest<Contract>>,\n CardActions extends StepPhaseCardActionMap<\n Steps[number],\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n >,\n> = Omit<\n PhaseDefinition<\n PhaseStateSchema,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>,\n CardActions\n >\n >,\n \"state\" | \"initialState\" | \"interactions\" | \"cardActions\"\n> & {\n steps: Steps;\n state?: never;\n initialState?: (ctx: {\n manifest: BoundManifest<Contract>;\n state: BoundState<Contract>;\n playerIds: PlayerIdOfState<BoundState<Contract>>[];\n setup: SetupSelectionOfManifest<BoundManifest<Contract>> | null;\n }) => InferPhaseState<PhaseStateSchema>;\n interactions?: Interactions;\n cardActions?: CardActions;\n};\n\nexport type PhaseAuthoring<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n> = {\n interaction<Collectors extends Record<string, InputCollector>>(\n spec: InteractionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >;\n cardAction<\n Collectors extends Record<string, InputCollector> = Record<string, never>,\n const PlayFrom extends PlayerZoneIdOfManifest<BoundManifest<Contract>> =\n PlayerZoneIdOfManifest<BoundManifest<Contract>>,\n >(\n spec: CardActionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n PlayFrom,\n ContractErrorCode<Contract>\n >,\n ): CardActionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n PlayFrom,\n ContractErrorCode<Contract>\n >;\n rule<\n Collectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n >(\n rule: InteractionRule<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionRule<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >;\n define<\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<BoundState<Contract>, BoundManifest<Contract>> =\n Record<string, never>,\n Interactions extends InteractionMap<\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>\n > = Record<string, never>,\n Stages extends StageMap<\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<BoundManifest<Contract>> = readonly [],\n CardActions extends CardActionMap<\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>\n > = Record<string, never>,\n >(\n definition: Omit<\n PhaseDefinition<\n PhaseStateSchema,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >,\n \"state\"\n >,\n ): PhaseDefinition<\n PhaseStateSchema,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >;\n stepPhase<\n const Steps extends readonly [string, ...string[]],\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<BoundState<Contract>, BoundManifest<Contract>> =\n Record<string, never>,\n Interactions extends StepPhaseInteractionMap<\n Steps[number],\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<BoundManifest<Contract>> = readonly [],\n CardActions extends StepPhaseCardActionMap<\n Steps[number],\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n > = Record<string, never>,\n >(\n definition: StepPhaseInput<\n Contract,\n PhaseStateSchema,\n Steps,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >,\n ): PhaseDefinition<\n SchemaLike<StepPhaseState<PhaseStateSchema, Steps>>,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>,\n CardActions\n >\n >;\n readonly inputs: BoundInputBuilders<Contract>;\n};\n\nexport type ContractAuthoring<Contract extends ContractWithPhases> = {\n readonly contract: Contract;\n game<\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract> = Record<string, never>,\n >(\n definition: Omit<\n import(\"../model\").ReducerGameDefinition<Contract, Definitions, Views>,\n \"contract\"\n >,\n ): import(\"../model\").ReducerGameDefinition<Contract, Definitions, Views>;\n view<Projection>(\n definition: ViewDefinition<\n BoundState<Contract>,\n BoundManifest<Contract>,\n Projection\n >,\n ): ViewDefinition<BoundState<Contract>, BoundManifest<Contract>, Projection>;\n staticView<Projection>(\n definition: StaticViewDefinition<\n import(\"../model\").ExactManifestContractOf<Contract>,\n Projection\n >,\n ): StaticViewDefinition<\n import(\"../model\").ExactManifestContractOf<Contract>,\n Projection\n >;\n phase<Name extends PhaseNameOfContract<Contract>>(\n name: Name,\n ): PhaseAuthoring<Contract, PhaseSchemasOfContract<Contract>[Name]>;\n};\n\nfunction createBoundInputBuilders<\n Contract extends ContractWithPhases,\n>(): BoundInputBuilders<Contract> {\n return {\n board: boardInput as BoundBoardInputs<Contract>,\n boardTarget: boardTarget as unknown as BoundBoardTarget<Contract>,\n card: cardInput as BoundCardInput<Contract>,\n cardTarget: cardTarget as BoundCardTarget<Contract>,\n choiceTarget: choiceTarget as BoundChoiceTarget<Contract>,\n form: formInput.forState<BoundState<Contract>>(),\n prompt: promptInput as BoundPromptInput<Contract>,\n rng: rngInput as BoundRngInputs<Contract>,\n };\n}\n\nfunction createPhaseAuthoring<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n>(\n _contract: Contract,\n schema: PhaseStateSchema,\n): PhaseAuthoring<Contract, PhaseStateSchema> {\n return {\n interaction: (spec) =>\n defineInteraction<Contract, PhaseStateSchema>()(\n spec as Parameters<\n ReturnType<typeof defineInteraction<Contract, PhaseStateSchema>>\n >[0],\n ) as typeof spec,\n cardAction: (spec) =>\n defineCardAction<Contract, PhaseStateSchema>()(\n spec as unknown as Parameters<\n ReturnType<typeof defineCardAction<Contract, PhaseStateSchema>>\n >[0],\n ) as unknown as typeof spec,\n rule: (rule) =>\n defineInteractionRule<Contract, PhaseStateSchema>()(\n rule as Parameters<\n ReturnType<typeof defineInteractionRule<Contract, PhaseStateSchema>>\n >[0],\n ) as typeof rule,\n define: (definition) =>\n definePhase<Contract>()({\n ...definition,\n state: schema,\n } as Parameters<ReturnType<typeof definePhase<Contract>>>[0]) as never,\n stepPhase: (definition) =>\n defineStepPhase<Contract>()({\n ...definition,\n state: schema,\n } as Parameters<\n ReturnType<typeof defineStepPhase<Contract>>\n >[0]) as never,\n inputs: createBoundInputBuilders<Contract>(),\n };\n}\n\nexport function createContractAuthoring<\n const Contract extends ContractWithPhases,\n>(contract: Contract): ContractAuthoring<Contract> {\n const phaseCache = new Map<string, unknown>();\n return {\n contract,\n game: (definition) => defineGame({ contract, ...definition }),\n view: (definition) => defineView<Contract>()(definition),\n staticView: (definition) => defineStaticView<Contract>()(definition),\n phase: (name) => {\n const cached = phaseCache.get(name);\n if (cached) return cached as never;\n const schema = contract.phases[name];\n const bound = createPhaseAuthoring(contract, schema);\n phaseCache.set(name, bound);\n return bound as never;\n },\n };\n}\n","import { z } from \"zod\";\nimport type {\n AnySchema,\n EffectRollDieDefinition,\n EffectShuffleDefinition,\n EffectShufflePlayerZoneDefinition,\n} from \"../model\";\nimport type {\n ContinuationCallable,\n ResumableEffectKind,\n} from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nfunction createContinuationCallable<\n DataSchema extends AnySchema,\n ResponseSchema extends AnySchema,\n State extends {\n table: import(\"../model\").RuntimeTableRecord;\n flow: { currentPhase: string };\n },\n Manifest extends import(\"../model\").ManifestContract<\n import(\"../model\").TableOfState<State>\n >,\n EffectType extends ResumableEffectKind = ResumableEffectKind,\n>(definition: {\n id: string;\n data: DataSchema;\n response: ResponseSchema;\n effectKind?: EffectType;\n reduce: ContinuationCallable<\n DataSchema,\n State,\n Manifest,\n string,\n EffectType\n >[\"reduce\"];\n}): ContinuationCallable<DataSchema, State, Manifest, string, EffectType> {\n const continuation = ((data: z.infer<DataSchema>) => {\n return {\n id: continuation.id,\n data,\n };\n }) as ContinuationCallable<DataSchema, State, Manifest, string, EffectType>;\n continuation.id = definition.id;\n continuation.source = \"effect\";\n continuation.dataSchema = definition.data;\n continuation.responseSchema = definition.response;\n continuation.reduce = definition.reduce;\n if (definition.effectKind !== undefined) {\n continuation.effectKind = definition.effectKind;\n }\n return continuation;\n}\n\n// --- `defineEffect` ---\n//\n// Authoring factory for engine-side resumable effects (cues). An effect\n// is the registered bundle of continuation callable + optional reduce,\n// discriminated by `type` which aligns directly with `ResumableEffectKind`:\n//\n// defineEffect<GameContract>()({ type: \"rollDie\", id, context?, reduce? })\n// defineEffect<GameContract>()({ type: \"shuffleSharedZone\", id, context?, reduce? })\n//\n// Authored effects are registered under `phase.effects` and invoked from\n// a reducer via `fx.effect(effect, options)`. The wire protocol already\n// isolates the continuation payload into the ingress bundle's\n// `continuations` map keyed by `effectId`, so `fx.effect` never attaches\n// `resume: undefined` to the wire effect.\n//\n// Addressed player requests are *not* effects. Author them as\n// prompt-kind interactions via `defineInteraction({ kind: \"prompt\",\n// to, options, ... })`.\n\ntype EffectRollDieInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"rollDie\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"rollDie\"\n >[\"reduce\"];\n};\n\ntype EffectShuffleInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shuffleSharedZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shuffleSharedZone\"\n >[\"reduce\"];\n};\n\ntype EffectShufflePlayerZoneInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shufflePlayerZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shufflePlayerZone\"\n >[\"reduce\"];\n};\n\nexport function defineEffect<Contract extends AnyReducerGameContract>() {\n type EffectInput =\n | EffectRollDieInput<Contract, string, AnySchema>\n | EffectShuffleInput<Contract, string, AnySchema>\n | EffectShufflePlayerZoneInput<Contract, string, AnySchema>;\n type EffectOutput =\n | EffectRollDieDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShuffleDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShufflePlayerZoneDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectRollDieInput<Contract, Id, ContextSchema>,\n ): EffectRollDieDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShuffleInput<Contract, Id, ContextSchema>,\n ): EffectShuffleDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShufflePlayerZoneInput<Contract, Id, ContextSchema>,\n ): EffectShufflePlayerZoneDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect(definition: EffectInput): EffectOutput {\n if (\n definition.type === \"rollDie\" ||\n definition.type === \"shuffleSharedZone\" ||\n definition.type === \"shufflePlayerZone\"\n ) {\n const effectKind: ResumableEffectKind = definition.type;\n if (!definition.reduce) {\n return {\n type: definition.type,\n id: definition.id,\n contextSchema: definition.context,\n } as EffectOutput;\n }\n const contextSchema = (definition.context ?? z.object({})) as AnySchema;\n const continuation = createContinuationCallable<\n AnySchema,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n ResumableEffectKind\n >({\n id: definition.id,\n data: contextSchema,\n response: z.unknown() as AnySchema,\n effectKind,\n reduce: definition.reduce,\n });\n return {\n type: definition.type,\n id: definition.id,\n contextSchema,\n __continuation: continuation,\n } as EffectOutput;\n }\n throw new Error(\n `defineEffect: unknown effect definition. Expected type 'rollDie' | 'shuffleSharedZone' | 'shufflePlayerZone'. Addressed prompts are authored as prompt-kind interactions via defineInteraction({ kind: \"prompt\" }).`,\n );\n }\n return effect;\n}\n","import type { SystemActionEvent } from \"./model\";\n\nexport const gameEvent = {\n systemAction(event: Omit<SystemActionEvent, \"kind\">): SystemActionEvent {\n return {\n kind: \"systemAction\",\n ...event,\n };\n },\n};\n","import type { DispatchTraceEntry } from \"./core/types\";\n\nexport type DispatchTraceSummaryEntry =\n | { kind: \"acceptedClientInput\"; interactionId: string; playerId: string }\n | { kind: \"appliedInstruction\"; instruction: string }\n | { kind: \"rngConsumption\"; operation: string; traceEntry: string };\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 \"appliedInstruction\":\n return {\n kind: \"appliedInstruction\" as const,\n instruction: entry.instruction.kind,\n };\n case \"rngConsumption\":\n return {\n kind: \"rngConsumption\" as const,\n operation: entry.operation,\n traceEntry: entry.traceEntry,\n };\n default: {\n const _exhaustive: never = entry;\n return _exhaustive;\n }\n }\n });\n}\n","import type {\n DispatchTraceEntry,\n TrustedReducerDispatchResult,\n TrustedRuntimeInput,\n} from \"../core/types\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\nimport type { GameEvent, GameOutcome } from \"../model/runtime\";\n\nexport function createRuntimeInstructionEngine<\n State,\n PlayerId extends string,\n Input extends TrustedRuntimeInput<PlayerId>,\n>({\n reduce,\n resolveInstruction,\n afterInput,\n prepareInstructionState,\n}: {\n reduce: (\n state: State,\n input: Input,\n ) =>\n | { type: \"reject\"; errorCode: string; message?: string }\n | {\n type: \"accept\";\n state: State;\n instructions?: readonly RuntimeInstructionForState<State>[];\n terminal?: GameOutcome<PlayerId>;\n events?: readonly GameEvent[];\n };\n resolveInstruction: (\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ) => {\n state: State;\n queuedInputs: Input[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n afterInput?: (\n state: State,\n input: Input,\n ) => {\n state: State;\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n prepareInstructionState?: (state: State) => State;\n}) {\n const prepareForInstructionDrain = (state: State): State =>\n prepareInstructionState ? prepareInstructionState(state) : state;\n\n function drainInstructions(\n state: State,\n instructionsToDrain: RuntimeInstructionForState<State>[],\n ): State {\n let workingState = state;\n const instructionQueue = [...instructionsToDrain];\n const systemQueue: Input[] = [];\n\n while (instructionQueue.length > 0 || systemQueue.length > 0) {\n if (instructionQueue.length > 0) {\n workingState = prepareForInstructionDrain(workingState);\n }\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n systemQueue.push(...resolved.queuedInputs);\n }\n\n while (systemQueue.length > 0) {\n const input = systemQueue.shift();\n if (input === undefined) break;\n const result = reduce(workingState, input);\n if (result.type === \"reject\") {\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${input.kind}'.`,\n );\n }\n workingState = result.state;\n instructionQueue.push(...(result.instructions ?? []));\n }\n }\n\n return workingState;\n }\n\n function dispatch(\n state: State,\n input: Input,\n ): TrustedReducerDispatchResult<State, PlayerId> {\n let workingState = state;\n const pendingInputs: Input[] = [input];\n let terminal: GameOutcome<PlayerId> | undefined;\n const events: GameEvent[] = [];\n const trace: DispatchTraceEntry<State, PlayerId, Input>[] = [\n {\n type: \"acceptedClientInput\",\n input,\n },\n ];\n\n while (pendingInputs.length > 0) {\n const pendingInput = pendingInputs.shift();\n if (pendingInput === undefined) break;\n const result = reduce(workingState, pendingInput);\n if (result.type === \"reject\") {\n if (pendingInput === input) {\n return result;\n }\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${pendingInput.kind}'.`,\n );\n }\n\n workingState = result.state;\n terminal ??= result.terminal;\n events.push(...(result.events ?? []));\n\n if (afterInput) {\n const afterInputResult = afterInput(workingState, pendingInput);\n workingState = afterInputResult.state;\n trace.push(...afterInputResult.trace);\n }\n\n const instructionQueue = [...(result.instructions ?? [])];\n const continuationQueue: Input[] = [];\n while (instructionQueue.length > 0 || continuationQueue.length > 0) {\n if (instructionQueue.length > 0) {\n workingState = prepareForInstructionDrain(workingState);\n }\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n trace.push({\n type: \"appliedInstruction\",\n instruction,\n });\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n trace.push(...resolved.trace);\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n continuationQueue.push(...resolved.queuedInputs);\n }\n\n while (continuationQueue.length > 0) {\n const queued = continuationQueue.shift();\n if (queued === undefined) break;\n pendingInputs.push(queued);\n }\n }\n }\n\n return {\n type: \"accept\",\n state: workingState,\n trace,\n ...(terminal ? { terminal } : {}),\n events,\n };\n }\n\n return {\n dispatch,\n drainInstructions,\n };\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 traceEntry: string;\n};\n\nexport type MutableRandomHelpers = {\n random: RandomHelpers;\n currentRng: () => RuntimeRngState;\n};\n\nexport function sampleDieValue(\n sides: number,\n rng: RuntimeRngState,\n): {\n value: number;\n nextRng: RuntimeRngState;\n consumption: RngConsumption;\n} {\n const [offset, nextRng] = nextRandomInt(sides, rng);\n return {\n value: offset + 1,\n nextRng,\n consumption: {\n operation: \"rollDie\",\n traceEntry: nextRng.trace[nextRng.trace.length - 1] ?? \"\",\n },\n };\n}\n\nexport function shuffleWithRng<T>(\n values: readonly T[],\n rng: RuntimeRngState,\n operation:\n | \"shuffleSharedZone\"\n | \"shufflePlayerZone\"\n | \"randomSubset\" = \"shuffleSharedZone\",\n): {\n orderedValues: T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n const orderedValues = [...values];\n let nextRng = rng;\n const consumptions: RngConsumption[] = [];\n for (\n let lastIndex = orderedValues.length - 1;\n lastIndex > 0;\n lastIndex -= 1\n ) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n consumptions.push({\n operation,\n traceEntry: updatedRng.trace[updatedRng.trace.length - 1] ?? \"\",\n });\n nextRng = updatedRng;\n const current = orderedValues[lastIndex];\n const swap = orderedValues[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `shuffleWithRng: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${orderedValues.length})`,\n );\n }\n orderedValues[lastIndex] = swap;\n orderedValues[swapIndex] = current;\n }\n return { orderedValues, nextRng, consumptions };\n}\n\nexport function subsetWithRng<T>(\n values: readonly T[],\n count: number,\n rng: RuntimeRngState,\n): {\n values: readonly T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n if (!Number.isInteger(count) || count < 0) {\n throw new Error(\"random.subset count must be a non-negative integer.\");\n }\n if (count > values.length) {\n throw new Error(\n `random.subset count ${count} exceeds source length ${values.length}.`,\n );\n }\n const shuffled = shuffleWithRng(values, rng, \"randomSubset\");\n return {\n values: shuffled.orderedValues.slice(0, count),\n nextRng: shuffled.nextRng,\n consumptions: shuffled.consumptions,\n };\n}\n\nexport function createMutableRandomHelpers(\n rng: RuntimeRngState,\n): MutableRandomHelpers {\n let current = rng;\n return {\n random: {\n subset(options) {\n const sampled = subsetWithRng(options.from, options.count, current);\n current = sampled.nextRng;\n return sampled.values;\n },\n },\n currentRng: () => current,\n };\n}\n\nexport function sampleRngCollectorValue(\n collector: InputCollector<SchemaLike<unknown>, CollectorState, \"rng\">,\n rng: RuntimeRngState,\n): { value: unknown; nextRng: RuntimeRngState } {\n const meta = collector.meta;\n switch (meta.rng) {\n case \"d6\": {\n const count = meta.count > 0 ? meta.count : 1;\n const values: number[] = [];\n let nextRng = rng;\n for (let i = 0; i < count; i += 1) {\n const sampled = sampleDieValue(6, nextRng);\n values.push(sampled.value);\n nextRng = sampled.nextRng;\n }\n return { value: { values }, nextRng };\n }\n case \"coin\": {\n const [offset, nextRng] = nextRandomInt(2, rng);\n return {\n value: { value: offset === 0 ? \"heads\" : \"tails\" },\n nextRng,\n };\n }\n default: {\n const _exhaustive: never = meta;\n throw new Error(\n `Unknown rngInput kind '${String(_exhaustive)}'. Register a sampler in trusted rng-sampler.`,\n );\n }\n }\n}\n","import type { DispatchTraceEntry, TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { ReducerGameContractLike } from \"../../model\";\nimport {\n cloneRuntimeTable,\n ensureArray,\n shufflePlayerZoneCards,\n} from \"../../table\";\nimport {\n sampleDieValue,\n shuffleWithRng,\n type RngConsumption,\n} from \"./rng-sampler\";\nimport type {\n TrustedInput,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype EngineInstructionResult<\n State,\n PlayerId extends string,\n ReducerInput extends TrustedRuntimeInput<PlayerId>,\n> = {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n};\n\nfunction toRngTrace<\n State,\n PlayerId extends string,\n ReducerInput extends TrustedRuntimeInput<PlayerId>,\n>(\n consumptions: readonly RngConsumption[],\n): DispatchTraceEntry<State, PlayerId, ReducerInput>[] {\n return consumptions.map((consumption) => ({\n type: \"rngConsumption\" as const,\n operation: consumption.operation,\n traceEntry: consumption.traceEntry,\n }));\n}\n\nexport function createEngineInstructionResolver<\n Contract extends ReducerGameContractLike,\n>() {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveRollDieDraft(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.rollDie\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const die = state.table.dice[instruction.dieId];\n if (!die) {\n throw new Error(`Cannot roll unknown die '${instruction.dieId}'.`);\n }\n if (!Number.isInteger(die.sides) || die.sides <= 0) {\n throw new Error(\n `Cannot roll die '${instruction.dieId}' with invalid sides '${die.sides}'.`,\n );\n }\n const sampled = sampleDieValue(die.sides, state.runtime.rng);\n state.table.dice[instruction.dieId] = {\n ...die,\n value: sampled.value,\n };\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"rollDie\",\n response: {\n dieId: instruction.dieId,\n value: sampled.value,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n runtime: {\n ...state.runtime,\n rng: sampled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>([sampled.consumption]),\n };\n }\n\n function resolveRollDie(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.rollDie\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const nextTable = cloneRuntimeTable(state.table);\n return resolveRollDieDraft(\n {\n ...state,\n table: nextTable,\n },\n instruction,\n );\n }\n\n function resolveShuffleSharedZoneDraft(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shuffleSharedZone\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const deckCards = [...ensureArray(state.table.decks[instruction.zoneId])];\n const shuffled = shuffleWithRng(deckCards, state.runtime.rng);\n const orderedCardIds = [...shuffled.orderedValues];\n state.table.decks[instruction.zoneId] = shuffled.orderedValues;\n state.table.zones.shared[instruction.zoneId] = [...shuffled.orderedValues];\n for (const [index, cardId] of shuffled.orderedValues.entries()) {\n const currentLocation = state.table.componentLocations[cardId];\n state.table.componentLocations[cardId] =\n currentLocation?.type === \"InDeck\" || currentLocation?.type === \"InZone\"\n ? {\n ...currentLocation,\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: currentLocation.playedBy ?? null,\n position: index,\n }\n : {\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: null,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shuffleSharedZone\",\n response: {\n zoneId: instruction.zoneId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n function resolveShuffleSharedZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shuffleSharedZone\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const nextTable = cloneRuntimeTable(state.table);\n return resolveShuffleSharedZoneDraft(\n {\n ...state,\n table: nextTable,\n },\n instruction,\n );\n }\n\n function resolveShufflePlayerZoneDraft(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shufflePlayerZone\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const zoneCards = shufflePlayerZoneCards(\n state.table,\n instruction.zoneId,\n instruction.playerId,\n );\n const shuffled = shuffleWithRng(\n zoneCards,\n state.runtime.rng,\n \"shufflePlayerZone\",\n );\n const orderedCardIds = [...shuffled.orderedValues];\n shufflePlayerZoneCards(\n state.table,\n instruction.zoneId,\n instruction.playerId,\n orderedCardIds,\n );\n for (const [index, cardId] of orderedCardIds.entries()) {\n const currentLocation = state.table.componentLocations[cardId];\n state.table.componentLocations[cardId] =\n currentLocation?.type === \"InHand\"\n ? {\n ...currentLocation,\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n }\n : {\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shufflePlayerZone\",\n response: {\n zoneId: instruction.zoneId,\n playerId: instruction.playerId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n function resolveShufflePlayerZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shufflePlayerZone\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const nextTable = cloneRuntimeTable(state.table);\n return resolveShufflePlayerZoneDraft(\n {\n ...state,\n table: nextTable,\n },\n instruction,\n );\n }\n\n return {\n resolveRollDie,\n resolveRollDieDraft,\n resolveShuffleSharedZone,\n resolveShuffleSharedZoneDraft,\n resolveShufflePlayerZone,\n resolveShufflePlayerZoneDraft,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport type {\n TrustedInput,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createFlowInstructionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>) {\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveTransition(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"flow.transition\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const initialized = lifecycle.initializePhaseResult(\n {\n ...state,\n flow: {\n ...state.flow,\n currentPhase:\n instruction.to as unknown as State[\"flow\"][\"currentPhase\"],\n },\n runtime: {\n ...state.runtime,\n lastTransition: {\n from: state.flow.currentPhase,\n to: instruction.to,\n },\n } as State[\"runtime\"],\n },\n instruction.to as PhaseName,\n );\n return {\n state: initialized.state,\n queuedInputs: [],\n queuedInstructions: initialized.instructions,\n trace: [],\n };\n }\n\n return {\n resolveTransition,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\nexport const SIMULTANEOUS_SUBMIT_INTERACTION_ID = \"submit\";\n\ntype ErasedPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n TrustedRuntimeScope<Contract, Definitions, Views>[\"phaseByName\"]\n>;\n\nexport function isSimultaneousPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(phase: ErasedPhase<Contract, Definitions, Views>): boolean {\n return phase.kind === \"simultaneousPlayer\";\n}\n\nexport function simultaneousSubmitInteraction<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n phase: ErasedPhase<Contract, Definitions, Views>,\n):\n | AnyInteractionSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>\n | undefined {\n return (phase as { submit?: unknown }).submit as\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n}\n\nfunction resolvePromptToArray<PlayerId extends string>(\n value: unknown,\n): PlayerId[] {\n if (value === undefined || value === null) return [];\n if (Array.isArray(value)) return value as PlayerId[];\n if (typeof value === \"string\") return [value as PlayerId];\n return [];\n}\n\nexport function resolveSimultaneousActors<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n state: TrustedState<Contract>,\n phase: ErasedPhase<Contract, Definitions, Views>,\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >,\n): TrustedPlayerId<Contract>[] {\n type PlayerId = TrustedPlayerId<Contract>;\n const selector =\n (phase as { actors?: unknown; actor?: unknown }).actors ??\n (phase as { actor?: unknown }).actor;\n if (typeof selector === \"function\") {\n const selected = selector(\n scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n );\n const resolved = resolvePromptToArray<PlayerId>(selected);\n if (resolved.length > 0) {\n return resolved;\n }\n }\n const active = state.flow.activePlayers as PlayerId[];\n if (active.length > 0) {\n return [...active];\n }\n return [...(state.table.playerOrder as PlayerId[])];\n}\n","/**\n * Curried state writers for use with `pipe`.\n *\n * Each entry in the returned `ops` namespace is a curried transformation\n * `(args) => (state) => state` that can be composed with `pipe`:\n *\n * const ops = createReducerOps<GameState>();\n *\n * return accept(\n * pipe(state,\n * ops.setActivePlayers([playerId]),\n * ops.moveCardFromPlayerZoneToSharedZone({\n * playerId,\n * fromZoneId: \"things-hand\",\n * toZoneId: \"ring-1\",\n * cardId: \"a-dog\",\n * }),\n * ),\n * );\n *\n * The factory binds all ops to a specific `State` type so that ID arguments\n * (deck ids, card ids, etc.) are checked against the manifest-derived table\n * shape of the game.\n */\nimport type { Op } from \"./compose\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n CardIdOfTable,\n CompatibleHandIdForDeck,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HiddenStateOfState,\n PhaseStateOfState,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n PrivateStateOfState,\n PublicStateOfState,\n ResourceAmountsOfTable,\n ResourceIdOfTable,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"./model\";\nimport {\n asPlayerId,\n perPlayerGet,\n perPlayerSet,\n type PerPlayer,\n} from \"./per-player\";\nimport {\n addCardToSharedZone as tableAddCardToSharedZone,\n addCardToSharedZoneInPlace as tableAddCardToSharedZoneInPlace,\n addPlayerResources as tableAddPlayerResources,\n addPlayerResourcesInPlace as tableAddPlayerResourcesInPlace,\n cloneRuntimeTable,\n dealCardsFromDeckToHand as tableDealCardsFromDeckToHand,\n dealCardsFromDeckToHandInPlace as tableDealCardsFromDeckToHandInPlace,\n dealCardsBetweenPlayerZones as tableDealCardsBetweenPlayerZones,\n dealCardsBetweenPlayerZonesInPlace as tableDealCardsBetweenPlayerZonesInPlace,\n moveCardBetweenPlayerZones as tableMoveCardBetweenPlayerZones,\n moveCardBetweenPlayerZonesInPlace as tableMoveCardBetweenPlayerZonesInPlace,\n moveCardBetweenSharedZones as tableMoveCardBetweenSharedZones,\n moveCardBetweenSharedZonesInPlace as tableMoveCardBetweenSharedZonesInPlace,\n moveCardFromPlayerZoneToSharedZone as tableMoveCardFromPlayerZoneToSharedZone,\n moveCardFromPlayerZoneToSharedZoneInPlace as tableMoveCardFromPlayerZoneToSharedZoneInPlace,\n moveCardFromSharedZoneToPlayerZone as tableMoveCardFromSharedZoneToPlayerZone,\n moveCardFromSharedZoneToPlayerZoneInPlace as tableMoveCardFromSharedZoneToPlayerZoneInPlace,\n moveComponentToContainer as tableMoveComponentToContainer,\n moveComponentToContainerInPlace as tableMoveComponentToContainerInPlace,\n moveComponentToDetached as tableMoveComponentToDetached,\n moveComponentToDetachedInPlace as tableMoveComponentToDetachedInPlace,\n moveComponentToEdge as tableMoveComponentToEdge,\n moveComponentToEdgeInPlace as tableMoveComponentToEdgeInPlace,\n moveComponentToSpace as tableMoveComponentToSpace,\n moveComponentToSpaceInPlace as tableMoveComponentToSpaceInPlace,\n moveComponentToVertex as tableMoveComponentToVertex,\n moveComponentToVertexInPlace as tableMoveComponentToVertexInPlace,\n removeCardFromSharedZone as tableRemoveCardFromSharedZone,\n removeCardFromSharedZoneInPlace as tableRemoveCardFromSharedZoneInPlace,\n setActivePlayers as stateSetActivePlayers,\n setPhaseState as stateSetPhaseState,\n setPlayerResource as tableSetPlayerResource,\n setPlayerResourceInPlace as tableSetPlayerResourceInPlace,\n spendPlayerResources as tableSpendPlayerResources,\n spendPlayerResourcesInPlace as tableSpendPlayerResourcesInPlace,\n transferPlayerResources as tableTransferPlayerResources,\n transferPlayerResourcesInPlace as tableTransferPlayerResourcesInPlace,\n} from \"./table\";\n\n/**\n * Minimum shape required for any state targeted by reducer ops.\n *\n * All curried writers operate on a game state with a `table` field.\n */\nexport type ReducerStateBase = {\n table: RuntimeTableRecord;\n};\n\ntype PipeTable<State extends ReducerStateBase> = TableOfState<State>;\n\n/**\n * A shallow patch for a slice of state. Either a partial object to merge\n * over the previous value, or a functional updater `(prev) => next`.\n */\nexport type StatePatch<T> = Partial<T> | ((prev: T) => T);\n\n/**\n * Curried writer namespace for a specific game state type.\n *\n * Created via {@link createReducerOps}.\n */\nexport interface ReducerOps<State extends ReducerStateBase> {\n // --- Flow ------------------------------------------------------------\n\n /** Set the list of players whose turn is currently active. */\n setActivePlayers(\n activePlayers: ReadonlyArray<PlayerIdOfState<State>>,\n ): Op<State>;\n\n /**\n * Advance `flow.activePlayers` to the single next seat in `playerOrder`.\n *\n * Uses `state.flow.activePlayers[0]` as the current seat (or the first\n * seat in `playerOrder` when `activePlayers` is empty) and sets\n * `activePlayers` to `[q.player.nextInOrder(current)]`. No-op when the\n * player order is empty.\n */\n advanceActivePlayer(): Op<State>;\n\n // --- Author-owned state slices --------------------------------------\n\n /**\n * Update the current phase's local state.\n *\n * Accepts either a `Partial<PhaseState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PhaseState`.\n */\n patchPhaseState(patch: StatePatch<PhaseStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.publicState`.\n *\n * Accepts either a `Partial<PublicState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PublicState`.\n */\n patchPublicState(patch: StatePatch<PublicStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.hiddenState`.\n *\n * Accepts either a `Partial<HiddenState>` or a functional updater.\n */\n patchHiddenState(patch: StatePatch<HiddenStateOfState<State>>): Op<State>;\n\n /**\n * Update a single player's entry in `state.privateState`.\n *\n * Accepts either a `Partial<PrivateState>` or a functional updater.\n */\n patchPlayerPrivateState(args: {\n playerId: PlayerIdOfState<State>;\n patch: StatePatch<PrivateStateOfState<State>>;\n }): Op<State>;\n\n // --- Shared zones / decks -------------------------------------------\n\n /**\n * Append a card to a shared zone (deck). Defaults to placing the card at the\n * bottom; pass `position: \"top\"` for top-of-deck placement (e.g. Bureaucrat-style).\n */\n addCardToSharedZone<\n DeckId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /** Remove a card from a shared zone (deck). */\n removeCardFromSharedZone<\n DeckId extends DeckIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n }): Op<State>;\n\n /**\n * Move a card between two shared zones (decks). Defaults to placing the card\n * at the bottom of the destination; pass `position: \"top\"` for top placement.\n */\n moveCardBetweenSharedZones<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<PipeTable<State>, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Draw the top `count` cards from one perPlayer zone into another for the\n * same player (e.g. deck → hand at the start of a turn). Companion to\n * {@link dealCardsToPlayerZone} for the perPlayer → perPlayer case. Stops\n * silently if the source runs out before `count` is reached.\n */\n dealCardsBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Move a card between two perPlayer zones owned by the same player (e.g.\n * hand → in-play → discard). Owner is preserved; visibility is recomputed\n * from the destination zone.\n */\n moveCardBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a card from a player zone (hand) to a shared zone (deck). Defaults to\n * placing the card at the bottom; pass `position: \"top\"` to topdeck.\n */\n moveCardFromPlayerZoneToSharedZone<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer\n * zone (e.g. discard). The \"gain\" verb in deck-builders. Distinct from\n * {@link dealCardsToPlayerZone}, which draws unspecified top-N cards from a\n * deck. Owner flips to the receiving player; visibility is recomputed.\n */\n moveCardFromSharedZoneToPlayerZone<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n ToZoneId,\n FromZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Deal the top `count` cards from a shared deck into a player's hand zone.\n *\n * This op does not consume RNG. If the deck needs to be random, shuffle it\n * first with `fx.shuffleSharedZone(...)`, then deal from the shuffled deck\n * inside the same reducer via this op.\n */\n dealCardsToPlayerZone<\n FromZoneId extends DeckIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n ToZoneId extends CompatibleHandIdForDeck<PipeTable<State>, FromZoneId> &\n HandIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n playerId: PlayerId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Atomically rotate cards in a per-player zone around the table.\n *\n * Defaults to rotating every card currently in `zoneId` for every player in\n * turn order. Pass `players` to use a smaller explicit order, or\n * `cardIdsByPlayer` to rotate only selected cards such as Hearts passes.\n */\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<PipeTable<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n // --- Board / component movement -------------------------------------\n\n /** Move a component onto a board space. */\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n SpaceId extends SpaceIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): Op<State>;\n\n /** Move a component into a board container. */\n moveComponentToContainer<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n ContainerId extends BoardContainerIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n containerId: ContainerId;\n }): Op<State>;\n\n /** Move a component onto a tiled board edge. */\n moveComponentToEdge<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n EdgeId extends TiledEdgeIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n edgeId: EdgeId;\n }): Op<State>;\n\n /** Move a component onto a tiled board vertex. */\n moveComponentToVertex<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n VertexId extends TiledVertexIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n vertexId: VertexId;\n }): Op<State>;\n\n /** Move a component back to the detached pool. */\n moveComponentToDetached<\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n }): Op<State>;\n\n // --- Resources ------------------------------------------------------\n\n /**\n * Credit the specified resources to a player.\n *\n * Amounts must be non-negative; use {@link spendResources} for deductions\n * so that affordability is checked explicitly.\n *\n * pipe(\n * state,\n * ops.addResources({ playerId, amounts: { wood: 1, brick: 1 } }),\n * )\n */\n addResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Debit the specified resources from a player.\n *\n * Throws when the player cannot afford the full cost — gate with\n * `q.player.canAfford(...)` in your `validate` step before invoking.\n *\n * pipe(\n * state,\n * ops.spendResources({ playerId, amounts: COST_DEV_CARD }),\n * ops.dealCardsToPlayerZone({ ... }),\n * )\n */\n spendResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Transfer the specified resources from one player to another.\n *\n * Throws when the source cannot afford the full amount. On success the\n * destination gains exactly what the source loses.\n */\n transferResources(args: {\n fromPlayerId: PlayerIdOfTable<PipeTable<State>>;\n toPlayerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Overwrite a single resource balance for a player. Prefer\n * {@link addResources} / {@link spendResources} — use this only when the\n * new balance is an absolute (e.g. scripted setup).\n */\n setResource(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n resourceId: ResourceIdOfTable<PipeTable<State>>;\n amount: number;\n }): Op<State>;\n}\n\nexport type ReducerOpsInternal<State extends ReducerStateBase> = {\n [Key in keyof ReducerOps<State>]: ReducerOps<State>[Key] extends (\n ...args: infer Args\n ) => Op<State>\n ? (state: State, ...args: Args) => State\n : never;\n};\n\nconst reducerOpsInternal = Symbol(\"dreamboard.reducerOpsInternal\");\n\ntype ReducerOpsWithInternal<State extends ReducerStateBase> =\n ReducerOps<State> & {\n [reducerOpsInternal]?: ReducerOpsInternal<State>;\n };\n\nexport function getReducerOpsInternal<State extends ReducerStateBase>(\n ops: ReducerOps<State>,\n): ReducerOpsInternal<State> {\n const attached = (ops as ReducerOpsWithInternal<State>)[reducerOpsInternal];\n if (attached) {\n return attached;\n }\n\n return Object.fromEntries(\n Object.keys(ops).map((key) => [\n key,\n (state: State, ...args: readonly unknown[]) =>\n (\n ops[key as keyof ReducerOps<State>] as unknown as (\n ...args: readonly unknown[]\n ) => Op<State>\n )(...args)(state),\n ]),\n ) as ReducerOpsInternal<State>;\n}\n\n// --- Internal helpers -----------------------------------------------\n\ntype AnyTable = RuntimeTableRecord;\ntype AnyState = { table: AnyTable };\n\nfunction updateTable<S extends AnyState>(state: S, nextTable: AnyTable): S {\n return { ...state, table: nextTable };\n}\n\nfunction computePlayerZoneVisibility(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction readPlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): readonly string[] {\n const zone = table.zones.perPlayer[zoneId] ?? table.hands[zoneId];\n if (!zone) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n return (\n perPlayerGet(zone as PerPlayer<readonly string[]>, asPlayerId(playerId)) ??\n []\n );\n}\n\nfunction writePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n cards: readonly string[],\n): void {\n const currentZone = table.zones.perPlayer[zoneId];\n const currentHand = table.hands[zoneId];\n const player = asPlayerId(playerId);\n if (currentZone) {\n table.zones.perPlayer[zoneId] = perPlayerSet(\n currentZone as PerPlayer<string[]>,\n player,\n [...cards],\n );\n }\n if (currentHand) {\n table.hands[zoneId] = perPlayerSet(\n currentHand as PerPlayer<string[]>,\n player,\n [...cards],\n );\n }\n}\n\nfunction assertCardAllowedInPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n cardId: string,\n): void {\n const allowedCardSetIds = table.zones.cardSetIdsByZoneId?.[zoneId];\n if (!allowedCardSetIds || allowedCardSetIds.length === 0) {\n return;\n }\n const card = table.cards[cardId];\n if (!card) {\n throw new Error(`Card '${cardId}' does not exist.`);\n }\n if (!allowedCardSetIds.includes(card.cardSetId)) {\n throw new Error(\n `Card '${cardId}' from set '${card.cardSetId}' is not allowed in player zone '${zoneId}'.`,\n );\n }\n}\n\nfunction rotatePlayerZoneTable(options: {\n table: RuntimeTableRecord;\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n}): RuntimeTableRecord {\n const nextTable = cloneRuntimeTable(options.table);\n rotatePlayerZoneTableInPlace({\n ...options,\n table: nextTable,\n });\n return nextTable;\n}\n\nfunction rotatePlayerZoneTableInPlace(options: {\n table: RuntimeTableRecord;\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n}): void {\n const nextTable = options.table;\n const zoneId = options.zoneId;\n if (!nextTable.zones.perPlayer[zoneId] && !nextTable.hands[zoneId]) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n const players = [...(options.players ?? nextTable.playerOrder)];\n if (players.length === 0) {\n return;\n }\n const playerSet = new Set(nextTable.playerOrder);\n for (const playerId of players) {\n if (!playerSet.has(playerId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': player '${playerId}' is not in player order.`,\n );\n }\n }\n\n const selectedByPlayer = new Map<string, readonly string[]>();\n for (const playerId of players) {\n const sourceCards = readPlayerZoneCards(nextTable, zoneId, playerId);\n const selected = options.cardIdsByPlayer?.[playerId] ?? sourceCards;\n for (const cardId of selected) {\n if (!sourceCards.includes(cardId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': card '${cardId}' is not in zone for player '${playerId}'.`,\n );\n }\n assertCardAllowedInPlayerZone(nextTable, zoneId, cardId);\n }\n selectedByPlayer.set(playerId, [...selected]);\n }\n\n const removeByPlayer = new Map<string, string[]>();\n for (const playerId of players) {\n const selected = new Set(selectedByPlayer.get(playerId) ?? []);\n removeByPlayer.set(\n playerId,\n readPlayerZoneCards(nextTable, zoneId, playerId).filter(\n (cardId) => !selected.has(cardId),\n ),\n );\n }\n\n const additionsByPlayer = new Map<string, string[]>(\n players.map((playerId) => [playerId, []]),\n );\n for (const [index, fromPlayerId] of players.entries()) {\n const offset = options.direction === \"left\" ? 1 : -1;\n const recipient =\n players[(index + offset + players.length) % players.length]!;\n additionsByPlayer\n .get(recipient)!\n .push(...(selectedByPlayer.get(fromPlayerId) ?? []));\n }\n\n for (const playerId of players) {\n const remaining = removeByPlayer.get(playerId) ?? [];\n const additions = additionsByPlayer.get(playerId) ?? [];\n const nextCards =\n options.position === \"top\"\n ? [...additions, ...remaining]\n : [...remaining, ...additions];\n writePlayerZoneCards(nextTable, zoneId, playerId, nextCards);\n for (const [position, cardId] of nextCards.entries()) {\n nextTable.componentLocations[cardId] = {\n type: \"InHand\",\n handId: zoneId,\n playerId,\n position,\n };\n nextTable.ownerOfCard[cardId] = playerId;\n nextTable.visibility[cardId] = computePlayerZoneVisibility(\n nextTable,\n zoneId,\n playerId,\n );\n }\n }\n}\n\n/**\n * Internal, id-type-erased signatures for the board writer family.\n *\n * The public `tableMove*` helpers constrain their id args to manifest-derived\n * unions such as `TiledBoardIdOfTable<Table>`, which collapse to `never` for\n * the unconstrained `RuntimeTableRecord`. Inside `createReducerOps<State>`\n * the `State` generic is not yet bound, so at this call site we only know\n * that all ids are plain strings. These aliases narrow that distinction to\n * one place instead of leaking `as never` casts across every op body.\n */\ntype TableMoveComponentToEdgeInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n) => RuntimeTableRecord;\n\ntype TableMoveComponentToEdgeInPlaceInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n) => void;\n\ntype TableMoveComponentToVertexInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n) => RuntimeTableRecord;\n\ntype TableMoveComponentToVertexInPlaceInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n) => void;\n\ntype TableDealCardsFromDeckToHandInternal = (\n table: RuntimeTableRecord,\n fromZoneId: string,\n playerId: string,\n toZoneId: string,\n count: number,\n) => RuntimeTableRecord;\n\ntype TableDealCardsFromDeckToHandInPlaceInternal = (\n table: RuntimeTableRecord,\n fromZoneId: string,\n playerId: string,\n toZoneId: string,\n count: number,\n) => void;\n\nconst moveComponentToEdgeInternal =\n tableMoveComponentToEdge as unknown as TableMoveComponentToEdgeInternal;\nconst moveComponentToEdgeInPlaceInternal =\n tableMoveComponentToEdgeInPlace as unknown as TableMoveComponentToEdgeInPlaceInternal;\nconst moveComponentToVertexInternal =\n tableMoveComponentToVertex as unknown as TableMoveComponentToVertexInternal;\nconst moveComponentToVertexInPlaceInternal =\n tableMoveComponentToVertexInPlace as unknown as TableMoveComponentToVertexInPlaceInternal;\nconst dealCardsFromDeckToHandInternal =\n tableDealCardsFromDeckToHand as unknown as TableDealCardsFromDeckToHandInternal;\nconst dealCardsFromDeckToHandInPlaceInternal =\n tableDealCardsFromDeckToHandInPlace as unknown as TableDealCardsFromDeckToHandInPlaceInternal;\n\n/**\n * Create the `ops.*` namespace specialised to a game state.\n *\n * Call this once (typically in a shared reducer-support module) and reuse the\n * resulting object across phases:\n *\n * export const ops = createReducerOps<GameState>();\n */\nexport function createReducerOps<\n State extends ReducerStateBase,\n>(): ReducerOps<State> {\n // The implementation operates on the structural `AnyState` shape; the\n // public `ReducerOps<State>` interface adds manifest-aware argument\n // validation and polymorphic state preservation on top. The final\n // `as unknown as ReducerOps<State>` bridges the two: all runtime\n // correctness is still covered by the underlying table-ops writers.\n const applyPatch = <T extends object>(\n prev: T,\n patch: Partial<T> | ((prev: T) => T),\n ): T => {\n if (typeof patch === \"function\") {\n return (patch as (prev: T) => T)(prev);\n }\n return { ...prev, ...patch };\n };\n\n const impl = {\n setActivePlayers(activePlayers: ReadonlyArray<string>) {\n return <S extends AnyState>(state: S): S =>\n stateSetActivePlayers(\n state as unknown as never,\n [...activePlayers] as never,\n ) as unknown as S;\n },\n advanceActivePlayer() {\n return <S extends AnyState>(state: S): S => {\n const table = (state as unknown as { table: RuntimeTableRecord }).table;\n const order = table.playerOrder as ReadonlyArray<string>;\n if (order.length === 0) return state;\n const flow = (\n state as unknown as { flow?: { activePlayers?: readonly string[] } }\n ).flow;\n const current = flow?.activePlayers?.[0];\n const idx = current ? order.indexOf(current) : -1;\n const nextIdx = idx < 0 ? 0 : (idx + 1) % order.length;\n const nextId = order[nextIdx];\n if (nextId === undefined) return state;\n return stateSetActivePlayers(\n state as unknown as never,\n [nextId] as never,\n ) as unknown as S;\n };\n },\n patchPhaseState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev = (state as unknown as { phase?: object }).phase ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return stateSetPhaseState(\n state as unknown as { phase: object },\n next as object,\n ) as unknown as S;\n };\n },\n patchPublicState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { publicState?: object }).publicState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, publicState: next } as S;\n };\n },\n patchHiddenState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { hiddenState?: object }).hiddenState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, hiddenState: next } as S;\n };\n },\n patchPlayerPrivateState(args: { playerId: string; patch: unknown }) {\n return <S extends AnyState>(state: S): S => {\n const privateByPlayer =\n (state as unknown as { privateState?: Record<string, object> })\n .privateState ?? {};\n const prev = (privateByPlayer[args.playerId] ?? {}) as object;\n const next = applyPatch(\n prev,\n args.patch as Partial<object> | ((prev: object) => object),\n );\n return {\n ...state,\n privateState: {\n ...privateByPlayer,\n [args.playerId]: next,\n },\n } as S;\n };\n },\n addCardToSharedZone(args: {\n deckId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddCardToSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n args.playedBy ?? null,\n args.position ?? \"bottom\",\n );\n return updateTable(state, nextTable);\n };\n },\n removeCardFromSharedZone(args: { deckId: string; cardId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableRemoveCardFromSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenSharedZones(args: {\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenSharedZones({\n table: state.table,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableDealCardsBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n count: args.count,\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromPlayerZoneToSharedZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromPlayerZoneToSharedZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromSharedZoneToPlayerZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromSharedZoneToPlayerZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsToPlayerZone(args: {\n fromZoneId: string;\n playerId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = dealCardsFromDeckToHandInternal(\n state.table,\n args.fromZoneId,\n args.playerId,\n args.toZoneId,\n args.count,\n );\n return updateTable(state, nextTable);\n };\n },\n rotatePlayerZone(args: {\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = rotatePlayerZoneTable({\n table: state.table,\n zoneId: args.zoneId,\n direction: args.direction,\n players: args.players,\n cardIdsByPlayer: args.cardIdsByPlayer,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveComponentToSpace(args: {\n componentId: string;\n boardId: string;\n spaceId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToSpace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToContainer(args: {\n componentId: string;\n boardId: string;\n containerId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToContainer(\n state.table,\n args.componentId,\n args.boardId,\n args.containerId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToEdge(args: {\n componentId: string;\n boardId: string;\n edgeId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToEdgeInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToVertex(args: {\n componentId: string;\n boardId: string;\n vertexId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToVertexInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToDetached(args: { componentId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToDetached(\n state.table,\n args.componentId,\n );\n return updateTable(state, nextTable);\n };\n },\n addResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n spendResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSpendPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n transferResources(args: {\n fromPlayerId: string;\n toPlayerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableTransferPlayerResources(\n state.table,\n args.fromPlayerId,\n args.toPlayerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n setResource(args: {\n playerId: string;\n resourceId: string;\n amount: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSetPlayerResource(\n state.table,\n args.playerId,\n args.resourceId,\n args.amount,\n );\n return updateTable(state, nextTable);\n };\n },\n };\n\n const internal = {\n setActivePlayers<S extends AnyState>(\n state: S,\n activePlayers: ReadonlyArray<string>,\n ): S {\n return stateSetActivePlayers(\n state as unknown as never,\n [...activePlayers] as never,\n ) as unknown as S;\n },\n advanceActivePlayer<S extends AnyState>(state: S): S {\n const table = (state as unknown as { table: RuntimeTableRecord }).table;\n const order = table.playerOrder as ReadonlyArray<string>;\n if (order.length === 0) return state;\n const flow = (\n state as unknown as { flow?: { activePlayers?: readonly string[] } }\n ).flow;\n const current = flow?.activePlayers?.[0];\n const idx = current ? order.indexOf(current) : -1;\n const nextIdx = idx < 0 ? 0 : (idx + 1) % order.length;\n const nextId = order[nextIdx];\n if (nextId === undefined) return state;\n return stateSetActivePlayers(\n state as unknown as never,\n [nextId] as never,\n ) as unknown as S;\n },\n patchPhaseState<S extends AnyState>(state: S, patch: unknown): S {\n const prev = (state as unknown as { phase?: object }).phase ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return stateSetPhaseState(\n state as unknown as { phase: object },\n next as object,\n ) as unknown as S;\n },\n patchPublicState<S extends AnyState>(state: S, patch: unknown): S {\n const prev =\n (state as unknown as { publicState?: object }).publicState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, publicState: next } as S;\n },\n patchHiddenState<S extends AnyState>(state: S, patch: unknown): S {\n const prev =\n (state as unknown as { hiddenState?: object }).hiddenState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, hiddenState: next } as S;\n },\n patchPlayerPrivateState<S extends AnyState>(\n state: S,\n args: { playerId: string; patch: unknown },\n ): S {\n const privateByPlayer =\n (state as unknown as { privateState?: Record<string, object> })\n .privateState ?? {};\n const prev = (privateByPlayer[args.playerId] ?? {}) as object;\n const next = applyPatch(\n prev,\n args.patch as Partial<object> | ((prev: object) => object),\n );\n return {\n ...state,\n privateState: {\n ...privateByPlayer,\n [args.playerId]: next,\n },\n } as S;\n },\n addCardToSharedZone<S extends AnyState>(\n state: S,\n args: {\n deckId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableAddCardToSharedZoneInPlace(\n state.table,\n args.deckId,\n args.cardId,\n args.playedBy ?? null,\n args.position ?? \"bottom\",\n );\n return state;\n },\n removeCardFromSharedZone<S extends AnyState>(\n state: S,\n args: { deckId: string; cardId: string },\n ): S {\n tableRemoveCardFromSharedZoneInPlace(\n state.table,\n args.deckId,\n args.cardId,\n );\n return state;\n },\n moveCardBetweenSharedZones<S extends AnyState>(\n state: S,\n args: {\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardBetweenSharedZonesInPlace({\n table: state.table,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n dealCardsBetweenPlayerZones<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n count: number;\n },\n ): S {\n tableDealCardsBetweenPlayerZonesInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n count: args.count,\n });\n return state;\n },\n moveCardBetweenPlayerZones<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardBetweenPlayerZonesInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveCardFromPlayerZoneToSharedZone<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardFromPlayerZoneToSharedZoneInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveCardFromSharedZoneToPlayerZone<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardFromSharedZoneToPlayerZoneInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n dealCardsToPlayerZone<S extends AnyState>(\n state: S,\n args: {\n fromZoneId: string;\n playerId: string;\n toZoneId: string;\n count: number;\n },\n ): S {\n dealCardsFromDeckToHandInPlaceInternal(\n state.table,\n args.fromZoneId,\n args.playerId,\n args.toZoneId,\n args.count,\n );\n return state;\n },\n rotatePlayerZone<S extends AnyState>(\n state: S,\n args: {\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n rotatePlayerZoneTableInPlace({\n table: state.table,\n zoneId: args.zoneId,\n direction: args.direction,\n players: args.players,\n cardIdsByPlayer: args.cardIdsByPlayer,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveComponentToSpace<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; spaceId: string },\n ): S {\n tableMoveComponentToSpaceInPlace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n );\n return state;\n },\n moveComponentToContainer<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; containerId: string },\n ): S {\n tableMoveComponentToContainerInPlace(\n state.table,\n args.componentId,\n args.boardId,\n args.containerId,\n );\n return state;\n },\n moveComponentToEdge<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; edgeId: string },\n ): S {\n moveComponentToEdgeInPlaceInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n );\n return state;\n },\n moveComponentToVertex<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; vertexId: string },\n ): S {\n moveComponentToVertexInPlaceInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n );\n return state;\n },\n moveComponentToDetached<S extends AnyState>(\n state: S,\n args: { componentId: string },\n ): S {\n tableMoveComponentToDetachedInPlace(state.table, args.componentId);\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(\n state.table,\n args.playerId,\n args.amounts,\n );\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\n const ops = impl as unknown as ReducerOpsWithInternal<State>;\n Object.defineProperty(ops, reducerOpsInternal, {\n value: internal as unknown as ReducerOpsInternal<State>,\n });\n return ops;\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n CardIdOfTable,\n ComponentDataOfTable,\n ComponentIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HexBoardIdOfTable,\n HexSpaceIdOfTable,\n PlayerIdOfTable,\n RelationTypeIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n TableQueries,\n TableQueriesOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexTypeIdOfTable,\n} from \"./model\";\nimport {\n getAdjacentSpaces,\n getAllPlayerZoneCards,\n getAllSharedZoneCards,\n getBoard,\n getBoardsByTypeId,\n getCard,\n getCardsById,\n getCardOwner,\n getCardVisibility,\n getSlotOccupants,\n getSlotOccupantsByHost,\n getComponentContainerLocation,\n getComponentDeckLocation,\n getComponentEdgeLocation,\n getComponentHandLocation,\n getComponentLocation,\n getComponentSlotLocation,\n getComponentSpaceLocation,\n getComponentVertexLocation,\n getComponentZoneLocation,\n getComponentsInContainer,\n getComponentsOnEdge,\n getComponentsOnSpace,\n getComponentsOnVertex,\n getContainer,\n getEdge,\n getEdgesByTypeId,\n getHexBoard,\n getHexSpace,\n getHexSpaceAt,\n getIncidentEdges,\n getIncidentVertices,\n canAffordResources,\n getMissingResources,\n getNextPlayerInOrder,\n getPlayerOrder,\n getPlayerResourceAmount,\n getPlayerResourceTotal,\n getPlayerResources,\n getPlayerZoneCardCollection,\n getPlayerZoneCards,\n getRelatedSpaces,\n getSharedZoneCardCollection,\n getSharedZoneCards,\n getSpace,\n getSpaceDistance,\n getSpaceEdges,\n getSpacesByTypeId,\n getSpaceVertices,\n getSquareBoard,\n getSquareDistance,\n getSquareNeighbors,\n getSquareSpace,\n getSquareSpaceAt,\n getTiledBoard,\n getVertex,\n getVerticesByTypeId,\n} from \"./table\";\n\nexport function createTableQueries<Table extends RuntimeTableRecord>(\n table: Table,\n): TableQueries<Table> {\n return {\n board: {\n get: <BoardId extends BoardIdOfTable<Table>>(boardId: BoardId) =>\n getBoard(table, boardId),\n hex: <BoardId extends HexBoardIdOfTable<Table>>(boardId: BoardId) =>\n getHexBoard(table, boardId),\n square: <BoardId extends SquareBoardIdOfTable<Table>>(boardId: BoardId) =>\n getSquareBoard(table, boardId),\n tiled: <BoardId extends TiledBoardIdOfTable<Table>>(boardId: BoardId) =>\n getTiledBoard(table, boardId),\n space: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSpace(table, boardId, spaceId),\n hexSpace: <\n BoardId extends HexBoardIdOfTable<Table>,\n SpaceId extends HexSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getHexSpace(table, boardId, spaceId),\n squareSpace: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSquareSpace(table, boardId, spaceId),\n container: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getContainer(table, boardId, containerId),\n edge: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getEdge(table, boardId, edgeId),\n vertex: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getVertex(table, boardId, vertexId),\n byType: <TypeId extends BoardTypeIdOfTable<Table>>(typeId: TypeId) =>\n getBoardsByTypeId(table, typeId),\n spacesByType: <\n BoardId extends BoardIdOfTable<Table>,\n TypeId extends SpaceTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getSpacesByTypeId(table, boardId, typeId),\n edgesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledEdgeTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getEdgesByTypeId(table, boardId, typeId),\n verticesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledVertexTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getVerticesByTypeId(table, boardId, typeId),\n adjacentSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getAdjacentSpaces(table, boardId, spaceId),\n relatedSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n TypeId extends RelationTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n ) => getRelatedSpaces(table, boardId, spaceId, relationTypeId),\n incidentEdges: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getIncidentEdges(table, boardId, vertexId),\n incidentVertices: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getIncidentVertices(table, boardId, edgeId),\n spaceEdges: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceEdges(table, boardId, spaceId),\n spaceVertices: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceVertices(table, boardId, spaceId),\n spaceDistance: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n ) => getSpaceDistance(table, boardId, fromSpaceId, toSpaceId),\n hexSpaceAt: <BoardId extends HexBoardIdOfTable<Table>>(\n boardId: BoardId,\n q: number,\n r: number,\n ) => getHexSpaceAt(table, boardId, q, r),\n squareSpaceAt: <BoardId extends SquareBoardIdOfTable<Table>>(\n boardId: BoardId,\n row: number,\n col: number,\n ) => getSquareSpaceAt(table, boardId, row, col),\n squareNeighbors: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ) => getSquareNeighbors(table, boardId, spaceId, options),\n squareDistance: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ) => getSquareDistance(table, boardId, fromSpaceId, toSpaceId, options),\n spaceOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getComponentsOnSpace(table, boardId, spaceId),\n containerOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getComponentsInContainer(table, boardId, containerId),\n edgeOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getComponentsOnEdge(table, boardId, edgeId),\n vertexOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getComponentsOnVertex(table, boardId, vertexId),\n },\n zone: {\n sharedCards: <ZoneId extends DeckIdOfTable<Table>>(zoneId: ZoneId) =>\n getSharedZoneCards(table, zoneId),\n sharedCardCollection: <ZoneId extends DeckIdOfTable<Table>>(\n zoneId: ZoneId,\n ) => getSharedZoneCardCollection(table, zoneId),\n allSharedCards: () => getAllSharedZoneCards(table),\n playerCards: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCards(table, playerId, zoneId),\n playerCardCollection: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCardCollection(table, playerId, zoneId),\n allPlayerCards: <ZoneId extends HandIdOfTable<Table>>(zoneId: ZoneId) =>\n getAllPlayerZoneCards(table, zoneId),\n },\n card: {\n get: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCard(table, cardId),\n byIds: <CardIds extends readonly CardIdOfTable<Table>[]>(\n cardIds: CardIds,\n ) => getCardsById(table, cardIds),\n owner: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardOwner(table, cardId),\n visibility: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardVisibility(table, cardId),\n },\n slot: {\n occupants: (host, slotId) => getSlotOccupants(table, host, slotId),\n occupantsByHost: (host) => getSlotOccupantsByHost(table, host),\n pieceOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"piece\", id: hostId }, slotId),\n pieceOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"piece\", id: hostId }),\n dieOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"die\", id: hostId }, slotId),\n dieOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"die\", id: hostId }),\n },\n player: {\n order: () => getPlayerOrder(table),\n nextInOrder: (playerId) => getNextPlayerInOrder(table, playerId),\n resources: (playerId) => getPlayerResources(table, playerId),\n resource: (playerId, resourceId) =>\n getPlayerResourceAmount(table, playerId, resourceId),\n resourceTotal: (playerId) => getPlayerResourceTotal(table, playerId),\n canAfford: (playerId, amounts) =>\n canAffordResources(table, playerId, amounts),\n missingResources: (playerId, amounts) =>\n getMissingResources(table, playerId, amounts),\n },\n component: {\n data: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) =>\n (table.cards[componentId] ??\n table.pieces[componentId] ??\n table.dice[componentId]) as\n | ComponentDataOfTable<Table, ComponentId>\n | undefined,\n location: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentLocation(table, componentId),\n deck: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentDeckLocation(table, componentId),\n hand: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentHandLocation(table, componentId),\n zone: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentZoneLocation(table, componentId),\n space: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSpaceLocation(table, componentId),\n container: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentContainerLocation(table, componentId),\n edge: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentEdgeLocation(table, componentId),\n vertex: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentVertexLocation(table, componentId),\n slot: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSlotLocation(table, componentId),\n },\n };\n}\n\nexport function createStateQueries<State extends { table: RuntimeTableRecord }>(\n state: State,\n): TableQueriesOfState<State> {\n return createTableQueries(\n state.table,\n ) as unknown as TableQueriesOfState<State>;\n}\n","import type { Op } from \"./compose\";\nimport type {\n BoardIdOfTable,\n CardIdOfTable,\n ComponentIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n TableOfState,\n TableQueriesOfState,\n} from \"./model\";\nimport {\n createReducerOps,\n getReducerOpsInternal,\n type ReducerOpsInternal,\n type ReducerOps,\n} from \"./ops\";\nimport { createStateQueries } from \"./table-queries\";\nimport { cloneRuntimeTable } from \"./table/clone\";\n\nexport type RotatePlayerZoneArgs<\n State extends { table: RuntimeTableRecord },\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>> = PlayerZoneIdOfTable<\n TableOfState<State>\n >,\n PlayerId extends PlayerIdOfTable<TableOfState<State>> = PlayerIdOfTable<\n TableOfState<State>\n >,\n> = {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<TableOfState<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n};\n\ntype TransactionMethods<State extends { table: RuntimeTableRecord }> = {\n [Key in Exclude<\n keyof ReducerOps<State>,\n \"moveComponentToSpace\"\n >]: ReducerOps<State>[Key] extends (...args: infer Args) => Op<State>\n ? (...args: Args) => State\n : never;\n} & {\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<TableOfState<State>>,\n SpaceId extends SpaceIdOfTable<TableOfState<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): State;\n};\n\nexport type ReducerTransaction<State extends { table: RuntimeTableRecord }> =\n TransactionMethods<State> & {\n readonly state: State;\n readonly q: TableQueriesOfState<State>;\n apply(op: Op<State>): State;\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(\n args: RotatePlayerZoneArgs<State, ZoneId, PlayerId>,\n ): State;\n };\n\nexport type ReducerEdit<State extends { table: RuntimeTableRecord }> = <\n DraftState extends State,\n>(\n state: DraftState,\n) => ReducerTransaction<DraftState>;\n\nconst transactionContext = Symbol(\"dreamboard.reducerTransactionContext\");\n\ntype TransactionContext<State extends { table: RuntimeTableRecord }> = {\n currentState: State;\n currentQueries: TableQueriesOfState<State> | null;\n internalOps: ReducerOpsInternal<State>;\n methodCache: Record<string, (...args: readonly unknown[]) => State>;\n applyMethod?: (op: Op<State>) => State;\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 applyTransactionOp<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n op: Op<State>,\n): State {\n context.currentState = op(context.currentState);\n invalidate(context);\n return context.currentState;\n}\n\nfunction runInternal<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n key: keyof ReducerOps<State>,\n args: readonly unknown[],\n): State {\n context.currentState = (\n context.internalOps[key] as unknown as (\n state: State,\n ...args: readonly unknown[]\n ) => State\n )(context.currentState, ...args);\n invalidate(context);\n return context.currentState;\n}\n\nfunction createReducerTransactionSurface<\n State extends { table: RuntimeTableRecord },\n>(ops: ReducerOps<State>) {\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(context.currentState);\n return context.currentQueries;\n },\n },\n apply: {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n context.applyMethod ??= (op: Op<State>) =>\n applyTransactionOp(context, op);\n return context.applyMethod;\n },\n },\n };\n\n for (const key of Object.keys(ops) as Array<keyof ReducerOps<State>>) {\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 Object.defineProperties(surface, descriptors);\n return surface;\n}\n\nfunction createReducerTransactionFromSurface<\n State extends { table: RuntimeTableRecord },\n>(\n initialState: State,\n internalOps: ReducerOpsInternal<State>,\n surface: object,\n): ReducerTransaction<State> {\n const transaction = Object.create(surface) as ReducerTransaction<State> &\n TransactionHost<State>;\n Object.defineProperty(transaction, transactionContext, {\n value: {\n currentState: {\n ...initialState,\n table: cloneRuntimeTable(initialState.table),\n },\n currentQueries: null,\n internalOps,\n methodCache: {},\n } satisfies TransactionContext<State>,\n });\n return transaction;\n}\n\nexport function createReducerTransaction<\n State extends { table: RuntimeTableRecord },\n>(initialState: State, ops: ReducerOps<State> = createReducerOps<State>()) {\n const internalOps = getReducerOpsInternal(ops);\n const surface = createReducerTransactionSurface(ops);\n return createReducerTransactionFromSurface(\n initialState,\n internalOps,\n surface,\n );\n}\n\nexport function createReducerEdit<State extends { table: RuntimeTableRecord }>(\n ops: ReducerOps<State> = createReducerOps<State>(),\n): ReducerEdit<State> {\n const internalOps = getReducerOpsInternal(ops);\n const surface = createReducerTransactionSurface(ops);\n return <DraftState extends State>(state: DraftState) =>\n createReducerTransactionFromSurface(\n state,\n internalOps as unknown as ReducerOpsInternal<DraftState>,\n surface,\n );\n}\n","import type {\n BaseGameStateOfContract,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\nimport type { AnyContinuationCallable } from \"../../model/spec/runtime-args\";\nimport {\n collectReducerDefinitionIndex,\n type ReducerDefinitionPhaseIndex,\n type ReducerIndexedCardActionEntry,\n type ReducerIndexedInteractionEntry,\n type ReducerIndexedPhase,\n type ReducerIndexedStageEntry,\n type ReducerIndexedZoneEntry,\n} from \"../../definition-index\";\n\nexport type TrustedErasedPhase<Contract extends ReducerGameContractLike> =\n ReducerIndexedPhase<Contract>;\n\nexport type TrustedInteractionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedInteractionEntry<Contract>;\n\nexport type TrustedCardActionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedCardActionEntry<Contract>;\n\nexport type TrustedStageEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedStageEntry<Contract>;\n\nexport type TrustedZoneEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedZoneEntry<Contract>;\n\nexport type TrustedContinuationRegistry<\n Contract extends ReducerGameContractLike,\n> = ReadonlyMap<\n string,\n AnyContinuationCallable<BaseGameStateOfContract<Contract>>\n>;\n\nexport type TrustedPhaseRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = Omit<ReducerDefinitionPhaseIndex<Contract, Definitions, Views>, \"effects\">;\n\nexport interface TrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n TrustedErasedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >;\n readonly continuationsById: TrustedContinuationRegistry<Contract>;\n readonly effectsById: ReadonlyMap<\n string,\n { readonly id: string; readonly type: string }\n >;\n}\n\nexport function collectTrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): TrustedRuntimeRegistry<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const index = collectReducerDefinitionIndex(definition);\n const phasesByName = new Map<\n PhaseName,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >();\n const continuationsById = new Map<string, AnyContinuationCallable<State>>();\n const effectsById = new Map<\n string,\n { readonly id: string; readonly type: string }\n >();\n\n for (const phaseIndex of index.phasesByName.values()) {\n const trustedPhase: TrustedPhaseRegistry<Contract, Definitions, Views> = {\n phaseName: phaseIndex.phaseName,\n phase: phaseIndex.phase,\n interactions: phaseIndex.interactions,\n stages: phaseIndex.stages,\n zones: phaseIndex.zones,\n cardActions: phaseIndex.cardActions,\n };\n phasesByName.set(phaseIndex.phaseName, trustedPhase);\n for (const [, effect] of phaseIndex.effects) {\n effectsById.set(effect.id, { id: effect.id, type: effect.type });\n if (effect.continuation) {\n const continuationId = effect.continuation.id ?? effect.id;\n continuationsById.set(\n continuationId,\n effect.continuation as AnyContinuationCallable<State>,\n );\n }\n }\n }\n\n return {\n phaseEntries: index.phaseEntries,\n phasesByName,\n continuationsById,\n effectsById,\n };\n}\n","import type { RuntimeTableRecord } from \"./model/table\";\nimport type { TableQueriesOfState } from \"./model/queries\";\nimport type { BaseGameStateOfContract } from \"./model/definition\";\nimport { createStateQueries } from \"./table-queries\";\n\n/**\n * A freestanding, memoized projection of immutable game state.\n *\n * Use `defineDerived` for values that are pure functions of component\n * locations, zone contents, resources, or other state fields - and are\n * consumed from multiple reducer or view call sites, or whose compute cost\n * is non-trivial (graph walks, aggregate reductions).\n *\n * Do NOT cache derived values in `publicState`. State fields should be\n * inputs to derivations, not mirrors of them.\n */\nexport type DerivedDefinition<Contract, Value> = {\n /** Optional label for debugging. Does not affect caching. */\n readonly name?: string;\n readonly compute: (ctx: {\n readonly state: BaseGameStateOfContract<Contract>;\n readonly q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n readonly derived: DerivedResolver;\n }) => Value;\n};\n\n/**\n * Resolves a `DerivedDefinition` to its value. Callers do not need to know\n * about memoization - the resolver handles caching internally.\n */\nexport type DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n) => Value;\n\ntype AnyDerivedDefinition = DerivedDefinition<unknown, unknown>;\n\n/**\n * Author-facing factory for creating a derived value tied to a game\n * contract. Usage:\n *\n * ```ts\n * export const longestRoad = defineDerived<GameContract>()({\n * name: \"longestRoad\",\n * compute: ({ q, derived }) => computeLongestRoad(q),\n * });\n * ```\n */\nexport function defineDerived<Contract>() {\n return <Value>(def: {\n name?: string;\n compute: (ctx: {\n state: BaseGameStateOfContract<Contract>;\n q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived: DerivedResolver;\n }) => Value;\n }): DerivedDefinition<Contract, Value> => def;\n}\n\n/**\n * Creates a resolver scoped to a single state snapshot. Each engine tick\n * and each view projection call creates its own resolver; cache lifetime\n * ends with the call. Cache key is the `DerivedDefinition` identity (the\n * object reference).\n *\n * Re-entry on an in-flight definition throws a readable error.\n */\nexport function createDerivedResolver<\n State extends { table: RuntimeTableRecord },\n>(\n state: State,\n options: { q?: TableQueriesOfState<State> } = {},\n): DerivedResolver {\n const cache = new Map<AnyDerivedDefinition, unknown>();\n const inflight = new Set<AnyDerivedDefinition>();\n const q = options.q ?? createStateQueries(state);\n\n const resolver: DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n ): Value => {\n const typedDef = def as unknown as AnyDerivedDefinition;\n if (cache.has(typedDef)) {\n return cache.get(typedDef) as Value;\n }\n if (inflight.has(typedDef)) {\n throw new Error(\n `Cyclic derived: '${def.name ?? \"<anonymous>\"}' depends on itself.`,\n );\n }\n inflight.add(typedDef);\n try {\n const value = (\n def.compute as unknown as (ctx: {\n state: unknown;\n q: unknown;\n derived: DerivedResolver;\n }) => Value\n )({ state, q, derived: resolver });\n cache.set(typedDef, value);\n return value;\n } finally {\n inflight.delete(typedDef);\n }\n };\n\n return resolver;\n}\n","import type {\n AnyContinuationToken,\n EffectSpecLike,\n ReducerFx,\n RuntimeTableRecord,\n} from \"./model\";\n\ntype FxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\ntype InternalEffectDefinition = EffectSpecLike;\n\nfunction buildResume(\n effect: InternalEffectDefinition,\n context: unknown,\n): AnyContinuationToken | undefined {\n if (!effect.__continuation) {\n return undefined;\n }\n return (effect.__continuation as unknown as (data: unknown) => unknown)(\n context ?? {},\n ) as AnyContinuationToken;\n}\n\nfunction invokeEffect(\n effect: InternalEffectDefinition,\n options: Record<string, unknown>,\n) {\n const continuation = buildResume(effect, options.context);\n if (effect.type === \"rollDie\") {\n return continuation === undefined\n ? {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n }\n : {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n continuation,\n };\n }\n if (effect.type === \"shuffleSharedZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n }\n : {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n continuation,\n };\n }\n if (effect.type === \"shufflePlayerZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n }\n : {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n continuation,\n };\n }\n throw new Error(\n `fx.effect: unsupported effect type '${(effect as InternalEffectDefinition).type}'.`,\n );\n}\n\nexport function createReducerFx<State extends FxState>(): ReducerFx<State> {\n const fx: ReducerFx<State> = {\n transition(to) {\n return { kind: \"flow.transition\", to } as ReturnType<\n ReducerFx<State>[\"transition\"]\n >;\n },\n effect(effect, options) {\n return invokeEffect(\n effect as unknown as InternalEffectDefinition,\n options as Record<string, unknown>,\n ) as ReturnType<ReducerFx<State>[\"effect\"]>;\n },\n } as ReducerFx<State>;\n return fx;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PlayerIdOfState,\n ReducerGameContractLike,\n TableQueriesOfState,\n} from \"../../model\";\nimport type {\n ActionContext,\n RandomHelpers,\n} from \"../../model/spec/runtime-args\";\nimport type { TrustedRuntimeHelpers, TrustedState } from \"./runtime-scope\";\n\nexport function fxForState<Contract extends ReducerGameContractLike>() {\n return createReducerFx<TrustedState<Contract>>();\n}\n\nexport function buildContext<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n): ActionContext<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n> {\n type DomainState = BaseGameStateOfContract<Contract>;\n type PlayerId = PlayerIdOfState<DomainState>;\n type Manifest = ManifestContractOf<Contract>;\n return {\n currentPhase: state.flow.currentPhase as ActionContext<\n DomainState,\n Manifest\n >[\"currentPhase\"],\n manifest,\n playerOrder: [...state.table.playerOrder] as PlayerId[],\n activePlayers: [...state.flow.activePlayers] as PlayerId[],\n runtime: publicRuntime(state.runtime),\n setup: (state.runtime.setup\n ? {\n profileId: state.runtime.setup.profileId,\n optionValues: {\n ...state.runtime.setup.optionValues,\n },\n }\n : null) as ActionContext<DomainState, Manifest>[\"setup\"],\n };\n}\n\nfunction publicRuntime<Runtime extends { rng?: unknown }>(\n runtime: Runtime,\n): Omit<Runtime, \"rng\"> {\n const rest = { ...runtime } as Omit<Runtime, \"rng\"> & { rng?: unknown };\n delete rest.rng;\n return rest;\n}\n\nconst DISABLED_RANDOM_HELPERS: RandomHelpers = {\n subset() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n};\n\nexport function buildRuntimeArgs<\n Contract extends ReducerGameContractLike,\n Extra extends object,\n>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n helpers: TrustedRuntimeHelpers<Contract>,\n toDomainState: (\n state: TrustedState<Contract>,\n ) => BaseGameStateOfContract<Contract>,\n extra: Extra,\n options: {\n q?: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n } = {},\n) {\n const domainState = toDomainState(state);\n const q = options.q ?? createStateQueries(domainState);\n return {\n ...buildContext(state, manifest),\n ...helpers,\n fx: options.fx ?? fxForState<Contract>(),\n q,\n derived: options.derived ?? createDerivedResolver(domainState, { q }),\n runtime: publicRuntime(state.runtime),\n random: options.random ?? DISABLED_RANDOM_HELPERS,\n ...extra,\n };\n}\n","import { assertJsonWithinLimits } from \"../../../runtime-json\";\nimport type {\n GameEvent,\n GameEventDetail,\n GameOutcome,\n OutcomeScoreComponent,\n OutcomeStanding,\n OutcomeTieBreak,\n ReducerAcceptOptions,\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\nfunction normalizeGameOutcome<State, PlayerId extends string>(\n state: State,\n outcome: GameOutcome<PlayerId>,\n): 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 as { table?: { playerOrder?: readonly string[] } })\n .table?.playerOrder;\n if (!Array.isArray(playerOrder) || 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 (typeof detail.value !== \"boolean\") {\n failGameEvent(`details[${index}].value must be string, number, or boolean`);\n }\n return {\n label: detail.label,\n value: detail.value,\n };\n}\n\nfunction normalizeSystemActionEvent(\n event: SystemActionEvent,\n): SystemActionEvent {\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 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\nfunction normalizeGameEvents(events: readonly GameEvent[] = []): 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 acceptResult<State>(\n state: State,\n options: ReducerAcceptOptions<State> = {},\n) {\n const events = normalizeGameEvents(options.events);\n return {\n type: \"accept\" as const,\n state,\n instructions: [...(options.instructions ?? [])],\n events,\n };\n}\n\nexport function endGameResult<State, PlayerId extends string = string>(\n state: State,\n outcome: GameOutcome<PlayerId>,\n options: ReducerAcceptOptions<State> = {},\n) {\n const terminal = normalizeGameOutcome(state, outcome);\n const events = normalizeGameEvents(options.events);\n return {\n type: \"accept\" as const,\n state,\n instructions: [...(options.instructions ?? [])],\n events,\n terminal,\n };\n}\n\nexport function rejectResult(\n errorCode: string,\n message?: string,\n): ReducerReject {\n return {\n type: \"reject\",\n errorCode,\n message,\n };\n}\n\nexport function normalizeResult<State>(\n result: ReducerResult<State> | void,\n fallbackState: State,\n): ReducerResult<State> {\n if (result === undefined || result === null) {\n return acceptResult(fallbackState);\n }\n return result;\n}\n\nexport const runtimeResultHelpers = {\n accept: acceptResult,\n endGame: endGameResult,\n reject: rejectResult,\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 type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\n\nexport function resolveTrustedSetupProfiles<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(definition: ReducerGameDefinition<Contract, Definitions, Views>) {\n const manifestSetupProfilesById =\n definition.contract.manifest.setupProfilesById;\n const manifestSetupProfileIds = Object.keys(manifestSetupProfilesById).sort();\n const reducerSetupProfiles = definition.setupProfiles ?? {};\n const reducerSetupProfileIds = Object.keys(reducerSetupProfiles).sort();\n if (\n manifestSetupProfileIds.length !== reducerSetupProfileIds.length ||\n manifestSetupProfileIds.some(\n (profileId, index) => reducerSetupProfileIds[index] !== profileId,\n )\n ) {\n throw new Error(\n `Reducer setupProfiles must exactly match manifest setupProfiles. Manifest=[${manifestSetupProfileIds.join(\", \")}], reducer=[${reducerSetupProfileIds.join(\", \")}].`,\n );\n }\n return {\n manifestSetupProfilesById,\n reducerSetupProfiles,\n };\n}\n\nexport function resolveDefaultInitialPhase<PhaseName extends string>(\n explicitInitialPhase: PhaseName | undefined,\n phaseEntries: ReadonlyArray<readonly [PhaseName, unknown]>,\n): PhaseName {\n const defaultInitialPhase = explicitInitialPhase ?? phaseEntries[0]?.[0];\n if (!defaultInitialPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n return defaultInitialPhase;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createReducerOps } from \"../../ops\";\nimport { createReducerEdit } from \"../../transaction\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport { createReducerDiagnosticsEmitter } from \"../../diagnostics\";\nimport type {\n ReducerDiagnosticsEmitter,\n ReducerDiagnosticsSink,\n} from \"../../diagnostics\";\nimport type {\n AnyInteractionSpec,\n BaseGameSessionOfContract,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n PlayerIdOfState,\n PlayerZoneIdOfManifest,\n ReducerGameContractLike,\n ReducerGameDefinition,\n StageSpec,\n TableQueriesOfState,\n GameOutcome,\n GameEvent,\n ReducerAcceptOptions,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n ActionContext,\n AnyContinuationCallable,\n RandomHelpers,\n} from \"../../model/spec/runtime-args\";\nimport {\n collectTrustedRuntimeRegistry,\n type TrustedErasedPhase,\n type TrustedCardActionEntry,\n type TrustedInteractionEntry,\n type TrustedPhaseRegistry,\n type TrustedRuntimeRegistry,\n} from \"./runtime-registry\";\nimport {\n buildContext as buildTrustedContext,\n buildRuntimeArgs as buildTrustedRuntimeArgs,\n fxForState as trustedFxForState,\n} from \"./trusted-runtime-args\";\nimport { rejectResult, runtimeResultHelpers } from \"./trusted-runtime-result\";\nimport {\n toCombinedState as codecToCombinedState,\n toDomainState as codecToDomainState,\n toSessionState as codecToSessionState,\n} from \"./trusted-state-codec\";\nimport {\n resolveDefaultInitialPhase,\n resolveTrustedSetupProfiles,\n} from \"./trusted-setup-profiles\";\n\nexport { normalizeResult } from \"./trusted-runtime-result\";\nexport { rejectResult };\n\nexport type TrustedDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReducerGameDefinition<Contract, Definitions, Views>;\n\nexport type TrustedDomainState<Contract extends ReducerGameContractLike> =\n BaseGameStateOfContract<Contract>;\n\nexport type TrustedSessionState<Contract extends ReducerGameContractLike> =\n BaseGameSessionOfContract<Contract>;\n\nexport type TrustedState<Contract extends ReducerGameContractLike> =\n TrustedDomainState<Contract> & {\n runtime: TrustedSessionState<Contract>[\"runtime\"];\n };\n\nexport type TrustedManifest<Contract extends ReducerGameContractLike> =\n ManifestContractOf<Contract>;\n\nexport type TrustedPhaseName<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = PhaseNamesOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type TrustedPlayerId<Contract extends ReducerGameContractLike> =\n PlayerIdOfState<TrustedDomainState<Contract>>;\n\nexport type TrustedInput<Contract extends ReducerGameContractLike> =\n TrustedRuntimeInput<TrustedPlayerId<Contract>>;\n\nexport type { TrustedErasedPhase } from \"./runtime-registry\";\n\nexport interface TrustedRuntimeHelpers<\n Contract extends ReducerGameContractLike,\n> {\n accept: (\n state: TrustedDomainState<Contract>,\n options?: ReducerAcceptOptions<TrustedDomainState<Contract>>,\n ) => {\n type: \"accept\";\n state: TrustedDomainState<Contract>;\n instructions: RuntimeInstructionForState<TrustedDomainState<Contract>>[];\n events: GameEvent[];\n };\n endGame: (\n state: TrustedDomainState<Contract>,\n outcome: GameOutcome<TrustedPlayerId<Contract>>,\n options?: ReducerAcceptOptions<TrustedDomainState<Contract>>,\n ) => {\n type: \"accept\";\n state: TrustedDomainState<Contract>;\n instructions: RuntimeInstructionForState<TrustedDomainState<Contract>>[];\n events: GameEvent[];\n terminal: GameOutcome<TrustedPlayerId<Contract>>;\n };\n reject: typeof rejectResult;\n ops: ReturnType<typeof createReducerOps<TrustedDomainState<Contract>>>;\n edit: ReturnType<typeof createReducerEdit<TrustedDomainState<Contract>>>;\n}\n\nexport interface TrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n definition: TrustedDefinition<Contract, Definitions, Views>;\n diagnostics: ReducerDiagnosticsEmitter;\n registry: TrustedRuntimeRegistry<Contract, Definitions, Views>;\n phaseEntries: ReadonlyArray<\n readonly [\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedErasedPhase<Contract>,\n ]\n >;\n defaultInitialPhase: TrustedPhaseName<Contract, Definitions, Views>;\n manifestSetupProfilesById: TrustedManifest<Contract>[\"setupProfilesById\"];\n reducerSetupProfiles: NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >;\n runtimeHelpers: TrustedRuntimeHelpers<Contract>;\n toDomainState(state: TrustedState<Contract>): TrustedDomainState<Contract>;\n toCombinedState(\n session: TrustedSessionState<Contract>,\n ): TrustedState<Contract>;\n toSessionState(state: TrustedState<Contract>): TrustedSessionState<Contract>;\n phaseRegistryByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined;\n phaseByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedErasedPhase<Contract>;\n findInteractionInPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n interactionId: string,\n ):\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n interactionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedInteractionEntry<Contract>>;\n stagesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<\n readonly [\n string,\n StageSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>,\n ]\n >;\n zonesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<PlayerZoneIdOfManifest<TrustedManifest<Contract>>>;\n cardActionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedCardActionEntry<Contract>>;\n continuationById(\n id: string,\n ): AnyContinuationCallable<TrustedDomainState<Contract>> | undefined;\n fxForState(): ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n buildContext(\n state: TrustedState<Contract>,\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>>;\n buildRuntimeArgs<Extra extends object>(\n state: TrustedState<Contract>,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<TrustedDomainState<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n },\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>> &\n TrustedRuntimeHelpers<Contract> & {\n fx: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n q: ReturnType<typeof createStateQueries<TrustedDomainState<Contract>>>;\n derived: ReturnType<\n typeof createDerivedResolver<TrustedDomainState<Contract>>\n >;\n runtime: Omit<TrustedState<Contract>[\"runtime\"], \"rng\">;\n random: RandomHelpers;\n } & Extra;\n}\n\nexport function createTrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: TrustedDefinition<Contract, Definitions, Views>,\n options: { diagnostics?: ReducerDiagnosticsSink } = {},\n): TrustedRuntimeScope<Contract, Definitions, Views> {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n const registry = collectTrustedRuntimeRegistry(definition);\n const { phaseEntries } = registry;\n const defaultInitialPhase = resolveDefaultInitialPhase(\n definition.initialPhase as PhaseName | undefined,\n phaseEntries,\n );\n const { manifestSetupProfilesById, reducerSetupProfiles } =\n resolveTrustedSetupProfiles(definition);\n\n function toDomainState(state: State): DomainState {\n return codecToDomainState<State, DomainState>(state);\n }\n\n function toCombinedState(session: SessionState): State {\n return codecToCombinedState<SessionState, State>(session);\n }\n\n function toSessionState(state: State): SessionState {\n return codecToSessionState<State, DomainState, SessionState>(\n state,\n toDomainState,\n );\n }\n\n function phaseRegistryByName(\n phaseName: PhaseName,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined {\n return registry.phasesByName.get(phaseName);\n }\n\n function phaseByName(phaseName: PhaseName): TrustedErasedPhase<Contract> {\n const phaseRegistry = phaseRegistryByName(phaseName);\n if (!phaseRegistry) {\n throw new Error(`Unknown reducer phase '${phaseName}'.`);\n }\n return phaseRegistry.phase;\n }\n\n function findInteractionInPhase(\n phaseName: PhaseName,\n interactionId: string,\n ): AnyInteractionSpec<DomainState, Manifest> | undefined {\n const found = interactionEntriesForPhase(phaseName).find(\n ([id]) => id === interactionId,\n );\n return found?.[1];\n }\n\n function interactionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.interactions ?? [];\n }\n\n function stagesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.stages ?? [];\n }\n\n function zonesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.zones ?? [];\n }\n\n function cardActionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.cardActions ?? [];\n }\n\n function continuationById(id: string) {\n return registry.continuationsById.get(id);\n }\n\n const helpers: TrustedRuntimeHelpers<Contract> = {\n ...runtimeResultHelpers,\n ops: createReducerOps<DomainState>(),\n edit: createReducerEdit<DomainState>(),\n };\n\n function fxForState() {\n return trustedFxForState<Contract>();\n }\n\n function buildContext(state: State): ActionContext<DomainState, Manifest> {\n return buildTrustedContext<Contract>(state, definition.contract.manifest);\n }\n\n function buildRuntimeArgs<Extra extends object>(\n state: State,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<DomainState>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<State>>;\n random?: RandomHelpers;\n },\n ) {\n return buildTrustedRuntimeArgs<Contract, Extra>(\n state,\n definition.contract.manifest,\n helpers,\n toDomainState,\n extra,\n options,\n );\n }\n\n return {\n definition,\n diagnostics: createReducerDiagnosticsEmitter(options.diagnostics),\n registry,\n phaseEntries,\n defaultInitialPhase,\n manifestSetupProfilesById,\n reducerSetupProfiles: reducerSetupProfiles as NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >,\n runtimeHelpers: helpers,\n toDomainState,\n toCombinedState,\n toSessionState,\n phaseRegistryByName,\n phaseByName,\n findInteractionInPhase,\n interactionEntriesForPhase,\n stagesForPhase,\n zonesForPhase,\n cardActionEntriesForPhase,\n continuationById,\n fxForState,\n buildContext,\n buildRuntimeArgs,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { RuntimePayload } from \"../../model\";\nimport { createRuntimeInstructionEngine } from \"../../engine/runtime-instruction-engine\";\nimport { cloneRuntimeTable } from \"../../table\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerResult,\n RuntimeRngState,\n ViewMapOf,\n} from \"../../model\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport { createEngineInstructionResolver } from \"./engine-instruction-resolver\";\nimport { createFlowInstructionResolver } from \"./flow-instruction-resolver\";\nimport {\n createMutableRandomHelpers,\n sampleRngCollectorValue,\n} from \"./rng-sampler\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n simultaneousSubmitInteraction,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport {\n normalizeResult,\n rejectResult,\n type TrustedDomainState,\n type TrustedInput,\n type TrustedPhaseName,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createTrustedInstructionRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const flowInstructions = createFlowInstructionResolver(lifecycle);\n const engineInstructions = createEngineInstructionResolver<Contract>();\n\n type RuntimeRngResult = { runtimeRng?: RuntimeRngState };\n\n function reduceInternal(\n state: State,\n input: ReducerInput,\n ): ReducerResult<DomainState> & RuntimeRngResult {\n const ctx = scope.buildContext(state);\n\n if (input.kind === \"interaction\") {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) {\n return rejectResult(\n \"unsupported-action\",\n `Interaction '${input.interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n );\n }\n const parsed = interactions.parseInteractionParams(\n interaction,\n input.params,\n { playerId: input.playerId },\n );\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n interaction.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n playerId: input.playerId,\n params: parsed.params,\n },\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n if (input.kind === \"continuation\") {\n const continuation = scope.continuationById(input.continuationId);\n if (!continuation) {\n return rejectResult(\n \"missing-continuation\",\n `Continuation '${input.continuationId}' was not registered.`,\n );\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n continuation.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n source: \"effect\" as const,\n effectKind: input.effectKind,\n data: input.resumeData,\n response: input.response,\n },\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n return scope.runtimeHelpers.accept(scope.toDomainState(state));\n }\n\n function preSampleRngForAction(\n state: State,\n input: ReducerInput,\n ): { state: State; input: ReducerInput } {\n if (input.kind !== \"interaction\") return { state, input };\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) return { state, input };\n const collectors = interaction.inputs as Record<string, InputCollector>;\n let nextRng = state.runtime.rng;\n const sampled: Record<string, unknown> = {};\n let anySampled = false;\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind !== \"rng\") continue;\n const { value, nextRng: advanced } = sampleRngCollectorValue(\n collector,\n nextRng,\n );\n sampled[key] = value;\n nextRng = advanced;\n anySampled = true;\n }\n if (!anySampled) return { state, input };\n const mergedParams: Record<string, unknown> = {\n ...((input.params ?? {}) as Record<string, unknown>),\n ...sampled,\n };\n return {\n state: {\n ...state,\n runtime: { ...state.runtime, rng: nextRng },\n } as State,\n input: { ...input, params: mergedParams } as ReducerInput,\n };\n }\n\n function clearSimultaneousCurrent(state: State): State {\n return {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: { current: null },\n },\n } as State;\n }\n\n function reduceSimultaneousSubmit(\n state: State,\n input: ReducerInput,\n ): ReducerResult<State> | null {\n if (\n input.kind !== \"interaction\" ||\n input.interactionId !== SIMULTANEOUS_SUBMIT_INTERACTION_ID\n ) {\n return null;\n }\n\n const phaseName = state.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) {\n return null;\n }\n\n const submit = simultaneousSubmitInteraction(scope.phaseByName(phaseName));\n if (!submit) {\n return rejectResult(\n \"missing-submit-interaction\",\n `Simultaneous phase '${phaseName}' does not declare submit.`,\n );\n }\n const resolve = (phase as { resolve?: unknown }).resolve;\n if (typeof resolve !== \"function\") {\n return rejectResult(\n \"missing-simultaneous-resolve\",\n `Simultaneous phase '${phaseName}' does not declare resolve.`,\n );\n }\n\n const actors = resolveSimultaneousActors(scope, state, phase);\n if (!actors.includes(input.playerId as PlayerId)) {\n return rejectResult(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${input.interactionId}').`,\n );\n }\n\n const parsed = interactions.parseInteractionParams(submit, input.params);\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n\n const current =\n state.runtime.simultaneous?.current?.phaseName === phaseName\n ? state.runtime.simultaneous.current\n : {\n phaseName,\n actors,\n submissions: {},\n };\n const existing = current.submissions[input.playerId as PlayerId];\n const canResubmit =\n (phase as { canResubmit?: boolean }).canResubmit === true;\n if (existing && !canResubmit) {\n return rejectResult(\n \"ALREADY_SUBMITTED\",\n `Interaction '${input.interactionId}' has already been submitted by '${input.playerId}'.`,\n );\n }\n\n const submissions: Record<\n string,\n { interactionId: string; params: RuntimePayload }\n > = {\n ...current.submissions,\n [input.playerId]: {\n interactionId: input.interactionId,\n params: parsed.params as RuntimePayload,\n },\n };\n const stateWithSubmission = {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: {\n current: {\n phaseName,\n actors,\n submissions,\n },\n },\n },\n } as State;\n const waitingPlayerIds = actors.filter((actor) => !submissions[actor]);\n if (waitingPlayerIds.length > 0) {\n return {\n type: \"accept\",\n state: stateWithSubmission,\n instructions: [],\n };\n }\n\n const resolvedSubmissions = Object.fromEntries(\n actors.map((actor) => [\n actor,\n {\n playerId: actor,\n params: submissions[actor]?.params ?? {},\n },\n ]),\n );\n const random = createMutableRandomHelpers(stateWithSubmission.runtime.rng);\n const resolved = normalizeResult(\n resolve(\n scope.buildRuntimeArgs(\n stateWithSubmission,\n {\n state: scope.toDomainState(stateWithSubmission),\n submissions: resolvedSubmissions,\n submittedPlayerIds: [...actors],\n waitingPlayerIds: [],\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(stateWithSubmission),\n );\n if (resolved.type === \"reject\") {\n return resolved;\n }\n return {\n type: \"accept\",\n state: clearSimultaneousCurrent({\n ...resolved.state,\n runtime: { ...stateWithSubmission.runtime, rng: random.currentRng() },\n } as State),\n instructions: resolved.instructions ?? [],\n events: resolved.events ?? [],\n };\n }\n\n function reduceOnce(state: State, input: ReducerInput): ReducerResult<State> {\n const sampled = preSampleRngForAction(state, input);\n const simultaneousResult = reduceSimultaneousSubmit(\n sampled.state,\n sampled.input,\n );\n if (simultaneousResult) {\n return simultaneousResult;\n }\n const result = reduceInternal(sampled.state, sampled.input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: {\n ...result.state,\n runtime: {\n ...sampled.state.runtime,\n rng: result.runtimeRng ?? sampled.state.runtime.rng,\n },\n } as State,\n instructions: result.instructions ?? [],\n events: result.events ?? [],\n };\n }\n\n function resolveInstruction(\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n switch (instruction.kind) {\n case \"flow.transition\":\n return flowInstructions.resolveTransition(state, instruction);\n case \"engine.rollDie\":\n return engineInstructions.resolveRollDie(state, instruction);\n case \"engine.shuffleSharedZone\":\n return engineInstructions.resolveShuffleSharedZone(state, instruction);\n case \"engine.shufflePlayerZone\":\n return engineInstructions.resolveShufflePlayerZone(state, instruction);\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `Unknown runtime instruction kind: ${(_exhaustive as { kind: string }).kind}`,\n );\n }\n }\n }\n\n function resolveInstructionForDrain(\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n switch (instruction.kind) {\n case \"flow.transition\":\n return flowInstructions.resolveTransition(state, instruction);\n case \"engine.rollDie\":\n return engineInstructions.resolveRollDieDraft(state, instruction);\n case \"engine.shuffleSharedZone\":\n return engineInstructions.resolveShuffleSharedZoneDraft(\n state,\n instruction,\n );\n case \"engine.shufflePlayerZone\":\n return engineInstructions.resolveShufflePlayerZoneDraft(\n state,\n instruction,\n );\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `Unknown runtime instruction kind: ${(_exhaustive as { kind: string }).kind}`,\n );\n }\n }\n }\n\n const instructionEngine = createRuntimeInstructionEngine<\n State,\n PlayerId,\n ReducerInput\n >({\n reduce(state, input) {\n return reduceOnce(state, input);\n },\n resolveInstruction: resolveInstructionForDrain,\n prepareInstructionState(state) {\n return {\n ...state,\n table: cloneRuntimeTable(state.table),\n };\n },\n });\n\n return {\n resolveInstruction,\n dispatch: instructionEngine.dispatch,\n drainInstructions: instructionEngine.drainInstructions,\n reduceInternal,\n reduceOnce,\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 valueKind?: \"board-id\" | \"player-board-space\";\n zoneId?: string;\n zoneIds?: readonly string[];\n} {\n switch (collector.kind) {\n case \"card\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? \"card\",\n zoneId: meta.zoneId,\n zoneIds:\n meta.zoneIds ??\n (meta.zoneId === undefined ? undefined : [meta.zoneId]),\n };\n }\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? collector.kind.replace(\"board-\", \"\"),\n boardId: meta.boardId,\n valueKind: meta.valueKind,\n };\n }\n default:\n return {};\n }\n}\n\nexport function interactionInputsOf<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<string, InputCollector> {\n return interaction.inputs as Record<string, InputCollector>;\n}\n\nexport function collectInputMetadata<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<\n string,\n {\n kind: string;\n targetKind?: string;\n boardId?: string;\n zoneId?: string;\n zoneIds?: readonly string[];\n }\n> {\n const collectors = interactionInputsOf(interaction);\n return Object.fromEntries(\n Object.entries(collectors).map(([key, collector]) => [\n key,\n {\n kind: collector.kind,\n ...collectTargetDomainMetadata(collector),\n },\n ]),\n );\n}\n\nexport function 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","import type { DerivedResolver } from \"../../derived\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n ManifestContract,\n TableOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { ReducerDiagnosticsSink } from \"../../diagnostics\";\nimport { interactionInputsOf } from \"./collector-introspection\";\n\nexport type CollectorProjectionOptions<DomainState extends CollectorState> = {\n readonly queries?: TableQueriesOfState<DomainState>;\n readonly derived?: DerivedResolver;\n readonly eligibleTargetCache?: Map<string, string[]>;\n readonly eligibleTargetCachePrefix?: string;\n readonly includeEligibleTargets?: boolean;\n readonly diagnostics?: ReducerDiagnosticsSink;\n};\n\nexport function collectEligibleTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, string[]> {\n const collectors = interactionInputsOf(interaction);\n const result: Record<string, string[]> = {};\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n for (const [key, collector] of Object.entries(collectors)) {\n if (!collector.eligibleTargets) continue;\n const cacheKey = options.eligibleTargetCachePrefix\n ? `${options.eligibleTargetCachePrefix}:${key}`\n : null;\n const cached = cacheKey\n ? options.eligibleTargetCache?.get(cacheKey)\n : undefined;\n if (cached) {\n result[key] = cached;\n continue;\n }\n const targets = collector.eligibleTargets(\n domainState as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[0],\n playerId as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[1],\n queries() as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[2],\n );\n const resolved = Array.from(targets as ReadonlyArray<unknown>).map((t) =>\n String(t),\n );\n result[key] = resolved;\n if (cacheKey) {\n options.eligibleTargetCache?.set(cacheKey, resolved);\n }\n }\n return result;\n}\n","import { z } from \"zod\";\n\nexport function formatIssue(\n label: string,\n issue: { path: PropertyKey[]; message: string },\n): string {\n const path = issue.path\n .map((segment) =>\n typeof segment === \"symbol\" ? segment.toString() : String(segment),\n )\n .join(\".\");\n return `${path || label}: ${issue.message}`;\n}\n\nexport function safeParseOrThrow<Schema extends z.ZodTypeAny>(\n schema: Schema,\n value: unknown,\n label: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n const message = parsed.error.issues\n .map((issue) => formatIssue(label, issue))\n .join(\"; \");\n throw new Error(message || `Invalid ${label}`);\n }\n return parsed.data;\n}\n","import type {\n AnyInteractionSpec,\n InputCollectorKind,\n InputDomainDescriptor,\n InteractionIdOfDefinition,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDefinition,\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport type TrustedInteractionId<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionIdOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type InteractionDescriptorContext<PlayerId extends string = string> = {\n to: PlayerId;\n title?: string;\n options?: Array<{ id: string; label?: string }>;\n};\n\nexport type InteractionCommitPolicyShape =\n | { mode: \"manual\" }\n | { mode: \"autoWhenReady\" };\n\nexport type InteractionAvailabilityShape =\n | { status: \"available\" }\n | { status: \"notYourTurn\"; reason: string }\n | {\n status: \"insufficientResources\";\n reason: string;\n missingResources: Record<string, number>;\n }\n | { status: \"blocked\"; reason: string; code?: string };\n\nexport type InteractionDecision =\n | { available: true; cost?: Record<string, number> }\n | {\n available: false;\n code: string;\n ruleId?: string;\n message?: string;\n cost?: Record<string, number>;\n missingResources?: Record<string, number>;\n };\n\nexport type InteractionDiagnosticReasonShape = {\n ruleId: string;\n errorCode: string;\n};\n\nexport type InteractionExplanation = {\n interactionId: string;\n phase: string;\n step: string | null;\n availability:\n | \"available\"\n | \"notYourTurn\"\n | \"wrongPhase\"\n | \"wrongStep\"\n | \"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 | \"lazy\";\n }>;\n};\n\ntype InteractionDescriptorBaseShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = {\n phaseName: PhaseName;\n interactionKey: `${PhaseName}.${InteractionId}`;\n interactionId: InteractionId;\n label: string;\n help?: string;\n commit: InteractionCommitPolicyShape;\n descriptorDigest?: string;\n actorSeat?: number;\n draftDigest?: string;\n zoneId?: ZoneId;\n zoneIds?: readonly ZoneId[];\n inputs: InteractionInputDescriptorShape[];\n cost?: Record<string, number>;\n currentResources?: Record<string, number>;\n availability: InteractionAvailabilityShape;\n reasons?: readonly InteractionDiagnosticReasonShape[];\n};\n\nexport type ActionInteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = InteractionDescriptorBaseShape<PhaseName, InteractionId, ZoneId> & {\n kind: \"action\";\n};\n\nexport type PromptInteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> = InteractionDescriptorBaseShape<PhaseName, InteractionId, ZoneId> & {\n kind: \"prompt\";\n context: InteractionDescriptorContext<PlayerId>;\n};\n\nexport type InteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> =\n | ActionInteractionDescriptorShape<PhaseName, InteractionId, ZoneId>\n | PromptInteractionDescriptorShape<\n PhaseName,\n InteractionId,\n PlayerId,\n ZoneId\n >;\n\nexport type TrustedInteractionDescriptorShape<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionDescriptorShape<\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedInteractionId<Contract, Definitions, Views>,\n TrustedPlayerId<Contract>\n>;\n\nexport type InteractionInputDescriptorShape = {\n key: string;\n kind: InputCollectorKind;\n domain: InputDomainDescriptor;\n defaultValue?: unknown;\n};\n\nexport type InteractionActorAuthorization<PlayerId extends string> =\n | { readonly mode: \"addressees\"; readonly addressees: ReadonlySet<PlayerId> }\n | { readonly mode: \"actors\"; readonly actors: ReadonlySet<PlayerId> }\n | { readonly mode: \"active\" };\n\nexport type ResolveDecisionMode = \"descriptor\" | \"card\" | \"submit\";\n\nexport type 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 projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >;\n};\n\nexport type InteractionDecisionResult<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> =\n | {\n found: false;\n validation: ReducerValidationResult;\n }\n | {\n found: true;\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >;\n parsedParams: Record<string, unknown>;\n visible: boolean;\n descriptor: TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n validation: ReducerValidationResult;\n };\n\nexport function makeValidationError(\n errorCode: string,\n message?: string,\n): ReducerValidationResult {\n return {\n valid: false,\n errorCode,\n message,\n };\n}\n","import { formatIssue } from \"../../parse-utils\";\nimport { 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; playerId?: string } = {},\n):\n | { ok: true; params: Record<string, unknown> }\n | { ok: false; message: string } {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n if (interaction.paramsSchema) {\n const result = interaction.paramsSchema.safeParse(record);\n if (!result.success) {\n return {\n ok: false,\n message: result.error.issues\n .map((issue) => formatIssue(\"params\", issue))\n .join(\"; \"),\n };\n }\n return { ok: true, params: result.data as Record<string, unknown> };\n }\n const parsed: Record<string, unknown> = {};\n const issues: string[] = [];\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\" && options.skipRng) continue;\n const rawValueBase =\n record[key] === undefined && \"defaultValue\" in collector\n ? collector.defaultValue\n : record[key];\n const rawValue =\n collector.kind === \"board-space\" &&\n collector.meta?.valueKind === \"player-board-space\" &&\n typeof rawValueBase === \"string\" &&\n options.playerId\n ? {\n boardId: collector.meta.boardId,\n playerId: options.playerId,\n spaceId: rawValueBase,\n }\n : rawValueBase;\n const result = collector.schema.safeParse(rawValue);\n if (!result.success) {\n for (const issue of result.error.issues) {\n issues.push(formatIssue(`params.${key}`, issue));\n }\n continue;\n }\n parsed[key] = result.data;\n }\n if (issues.length > 0) {\n return { ok: false, message: issues.join(\"; \") };\n }\n return { ok: true, params: parsed };\n}\n\nexport function prepareInteractionProjectionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n): Record<string, unknown> {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n const prepared: Record<string, unknown> = { ...record };\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n if (record[key] !== undefined) {\n const result = collector.schema.safeParse(record[key]);\n if (result.success) {\n prepared[key] = result.data;\n }\n continue;\n }\n if (\"defaultValue\" in collector) {\n prepared[key] = collector.defaultValue;\n continue;\n }\n const defaultResult = collector.schema.safeParse(undefined);\n if (defaultResult.success) {\n prepared[key] = defaultResult.data;\n }\n }\n return prepared;\n}\n\nexport function validateCollectorTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n params: Record<string, unknown>,\n): ReducerValidationResult {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: ReturnType<typeof createStateQueries> | null = null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ));\n for (const [key, collector] of Object.entries(collectors)) {\n const selectionIssue = validateCollectorSelection(collector, params[key]);\n if (selectionIssue) {\n return makeValidationError(\n selectionIssue.errorCode,\n selectionIssue.message,\n );\n }\n if (!collector.validateTarget) continue;\n const rawTarget = params[key];\n if (rawTarget === null || rawTarget === undefined) continue;\n const dependencyValues = dependencyValuesForCollector(collector, params);\n const targetValues = valuesForCollectorValidation(\n collector.selection,\n rawTarget,\n );\n for (const value of targetValues) {\n const issue = collector.validateTarget(\n domainState as unknown as Parameters<\n typeof collector.validateTarget\n >[0],\n playerId as unknown as Parameters<typeof collector.validateTarget>[1],\n queries() as unknown as Parameters<typeof collector.validateTarget>[2],\n value,\n dependencyValues,\n );\n if (issue) {\n return makeValidationError(issue.errorCode, issue.message);\n }\n }\n }\n return { valid: true };\n}\n\nfunction dependencyValuesForCollector(\n collector: InputCollector,\n params: Record<string, unknown>,\n): Readonly<Record<string, unknown>> | undefined {\n const dependencies = collector.dependsOn ?? [];\n if (dependencies.length === 0) return undefined;\n return Object.fromEntries(\n dependencies.map((dependencyKey) => [dependencyKey, params[dependencyKey]]),\n );\n}\n\nfunction valuesForCollectorValidation(\n selection: InputSelectionDescriptor | undefined,\n value: unknown,\n): readonly unknown[] {\n if (selection?.mode === \"many\") {\n return Array.isArray(value) ? value : [];\n }\n return [value];\n}\n\nfunction validateCollectorSelection(\n collector: InputCollector,\n value: unknown,\n): { errorCode: string; message?: string } | null {\n const selection = collector.selection;\n if (selection?.mode !== \"many\") return null;\n if (!Array.isArray(value)) return null;\n if (value.length < selection.min) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at least ${selection.min} value${selection.min === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.max !== undefined && value.length > selection.max) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at most ${selection.max} value${selection.max === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.distinct) {\n const seen = new Set<string>();\n for (const item of value) {\n const key = stableValueKey(item);\n if (seen.has(key)) {\n return {\n errorCode: \"DUPLICATE_INPUT_VALUE\",\n message: \"Input values must be distinct.\",\n };\n }\n seen.add(key);\n }\n }\n return null;\n}\n\nfunction stableValueKey(value: unknown): string {\n if (value === null) return \"null\";\n switch (typeof value) {\n case \"string\":\n return `string:${value}`;\n case \"number\":\n case \"boolean\":\n case \"undefined\":\n return `${typeof value}:${String(value)}`;\n default:\n return `json:${JSON.stringify(value)}`;\n }\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { InteractionActorAuthorization } from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n} from \"./simultaneous-player\";\n\nfunction resolvePromptToSet<PlayerId extends string>(\n to: unknown,\n): ReadonlySet<PlayerId> {\n if (to === undefined || to === null) return new Set();\n if (Array.isArray(to)) {\n return new Set(to as PlayerId[]);\n }\n if (typeof to === \"string\") {\n return new Set([to as PlayerId]);\n }\n return new Set();\n}\n\nexport function createInteractionAuthorization<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInteractionActorAuthorization(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): InteractionActorAuthorization<PlayerId> {\n if (interaction.to) {\n const resolved = interaction.to({\n ...scope.buildContext(state),\n state: projection?.domainState ?? scope.toDomainState(state),\n });\n return {\n mode: \"addressees\",\n addressees: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n if (interaction.actor) {\n const resolved = interaction.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n const phase = scope.phaseByName(state.flow.currentPhase as PhaseName);\n if (isSimultaneousPhase(phase)) {\n return {\n mode: \"actors\",\n actors: new Set(\n resolveSimultaneousActors(scope, state, phase, projection),\n ),\n };\n }\n if (phase.actor) {\n const resolved = phase.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n return { mode: \"active\" };\n }\n\n function isActorAuthorized(\n state: State,\n playerId: PlayerId,\n authorization: InteractionActorAuthorization<PlayerId>,\n ): boolean {\n if (authorization.mode === \"addressees\") {\n return authorization.addressees.has(playerId);\n }\n if (authorization.mode === \"actors\") {\n return authorization.actors.has(playerId);\n }\n const active = state.flow.activePlayers as readonly PlayerId[];\n if (active.length === 0) {\n return true;\n }\n return active.includes(playerId);\n }\n\n function isInteractionVisible(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n authorization: InteractionActorAuthorization<PlayerId>,\n authorized: boolean,\n ): boolean {\n return (\n !(authorization.mode === \"addressees\" && !authorized) &&\n !(interaction.visibility === \"actorsOnly\" && !authorized)\n );\n }\n\n return {\n isActorAuthorized,\n isInteractionVisible,\n resolveInteractionActorAuthorization,\n };\n}\n","import { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n BoardTargetDomainDescriptor,\n CardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n ManifestContract,\n TableOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { InteractionInputDescriptorShape } from \"./interaction-types\";\nimport {\n collectTargetDomainMetadata,\n interactionInputsOf,\n} from \"./collector-introspection\";\nimport {\n collectEligibleTargets,\n type CollectorProjectionOptions,\n} from \"./collector-eligibility\";\n\nconst MAX_EAGER_DEPENDENT_DOMAIN_CASES = 64;\n\nfunction withSelection(\n domain: InputDomainDescriptor,\n collector: InputCollector,\n): InputDomainDescriptor {\n if (!collector.selection) return domain;\n return { ...domain, selection: collector.selection };\n}\n\nfunction lazyTargetDomainFromCollectorMetadata(\n key: string,\n collector: InputCollector,\n dependencies: readonly string[],\n): CardTargetDomainDescriptor | BoardTargetDomainDescriptor | null {\n const metadata = collectTargetDomainMetadata(collector);\n if (collector.kind === \"card\") {\n return withSelection(\n {\n type: \"cardTarget\",\n projection: \"lazy\",\n targetKind: \"card\",\n zoneIds:\n metadata.zoneIds ??\n (metadata.zoneId === undefined ? [] : [metadata.zoneId]),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n },\n collector,\n ) as CardTargetDomainDescriptor;\n }\n if (\n collector.kind === \"board-edge\" ||\n collector.kind === \"board-space\" ||\n collector.kind === \"board-tile\" ||\n collector.kind === \"board-vertex\"\n ) {\n return withSelection(\n {\n type: \"boardTarget\",\n projection: \"lazy\",\n targetKind: (metadata.targetKind ??\n collector.kind.replace(\"board-\", \"\")) as\n | \"edge\"\n | \"vertex\"\n | \"space\"\n | \"tile\",\n boardId: metadata.boardId ?? \"\",\n ...(metadata.valueKind ? { valueKind: metadata.valueKind } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n },\n collector,\n ) as BoardTargetDomainDescriptor;\n }\n return null;\n}\n\nfunction finiteValuesForDependency(\n key: string,\n domain: InputDomainDescriptor | undefined,\n): string[] {\n if (!domain) {\n throw new Error(\n `Interaction input '${key}' is declared as a dependency before it has a projected domain.`,\n );\n }\n if (domain.type === \"cardTarget\" || domain.type === \"boardTarget\") {\n if (domain.projection !== \"resolved\") {\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency because its target domain is not finite.`,\n );\n }\n return [...domain.eligibleTargets];\n }\n if (domain.type === \"choice\") {\n return domain.choices.flatMap((choice) =>\n choice.value === null ? [] : [choice.value],\n );\n }\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency. V1 supports finite target and choice dependencies only.`,\n );\n}\n\nfunction cartesianDependencyTuples(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): Array<Record<string, string>> {\n return dependencies.reduce<Array<Record<string, string>>>(\n (tuples, key) => {\n const values = finiteValuesForDependency(key, domainsByKey[key]);\n return tuples.flatMap((tuple) =>\n values.map((value) => ({ ...tuple, [key]: value })),\n );\n },\n [{}],\n );\n}\n\nfunction withoutDependentProjection(\n domain: InputDomainDescriptor,\n): InputDomainDescriptor {\n const rest = { ...domain } as InputDomainDescriptor & {\n dependencies?: unknown;\n };\n delete rest.dependencies;\n return rest as InputDomainDescriptor;\n}\n\nfunction toLazyTargetDomain(\n key: string,\n domain: InputDomainDescriptor,\n dependencies: readonly string[],\n): CardTargetDomainDescriptor | BoardTargetDomainDescriptor | null {\n if (domain.type === \"cardTarget\") {\n return {\n type: \"cardTarget\",\n projection: \"lazy\",\n targetKind: \"card\",\n zoneIds: domain.zoneIds,\n ...(domain.selection ? { selection: domain.selection } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n };\n }\n if (domain.type === \"boardTarget\") {\n return {\n type: \"boardTarget\",\n projection: \"lazy\",\n targetKind: domain.targetKind,\n boardId: domain.boardId,\n ...(domain.valueKind ? { valueKind: domain.valueKind } : {}),\n ...(domain.selection ? { selection: domain.selection } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n };\n }\n return null;\n}\n\nfunction dependencyCaseCount(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): number {\n return dependencies\n .map((key) => finiteValuesForDependency(key, domainsByKey[key]).length)\n .reduce((total, count) => total * count, 1);\n}\n\nfunction unsupportedDefaultInputError(key: string, collector: InputCollector) {\n return new Error(\n `Interaction input '${key}' uses a '${collector.kind}' collector without a default-renderable domain or target metadata. ` +\n \"Use formInput.choice(...), formInput.choiceList(...), formInput.number(...), formInput.resourceMap(...), cardInput(...), or boardInput(...). \" +\n \"For custom payloads, use a custom interaction surface with paramsSchema instead of the default InteractionForm.\",\n );\n}\n\nexport function collectInputDomains<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n eligibleTargets: Record<string, string[]>,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, InputDomainDescriptor> {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n const result: Record<string, InputDomainDescriptor> = {};\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") {\n continue;\n }\n if (collector.kind === \"prompt\") {\n const optionFactory = collector.meta?.options;\n if (!optionFactory) continue;\n result[key] = {\n type: \"choice\",\n choices: optionFactory(domainState, playerId, queries() as unknown).map(\n (option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n ...(() => {\n const issue = collector.validateTarget?.(\n domainState,\n playerId,\n queries() as unknown,\n String(option.id),\n );\n return issue\n ? {\n disabled: true,\n disabledReason: issue.message ?? issue.errorCode,\n }\n : {};\n })(),\n }),\n ),\n };\n continue;\n }\n if (collector.domain) {\n const domainProjector = collector.domain;\n const dependencies = collector.dependsOn ?? [];\n if (\n options.includeEligibleTargets === false &&\n !Object.prototype.hasOwnProperty.call(eligibleTargets, key)\n ) {\n const lazyDomain = lazyTargetDomainFromCollectorMetadata(\n key,\n collector,\n dependencies,\n );\n if (lazyDomain) {\n result[key] = lazyDomain;\n continue;\n }\n }\n const baseDomain = withSelection(\n domainProjector(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n {},\n ),\n collector,\n );\n if (dependencies.length === 0) {\n result[key] = baseDomain;\n continue;\n }\n const caseCount = dependencyCaseCount(dependencies, result);\n const lazyDomain =\n caseCount > MAX_EAGER_DEPENDENT_DOMAIN_CASES\n ? toLazyTargetDomain(key, baseDomain, dependencies)\n : null;\n if (lazyDomain) {\n result[key] = lazyDomain;\n continue;\n }\n const dependentCases = cartesianDependencyTuples(\n dependencies,\n result,\n ).map((values) => ({\n when: values,\n domain: withoutDependentProjection(\n withSelection(\n domainProjector(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n values,\n ),\n collector,\n ),\n ),\n }));\n result[key] = {\n ...baseDomain,\n dependencies: {\n mode: \"eager\",\n dependentCases,\n },\n } as InputDomainDescriptor;\n continue;\n }\n throw unsupportedDefaultInputError(key, collector);\n }\n return result;\n}\n\nexport function collectInteractionInputs<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): InteractionInputDescriptorShape[] {\n const collectors = interactionInputsOf(interaction);\n const dependencyKeys = new Set(\n Object.values(collectors).flatMap((collector) => [\n ...(collector.dependsOn ?? []),\n ]),\n );\n const collectedEligibleTargets =\n options.includeEligibleTargets === false && dependencyKeys.size === 0\n ? {}\n : collectEligibleTargets(interaction, domainState, playerId, options);\n const eligibleTargets =\n options.includeEligibleTargets === false\n ? Object.fromEntries(\n Object.entries(collectedEligibleTargets).filter(([key]) =>\n dependencyKeys.has(key),\n ),\n )\n : collectedEligibleTargets;\n const domainsByKey = collectInputDomains(\n interaction,\n domainState,\n playerId,\n eligibleTargets,\n options,\n );\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n return Object.entries(collectors).flatMap(([key, collector]) => {\n if (collector.kind === \"rng\") {\n return [];\n }\n const domain = domainsByKey[key];\n if (!domain && collector.kind === \"prompt\") {\n return [];\n }\n if (!domain) {\n throw unsupportedDefaultInputError(key, collector);\n }\n const dynamicDefault = collector.resolveDefaultValue?.(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n domain,\n );\n const defaultValue =\n \"defaultValue\" in collector ? collector.defaultValue : dynamicDefault;\n warnConcreteDependentChoiceDefault({\n inputKey: key,\n collector,\n domain,\n defaultValue,\n dependencyKeys,\n options,\n });\n return [\n {\n key,\n kind: collector.kind,\n domain,\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n },\n ];\n });\n}\n\nconst concreteDependentChoiceDefaultWarnings = new Set<string>();\n\nfunction warnConcreteDependentChoiceDefault({\n inputKey,\n collector,\n domain,\n defaultValue,\n dependencyKeys,\n options,\n}: {\n inputKey: string;\n collector: InputCollector;\n domain: InputDomainDescriptor;\n defaultValue: unknown;\n dependencyKeys: ReadonlySet<string>;\n options: CollectorProjectionOptions<CollectorState>;\n}): void {\n if (\n !options.diagnostics ||\n !dependencyKeys.has(inputKey) ||\n collector.kind !== \"form\" ||\n domain.type !== \"choice\" ||\n defaultValue === undefined ||\n defaultValue === null\n ) {\n return;\n }\n\n const warningKey = `${inputKey}:${String(defaultValue)}`;\n if (concreteDependentChoiceDefaultWarnings.has(warningKey)) {\n return;\n }\n concreteDependentChoiceDefaultWarnings.add(warningKey);\n options.diagnostics.event({\n type: \"authoringWarning\",\n code: \"dependent-choice-concrete-default\",\n message: `Form choice input \"${inputKey}\" feeds another collector and defaulted to \"${String(\n defaultValue,\n )}\". Dependent choices that select the object an action applies to should usually use defaultValue: () => undefined so collection stays explicit.`,\n });\n}\n\nexport function collectPromptOptions(\n interaction: {\n inputs: Record<string, InputCollector>;\n },\n domainState: unknown,\n playerId: string,\n queries: unknown,\n): Array<{ id: string; label?: string }> | undefined {\n for (const collector of Object.values(interaction.inputs)) {\n if (collector.kind !== \"prompt\") continue;\n const factory = collector.meta?.options;\n if (!factory) continue;\n return factory(domainState, playerId, queries).map((option) => ({\n id: String(option.id),\n ...(option.label !== undefined ? { label: option.label } : {}),\n }));\n }\n return undefined;\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectCardZoneIds,\n collectFirstCardZoneId,\n interactionInputsOf,\n} from \"./collector-introspection\";\nimport {\n collectInteractionInputs,\n collectPromptOptions,\n} 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 deriveInteractionKind(\n inputs: Record<string, InputCollector>,\n): \"action\" | \"prompt\" {\n for (const collector of Object.values(inputs)) {\n if (collector.kind === \"prompt\") {\n return \"prompt\";\n }\n }\n return \"action\";\n}\n\nfunction isTargetCollector(collector: InputCollector): boolean {\n switch (collector.kind) {\n case \"card\":\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isManyCollector(collector: InputCollector): boolean {\n return collector.selection?.mode === \"many\";\n}\n\nfunction terminalCollectorsForInputs(\n inputs: Record<string, InputCollector>,\n): InputCollector[] {\n const terminalKeys = new Set(Object.keys(inputs));\n for (const collector of Object.values(inputs)) {\n for (const dependencyKey of collector.dependsOn ?? []) {\n terminalKeys.delete(dependencyKey);\n }\n }\n const collectors: InputCollector[] = [];\n for (const key of terminalKeys) {\n const collector = inputs[key];\n if (collector) collectors.push(collector);\n }\n return collectors;\n}\n\nfunction deriveCommitPolicy(\n inputs: Record<string, InputCollector>,\n explicit: InteractionDescriptorShape[\"commit\"] | undefined,\n): InteractionDescriptorShape[\"commit\"] {\n const collectors = Object.values(inputs);\n const hasManyCollector = collectors.some(isManyCollector);\n if (explicit) {\n if (explicit.mode === \"autoWhenReady\" && hasManyCollector) {\n throw new Error(\n 'Interactions with many(...) inputs must use commit: { mode: \"manual\" }.',\n );\n }\n return explicit;\n }\n if (hasManyCollector) {\n return { mode: \"manual\" };\n }\n if (collectors.length === 0 || !collectors.some(isTargetCollector)) {\n return { mode: \"manual\" };\n }\n const terminalCollectors = terminalCollectorsForInputs(inputs);\n if (terminalCollectors.length === 0) {\n return { mode: \"manual\" };\n }\n return terminalCollectors.every(\n (collector) => isTargetCollector(collector) || collector.kind === \"rng\",\n ) && terminalCollectors.some(isTargetCollector)\n ? { mode: \"autoWhenReady\" }\n : { mode: \"manual\" };\n}\n\nfunction projectInteractionMetadata(interaction: {\n inputs: Record<string, InputCollector>;\n commit?: InteractionDescriptorShape[\"commit\"];\n 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: deriveInteractionKind(interaction.inputs),\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 \"INSUFFICIENT_RESOURCES\":\n if (decision.missingResources) {\n return {\n status: \"insufficientResources\",\n reason: decision.message ?? decision.code,\n missingResources: { ...decision.missingResources },\n };\n }\n return {\n status: \"blocked\",\n reason: decision.message ?? decision.code,\n code: decision.code,\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 Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n state: TrustedState<Contract>,\n playerId: TrustedPlayerId<Contract>,\n interactionId: TrustedInteractionId<Contract, Definitions, Views>,\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >,\n decision: InteractionDecision,\n options: {\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >;\n includeEligibleTargets?: boolean;\n includeDiagnosticReasons?: boolean;\n } = {},\n): TrustedInteractionDescriptorShape<Contract, Definitions, Views> {\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n const domainState =\n options.projection?.domainState ?? scope.toDomainState(state);\n const phaseName = state.flow.currentPhase as PhaseName;\n const interactionInputs = interactionInputsOf(interaction);\n const metadata = projectInteractionMetadata({\n ...interaction,\n inputs: interactionInputs,\n interactionId: String(interactionId),\n });\n const queries = options.projection?.q ?? createStateQueries(domainState);\n const derived = options.projection?.derived;\n const shouldMaterializeInputDomains =\n decision.available || decision.code !== FrameworkErrorCodes.NOT_YOUR_TURN;\n const promptContext =\n metadata.kind === \"prompt\"\n ? {\n to: playerId,\n title: metadata.label,\n options: shouldMaterializeInputDomains\n ? collectPromptOptions(\n { inputs: interactionInputs },\n domainState,\n playerId as unknown as string,\n queries,\n )\n : undefined,\n }\n : undefined;\n const inputs = shouldMaterializeInputDomains\n ? enrichResourceInputPresentation(\n collectInteractionInputs(interaction, domainState, playerId, {\n queries,\n derived,\n eligibleTargetCache: options.projection?.eligibleTargets,\n eligibleTargetCachePrefix: `${phaseName}:${String(\n interactionId,\n )}:${String(playerId)}`,\n includeEligibleTargets: options.includeEligibleTargets,\n diagnostics: scope.diagnostics,\n }),\n scope.definition.contract.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(interaction),\n zoneIds: collectCardZoneIds(interaction),\n inputs,\n cost: decision.cost ? { ...decision.cost } : undefined,\n currentResources: decision.cost\n ? {\n ...(queries.player.resources(playerId) as\n | Record<string, number>\n | undefined),\n }\n : undefined,\n availability: interactionAvailabilityFromDecision(decision),\n reasons:\n options.includeDiagnosticReasons && !decision.available && decision.ruleId\n ? [{ ruleId: decision.ruleId, errorCode: decision.code }]\n : undefined,\n };\n if (metadata.kind === \"prompt\") {\n return {\n ...baseDescriptor,\n kind: \"prompt\",\n context: promptContext ?? {\n to: playerId,\n title: humanizeInteractionId(interactionId),\n },\n } as Descriptor;\n }\n return {\n ...baseDescriptor,\n kind: \"action\",\n } as Descriptor;\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport { FrameworkErrorCodes } from \"../../model\";\nimport {\n parseInteractionParams,\n prepareInteractionProjectionParams,\n validateCollectorTargets,\n} from \"./collector-params\";\nimport { buildInteractionDescriptor } from \"./interaction-descriptor\";\nimport type { createInteractionAuthorization } from \"./interaction-authorization\";\nimport type { createStageResolver } from \"./stage-resolver\";\nimport {\n makeValidationError,\n type InteractionDecision,\n type InteractionDiagnosticsMode,\n type InteractionExplanation,\n type InteractionDecisionResult,\n type ResolveDecisionInput,\n type TrustedInteractionDescriptorShape,\n type TrustedInteractionId,\n} from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype StageResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createStageResolver<Contract, Definitions, Views>>;\n\ntype AuthorizationFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n typeof createInteractionAuthorization<Contract, Definitions, Views>\n>;\n\ntype InteractionRuleIssue = {\n ruleId: string;\n errorCode: string;\n message?: string;\n};\n\ntype RuleValidationIssue = {\n errorCode: string;\n message?: string;\n};\n\nfunction domainEligibleCount(domain: unknown): number | \"lazy\" {\n if (!domain || typeof domain !== \"object\") return \"lazy\";\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 \"lazy\";\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 Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n stages: StageResolverFor<Contract, Definitions, Views>,\n authorization: AuthorizationFor<Contract, Definitions, Views>,\n options: { diagnostics?: InteractionDiagnosticsMode } = {},\n) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type InteractionId = TrustedInteractionId<Contract, Definitions, Views>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n\n 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 evaluateInteractionCost(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n playerId: PlayerId,\n params: Record<string, unknown>,\n projection?: ProjectionContext<DomainState, State>,\n ):\n | { cost?: Record<string, number>; missing?: Record<string, number> }\n | { error: unknown } {\n if (!interaction.cost) {\n return {};\n }\n const args = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId, params },\n },\n projection,\n );\n try {\n const cost = { ...interaction.cost(args) };\n const typedCost = cost as Parameters<typeof args.q.player.canAfford>[1];\n const missing = args.q.player.canAfford(playerId, typedCost)\n ? {}\n : { ...args.q.player.missingResources(playerId, typedCost) };\n return { cost, missing };\n } catch (error) {\n return { error };\n }\n }\n\n function resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params = {},\n mode,\n projection,\n }: ResolveDecisionInput<Contract>): InteractionDecisionResult<\n Contract,\n Definitions,\n Views\n > {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) {\n return {\n found: false,\n validation: makeValidationError(\n \"unsupported-action\",\n `Interaction '${interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n ),\n };\n }\n const trustedInteractionId = interactionId as InteractionId;\n\n const parseForSubmit = mode === \"submit\";\n const parsed = parseForSubmit\n ? parseInteractionParams(interaction, params, {\n skipRng: true,\n playerId,\n })\n : ({\n ok: true,\n params: prepareInteractionProjectionParams(interaction, params),\n } as const);\n if (!parsed.ok) {\n 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, includeEligibleTargets: false },\n ),\n validation: makeValidationError(\n \"invalid-action-params\",\n parsed.message,\n ),\n };\n }\n\n const phase = scope.phaseByName(phaseName);\n const isSimultaneousSubmit =\n isSimultaneousPhase(phase) &&\n interactionId === SIMULTANEOUS_SUBMIT_INTERACTION_ID;\n const alreadySubmitted =\n isSimultaneousSubmit &&\n state.runtime.simultaneous?.current?.phaseName === phaseName &&\n Boolean(state.runtime.simultaneous.current.submissions[playerId]);\n const canResubmit =\n isSimultaneousSubmit &&\n (phase as { canResubmit?: boolean }).canResubmit === true;\n\n const actorAuthorization =\n authorization.resolveInteractionActorAuthorization(\n state,\n interaction,\n projection,\n );\n const authorized = authorization.isActorAuthorized(\n state,\n playerId,\n actorAuthorization,\n );\n let visible = authorization.isInteractionVisible(\n interaction,\n actorAuthorization,\n authorized,\n );\n if (alreadySubmitted && !canResubmit && mode !== \"submit\") {\n visible = false;\n }\n const stageAllow = stages.resolveActiveStageAllowlist(\n state,\n phaseName,\n projection,\n );\n const stageAllowed = !stageAllow || stageAllow.has(interactionId);\n const stepAllowed = stages.isInteractionAllowedInStep(\n state,\n interaction,\n projection,\n );\n\n let validation: ReducerValidationResult = { valid: true };\n if (!authorized) {\n validation =\n actorAuthorization.mode === \"addressees\"\n ? makeValidationError(\n \"prompt-not-owned\",\n `Interaction '${interactionId}' is not addressed to '${playerId}'.`,\n )\n : makeValidationError(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${interactionId}').`,\n );\n } else if (alreadySubmitted && !canResubmit) {\n validation = makeValidationError(\n \"ALREADY_SUBMITTED\",\n `Interaction '${interactionId}' has already been submitted by '${playerId}'.`,\n );\n } else if (!stageAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current stage.`,\n );\n } else if (!stepAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current step.`,\n );\n }\n\n const canEvaluateProjectionDetails =\n mode !== \"submit\" && visible && authorized && stageAllowed && stepAllowed;\n const canContinueSubmitValidation = mode === \"submit\" && validation.valid;\n let cost: Record<string, number> | undefined;\n let missingResources: Record<string, number> | undefined;\n let costAffordable = true;\n if (canContinueSubmitValidation || canEvaluateProjectionDetails) {\n const costDecision = evaluateInteractionCost(\n state,\n interaction,\n playerId,\n parsed.params,\n projection,\n );\n if (\"error\" in costDecision) {\n costAffordable = false;\n validation = makeValidationError(\n \"cost-unavailable\",\n `Interaction '${interactionId}' cost could not be evaluated.`,\n );\n } else {\n cost = costDecision.cost ?? undefined;\n missingResources = costDecision.missing ?? undefined;\n costAffordable =\n !missingResources ||\n Object.values(missingResources).every((amount) => amount <= 0);\n if (!costAffordable) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n \"INSUFFICIENT_RESOURCES\",\n `Interaction '${interactionId}' cannot be afforded.`,\n );\n }\n }\n }\n }\n\n let ruleAvailabilityIssue: InteractionRuleIssue | undefined;\n if (\n (canContinueSubmitValidation || canEvaluateProjectionDetails) &&\n interaction.rules\n ) {\n const availabilityArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId },\n },\n projection,\n );\n for (const rule of interaction.rules) {\n if (!rule.available) continue;\n if (!rule.available(availabilityArgs)) {\n ruleAvailabilityIssue = issueFromRule({\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 let authoredValidation:\n | {\n ruleId: string;\n errorCode: string;\n message?: string;\n }\n | undefined;\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n if (validation.valid && mode === \"submit\") {\n validation = validateCollectorTargets(\n interaction,\n projection?.domainState ?? scope.toDomainState(state),\n playerId,\n parsed.params,\n );\n }\n }\n\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n const validateArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: {\n playerId,\n params: parsed.params,\n },\n },\n projection,\n );\n for (const rule of interaction.rules ?? []) {\n if (!rule.validate) continue;\n authoredValidation = issueFromRuleValidationResult(\n {\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 available =\n stageAllowed &&\n stepAllowed &&\n authorized &&\n !ruleAvailabilityIssue &&\n costAffordable &&\n !authoredValidation;\n const descriptorDecision: InteractionDecision = available\n ? { available: true, cost }\n : !authorized\n ? {\n available: false,\n code: FrameworkErrorCodes.NOT_YOUR_TURN,\n message: \"Not your turn\",\n cost,\n }\n : !stageAllowed\n ? {\n available: false,\n code: FrameworkErrorCodes.WRONG_PHASE,\n message: \"Interaction not allowed in current stage\",\n cost,\n }\n : !stepAllowed\n ? {\n available: false,\n code: FrameworkErrorCodes.WRONG_STEP,\n message: \"Interaction not allowed in current step\",\n cost,\n }\n : ruleAvailabilityIssue\n ? {\n available: false,\n code: ruleAvailabilityIssue.errorCode,\n ruleId: ruleAvailabilityIssue.ruleId,\n message:\n ruleAvailabilityIssue.message ??\n ruleAvailabilityIssue.errorCode,\n cost,\n }\n : !costAffordable\n ? {\n available: false,\n code: \"INSUFFICIENT_RESOURCES\",\n message: \"INSUFFICIENT_RESOURCES\",\n cost,\n missingResources,\n }\n : authoredValidation\n ? {\n available: false,\n code: authoredValidation.errorCode,\n ruleId: authoredValidation.ruleId,\n message:\n authoredValidation.message ?? \"Interaction unavailable\",\n cost,\n }\n : {\n available: false,\n code: \"action-unavailable\",\n message: \"Interaction unavailable\",\n cost,\n };\n const descriptor = buildInteractionDescriptor(\n scope,\n state,\n playerId,\n trustedInteractionId,\n interaction,\n descriptorDecision,\n {\n projection,\n includeEligibleTargets: available || mode === \"card\",\n includeDiagnosticReasons: options.diagnostics === \"verbose\",\n },\n );\n return {\n found: true,\n interaction,\n parsedParams: parsed.params,\n visible,\n descriptor,\n validation,\n };\n }\n\n function resolveAvailableInteractionsFor(\n state: State,\n playerId: PlayerId,\n options: { projection?: ProjectionContext<DomainState, State> } = {},\n ) {\n const phaseName = state.flow.currentPhase as PhaseName;\n const descriptors: Descriptor[] = [];\n for (const [interactionId] of scope.interactionEntriesForPhase(phaseName)) {\n const decision = resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params: {},\n mode: \"descriptor\",\n projection: options.projection,\n });\n if (!decision.found || !decision.visible) continue;\n descriptors.push(decision.descriptor);\n }\n return descriptors;\n }\n\n function explainInteraction(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n projection?: ProjectionContext<DomainState, State>;\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 === \"addressees\"\n ? [...actorAuthorization.addressees]\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 : decision.found &&\n decision.descriptor.availability.status ===\n \"insufficientResources\"\n ? {\n available: false,\n code: \"INSUFFICIENT_RESOURCES\",\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 =\n authorized &&\n stages.isInteractionAllowedInStep(state, interaction, projection);\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 includeEligibleTargets: true,\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: domainEligibleCount(entry.domain),\n })),\n };\n }\n\n return {\n evaluateInteractionCost,\n explainInteraction,\n resolveAvailableInteractionsFor,\n resolveInteractionDecision,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n StageSpec,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport function createStageResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n\n function resolveActiveStage(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): { id: string; stage: StageSpec<DomainState, Manifest> } | null {\n const stages = scope.stagesForPhase(phaseName);\n if (stages.length === 0) return null;\n const domainState = projection?.domainState ?? scope.toDomainState(state);\n const context = scope.buildContext(state);\n for (const [stageId, stage] of stages) {\n const matches = stage.when\n ? stage.when({\n ...context,\n state: domainState,\n })\n : true;\n if (matches) return { id: stageId, stage };\n }\n return null;\n }\n\n function resolveActiveStageAllowlist(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): Set<string> | null {\n const cacheKey = String(phaseName);\n if (projection?.stageAllowlists.has(cacheKey)) {\n return projection.stageAllowlists.get(cacheKey) ?? null;\n }\n const activeStage = resolveActiveStage(state, phaseName, projection);\n const allowlist = activeStage ? new Set(activeStage.stage.allow) : null;\n projection?.stageAllowlists.set(cacheKey, allowlist);\n return allowlist;\n }\n\n function isInteractionAllowedInStep(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): boolean {\n const allowedSteps = interaction.__steps ?? [];\n if (allowedSteps.length === 0) {\n return true;\n }\n const currentStep = (\n (projection?.domainState ?? scope.toDomainState(state)).phase as {\n step?: unknown;\n }\n ).step;\n return (\n typeof currentStep === \"string\" && allowedSteps.includes(currentStep)\n );\n }\n\n return {\n isInteractionAllowedInStep,\n resolveActiveStage,\n resolveActiveStageAllowlist,\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerReject,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport { collectEligibleTargets } from \"./collector-eligibility\";\nimport {\n collectFirstCardZoneId,\n findCardInputKey,\n findCardInputKeyForZone,\n} from \"./collector-introspection\";\nimport { parseInteractionParams } from \"./collector-params\";\nimport { createInteractionAuthorization } from \"./interaction-authorization\";\nimport { createInteractionDecisionResolver } from \"./interaction-decision\";\nimport { createStageResolver } from \"./stage-resolver\";\nimport {\n rejectResult,\n type TrustedInput,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\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 Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n options: { diagnostics?: InteractionDiagnosticsMode } = {},\n) {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const stages = createStageResolver(scope);\n const authorization = createInteractionAuthorization(scope);\n const decisions = createInteractionDecisionResolver(\n scope,\n stages,\n authorization,\n options,\n );\n\n function validateClientInput(\n state: State,\n input: ReducerInput,\n ): ReducerValidationResult {\n if (input.kind === \"interaction\") {\n const decision = decisions.resolveInteractionDecision({\n state,\n playerId: input.playerId as PlayerId,\n interactionId: input.interactionId,\n params: (input.params ?? {}) as Record<string, unknown>,\n mode: \"submit\",\n });\n return decision.validation;\n }\n return { valid: true };\n }\n\n function validateOrReject(\n state: State,\n input: ReducerInput,\n ): ReducerReject | null {\n const validation = validateClientInput(state, input);\n if (validation.valid) {\n return null;\n }\n const invalidValidation = validation as Exclude<\n ReducerValidationResult,\n { valid: true }\n >;\n return rejectResult(invalidValidation.errorCode, invalidValidation.message);\n }\n\n return {\n collectEligibleTargets,\n collectFirstCardZoneId,\n evaluateInteractionCost: decisions.evaluateInteractionCost,\n explainInteraction: decisions.explainInteraction,\n findCardInputKey,\n findCardInputKeyForZone,\n isActorAuthorized: authorization.isActorAuthorized,\n isInteractionAllowedInStep: stages.isInteractionAllowedInStep,\n parseInteractionParams,\n resolveActiveStage: stages.resolveActiveStage,\n resolveActiveStageAllowlist: stages.resolveActiveStageAllowlist,\n resolveAvailableInteractionsFor: decisions.resolveAvailableInteractionsFor,\n resolveInteractionActorAuthorization:\n authorization.resolveInteractionActorAuthorization,\n resolveInteractionDecision: decisions.resolveInteractionDecision,\n validateClientInput,\n validateOrReject,\n };\n}\n","import { safeParseOrThrow } from \"../../parse-utils\";\nimport { applySetupBootstrap } from \"../../setup-bootstrap\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n ExactManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeSetupSelection,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../../model\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport { isPerPlayer } from \"../../per-player\";\nimport { normalizeResult } from \"./runtime-scope\";\nimport { createMutableRandomHelpers } from \"./rng-sampler\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type {\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createLifecycleRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type ExactManifest = ExactManifestContractOf<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveSelectedSetup(\n setup: RuntimeSetupSelectionInput<Manifest> | null | undefined,\n ): State[\"runtime\"][\"setup\"] {\n if (!setup) {\n return null;\n }\n const manifestProfile = scope.manifestSetupProfilesById[setup.profileId];\n if (!manifestProfile) {\n throw new Error(`Unknown setup profile '${setup.profileId}'.`);\n }\n const resolvedOptionValues: Record<string, string | null> =\n Object.fromEntries(\n scope.definition.contract.manifest.literals.setupOptionIds.map(\n (optionId: string) => [optionId, null] as const,\n ),\n );\n\n for (const [optionId, choiceId] of Object.entries(\n manifestProfile.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId;\n }\n for (const [optionId, choiceId] of Object.entries(\n setup.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId ?? null;\n }\n\n return {\n profileId: setup.profileId,\n optionValues:\n resolvedOptionValues as RuntimeSetupSelection<Manifest>[\"optionValues\"],\n };\n }\n\n function resolveInitialPhase(setup: State[\"runtime\"][\"setup\"]): PhaseName {\n const setupProfile = setup\n ? scope.reducerSetupProfiles[setup.profileId]\n : null;\n const resolvedPhase = (setupProfile?.initialPhase ??\n scope.defaultInitialPhase ??\n scope.phaseEntries[0]?.[0]) as PhaseName | undefined;\n if (!resolvedPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n if (!scope.definition.phases[resolvedPhase]) {\n throw new Error(`Unknown initial phase '${resolvedPhase}'.`);\n }\n return resolvedPhase;\n }\n\n function applySelectedSetupBootstrap(state: State): State {\n const setup = state.runtime.setup;\n if (!setup) {\n return state;\n }\n\n const bootstrap = scope.reducerSetupProfiles[setup.profileId]?.bootstrap;\n if (!bootstrap || bootstrap.length === 0) {\n return state;\n }\n\n return applySetupBootstrap(state, bootstrap) as State;\n }\n\n function initPhaseState(\n state: State,\n phaseName: PhaseName,\n playerIds: PlayerId[],\n ): State {\n const phase = scope.phaseByName(phaseName);\n const phaseState = phase.initialState\n ? phase.initialState({\n manifest: scope.definition.contract.manifest,\n state,\n playerIds,\n setup: state.runtime.setup,\n })\n : safeParseOrThrow(phase.state, {}, `phase:${phaseName}:initialState`);\n return {\n ...state,\n phase: safeParseOrThrow(\n phase.state,\n phaseState,\n `phase:${phaseName}`,\n ) as State[\"phase\"],\n flow: {\n ...state.flow,\n currentPhase: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n };\n }\n\n function enterPhase({\n state,\n phaseName,\n playerIds,\n event,\n }: {\n state: State;\n phaseName: PhaseName;\n playerIds: PlayerId[];\n event: \"initialize\" | \"transition\";\n }): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n const workingState = initPhaseState(state, phaseName, playerIds);\n const phase = scope.phaseByName(phaseName);\n let nextState: State = workingState;\n const instructions: RuntimeInstructionForState<State>[] = [];\n if (phase.enter) {\n const random = createMutableRandomHelpers(workingState.runtime.rng);\n const entered = normalizeResult(\n phase.enter(\n scope.buildRuntimeArgs(\n workingState,\n {\n event,\n state: scope.toDomainState(workingState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(workingState),\n );\n if (entered.type === \"reject\") {\n throw new Error(\n entered.message ??\n (event === \"initialize\"\n ? `Reducer phase '${phaseName}' rejected during initialization.`\n : `Reducer phase '${phaseName}' rejected during phase initialization.`),\n );\n }\n nextState = {\n ...entered.state,\n runtime: { ...workingState.runtime, rng: random.currentRng() },\n } as State;\n if (entered.instructions) instructions.push(...entered.instructions);\n }\n\n const activeStage = interactions.resolveActiveStage(nextState, phaseName);\n if (activeStage?.stage.onEnter) {\n const random = createMutableRandomHelpers(nextState.runtime.rng);\n const stageEntered = normalizeResult(\n activeStage.stage.onEnter(\n scope.buildRuntimeArgs(\n nextState,\n {\n event,\n state: scope.toDomainState(nextState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(nextState),\n );\n if (stageEntered.type === \"reject\") {\n throw new Error(\n stageEntered.message ??\n (event === \"initialize\"\n ? `Reducer stage '${phaseName}.${activeStage.id}' rejected during initialization.`\n : `Reducer stage '${phaseName}.${activeStage.id}' rejected during stage initialization.`),\n );\n }\n nextState = {\n ...stageEntered.state,\n runtime: { ...nextState.runtime, rng: random.currentRng() },\n } as State;\n if (stageEntered.instructions) {\n instructions.push(...stageEntered.instructions);\n }\n }\n return { state: nextState, instructions };\n }\n\n function initializePhaseResult(\n state: State,\n phaseName: PhaseName,\n ): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n return enterPhase({\n state,\n phaseName,\n playerIds: scope.buildContext(state).playerOrder as PlayerId[],\n event: \"transition\",\n });\n }\n\n function createInitialState({\n table,\n playerIds,\n rngSeed,\n setup,\n }: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n }): { state: State; initialPhase: PhaseName } {\n const tableWithManifestDefaults = applyManifestTableDefaults(\n table,\n playerIds,\n );\n const parsedTable = safeParseOrThrow(\n scope.definition.contract.manifest.tableSchema,\n tableWithManifestDefaults,\n \"table\",\n ) as State[\"table\"];\n const selectedSetup = resolveSelectedSetup(setup);\n const initialSetup =\n selectedSetup as RuntimeSetupSelection<ExactManifest> | null;\n const initialPhase = resolveInitialPhase(selectedSetup);\n const initialQueries = createStateQueries({ table: parsedTable });\n return {\n initialPhase,\n state: {\n table: parsedTable,\n publicState: safeParseOrThrow(\n scope.definition.contract.state.public,\n scope.definition.initial?.public?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"publicState\",\n ) as State[\"publicState\"],\n privateState: Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n scope.definition.contract.state.private,\n scope.definition.initial?.private?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n playerId,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"privateState\"],\n hiddenState: safeParseOrThrow(\n scope.definition.contract.state.hidden,\n scope.definition.initial?.hidden?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"hiddenState\",\n ) as State[\"hiddenState\"],\n flow: {\n currentPhase: initialPhase as State[\"flow\"][\"currentPhase\"],\n turn: 0,\n round: 0,\n activePlayers: [],\n },\n phase: {} as State[\"phase\"],\n runtime: {\n rng: {\n seed: rngSeed ?? null,\n cursor: 0,\n trace: [],\n },\n setup: selectedSetup,\n simultaneous: { current: null },\n lastTransition: null,\n } as State[\"runtime\"],\n },\n };\n }\n\n function applyManifestTableDefaults(\n table: State[\"table\"],\n playerIds: PlayerId[],\n ): State[\"table\"] {\n const manifest = scope.definition.contract.manifest;\n const defaultZones = manifest.defaults.zones(playerIds);\n const tableZones = table.zones ?? {};\n const tableResources = table.resources;\n return {\n ...table,\n playerOrder:\n table.playerOrder && table.playerOrder.length > 0\n ? table.playerOrder\n : playerIds,\n zones: {\n ...defaultZones,\n ...tableZones,\n shared: {\n ...(defaultZones.shared ?? {}),\n ...(tableZones.shared ?? {}),\n },\n perPlayer: {\n ...(defaultZones.perPlayer ?? {}),\n ...(tableZones.perPlayer ?? {}),\n },\n visibility: {\n ...(defaultZones.visibility ?? {}),\n ...(tableZones.visibility ?? {}),\n },\n cardSetIdsByZoneId: {\n ...(defaultZones.cardSetIdsByZoneId ?? {}),\n ...(tableZones.cardSetIdsByZoneId ?? {}),\n },\n },\n decks: {\n ...manifest.defaults.decks(playerIds),\n ...table.decks,\n },\n hands: {\n ...manifest.defaults.hands(playerIds),\n ...table.hands,\n },\n handVisibility: {\n ...manifest.defaults.handVisibility(playerIds),\n ...table.handVisibility,\n },\n ownerOfCard: {\n ...manifest.defaults.ownerOfCard(playerIds),\n ...table.ownerOfCard,\n },\n visibility: {\n ...manifest.defaults.visibility(playerIds),\n ...table.visibility,\n },\n resources:\n isPerPlayer(tableResources) && tableResources.entries.length > 0\n ? tableResources\n : manifest.defaults.resources(playerIds),\n } as State[\"table\"];\n }\n\n function initializeSession(\n input: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n },\n drainInstructions: (\n state: State,\n instructions: RuntimeInstructionForState<State>[],\n ) => State,\n ): SessionState {\n const initial = createInitialState(input);\n const bootstrappedState = applySelectedSetupBootstrap(initial.state);\n const entered = enterPhase({\n state: bootstrappedState,\n phaseName: initial.initialPhase,\n playerIds: input.playerIds,\n event: \"initialize\",\n });\n return scope.toSessionState(\n drainInstructions(entered.state, entered.instructions),\n );\n }\n\n return {\n createInitialState,\n enterPhase,\n initializePhaseResult,\n initializeSession,\n initPhaseState,\n resolveInitialPhase,\n resolveSelectedSetup,\n };\n}\n","import { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { RuntimeTableRecord, TableQueriesOfState } from \"../../model\";\n\ntype ProjectionFxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\nexport type ProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState = ProjectionFxState,\n> = {\n readonly domainState: State;\n readonly q: TableQueriesOfState<State>;\n readonly derived: DerivedResolver;\n readonly fx: ReturnType<typeof createReducerFx<FxState>>;\n readonly eligibleTargets: Map<string, string[]>;\n readonly stageAllowlists: Map<string, Set<string> | null>;\n};\n\nexport function createProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState,\n>(options: {\n domainState: State;\n combinedState: FxState;\n}): ProjectionContext<State, FxState> {\n const q = createStateQueries(options.domainState);\n return {\n domainState: options.domainState,\n q,\n derived: createDerivedResolver(options.domainState, { q }),\n fx: createReducerFx<FxState>(),\n eligibleTargets: new Map(),\n stageAllowlists: new Map(),\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n InteractionDescriptorShape,\n createInteractionResolver,\n} from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\nimport {\n createProjectionContext,\n type ProjectionContext,\n} from \"./projection-context\";\nimport { collectCardZoneIds } from \"./collector-introspection\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n simultaneousSubmitInteraction,\n} from \"./simultaneous-player\";\n\ntype ProjectionMode = \"full\" | \"actionsOnly\";\ntype DescriptorRegistry = {\n add(descriptor: InteractionDescriptorShape, actorSeat: number): string;\n entries(): Record<string, InteractionDescriptorShape>;\n};\n\ntype CanonicalJson =\n | null\n | boolean\n | number\n | string\n | CanonicalJson[]\n | { [key: string]: CanonicalJson };\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function createDescriptorRegistry(): DescriptorRegistry {\n const byRef: Record<string, InteractionDescriptorShape> = {};\n const byHash = new Map<string, string>();\n return {\n add(descriptor, actorSeat) {\n const enriched = descriptorWithBrowserReplayDigests(\n descriptor,\n actorSeat,\n );\n const fingerprint = stableStringify(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 entries() {\n return byRef;\n },\n };\n }\n\n function resolveZoneHandlesFor(\n combinedState: State,\n playerId: PlayerId,\n actorSeat: number,\n projection: ProjectionContext<DomainState, State>,\n registry: DescriptorRegistry,\n ) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const zoneIds = new Set<string>(scope.zonesForPhase(phaseName).map(String));\n for (const [, interaction] of scope.interactionEntriesForPhase(phaseName)) {\n for (const zoneId of collectCardZoneIds(interaction)) {\n zoneIds.add(String(zoneId));\n }\n }\n const zones = [...zoneIds];\n if (zones.length === 0) return {};\n const q = projection.q;\n const result: Record<\n string,\n {\n cardIds: string[];\n cardViewsById: Record<string, string>;\n playableByCardId: Record<string, string[]>;\n }\n > = {};\n for (const zoneId of zones) {\n const table = combinedState.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n const isPlayerZone =\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {});\n const cardIds = Array.from(\n isPlayerZone\n ? (q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly string[])\n : (q.zone.sharedCards(zoneId as never) as readonly string[]),\n );\n const cardInteractionIds = scope\n .interactionEntriesForPhase(phaseName)\n .filter(([, interaction]) =>\n collectCardZoneIds(interaction).map(String).includes(zoneId),\n )\n .map(([interactionId]) => interactionId);\n const cardViewsById: Record<string, string> = {};\n const playableByCardId: Record<string, string[]> = {};\n for (const cardId of cardIds) {\n cardViewsById[cardId] = JSON.stringify(q.card.get(cardId as never));\n const perCard: string[] = [];\n for (const interactionId of cardInteractionIds) {\n const interaction = scope.findInteractionInPhase(\n phaseName,\n interactionId,\n );\n if (!interaction) continue;\n const cardKey = interactions.findCardInputKeyForZone(\n interaction,\n zoneId,\n );\n const params = cardKey ? { [cardKey]: cardId } : {};\n const decision = interactions.resolveInteractionDecision({\n state: combinedState,\n playerId,\n interactionId,\n params,\n mode: \"card\",\n projection,\n });\n if (!decision.found || !decision.visible) continue;\n const cardDomain = cardKey\n ? decision.descriptor.inputs.find((input) => input.key === cardKey)\n ?.domain\n : undefined;\n const cardTargets =\n cardDomain?.type === \"cardTarget\" &&\n cardDomain.projection === \"resolved\"\n ? cardDomain.eligibleTargets\n : undefined;\n if (cardKey && !cardTargets?.includes(cardId)) {\n continue;\n }\n perCard.push(\n registry.add(\n {\n ...decision.descriptor,\n zoneId,\n },\n actorSeat,\n ),\n );\n }\n playableByCardId[cardId] = perCard;\n }\n result[zoneId] = {\n cardIds,\n cardViewsById,\n playableByCardId,\n };\n }\n return result;\n }\n\n function resolveCurrentStageFor(\n combinedState: State,\n projection?: ProjectionContext<DomainState, State>,\n ): string {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n return (\n interactions.resolveActiveStage(combinedState, phaseName, projection)\n ?.id ?? phaseName\n );\n }\n\n function resolveGuidanceFor(combinedState: State) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName) as {\n name?: unknown;\n guidance?: { summary?: unknown; objective?: unknown };\n };\n const phaseSummary = normalizeGuidanceText(phase.guidance?.summary);\n const phaseObjective = normalizeGuidanceText(phase.guidance?.objective);\n const setupProfileId = combinedState.runtime.setup?.profileId;\n const setupProfile =\n setupProfileId == null\n ? undefined\n : scope.manifestSetupProfilesById[String(setupProfileId)];\n const setupGuidance = setupProfile?.guidance;\n const setupSummary = normalizeGuidanceText(setupGuidance?.summary);\n const setup =\n setupProfileId == null || !setupProfile\n ? undefined\n : {\n profileId: String(setupProfileId),\n name: setupProfile.name,\n ...(setupSummary ? { summary: setupSummary } : {}),\n steps: (setupGuidance?.steps ?? []).map((step) => ({\n id: step.id,\n label: step.label,\n ...(step.description ? { description: step.description } : {}),\n })),\n };\n return {\n phase: {\n id: String(phaseName),\n label:\n normalizeGuidanceText(phase.name) ??\n humanizeGuidanceId(String(phaseName)),\n ...(phaseSummary ? { summary: phaseSummary } : {}),\n ...(phaseObjective ? { objective: phaseObjective } : {}),\n },\n ...(setup ? { setup } : {}),\n };\n }\n\n function normalizeGuidanceText(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\n function humanizeGuidanceId(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\n function resolveStageSeatsFor(state: SessionState): string[] {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (isSimultaneousPhase(phase)) {\n return resolveSimultaneousActors(scope, combinedState, phase).map(String);\n }\n return [...state.domain.flow.activePlayers];\n }\n\n function resolveSimultaneousPhaseFor(state: SessionState) {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) return null;\n const current = state.runtime.simultaneous?.current;\n if (!current || current.phaseName !== phaseName) return null;\n const submit = simultaneousSubmitInteraction(phase);\n if (!submit) return null;\n const actorIds = current.actors.map(String);\n const sealedPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] !== undefined,\n );\n const pendingPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] === undefined,\n );\n return {\n phaseName: String(current.phaseName),\n interactionId: SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n actorIds,\n sealedPlayerIds,\n pendingPlayerIds,\n };\n }\n\n function resolveViewFor(\n combinedState: State,\n playerId: PlayerId,\n viewId: string,\n projection: ProjectionContext<DomainState, State>,\n ): unknown {\n const views = scope.definition.views;\n const view = views?.[viewId as keyof typeof views];\n if (!view) {\n return null;\n }\n const viewArgs = {\n ...scope.buildContext(combinedState),\n ...scope.runtimeHelpers,\n fx: projection.fx,\n q: projection.q,\n derived: projection.derived,\n state: projection.domainState,\n playerId,\n } as unknown as Parameters<typeof view.project>[0];\n return view.project(viewArgs);\n }\n\n function projectSeatsDynamic({\n state,\n playerIds,\n viewId = \"player\",\n projectionMode = \"full\",\n }: {\n state: SessionState;\n playerIds: PlayerId[];\n viewId?: string;\n projectionMode?: ProjectionMode;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n const registry = createDescriptorRegistry();\n type SeatProjection = {\n view?: ReturnType<typeof resolveViewFor>;\n availableInteractionRefs: string[];\n zones?: ReturnType<typeof resolveZoneHandlesFor>;\n };\n const seats: Record<string, SeatProjection> = {};\n for (const [actorSeat, playerId] of playerIds.entries()) {\n const availableInteractionRefs = interactions\n .resolveAvailableInteractionsFor(combinedState, playerId, {\n projection,\n })\n .map((descriptor) => registry.add(descriptor, actorSeat));\n seats[playerId as unknown as string] = {\n ...(projectionMode === \"full\"\n ? {\n view: resolveViewFor(combinedState, playerId, viewId, projection),\n zones: resolveZoneHandlesFor(\n combinedState,\n playerId,\n actorSeat,\n projection,\n registry,\n ),\n }\n : {}),\n availableInteractionRefs,\n };\n }\n return {\n currentStage: resolveCurrentStageFor(combinedState, projection),\n stageSeats: resolveStageSeatsFor(state),\n simultaneousPhase: resolveSimultaneousPhaseFor(state),\n guidance: resolveGuidanceFor(combinedState),\n recentEvents: [],\n interactionsByRef: registry.entries(),\n seats,\n };\n }\n\n function projectSeatViewDynamic({\n state,\n playerId,\n viewId = \"player\",\n }: {\n state: SessionState;\n playerId: PlayerId;\n viewId?: string;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n return resolveViewFor(combinedState, playerId, viewId, projection);\n }\n\n return {\n projectSeatsDynamic,\n projectSeatViewDynamic,\n resolveCurrentStageFor,\n resolveStageSeatsFor,\n resolveViewFor,\n resolveZoneHandlesFor,\n };\n}\n\nfunction 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): CanonicalJson {\n const canonical = toCanonicalJson(value);\n return normalizeOrderInsensitiveDescriptorFields(canonical);\n}\n\nfunction normalizeOrderInsensitiveDescriptorFields(\n value: CanonicalJson,\n): CanonicalJson {\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 (\n (key === \"eligibleTargets\" || key === \"dependentCases\") &&\n Array.isArray(normalized)\n ) {\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, CanonicalJson> {\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 toCanonicalJson(value: unknown): CanonicalJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toCanonicalJson(item));\n }\n if (typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => [key, toCanonicalJson(item)]),\n );\n }\n return null;\n}\n\nfunction hashJson(value: CanonicalJson): string {\n return `sha256:${sha256Hex(canonicalJson(value))}`;\n}\n\nfunction canonicalJson(value: CanonicalJson): string {\n return JSON.stringify(canonicalizeJson(value));\n}\n\nfunction canonicalizeJson(value: CanonicalJson): CanonicalJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"canonical JSON contains a non-finite number\");\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeJson(item));\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, canonicalizeJson(item)]),\n );\n}\n\nfunction compareCanonicalJson(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableStringify(entry)).join(\",\")}]`;\n }\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n .join(\",\")}}`;\n}\n\nfunction fnv1a64(value: string): string {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= BigInt(value.charCodeAt(index));\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash.toString(16).padStart(16, \"0\");\n}\n\nconst SHA256_K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\nfunction sha256Hex(input: string): string {\n const bytes = utf8Bytes(input);\n const bitLength = bytes.length * 8;\n bytes.push(0x80);\n while (bytes.length % 64 !== 56) {\n bytes.push(0);\n }\n for (let shift = 56; shift >= 0; shift -= 8) {\n bytes.push(Math.floor(bitLength / 2 ** shift) & 0xff);\n }\n\n let h0 = 0x6a09e667;\n let h1 = 0xbb67ae85;\n let h2 = 0x3c6ef372;\n let h3 = 0xa54ff53a;\n let h4 = 0x510e527f;\n let h5 = 0x9b05688c;\n let h6 = 0x1f83d9ab;\n let h7 = 0x5be0cd19;\n const words = new Array<number>(64);\n\n for (let offset = 0; offset < bytes.length; offset += 64) {\n for (let index = 0; index < 16; index += 1) {\n const base = offset + index * 4;\n words[index] =\n ((bytes[base] << 24) |\n (bytes[base + 1] << 16) |\n (bytes[base + 2] << 8) |\n bytes[base + 3]) >>>\n 0;\n }\n for (let index = 16; index < 64; index += 1) {\n const s0 =\n rotateRight(words[index - 15], 7) ^\n rotateRight(words[index - 15], 18) ^\n (words[index - 15] >>> 3);\n const s1 =\n rotateRight(words[index - 2], 17) ^\n rotateRight(words[index - 2], 19) ^\n (words[index - 2] >>> 10);\n words[index] = (words[index - 16] + s0 + words[index - 7] + s1) >>> 0;\n }\n\n let a = h0;\n let b = h1;\n let c = h2;\n let d = h3;\n let e = h4;\n let f = h5;\n let g = h6;\n let h = h7;\n\n for (let index = 0; index < 64; index += 1) {\n const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + SHA256_K[index] + words[index]) >>> 0;\n const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n h0 = (h0 + a) >>> 0;\n h1 = (h1 + b) >>> 0;\n h2 = (h2 + c) >>> 0;\n h3 = (h3 + d) >>> 0;\n h4 = (h4 + e) >>> 0;\n h5 = (h5 + f) >>> 0;\n h6 = (h6 + g) >>> 0;\n h7 = (h7 + h) >>> 0;\n }\n\n return [h0, h1, h2, h3, h4, h5, h6, h7]\n .map((word) => word.toString(16).padStart(8, \"0\"))\n .join(\"\");\n}\n\nfunction rotateRight(value: number, shift: number): number {\n return (value >>> shift) | (value << (32 - shift));\n}\n\nfunction utf8Bytes(input: string): number[] {\n const bytes: number[] = [];\n for (let index = 0; index < input.length; index += 1) {\n let codePoint = input.charCodeAt(index);\n if (\n codePoint >= 0xd800 &&\n codePoint <= 0xdbff &&\n index + 1 < input.length\n ) {\n const low = input.charCodeAt(index + 1);\n if (low >= 0xdc00 && low <= 0xdfff) {\n codePoint = 0x10000 + ((codePoint - 0xd800) << 10) + (low - 0xdc00);\n index += 1;\n }\n }\n if (codePoint < 0x80) {\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n bytes.push(0xc0 | (codePoint >>> 6), 0x80 | (codePoint & 0x3f));\n } else if (codePoint < 0x10000) {\n bytes.push(\n 0xe0 | (codePoint >>> 12),\n 0x80 | ((codePoint >>> 6) & 0x3f),\n 0x80 | (codePoint & 0x3f),\n );\n } else {\n bytes.push(\n 0xf0 | (codePoint >>> 18),\n 0x80 | ((codePoint >>> 12) & 0x3f),\n 0x80 | ((codePoint >>> 6) & 0x3f),\n 0x80 | (codePoint & 0x3f),\n );\n }\n }\n return bytes;\n}\n","import type {\n ManifestContract,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeTableRecord,\n ViewMapOf,\n} from \"../../model\";\nimport type { StaticViewQueries } from \"../../model/spec/runtime-args\";\nimport type { TrustedRuntimeScope } from \"./runtime-scope\";\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return `{${entries\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`)\n .join(\",\")}}`;\n}\n\nfunction hashProjection(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\");\n}\n\nfunction readManifestVersion(manifest: unknown): string {\n const m = manifest as { version?: unknown; literals?: unknown };\n if (typeof m.version === \"string\" && m.version.length > 0) {\n return m.version;\n }\n if (m.literals && typeof m.literals === \"object\") {\n return hashProjection(stableStringify(m.literals));\n }\n return \"0\";\n}\n\nfunction createStaticViewQueries<\n Manifest extends ManifestContract<RuntimeTableRecord>,\n>(manifest: Manifest): StaticViewQueries<Manifest> {\n const staticBoards = manifest.staticBoards ?? {\n byId: {},\n hex: {},\n square: {},\n };\n const requireBoard = (\n boards: Record<string, unknown>,\n boardId: string,\n layout: \"board\" | \"hex\" | \"square\",\n ) => {\n const board = boards[boardId];\n if (!board) {\n throw new Error(`Unknown static ${layout} board '${boardId}'.`);\n }\n return board;\n };\n\n return {\n board: {\n get: (boardId) =>\n requireBoard(\n staticBoards.byId as Record<string, unknown>,\n boardId,\n \"board\",\n ) as never,\n hex: (boardId) =>\n requireBoard(\n staticBoards.hex as Record<string, unknown>,\n boardId,\n \"hex\",\n ) as never,\n square: (boardId) =>\n requireBoard(\n staticBoards.square as Record<string, unknown>,\n boardId,\n \"square\",\n ) as never,\n },\n };\n}\n\nexport function createStaticProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n return {\n projectStatic(): {\n view: unknown;\n hash: string;\n manifestVersion: string;\n } | null {\n const staticView = scope.definition.staticView;\n if (!staticView) return null;\n const manifest = scope.definition.contract.manifest;\n const view = staticView.project({\n manifest,\n q: createStaticViewQueries(manifest),\n });\n const serialized = stableStringify(view);\n return {\n view: JSON.parse(serialized) as unknown,\n hash: hashProjection(serialized),\n manifestVersion: readManifestVersion(manifest),\n };\n },\n };\n}\n","import type { ReducerBundleOptions, TrustedReducerBundle } from \"./types\";\nimport { summarizeDispatchTrace } from \"../diagnostics\";\nimport type { ReducerDiagnosticsSink } from \"../diagnostics\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../model\";\nimport type { InteractionDiagnosticsMode } from \"./trusted/interaction-types\";\nimport { createTrustedInstructionRunner } from \"./trusted/instruction-runner\";\nimport { createInteractionResolver } from \"./trusted/interaction-resolver\";\nimport { createLifecycleRunner } from \"./trusted/lifecycle-runner\";\nimport { createProjectionBuilder } from \"./trusted/projection-builder\";\nimport { createTrustedRuntimeScope } from \"./trusted/runtime-scope\";\nimport { createStaticProjectionBuilder } from \"./trusted/static-projection\";\n\nfunction resolveDiagnosticsSink(\n options: ReducerBundleOptions,\n): ReducerDiagnosticsSink | undefined {\n return typeof options.diagnostics === \"object\"\n ? options.diagnostics\n : undefined;\n}\n\nfunction resolveDescriptorDiagnostics(\n options: ReducerBundleOptions,\n): InteractionDiagnosticsMode | undefined {\n return (\n options.descriptorDiagnostics ??\n (options.diagnostics === \"verbose\" ? \"verbose\" : undefined)\n );\n}\n\nfunction inputIdentity(input: {\n kind: string;\n playerId?: string;\n interactionId?: string;\n}) {\n return {\n playerId: input.kind === \"interaction\" ? (input.playerId ?? \"\") : \"\",\n interactionId:\n input.kind === \"interaction\" ? (input.interactionId ?? \"\") : input.kind,\n };\n}\n\nexport function createTrustedReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n options: ReducerBundleOptions = {},\n): TrustedReducerBundle<Contract, Definitions, Views> {\n const scope = createTrustedRuntimeScope(definition, {\n diagnostics: resolveDiagnosticsSink(options),\n });\n const interactions = createInteractionResolver(scope, {\n diagnostics: resolveDescriptorDiagnostics(options),\n });\n const lifecycle = createLifecycleRunner(scope, interactions);\n const instructions = createTrustedInstructionRunner(\n scope,\n interactions,\n lifecycle,\n );\n const staticProjection = createStaticProjectionBuilder(scope);\n const projection = createProjectionBuilder(scope, interactions);\n let submissionCounter = 0;\n\n function nextSubmissionId(): string {\n submissionCounter += 1;\n return `sub-${submissionCounter}`;\n }\n\n return {\n async initialize(input) {\n return lifecycle.initializeSession(input, instructions.drainInstructions);\n },\n async initializePhase({ state, to }) {\n const combinedState = scope.toCombinedState(state);\n const from = combinedState.flow.currentPhase;\n const initialized = lifecycle.initializePhaseResult(combinedState, to);\n if (String(from) !== String(to)) {\n scope.diagnostics.event({\n type: \"phaseTransition\",\n from: String(from),\n to: String(to),\n reason: \"lifecycle\",\n });\n }\n return scope.toSessionState(\n instructions.drainInstructions(\n initialized.state,\n initialized.instructions,\n ),\n );\n },\n async validateInput({ state, input }) {\n return interactions.validateClientInput(\n scope.toCombinedState(state),\n input,\n );\n },\n explainInteraction({ state, playerId, interactionId }) {\n return interactions.explainInteraction({\n state: scope.toCombinedState(state),\n playerId,\n interactionId,\n });\n },\n async reduce({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n return reject;\n }\n const result = instructions.reduceOnce(combinedState, input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n instructions: result.instructions ?? [],\n events: result.events ?? [],\n ...(result.terminal ? { terminal: result.terminal } : {}),\n };\n },\n async dispatch({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const submissionId = nextSubmissionId();\n const identity = inputIdentity(input);\n scope.diagnostics.event({\n type: \"submitReceived\",\n submissionId,\n playerId: identity.playerId,\n interactionId: identity.interactionId,\n phase: String(combinedState.flow.currentPhase),\n });\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n scope.diagnostics.event({\n type: \"submitRejected\",\n submissionId,\n errorCode: reject.errorCode,\n ...(reject.message ? { message: reject.message } : {}),\n });\n return reject;\n }\n const result = instructions.dispatch(combinedState, input);\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 return result;\n }\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 {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n trace: result.trace,\n events: result.events ?? [],\n ...(result.terminal ? { terminal: result.terminal } : {}),\n };\n },\n projectStatic() {\n return staticProjection.projectStatic();\n },\n projectSeatsDynamic(input) {\n return projection.projectSeatsDynamic(input);\n },\n projectSeatViewDynamic(input) {\n return projection.projectSeatViewDynamic(input);\n },\n };\n}\n","import { z } from \"zod\";\nimport { Zod as ContractZod } from \"@dreamboard-games/reducer-contract\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport { runtimePayloadSchema } from \"./runtime-payload\";\nimport type {\n BaseGameSessionOfContract,\n GameStateOf,\n HiddenSchemaOfContract,\n ManifestContractOf,\n ManifestOf,\n PhaseMapOf,\n PhaseNameOfContract,\n PlayerIdOfState,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n RuntimeSetupSelection,\n TableOfManifest,\n ViewMapOf,\n} from \"../model\";\nimport { contractFingerprint } from \"../contract-fingerprint\";\nimport { StaleContractArtifactError } from \"../stale-contract-artifact-error\";\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 perPlayerSchema = <Value extends z.ZodTypeAny>(valueSchema: Value) =>\n z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([z.string(), valueSchema])),\n })\n .strict();\nconst runtimeComponentLocationSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"Detached\") }).strict(),\n z\n .object({\n type: z.literal(\"InDeck\"),\n deckId: z.string(),\n playedBy: z.string().nullable(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InHand\"),\n handId: z.string(),\n playerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: z.string().nullable().optional(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnSpace\"),\n boardId: z.string(),\n spaceId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InContainer\"),\n boardId: z.string(),\n containerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnEdge\"),\n boardId: z.string(),\n edgeId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnVertex\"),\n boardId: z.string(),\n vertexId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InSlot\"),\n host: z.union([\n z.object({ kind: z.literal(\"piece\"), id: z.string() }).strict(),\n z.object({ kind: z.literal(\"die\"), id: z.string() }).strict(),\n ]),\n slotId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n]);\nconst currentRuntimeTableSchema = z\n .object({\n playerOrder: z.array(z.string()),\n zones: z\n .object({\n shared: z.record(z.string(), z.array(z.string())),\n perPlayer: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n visibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cardSetIdsByZoneId: z\n .record(z.string(), z.array(z.string()))\n .optional(),\n })\n .strict(),\n decks: z.record(z.string(), z.array(z.string())),\n hands: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n handVisibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n cardSetId: z.string(),\n cardType: z.string(),\n name: z.string().optional(),\n text: z.string().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n pieces: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n pieceTypeId: z.string(),\n pieceName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n componentLocations: z.record(z.string(), runtimeComponentLocationSchema),\n ownerOfCard: z.record(z.string(), z.string().nullable()),\n visibility: z.record(\n z.string(),\n z\n .object({\n faceUp: z.boolean(),\n visibleTo: z.array(z.string()).nullable().optional(),\n })\n .strict(),\n ),\n resources: perPlayerSchema(runtimeRecordSchema),\n boards: z\n .object({\n byId: z.record(z.string(), runtimeRecordSchema),\n hex: z.record(z.string(), runtimeRecordSchema),\n square: z.record(z.string(), runtimeRecordSchema),\n network: z.record(z.string(), runtimeRecordSchema).optional(),\n track: z.record(z.string(), runtimeRecordSchema).optional(),\n })\n .strict(),\n dice: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n dieTypeId: z.string(),\n dieName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n sides: z.number().int(),\n value: z.number().int().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n })\n .strict();\n\nexport function createIngressRuntimeCodec<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n ManifestContractOf<Contract>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseNameOfContract<Contract>\n> {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n type DomainState = GameStateOf<Definition>;\n type State = BaseGameSessionOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNameOfContract<Contract>;\n type ReturnType = IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n Manifest,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseName\n >;\n type PlayerId = PlayerIdOfState<DomainState>;\n\n const { phaseNameSchema } = collectIngressPhaseSchemas(definition);\n const playerIdSchema = definition.contract.manifest.ids\n .playerId as z.ZodType<PlayerId>;\n const liveContractFingerprint = contractFingerprint(definition).value;\n\n const flowSchema = z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n });\n const runtimeStateSchema = z.object({\n rng: z.object({\n seed: z.number().int().nullable(),\n cursor: z.number().int(),\n trace: z.array(z.string()),\n }),\n setup: z\n .object({\n profileId: z.string(),\n optionValues: z.record(z.string(), z.string().nullable()),\n })\n .nullable(),\n simultaneous: z.object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: runtimePayloadSchema,\n }),\n ),\n })\n .nullable(),\n }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable(),\n });\n const parseRuntimeInput = createRuntimeInputParser(playerIdSchema);\n\n // The return type uses branded/mapped types derived from the contract generic.\n // TypeScript cannot verify that plain objects satisfy these deep mapped types,\n // but the runtime Zod parsing ensures correctness.\n return {\n defaultRuntimeState(\n seed: number | null = null,\n setup: RuntimeSetupSelection<Manifest> | null = null,\n ) {\n const runtimeState: State[\"runtime\"] = {\n rng: {\n seed,\n cursor: 0,\n trace: [],\n },\n setup,\n simultaneous: { current: null },\n lastTransition: null,\n };\n return runtimeState;\n },\n parseInitialTable(rawTable: unknown, playerIds: string[] | undefined) {\n const table = safeParseOrThrow(\n currentRuntimeTableSchema,\n rawTable,\n \"table\",\n ) as unknown as TableOfManifest<ManifestOf<Contract>>;\n return {\n table,\n playerIds: safeParseOrThrow(\n z.array(playerIdSchema),\n playerIds && playerIds.length > 0 ? playerIds : table.playerOrder,\n \"table.playerOrder\",\n ),\n };\n },\n parseState(rawState: RawReducerSessionState) {\n const envelope = safeParseOrThrow(\n ContractZod.ReducerSessionStateSchema,\n rawState,\n \"state\",\n );\n const encodedContractFingerprint = (\n envelope as { meta?: { contractFingerprint?: string } }\n ).meta?.contractFingerprint;\n if (\n encodedContractFingerprint &&\n encodedContractFingerprint !== liveContractFingerprint\n ) {\n throw new StaleContractArtifactError({\n artifact: \"session-state\",\n expected: liveContractFingerprint,\n found: encodedContractFingerprint,\n });\n }\n const table = safeParseOrThrow(\n definition.contract.manifest.tableSchema,\n envelope.domain.table,\n \"domain.table\",\n );\n const playerIds = [...table.playerOrder] as PlayerId[];\n const privateState = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n definition.contract.state.private,\n envelope.domain.privateState[playerId] ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"domain\"][\"privateState\"];\n const flow = safeParseOrThrow(\n flowSchema,\n {\n currentPhase: envelope.domain.flow.currentPhase,\n turn: envelope.domain.flow.turn,\n round: envelope.domain.flow.round,\n activePlayers: envelope.domain.flow.activePlayers,\n },\n \"domain.flow\",\n );\n const currentPhaseDefinition = definition.phases[flow.currentPhase];\n if (!currentPhaseDefinition) {\n throw new Error(`Unknown reducer phase '${flow.currentPhase}'.`);\n }\n const rawPhaseState = envelope.domain.phase;\n const phase = safeParseOrThrow(\n currentPhaseDefinition.state,\n rawPhaseState ?? {},\n `phase:${flow.currentPhase}`,\n ) as State[\"domain\"][\"phase\"];\n\n const parsedState: State = {\n domain: {\n table,\n publicState: safeParseOrThrow(\n definition.contract.state.public,\n envelope.domain.publicState,\n \"domain.publicState\",\n ) as State[\"domain\"][\"publicState\"],\n privateState,\n hiddenState: safeParseOrThrow(\n definition.contract.state.hidden,\n envelope.domain.hiddenState,\n \"domain.hiddenState\",\n ) as State[\"domain\"][\"hiddenState\"],\n flow,\n phase,\n },\n runtime: safeParseOrThrow(\n runtimeStateSchema,\n envelope.runtime,\n \"runtime\",\n ) as unknown as State[\"runtime\"],\n };\n return parsedState;\n },\n serializeState(state: State) {\n return {\n meta: { contractFingerprint: liveContractFingerprint },\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 { z } from \"zod\";\nimport { RuntimeJsonSchema, assertJsonWithinLimits } from \"../../runtime-json\";\nimport type { RuntimePayload } from \"../model\";\n\nexport { RuntimeJsonSchema, 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 { z } from \"zod\";\nimport type { ReducerGameContractLike } from \"./model\";\n\ntype FingerprintableContract = ReducerGameContractLike & {\n phases?: Record<string, z.ZodTypeAny>;\n errors?: Record<string, string> | undefined;\n};\n\ntype FingerprintableDefinition = {\n contract: FingerprintableContract;\n phases?: Record<string, z.ZodTypeAny | { state?: z.ZodTypeAny }>;\n};\n\ntype CanonicalJson =\n | null\n | boolean\n | number\n | string\n | CanonicalJson[]\n | { [key: string]: CanonicalJson };\n\nexport type ContractFingerprint = {\n /** \"cfp1:\" + first 16 hex chars of sha256 over the canonical payload. */\n value: string;\n /** Component hashes that fed the final fingerprint. */\n parts: {\n manifest: string;\n publicState: string;\n privateState: string;\n hiddenState: string;\n phases: Record<string, string>;\n errors: string;\n };\n};\n\n/**\n * Compute a stable shape fingerprint for stale generated artifacts.\n *\n * The fingerprint intentionally tracks decoded shape, not semantic refinements:\n * Zod schemas are converted with `unrepresentable: \"any\"`, so refinements and\n * custom validators that do not affect the JSON shape do not invalidate stored\n * sessions or generated base states.\n */\nexport function contractFingerprint(\n source: FingerprintableContract | FingerprintableDefinition,\n): ContractFingerprint {\n const contract = \"contract\" in source ? source.contract : source;\n const phases = source.phases;\n const phaseEntries = Object.entries(phases ?? {}).sort(([left], [right]) =>\n compareJson(left, right),\n );\n const parts: ContractFingerprint[\"parts\"] = {\n manifest: hashJson(contract.manifest?.literals ?? {}),\n publicState: hashSchema(contract.state.public),\n privateState: hashSchema(contract.state.private),\n hiddenState: hashSchema(contract.state.hidden),\n phases: Object.fromEntries(\n phaseEntries.map(([phaseName, phase]) => [\n phaseName,\n hashSchema(phaseSchema(phase)),\n ]),\n ),\n errors: contract.errors ? hashJson(contract.errors) : \"\",\n };\n return {\n value: `cfp1:${sha256Hex(canonicalJson(parts)).slice(0, 16)}`,\n parts,\n };\n}\n\nfunction phaseSchema(\n phase: z.ZodTypeAny | { state?: z.ZodTypeAny },\n): z.ZodTypeAny {\n if (phase && typeof phase === \"object\" && \"state\" in phase && phase.state) {\n return phase.state;\n }\n return phase as z.ZodTypeAny;\n}\n\nfunction hashSchema(schema: z.ZodTypeAny): string {\n return hashJson(\n normalizeJsonSchema(\n z.toJSONSchema(schema, { unrepresentable: \"any\" }),\n ) as CanonicalJson,\n );\n}\n\nfunction normalizeJsonSchema(value: unknown, key?: string): unknown {\n if (Array.isArray(value)) {\n const normalized = value.map((item) => normalizeJsonSchema(item));\n if (key === \"required\" || key === \"enum\" || key === \"type\") {\n return [...normalized].sort((left, right) =>\n compareJson(JSON.stringify(left), JSON.stringify(right)),\n );\n }\n return normalized;\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(\n ([entryKey, item]) => [entryKey, normalizeJsonSchema(item, entryKey)],\n ),\n );\n }\n return value;\n}\n\nfunction hashJson(value: unknown): string {\n return sha256Hex(canonicalJson(toCanonicalJson(value)));\n}\n\nfunction toCanonicalJson(value: unknown): CanonicalJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toCanonicalJson(item));\n }\n if (typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => [key, toCanonicalJson(item)]),\n );\n }\n return null;\n}\n\nfunction canonicalJson(value: CanonicalJson): string {\n return JSON.stringify(canonicalizeJson(value));\n}\n\nfunction canonicalizeJson(value: CanonicalJson): CanonicalJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"canonical JSON contains a non-finite number\");\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeJson(item));\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => compareJson(left, right))\n .map(([key, item]) => [key, canonicalizeJson(item)]),\n );\n}\n\nfunction compareJson(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nconst SHA256_K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\nfunction sha256Hex(input: string): string {\n const bytes = utf8Bytes(input);\n const bitLength = bytes.length * 8;\n bytes.push(0x80);\n while (bytes.length % 64 !== 56) {\n bytes.push(0);\n }\n for (let shift = 56; shift >= 0; shift -= 8) {\n bytes.push(Math.floor(bitLength / 2 ** shift) & 0xff);\n }\n\n let h0 = 0x6a09e667;\n let h1 = 0xbb67ae85;\n let h2 = 0x3c6ef372;\n let h3 = 0xa54ff53a;\n let h4 = 0x510e527f;\n let h5 = 0x9b05688c;\n let h6 = 0x1f83d9ab;\n let h7 = 0x5be0cd19;\n const words = new Array<number>(64);\n\n for (let offset = 0; offset < bytes.length; offset += 64) {\n for (let index = 0; index < 16; index += 1) {\n const base = offset + index * 4;\n words[index] =\n ((bytes[base]! << 24) |\n (bytes[base + 1]! << 16) |\n (bytes[base + 2]! << 8) |\n bytes[base + 3]!) >>>\n 0;\n }\n for (let index = 16; index < 64; index += 1) {\n const s0 =\n rotateRight(words[index - 15]!, 7) ^\n rotateRight(words[index - 15]!, 18) ^\n (words[index - 15]! >>> 3);\n const s1 =\n rotateRight(words[index - 2]!, 17) ^\n rotateRight(words[index - 2]!, 19) ^\n (words[index - 2]! >>> 10);\n words[index] = (words[index - 16]! + s0 + words[index - 7]! + s1) >>> 0;\n }\n\n let a = h0;\n let b = h1;\n let c = h2;\n let d = h3;\n let e = h4;\n let f = h5;\n let g = h6;\n let h = h7;\n\n for (let index = 0; index < 64; index += 1) {\n const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + SHA256_K[index]! + words[index]!) >>> 0;\n const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n h0 = (h0 + a) >>> 0;\n h1 = (h1 + b) >>> 0;\n h2 = (h2 + c) >>> 0;\n h3 = (h3 + d) >>> 0;\n h4 = (h4 + e) >>> 0;\n h5 = (h5 + f) >>> 0;\n h6 = (h6 + g) >>> 0;\n h7 = (h7 + h) >>> 0;\n }\n\n return [h0, h1, h2, h3, h4, h5, h6, h7]\n .map((value) => value.toString(16).padStart(8, \"0\"))\n .join(\"\");\n}\n\nfunction rotateRight(value: number, bits: number): number {\n return (value >>> bits) | (value << (32 - bits));\n}\n\nfunction utf8Bytes(input: string): number[] {\n return Array.from(new TextEncoder().encode(input));\n}\n","import { z } from \"zod\";\nimport { Zod as ContractZod } from \"@dreamboard-games/reducer-contract\";\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 } as RawRuntimeInput;\n };\n}\n","import { z } from \"zod\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewMapOf,\n} from \"../model\";\n\nfunction createPhaseNameSchema<PhaseName extends string>(\n phaseNames: readonly PhaseName[],\n): z.ZodType<PhaseName> {\n const allowed = new Set(phaseNames);\n return z.custom<PhaseName>(\n (value: unknown) =>\n typeof value === \"string\" && allowed.has(value as PhaseName),\n { message: \"Invalid phase name\" },\n );\n}\n\nexport function collectIngressPhaseSchemas<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): {\n phaseEntries: Array<\n [\n PhaseNameOfContract<Contract>,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n phaseNames: PhaseNameOfContract<Contract>[];\n phaseNameSchema: z.ZodType<PhaseNameOfContract<Contract>>;\n} {\n type PhaseName = PhaseNameOfContract<Contract>;\n const phaseEntries = Object.entries(definition.phases) as Array<\n [\n PhaseName,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n const phaseNames = phaseEntries.map(([phaseName]) => phaseName);\n return {\n phaseEntries,\n phaseNames,\n phaseNameSchema: createPhaseNameSchema(phaseNames),\n };\n}\n","import { createTrustedReducerBundle } from \"./trusted-bundle\";\nimport { createIngressRuntimeCodec } from \"../ingress/runtime-codec\";\nimport {\n Builders,\n REDUCER_CONTRACT_VERSION,\n type Wire,\n} from \"@dreamboard-games/reducer-contract\";\nimport type {\n ManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ReducerReject,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../model\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\nimport type { DispatchTraceEntry } from \"../core/types\";\nimport type {\n UntrustedReducerSessionState,\n UntrustedRuntimeInput,\n} from \"../ingress/types\";\nimport type { ReducerBundle, ReducerBundleOptions } from \"./types\";\n\n/**\n * Pass the wire-validated `interaction` input through to the trusted\n * bundle. Both layers speak the same single-kind shape now — the routing\n * here only normalizes `params` to a concrete object when the caller\n * elided it.\n *\n * The wire schema admits exactly one player-originated variant\n * (`{ kind: \"interaction\" }`) and the engine's `TrustedRuntimeInput`\n * uses the same discriminator, so this is a straight pass-through.\n * Continuation inputs are engine-internal and never traverse this routing.\n */\nfunction routeInteraction(input: UntrustedRuntimeInput): {\n kind: \"interaction\";\n playerId: string;\n interactionId: string;\n params: unknown;\n} {\n return {\n kind: \"interaction\",\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.params,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Wire-protocol adapter.\n//\n// The trusted bundle (see ./trusted-bundle.ts) keeps the SDK reducer runtime\n// instruction shape at reducer boundaries where:\n// - Results discriminate on `type: \"accept\" | \"reject\"`.\n// - Reducer-returned instructions carry `kind`.\n// - Dispatch traces use normalized runtime instructions.\n// The generated reducer-contract (`packages/reducer-contract`) defines the\n// canonical wire shape consumed by the Kotlin host:\n// - Results discriminate on `kind: \"accept\" | \"reject\"`.\n// - Each effect carries an `effectId`, never an inline `resume`.\n// - Continuations live in a sibling `continuations: Record<effectId, ...>`\n// map on reduce results, or on the matching `appliedEffect` trace entry\n// for dispatch results.\n// - Each DispatchTrace entry discriminates on `kind` (no `type` field).\n//\n// This module is the ONLY place in the SDK reducer that converts runtime\n// instructions into wire effects. It does so through\n// `@dreamboard-games/reducer-contract` (the single source of truth for\n// wire-effect construction) rather than hand-rolling the mapping locally —\n// hand-rolled mappings are how wire drift sneaks in (see the catan\n// rollDie regression).\n// ---------------------------------------------------------------------------\n\ntype InternalInstruction<State> = RuntimeInstructionForState<State>;\n\nfunction extractContinuation<State>(\n instruction: InternalInstruction<State>,\n): Wire.ContinuationToken | undefined {\n const continuation = (\n instruction as {\n continuation?: Wire.ContinuationToken | null | undefined;\n }\n ).continuation;\n if (continuation === undefined || continuation === null) return undefined;\n return {\n id: continuation.id,\n data: continuation.data as Wire.JsonValue,\n };\n}\n\n/**\n * Route one engine-internal effect through the generated builder that owns\n * its wire shape. The builder mints the effectId, enforces the correct\n * required/optional key set, and attaches the continuation privately via\n * `__continuation` so `materializeAccept` can split it out at the wire\n * boundary.\n *\n * Why dispatch through the builder instead of constructing `Wire.Effect`\n * directly? The schema + builders are the SSOT for wire shapes. Duplicating\n * that knowledge here once caused the catan rollDie bug; never again.\n */\nfunction toPendingEffect<State>(\n instruction: InternalInstruction<State>,\n fx: Builders.EffectBuilders,\n): Builders.PendingEffect {\n const continuation = extractContinuation<State>(instruction);\n switch (instruction.kind) {\n case \"flow.transition\":\n return fx.transition({ to: instruction.to as string }, continuation);\n case \"engine.rollDie\":\n return fx.rollDie(\n { dieId: (instruction as { dieId: string }).dieId },\n continuation,\n );\n case \"engine.shuffleSharedZone\":\n return fx.shuffleSharedZone(\n { zoneId: (instruction as { zoneId: string }).zoneId as string },\n continuation,\n );\n case \"engine.shufflePlayerZone\":\n return fx.shufflePlayerZone(\n {\n zoneId: (instruction as { zoneId: string }).zoneId as string,\n playerId: (instruction as { playerId: string }).playerId as string,\n },\n continuation,\n );\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `toPendingEffect: unsupported instruction kind '${(_exhaustive as { kind: string }).kind}'.`,\n );\n }\n }\n}\n\nfunction toWireReduceResult<State>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n instructions?: InternalInstruction<State>[];\n terminal?: Wire.GameOutcome;\n events?: Wire.GameEvent[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.ReduceResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const pending = (result.instructions ?? []).map((instruction) =>\n toPendingEffect<State>(instruction, fx),\n );\n const { effects, continuations } = Builders.materializeAccept(pending);\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n ...(result.terminal ? { terminal: result.terminal } : {}),\n effects,\n continuations,\n events: result.events ?? [],\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?: Wire.GameOutcome;\n events?: Wire.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 mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const trace: Wire.DispatchTrace[] = [];\n for (const entry of result.trace) {\n switch (entry.type) {\n case \"acceptedClientInput\": {\n const engineInput = entry.input as {\n kind: \"interaction\" | \"continuation\";\n playerId?: string;\n interactionId?: string;\n params?: Wire.JsonValue;\n };\n let wireInput: Wire.GameInput;\n if (engineInput.kind === \"interaction\") {\n wireInput = {\n kind: \"interaction\",\n playerId: engineInput.playerId ?? \"\",\n interactionId: engineInput.interactionId ?? \"\",\n params: engineInput.params ?? {},\n };\n } else {\n // Continuation inputs are engine-internal and shouldn't appear in\n // client-addressed dispatch traces; synthesize a best-effort wire\n // shape so the trace stays well-typed.\n wireInput = {\n kind: \"interaction\",\n playerId: \"\",\n interactionId: \"\",\n params: {},\n };\n }\n trace.push({\n kind: \"acceptedClientInput\",\n input: wireInput,\n });\n break;\n }\n case \"appliedInstruction\": {\n const pending = toPendingEffect<State>(\n entry.instruction as InternalInstruction<State>,\n fx,\n );\n const { effects, continuations } = Builders.materializeAccept([\n pending,\n ]);\n const [wireEffect] = effects;\n if (wireEffect === undefined) {\n throw new Error(\n \"materializeAccept returned no effects for a single pending effect\",\n );\n }\n const continuation = continuations[wireEffect.effectId];\n trace.push(\n continuation === undefined\n ? { kind: \"appliedEffect\", effect: wireEffect }\n : { kind: \"appliedEffect\", effect: wireEffect, continuation },\n );\n break;\n }\n case \"rngConsumption\":\n trace.push({\n kind: \"rngConsumption\",\n operation: entry.operation,\n traceEntry: entry.traceEntry,\n });\n break;\n default: {\n const _exhaustive: never = entry;\n throw new Error(\n `toWireDispatchResult: unknown trace entry type '${(_exhaustive as { type: string }).type}'.`,\n );\n }\n }\n }\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n ...(result.terminal ? { terminal: result.terminal } : {}),\n trace,\n events: result.events ?? [],\n };\n}\n\nfunction toWireDispatchTrace<State, PlayerId extends string>(result: {\n type: \"accept\";\n state: State;\n trace: DispatchTraceEntry<State, PlayerId>[];\n}): Wire.DispatchTrace[] {\n return (\n toWireDispatchResult(result, (state) => state as never) as {\n kind: \"accept\";\n trace: Wire.DispatchTrace[];\n }\n ).trace;\n}\n\nexport function createReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n options: ReducerBundleOptions = {},\n): ReducerBundle {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n const trustedBundle = createTrustedReducerBundle(definition, options);\n const codec = createIngressRuntimeCodec(definition);\n type Manifest = ManifestContractOf<Definition[\"contract\"]>;\n type TrustedState = Awaited<ReturnType<typeof trustedBundle.initialize>>;\n\n function parseTrustedState(state: unknown): TrustedState {\n return codec.parseState(\n state as UntrustedReducerSessionState,\n ) as TrustedState;\n }\n\n function parseRuntimePlayerId(playerId: unknown) {\n if (typeof playerId !== \"string\") {\n throw new Error(\"Expected a string playerId.\");\n }\n return codec.parsePlayerId(playerId);\n }\n\n const bundle = {\n ...trustedBundle,\n // Top-level protocol version. The Kotlin ReducerBundleAdapter reads this\n // on bundle load and rejects bundles whose major version does not match\n // the host's compiled-in REDUCER_CONTRACT_VERSION.\n reducerContractVersion: REDUCER_CONTRACT_VERSION,\n async initialize({\n table,\n playerIds,\n rngSeed,\n setup,\n }: Wire.InitializeRequest) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as unknown as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n return codec.serializeState(\n await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n }),\n );\n },\n async initializePhase({ state, to }: Wire.InitializePhaseRequest) {\n const decodedState = parseTrustedState(state);\n return codec.serializeState(\n await trustedBundle.initializePhase({\n state: decodedState,\n to: to as never,\n }),\n );\n },\n async validateInput({ state, input }: Wire.ValidateInputRequest) {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n return trustedBundle.validateInput({\n state: parseTrustedState(state),\n input: routed as never,\n });\n },\n explainInteraction({ state, playerId, interactionId }) {\n return trustedBundle.explainInteraction({\n state: parseTrustedState(state),\n playerId: parseRuntimePlayerId(playerId),\n interactionId,\n });\n },\n async reduce({\n state,\n input,\n }: Wire.ReduceRequest): Promise<Wire.ReduceResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.reduce({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireReduceResult<TrustedState>(result as never, (nextState) =>\n codec.serializeState(nextState as never),\n );\n },\n async dispatch({\n state,\n input,\n }: Wire.DispatchRequest): Promise<Wire.DispatchResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireDispatchResult(result as never, (nextState: TrustedState) =>\n codec.serializeState(nextState as never),\n );\n },\n /**\n * Wire-side passthrough for the session-scoped static projection. The\n * host calls this once per reducer session, caches the payload, and\n * thereafter merges it back into every seat view on the client. Returns\n * `null` when `defineGame` did not declare a `staticView`.\n */\n projectStatic() {\n return trustedBundle.projectStatic() as Wire.BoardStaticProjection | null;\n },\n /**\n * Wire-side passthrough for per-tick seat projection. The seat views carry\n * only the fields produced by `defineView`; static topology, when present,\n * was served once via `projectStatic` and is re-merged on the client.\n */\n projectSeatsDynamic({\n state,\n playerIds,\n viewId = \"player\",\n }: Wire.ProjectSeatsDynamicRequest) {\n const parsedState = parseTrustedState(state);\n const parsedPlayerIds = playerIds.map((pid) => codec.parsePlayerId(pid));\n return trustedBundle.projectSeatsDynamic({\n state: parsedState,\n playerIds: parsedPlayerIds,\n viewId,\n }) as Wire.SeatProjectionBundle;\n },\n projectSeatViewDynamic({ state, playerId, viewId = \"player\" }) {\n const parsedState = parseTrustedState(state);\n return trustedBundle.projectSeatViewDynamic({\n state: parsedState,\n playerId: parseRuntimePlayerId(playerId),\n viewId,\n });\n },\n createInProcessRuntime() {\n let state: TrustedState | null = null;\n const requireState = () => {\n if (!state) {\n throw new Error(\"In-process reducer runtime has no state.\");\n }\n return state;\n };\n return {\n async initialize({ table, playerIds, rngSeed, setup }) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n state = await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n });\n },\n hydrate({ state: snapshot }) {\n state = parseTrustedState(snapshot);\n },\n async dispatch({ input }) {\n const validatedWire = codec.parseInput(\n input as UntrustedRuntimeInput,\n );\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: requireState(),\n input: routed as never,\n });\n if (result.type === \"reject\") {\n return {\n kind: \"reject\" as const,\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n state = result.state;\n return {\n kind: \"accept\" as const,\n state: codec.serializeState(state as never),\n trace: toWireDispatchTrace(result as never),\n };\n },\n projectSeatViewDynamic({ playerId, viewId = \"player\" }) {\n return trustedBundle.projectSeatViewDynamic({\n state: requireState(),\n playerId: parseRuntimePlayerId(playerId),\n viewId,\n });\n },\n projectSeatsDynamic({ playerIds, viewId = \"player\" }) {\n const parsedPlayerIds = playerIds.map((pid) =>\n parseRuntimePlayerId(pid),\n );\n return trustedBundle.projectSeatsDynamic({\n state: requireState(),\n playerIds: parsedPlayerIds,\n viewId,\n });\n },\n explainInteraction({ playerId, interactionId }) {\n return trustedBundle.explainInteraction({\n state: requireState(),\n playerId: parseRuntimePlayerId(playerId),\n interactionId,\n });\n },\n snapshot() {\n return codec.serializeState(requireState());\n },\n unsafeState() {\n return requireState();\n },\n };\n },\n } satisfies ReducerBundle;\n\n return bundle;\n}\n","/**\n * State composition primitives.\n *\n * `pipe` threads a seed state through a sequence of `State -> State`\n * transformations, left to right. It is the preferred way to compose curried\n * writers (the `ops.*` namespace) in reducers:\n *\n * return accept(\n * pipe(state,\n * ops.spendPlayerResources({ playerId, resources: cost }),\n * ops.placePieceOnVertex({ boardId, vertexId, pieceId, ownerId: playerId }),\n * ),\n * );\n */\n/**\n * A state-preserving transformation.\n *\n * `Op<State>` is polymorphic in the exact input subtype — given a state `S`\n * that extends `State`, it returns the same `S`. This lets curried writers\n * from `ops.*` and author-written helpers thread through phase-scoped `pipe`\n * calls without losing the narrowed phase state type.\n */\nexport type Op<State> = <S extends State>(state: S) => S;\n\nexport function pipe<State>(\n state: State,\n ...ops: ReadonlyArray<Op<NoInfer<State>>>\n): State {\n let result = state;\n for (const op of ops) {\n result = op(result);\n }\n return result;\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","toDomainState","toDomainState","toCombinedState","toSessionState","fxForState","buildContext","buildRuntimeArgs","options","lazyDomain","descriptorDecision","options","stableStringify","z","z","z","z","hashJson","sha256Hex","canonicalJson","toCanonicalJson","canonicalizeJson","SHA256_K","utf8Bytes","rotateRight","z","z","perPlayerSchema"]}
1
+ {"version":3,"sources":["../src/reducer/schema-helpers.ts","../src/reducer/authoring/validation.ts","../src/reducer/authoring/contract.ts","../src/reducer/inputs/formInput.ts","../src/reducer/inputs/defineInputs.ts","../src/reducer/inputs/boardInput.ts","../src/reducer/inputs/boardTarget.ts","../src/reducer/inputs/choiceTarget.ts","../src/reducer/inputs/promptInput.ts","../src/reducer/inputs/rngInput.ts","../src/reducer/inputs/many.ts","../src/reducer/authoring/game.ts","../src/reducer/authoring/interaction.ts","../src/reducer/authoring/phase.ts","../src/reducer/authoring/view-stage.ts","../src/reducer/authoring/contract-authoring.ts","../src/reducer/authoring/effect.ts","../src/reducer/game-event.ts","../src/reducer/diagnostics.ts","../src/reducer/engine/runtime-instruction-engine.ts","../src/reducer/bundle/trusted/rng-sampler.ts","../src/reducer/bundle/trusted/engine-instruction-resolver.ts","../src/reducer/bundle/trusted/flow-instruction-resolver.ts","../src/reducer/bundle/trusted/simultaneous-player.ts","../src/reducer/ops.ts","../src/reducer/table-queries.ts","../src/reducer/transaction.ts","../src/reducer/bundle/trusted/runtime-registry.ts","../src/reducer/derived.ts","../src/reducer/effects.ts","../src/reducer/bundle/trusted/trusted-runtime-args.ts","../src/reducer/bundle/trusted/trusted-runtime-result.ts","../src/reducer/bundle/trusted/trusted-state-codec.ts","../src/reducer/bundle/trusted/trusted-setup-profiles.ts","../src/reducer/bundle/trusted/runtime-scope.ts","../src/reducer/bundle/trusted/instruction-runner.ts","../src/reducer/bundle/trusted/collector-introspection.ts","../src/reducer/bundle/trusted/collector-eligibility.ts","../src/reducer/parse-utils.ts","../src/reducer/bundle/trusted/interaction-types.ts","../src/reducer/bundle/trusted/collector-params.ts","../src/reducer/bundle/trusted/interaction-authorization.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/stage-resolver.ts","../src/reducer/bundle/trusted/interaction-resolver.ts","../src/reducer/bundle/trusted/lifecycle-runner.ts","../src/reducer/bundle/trusted/projection-context.ts","../src/reducer/bundle/trusted/projection-builder.ts","../src/reducer/bundle/trusted/static-projection.ts","../src/reducer/bundle/trusted-bundle.ts","../src/reducer/ingress/session-codec.ts","../src/reducer/ingress/runtime-payload.ts","../src/reducer/contract-fingerprint.ts","../src/reducer/ingress/input-codec.ts","../src/reducer/ingress/phase-schemas.ts","../src/reducer/bundle/ingress-bundle.ts","../src/reducer/compose.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { SchemaLike } from \"./model\";\n\nexport type SparseMap<Key extends string, Value> = Partial<Record<Key, Value>>;\nexport type SparseCounts<Key extends string> = SparseMap<Key, number>;\n\ntype SparseSchemaMetadata = {\n keySchema: z.ZodType<string>;\n valueSchema: z.ZodTypeAny;\n};\n\nconst sparseSchemas = new WeakMap<object, SparseSchemaMetadata>();\n\nexport function sparseMap<\n KeySchema extends z.ZodType<string>,\n ValueSchema extends z.ZodTypeAny,\n>(\n keySchema: KeySchema,\n valueSchema: ValueSchema,\n): z.ZodType<SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>> {\n const schema = z.partialRecord(keySchema, valueSchema) as z.ZodType<\n SparseMap<z.infer<KeySchema>, z.infer<ValueSchema>>\n >;\n sparseSchemas.set(schema as unknown as object, {\n keySchema,\n valueSchema,\n });\n return schema;\n}\n\nexport function sparseCounts<KeySchema extends z.ZodType<string>>(\n keySchema: KeySchema,\n): z.ZodType<SparseCounts<z.infer<KeySchema>>> {\n return sparseMap(keySchema, z.number().int().min(0)) as z.ZodType<\n SparseCounts<z.infer<KeySchema>>\n >;\n}\n\nexport function getZodDef(schema: unknown): {\n type?: string;\n} & Record<string, unknown> {\n const anySchema = schema as {\n _zod?: { def?: Record<string, unknown> };\n def?: Record<string, unknown>;\n };\n const fromInternal = anySchema?._zod?.def;\n if (fromInternal && typeof fromInternal === \"object\") {\n return fromInternal;\n }\n const fromLegacy = anySchema?.def;\n if (fromLegacy && typeof fromLegacy === \"object\") {\n return fromLegacy;\n }\n return {};\n}\n\nexport function unwrapWrappers(schema: unknown): unknown {\n let current = schema;\n while (true) {\n const def = getZodDef(current);\n const innerType = def.innerType;\n if (\n (def.type === \"nullable\" ||\n def.type === \"optional\" ||\n def.type === \"default\" ||\n def.type === \"readonly\" ||\n def.type === \"catch\") &&\n innerType\n ) {\n current = innerType;\n continue;\n }\n return current;\n }\n}\n\nexport function isPlainZodString(schema: unknown): boolean {\n return getZodDef(schema).type === \"string\";\n}\n\nexport function isZodArray(schema: unknown): boolean {\n return getZodDef(schema).type === \"array\";\n}\n\nexport function isEnumKeyedRecordSchema(schema: unknown): boolean {\n const def = getZodDef(schema);\n const keyType = def.keyType;\n return (\n def.type === \"record\" &&\n typeof keyType === \"object\" &&\n keyType !== null &&\n getZodDef(keyType).type === \"enum\"\n );\n}\n\nexport function isSparseMapSchema(schema: unknown): boolean {\n const inner = unwrapWrappers(schema);\n return (\n typeof inner === \"object\" &&\n inner !== null &&\n sparseSchemas.has(inner as object)\n );\n}\n\nfunction getSparseSchemaMetadata(\n schema: unknown,\n): SparseSchemaMetadata | undefined {\n const inner = unwrapWrappers(schema);\n if (typeof inner !== \"object\" || inner === null) {\n return undefined;\n }\n return sparseSchemas.get(inner as object);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getObjectShape(\n schema: unknown,\n): Record<string, unknown> | null {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return null;\n }\n const shape = def.shape;\n if (typeof shape === \"function\") {\n const resolved = shape();\n return resolved && typeof resolved === \"object\"\n ? (resolved as Record<string, unknown>)\n : null;\n }\n return shape && typeof shape === \"object\"\n ? (shape as Record<string, unknown>)\n : null;\n}\n\nfunction normalizeSchemaInput(schema: unknown, input: unknown): unknown {\n const inner = unwrapWrappers(schema);\n const sparse = getSparseSchemaMetadata(inner);\n if (sparse && isPlainObject(input)) {\n const filtered = Object.fromEntries(\n Object.entries(input)\n .filter(\n ([key, value]) =>\n typeof value !== \"undefined\" &&\n sparse.keySchema.safeParse(key).success,\n )\n .map(([key, value]) => [\n key,\n normalizeSchemaInput(sparse.valueSchema, value),\n ]),\n );\n return filtered;\n }\n\n const shape = getObjectShape(inner);\n if (shape && isPlainObject(input)) {\n return Object.fromEntries(\n Object.entries(input).map(([key, value]) => {\n const fieldSchema = shape[key];\n return [\n key,\n typeof fieldSchema === \"undefined\"\n ? value\n : normalizeSchemaInput(fieldSchema, value),\n ];\n }),\n );\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && Array.isArray(input) && def.element) {\n return input.map((value) => normalizeSchemaInput(def.element, value));\n }\n\n return input;\n}\n\nexport function normalizeCommandParams<Output>(\n schema: SchemaLike<Output>,\n input: unknown,\n): Output {\n return schema.parse(normalizeSchemaInput(schema, input));\n}\n","import {\n isManifestScopedSchema,\n type ManifestContract,\n type RuntimeTableRecord,\n type SchemaLike,\n} from \"../model\";\nimport type { InputCollector } from \"../model\";\nimport {\n getObjectShape,\n getZodDef,\n isEnumKeyedRecordSchema,\n isPlainZodString,\n isSparseMapSchema,\n isZodArray,\n unwrapWrappers,\n} from \"../schema-helpers\";\nimport type { AnyReducerGameContract } from \"./types\";\n\n/**\n * Canonical set of manifest-scoped id field names. `defineGameContract`\n * uses this list to reject state schemas that describe one of these fields\n * with a raw `z.string()` instead of the corresponding branded enum from\n * `manifest.ids.*` (or `gameContract.schemas.*`).\n *\n * The rule of thumb is \"one way to do things\": if a field *is* a player id,\n * card id, zone id, etc. in the manifest, the authored state schema must\n * reuse the same literal/branded schema so generated types line up with the\n * runtime checks, instead of silently widening to `string`.\n */\nconst MANIFEST_SCOPED_ID_NAMES = [\n \"playerId\",\n \"cardId\",\n \"deckId\",\n \"handId\",\n \"zoneId\",\n \"sharedZoneId\",\n \"playerZoneId\",\n \"boardId\",\n \"boardContainerId\",\n \"boardTypeId\",\n \"boardBaseId\",\n \"edgeId\",\n \"edgeTypeId\",\n \"vertexId\",\n \"vertexTypeId\",\n \"spaceId\",\n \"spaceTypeId\",\n \"relationTypeId\",\n \"resourceId\",\n \"pieceId\",\n \"pieceTypeId\",\n \"dieId\",\n \"dieTypeId\",\n \"setupOptionId\",\n \"setupProfileId\",\n \"cardSetId\",\n \"cardType\",\n] as const;\n\ntype ManifestScopedIdName = (typeof MANIFEST_SCOPED_ID_NAMES)[number];\n\nfunction matchManifestScopedIdName(\n key: string,\n): { name: ManifestScopedIdName; kind: \"singular\" | \"plural\" } | null {\n for (const name of MANIFEST_SCOPED_ID_NAMES) {\n const capitalized = `${name.charAt(0).toUpperCase()}${name.slice(1)}`;\n if (key === name || key.endsWith(capitalized)) {\n return { name, kind: \"singular\" };\n }\n const plural = `${name}s`;\n const capitalizedPlural = `${capitalized}s`;\n if (key === plural || key.endsWith(capitalizedPlural)) {\n return { name, kind: \"plural\" };\n }\n }\n return null;\n}\n\nexport function validateInteractionParamsSchema(\n schema: unknown,\n context: \"defineInteraction\" | \"defineCardAction\",\n path: string,\n): void {\n const inner = unwrapWrappers(schema);\n if (isEnumKeyedRecordSchema(inner) && !isSparseMapSchema(inner)) {\n throw new Error(\n `${context}: ${path} uses an enum-keyed z.record(...), which parses as a total map at runtime. ` +\n `Use sparseMap(...) or sparseCounts(...) from @dreamboard-games/sdk/reducer instead so interaction params stay sparse and match runtime validation.`,\n );\n }\n\n const shape = getObjectShape(inner);\n if (shape) {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n validateInteractionParamsSchema(fieldSchema, context, `${path}.${key}`);\n }\n return;\n }\n\n const def = getZodDef(inner);\n if (def.type === \"array\" && def.element) {\n validateInteractionParamsSchema(def.element, context, `${path}[]`);\n return;\n }\n\n if (def.type === \"record\" && def.valueType) {\n validateInteractionParamsSchema(def.valueType, context, `${path}.*`);\n }\n}\n\nexport function validateInteractionInputsSchema(\n inputs: Record<string, InputCollector> | undefined,\n context: \"defineInteraction\" | \"defineCardAction\",\n): void {\n if (!inputs) return;\n for (const [key, collector] of Object.entries(inputs)) {\n validateInteractionParamsSchema(collector.schema, context, `inputs.${key}`);\n }\n}\n\nexport function validateManyCommitPolicy(input: {\n inputs: Record<string, InputCollector> | undefined;\n commit?: { mode: string };\n context: string;\n}): void {\n if (input.commit?.mode !== \"autoWhenReady\") return;\n if (\n Object.values(input.inputs ?? {}).some(\n (collector) => collector.selection?.mode === \"many\",\n )\n ) {\n throw new Error(\n `${input.context}: interactions with many(...) inputs must use commit: { mode: \"manual\" }.`,\n );\n }\n}\n\nexport function validateInteractionLikeDefinition(\n input: {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n context: \"defineInteraction\" | \"defineCardAction\",\n): void {\n validateInteractionInputsSchema(input.inputs, context);\n validateManyCommitPolicy({\n inputs: input.inputs,\n commit: input.commit,\n context,\n });\n if (input.paramsSchema) {\n validateInteractionParamsSchema(\n input.paramsSchema,\n context,\n \"paramsSchema\",\n );\n }\n}\n\nexport function validateStateSchemaIdBranding(\n schema: unknown,\n scope: \"public\" | \"private\" | \"hidden\",\n): void {\n const def = getZodDef(schema);\n if (def.type !== \"object\") {\n return;\n }\n const shape = def.shape as Record<string, unknown> | undefined;\n if (!shape) {\n return;\n }\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const match = matchManifestScopedIdName(key);\n if (!match) {\n continue;\n }\n const inner = unwrapWrappers(fieldSchema);\n if (match.kind === \"singular\") {\n if (isPlainZodString(inner) && !isManifestScopedSchema(inner)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses a raw z.string() ` +\n `but its name identifies it as a manifest-scoped '${match.name}'. ` +\n `Use gameContract.schemas.${match.name} (or manifest.ids.${match.name}) ` +\n `so the branded literal union flows through state types.`,\n );\n }\n continue;\n }\n if (match.kind === \"plural\" && isZodArray(inner)) {\n const element = unwrapWrappers(getZodDef(inner).element);\n if (isPlainZodString(element) && !isManifestScopedSchema(element)) {\n throw new Error(\n `defineGameContract: state.${scope}.${key} uses z.array(z.string()) ` +\n `but its name identifies it as manifest-scoped '${match.name}' values. ` +\n `Use z.array(gameContract.schemas.${match.name}) ` +\n `(or manifest.ids.${match.name}) so the branded literal union flows through state types.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGamePhaseNames(definition: {\n contract: AnyReducerGameContract;\n phases: Record<string, unknown>;\n initialPhase?: string;\n setupProfiles?: Record<string, { initialPhase?: string }>;\n}): void {\n const contractPhaseNames = (\n definition.contract as AnyReducerGameContract & {\n phaseNames?: readonly string[];\n }\n ).phaseNames;\n if (!Array.isArray(contractPhaseNames)) {\n return;\n }\n const declared = new Set(contractPhaseNames);\n const actual = new Set(Object.keys(definition.phases));\n const missing = [...declared].filter((name) => !actual.has(name));\n const extra = [...actual].filter((name) => !declared.has(name));\n if (missing.length > 0 || extra.length > 0) {\n const parts: string[] = [];\n if (missing.length > 0) {\n parts.push(`missing: [${missing.join(\", \")}]`);\n }\n if (extra.length > 0) {\n parts.push(`extra: [${extra.join(\", \")}]`);\n }\n throw new Error(\n `defineGame: phases record does not match contract.phaseNames (${parts.join(\n \"; \",\n )}). Update contract.phaseNames or the phases record so they agree.`,\n );\n }\n if (\n definition.initialPhase !== undefined &&\n !declared.has(definition.initialPhase)\n ) {\n throw new Error(\n `defineGame: initialPhase '${definition.initialPhase}' is not declared in contract.phaseNames.`,\n );\n }\n if (definition.setupProfiles) {\n for (const [profileId, profile] of Object.entries(\n definition.setupProfiles,\n )) {\n const initial = profile?.initialPhase;\n if (initial !== undefined && !declared.has(initial)) {\n throw new Error(\n `defineGame: setupProfiles.${profileId}.initialPhase '${initial}' is not declared in contract.phaseNames.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGameZoneWiring(definition: {\n contract: {\n manifest: ManifestContract<RuntimeTableRecord>;\n };\n phases: Record<string, unknown>;\n}): void {\n const manifestPlayerZoneIds = new Set(\n definition.contract.manifest.literals.playerZoneIds ?? [],\n );\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n zones?: Record<string, unknown>;\n cardActions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord) continue;\n\n if (phaseRecord.zones !== undefined && !Array.isArray(phaseRecord.zones)) {\n const zonesRecord =\n typeof phaseRecord.zones === \"object\" && phaseRecord.zones !== null\n ? (phaseRecord.zones as Record<string, unknown>)\n : null;\n const hasRemovedZoneSpec =\n zonesRecord &&\n Object.values(zonesRecord).some(\n (zone) =>\n typeof zone === \"object\" &&\n zone !== null &&\n (\"cardsFrom\" in zone || \"playableVia\" in zone || \"from\" in zone),\n );\n if (hasRemovedZoneSpec) {\n throw new Error(\n `defineGame: phases.${phaseName}.zones uses removed zone spec objects. Use zones: [\"manifest-player-zone-id\"] and cardActions[*].playFrom instead.`,\n );\n }\n throw new Error(\n `defineGame: phases.${phaseName}.zones must be an array of manifest player zone ids.`,\n );\n }\n\n for (const [index, zoneId] of (phaseRecord.zones ?? []).entries()) {\n if (typeof zoneId !== \"string\") {\n throw new Error(\n `defineGame: phases.${phaseName}.zones[${index}] must be a manifest player zone id string.`,\n );\n }\n if (!manifestPlayerZoneIds.has(zoneId)) {\n throw new Error(\n `defineGame: phases.${phaseName}.zones[${index}] '${zoneId}' is not declared in manifest.literals.playerZoneIds.`,\n );\n }\n }\n\n for (const [actionId, action] of Object.entries(\n phaseRecord.cardActions ?? {},\n )) {\n const actionRecord =\n typeof action === \"object\" && action !== null\n ? (action as Record<string, unknown>)\n : null;\n const playFrom = actionRecord?.playFrom;\n if (\n typeof playFrom === \"string\" &&\n !manifestPlayerZoneIds.has(playFrom)\n ) {\n throw new Error(\n `defineGame: phases.${phaseName}.cardActions.${actionId}.playFrom '${playFrom}' is not declared in manifest.literals.playerZoneIds.`,\n );\n }\n }\n }\n}\n\nexport function validateDefineGameSimultaneousPhases(definition: {\n phases: Record<string, unknown>;\n}): void {\n for (const [phaseName, phase] of Object.entries(definition.phases)) {\n const phaseRecord =\n typeof phase === \"object\" && phase !== null\n ? (phase as {\n kind?: unknown;\n submit?: { inputs?: Record<string, InputCollector> };\n resolve?: unknown;\n interactions?: Record<string, unknown>;\n })\n : null;\n if (!phaseRecord || phaseRecord.kind !== \"simultaneousPlayer\") {\n continue;\n }\n if (!phaseRecord.submit) {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare submit.`,\n );\n }\n if (typeof phaseRecord.resolve !== \"function\") {\n throw new Error(\n `defineGame: phases.${phaseName} is kind 'simultaneousPlayer' but does not declare resolve.`,\n );\n }\n if (phaseRecord.interactions?.submit) {\n throw new Error(\n `defineGame: phases.${phaseName}.interactions.submit conflicts with the reserved simultaneous submit interaction id.`,\n );\n }\n validateInteractionInputsSchema(\n phaseRecord.submit.inputs,\n \"defineInteraction\",\n );\n validateManyCommitPolicy({\n inputs: phaseRecord.submit.inputs,\n commit: (phaseRecord.submit as { commit?: { mode: string } }).commit,\n context: `defineGame: phases.${phaseName}.submit`,\n });\n }\n}\n\nexport type ManifestIdSchemasOf<\n Ids extends Record<string, SchemaLike<unknown>>,\n> = {\n readonly [Key in keyof Ids]: Ids[Key] extends SchemaLike<infer Output>\n ? Ids[Key] & import(\"../model\").ManifestIdSchema<Output>\n : Ids[Key];\n};\n","import { z } from \"zod\";\nimport { createManifestStringLiteralSchema } from \"../model/manifest\";\nimport type {\n ReducerGameContract,\n ReducerManifestContract,\n RuntimeTableRecord,\n SchemaLike,\n StateDefinition,\n} from \"../model\";\nimport {\n type ManifestIdSchemasOf,\n validateStateSchemaIdBranding,\n} from \"./validation\";\n\n/**\n * Narrows a manifest's `literals.phaseNames` and `ids.phaseName` to the\n * author-supplied phase-name tuple. Lets `defineGameContract` override the\n * codegen-emitted `phaseNames: readonly string[]` / `phaseName: z.string()`\n * placeholders so `PhaseNameOfContract<Contract>` resolves to a literal\n * union and flows through `fx.transition`, `PhaseMapOf`, and the flow\n * state's `currentPhase`.\n */\ntype NarrowManifestPhaseNames<\n Manifest,\n PhaseNames extends readonly string[],\n> = Manifest & {\n literals: Manifest extends { literals: infer L }\n ? Omit<L, \"phaseNames\"> & { phaseNames: PhaseNames }\n : { phaseNames: PhaseNames };\n ids: Manifest extends { ids: infer I }\n ? Omit<I, \"phaseName\"> & { phaseName: z.ZodType<PhaseNames[number]> }\n : { phaseName: z.ZodType<PhaseNames[number]> };\n};\n\ntype ReducerGameContractInput<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n Phases extends Record<string, SchemaLike<object>>,\n Errors extends Record<string, string> | undefined = undefined,\n> = {\n manifest: Manifest;\n state: StateDefinition<PublicSchema, PrivateSchema, HiddenSchema>;\n phases: Phases;\n errors?: Errors;\n};\n\nfunction validateErrorMap(errors: Record<string, string> | undefined): void {\n if (!errors) return;\n const codePattern = /^[A-Z][A-Z0-9_]*$/;\n for (const [code, message] of Object.entries(errors)) {\n if (!codePattern.test(code)) {\n throw new Error(\n `defineGameContract: error code '${code}' must use UPPER_SNAKE_CASE.`,\n );\n }\n if (typeof message !== \"string\" || message.length === 0) {\n throw new Error(\n `defineGameContract: error code '${code}' must declare a non-empty default message.`,\n );\n }\n }\n}\n\nexport function defineGameContract<\n Table extends RuntimeTableRecord,\n const Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n const Phases extends Record<string, SchemaLike<object>>,\n const Errors extends Record<string, string> | undefined = undefined,\n>(\n definition: ReducerGameContractInput<\n Table,\n Manifest,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors\n >,\n): ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors\n> & {\n readonly phases: Phases;\n readonly errors: Errors;\n readonly phaseNames: readonly (keyof Phases & string)[];\n /**\n * Ergonomic shortcut to the manifest-backed Zod id schemas. Equivalent to\n * `definition.manifest.ids`. Prefer `gameContract.schemas.playerId` etc.\n * over re-importing the generated `ids` namespace so that every authored\n * schema is anchored to the same SDK-guided source.\n */\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n} {\n validateStateSchemaIdBranding(definition.state.public, \"public\");\n validateStateSchemaIdBranding(definition.state.private, \"private\");\n validateStateSchemaIdBranding(definition.state.hidden, \"hidden\");\n validateErrorMap(definition.errors);\n const phaseNames = Object.keys(definition.phases) as (keyof Phases &\n string)[];\n if (phaseNames.length === 0) {\n throw new Error(\n \"defineGameContract: phases must be a non-empty record of phase schemas.\",\n );\n }\n for (const name of phaseNames) {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new Error(\n \"defineGameContract: phase names must be non-empty strings.\",\n );\n }\n }\n const phaseNameSchema = createManifestStringLiteralSchema(phaseNames);\n const narrowedManifest = {\n ...definition.manifest,\n literals: {\n ...definition.manifest.literals,\n phaseNames,\n },\n ids: {\n ...definition.manifest.ids,\n phaseName: phaseNameSchema,\n },\n } as unknown as NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >;\n const contract = {\n manifest: narrowedManifest,\n state: definition.state,\n phases: definition.phases,\n errors: definition.errors,\n phaseNames,\n schemas: narrowedManifest.ids,\n } as ReducerGameContract<\n Table,\n NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n Phases,\n Errors\n > & {\n readonly phases: Phases;\n readonly errors: Errors;\n readonly phaseNames: readonly (keyof Phases & string)[];\n readonly schemas: ManifestIdSchemasOf<\n NarrowManifestPhaseNames<\n Manifest,\n readonly (keyof Phases & string)[]\n >[\"ids\"]\n >;\n };\n return contract;\n}\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"../model/table\";\nimport type { ManifestIdSchema } from \"../model/manifest\";\nimport type {\n BoundedNumberDomainDescriptor,\n ChoiceDomainDescriptor,\n ChoiceListDomainDescriptor,\n CollectorState,\n InputCollector,\n ResourceMapDomainDescriptor,\n} from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport type { DerivedResolver } from \"../derived\";\nimport { isPerPlayer } from \"../per-player\";\nimport type { DependencyValues, InputFieldRef } from \"./defineInputs\";\n\ntype DomainContext<\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n derived: DerivedResolver;\n values: Values;\n};\n\ntype ManifestFormInputSchema =\n | ManifestIdSchema<unknown>\n | z.ZodOptional<ManifestIdSchema<unknown>>\n | z.ZodNullable<ManifestIdSchema<unknown>>;\n\ntype DomainNumber<State extends CollectorState> =\n | number\n | ((context: DomainContext<State>) => number);\n\ntype ResourceMapInputOptions<State extends CollectorState> = {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n};\n\ntype ChoiceValue = string | null;\n\ntype FormInputDomainDescriptor =\n | ResourceMapDomainDescriptor\n | BoundedNumberDomainDescriptor\n | ChoiceDomainDescriptor\n | ChoiceListDomainDescriptor;\n\ntype DomainChoice<Value extends ChoiceValue> = {\n value: Value;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype DomainChoicePresentation = {\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype ResourceMapChoiceDecorator<State extends CollectorState> = (\n context: DomainContext<State> & {\n resourceId: string;\n label: string;\n icon?: string;\n },\n) => DomainChoicePresentation | null | undefined;\n\ntype ResourceMapChoiceSource<State extends CollectorState> =\n | \"resourceMap\"\n | {\n source: \"resourceMap\";\n decorate?: ResourceMapChoiceDecorator<State>;\n };\n\ntype DomainChoices<Value extends ChoiceValue, State extends CollectorState> =\n | ReadonlyArray<DomainChoice<Value>>\n | ResourceMapChoiceSource<State>\n | ((context: DomainContext<State>) => ReadonlyArray<DomainChoice<Value>>);\n\ntype DependentDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n> =\n | ReadonlyArray<DomainChoice<Value>>\n | ((\n context: DomainContext<State, DependencyValues<Dependencies>>,\n ) => ReadonlyArray<DomainChoice<Value>>);\n\ntype ChoiceListDefaultValue<\n Value extends string,\n State extends CollectorState,\n> =\n | Value[]\n | \"all\"\n | ((\n context: DomainContext<State> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n ) => Value[]);\n\ntype ChoiceDefaultValue<\n Value extends ChoiceValue,\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> =\n | Value\n | ((\n context: DomainContext<State, Values> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n ) => Value);\n\ntype ChoiceDefaultResolver<\n Value extends ChoiceValue,\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = (\n context: DomainContext<State, Values> & {\n choices: ReadonlyArray<DomainChoice<Value>>;\n },\n) => Value | undefined;\n\nfunction isResourceMapChoiceSource<State extends CollectorState>(\n choices: DomainChoices<ChoiceValue, State>,\n): choices is ResourceMapChoiceSource<State> {\n return (\n choices === \"resourceMap\" ||\n (typeof choices === \"object\" &&\n choices !== null &&\n !Array.isArray(choices) &&\n \"source\" in choices &&\n choices.source === \"resourceMap\")\n );\n}\n\nfunction resolveDomainNumber<State extends CollectorState>(\n value: DomainNumber<State> | undefined,\n context: DomainContext<State>,\n fallback: number,\n): number {\n if (typeof value === \"function\") return value(context);\n return value ?? fallback;\n}\n\nfunction resolveDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n>(\n choices: DomainChoices<Value, State>,\n context: DomainContext<State>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n if (isResourceMapChoiceSource(choices)) {\n return resolveResourceMapChoices(choices, context);\n }\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction resolveDependentDomainChoices<\n Value extends ChoiceValue,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n>(\n choices: DependentDomainChoices<Value, State, Dependencies>,\n context: DomainContext<State, DependencyValues<Dependencies>>,\n): Array<{\n value: ChoiceValue;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction choiceValuesInclude(\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n value: ChoiceValue,\n): boolean {\n return choices.some((choice) => Object.is(choice.value, value));\n}\n\nfunction assertChoiceDefaultInChoices(\n inputName: string,\n choices: ReadonlyArray<{ value: ChoiceValue }>,\n defaultValue: ChoiceValue,\n): void {\n if (choiceValuesInclude(choices, defaultValue)) return;\n const printable = defaultValue === null ? \"null\" : `'${defaultValue}'`;\n throw new Error(\n `${inputName} defaultValue ${printable} must be one of its choices. ` +\n \"If null is a valid value, add an explicit { value: null, label: ... } choice.\",\n );\n}\n\nfunction choiceSchema<Value extends ChoiceValue>(\n choices: ReadonlyArray<DomainChoice<Value>>,\n): SchemaLike<Value> {\n const values = choices.map((choice) => choice.value);\n const stringValues = values.filter(\n (value): value is Exclude<Value, null> => value !== null,\n );\n const hasNull = values.some((value) => value === null);\n\n if (stringValues.length === 0) {\n return z.null() as unknown as SchemaLike<Value>;\n }\n\n const stringSchema = z.enum(\n stringValues as [Exclude<Value, null>, ...Array<Exclude<Value, null>>],\n );\n\n if (hasNull) {\n return z.union([stringSchema, z.null()]) as unknown as SchemaLike<Value>;\n }\n\n return stringSchema as unknown as SchemaLike<Value>;\n}\n\nfunction resolveResourceMapChoices<State extends CollectorState>(\n choices: ResourceMapChoiceSource<State>,\n context: DomainContext<State>,\n): Array<{\n value: string;\n label: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resources = context.state.table.resources as unknown;\n const firstResourceMap =\n isPerPlayer(resources) && resources.entries.length > 0\n ? resources.entries[0]?.[1]\n : resources;\n if (\n typeof firstResourceMap !== \"object\" ||\n firstResourceMap === null ||\n Array.isArray(firstResourceMap)\n ) {\n return [];\n }\n const decorate = choices === \"resourceMap\" ? undefined : choices.decorate;\n return Object.keys(firstResourceMap)\n .sort()\n .map((resourceId) => {\n const label = resourceId;\n const presentation = decorate?.({ ...context, resourceId, label });\n return {\n value: resourceId,\n label,\n badge: presentation?.badge,\n description: presentation?.description,\n disabled: presentation?.disabled,\n disabledReason: presentation?.disabledReason,\n };\n });\n}\n\nfunction createFormInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return {\n kind: \"form\",\n schema,\n ...(options && \"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n };\n}\n\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(schema: Schema): InputCollector<Schema, State, \"form\">;\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n};\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return createFormInput(schema, options);\n}\n\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State>,\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State> & {\n defaultValue: Record<string, number>;\n },\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n};\nfunction resourceMapInput<State extends CollectorState = CollectorState>(\n options: ResourceMapInputOptions<State> & {\n defaultValue?: Record<string, number>;\n },\n): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.record(z.string(), z.number().int().nonnegative()),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"resourceMap\",\n resources: options.resources.map((resource) => ({\n resourceId: resource.resourceId,\n label: resource.label,\n icon: resource.icon,\n min: resolveDomainNumber(resource.min, context, 0),\n max: resolveDomainNumber(resource.max, context, 0),\n })),\n };\n },\n };\n}\n\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n}): InputCollector<z.ZodNumber, State, \"form\">;\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> & {\n readonly defaultValue: number;\n};\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue?: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.number(),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"boundedNumber\",\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, 0),\n step:\n options.step === undefined\n ? undefined\n : resolveDomainNumber(options.step, context, 1),\n };\n },\n };\n}\n\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends ChoiceValue = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends ChoiceValue = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<string, unknown>[] =\n readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<string, unknown>[] =\n readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends ChoiceValue,\n State extends CollectorState = CollectorState,\n>(options: {\n choices:\n | DomainChoices<Value, State>\n | DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n defaultValue: ChoiceDefaultValue<\n Value,\n State,\n Readonly<Record<string, unknown>>\n >;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> {\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choice requires at least one choice.\");\n }\n const staticChoices = Array.isArray(options.choices) ? options.choices : null;\n const hasStaticDefault = typeof options.defaultValue !== \"function\";\n const staticDefault = options.defaultValue as ChoiceValue;\n if (staticChoices && hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n staticChoices,\n staticDefault,\n );\n }\n const schema = staticChoices\n ? (choiceSchema(staticChoices) as SchemaLike<Value>)\n : (z.string().nullable() as unknown as SchemaLike<Value>);\n const dynamicDefault =\n typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema,\n ...(hasStaticDefault ? { defaultValue: staticDefault as Value } : {}),\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state,\n playerId,\n q,\n derived,\n values,\n ): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n };\n const choices = dependsOn\n ? resolveDependentDomainChoices(\n options.choices as DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >,\n {\n ...context,\n values: (values ?? {}) as DependencyValues<\n readonly InputFieldRef<string, unknown>[]\n >,\n },\n )\n : resolveDomainChoices(options.choices as DomainChoices<Value, State>, {\n ...context,\n values: {},\n });\n if (hasStaticDefault) {\n assertChoiceDefaultInChoices(\n \"formInput.choice\",\n choices,\n staticDefault,\n );\n }\n return {\n type: \"choice\",\n choices,\n };\n },\n ...(dynamicDefault\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choice\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n const resolved = dynamicDefault({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n if (resolved === undefined) return undefined;\n assertChoiceDefaultInChoices(\"formInput.choice\", choices, resolved);\n return resolved;\n },\n }\n : {}),\n };\n}\n\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n};\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\">;\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> {\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choiceList requires at least one choice.\");\n }\n const staticDefaultValue = Array.isArray(options.defaultValue)\n ? options.defaultValue\n : undefined;\n const dynamicDefaultValue =\n options.defaultValue === \"all\" || typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema: z.array(z.string()) as unknown as SchemaLike<Value[]>,\n ...(staticDefaultValue !== undefined\n ? { defaultValue: staticDefaultValue }\n : {}),\n domain: (state, playerId, q, derived): FormInputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n const choices = resolveDomainChoices(options.choices, context).map(\n (choice) => ({\n ...choice,\n value: choice.value as string,\n }),\n );\n return {\n type: \"choiceList\",\n choices,\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, choices.length),\n };\n },\n ...(dynamicDefaultValue\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choiceList\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n if (dynamicDefaultValue === \"all\") {\n return choices.map((choice) => choice.value);\n }\n return dynamicDefaultValue({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n },\n }\n : {}),\n };\n}\n\ntype FormInputForState<State extends CollectorState> = {\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n ): InputCollector<Schema, State, \"form\">;\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n ): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n };\n resourceMap(\n options: ResourceMapInputOptions<State>,\n ): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\n resourceMap(\n options: ResourceMapInputOptions<State> & {\n defaultValue: Record<string, number>;\n },\n ): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n };\n resourceChoices(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State>;\n number(\n options: Parameters<typeof numberInput<State>>[0],\n ): ReturnType<typeof numberInput<State>>;\n choice<\n Value extends ChoiceValue,\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n >(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n }): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n };\n choice<\n Value extends ChoiceValue,\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n >(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: ChoiceDefaultResolver<\n Value,\n State,\n DependencyValues<Dependencies>\n >;\n }): InputCollector<SchemaLike<Value>, State, \"form\">;\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n }): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n };\n choice<Value extends ChoiceValue>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: ChoiceDefaultResolver<Value, State>;\n }): InputCollector<SchemaLike<Value>, State, \"form\">;\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n }): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n };\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n }): InputCollector<SchemaLike<Value[]>, State, \"form\">;\n};\n\nfunction formInputForState<\n State extends CollectorState,\n>(): FormInputForState<State> {\n return Object.assign(\n ((\n schema: ManifestFormInputSchema & SchemaLike<unknown>,\n options?: object,\n ) => baseFormInput(schema, options as never)) as FormInputForState<State>,\n {\n resourceMap: (\n options: ResourceMapInputOptions<State> & {\n defaultValue?: Record<string, number>;\n },\n ) => resourceMapInput<State>(options),\n resourceChoices: (options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }) => formInput.resourceChoices<State>(options),\n number: (options: Parameters<typeof numberInput<State>>[0]) =>\n numberInput<State>(options),\n choice: (options: never) => choiceInput(options),\n choiceList: (options: never) => choiceListInput(options),\n },\n );\n}\n\n/**\n * Manifest-backed id input. Free-form Zod schemas are intentionally explicit:\n * if the runtime cannot disclose valid values or numeric bounds through a\n * manifest id or domain helper, use a custom interaction surface with an\n * explicit `paramsSchema` instead of the default form renderer.\n */\nexport const formInput = Object.assign(baseFormInput, {\n resourceMap: resourceMapInput,\n resourceChoices: <State extends CollectorState = CollectorState>(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State> => ({\n source: \"resourceMap\",\n ...options,\n }),\n number: numberInput,\n choice: choiceInput,\n choiceList: choiceListInput,\n forState: formInputForState,\n});\n","import type { z } from \"zod\";\nimport type { InputCollector } from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type InputFieldRef<\n Key extends string = string,\n Value = unknown,\n Collector extends InputCollector = InputCollector,\n> = {\n readonly key: Key;\n readonly collector: Collector;\n readonly __value?: Value;\n};\n\ntype RefValue<Ref> =\n Ref extends InputFieldRef<string, infer Value, InputCollector>\n ? Value\n : never;\n\ntype CollectorOfRef<Ref> =\n Ref extends InputFieldRef<string, unknown, infer Collector>\n ? Collector\n : never;\n\ntype CollectorValue<Collector> =\n Collector extends InputCollector<infer Schema> ? z.infer<Schema> : never;\n\nexport type DependencyValues<\n Dependencies extends readonly InputFieldRef<\n string,\n unknown,\n InputCollector\n >[],\n> = {\n readonly [Ref in Dependencies[number] as Ref[\"key\"]]: RefValue<Ref>;\n};\n\ntype DefinedInputRefs = Record<\n string,\n InputFieldRef<string, unknown, InputCollector>\n>;\n\nexport type DefinedInputs<Refs extends DefinedInputRefs> = {\n readonly [Key in keyof Refs]: CollectorOfRef<Refs[Key]>;\n};\n\nclass InputBuilder {\n add<\n const Key extends string,\n Collector extends InputCollector<SchemaLike<unknown>>,\n >(\n key: Key,\n collector: Collector,\n ): InputFieldRef<Key, CollectorValue<Collector>, Collector> {\n return { key, collector };\n }\n}\n\n/**\n * Define an interaction's inputs with typed field references. Field refs can be\n * passed to dependent input domains, and the returned collector map preserves\n * the original key/value types for interaction params.\n */\nexport function defineInputs<const Refs extends DefinedInputRefs>(\n define: (input: InputBuilder) => Refs,\n): DefinedInputs<Refs> {\n const refs = define(new InputBuilder());\n return Object.fromEntries(\n Object.entries(refs).map(([key, ref]) => [key, ref.collector]),\n ) as DefinedInputs<Refs>;\n}\n","import { z } from \"zod\";\nimport type {\n BoardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n TargetKind,\n} from \"../model/spec\";\nimport type { BoardTargetRule, PlayerBoardSpaceTarget } from \"./boardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `boardInput.*` helpers produce collectors that accept a board-element id\n * (vertex / edge / space / tile) scoped to one built `boardTarget` rule.\n *\n * Id typing:\n * The `Id` type parameter is the branded id for the board you target,\n * e.g. `HexVertexIdOfTable<Table, \"main\">` or\n * `SquareSpaceIdOfTable<Table, \"board\">`. Once tightened,\n * `ParamsOf<Collectors>` downstream typing reflects the branded id too.\n *\n * Eligibility:\n * Pass a built `boardTarget.*(...).where(...).build()` rule. The same rule\n * feeds server-authoritative eligible-target projection, submit validation,\n * and tests through its `bind({ state, playerId, q })` helper.\n *\n * Runtime vs. compile time:\n * At runtime the submitted value is a string. Branding is purely a\n * compile-time discipline.\n */\nfunction makeBoardCollector<\n Kind extends \"board-vertex\" | \"board-edge\" | \"board-tile\" | \"board-space\",\n>(kind: Kind) {\n return function collector<\n State extends CollectorState = CollectorState,\n Id extends string = string,\n >(options: {\n target: BoardTargetRule<State, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, State, Kind> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind,\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<BoardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state: CollectorState,\n playerId: string,\n q: unknown,\n _derived: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n } as unknown as InputCollector<z.ZodType<Id>, State, Kind>;\n };\n}\n\nexport const vertexInput = makeBoardCollector(\"board-vertex\");\nexport const edgeInput = makeBoardCollector(\"board-edge\");\nexport const tileInput = makeBoardCollector(\"board-tile\");\nexport const spaceInput = makeBoardCollector(\"board-space\");\n\nexport function playerSpaceInput<\n State extends CollectorState = CollectorState,\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = string,\n>(options: {\n target: BoardTargetRule<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<\n z.ZodType<PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>>,\n State,\n \"board-space\"\n> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"board-space\",\n schema: z.object({\n boardId: z.literal(target.boardId),\n playerId: z.string(),\n spaceId: z.string(),\n }) as unknown as z.ZodType<\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >,\n eligibleTargets: ((state, playerId, q, values) =>\n target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId)) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetValue, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetValue as PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<\n BoardTargetRule<\n CollectorState,\n PlayerBoardSpaceTarget<string, string, string>\n >[\"validate\"]\n >)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (\n state: CollectorState,\n playerId: string,\n q: unknown,\n _derived: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) =>\n ({\n type: \"boardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind as Exclude<TargetKind, \"card\">,\n boardId: target.boardId,\n valueKind: target.valueKind,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId),\n }) satisfies BoardTargetDomainDescriptor,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n };\n}\n\nexport const boardInput = {\n vertex: vertexInput,\n edge: edgeInput,\n tile: tileInput,\n space: spaceInput,\n playerSpace: playerSpaceInput,\n};\n","import type { CollectorState, TargetKind } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type BoardTargetPredicate<\n State extends CollectorState,\n Target,\n> = TargetPredicate<State, Target>;\n\nexport type BoardTargetRule<State extends CollectorState, Target> = TargetRule<\n State,\n Target\n> & {\n readonly boardId: string;\n readonly targetKind: TargetKind;\n readonly valueKind: \"board-id\" | \"player-board-space\";\n};\n\nexport type BoardTargetBuilder<\n State extends CollectorState,\n Target,\n> = TargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>;\n\nexport type PlayerBoardSpaceTarget<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string,\n> = {\n readonly boardId: BoardId;\n readonly playerId: PlayerId;\n readonly spaceId: SpaceId;\n};\n\nfunction candidateIdsForKind<State extends CollectorState, Id extends string>(\n q: TableQueriesOfState<State>,\n boardId: string,\n targetKind: TargetKind,\n): readonly Id[] {\n if (targetKind === \"edge\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).edges);\n }\n if (targetKind === \"vertex\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).vertices);\n }\n return idsFromCollection<Id>(q.board.get(boardId as never)?.spaces);\n}\n\nfunction idsFromCollection<Id extends string>(\n collection: unknown,\n): readonly Id[] {\n if (!collection) return [];\n const values = Array.isArray(collection)\n ? collection\n : Object.values(collection as Record<string, unknown>);\n return values.flatMap((value) => {\n if (typeof value === \"string\") return [value as Id];\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"id\" in value &&\n typeof (value as { id?: unknown }).id === \"string\"\n ) {\n return [(value as { id: string }).id as Id];\n }\n return [];\n });\n}\n\nfunction createBoardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(targetKind: TargetKind, boardId: string): BoardTargetBuilder<State, Id> {\n return createTargetRuleBuilder<State, Id, BoardTargetRule<State, Id>>(\n (predicates) => ({\n ...createTargetRule(\n ({ q }) => candidateIdsForKind<State, Id>(q, boardId, targetKind),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n },\n ),\n boardId,\n targetKind,\n valueKind: \"board-id\",\n }),\n );\n}\n\nfunction createPlayerSpaceTargetBuilder<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n>(\n boardId: BoardId,\n): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n> {\n type Target = PlayerBoardSpaceTarget<\n BoardId,\n SpaceId,\n PlayerIdOfState<State>\n >;\n return createTargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, q }) => {\n const spacesForPlayer = (playerId: string): readonly SpaceId[] =>\n candidateIdsForKind<State, SpaceId>(\n q,\n `${boardId}:${playerId}`,\n \"space\",\n );\n return state.table.playerOrder.flatMap((playerId) =>\n spacesForPlayer(playerId).map((spaceId) => ({\n boardId,\n playerId: playerId as PlayerIdOfState<State>,\n spaceId,\n })),\n );\n },\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n equals: (left, right) =>\n isPlayerBoardSpaceTarget(left) &&\n isPlayerBoardSpaceTarget(right) &&\n left.boardId === right.boardId &&\n left.playerId === right.playerId &&\n left.spaceId === right.spaceId,\n },\n ),\n boardId,\n targetKind: \"space\",\n valueKind: \"player-board-space\",\n }),\n );\n}\n\nfunction isPlayerBoardSpaceTarget(\n value: unknown,\n): value is PlayerBoardSpaceTarget<string, string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"boardId\" in value &&\n \"playerId\" in value &&\n \"spaceId\" in value\n );\n}\n\nfunction makeBoardTargetFactory(targetKind: TargetKind) {\n return function target<State extends CollectorState, Id extends string>(\n boardId: string,\n ): BoardTargetBuilder<State, Id> {\n return createBoardTargetBuilder<State, Id>(targetKind, boardId);\n };\n}\n\nexport const boardTarget = {\n edge: makeBoardTargetFactory(\"edge\"),\n vertex: makeBoardTargetFactory(\"vertex\"),\n space: makeBoardTargetFactory(\"space\"),\n tile: makeBoardTargetFactory(\"tile\"),\n playerSpace<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n >(\n boardId: BoardId,\n ): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n > {\n return createPlayerSpaceTargetBuilder<State, BoardId, SpaceId>(boardId);\n },\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetContext,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type ChoiceTargetOption<Id extends string> = {\n id: Id;\n label?: string;\n};\n\nexport type ChoiceOptionsFactory<\n State extends CollectorState,\n Id extends string,\n> = (\n state: State,\n playerId: PlayerIdOfState<State>,\n q: TableQueriesOfState<State>,\n) => ReadonlyArray<ChoiceTargetOption<Id>>;\n\nexport type ChoiceTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type ChoiceTargetRule<\n State extends CollectorState,\n Id extends string,\n> = TargetRule<State, Id> & {\n readonly targetKind: \"choice\";\n readonly options: (\n ctx: TargetContext<State>,\n ) => ReadonlyArray<ChoiceTargetOption<Id>>;\n readonly eligibleOptions: (\n ctx: TargetContext<State>,\n ) => ReadonlyArray<ChoiceTargetOption<Id>>;\n};\n\nexport type ChoiceTargetBuilder<\n State extends CollectorState,\n Id extends string,\n> = TargetRuleBuilder<State, Id, ChoiceTargetRule<State, Id>>;\n\nfunction normalizeOptions<State extends CollectorState, Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n): ChoiceOptionsFactory<State, Id> {\n if (typeof options === \"function\") return options;\n return () => options;\n}\n\nfunction createChoiceTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n): ChoiceTargetBuilder<State, Id> {\n const optionsFactory = normalizeOptions(options);\n return createTargetRuleBuilder<State, Id, ChoiceTargetRule<State, Id>>(\n (predicates) => {\n const baseRule = createTargetRule(\n (ctx) =>\n optionsFactory(ctx.state, ctx.playerId, ctx.q).map(\n (option) => option.id,\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CHOICE_TARGET_NOT_ELIGIBLE\",\n message: \"Choice target is not eligible.\",\n },\n },\n );\n return {\n ...baseRule,\n targetKind: \"choice\",\n options: (ctx) => optionsFactory(ctx.state, ctx.playerId, ctx.q),\n eligibleOptions: (ctx) =>\n optionsFactory(ctx.state, ctx.playerId, ctx.q).filter((option) =>\n baseRule.isEligible(ctx, option.id),\n ),\n };\n },\n );\n}\n\nexport const choiceTarget = {\n options<State extends CollectorState, Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<State, Id>,\n ): ChoiceTargetBuilder<State, Id> {\n return createChoiceTargetBuilder(options);\n },\n};\n","import type { SchemaLike } from \"../model/table\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { ChoiceTargetRule } from \"./choiceTarget\";\nimport type { z } from \"zod\";\n\ntype SchemaStringValue<Schema extends SchemaLike<unknown>> = Extract<\n Schema extends z.ZodType<infer V> ? V : never,\n string\n>;\n\n/**\n * `promptInput` marks an interaction as a prompt delivered to a player's\n * inbox. The submitted value is validated by the supplied Zod schema.\n *\n * Static or free-form prompts need only `schema`. Finite dynamic choices use\n * a built `choiceTarget.options(...).build()` rule so projected options and\n * submit validation share one source of truth.\n */\nexport function promptInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(options: {\n schema: Schema;\n target?: ChoiceTargetRule<State, SchemaStringValue<Schema>>;\n}): InputCollector<Schema, State, \"prompt\"> {\n const target = options.target;\n return {\n kind: \"prompt\",\n schema: options.schema,\n eligibleTargets: target\n ? (((state, playerId, q) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n ) => ReadonlyArray<unknown>)\n | undefined)\n : undefined,\n validateTarget: target\n ? (((state, playerId, q, targetId) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n },\n targetId as SchemaStringValue<Schema>,\n )) as InputCollector<Schema, State, \"prompt\">[\"validateTarget\"])\n : undefined,\n meta: target\n ? {\n options: (state: unknown, playerId: unknown, q: unknown) =>\n target.options({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n }),\n eligibleOptions: (state: unknown, playerId: unknown, q: unknown) =>\n target.eligibleOptions({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n }),\n }\n : undefined,\n domain: (state, playerId, q) => ({\n type: \"choice\" as const,\n choices: target\n ? target\n .options({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n })\n .map((option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n }))\n : [],\n }),\n };\n}\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\n\n/**\n * `rngInput.*` helpers produce collectors whose value is *sampled by the\n * engine on submit* rather than supplied by the client. The schema pins\n * the exact output shape so `ParamsOf<Collectors>` sees precisely typed\n * results.\n *\n * Determinism:\n * Sampling happens inside `submitInteraction` only, never inside\n * `validateInteraction`. This lets clients dry-run a submission without\n * burning RNG state.\n */\n\ntype DieRoll = z.ZodObject<{ values: z.ZodArray<z.ZodNumber> }>;\ntype CoinFlip = z.ZodObject<{\n value: z.ZodEnum<{ heads: \"heads\"; tails: \"tails\" }>;\n}>;\n\n// The literal `kind: \"rng\"` is intentionally preserved in the return type\n// so `ClientParamsOf<Collectors>` can structurally detect engine-sampled\n// collectors and omit them from client-facing submit params.\ntype RngCollector<\n Schema extends DieRoll | CoinFlip,\n State extends CollectorState,\n> = InputCollector<Schema, State, \"rng\">;\n\n/**\n * Roll `count` d6s. The submitted value is `{ values: number[] }` with\n * `values.length === count` and each face `1..6`.\n */\nexport function d6<State extends CollectorState = CollectorState>(\n count: number = 1,\n): RngCollector<DieRoll, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n values: z.array(z.number().int().min(1).max(6)).length(count),\n }),\n meta: { rng: \"d6\", count },\n };\n}\n\n/** Flip a coin. The submitted value is `{ value: \"heads\" | \"tails\" }`. */\nexport function coin<\n State extends CollectorState = CollectorState,\n>(): RngCollector<CoinFlip, State> {\n return {\n kind: \"rng\",\n schema: z.object({\n value: z.enum([\"heads\", \"tails\"]),\n }),\n meta: { rng: \"coin\" },\n };\n}\n\nexport const rngInput = { d6, coin };\n","import { z } from \"zod\";\nimport type {\n CollectorState,\n InputCollector,\n InputSelectionDescriptor,\n} from \"../model/spec\";\nimport type { SchemaLike } from \"../model/table\";\n\nexport type ManyOptions =\n | {\n count: number;\n distinct?: boolean;\n }\n | {\n min?: number;\n max?: number;\n distinct?: boolean;\n };\n\ntype NonRngCollector = InputCollector<SchemaLike<unknown>, CollectorState> & {\n readonly kind: Exclude<InputCollector[\"kind\"], \"rng\">;\n};\n\ntype CollectorSchema<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<infer Schema, CollectorState>,\n]\n ? Schema\n : never;\n\ntype CollectorStateOf<Collector extends NonRngCollector> = [Collector] extends [\n InputCollector<SchemaLike<unknown>, infer State>,\n]\n ? State\n : never;\n\ntype CollectorKindOf<Collector extends NonRngCollector> = [Collector] extends [\n {\n readonly kind: infer Kind extends Exclude<InputCollector[\"kind\"], \"rng\">;\n },\n]\n ? Kind\n : never;\n\nexport type ManyInputCollector<\n Schema extends SchemaLike<unknown> = SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n Kind extends Exclude<InputCollector[\"kind\"], \"rng\"> = Exclude<\n InputCollector[\"kind\"],\n \"rng\"\n >,\n> = InputCollector<z.ZodType<ReadonlyArray<z.infer<Schema>>>, State, Kind> & {\n readonly selection: Extract<InputSelectionDescriptor, { mode: \"many\" }>;\n};\n\nfunction normalizeManyOptions(\n options: ManyOptions,\n): Extract<InputSelectionDescriptor, { mode: \"many\" }> {\n if (\"count\" in options) {\n assertNonNegativeInteger(options.count, \"many(...).count\");\n return {\n mode: \"many\",\n min: options.count,\n max: options.count,\n distinct: options.distinct,\n };\n }\n const min = options.min ?? 0;\n assertNonNegativeInteger(min, \"many(...).min\");\n if (options.max !== undefined) {\n assertNonNegativeInteger(options.max, \"many(...).max\");\n if (options.max < min) {\n throw new Error(\"many(...).max must be greater than or equal to min.\");\n }\n }\n return {\n mode: \"many\",\n min,\n max: options.max,\n distinct: options.distinct,\n };\n}\n\nfunction assertNonNegativeInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative integer.`);\n }\n}\n\nexport function many<Collector extends NonRngCollector>(\n collector: Collector,\n options: ManyOptions,\n): ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n> &\n Pick<Collector, \"meta\"> {\n if ((collector as InputCollector).kind === \"rng\") {\n throw new Error(\"many(...) cannot wrap rngInput collectors.\");\n }\n const selection = normalizeManyOptions(options);\n const rest = { ...collector } as Omit<\n Collector,\n \"schema\" | \"selection\" | \"defaultValue\"\n > & {\n schema?: unknown;\n selection?: unknown;\n defaultValue?: unknown;\n };\n delete rest.schema;\n delete rest.selection;\n delete rest.defaultValue;\n return {\n ...rest,\n schema: z.array(collector.schema as z.ZodTypeAny) as unknown as z.ZodType<\n ReadonlyArray<z.infer<CollectorSchema<Collector>>>\n >,\n selection,\n } as unknown as ManyInputCollector<\n CollectorSchema<Collector>,\n CollectorStateOf<Collector>,\n CollectorKindOf<Collector>\n > &\n Pick<Collector, \"meta\">;\n}\n","import type { PhaseMapOf, ReducerGameDefinition, ViewMapOf } from \"../model\";\nimport type { AnyReducerGameContract } from \"./types\";\nimport {\n validateDefineGamePhaseNames,\n validateDefineGameSimultaneousPhases,\n validateDefineGameZoneWiring,\n} from \"./validation\";\n\nexport function defineGame<\n const Contract extends AnyReducerGameContract,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: { contract: Contract } & Omit<\n ReducerGameDefinition<NoInfer<Contract>, Definitions, Views>,\n \"contract\"\n >,\n): ReducerGameDefinition<Contract, Definitions, Views> {\n validateDefineGamePhaseNames(definition);\n validateDefineGameSimultaneousPhases(definition);\n validateDefineGameZoneWiring(definition);\n return definition;\n}\n","import type {\n CardActionSpec,\n InputCollector,\n InteractionRule,\n InteractionSpec,\n PlayerZoneIdOfManifest,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractErrorCode,\n ContractManifest,\n ContractState,\n InferPhaseState,\n PhaseStateInput,\n} from \"./types\";\nimport { validateInteractionLikeDefinition } from \"./validation\";\n\nexport function defineInteraction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <Collectors extends Record<string, InputCollector>>(\n definition: InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineInteraction\",\n );\n return definition;\n };\n}\n\nexport function defineInteractionRule<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput = import(\"../model\").SchemaLike<object>,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n >(\n definition: InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionRule<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n ContractErrorCode<Contract>\n > => definition;\n}\n\nexport function defineCardAction<\n Contract extends AnyReducerGameContract,\n PhaseState extends PhaseStateInput,\n>() {\n return <\n Collectors extends Record<string, InputCollector> = Record<string, never>,\n const PlayFrom extends PlayerZoneIdOfManifest<ContractManifest<Contract>> =\n PlayerZoneIdOfManifest<ContractManifest<Contract>>,\n >(\n definition: CardActionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n PlayFrom,\n ContractErrorCode<Contract>\n >,\n ): CardActionSpec<\n Collectors,\n ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,\n ContractManifest<Contract>,\n PlayFrom,\n ContractErrorCode<Contract>\n > => {\n validateInteractionLikeDefinition(\n definition as {\n inputs?: Record<string, InputCollector>;\n commit?: { mode: string };\n paramsSchema?: unknown;\n },\n \"defineCardAction\",\n );\n return definition;\n };\n}\n","import { z } from \"zod\";\nimport type {\n AnyCardActionSpec,\n AnyInteractionSpec,\n CardActionMap,\n EffectMap,\n InputCollector,\n ManifestContract,\n PhaseDefinition,\n PhaseZoneList,\n PlayerIdOfState,\n RuntimeTableRecord,\n SchemaLike,\n SetupSelectionOfManifest,\n StageMap,\n TableOfState,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nexport type StepPhaseState<\n PhaseStateSchema extends SchemaLike<object>,\n Steps extends readonly string[],\n> = z.infer<PhaseStateSchema> & { step: Steps[number] };\n\ntype StepPhaseInteractionEntry<Step extends string, Interaction> = {\n steps: readonly Step[];\n interaction: Interaction;\n};\n\ntype StepPhaseCardActionEntry<Step extends string, Action> = {\n steps: readonly Step[];\n action: Action;\n};\n\nexport type StepPhaseInteractionMap<\n Step extends string,\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n> = Record<\n string,\n StepPhaseInteractionEntry<Step, AnyInteractionSpec<State, Manifest>>\n>;\n\nexport type StepPhaseCardActionMap<\n Step extends string,\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n> = Record<\n string,\n StepPhaseCardActionEntry<Step, AnyCardActionSpec<State, Manifest>>\n>;\n\nexport type UnwrappedStepInteractions<\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n Interactions extends Record<\n string,\n StepPhaseInteractionEntry<string, AnyInteractionSpec<State, Manifest>>\n >,\n> = {\n [Key in keyof Interactions]: Interactions[Key][\"interaction\"];\n};\n\nexport type UnwrappedStepCardActions<\n State extends { table: RuntimeTableRecord; flow: { currentPhase: string } },\n Manifest extends ManifestContract<TableOfState<State>>,\n CardActions extends Record<\n string,\n StepPhaseCardActionEntry<string, AnyCardActionSpec<State, Manifest>>\n >,\n> = {\n [Key in keyof CardActions]: CardActions[Key][\"action\"];\n};\n\nfunction stepStateSchema<Steps extends readonly [string, ...string[]]>(\n schema: SchemaLike<object>,\n steps: Steps,\n): SchemaLike<object> {\n const stepSchema = z.enum(steps);\n const maybeObject = schema as {\n extend?: (shape: { step: typeof stepSchema }) => SchemaLike<object>;\n };\n if (typeof maybeObject.extend === \"function\") {\n return maybeObject.extend({ step: stepSchema });\n }\n return z.intersection(schema, z.object({ step: stepSchema }));\n}\n\nfunction unwrapStepInteractions<\n Step extends string,\n Interactions extends Record<string, StepPhaseInteractionEntry<Step, unknown>>,\n>(interactions: Interactions | undefined) {\n if (!interactions) return undefined;\n return Object.fromEntries(\n Object.entries(interactions).map(([key, entry]) => [\n key,\n {\n ...(entry.interaction as object),\n __steps: entry.steps,\n },\n ]),\n );\n}\n\nfunction unwrapStepCardActions<\n Step extends string,\n CardActions extends Record<string, StepPhaseCardActionEntry<Step, unknown>>,\n>(cardActions: CardActions | undefined) {\n if (!cardActions) return undefined;\n return Object.fromEntries(\n Object.entries(cardActions).map(([key, entry]) => [\n key,\n {\n ...(entry.action as object),\n __steps: entry.steps,\n },\n ]),\n );\n}\n\nexport function definePhase<Contract extends AnyReducerGameContract>() {\n return <\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<\n ContractState<Contract>,\n ContractManifest<Contract>\n > = Record<string, never>,\n Interactions extends Record<\n string,\n AnyInteractionSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<ContractManifest<Contract>> = readonly [],\n CardActions extends CardActionMap<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > = Record<string, never>,\n >(\n definition: PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >,\n ): PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n > => {\n return definition;\n };\n}\n\nexport function defineStepPhase<Contract extends AnyReducerGameContract>() {\n return <\n const Steps extends readonly [string, ...string[]],\n PhaseStateSchema extends SchemaLike<object>,\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<\n ContractState<Contract>,\n ContractManifest<Contract>\n > = Record<string, never>,\n Interactions extends StepPhaseInteractionMap<\n Steps[number],\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<ContractManifest<Contract>> = readonly [],\n CardActions extends StepPhaseCardActionMap<\n Steps[number],\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>\n > = Record<string, never>,\n >(\n definition: Omit<\n PhaseDefinition<\n PhaseStateSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n CardActions\n >\n >,\n \"state\" | \"initialState\" | \"interactions\" | \"cardActions\"\n > & {\n steps: Steps;\n state: PhaseStateSchema;\n initialState?: (ctx: {\n manifest: ContractManifest<Contract>;\n state: ContractState<Contract>;\n playerIds: PlayerIdOfState<ContractState<Contract>>[];\n setup: SetupSelectionOfManifest<ContractManifest<Contract>> | null;\n }) => z.infer<PhaseStateSchema>;\n interactions?: Interactions;\n cardActions?: CardActions;\n },\n ) => {\n const [initialStep] = definition.steps;\n const state = stepStateSchema(definition.state, definition.steps);\n const initialState = definition.initialState\n ? (ctx: Parameters<NonNullable<typeof definition.initialState>>[0]) => ({\n ...definition.initialState?.(ctx),\n step: initialStep,\n })\n : () => ({ step: initialStep });\n const { steps: _steps, ...rest } = definition;\n void _steps;\n const normalized = {\n ...rest,\n state,\n initialState,\n interactions: unwrapStepInteractions(definition.interactions),\n cardActions: unwrapStepCardActions(definition.cardActions),\n };\n return normalized as unknown as PhaseDefinition<\n SchemaLike<StepPhaseState<PhaseStateSchema, Steps>>,\n ContractState<Contract>,\n ContractManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n ContractState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n ContractManifest<Contract>,\n CardActions\n >\n >;\n };\n}\n","import type { z } from \"zod\";\nimport type {\n ExactManifestContractOf,\n SchemaLike,\n StageSpec,\n StaticViewDefinition,\n EmptyViewDefinition,\n PlayerViewDefinition,\n SharedViewDefinition,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nexport function defineSharedView<Contract extends AnyReducerGameContract>() {\n return <Projection>(\n definition: SharedViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n >,\n ): SharedViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n Projection\n > => definition;\n}\n\nexport function definePlayerView<Contract extends AnyReducerGameContract>() {\n return <SharedProjection = unknown, Projection = unknown>(\n definition: PlayerViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n SharedProjection,\n Projection\n >,\n ): PlayerViewDefinition<\n ContractState<Contract>,\n ContractManifest<Contract>,\n SharedProjection,\n Projection\n > => definition;\n}\n\nexport function defineEmptyView<\n Contract extends AnyReducerGameContract,\n>(): EmptyViewDefinition<ContractState<Contract>, ContractManifest<Contract>> {\n return {\n project: () => ({}),\n } as EmptyViewDefinition<ContractState<Contract>, ContractManifest<Contract>>;\n}\n\n/**\n * Factory for the session-scoped static view (see {@link StaticViewDefinition}).\n * Kept separate from dynamic view helpers because the argument shape is\n * structurally different: it exposes only the manifest and generated static\n * queries, with no `state`, `playerId`, `runtime`, `fx`, `ops`, or\n * `accept/reject`. That shape is what prevents authors from accidentally\n * projecting per-tick state into the once-per-session payload.\n */\nexport function defineStaticView<Contract extends AnyReducerGameContract>() {\n return <Projection>(\n definition: StaticViewDefinition<\n ExactManifestContractOf<Contract>,\n Projection\n >,\n ): StaticViewDefinition<ExactManifestContractOf<Contract>, Projection> =>\n definition;\n}\n\nexport function defineStage<Contract extends AnyReducerGameContract>() {\n return (\n definition: StageSpec<ContractState<Contract>, ContractManifest<Contract>>,\n ): StageSpec<ContractState<Contract>, ContractManifest<Contract>> =>\n definition;\n}\n\nexport function definePhaseStage<\n Contract extends AnyReducerGameContract,\n PhaseStateSchema extends SchemaLike<object>,\n>() {\n return (\n definition: StageSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n >,\n ): StageSpec<\n ScopedPhaseState<ContractState<Contract>, z.infer<PhaseStateSchema>>,\n ContractManifest<Contract>\n > => definition;\n}\n","import type { z } from \"zod\";\nimport type {\n CardActionMap,\n CardActionSpec,\n CardIdOfManifest,\n CardIdOfState,\n EffectMap,\n InputCollector,\n InteractionMap,\n InteractionRule,\n InteractionSpec,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n PhaseSchemasOfContract,\n PhaseZoneList,\n PlayerViewDefinition,\n PlayerIdOfState,\n PlayerZoneIdOfManifest,\n SchemaLike,\n SetupSelectionOfManifest,\n SharedViewDefinition,\n StageMap,\n StaticViewDefinition,\n TableOfManifest,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledSpaceIdOfTable,\n TiledVertexIdOfTable,\n ViewMapOf,\n} from \"../model\";\nimport type { ScopedPhaseState } from \"../model/spec/runtime-args\";\nimport type {\n BoardTargetBuilder,\n BoardTargetRule,\n CardTargetBuilder,\n CardTargetRule,\n ChoiceOptionsFactory,\n ChoiceTargetBuilder,\n ChoiceTargetOption,\n ChoiceTargetRule,\n InputFieldRef,\n PlayerBoardSpaceTarget,\n} from \"../inputs\";\nimport {\n boardInput,\n boardTarget,\n cardInput,\n cardTarget,\n choiceTarget,\n formInput,\n promptInput,\n rngInput,\n} from \"../inputs\";\nimport type {\n AnyReducerGameContract,\n ContractErrorCode,\n ContractManifest,\n ContractState,\n InferPhaseState,\n} from \"./types\";\nimport { defineGame } from \"./game\";\nimport {\n defineCardAction,\n defineInteraction,\n defineInteractionRule,\n} from \"./interaction\";\nimport {\n definePhase,\n defineStepPhase,\n type StepPhaseCardActionMap,\n type StepPhaseInteractionMap,\n type StepPhaseState,\n type UnwrappedStepCardActions,\n type UnwrappedStepInteractions,\n} from \"./phase\";\nimport {\n defineEmptyView,\n definePlayerView,\n defineSharedView,\n defineStaticView,\n} from \"./view-stage\";\n\nexport type ContractWithPhases = AnyReducerGameContract & {\n readonly phases: Record<string, SchemaLike<object>>;\n};\n\ntype BoundState<Contract extends ContractWithPhases> = ContractState<Contract>;\n\ntype BoundManifest<Contract extends ContractWithPhases> =\n ContractManifest<Contract>;\n\ntype BoundTable<Contract extends ContractWithPhases> = TableOfManifest<\n BoundManifest<Contract>\n>;\n\ntype BoundPhaseState<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n> = ScopedPhaseState<BoundState<Contract>, z.infer<PhaseStateSchema>>;\n\ntype BoundFormInputs<Contract extends ContractWithPhases> = ReturnType<\n typeof formInput.forState<BoundState<Contract>>\n>;\n\ntype BoundBoardInputs<Contract extends ContractWithPhases> = {\n vertex<\n Id extends string = TiledVertexIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(options: {\n target: BoardTargetRule<BoundState<Contract>, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-vertex\">;\n edge<\n Id extends string = TiledEdgeIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(options: {\n target: BoardTargetRule<BoundState<Contract>, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-edge\">;\n tile<Id extends string = string>(options: {\n target: BoardTargetRule<BoundState<Contract>, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-tile\">;\n space<\n Id extends string = TiledSpaceIdOfTable<\n BoundTable<Contract>,\n TiledBoardIdOfTable<BoundTable<Contract>>\n >,\n >(options: {\n target: BoardTargetRule<BoundState<Contract>, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, BoundState<Contract>, \"board-space\">;\n playerSpace<\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = PlayerIdOfState<BoundState<Contract>>,\n >(options: {\n target: BoardTargetRule<\n BoundState<Contract>,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<\n z.ZodType<PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>>,\n BoundState<Contract>,\n \"board-space\"\n >;\n};\n\ntype BoundCardInput<Contract extends ContractWithPhases> = <\n Id extends string = CardIdOfManifest<BoundManifest<Contract>>,\n const ZoneIds extends readonly string[] = readonly string[],\n>(options: {\n target: CardTargetRule<BoundState<Contract>, Id, ZoneIds>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}) => InputCollector<z.ZodType<Id>, BoundState<Contract>, \"card\"> & {\n readonly meta: {\n readonly zoneId: ZoneIds[number];\n readonly zoneIds: ZoneIds;\n readonly targetKind: \"card\";\n };\n};\n\ntype BoundPromptInput<Contract extends ContractWithPhases> = <\n Schema extends SchemaLike<unknown>,\n>(options: {\n schema: Schema;\n target?: ChoiceTargetRule<\n BoundState<Contract>,\n Extract<Schema extends z.ZodType<infer Value> ? Value : never, string>\n >;\n}) => InputCollector<Schema, BoundState<Contract>, \"prompt\">;\n\ntype BoundRngInputs<Contract extends ContractWithPhases> = {\n d6(count?: number): ReturnType<typeof rngInput.d6<BoundState<Contract>>>;\n coin(): ReturnType<typeof rngInput.coin<BoundState<Contract>>>;\n};\n\ntype BoundChoiceTarget<Contract extends ContractWithPhases> = {\n options<Id extends string>(\n options:\n | ReadonlyArray<ChoiceTargetOption<Id>>\n | ChoiceOptionsFactory<BoundState<Contract>, Id>,\n ): ChoiceTargetBuilder<BoundState<Contract>, Id>;\n};\n\ntype BoundBoardTarget<Contract extends ContractWithPhases> = {\n edge<Id extends string = string>(\n boardId: string,\n ): BoardTargetBuilder<BoundState<Contract>, Id>;\n vertex<Id extends string = string>(\n boardId: string,\n ): BoardTargetBuilder<BoundState<Contract>, Id>;\n space<Id extends string = string>(\n boardId: string,\n ): BoardTargetBuilder<BoundState<Contract>, Id>;\n tile<Id extends string = string>(\n boardId: string,\n ): BoardTargetBuilder<BoundState<Contract>, Id>;\n playerSpace<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string = PlayerIdOfState<BoundState<Contract>>,\n >(\n boardId: BoardId,\n ): BoardTargetBuilder<\n BoundState<Contract>,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n};\n\ntype BoundCardTarget<Contract extends ContractWithPhases> = {\n zones<\n Id extends string = CardIdOfState<BoundState<Contract>>,\n const ZoneIds extends readonly string[] = readonly string[],\n >(\n zoneIds: ZoneIds,\n ): CardTargetBuilder<BoundState<Contract>, Id, ZoneIds>;\n};\n\nexport type BoundInputBuilders<Contract extends ContractWithPhases> = {\n readonly board: BoundBoardInputs<Contract>;\n readonly boardTarget: BoundBoardTarget<Contract>;\n readonly card: BoundCardInput<Contract>;\n readonly cardTarget: BoundCardTarget<Contract>;\n readonly choiceTarget: BoundChoiceTarget<Contract>;\n readonly form: BoundFormInputs<Contract>;\n readonly prompt: BoundPromptInput<Contract>;\n readonly rng: BoundRngInputs<Contract>;\n};\n\ntype StepPhaseInput<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n Steps extends readonly [string, ...string[]],\n SubmitCollectors extends Record<string, InputCollector>,\n Effects extends EffectMap<BoundState<Contract>, BoundManifest<Contract>>,\n Interactions extends StepPhaseInteractionMap<\n Steps[number],\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n >,\n Stages extends StageMap<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n >,\n Zones extends PhaseZoneList<BoundManifest<Contract>>,\n CardActions extends StepPhaseCardActionMap<\n Steps[number],\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n >,\n> = Omit<\n PhaseDefinition<\n PhaseStateSchema,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>,\n CardActions\n >\n >,\n \"state\" | \"initialState\" | \"interactions\" | \"cardActions\"\n> & {\n steps: Steps;\n state?: never;\n initialState?: (ctx: {\n manifest: BoundManifest<Contract>;\n state: BoundState<Contract>;\n playerIds: PlayerIdOfState<BoundState<Contract>>[];\n setup: SetupSelectionOfManifest<BoundManifest<Contract>> | null;\n }) => InferPhaseState<PhaseStateSchema>;\n interactions?: Interactions;\n cardActions?: CardActions;\n};\n\nexport type PhaseAuthoring<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n> = {\n interaction<Collectors extends Record<string, InputCollector>>(\n spec: InteractionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >;\n cardAction<\n Collectors extends Record<string, InputCollector> = Record<string, never>,\n const PlayFrom extends PlayerZoneIdOfManifest<BoundManifest<Contract>> =\n PlayerZoneIdOfManifest<BoundManifest<Contract>>,\n >(\n spec: CardActionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n PlayFrom,\n ContractErrorCode<Contract>\n >,\n ): CardActionSpec<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n PlayFrom,\n ContractErrorCode<Contract>\n >;\n rule<\n Collectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n >(\n rule: InteractionRule<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >,\n ): InteractionRule<\n Collectors,\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>,\n ContractErrorCode<Contract>\n >;\n define<\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<BoundState<Contract>, BoundManifest<Contract>> =\n Record<string, never>,\n Interactions extends InteractionMap<\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>\n > = Record<string, never>,\n Stages extends StageMap<\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<BoundManifest<Contract>> = readonly [],\n CardActions extends CardActionMap<\n BoundPhaseState<Contract, PhaseStateSchema>,\n BoundManifest<Contract>\n > = Record<string, never>,\n >(\n definition: Omit<\n PhaseDefinition<\n PhaseStateSchema,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >,\n \"state\"\n >,\n ): PhaseDefinition<\n PhaseStateSchema,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >;\n stepPhase<\n const Steps extends readonly [string, ...string[]],\n SubmitCollectors extends Record<string, InputCollector> = Record<\n string,\n InputCollector\n >,\n Effects extends EffectMap<BoundState<Contract>, BoundManifest<Contract>> =\n Record<string, never>,\n Interactions extends StepPhaseInteractionMap<\n Steps[number],\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n > = Record<string, never>,\n Stages extends StageMap<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n > = Record<string, never>,\n const Zones extends PhaseZoneList<BoundManifest<Contract>> = readonly [],\n CardActions extends StepPhaseCardActionMap<\n Steps[number],\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>\n > = Record<string, never>,\n >(\n definition: StepPhaseInput<\n Contract,\n PhaseStateSchema,\n Steps,\n SubmitCollectors,\n Effects,\n Interactions,\n Stages,\n Zones,\n CardActions\n >,\n ): PhaseDefinition<\n SchemaLike<StepPhaseState<PhaseStateSchema, Steps>>,\n BoundState<Contract>,\n BoundManifest<Contract>,\n SubmitCollectors,\n Effects,\n UnwrappedStepInteractions<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>,\n Interactions\n >,\n Stages,\n Zones,\n UnwrappedStepCardActions<\n ScopedPhaseState<\n BoundState<Contract>,\n StepPhaseState<PhaseStateSchema, Steps>\n >,\n BoundManifest<Contract>,\n CardActions\n >\n >;\n readonly inputs: BoundInputBuilders<Contract>;\n};\n\nexport type ContractAuthoring<Contract extends ContractWithPhases> = {\n readonly contract: Contract;\n game<\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n >(\n definition: Omit<\n import(\"../model\").ReducerGameDefinition<Contract, Definitions, Views>,\n \"contract\"\n >,\n ): import(\"../model\").ReducerGameDefinition<Contract, Definitions, Views>;\n sharedView<Projection>(\n definition: SharedViewDefinition<\n BoundState<Contract>,\n BoundManifest<Contract>,\n Projection\n >,\n ): SharedViewDefinition<\n BoundState<Contract>,\n BoundManifest<Contract>,\n Projection\n >;\n playerView<SharedProjection = unknown, Projection = unknown>(\n definition: PlayerViewDefinition<\n BoundState<Contract>,\n BoundManifest<Contract>,\n SharedProjection,\n Projection\n >,\n ): PlayerViewDefinition<\n BoundState<Contract>,\n BoundManifest<Contract>,\n SharedProjection,\n Projection\n >;\n emptyView(): import(\"../model\").EmptyViewDefinition<\n BoundState<Contract>,\n BoundManifest<Contract>\n >;\n staticView<Projection>(\n definition: StaticViewDefinition<\n import(\"../model\").ExactManifestContractOf<Contract>,\n Projection\n >,\n ): StaticViewDefinition<\n import(\"../model\").ExactManifestContractOf<Contract>,\n Projection\n >;\n phase<Name extends PhaseNameOfContract<Contract>>(\n name: Name,\n ): PhaseAuthoring<Contract, PhaseSchemasOfContract<Contract>[Name]>;\n};\n\nfunction createBoundInputBuilders<\n Contract extends ContractWithPhases,\n>(): BoundInputBuilders<Contract> {\n return {\n board: boardInput as BoundBoardInputs<Contract>,\n boardTarget: boardTarget as unknown as BoundBoardTarget<Contract>,\n card: cardInput as BoundCardInput<Contract>,\n cardTarget: cardTarget as BoundCardTarget<Contract>,\n choiceTarget: choiceTarget as BoundChoiceTarget<Contract>,\n form: formInput.forState<BoundState<Contract>>(),\n prompt: promptInput as BoundPromptInput<Contract>,\n rng: rngInput as BoundRngInputs<Contract>,\n };\n}\n\nfunction createPhaseAuthoring<\n Contract extends ContractWithPhases,\n PhaseStateSchema extends SchemaLike<object>,\n>(\n _contract: Contract,\n schema: PhaseStateSchema,\n): PhaseAuthoring<Contract, PhaseStateSchema> {\n return {\n interaction: (spec) =>\n defineInteraction<Contract, PhaseStateSchema>()(\n spec as Parameters<\n ReturnType<typeof defineInteraction<Contract, PhaseStateSchema>>\n >[0],\n ) as typeof spec,\n cardAction: (spec) =>\n defineCardAction<Contract, PhaseStateSchema>()(\n spec as unknown as Parameters<\n ReturnType<typeof defineCardAction<Contract, PhaseStateSchema>>\n >[0],\n ) as unknown as typeof spec,\n rule: (rule) =>\n defineInteractionRule<Contract, PhaseStateSchema>()(\n rule as Parameters<\n ReturnType<typeof defineInteractionRule<Contract, PhaseStateSchema>>\n >[0],\n ) as typeof rule,\n define: (definition) =>\n definePhase<Contract>()({\n ...definition,\n state: schema,\n } as Parameters<ReturnType<typeof definePhase<Contract>>>[0]) as never,\n stepPhase: (definition) =>\n defineStepPhase<Contract>()({\n ...definition,\n state: schema,\n } as Parameters<\n ReturnType<typeof defineStepPhase<Contract>>\n >[0]) as never,\n inputs: createBoundInputBuilders<Contract>(),\n };\n}\n\nexport function createContractAuthoring<\n const Contract extends ContractWithPhases,\n>(contract: Contract): ContractAuthoring<Contract> {\n const phaseCache = new Map<string, unknown>();\n return {\n contract,\n game: (definition) => defineGame({ contract, ...definition }),\n sharedView: (definition) => defineSharedView<Contract>()(definition),\n playerView: (definition) => definePlayerView<Contract>()(definition),\n emptyView: () => defineEmptyView<Contract>(),\n staticView: (definition) => defineStaticView<Contract>()(definition),\n phase: (name) => {\n const cached = phaseCache.get(name);\n if (cached) return cached as never;\n const schema = contract.phases[name];\n const bound = createPhaseAuthoring(contract, schema);\n phaseCache.set(name, bound);\n return bound as never;\n },\n };\n}\n","import { z } from \"zod\";\nimport type {\n AnySchema,\n EffectRollDieDefinition,\n EffectShuffleDefinition,\n EffectShufflePlayerZoneDefinition,\n} from \"../model\";\nimport type {\n ContinuationCallable,\n ResumableEffectKind,\n} from \"../model/spec/runtime-args\";\nimport type {\n AnyReducerGameContract,\n ContractManifest,\n ContractState,\n} from \"./types\";\n\nfunction createContinuationCallable<\n DataSchema extends AnySchema,\n ResponseSchema extends AnySchema,\n State extends {\n table: import(\"../model\").RuntimeTableRecord;\n flow: { currentPhase: string };\n },\n Manifest extends import(\"../model\").ManifestContract<\n import(\"../model\").TableOfState<State>\n >,\n EffectType extends ResumableEffectKind = ResumableEffectKind,\n>(definition: {\n id: string;\n data: DataSchema;\n response: ResponseSchema;\n effectKind?: EffectType;\n reduce: ContinuationCallable<\n DataSchema,\n State,\n Manifest,\n string,\n EffectType\n >[\"reduce\"];\n}): ContinuationCallable<DataSchema, State, Manifest, string, EffectType> {\n const continuation = ((data: z.infer<DataSchema>) => {\n return {\n id: continuation.id,\n data,\n };\n }) as ContinuationCallable<DataSchema, State, Manifest, string, EffectType>;\n continuation.id = definition.id;\n continuation.source = \"effect\";\n continuation.dataSchema = definition.data;\n continuation.responseSchema = definition.response;\n continuation.reduce = definition.reduce;\n if (definition.effectKind !== undefined) {\n continuation.effectKind = definition.effectKind;\n }\n return continuation;\n}\n\n// --- `defineEffect` ---\n//\n// Authoring factory for engine-side resumable effects (cues). An effect\n// is the registered bundle of continuation callable + optional reduce,\n// discriminated by `type` which aligns directly with `ResumableEffectKind`:\n//\n// defineEffect<GameContract>()({ type: \"rollDie\", id, context?, reduce? })\n// defineEffect<GameContract>()({ type: \"shuffleSharedZone\", id, context?, reduce? })\n//\n// Authored effects are registered under `phase.effects` and invoked from\n// a reducer via `fx.effect(effect, options)`. The wire protocol already\n// isolates the continuation payload into the ingress bundle's\n// `continuations` map keyed by `effectId`, so `fx.effect` never attaches\n// `resume: undefined` to the wire effect.\n//\n// Addressed player requests are *not* effects. Author them as\n// prompt-kind interactions via `defineInteraction({ kind: \"prompt\",\n// to, options, ... })`.\n\ntype EffectRollDieInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"rollDie\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"rollDie\"\n >[\"reduce\"];\n};\n\ntype EffectShuffleInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shuffleSharedZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shuffleSharedZone\"\n >[\"reduce\"];\n};\n\ntype EffectShufflePlayerZoneInput<\n Contract extends AnyReducerGameContract,\n Id extends string,\n ContextSchema extends AnySchema,\n> = {\n type: \"shufflePlayerZone\";\n id: Id;\n context?: ContextSchema;\n reduce?: ContinuationCallable<\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n Id,\n \"shufflePlayerZone\"\n >[\"reduce\"];\n};\n\nexport function defineEffect<Contract extends AnyReducerGameContract>() {\n type EffectInput =\n | EffectRollDieInput<Contract, string, AnySchema>\n | EffectShuffleInput<Contract, string, AnySchema>\n | EffectShufflePlayerZoneInput<Contract, string, AnySchema>;\n type EffectOutput =\n | EffectRollDieDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShuffleDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >\n | EffectShufflePlayerZoneDefinition<\n string,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectRollDieInput<Contract, Id, ContextSchema>,\n ): EffectRollDieDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShuffleInput<Contract, Id, ContextSchema>,\n ): EffectShuffleDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect<\n Id extends string,\n ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,\n >(\n definition: EffectShufflePlayerZoneInput<Contract, Id, ContextSchema>,\n ): EffectShufflePlayerZoneDefinition<\n Id,\n ContextSchema,\n ContractState<Contract>,\n ContractManifest<Contract>\n >;\n function effect(definition: EffectInput): EffectOutput {\n if (\n definition.type === \"rollDie\" ||\n definition.type === \"shuffleSharedZone\" ||\n definition.type === \"shufflePlayerZone\"\n ) {\n const effectKind: ResumableEffectKind = definition.type;\n if (!definition.reduce) {\n return {\n type: definition.type,\n id: definition.id,\n contextSchema: definition.context,\n } as EffectOutput;\n }\n const contextSchema = (definition.context ?? z.object({})) as AnySchema;\n const continuation = createContinuationCallable<\n AnySchema,\n AnySchema,\n ContractState<Contract>,\n ContractManifest<Contract>,\n ResumableEffectKind\n >({\n id: definition.id,\n data: contextSchema,\n response: z.unknown() as AnySchema,\n effectKind,\n reduce: definition.reduce,\n });\n return {\n type: definition.type,\n id: definition.id,\n contextSchema,\n __continuation: continuation,\n } as EffectOutput;\n }\n throw new Error(\n `defineEffect: unknown effect definition. Expected type 'rollDie' | 'shuffleSharedZone' | 'shufflePlayerZone'. Addressed prompts are authored as prompt-kind interactions via defineInteraction({ kind: \"prompt\" }).`,\n );\n }\n return effect;\n}\n","import type { SystemActionEvent } from \"./model\";\n\nexport const gameEvent = {\n systemAction(event: Omit<SystemActionEvent, \"kind\">): SystemActionEvent {\n return {\n kind: \"systemAction\",\n ...event,\n };\n },\n};\n","import type { DispatchTraceEntry } from \"./core/types\";\n\nexport type DispatchTraceSummaryEntry =\n | { kind: \"acceptedClientInput\"; interactionId: string; playerId: string }\n | { kind: \"appliedInstruction\"; instruction: string }\n | { kind: \"rngConsumption\"; operation: string; traceEntry: string };\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 \"appliedInstruction\":\n return {\n kind: \"appliedInstruction\" as const,\n instruction: entry.instruction.kind,\n };\n case \"rngConsumption\":\n return {\n kind: \"rngConsumption\" as const,\n operation: entry.operation,\n traceEntry: entry.traceEntry,\n };\n default: {\n const _exhaustive: never = entry;\n return _exhaustive;\n }\n }\n });\n}\n","import type {\n DispatchTraceEntry,\n TrustedReducerDispatchResult,\n TrustedRuntimeInput,\n} from \"../core/types\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\nimport type { GameEvent, GameOutcome } from \"../model/runtime\";\n\nexport function createRuntimeInstructionEngine<\n State,\n PlayerId extends string,\n Input extends TrustedRuntimeInput<PlayerId>,\n>({\n reduce,\n resolveInstruction,\n afterInput,\n prepareInstructionState,\n}: {\n reduce: (\n state: State,\n input: Input,\n ) =>\n | { type: \"reject\"; errorCode: string; message?: string }\n | {\n type: \"accept\";\n state: State;\n instructions?: readonly RuntimeInstructionForState<State>[];\n terminal?: GameOutcome<PlayerId>;\n events?: readonly GameEvent[];\n };\n resolveInstruction: (\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ) => {\n state: State;\n queuedInputs: Input[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n afterInput?: (\n state: State,\n input: Input,\n ) => {\n state: State;\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n prepareInstructionState?: (state: State) => State;\n}) {\n const prepareForInstructionDrain = (state: State): State =>\n prepareInstructionState ? prepareInstructionState(state) : state;\n\n function drainInstructions(\n state: State,\n instructionsToDrain: RuntimeInstructionForState<State>[],\n ): State {\n let workingState = state;\n const instructionQueue = [...instructionsToDrain];\n const systemQueue: Input[] = [];\n\n while (instructionQueue.length > 0 || systemQueue.length > 0) {\n if (instructionQueue.length > 0) {\n workingState = prepareForInstructionDrain(workingState);\n }\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n systemQueue.push(...resolved.queuedInputs);\n }\n\n while (systemQueue.length > 0) {\n const input = systemQueue.shift();\n if (input === undefined) break;\n const result = reduce(workingState, input);\n if (result.type === \"reject\") {\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${input.kind}'.`,\n );\n }\n workingState = result.state;\n instructionQueue.push(...(result.instructions ?? []));\n }\n }\n\n return workingState;\n }\n\n function dispatch(\n state: State,\n input: Input,\n ): TrustedReducerDispatchResult<State, PlayerId> {\n let workingState = state;\n const pendingInputs: Input[] = [input];\n let terminal: GameOutcome<PlayerId> | undefined;\n const events: GameEvent[] = [];\n const trace: DispatchTraceEntry<State, PlayerId, Input>[] = [\n {\n type: \"acceptedClientInput\",\n input,\n },\n ];\n\n while (pendingInputs.length > 0) {\n const pendingInput = pendingInputs.shift();\n if (pendingInput === undefined) break;\n const result = reduce(workingState, pendingInput);\n if (result.type === \"reject\") {\n if (pendingInput === input) {\n return result;\n }\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${pendingInput.kind}'.`,\n );\n }\n\n workingState = result.state;\n terminal ??= result.terminal;\n events.push(...(result.events ?? []));\n\n if (afterInput) {\n const afterInputResult = afterInput(workingState, pendingInput);\n workingState = afterInputResult.state;\n trace.push(...afterInputResult.trace);\n }\n\n const instructionQueue = [...(result.instructions ?? [])];\n const continuationQueue: Input[] = [];\n while (instructionQueue.length > 0 || continuationQueue.length > 0) {\n if (instructionQueue.length > 0) {\n workingState = prepareForInstructionDrain(workingState);\n }\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n trace.push({\n type: \"appliedInstruction\",\n instruction,\n });\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n trace.push(...resolved.trace);\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n continuationQueue.push(...resolved.queuedInputs);\n }\n\n while (continuationQueue.length > 0) {\n const queued = continuationQueue.shift();\n if (queued === undefined) break;\n pendingInputs.push(queued);\n }\n }\n }\n\n return {\n type: \"accept\",\n state: workingState,\n trace,\n ...(terminal ? { terminal } : {}),\n events,\n };\n }\n\n return {\n dispatch,\n drainInstructions,\n };\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 traceEntry: string;\n};\n\nexport type MutableRandomHelpers = {\n random: RandomHelpers;\n currentRng: () => RuntimeRngState;\n};\n\nexport function sampleDieValue(\n sides: number,\n rng: RuntimeRngState,\n): {\n value: number;\n nextRng: RuntimeRngState;\n consumption: RngConsumption;\n} {\n const [offset, nextRng] = nextRandomInt(sides, rng);\n return {\n value: offset + 1,\n nextRng,\n consumption: {\n operation: \"rollDie\",\n traceEntry: nextRng.trace[nextRng.trace.length - 1] ?? \"\",\n },\n };\n}\n\nexport function shuffleWithRng<T>(\n values: readonly T[],\n rng: RuntimeRngState,\n operation:\n | \"shuffleSharedZone\"\n | \"shufflePlayerZone\"\n | \"randomSubset\" = \"shuffleSharedZone\",\n): {\n orderedValues: T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n const orderedValues = [...values];\n let nextRng = rng;\n const consumptions: RngConsumption[] = [];\n for (\n let lastIndex = orderedValues.length - 1;\n lastIndex > 0;\n lastIndex -= 1\n ) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n consumptions.push({\n operation,\n traceEntry: updatedRng.trace[updatedRng.trace.length - 1] ?? \"\",\n });\n nextRng = updatedRng;\n const current = orderedValues[lastIndex];\n const swap = orderedValues[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `shuffleWithRng: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${orderedValues.length})`,\n );\n }\n orderedValues[lastIndex] = swap;\n orderedValues[swapIndex] = current;\n }\n return { orderedValues, nextRng, consumptions };\n}\n\nexport function subsetWithRng<T>(\n values: readonly T[],\n count: number,\n rng: RuntimeRngState,\n): {\n values: readonly T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n if (!Number.isInteger(count) || count < 0) {\n throw new Error(\"random.subset count must be a non-negative integer.\");\n }\n if (count > values.length) {\n throw new Error(\n `random.subset count ${count} exceeds source length ${values.length}.`,\n );\n }\n const shuffled = shuffleWithRng(values, rng, \"randomSubset\");\n return {\n values: shuffled.orderedValues.slice(0, count),\n nextRng: shuffled.nextRng,\n consumptions: shuffled.consumptions,\n };\n}\n\nexport function createMutableRandomHelpers(\n rng: RuntimeRngState,\n): MutableRandomHelpers {\n let current = rng;\n return {\n random: {\n subset(options) {\n const sampled = subsetWithRng(options.from, options.count, current);\n current = sampled.nextRng;\n return sampled.values;\n },\n },\n currentRng: () => current,\n };\n}\n\nexport function sampleRngCollectorValue(\n collector: InputCollector<SchemaLike<unknown>, CollectorState, \"rng\">,\n rng: RuntimeRngState,\n): { value: unknown; nextRng: RuntimeRngState } {\n const meta = collector.meta;\n switch (meta.rng) {\n case \"d6\": {\n const count = meta.count > 0 ? meta.count : 1;\n const values: number[] = [];\n let nextRng = rng;\n for (let i = 0; i < count; i += 1) {\n const sampled = sampleDieValue(6, nextRng);\n values.push(sampled.value);\n nextRng = sampled.nextRng;\n }\n return { value: { values }, nextRng };\n }\n case \"coin\": {\n const [offset, nextRng] = nextRandomInt(2, rng);\n return {\n value: { value: offset === 0 ? \"heads\" : \"tails\" },\n nextRng,\n };\n }\n default: {\n const _exhaustive: never = meta;\n throw new Error(\n `Unknown rngInput kind '${String(_exhaustive)}'. Register a sampler in trusted rng-sampler.`,\n );\n }\n }\n}\n","import type { DispatchTraceEntry, TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { ReducerGameContractLike } from \"../../model\";\nimport {\n cloneRuntimeTable,\n ensureArray,\n shufflePlayerZoneCards,\n} from \"../../table\";\nimport {\n sampleDieValue,\n shuffleWithRng,\n type RngConsumption,\n} from \"./rng-sampler\";\nimport type {\n TrustedInput,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype EngineInstructionResult<\n State,\n PlayerId extends string,\n ReducerInput extends TrustedRuntimeInput<PlayerId>,\n> = {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n};\n\nfunction toRngTrace<\n State,\n PlayerId extends string,\n ReducerInput extends TrustedRuntimeInput<PlayerId>,\n>(\n consumptions: readonly RngConsumption[],\n): DispatchTraceEntry<State, PlayerId, ReducerInput>[] {\n return consumptions.map((consumption) => ({\n type: \"rngConsumption\" as const,\n operation: consumption.operation,\n traceEntry: consumption.traceEntry,\n }));\n}\n\nexport function createEngineInstructionResolver<\n Contract extends ReducerGameContractLike,\n>() {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveRollDieDraft(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.rollDie\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const die = state.table.dice[instruction.dieId];\n if (!die) {\n throw new Error(`Cannot roll unknown die '${instruction.dieId}'.`);\n }\n if (!Number.isInteger(die.sides) || die.sides <= 0) {\n throw new Error(\n `Cannot roll die '${instruction.dieId}' with invalid sides '${die.sides}'.`,\n );\n }\n const sampled = sampleDieValue(die.sides, state.runtime.rng);\n state.table.dice[instruction.dieId] = {\n ...die,\n value: sampled.value,\n };\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"rollDie\",\n response: {\n dieId: instruction.dieId,\n value: sampled.value,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n runtime: {\n ...state.runtime,\n rng: sampled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>([sampled.consumption]),\n };\n }\n\n function resolveRollDie(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.rollDie\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const nextTable = cloneRuntimeTable(state.table);\n return resolveRollDieDraft(\n {\n ...state,\n table: nextTable,\n },\n instruction,\n );\n }\n\n function resolveShuffleSharedZoneDraft(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shuffleSharedZone\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const deckCards = [...ensureArray(state.table.decks[instruction.zoneId])];\n const shuffled = shuffleWithRng(deckCards, state.runtime.rng);\n const orderedCardIds = [...shuffled.orderedValues];\n state.table.decks[instruction.zoneId] = shuffled.orderedValues;\n state.table.zones.shared[instruction.zoneId] = [...shuffled.orderedValues];\n for (const [index, cardId] of shuffled.orderedValues.entries()) {\n const currentLocation = state.table.componentLocations[cardId];\n state.table.componentLocations[cardId] =\n currentLocation?.type === \"InDeck\" || currentLocation?.type === \"InZone\"\n ? {\n ...currentLocation,\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: currentLocation.playedBy ?? null,\n position: index,\n }\n : {\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: null,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shuffleSharedZone\",\n response: {\n zoneId: instruction.zoneId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n function resolveShuffleSharedZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shuffleSharedZone\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const nextTable = cloneRuntimeTable(state.table);\n return resolveShuffleSharedZoneDraft(\n {\n ...state,\n table: nextTable,\n },\n instruction,\n );\n }\n\n function resolveShufflePlayerZoneDraft(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shufflePlayerZone\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const zoneCards = shufflePlayerZoneCards(\n state.table,\n instruction.zoneId,\n instruction.playerId,\n );\n const shuffled = shuffleWithRng(\n zoneCards,\n state.runtime.rng,\n \"shufflePlayerZone\",\n );\n const orderedCardIds = [...shuffled.orderedValues];\n shufflePlayerZoneCards(\n state.table,\n instruction.zoneId,\n instruction.playerId,\n orderedCardIds,\n );\n for (const [index, cardId] of orderedCardIds.entries()) {\n const currentLocation = state.table.componentLocations[cardId];\n state.table.componentLocations[cardId] =\n currentLocation?.type === \"InHand\"\n ? {\n ...currentLocation,\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n }\n : {\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shufflePlayerZone\",\n response: {\n zoneId: instruction.zoneId,\n playerId: instruction.playerId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n function resolveShufflePlayerZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shufflePlayerZone\" }\n >,\n ): EngineInstructionResult<State, PlayerId, ReducerInput> {\n const nextTable = cloneRuntimeTable(state.table);\n return resolveShufflePlayerZoneDraft(\n {\n ...state,\n table: nextTable,\n },\n instruction,\n );\n }\n\n return {\n resolveRollDie,\n resolveRollDieDraft,\n resolveShuffleSharedZone,\n resolveShuffleSharedZoneDraft,\n resolveShufflePlayerZone,\n resolveShufflePlayerZoneDraft,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport type {\n TrustedInput,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createFlowInstructionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>) {\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveTransition(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"flow.transition\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const initialized = lifecycle.initializePhaseResult(\n {\n ...state,\n flow: {\n ...state.flow,\n currentPhase:\n instruction.to as unknown as State[\"flow\"][\"currentPhase\"],\n },\n runtime: {\n ...state.runtime,\n lastTransition: {\n from: state.flow.currentPhase,\n to: instruction.to,\n },\n } as State[\"runtime\"],\n },\n instruction.to as PhaseName,\n );\n return {\n state: initialized.state,\n queuedInputs: [],\n queuedInstructions: initialized.instructions,\n trace: [],\n };\n }\n\n return {\n resolveTransition,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\nexport const SIMULTANEOUS_SUBMIT_INTERACTION_ID = \"submit\";\n\ntype ErasedPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n TrustedRuntimeScope<Contract, Definitions, Views>[\"phaseByName\"]\n>;\n\nexport function isSimultaneousPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(phase: ErasedPhase<Contract, Definitions, Views>): boolean {\n return phase.kind === \"simultaneousPlayer\";\n}\n\nexport function simultaneousSubmitInteraction<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n phase: ErasedPhase<Contract, Definitions, Views>,\n):\n | AnyInteractionSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>\n | undefined {\n return (phase as { submit?: unknown }).submit as\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n}\n\nfunction resolvePromptToArray<PlayerId extends string>(\n value: unknown,\n): PlayerId[] {\n if (value === undefined || value === null) return [];\n if (Array.isArray(value)) return value as PlayerId[];\n if (typeof value === \"string\") return [value as PlayerId];\n return [];\n}\n\nexport function resolveSimultaneousActors<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n state: TrustedState<Contract>,\n phase: ErasedPhase<Contract, Definitions, Views>,\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >,\n): TrustedPlayerId<Contract>[] {\n type PlayerId = TrustedPlayerId<Contract>;\n const selector =\n (phase as { actors?: unknown; actor?: unknown }).actors ??\n (phase as { actor?: unknown }).actor;\n if (typeof selector === \"function\") {\n const selected = selector(\n scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n );\n const resolved = resolvePromptToArray<PlayerId>(selected);\n if (resolved.length > 0) {\n return resolved;\n }\n }\n const active = state.flow.activePlayers as PlayerId[];\n if (active.length > 0) {\n return [...active];\n }\n return [...(state.table.playerOrder as PlayerId[])];\n}\n","/**\n * Curried state writers for use with `pipe`.\n *\n * Each entry in the returned `ops` namespace is a curried transformation\n * `(args) => (state) => state` that can be composed with `pipe`:\n *\n * const ops = createReducerOps<GameState>();\n *\n * return accept(\n * pipe(state,\n * ops.setActivePlayers([playerId]),\n * ops.moveCardFromPlayerZoneToSharedZone({\n * playerId,\n * fromZoneId: \"things-hand\",\n * toZoneId: \"ring-1\",\n * cardId: \"a-dog\",\n * }),\n * ),\n * );\n *\n * The factory binds all ops to a specific `State` type so that ID arguments\n * (deck ids, card ids, etc.) are checked against the manifest-derived table\n * shape of the game.\n */\nimport type { Op } from \"./compose\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n CardIdOfTable,\n CompatibleHandIdForDeck,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HiddenStateOfState,\n PhaseStateOfState,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n PrivateStateOfState,\n PublicStateOfState,\n ResourceAmountsOfTable,\n ResourceIdOfTable,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"./model\";\nimport {\n asPlayerId,\n perPlayerGet,\n perPlayerSet,\n type PerPlayer,\n} from \"./per-player\";\nimport {\n addCardToSharedZone as tableAddCardToSharedZone,\n addCardToSharedZoneInPlace as tableAddCardToSharedZoneInPlace,\n addPlayerResources as tableAddPlayerResources,\n addPlayerResourcesInPlace as tableAddPlayerResourcesInPlace,\n cloneRuntimeTable,\n dealCardsFromDeckToHand as tableDealCardsFromDeckToHand,\n dealCardsFromDeckToHandInPlace as tableDealCardsFromDeckToHandInPlace,\n dealCardsBetweenPlayerZones as tableDealCardsBetweenPlayerZones,\n dealCardsBetweenPlayerZonesInPlace as tableDealCardsBetweenPlayerZonesInPlace,\n moveCardBetweenPlayerZones as tableMoveCardBetweenPlayerZones,\n moveCardBetweenPlayerZonesInPlace as tableMoveCardBetweenPlayerZonesInPlace,\n moveCardBetweenSharedZones as tableMoveCardBetweenSharedZones,\n moveCardBetweenSharedZonesInPlace as tableMoveCardBetweenSharedZonesInPlace,\n moveCardFromPlayerZoneToSharedZone as tableMoveCardFromPlayerZoneToSharedZone,\n moveCardFromPlayerZoneToSharedZoneInPlace as tableMoveCardFromPlayerZoneToSharedZoneInPlace,\n moveCardFromSharedZoneToPlayerZone as tableMoveCardFromSharedZoneToPlayerZone,\n moveCardFromSharedZoneToPlayerZoneInPlace as tableMoveCardFromSharedZoneToPlayerZoneInPlace,\n moveComponentToContainer as tableMoveComponentToContainer,\n moveComponentToContainerInPlace as tableMoveComponentToContainerInPlace,\n moveComponentToDetached as tableMoveComponentToDetached,\n moveComponentToDetachedInPlace as tableMoveComponentToDetachedInPlace,\n moveComponentToEdge as tableMoveComponentToEdge,\n moveComponentToEdgeInPlace as tableMoveComponentToEdgeInPlace,\n moveComponentToSpace as tableMoveComponentToSpace,\n moveComponentToSpaceInPlace as tableMoveComponentToSpaceInPlace,\n moveComponentToVertex as tableMoveComponentToVertex,\n moveComponentToVertexInPlace as tableMoveComponentToVertexInPlace,\n removeCardFromSharedZone as tableRemoveCardFromSharedZone,\n removeCardFromSharedZoneInPlace as tableRemoveCardFromSharedZoneInPlace,\n setActivePlayers as stateSetActivePlayers,\n setPhaseState as stateSetPhaseState,\n setPlayerResource as tableSetPlayerResource,\n setPlayerResourceInPlace as tableSetPlayerResourceInPlace,\n spendPlayerResources as tableSpendPlayerResources,\n spendPlayerResourcesInPlace as tableSpendPlayerResourcesInPlace,\n transferPlayerResources as tableTransferPlayerResources,\n transferPlayerResourcesInPlace as tableTransferPlayerResourcesInPlace,\n} from \"./table\";\n\n/**\n * Minimum shape required for any state targeted by reducer ops.\n *\n * All curried writers operate on a game state with a `table` field.\n */\nexport type ReducerStateBase = {\n table: RuntimeTableRecord;\n};\n\ntype PipeTable<State extends ReducerStateBase> = TableOfState<State>;\n\n/**\n * A shallow patch for a slice of state. Either a partial object to merge\n * over the previous value, or a functional updater `(prev) => next`.\n */\nexport type StatePatch<T> = Partial<T> | ((prev: T) => T);\n\n/**\n * Curried writer namespace for a specific game state type.\n *\n * Created via {@link createReducerOps}.\n */\nexport interface ReducerOps<State extends ReducerStateBase> {\n // --- Flow ------------------------------------------------------------\n\n /** Set the list of players whose turn is currently active. */\n setActivePlayers(\n activePlayers: ReadonlyArray<PlayerIdOfState<State>>,\n ): Op<State>;\n\n /**\n * Advance `flow.activePlayers` to the single next seat in `playerOrder`.\n *\n * Uses `state.flow.activePlayers[0]` as the current seat (or the first\n * seat in `playerOrder` when `activePlayers` is empty) and sets\n * `activePlayers` to `[q.player.nextInOrder(current)]`. No-op when the\n * player order is empty.\n */\n advanceActivePlayer(): Op<State>;\n\n // --- Author-owned state slices --------------------------------------\n\n /**\n * Update the current phase's local state.\n *\n * Accepts either a `Partial<PhaseState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PhaseState`.\n */\n patchPhaseState(patch: StatePatch<PhaseStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.publicState`.\n *\n * Accepts either a `Partial<PublicState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PublicState`.\n */\n patchPublicState(patch: StatePatch<PublicStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.hiddenState`.\n *\n * Accepts either a `Partial<HiddenState>` or a functional updater.\n */\n patchHiddenState(patch: StatePatch<HiddenStateOfState<State>>): Op<State>;\n\n /**\n * Update a single player's entry in `state.privateState`.\n *\n * Accepts either a `Partial<PrivateState>` or a functional updater.\n */\n patchPlayerPrivateState(args: {\n playerId: PlayerIdOfState<State>;\n patch: StatePatch<PrivateStateOfState<State>>;\n }): Op<State>;\n\n // --- Shared zones / decks -------------------------------------------\n\n /**\n * Append a card to a shared zone (deck). Defaults to placing the card at the\n * bottom; pass `position: \"top\"` for top-of-deck placement (e.g. Bureaucrat-style).\n */\n addCardToSharedZone<\n DeckId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /** Remove a card from a shared zone (deck). */\n removeCardFromSharedZone<\n DeckId extends DeckIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n }): Op<State>;\n\n /**\n * Move a card between two shared zones (decks). Defaults to placing the card\n * at the bottom of the destination; pass `position: \"top\"` for top placement.\n */\n moveCardBetweenSharedZones<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<PipeTable<State>, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Draw the top `count` cards from one perPlayer zone into another for the\n * same player (e.g. deck → hand at the start of a turn). Companion to\n * {@link dealCardsToPlayerZone} for the perPlayer → perPlayer case. Stops\n * silently if the source runs out before `count` is reached.\n */\n dealCardsBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Move a card between two perPlayer zones owned by the same player (e.g.\n * hand → in-play → discard). Owner is preserved; visibility is recomputed\n * from the destination zone.\n */\n moveCardBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a card from a player zone (hand) to a shared zone (deck). Defaults to\n * placing the card at the bottom; pass `position: \"top\"` to topdeck.\n */\n moveCardFromPlayerZoneToSharedZone<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer\n * zone (e.g. discard). The \"gain\" verb in deck-builders. Distinct from\n * {@link dealCardsToPlayerZone}, which draws unspecified top-N cards from a\n * deck. Owner flips to the receiving player; visibility is recomputed.\n */\n moveCardFromSharedZoneToPlayerZone<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n ToZoneId,\n FromZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Deal the top `count` cards from a shared deck into a player's hand zone.\n *\n * This op does not consume RNG. If the deck needs to be random, shuffle it\n * first with `fx.shuffleSharedZone(...)`, then deal from the shuffled deck\n * inside the same reducer via this op.\n */\n dealCardsToPlayerZone<\n FromZoneId extends DeckIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n ToZoneId extends CompatibleHandIdForDeck<PipeTable<State>, FromZoneId> &\n HandIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n playerId: PlayerId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Atomically rotate cards in a per-player zone around the table.\n *\n * Defaults to rotating every card currently in `zoneId` for every player in\n * turn order. Pass `players` to use a smaller explicit order, or\n * `cardIdsByPlayer` to rotate only selected cards such as Hearts passes.\n */\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<PipeTable<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n // --- Board / component movement -------------------------------------\n\n /** Move a component onto a board space. */\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n SpaceId extends SpaceIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): Op<State>;\n\n /** Move a component into a board container. */\n moveComponentToContainer<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n ContainerId extends BoardContainerIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n containerId: ContainerId;\n }): Op<State>;\n\n /** Move a component onto a tiled board edge. */\n moveComponentToEdge<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n EdgeId extends TiledEdgeIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n edgeId: EdgeId;\n }): Op<State>;\n\n /** Move a component onto a tiled board vertex. */\n moveComponentToVertex<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n VertexId extends TiledVertexIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n vertexId: VertexId;\n }): Op<State>;\n\n /** Move a component back to the detached pool. */\n moveComponentToDetached<\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n }): Op<State>;\n\n // --- Resources ------------------------------------------------------\n\n /**\n * Credit the specified resources to a player.\n *\n * Amounts must be non-negative; use {@link spendResources} for deductions\n * so that affordability is checked explicitly.\n *\n * pipe(\n * state,\n * ops.addResources({ playerId, amounts: { wood: 1, brick: 1 } }),\n * )\n */\n addResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Debit the specified resources from a player.\n *\n * Throws when the player cannot afford the full cost — gate with\n * `q.player.canAfford(...)` in your `validate` step before invoking.\n *\n * pipe(\n * state,\n * ops.spendResources({ playerId, amounts: COST_DEV_CARD }),\n * ops.dealCardsToPlayerZone({ ... }),\n * )\n */\n spendResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Transfer the specified resources from one player to another.\n *\n * Throws when the source cannot afford the full amount. On success the\n * destination gains exactly what the source loses.\n */\n transferResources(args: {\n fromPlayerId: PlayerIdOfTable<PipeTable<State>>;\n toPlayerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Overwrite a single resource balance for a player. Prefer\n * {@link addResources} / {@link spendResources} — use this only when the\n * new balance is an absolute (e.g. scripted setup).\n */\n setResource(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n resourceId: ResourceIdOfTable<PipeTable<State>>;\n amount: number;\n }): Op<State>;\n}\n\nexport type ReducerOpsInternal<State extends ReducerStateBase> = {\n [Key in keyof ReducerOps<State>]: ReducerOps<State>[Key] extends (\n ...args: infer Args\n ) => Op<State>\n ? (state: State, ...args: Args) => State\n : never;\n};\n\nconst reducerOpsInternal = Symbol(\"dreamboard.reducerOpsInternal\");\n\ntype ReducerOpsWithInternal<State extends ReducerStateBase> =\n ReducerOps<State> & {\n [reducerOpsInternal]?: ReducerOpsInternal<State>;\n };\n\nexport function getReducerOpsInternal<State extends ReducerStateBase>(\n ops: ReducerOps<State>,\n): ReducerOpsInternal<State> {\n const attached = (ops as ReducerOpsWithInternal<State>)[reducerOpsInternal];\n if (attached) {\n return attached;\n }\n\n return Object.fromEntries(\n Object.keys(ops).map((key) => [\n key,\n (state: State, ...args: readonly unknown[]) =>\n (\n ops[key as keyof ReducerOps<State>] as unknown as (\n ...args: readonly unknown[]\n ) => Op<State>\n )(...args)(state),\n ]),\n ) as ReducerOpsInternal<State>;\n}\n\n// --- Internal helpers -----------------------------------------------\n\ntype AnyTable = RuntimeTableRecord;\ntype AnyState = { table: AnyTable };\n\nfunction updateTable<S extends AnyState>(state: S, nextTable: AnyTable): S {\n return { ...state, table: nextTable };\n}\n\nfunction computePlayerZoneVisibility(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction readPlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): readonly string[] {\n const zone = table.zones.perPlayer[zoneId] ?? table.hands[zoneId];\n if (!zone) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n return (\n perPlayerGet(zone as PerPlayer<readonly string[]>, asPlayerId(playerId)) ??\n []\n );\n}\n\nfunction writePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n cards: readonly string[],\n): void {\n const currentZone = table.zones.perPlayer[zoneId];\n const currentHand = table.hands[zoneId];\n const player = asPlayerId(playerId);\n if (currentZone) {\n table.zones.perPlayer[zoneId] = perPlayerSet(\n currentZone as PerPlayer<string[]>,\n player,\n [...cards],\n );\n }\n if (currentHand) {\n table.hands[zoneId] = perPlayerSet(\n currentHand as PerPlayer<string[]>,\n player,\n [...cards],\n );\n }\n}\n\nfunction assertCardAllowedInPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n cardId: string,\n): void {\n const allowedCardSetIds = table.zones.cardSetIdsByZoneId?.[zoneId];\n if (!allowedCardSetIds || allowedCardSetIds.length === 0) {\n return;\n }\n const card = table.cards[cardId];\n if (!card) {\n throw new Error(`Card '${cardId}' does not exist.`);\n }\n if (!allowedCardSetIds.includes(card.cardSetId)) {\n throw new Error(\n `Card '${cardId}' from set '${card.cardSetId}' is not allowed in player zone '${zoneId}'.`,\n );\n }\n}\n\nfunction rotatePlayerZoneTable(options: {\n table: RuntimeTableRecord;\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n}): RuntimeTableRecord {\n const nextTable = cloneRuntimeTable(options.table);\n rotatePlayerZoneTableInPlace({\n ...options,\n table: nextTable,\n });\n return nextTable;\n}\n\nfunction rotatePlayerZoneTableInPlace(options: {\n table: RuntimeTableRecord;\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n}): void {\n const nextTable = options.table;\n const zoneId = options.zoneId;\n if (!nextTable.zones.perPlayer[zoneId] && !nextTable.hands[zoneId]) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n const players = [...(options.players ?? nextTable.playerOrder)];\n if (players.length === 0) {\n return;\n }\n const playerSet = new Set(nextTable.playerOrder);\n for (const playerId of players) {\n if (!playerSet.has(playerId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': player '${playerId}' is not in player order.`,\n );\n }\n }\n\n const selectedByPlayer = new Map<string, readonly string[]>();\n for (const playerId of players) {\n const sourceCards = readPlayerZoneCards(nextTable, zoneId, playerId);\n const selected = options.cardIdsByPlayer?.[playerId] ?? sourceCards;\n for (const cardId of selected) {\n if (!sourceCards.includes(cardId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': card '${cardId}' is not in zone for player '${playerId}'.`,\n );\n }\n assertCardAllowedInPlayerZone(nextTable, zoneId, cardId);\n }\n selectedByPlayer.set(playerId, [...selected]);\n }\n\n const removeByPlayer = new Map<string, string[]>();\n for (const playerId of players) {\n const selected = new Set(selectedByPlayer.get(playerId) ?? []);\n removeByPlayer.set(\n playerId,\n readPlayerZoneCards(nextTable, zoneId, playerId).filter(\n (cardId) => !selected.has(cardId),\n ),\n );\n }\n\n const additionsByPlayer = new Map<string, string[]>(\n players.map((playerId) => [playerId, []]),\n );\n for (const [index, fromPlayerId] of players.entries()) {\n const offset = options.direction === \"left\" ? 1 : -1;\n const recipient =\n players[(index + offset + players.length) % players.length]!;\n additionsByPlayer\n .get(recipient)!\n .push(...(selectedByPlayer.get(fromPlayerId) ?? []));\n }\n\n for (const playerId of players) {\n const remaining = removeByPlayer.get(playerId) ?? [];\n const additions = additionsByPlayer.get(playerId) ?? [];\n const nextCards =\n options.position === \"top\"\n ? [...additions, ...remaining]\n : [...remaining, ...additions];\n writePlayerZoneCards(nextTable, zoneId, playerId, nextCards);\n for (const [position, cardId] of nextCards.entries()) {\n nextTable.componentLocations[cardId] = {\n type: \"InHand\",\n handId: zoneId,\n playerId,\n position,\n };\n nextTable.ownerOfCard[cardId] = playerId;\n nextTable.visibility[cardId] = computePlayerZoneVisibility(\n nextTable,\n zoneId,\n playerId,\n );\n }\n }\n}\n\n/**\n * Internal, id-type-erased signatures for the board writer family.\n *\n * The public `tableMove*` helpers constrain their id args to manifest-derived\n * unions such as `TiledBoardIdOfTable<Table>`, which collapse to `never` for\n * the unconstrained `RuntimeTableRecord`. Inside `createReducerOps<State>`\n * the `State` generic is not yet bound, so at this call site we only know\n * that all ids are plain strings. These aliases narrow that distinction to\n * one place instead of leaking `as never` casts across every op body.\n */\ntype TableMoveComponentToEdgeInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n) => RuntimeTableRecord;\n\ntype TableMoveComponentToEdgeInPlaceInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n) => void;\n\ntype TableMoveComponentToVertexInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n) => RuntimeTableRecord;\n\ntype TableMoveComponentToVertexInPlaceInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n) => void;\n\ntype TableDealCardsFromDeckToHandInternal = (\n table: RuntimeTableRecord,\n fromZoneId: string,\n playerId: string,\n toZoneId: string,\n count: number,\n) => RuntimeTableRecord;\n\ntype TableDealCardsFromDeckToHandInPlaceInternal = (\n table: RuntimeTableRecord,\n fromZoneId: string,\n playerId: string,\n toZoneId: string,\n count: number,\n) => void;\n\nconst moveComponentToEdgeInternal =\n tableMoveComponentToEdge as unknown as TableMoveComponentToEdgeInternal;\nconst moveComponentToEdgeInPlaceInternal =\n tableMoveComponentToEdgeInPlace as unknown as TableMoveComponentToEdgeInPlaceInternal;\nconst moveComponentToVertexInternal =\n tableMoveComponentToVertex as unknown as TableMoveComponentToVertexInternal;\nconst moveComponentToVertexInPlaceInternal =\n tableMoveComponentToVertexInPlace as unknown as TableMoveComponentToVertexInPlaceInternal;\nconst dealCardsFromDeckToHandInternal =\n tableDealCardsFromDeckToHand as unknown as TableDealCardsFromDeckToHandInternal;\nconst dealCardsFromDeckToHandInPlaceInternal =\n tableDealCardsFromDeckToHandInPlace as unknown as TableDealCardsFromDeckToHandInPlaceInternal;\n\n/**\n * Create the `ops.*` namespace specialised to a game state.\n *\n * Call this once (typically in a shared reducer-support module) and reuse the\n * resulting object across phases:\n *\n * export const ops = createReducerOps<GameState>();\n */\nexport function createReducerOps<\n State extends ReducerStateBase,\n>(): ReducerOps<State> {\n // The implementation operates on the structural `AnyState` shape; the\n // public `ReducerOps<State>` interface adds manifest-aware argument\n // validation and polymorphic state preservation on top. The final\n // `as unknown as ReducerOps<State>` bridges the two: all runtime\n // correctness is still covered by the underlying table-ops writers.\n const applyPatch = <T extends object>(\n prev: T,\n patch: Partial<T> | ((prev: T) => T),\n ): T => {\n if (typeof patch === \"function\") {\n return (patch as (prev: T) => T)(prev);\n }\n return { ...prev, ...patch };\n };\n\n const impl = {\n setActivePlayers(activePlayers: ReadonlyArray<string>) {\n return <S extends AnyState>(state: S): S =>\n stateSetActivePlayers(\n state as unknown as never,\n [...activePlayers] as never,\n ) as unknown as S;\n },\n advanceActivePlayer() {\n return <S extends AnyState>(state: S): S => {\n const table = (state as unknown as { table: RuntimeTableRecord }).table;\n const order = table.playerOrder as ReadonlyArray<string>;\n if (order.length === 0) return state;\n const flow = (\n state as unknown as { flow?: { activePlayers?: readonly string[] } }\n ).flow;\n const current = flow?.activePlayers?.[0];\n const idx = current ? order.indexOf(current) : -1;\n const nextIdx = idx < 0 ? 0 : (idx + 1) % order.length;\n const nextId = order[nextIdx];\n if (nextId === undefined) return state;\n return stateSetActivePlayers(\n state as unknown as never,\n [nextId] as never,\n ) as unknown as S;\n };\n },\n patchPhaseState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev = (state as unknown as { phase?: object }).phase ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return stateSetPhaseState(\n state as unknown as { phase: object },\n next as object,\n ) as unknown as S;\n };\n },\n patchPublicState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { publicState?: object }).publicState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, publicState: next } as S;\n };\n },\n patchHiddenState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { hiddenState?: object }).hiddenState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, hiddenState: next } as S;\n };\n },\n patchPlayerPrivateState(args: { playerId: string; patch: unknown }) {\n return <S extends AnyState>(state: S): S => {\n const privateByPlayer =\n (state as unknown as { privateState?: Record<string, object> })\n .privateState ?? {};\n const prev = (privateByPlayer[args.playerId] ?? {}) as object;\n const next = applyPatch(\n prev,\n args.patch as Partial<object> | ((prev: object) => object),\n );\n return {\n ...state,\n privateState: {\n ...privateByPlayer,\n [args.playerId]: next,\n },\n } as S;\n };\n },\n addCardToSharedZone(args: {\n deckId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddCardToSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n args.playedBy ?? null,\n args.position ?? \"bottom\",\n );\n return updateTable(state, nextTable);\n };\n },\n removeCardFromSharedZone(args: { deckId: string; cardId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableRemoveCardFromSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenSharedZones(args: {\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenSharedZones({\n table: state.table,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableDealCardsBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n count: args.count,\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromPlayerZoneToSharedZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromPlayerZoneToSharedZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromSharedZoneToPlayerZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromSharedZoneToPlayerZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsToPlayerZone(args: {\n fromZoneId: string;\n playerId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = dealCardsFromDeckToHandInternal(\n state.table,\n args.fromZoneId,\n args.playerId,\n args.toZoneId,\n args.count,\n );\n return updateTable(state, nextTable);\n };\n },\n rotatePlayerZone(args: {\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = rotatePlayerZoneTable({\n table: state.table,\n zoneId: args.zoneId,\n direction: args.direction,\n players: args.players,\n cardIdsByPlayer: args.cardIdsByPlayer,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveComponentToSpace(args: {\n componentId: string;\n boardId: string;\n spaceId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToSpace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToContainer(args: {\n componentId: string;\n boardId: string;\n containerId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToContainer(\n state.table,\n args.componentId,\n args.boardId,\n args.containerId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToEdge(args: {\n componentId: string;\n boardId: string;\n edgeId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToEdgeInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToVertex(args: {\n componentId: string;\n boardId: string;\n vertexId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToVertexInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToDetached(args: { componentId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToDetached(\n state.table,\n args.componentId,\n );\n return updateTable(state, nextTable);\n };\n },\n addResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n spendResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSpendPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n transferResources(args: {\n fromPlayerId: string;\n toPlayerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableTransferPlayerResources(\n state.table,\n args.fromPlayerId,\n args.toPlayerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n setResource(args: {\n playerId: string;\n resourceId: string;\n amount: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSetPlayerResource(\n state.table,\n args.playerId,\n args.resourceId,\n args.amount,\n );\n return updateTable(state, nextTable);\n };\n },\n };\n\n const internal = {\n setActivePlayers<S extends AnyState>(\n state: S,\n activePlayers: ReadonlyArray<string>,\n ): S {\n return stateSetActivePlayers(\n state as unknown as never,\n [...activePlayers] as never,\n ) as unknown as S;\n },\n advanceActivePlayer<S extends AnyState>(state: S): S {\n const table = (state as unknown as { table: RuntimeTableRecord }).table;\n const order = table.playerOrder as ReadonlyArray<string>;\n if (order.length === 0) return state;\n const flow = (\n state as unknown as { flow?: { activePlayers?: readonly string[] } }\n ).flow;\n const current = flow?.activePlayers?.[0];\n const idx = current ? order.indexOf(current) : -1;\n const nextIdx = idx < 0 ? 0 : (idx + 1) % order.length;\n const nextId = order[nextIdx];\n if (nextId === undefined) return state;\n return stateSetActivePlayers(\n state as unknown as never,\n [nextId] as never,\n ) as unknown as S;\n },\n patchPhaseState<S extends AnyState>(state: S, patch: unknown): S {\n const prev = (state as unknown as { phase?: object }).phase ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return stateSetPhaseState(\n state as unknown as { phase: object },\n next as object,\n ) as unknown as S;\n },\n patchPublicState<S extends AnyState>(state: S, patch: unknown): S {\n const prev =\n (state as unknown as { publicState?: object }).publicState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, publicState: next } as S;\n },\n patchHiddenState<S extends AnyState>(state: S, patch: unknown): S {\n const prev =\n (state as unknown as { hiddenState?: object }).hiddenState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, hiddenState: next } as S;\n },\n patchPlayerPrivateState<S extends AnyState>(\n state: S,\n args: { playerId: string; patch: unknown },\n ): S {\n const privateByPlayer =\n (state as unknown as { privateState?: Record<string, object> })\n .privateState ?? {};\n const prev = (privateByPlayer[args.playerId] ?? {}) as object;\n const next = applyPatch(\n prev,\n args.patch as Partial<object> | ((prev: object) => object),\n );\n return {\n ...state,\n privateState: {\n ...privateByPlayer,\n [args.playerId]: next,\n },\n } as S;\n },\n addCardToSharedZone<S extends AnyState>(\n state: S,\n args: {\n deckId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableAddCardToSharedZoneInPlace(\n state.table,\n args.deckId,\n args.cardId,\n args.playedBy ?? null,\n args.position ?? \"bottom\",\n );\n return state;\n },\n removeCardFromSharedZone<S extends AnyState>(\n state: S,\n args: { deckId: string; cardId: string },\n ): S {\n tableRemoveCardFromSharedZoneInPlace(\n state.table,\n args.deckId,\n args.cardId,\n );\n return state;\n },\n moveCardBetweenSharedZones<S extends AnyState>(\n state: S,\n args: {\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardBetweenSharedZonesInPlace({\n table: state.table,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n dealCardsBetweenPlayerZones<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n count: number;\n },\n ): S {\n tableDealCardsBetweenPlayerZonesInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n count: args.count,\n });\n return state;\n },\n moveCardBetweenPlayerZones<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardBetweenPlayerZonesInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveCardFromPlayerZoneToSharedZone<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardFromPlayerZoneToSharedZoneInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveCardFromSharedZoneToPlayerZone<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardFromSharedZoneToPlayerZoneInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n dealCardsToPlayerZone<S extends AnyState>(\n state: S,\n args: {\n fromZoneId: string;\n playerId: string;\n toZoneId: string;\n count: number;\n },\n ): S {\n dealCardsFromDeckToHandInPlaceInternal(\n state.table,\n args.fromZoneId,\n args.playerId,\n args.toZoneId,\n args.count,\n );\n return state;\n },\n rotatePlayerZone<S extends AnyState>(\n state: S,\n args: {\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n rotatePlayerZoneTableInPlace({\n table: state.table,\n zoneId: args.zoneId,\n direction: args.direction,\n players: args.players,\n cardIdsByPlayer: args.cardIdsByPlayer,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveComponentToSpace<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; spaceId: string },\n ): S {\n tableMoveComponentToSpaceInPlace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n );\n return state;\n },\n moveComponentToContainer<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; containerId: string },\n ): S {\n tableMoveComponentToContainerInPlace(\n state.table,\n args.componentId,\n args.boardId,\n args.containerId,\n );\n return state;\n },\n moveComponentToEdge<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; edgeId: string },\n ): S {\n moveComponentToEdgeInPlaceInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n );\n return state;\n },\n moveComponentToVertex<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; vertexId: string },\n ): S {\n moveComponentToVertexInPlaceInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n );\n return state;\n },\n moveComponentToDetached<S extends AnyState>(\n state: S,\n args: { componentId: string },\n ): S {\n tableMoveComponentToDetachedInPlace(state.table, args.componentId);\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(\n state.table,\n args.playerId,\n args.amounts,\n );\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\n const ops = impl as unknown as ReducerOpsWithInternal<State>;\n Object.defineProperty(ops, reducerOpsInternal, {\n value: internal as unknown as ReducerOpsInternal<State>,\n });\n return ops;\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n CardIdOfTable,\n ComponentDataOfTable,\n ComponentIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HexBoardIdOfTable,\n HexSpaceIdOfTable,\n PlayerIdOfTable,\n RelationTypeIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n TableQueries,\n TableQueriesOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexTypeIdOfTable,\n} from \"./model\";\nimport {\n getAdjacentSpaces,\n getAllPlayerZoneCards,\n getAllSharedZoneCards,\n getBoard,\n getBoardsByTypeId,\n getCard,\n getCardsById,\n getCardOwner,\n getCardVisibility,\n getSlotOccupants,\n getSlotOccupantsByHost,\n getComponentContainerLocation,\n getComponentDeckLocation,\n getComponentEdgeLocation,\n getComponentHandLocation,\n getComponentLocation,\n getComponentSlotLocation,\n getComponentSpaceLocation,\n getComponentVertexLocation,\n getComponentZoneLocation,\n getComponentsInContainer,\n getComponentsOnEdge,\n getComponentsOnSpace,\n getComponentsOnVertex,\n getContainer,\n getEdge,\n getEdgesByTypeId,\n getHexBoard,\n getHexSpace,\n getHexSpaceAt,\n getIncidentEdges,\n getIncidentVertices,\n canAffordResources,\n getMissingResources,\n getNextPlayerInOrder,\n getPlayerOrder,\n getPlayerResourceAmount,\n getPlayerResourceTotal,\n getPlayerResources,\n getPlayerZoneCardCollection,\n getPlayerZoneCards,\n getRelatedSpaces,\n getSharedZoneCardCollection,\n getSharedZoneCards,\n getSpace,\n getSpaceDistance,\n getSpaceEdges,\n getSpacesByTypeId,\n getSpaceVertices,\n getSquareBoard,\n getSquareDistance,\n getSquareNeighbors,\n getSquareSpace,\n getSquareSpaceAt,\n getTiledBoard,\n getVertex,\n getVerticesByTypeId,\n} from \"./table\";\n\nexport function createTableQueries<Table extends RuntimeTableRecord>(\n table: Table,\n): TableQueries<Table> {\n return {\n board: {\n get: <BoardId extends BoardIdOfTable<Table>>(boardId: BoardId) =>\n getBoard(table, boardId),\n hex: <BoardId extends HexBoardIdOfTable<Table>>(boardId: BoardId) =>\n getHexBoard(table, boardId),\n square: <BoardId extends SquareBoardIdOfTable<Table>>(boardId: BoardId) =>\n getSquareBoard(table, boardId),\n tiled: <BoardId extends TiledBoardIdOfTable<Table>>(boardId: BoardId) =>\n getTiledBoard(table, boardId),\n space: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSpace(table, boardId, spaceId),\n hexSpace: <\n BoardId extends HexBoardIdOfTable<Table>,\n SpaceId extends HexSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getHexSpace(table, boardId, spaceId),\n squareSpace: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSquareSpace(table, boardId, spaceId),\n container: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getContainer(table, boardId, containerId),\n edge: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getEdge(table, boardId, edgeId),\n vertex: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getVertex(table, boardId, vertexId),\n byType: <TypeId extends BoardTypeIdOfTable<Table>>(typeId: TypeId) =>\n getBoardsByTypeId(table, typeId),\n spacesByType: <\n BoardId extends BoardIdOfTable<Table>,\n TypeId extends SpaceTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getSpacesByTypeId(table, boardId, typeId),\n edgesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledEdgeTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getEdgesByTypeId(table, boardId, typeId),\n verticesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledVertexTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getVerticesByTypeId(table, boardId, typeId),\n adjacentSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getAdjacentSpaces(table, boardId, spaceId),\n relatedSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n TypeId extends RelationTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n ) => getRelatedSpaces(table, boardId, spaceId, relationTypeId),\n incidentEdges: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getIncidentEdges(table, boardId, vertexId),\n incidentVertices: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getIncidentVertices(table, boardId, edgeId),\n spaceEdges: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceEdges(table, boardId, spaceId),\n spaceVertices: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceVertices(table, boardId, spaceId),\n spaceDistance: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n ) => getSpaceDistance(table, boardId, fromSpaceId, toSpaceId),\n hexSpaceAt: <BoardId extends HexBoardIdOfTable<Table>>(\n boardId: BoardId,\n q: number,\n r: number,\n ) => getHexSpaceAt(table, boardId, q, r),\n squareSpaceAt: <BoardId extends SquareBoardIdOfTable<Table>>(\n boardId: BoardId,\n row: number,\n col: number,\n ) => getSquareSpaceAt(table, boardId, row, col),\n squareNeighbors: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ) => getSquareNeighbors(table, boardId, spaceId, options),\n squareDistance: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ) => getSquareDistance(table, boardId, fromSpaceId, toSpaceId, options),\n spaceOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getComponentsOnSpace(table, boardId, spaceId),\n containerOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getComponentsInContainer(table, boardId, containerId),\n edgeOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getComponentsOnEdge(table, boardId, edgeId),\n vertexOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getComponentsOnVertex(table, boardId, vertexId),\n },\n zone: {\n sharedCards: <ZoneId extends DeckIdOfTable<Table>>(zoneId: ZoneId) =>\n getSharedZoneCards(table, zoneId),\n sharedCardCollection: <ZoneId extends DeckIdOfTable<Table>>(\n zoneId: ZoneId,\n ) => getSharedZoneCardCollection(table, zoneId),\n allSharedCards: () => getAllSharedZoneCards(table),\n playerCards: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCards(table, playerId, zoneId),\n playerCardCollection: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCardCollection(table, playerId, zoneId),\n allPlayerCards: <ZoneId extends HandIdOfTable<Table>>(zoneId: ZoneId) =>\n getAllPlayerZoneCards(table, zoneId),\n },\n card: {\n get: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCard(table, cardId),\n byIds: <CardIds extends readonly CardIdOfTable<Table>[]>(\n cardIds: CardIds,\n ) => getCardsById(table, cardIds),\n owner: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardOwner(table, cardId),\n visibility: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardVisibility(table, cardId),\n },\n slot: {\n occupants: (host, slotId) => getSlotOccupants(table, host, slotId),\n occupantsByHost: (host) => getSlotOccupantsByHost(table, host),\n pieceOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"piece\", id: hostId }, slotId),\n pieceOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"piece\", id: hostId }),\n dieOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"die\", id: hostId }, slotId),\n dieOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"die\", id: hostId }),\n },\n player: {\n order: () => getPlayerOrder(table),\n nextInOrder: (playerId) => getNextPlayerInOrder(table, playerId),\n resources: (playerId) => getPlayerResources(table, playerId),\n resource: (playerId, resourceId) =>\n getPlayerResourceAmount(table, playerId, resourceId),\n resourceTotal: (playerId) => getPlayerResourceTotal(table, playerId),\n canAfford: (playerId, amounts) =>\n canAffordResources(table, playerId, amounts),\n missingResources: (playerId, amounts) =>\n getMissingResources(table, playerId, amounts),\n },\n component: {\n data: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) =>\n (table.cards[componentId] ??\n table.pieces[componentId] ??\n table.dice[componentId]) as\n | ComponentDataOfTable<Table, ComponentId>\n | undefined,\n location: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentLocation(table, componentId),\n deck: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentDeckLocation(table, componentId),\n hand: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentHandLocation(table, componentId),\n zone: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentZoneLocation(table, componentId),\n space: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSpaceLocation(table, componentId),\n container: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentContainerLocation(table, componentId),\n edge: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentEdgeLocation(table, componentId),\n vertex: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentVertexLocation(table, componentId),\n slot: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSlotLocation(table, componentId),\n },\n };\n}\n\nexport function createStateQueries<State extends { table: RuntimeTableRecord }>(\n state: State,\n): TableQueriesOfState<State> {\n return createTableQueries(\n state.table,\n ) as unknown as TableQueriesOfState<State>;\n}\n","import type { Op } from \"./compose\";\nimport type {\n BoardIdOfTable,\n CardIdOfTable,\n ComponentIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n TableOfState,\n TableQueriesOfState,\n} from \"./model\";\nimport {\n createReducerOps,\n getReducerOpsInternal,\n type ReducerOpsInternal,\n type ReducerOps,\n} from \"./ops\";\nimport { createStateQueries } from \"./table-queries\";\nimport { cloneRuntimeTable } from \"./table/clone\";\n\nexport type RotatePlayerZoneArgs<\n State extends { table: RuntimeTableRecord },\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>> = PlayerZoneIdOfTable<\n TableOfState<State>\n >,\n PlayerId extends PlayerIdOfTable<TableOfState<State>> = PlayerIdOfTable<\n TableOfState<State>\n >,\n> = {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<TableOfState<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n};\n\ntype TransactionMethods<State extends { table: RuntimeTableRecord }> = {\n [Key in Exclude<\n keyof ReducerOps<State>,\n \"moveComponentToSpace\"\n >]: ReducerOps<State>[Key] extends (...args: infer Args) => Op<State>\n ? (...args: Args) => State\n : never;\n} & {\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<TableOfState<State>>,\n SpaceId extends SpaceIdOfTable<TableOfState<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): State;\n};\n\nexport type ReducerTransaction<State extends { table: RuntimeTableRecord }> =\n TransactionMethods<State> & {\n readonly state: State;\n readonly q: TableQueriesOfState<State>;\n apply(op: Op<State>): State;\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(\n args: RotatePlayerZoneArgs<State, ZoneId, PlayerId>,\n ): State;\n };\n\nexport type ReducerEdit<State extends { table: RuntimeTableRecord }> = <\n DraftState extends State,\n>(\n state: DraftState,\n) => ReducerTransaction<DraftState>;\n\nconst transactionContext = Symbol(\"dreamboard.reducerTransactionContext\");\n\ntype TransactionContext<State extends { table: RuntimeTableRecord }> = {\n currentState: State;\n currentQueries: TableQueriesOfState<State> | null;\n internalOps: ReducerOpsInternal<State>;\n methodCache: Record<string, (...args: readonly unknown[]) => State>;\n applyMethod?: (op: Op<State>) => State;\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 applyTransactionOp<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n op: Op<State>,\n): State {\n context.currentState = op(context.currentState);\n invalidate(context);\n return context.currentState;\n}\n\nfunction runInternal<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n key: keyof ReducerOps<State>,\n args: readonly unknown[],\n): State {\n context.currentState = (\n context.internalOps[key] as unknown as (\n state: State,\n ...args: readonly unknown[]\n ) => State\n )(context.currentState, ...args);\n invalidate(context);\n return context.currentState;\n}\n\nfunction createReducerTransactionSurface<\n State extends { table: RuntimeTableRecord },\n>(ops: ReducerOps<State>) {\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(context.currentState);\n return context.currentQueries;\n },\n },\n apply: {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n context.applyMethod ??= (op: Op<State>) =>\n applyTransactionOp(context, op);\n return context.applyMethod;\n },\n },\n };\n\n for (const key of Object.keys(ops) as Array<keyof ReducerOps<State>>) {\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 Object.defineProperties(surface, descriptors);\n return surface;\n}\n\nfunction createReducerTransactionFromSurface<\n State extends { table: RuntimeTableRecord },\n>(\n initialState: State,\n internalOps: ReducerOpsInternal<State>,\n surface: object,\n): ReducerTransaction<State> {\n const transaction = Object.create(surface) as ReducerTransaction<State> &\n TransactionHost<State>;\n Object.defineProperty(transaction, transactionContext, {\n value: {\n currentState: {\n ...initialState,\n table: cloneRuntimeTable(initialState.table),\n },\n currentQueries: null,\n internalOps,\n methodCache: {},\n } satisfies TransactionContext<State>,\n });\n return transaction;\n}\n\nexport function createReducerTransaction<\n State extends { table: RuntimeTableRecord },\n>(initialState: State, ops: ReducerOps<State> = createReducerOps<State>()) {\n const internalOps = getReducerOpsInternal(ops);\n const surface = createReducerTransactionSurface(ops);\n return createReducerTransactionFromSurface(\n initialState,\n internalOps,\n surface,\n );\n}\n\nexport function createReducerEdit<State extends { table: RuntimeTableRecord }>(\n ops: ReducerOps<State> = createReducerOps<State>(),\n): ReducerEdit<State> {\n const internalOps = getReducerOpsInternal(ops);\n const surface = createReducerTransactionSurface(ops);\n return <DraftState extends State>(state: DraftState) =>\n createReducerTransactionFromSurface(\n state,\n internalOps as unknown as ReducerOpsInternal<DraftState>,\n surface,\n );\n}\n","import type {\n BaseGameStateOfContract,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\nimport type { AnyContinuationCallable } from \"../../model/spec/runtime-args\";\nimport {\n collectReducerDefinitionIndex,\n type ReducerDefinitionPhaseIndex,\n type ReducerIndexedCardActionEntry,\n type ReducerIndexedInteractionEntry,\n type ReducerIndexedPhase,\n type ReducerIndexedStageEntry,\n type ReducerIndexedZoneEntry,\n} from \"../../definition-index\";\n\nexport type TrustedErasedPhase<Contract extends ReducerGameContractLike> =\n ReducerIndexedPhase<Contract>;\n\nexport type TrustedInteractionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedInteractionEntry<Contract>;\n\nexport type TrustedCardActionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedCardActionEntry<Contract>;\n\nexport type TrustedStageEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedStageEntry<Contract>;\n\nexport type TrustedZoneEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedZoneEntry<Contract>;\n\nexport type TrustedContinuationRegistry<\n Contract extends ReducerGameContractLike,\n> = ReadonlyMap<\n string,\n AnyContinuationCallable<BaseGameStateOfContract<Contract>>\n>;\n\nexport type TrustedPhaseRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = Omit<ReducerDefinitionPhaseIndex<Contract, Definitions, Views>, \"effects\">;\n\nexport interface TrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n TrustedErasedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >;\n readonly continuationsById: TrustedContinuationRegistry<Contract>;\n readonly effectsById: ReadonlyMap<\n string,\n { readonly id: string; readonly type: string }\n >;\n}\n\nexport function collectTrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): TrustedRuntimeRegistry<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const index = collectReducerDefinitionIndex(definition);\n const phasesByName = new Map<\n PhaseName,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >();\n const continuationsById = new Map<string, AnyContinuationCallable<State>>();\n const effectsById = new Map<\n string,\n { readonly id: string; readonly type: string }\n >();\n\n for (const phaseIndex of index.phasesByName.values()) {\n const trustedPhase: TrustedPhaseRegistry<Contract, Definitions, Views> = {\n phaseName: phaseIndex.phaseName,\n phase: phaseIndex.phase,\n interactions: phaseIndex.interactions,\n stages: phaseIndex.stages,\n zones: phaseIndex.zones,\n cardActions: phaseIndex.cardActions,\n };\n phasesByName.set(phaseIndex.phaseName, trustedPhase);\n for (const [, effect] of phaseIndex.effects) {\n effectsById.set(effect.id, { id: effect.id, type: effect.type });\n if (effect.continuation) {\n const continuationId = effect.continuation.id ?? effect.id;\n continuationsById.set(\n continuationId,\n effect.continuation as AnyContinuationCallable<State>,\n );\n }\n }\n }\n\n return {\n phaseEntries: index.phaseEntries,\n phasesByName,\n continuationsById,\n effectsById,\n };\n}\n","import type { RuntimeTableRecord } from \"./model/table\";\nimport type { TableQueriesOfState } from \"./model/queries\";\nimport type { BaseGameStateOfContract } from \"./model/definition\";\nimport { createStateQueries } from \"./table-queries\";\n\n/**\n * A freestanding, memoized projection of immutable game state.\n *\n * Use `defineDerived` for values that are pure functions of component\n * locations, zone contents, resources, or other state fields - and are\n * consumed from multiple reducer or view call sites, or whose compute cost\n * is non-trivial (graph walks, aggregate reductions).\n *\n * Do NOT cache derived values in `publicState`. State fields should be\n * inputs to derivations, not mirrors of them.\n */\nexport type DerivedDefinition<Contract, Value> = {\n /** Optional label for debugging. Does not affect caching. */\n readonly name?: string;\n readonly compute: (ctx: {\n readonly state: BaseGameStateOfContract<Contract>;\n readonly q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n readonly derived: DerivedResolver;\n }) => Value;\n};\n\n/**\n * Resolves a `DerivedDefinition` to its value. Callers do not need to know\n * about memoization - the resolver handles caching internally.\n */\nexport type DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n) => Value;\n\ntype AnyDerivedDefinition = DerivedDefinition<unknown, unknown>;\n\n/**\n * Author-facing factory for creating a derived value tied to a game\n * contract. Usage:\n *\n * ```ts\n * export const longestRoad = defineDerived<GameContract>()({\n * name: \"longestRoad\",\n * compute: ({ q, derived }) => computeLongestRoad(q),\n * });\n * ```\n */\nexport function defineDerived<Contract>() {\n return <Value>(def: {\n name?: string;\n compute: (ctx: {\n state: BaseGameStateOfContract<Contract>;\n q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived: DerivedResolver;\n }) => Value;\n }): DerivedDefinition<Contract, Value> => def;\n}\n\n/**\n * Creates a resolver scoped to a single state snapshot. Each engine tick\n * and each view projection call creates its own resolver; cache lifetime\n * ends with the call. Cache key is the `DerivedDefinition` identity (the\n * object reference).\n *\n * Re-entry on an in-flight definition throws a readable error.\n */\nexport function createDerivedResolver<\n State extends { table: RuntimeTableRecord },\n>(\n state: State,\n options: { q?: TableQueriesOfState<State> } = {},\n): DerivedResolver {\n const cache = new Map<AnyDerivedDefinition, unknown>();\n const inflight = new Set<AnyDerivedDefinition>();\n const q = options.q ?? createStateQueries(state);\n\n const resolver: DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n ): Value => {\n const typedDef = def as unknown as AnyDerivedDefinition;\n if (cache.has(typedDef)) {\n return cache.get(typedDef) as Value;\n }\n if (inflight.has(typedDef)) {\n throw new Error(\n `Cyclic derived: '${def.name ?? \"<anonymous>\"}' depends on itself.`,\n );\n }\n inflight.add(typedDef);\n try {\n const value = (\n def.compute as unknown as (ctx: {\n state: unknown;\n q: unknown;\n derived: DerivedResolver;\n }) => Value\n )({ state, q, derived: resolver });\n cache.set(typedDef, value);\n return value;\n } finally {\n inflight.delete(typedDef);\n }\n };\n\n return resolver;\n}\n","import type {\n AnyContinuationToken,\n EffectSpecLike,\n ReducerFx,\n RuntimeTableRecord,\n} from \"./model\";\n\ntype FxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\ntype InternalEffectDefinition = EffectSpecLike;\n\nfunction buildResume(\n effect: InternalEffectDefinition,\n context: unknown,\n): AnyContinuationToken | undefined {\n if (!effect.__continuation) {\n return undefined;\n }\n return (effect.__continuation as unknown as (data: unknown) => unknown)(\n context ?? {},\n ) as AnyContinuationToken;\n}\n\nfunction invokeEffect(\n effect: InternalEffectDefinition,\n options: Record<string, unknown>,\n) {\n const continuation = buildResume(effect, options.context);\n if (effect.type === \"rollDie\") {\n return continuation === undefined\n ? {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n }\n : {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n continuation,\n };\n }\n if (effect.type === \"shuffleSharedZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n }\n : {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n continuation,\n };\n }\n if (effect.type === \"shufflePlayerZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n }\n : {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n continuation,\n };\n }\n throw new Error(\n `fx.effect: unsupported effect type '${(effect as InternalEffectDefinition).type}'.`,\n );\n}\n\nexport function createReducerFx<State extends FxState>(): ReducerFx<State> {\n const fx: ReducerFx<State> = {\n transition(to) {\n return { kind: \"flow.transition\", to } as ReturnType<\n ReducerFx<State>[\"transition\"]\n >;\n },\n effect(effect, options) {\n return invokeEffect(\n effect as unknown as InternalEffectDefinition,\n options as Record<string, unknown>,\n ) as ReturnType<ReducerFx<State>[\"effect\"]>;\n },\n } as ReducerFx<State>;\n return fx;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PlayerIdOfState,\n ReducerGameContractLike,\n TableQueriesOfState,\n} from \"../../model\";\nimport type {\n ActionContext,\n RandomHelpers,\n} from \"../../model/spec/runtime-args\";\nimport type { TrustedRuntimeHelpers, TrustedState } from \"./runtime-scope\";\n\nexport function fxForState<Contract extends ReducerGameContractLike>() {\n return createReducerFx<TrustedState<Contract>>();\n}\n\nexport function buildContext<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n): ActionContext<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n> {\n type DomainState = BaseGameStateOfContract<Contract>;\n type PlayerId = PlayerIdOfState<DomainState>;\n type Manifest = ManifestContractOf<Contract>;\n return {\n currentPhase: state.flow.currentPhase as ActionContext<\n DomainState,\n Manifest\n >[\"currentPhase\"],\n manifest,\n playerOrder: [...state.table.playerOrder] as PlayerId[],\n activePlayers: [...state.flow.activePlayers] as PlayerId[],\n runtime: publicRuntime(state.runtime),\n setup: (state.runtime.setup\n ? {\n profileId: state.runtime.setup.profileId,\n optionValues: {\n ...state.runtime.setup.optionValues,\n },\n }\n : null) as ActionContext<DomainState, Manifest>[\"setup\"],\n };\n}\n\nfunction publicRuntime<Runtime extends { rng?: unknown }>(\n runtime: Runtime,\n): Omit<Runtime, \"rng\"> {\n const rest = { ...runtime } as Omit<Runtime, \"rng\"> & { rng?: unknown };\n delete rest.rng;\n return rest;\n}\n\nconst DISABLED_RANDOM_HELPERS: RandomHelpers = {\n subset() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n};\n\nexport function buildRuntimeArgs<\n Contract extends ReducerGameContractLike,\n Extra extends object,\n>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n helpers: TrustedRuntimeHelpers<Contract>,\n toDomainState: (\n state: TrustedState<Contract>,\n ) => BaseGameStateOfContract<Contract>,\n extra: Extra,\n options: {\n q?: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n } = {},\n) {\n const domainState = toDomainState(state);\n const q = options.q ?? createStateQueries(domainState);\n return {\n ...buildContext(state, manifest),\n ...helpers,\n fx: options.fx ?? fxForState<Contract>(),\n q,\n derived: options.derived ?? createDerivedResolver(domainState, { q }),\n runtime: publicRuntime(state.runtime),\n random: options.random ?? DISABLED_RANDOM_HELPERS,\n ...extra,\n };\n}\n","import { assertJsonWithinLimits } from \"../../../runtime-json\";\nimport type {\n GameEvent,\n GameEventDetail,\n GameOutcome,\n OutcomeScoreComponent,\n OutcomeStanding,\n OutcomeTieBreak,\n ReducerAcceptOptions,\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\nfunction normalizeGameOutcome<State, PlayerId extends string>(\n state: State,\n outcome: GameOutcome<PlayerId>,\n): 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 as { table?: { playerOrder?: readonly string[] } })\n .table?.playerOrder;\n if (!Array.isArray(playerOrder) || 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 (typeof detail.value !== \"boolean\") {\n failGameEvent(`details[${index}].value must be string, number, or boolean`);\n }\n return {\n label: detail.label,\n value: detail.value,\n };\n}\n\nfunction normalizeSystemActionEvent(\n event: SystemActionEvent,\n): SystemActionEvent {\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 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\nfunction normalizeGameEvents(events: readonly GameEvent[] = []): 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 acceptResult<State>(\n state: State,\n options: ReducerAcceptOptions<State> = {},\n) {\n const events = normalizeGameEvents(options.events);\n return {\n type: \"accept\" as const,\n state,\n instructions: [...(options.instructions ?? [])],\n events,\n };\n}\n\nexport function endGameResult<State, PlayerId extends string = string>(\n state: State,\n outcome: GameOutcome<PlayerId>,\n options: ReducerAcceptOptions<State> = {},\n) {\n const terminal = normalizeGameOutcome(state, outcome);\n const events = normalizeGameEvents(options.events);\n return {\n type: \"accept\" as const,\n state,\n instructions: [...(options.instructions ?? [])],\n events,\n terminal,\n };\n}\n\nexport function rejectResult(\n errorCode: string,\n message?: string,\n): ReducerReject {\n return {\n type: \"reject\",\n errorCode,\n message,\n };\n}\n\nexport function normalizeResult<State>(\n result: ReducerResult<State> | void,\n fallbackState: State,\n): ReducerResult<State> {\n if (result === undefined || result === null) {\n return acceptResult(fallbackState);\n }\n return result;\n}\n\nexport const runtimeResultHelpers = {\n accept: acceptResult,\n endGame: endGameResult,\n reject: rejectResult,\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 type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\n\nexport function resolveTrustedSetupProfiles<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(definition: ReducerGameDefinition<Contract, Definitions, Views>) {\n const manifestSetupProfilesById =\n definition.contract.manifest.setupProfilesById;\n const manifestSetupProfileIds = Object.keys(manifestSetupProfilesById).sort();\n const reducerSetupProfiles = definition.setupProfiles ?? {};\n const reducerSetupProfileIds = Object.keys(reducerSetupProfiles).sort();\n if (\n manifestSetupProfileIds.length !== reducerSetupProfileIds.length ||\n manifestSetupProfileIds.some(\n (profileId, index) => reducerSetupProfileIds[index] !== profileId,\n )\n ) {\n throw new Error(\n `Reducer setupProfiles must exactly match manifest setupProfiles. Manifest=[${manifestSetupProfileIds.join(\", \")}], reducer=[${reducerSetupProfileIds.join(\", \")}].`,\n );\n }\n return {\n manifestSetupProfilesById,\n reducerSetupProfiles,\n };\n}\n\nexport function resolveDefaultInitialPhase<PhaseName extends string>(\n explicitInitialPhase: PhaseName | undefined,\n phaseEntries: ReadonlyArray<readonly [PhaseName, unknown]>,\n): PhaseName {\n const defaultInitialPhase = explicitInitialPhase ?? phaseEntries[0]?.[0];\n if (!defaultInitialPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n return defaultInitialPhase;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createReducerOps } from \"../../ops\";\nimport { createReducerEdit } from \"../../transaction\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport { createReducerDiagnosticsEmitter } from \"../../diagnostics\";\nimport type {\n ReducerDiagnosticsEmitter,\n ReducerDiagnosticsSink,\n} from \"../../diagnostics\";\nimport type {\n AnyInteractionSpec,\n BaseGameSessionOfContract,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n PlayerIdOfState,\n PlayerZoneIdOfManifest,\n ReducerGameContractLike,\n ReducerGameDefinition,\n StageSpec,\n TableQueriesOfState,\n GameOutcome,\n GameEvent,\n ReducerAcceptOptions,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n ActionContext,\n AnyContinuationCallable,\n RandomHelpers,\n} from \"../../model/spec/runtime-args\";\nimport {\n collectTrustedRuntimeRegistry,\n type TrustedErasedPhase,\n type TrustedCardActionEntry,\n type TrustedInteractionEntry,\n type TrustedPhaseRegistry,\n type TrustedRuntimeRegistry,\n} from \"./runtime-registry\";\nimport {\n buildContext as buildTrustedContext,\n buildRuntimeArgs as buildTrustedRuntimeArgs,\n fxForState as trustedFxForState,\n} from \"./trusted-runtime-args\";\nimport { rejectResult, runtimeResultHelpers } from \"./trusted-runtime-result\";\nimport {\n toCombinedState as codecToCombinedState,\n toDomainState as codecToDomainState,\n toSessionState as codecToSessionState,\n} from \"./trusted-state-codec\";\nimport {\n resolveDefaultInitialPhase,\n resolveTrustedSetupProfiles,\n} from \"./trusted-setup-profiles\";\n\nexport { normalizeResult } from \"./trusted-runtime-result\";\nexport { rejectResult };\n\nexport type TrustedDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReducerGameDefinition<Contract, Definitions, Views>;\n\nexport type TrustedDomainState<Contract extends ReducerGameContractLike> =\n BaseGameStateOfContract<Contract>;\n\nexport type TrustedSessionState<Contract extends ReducerGameContractLike> =\n BaseGameSessionOfContract<Contract>;\n\nexport type TrustedState<Contract extends ReducerGameContractLike> =\n TrustedDomainState<Contract> & {\n runtime: TrustedSessionState<Contract>[\"runtime\"];\n };\n\nexport type TrustedManifest<Contract extends ReducerGameContractLike> =\n ManifestContractOf<Contract>;\n\nexport type TrustedPhaseName<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = PhaseNamesOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type TrustedPlayerId<Contract extends ReducerGameContractLike> =\n PlayerIdOfState<TrustedDomainState<Contract>>;\n\nexport type TrustedInput<Contract extends ReducerGameContractLike> =\n TrustedRuntimeInput<TrustedPlayerId<Contract>>;\n\nexport type { TrustedErasedPhase } from \"./runtime-registry\";\n\nexport interface TrustedRuntimeHelpers<\n Contract extends ReducerGameContractLike,\n> {\n accept: (\n state: TrustedDomainState<Contract>,\n options?: ReducerAcceptOptions<TrustedDomainState<Contract>>,\n ) => {\n type: \"accept\";\n state: TrustedDomainState<Contract>;\n instructions: RuntimeInstructionForState<TrustedDomainState<Contract>>[];\n events: GameEvent[];\n };\n endGame: (\n state: TrustedDomainState<Contract>,\n outcome: GameOutcome<TrustedPlayerId<Contract>>,\n options?: ReducerAcceptOptions<TrustedDomainState<Contract>>,\n ) => {\n type: \"accept\";\n state: TrustedDomainState<Contract>;\n instructions: RuntimeInstructionForState<TrustedDomainState<Contract>>[];\n events: GameEvent[];\n terminal: GameOutcome<TrustedPlayerId<Contract>>;\n };\n reject: typeof rejectResult;\n ops: ReturnType<typeof createReducerOps<TrustedDomainState<Contract>>>;\n edit: ReturnType<typeof createReducerEdit<TrustedDomainState<Contract>>>;\n}\n\nexport interface TrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n definition: TrustedDefinition<Contract, Definitions, Views>;\n diagnostics: ReducerDiagnosticsEmitter;\n registry: TrustedRuntimeRegistry<Contract, Definitions, Views>;\n phaseEntries: ReadonlyArray<\n readonly [\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedErasedPhase<Contract>,\n ]\n >;\n defaultInitialPhase: TrustedPhaseName<Contract, Definitions, Views>;\n manifestSetupProfilesById: TrustedManifest<Contract>[\"setupProfilesById\"];\n reducerSetupProfiles: NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >;\n runtimeHelpers: TrustedRuntimeHelpers<Contract>;\n toDomainState(state: TrustedState<Contract>): TrustedDomainState<Contract>;\n toCombinedState(\n session: TrustedSessionState<Contract>,\n ): TrustedState<Contract>;\n toSessionState(state: TrustedState<Contract>): TrustedSessionState<Contract>;\n phaseRegistryByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined;\n phaseByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedErasedPhase<Contract>;\n findInteractionInPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n interactionId: string,\n ):\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n interactionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedInteractionEntry<Contract>>;\n stagesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<\n readonly [\n string,\n StageSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>,\n ]\n >;\n zonesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<PlayerZoneIdOfManifest<TrustedManifest<Contract>>>;\n cardActionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedCardActionEntry<Contract>>;\n continuationById(\n id: string,\n ): AnyContinuationCallable<TrustedDomainState<Contract>> | undefined;\n fxForState(): ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n buildContext(\n state: TrustedState<Contract>,\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>>;\n buildRuntimeArgs<Extra extends object>(\n state: TrustedState<Contract>,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<TrustedDomainState<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n },\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>> &\n TrustedRuntimeHelpers<Contract> & {\n fx: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n q: ReturnType<typeof createStateQueries<TrustedDomainState<Contract>>>;\n derived: ReturnType<\n typeof createDerivedResolver<TrustedDomainState<Contract>>\n >;\n runtime: Omit<TrustedState<Contract>[\"runtime\"], \"rng\">;\n random: RandomHelpers;\n } & Extra;\n}\n\nexport function createTrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: TrustedDefinition<Contract, Definitions, Views>,\n options: { diagnostics?: ReducerDiagnosticsSink } = {},\n): TrustedRuntimeScope<Contract, Definitions, Views> {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n const registry = collectTrustedRuntimeRegistry(definition);\n const { phaseEntries } = registry;\n const defaultInitialPhase = resolveDefaultInitialPhase(\n definition.initialPhase as PhaseName | undefined,\n phaseEntries,\n );\n const { manifestSetupProfilesById, reducerSetupProfiles } =\n resolveTrustedSetupProfiles(definition);\n\n function toDomainState(state: State): DomainState {\n return codecToDomainState<State, DomainState>(state);\n }\n\n function toCombinedState(session: SessionState): State {\n return codecToCombinedState<SessionState, State>(session);\n }\n\n function toSessionState(state: State): SessionState {\n return codecToSessionState<State, DomainState, SessionState>(\n state,\n toDomainState,\n );\n }\n\n function phaseRegistryByName(\n phaseName: PhaseName,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined {\n return registry.phasesByName.get(phaseName);\n }\n\n function phaseByName(phaseName: PhaseName): TrustedErasedPhase<Contract> {\n const phaseRegistry = phaseRegistryByName(phaseName);\n if (!phaseRegistry) {\n throw new Error(`Unknown reducer phase '${phaseName}'.`);\n }\n return phaseRegistry.phase;\n }\n\n function findInteractionInPhase(\n phaseName: PhaseName,\n interactionId: string,\n ): AnyInteractionSpec<DomainState, Manifest> | undefined {\n const found = interactionEntriesForPhase(phaseName).find(\n ([id]) => id === interactionId,\n );\n return found?.[1];\n }\n\n function interactionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.interactions ?? [];\n }\n\n function stagesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.stages ?? [];\n }\n\n function zonesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.zones ?? [];\n }\n\n function cardActionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.cardActions ?? [];\n }\n\n function continuationById(id: string) {\n return registry.continuationsById.get(id);\n }\n\n const helpers: TrustedRuntimeHelpers<Contract> = {\n ...runtimeResultHelpers,\n ops: createReducerOps<DomainState>(),\n edit: createReducerEdit<DomainState>(),\n };\n\n function fxForState() {\n return trustedFxForState<Contract>();\n }\n\n function buildContext(state: State): ActionContext<DomainState, Manifest> {\n return buildTrustedContext<Contract>(state, definition.contract.manifest);\n }\n\n function buildRuntimeArgs<Extra extends object>(\n state: State,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<DomainState>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<State>>;\n random?: RandomHelpers;\n },\n ) {\n return buildTrustedRuntimeArgs<Contract, Extra>(\n state,\n definition.contract.manifest,\n helpers,\n toDomainState,\n extra,\n options,\n );\n }\n\n return {\n definition,\n diagnostics: createReducerDiagnosticsEmitter(options.diagnostics),\n registry,\n phaseEntries,\n defaultInitialPhase,\n manifestSetupProfilesById,\n reducerSetupProfiles: reducerSetupProfiles as NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >,\n runtimeHelpers: helpers,\n toDomainState,\n toCombinedState,\n toSessionState,\n phaseRegistryByName,\n phaseByName,\n findInteractionInPhase,\n interactionEntriesForPhase,\n stagesForPhase,\n zonesForPhase,\n cardActionEntriesForPhase,\n continuationById,\n fxForState,\n buildContext,\n buildRuntimeArgs,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { RuntimePayload } from \"../../model\";\nimport { createRuntimeInstructionEngine } from \"../../engine/runtime-instruction-engine\";\nimport { cloneRuntimeTable } from \"../../table\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerResult,\n RuntimeRngState,\n ViewMapOf,\n} from \"../../model\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport { createEngineInstructionResolver } from \"./engine-instruction-resolver\";\nimport { createFlowInstructionResolver } from \"./flow-instruction-resolver\";\nimport {\n createMutableRandomHelpers,\n sampleRngCollectorValue,\n} from \"./rng-sampler\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n simultaneousSubmitInteraction,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport {\n normalizeResult,\n rejectResult,\n type TrustedDomainState,\n type TrustedInput,\n type TrustedPhaseName,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createTrustedInstructionRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const flowInstructions = createFlowInstructionResolver(lifecycle);\n const engineInstructions = createEngineInstructionResolver<Contract>();\n\n type RuntimeRngResult = { runtimeRng?: RuntimeRngState };\n\n function reduceInternal(\n state: State,\n input: ReducerInput,\n ): ReducerResult<DomainState> & RuntimeRngResult {\n const ctx = scope.buildContext(state);\n\n if (input.kind === \"interaction\") {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) {\n return rejectResult(\n \"unsupported-action\",\n `Interaction '${input.interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n );\n }\n const parsed = interactions.parseInteractionParams(\n interaction,\n input.params,\n { playerId: input.playerId },\n );\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n interaction.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n playerId: input.playerId,\n params: parsed.params,\n },\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n if (input.kind === \"continuation\") {\n const continuation = scope.continuationById(input.continuationId);\n if (!continuation) {\n return rejectResult(\n \"missing-continuation\",\n `Continuation '${input.continuationId}' was not registered.`,\n );\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n continuation.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n source: \"effect\" as const,\n effectKind: input.effectKind,\n data: input.resumeData,\n response: input.response,\n },\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n return scope.runtimeHelpers.accept(scope.toDomainState(state));\n }\n\n function preSampleRngForAction(\n state: State,\n input: ReducerInput,\n ): { state: State; input: ReducerInput } {\n if (input.kind !== \"interaction\") return { state, input };\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) return { state, input };\n const collectors = interaction.inputs as Record<string, InputCollector>;\n let nextRng = state.runtime.rng;\n const sampled: Record<string, unknown> = {};\n let anySampled = false;\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind !== \"rng\") continue;\n const { value, nextRng: advanced } = sampleRngCollectorValue(\n collector,\n nextRng,\n );\n sampled[key] = value;\n nextRng = advanced;\n anySampled = true;\n }\n if (!anySampled) return { state, input };\n const mergedParams: Record<string, unknown> = {\n ...((input.params ?? {}) as Record<string, unknown>),\n ...sampled,\n };\n return {\n state: {\n ...state,\n runtime: { ...state.runtime, rng: nextRng },\n } as State,\n input: { ...input, params: mergedParams } as ReducerInput,\n };\n }\n\n function clearSimultaneousCurrent(state: State): State {\n return {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: { current: null },\n },\n } as State;\n }\n\n function reduceSimultaneousSubmit(\n state: State,\n input: ReducerInput,\n ): ReducerResult<State> | null {\n if (\n input.kind !== \"interaction\" ||\n input.interactionId !== SIMULTANEOUS_SUBMIT_INTERACTION_ID\n ) {\n return null;\n }\n\n const phaseName = state.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) {\n return null;\n }\n\n const submit = simultaneousSubmitInteraction(scope.phaseByName(phaseName));\n if (!submit) {\n return rejectResult(\n \"missing-submit-interaction\",\n `Simultaneous phase '${phaseName}' does not declare submit.`,\n );\n }\n const resolve = (phase as { resolve?: unknown }).resolve;\n if (typeof resolve !== \"function\") {\n return rejectResult(\n \"missing-simultaneous-resolve\",\n `Simultaneous phase '${phaseName}' does not declare resolve.`,\n );\n }\n\n const actors = resolveSimultaneousActors(scope, state, phase);\n if (!actors.includes(input.playerId as PlayerId)) {\n return rejectResult(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${input.interactionId}').`,\n );\n }\n\n const parsed = interactions.parseInteractionParams(submit, input.params);\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n\n const current =\n state.runtime.simultaneous?.current?.phaseName === phaseName\n ? state.runtime.simultaneous.current\n : {\n phaseName,\n actors,\n submissions: {},\n };\n const existing = current.submissions[input.playerId as PlayerId];\n const canResubmit =\n (phase as { canResubmit?: boolean }).canResubmit === true;\n if (existing && !canResubmit) {\n return rejectResult(\n \"ALREADY_SUBMITTED\",\n `Interaction '${input.interactionId}' has already been submitted by '${input.playerId}'.`,\n );\n }\n\n const submissions: Record<\n string,\n { interactionId: string; params: RuntimePayload }\n > = {\n ...current.submissions,\n [input.playerId]: {\n interactionId: input.interactionId,\n params: parsed.params as RuntimePayload,\n },\n };\n const stateWithSubmission = {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: {\n current: {\n phaseName,\n actors,\n submissions,\n },\n },\n },\n } as State;\n const waitingPlayerIds = actors.filter((actor) => !submissions[actor]);\n if (waitingPlayerIds.length > 0) {\n return {\n type: \"accept\",\n state: stateWithSubmission,\n instructions: [],\n };\n }\n\n const resolvedSubmissions = Object.fromEntries(\n actors.map((actor) => [\n actor,\n {\n playerId: actor,\n params: submissions[actor]?.params ?? {},\n },\n ]),\n );\n const random = createMutableRandomHelpers(stateWithSubmission.runtime.rng);\n const resolved = normalizeResult(\n resolve(\n scope.buildRuntimeArgs(\n stateWithSubmission,\n {\n state: scope.toDomainState(stateWithSubmission),\n submissions: resolvedSubmissions,\n submittedPlayerIds: [...actors],\n waitingPlayerIds: [],\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(stateWithSubmission),\n );\n if (resolved.type === \"reject\") {\n return resolved;\n }\n return {\n type: \"accept\",\n state: clearSimultaneousCurrent({\n ...resolved.state,\n runtime: { ...stateWithSubmission.runtime, rng: random.currentRng() },\n } as State),\n instructions: resolved.instructions ?? [],\n events: resolved.events ?? [],\n };\n }\n\n function reduceOnce(state: State, input: ReducerInput): ReducerResult<State> {\n const sampled = preSampleRngForAction(state, input);\n const simultaneousResult = reduceSimultaneousSubmit(\n sampled.state,\n sampled.input,\n );\n if (simultaneousResult) {\n return simultaneousResult;\n }\n const result = reduceInternal(sampled.state, sampled.input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: {\n ...result.state,\n runtime: {\n ...sampled.state.runtime,\n rng: result.runtimeRng ?? sampled.state.runtime.rng,\n },\n } as State,\n instructions: result.instructions ?? [],\n events: result.events ?? [],\n };\n }\n\n function resolveInstruction(\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n switch (instruction.kind) {\n case \"flow.transition\":\n return flowInstructions.resolveTransition(state, instruction);\n case \"engine.rollDie\":\n return engineInstructions.resolveRollDie(state, instruction);\n case \"engine.shuffleSharedZone\":\n return engineInstructions.resolveShuffleSharedZone(state, instruction);\n case \"engine.shufflePlayerZone\":\n return engineInstructions.resolveShufflePlayerZone(state, instruction);\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `Unknown runtime instruction kind: ${(_exhaustive as { kind: string }).kind}`,\n );\n }\n }\n }\n\n function resolveInstructionForDrain(\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n switch (instruction.kind) {\n case \"flow.transition\":\n return flowInstructions.resolveTransition(state, instruction);\n case \"engine.rollDie\":\n return engineInstructions.resolveRollDieDraft(state, instruction);\n case \"engine.shuffleSharedZone\":\n return engineInstructions.resolveShuffleSharedZoneDraft(\n state,\n instruction,\n );\n case \"engine.shufflePlayerZone\":\n return engineInstructions.resolveShufflePlayerZoneDraft(\n state,\n instruction,\n );\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `Unknown runtime instruction kind: ${(_exhaustive as { kind: string }).kind}`,\n );\n }\n }\n }\n\n const instructionEngine = createRuntimeInstructionEngine<\n State,\n PlayerId,\n ReducerInput\n >({\n reduce(state, input) {\n return reduceOnce(state, input);\n },\n resolveInstruction: resolveInstructionForDrain,\n prepareInstructionState(state) {\n return {\n ...state,\n table: cloneRuntimeTable(state.table),\n };\n },\n });\n\n return {\n resolveInstruction,\n dispatch: instructionEngine.dispatch,\n drainInstructions: instructionEngine.drainInstructions,\n reduceInternal,\n reduceOnce,\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 valueKind?: \"board-id\" | \"player-board-space\";\n zoneId?: string;\n zoneIds?: readonly string[];\n} {\n switch (collector.kind) {\n case \"card\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? \"card\",\n zoneId: meta.zoneId,\n zoneIds:\n meta.zoneIds ??\n (meta.zoneId === undefined ? undefined : [meta.zoneId]),\n };\n }\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? collector.kind.replace(\"board-\", \"\"),\n boardId: meta.boardId,\n valueKind: meta.valueKind,\n };\n }\n default:\n return {};\n }\n}\n\nexport function interactionInputsOf<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<string, InputCollector> {\n return interaction.inputs as Record<string, InputCollector>;\n}\n\nexport function collectInputMetadata<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<\n string,\n {\n kind: string;\n targetKind?: string;\n boardId?: string;\n zoneId?: string;\n zoneIds?: readonly string[];\n }\n> {\n const collectors = interactionInputsOf(interaction);\n return Object.fromEntries(\n Object.entries(collectors).map(([key, collector]) => [\n key,\n {\n kind: collector.kind,\n ...collectTargetDomainMetadata(collector),\n },\n ]),\n );\n}\n\nexport function 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","import type { DerivedResolver } from \"../../derived\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n ManifestContract,\n TableOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { ReducerDiagnosticsSink } from \"../../diagnostics\";\nimport { interactionInputsOf } from \"./collector-introspection\";\n\nexport type CollectorProjectionOptions<DomainState extends CollectorState> = {\n readonly queries?: TableQueriesOfState<DomainState>;\n readonly derived?: DerivedResolver;\n readonly eligibleTargetCache?: Map<string, string[]>;\n readonly eligibleTargetCachePrefix?: string;\n readonly includeEligibleTargets?: boolean;\n readonly diagnostics?: ReducerDiagnosticsSink;\n};\n\nexport function collectEligibleTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, string[]> {\n const collectors = interactionInputsOf(interaction);\n const result: Record<string, string[]> = {};\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n for (const [key, collector] of Object.entries(collectors)) {\n if (!collector.eligibleTargets) continue;\n const cacheKey = options.eligibleTargetCachePrefix\n ? `${options.eligibleTargetCachePrefix}:${key}`\n : null;\n const cached = cacheKey\n ? options.eligibleTargetCache?.get(cacheKey)\n : undefined;\n if (cached) {\n result[key] = cached;\n continue;\n }\n const targets = collector.eligibleTargets(\n domainState as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[0],\n playerId as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[1],\n queries() as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[2],\n );\n const resolved = Array.from(targets as ReadonlyArray<unknown>).map((t) =>\n String(t),\n );\n result[key] = resolved;\n if (cacheKey) {\n options.eligibleTargetCache?.set(cacheKey, resolved);\n }\n }\n return result;\n}\n","import { z } from \"zod\";\n\nexport function formatIssue(\n label: string,\n issue: { path: PropertyKey[]; message: string },\n): string {\n const path = issue.path\n .map((segment) =>\n typeof segment === \"symbol\" ? segment.toString() : String(segment),\n )\n .join(\".\");\n return `${path || label}: ${issue.message}`;\n}\n\nexport function safeParseOrThrow<Schema extends z.ZodTypeAny>(\n schema: Schema,\n value: unknown,\n label: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n const message = parsed.error.issues\n .map((issue) => formatIssue(label, issue))\n .join(\"; \");\n throw new Error(message || `Invalid ${label}`);\n }\n return parsed.data;\n}\n","import type {\n AnyInteractionSpec,\n InputCollectorKind,\n InputDomainDescriptor,\n InteractionIdOfDefinition,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDefinition,\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport type TrustedInteractionId<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionIdOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type InteractionDescriptorContext<PlayerId extends string = string> = {\n to: PlayerId;\n title?: string;\n options?: Array<{ id: string; label?: string }>;\n};\n\nexport type InteractionCommitPolicyShape =\n | { mode: \"manual\" }\n | { mode: \"autoWhenReady\" };\n\nexport type InteractionAvailabilityShape =\n | { status: \"available\" }\n | { status: \"notYourTurn\"; reason: string }\n | {\n status: \"insufficientResources\";\n reason: string;\n missingResources: Record<string, number>;\n }\n | { status: \"blocked\"; reason: string; code?: string };\n\nexport type InteractionDecision =\n | { available: true; cost?: Record<string, number> }\n | {\n available: false;\n code: string;\n ruleId?: string;\n message?: string;\n cost?: Record<string, number>;\n missingResources?: Record<string, number>;\n };\n\nexport type InteractionDiagnosticReasonShape = {\n ruleId: string;\n errorCode: string;\n};\n\nexport type InteractionExplanation = {\n interactionId: string;\n phase: string;\n step: string | null;\n availability:\n | \"available\"\n | \"notYourTurn\"\n | \"wrongPhase\"\n | \"wrongStep\"\n | \"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 | \"lazy\";\n }>;\n};\n\ntype InteractionDescriptorBaseShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = {\n phaseName: PhaseName;\n interactionKey: `${PhaseName}.${InteractionId}`;\n interactionId: InteractionId;\n label: string;\n help?: string;\n commit: InteractionCommitPolicyShape;\n descriptorDigest?: string;\n actorSeat?: number;\n draftDigest?: string;\n zoneId?: ZoneId;\n zoneIds?: readonly ZoneId[];\n inputs: InteractionInputDescriptorShape[];\n cost?: Record<string, number>;\n currentResources?: Record<string, number>;\n availability: InteractionAvailabilityShape;\n reasons?: readonly InteractionDiagnosticReasonShape[];\n};\n\nexport type ActionInteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = InteractionDescriptorBaseShape<PhaseName, InteractionId, ZoneId> & {\n kind: \"action\";\n};\n\nexport type PromptInteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> = InteractionDescriptorBaseShape<PhaseName, InteractionId, ZoneId> & {\n kind: \"prompt\";\n context: InteractionDescriptorContext<PlayerId>;\n};\n\nexport type InteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> =\n | ActionInteractionDescriptorShape<PhaseName, InteractionId, ZoneId>\n | PromptInteractionDescriptorShape<\n PhaseName,\n InteractionId,\n PlayerId,\n ZoneId\n >;\n\nexport type TrustedInteractionDescriptorShape<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionDescriptorShape<\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedInteractionId<Contract, Definitions, Views>,\n TrustedPlayerId<Contract>\n>;\n\nexport type InteractionInputDescriptorShape = {\n key: string;\n kind: InputCollectorKind;\n domain: InputDomainDescriptor;\n defaultValue?: unknown;\n};\n\nexport type InteractionActorAuthorization<PlayerId extends string> =\n | { readonly mode: \"addressees\"; readonly addressees: ReadonlySet<PlayerId> }\n | { readonly mode: \"actors\"; readonly actors: ReadonlySet<PlayerId> }\n | { readonly mode: \"active\" };\n\nexport type ResolveDecisionMode = \"descriptor\" | \"card\" | \"submit\";\n\nexport type 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 projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >;\n};\n\nexport type InteractionDecisionResult<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> =\n | {\n found: false;\n validation: ReducerValidationResult;\n }\n | {\n found: true;\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >;\n parsedParams: Record<string, unknown>;\n visible: boolean;\n descriptor: TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n validation: ReducerValidationResult;\n };\n\nexport function makeValidationError(\n errorCode: string,\n message?: string,\n): ReducerValidationResult {\n return {\n valid: false,\n errorCode,\n message,\n };\n}\n","import { formatIssue } from \"../../parse-utils\";\nimport { 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; playerId?: string } = {},\n):\n | { ok: true; params: Record<string, unknown> }\n | { ok: false; message: string } {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n if (interaction.paramsSchema) {\n const result = interaction.paramsSchema.safeParse(record);\n if (!result.success) {\n return {\n ok: false,\n message: result.error.issues\n .map((issue) => formatIssue(\"params\", issue))\n .join(\"; \"),\n };\n }\n return { ok: true, params: result.data as Record<string, unknown> };\n }\n const parsed: Record<string, unknown> = {};\n const issues: string[] = [];\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\" && options.skipRng) continue;\n const rawValueBase =\n record[key] === undefined && \"defaultValue\" in collector\n ? collector.defaultValue\n : record[key];\n const rawValue =\n collector.kind === \"board-space\" &&\n collector.meta?.valueKind === \"player-board-space\" &&\n typeof rawValueBase === \"string\" &&\n options.playerId\n ? {\n boardId: collector.meta.boardId,\n playerId: options.playerId,\n spaceId: rawValueBase,\n }\n : rawValueBase;\n const result = collector.schema.safeParse(rawValue);\n if (!result.success) {\n for (const issue of result.error.issues) {\n issues.push(formatIssue(`params.${key}`, issue));\n }\n continue;\n }\n parsed[key] = result.data;\n }\n if (issues.length > 0) {\n return { ok: false, message: issues.join(\"; \") };\n }\n return { ok: true, params: parsed };\n}\n\nexport function prepareInteractionProjectionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n): Record<string, unknown> {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n const prepared: Record<string, unknown> = { ...record };\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n if (record[key] !== undefined) {\n const result = collector.schema.safeParse(record[key]);\n if (result.success) {\n prepared[key] = result.data;\n }\n continue;\n }\n if (\"defaultValue\" in collector) {\n prepared[key] = collector.defaultValue;\n continue;\n }\n const defaultResult = collector.schema.safeParse(undefined);\n if (defaultResult.success) {\n prepared[key] = defaultResult.data;\n }\n }\n return prepared;\n}\n\nexport function validateCollectorTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n params: Record<string, unknown>,\n): ReducerValidationResult {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: ReturnType<typeof createStateQueries> | null = null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ));\n for (const [key, collector] of Object.entries(collectors)) {\n const selectionIssue = validateCollectorSelection(collector, params[key]);\n if (selectionIssue) {\n return makeValidationError(\n selectionIssue.errorCode,\n selectionIssue.message,\n );\n }\n if (!collector.validateTarget) continue;\n const rawTarget = params[key];\n if (rawTarget === null || rawTarget === undefined) continue;\n const dependencyValues = dependencyValuesForCollector(collector, params);\n const targetValues = valuesForCollectorValidation(\n collector.selection,\n rawTarget,\n );\n for (const value of targetValues) {\n const issue = collector.validateTarget(\n domainState as unknown as Parameters<\n typeof collector.validateTarget\n >[0],\n playerId as unknown as Parameters<typeof collector.validateTarget>[1],\n queries() as unknown as Parameters<typeof collector.validateTarget>[2],\n value,\n dependencyValues,\n );\n if (issue) {\n return makeValidationError(issue.errorCode, issue.message);\n }\n }\n }\n return { valid: true };\n}\n\nfunction dependencyValuesForCollector(\n collector: InputCollector,\n params: Record<string, unknown>,\n): Readonly<Record<string, unknown>> | undefined {\n const dependencies = collector.dependsOn ?? [];\n if (dependencies.length === 0) return undefined;\n return Object.fromEntries(\n dependencies.map((dependencyKey) => [dependencyKey, params[dependencyKey]]),\n );\n}\n\nfunction valuesForCollectorValidation(\n selection: InputSelectionDescriptor | undefined,\n value: unknown,\n): readonly unknown[] {\n if (selection?.mode === \"many\") {\n return Array.isArray(value) ? value : [];\n }\n return [value];\n}\n\nfunction validateCollectorSelection(\n collector: InputCollector,\n value: unknown,\n): { errorCode: string; message?: string } | null {\n const selection = collector.selection;\n if (selection?.mode !== \"many\") return null;\n if (!Array.isArray(value)) return null;\n if (value.length < selection.min) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at least ${selection.min} value${selection.min === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.max !== undefined && value.length > selection.max) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at most ${selection.max} value${selection.max === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.distinct) {\n const seen = new Set<string>();\n for (const item of value) {\n const key = stableValueKey(item);\n if (seen.has(key)) {\n return {\n errorCode: \"DUPLICATE_INPUT_VALUE\",\n message: \"Input values must be distinct.\",\n };\n }\n seen.add(key);\n }\n }\n return null;\n}\n\nfunction stableValueKey(value: unknown): string {\n if (value === null) return \"null\";\n switch (typeof value) {\n case \"string\":\n return `string:${value}`;\n case \"number\":\n case \"boolean\":\n case \"undefined\":\n return `${typeof value}:${String(value)}`;\n default:\n return `json:${JSON.stringify(value)}`;\n }\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { InteractionActorAuthorization } from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n} from \"./simultaneous-player\";\n\nfunction resolvePromptToSet<PlayerId extends string>(\n to: unknown,\n): ReadonlySet<PlayerId> {\n if (to === undefined || to === null) return new Set();\n if (Array.isArray(to)) {\n return new Set(to as PlayerId[]);\n }\n if (typeof to === \"string\") {\n return new Set([to as PlayerId]);\n }\n return new Set();\n}\n\nexport function createInteractionAuthorization<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInteractionActorAuthorization(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): InteractionActorAuthorization<PlayerId> {\n if (interaction.to) {\n const resolved = interaction.to({\n ...scope.buildContext(state),\n state: projection?.domainState ?? scope.toDomainState(state),\n });\n return {\n mode: \"addressees\",\n addressees: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n if (interaction.actor) {\n const resolved = interaction.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n const phase = scope.phaseByName(state.flow.currentPhase as PhaseName);\n if (isSimultaneousPhase(phase)) {\n return {\n mode: \"actors\",\n actors: new Set(\n resolveSimultaneousActors(scope, state, phase, projection),\n ),\n };\n }\n if (phase.actor) {\n const resolved = phase.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n return { mode: \"active\" };\n }\n\n function isActorAuthorized(\n state: State,\n playerId: PlayerId,\n authorization: InteractionActorAuthorization<PlayerId>,\n ): boolean {\n if (authorization.mode === \"addressees\") {\n return authorization.addressees.has(playerId);\n }\n if (authorization.mode === \"actors\") {\n return authorization.actors.has(playerId);\n }\n const active = state.flow.activePlayers as readonly PlayerId[];\n if (active.length === 0) {\n return true;\n }\n return active.includes(playerId);\n }\n\n function isInteractionVisible(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n authorization: InteractionActorAuthorization<PlayerId>,\n authorized: boolean,\n ): boolean {\n return (\n !(authorization.mode === \"addressees\" && !authorized) &&\n !(interaction.visibility === \"actorsOnly\" && !authorized)\n );\n }\n\n return {\n isActorAuthorized,\n isInteractionVisible,\n resolveInteractionActorAuthorization,\n };\n}\n","import { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n BoardTargetDomainDescriptor,\n CardTargetDomainDescriptor,\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n ManifestContract,\n TableOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { InteractionInputDescriptorShape } from \"./interaction-types\";\nimport {\n collectTargetDomainMetadata,\n interactionInputsOf,\n} from \"./collector-introspection\";\nimport {\n collectEligibleTargets,\n type CollectorProjectionOptions,\n} from \"./collector-eligibility\";\n\nconst MAX_EAGER_DEPENDENT_DOMAIN_CASES = 64;\n\nfunction withSelection(\n domain: InputDomainDescriptor,\n collector: InputCollector,\n): InputDomainDescriptor {\n if (!collector.selection) return domain;\n return { ...domain, selection: collector.selection };\n}\n\nfunction lazyTargetDomainFromCollectorMetadata(\n key: string,\n collector: InputCollector,\n dependencies: readonly string[],\n): CardTargetDomainDescriptor | BoardTargetDomainDescriptor | null {\n const metadata = collectTargetDomainMetadata(collector);\n if (collector.kind === \"card\") {\n return withSelection(\n {\n type: \"cardTarget\",\n projection: \"lazy\",\n targetKind: \"card\",\n zoneIds:\n metadata.zoneIds ??\n (metadata.zoneId === undefined ? [] : [metadata.zoneId]),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n },\n collector,\n ) as CardTargetDomainDescriptor;\n }\n if (\n collector.kind === \"board-edge\" ||\n collector.kind === \"board-space\" ||\n collector.kind === \"board-tile\" ||\n collector.kind === \"board-vertex\"\n ) {\n return withSelection(\n {\n type: \"boardTarget\",\n projection: \"lazy\",\n targetKind: (metadata.targetKind ??\n collector.kind.replace(\"board-\", \"\")) as\n | \"edge\"\n | \"vertex\"\n | \"space\"\n | \"tile\",\n boardId: metadata.boardId ?? \"\",\n ...(metadata.valueKind ? { valueKind: metadata.valueKind } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n },\n collector,\n ) as BoardTargetDomainDescriptor;\n }\n return null;\n}\n\nfunction finiteValuesForDependency(\n key: string,\n domain: InputDomainDescriptor | undefined,\n): string[] {\n if (!domain) {\n throw new Error(\n `Interaction input '${key}' is declared as a dependency before it has a projected domain.`,\n );\n }\n if (domain.type === \"cardTarget\" || domain.type === \"boardTarget\") {\n if (domain.projection !== \"resolved\") {\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency because its target domain is not finite.`,\n );\n }\n return [...domain.eligibleTargets];\n }\n if (domain.type === \"choice\") {\n return domain.choices.flatMap((choice) =>\n choice.value === null ? [] : [choice.value],\n );\n }\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency. V1 supports finite target and choice dependencies only.`,\n );\n}\n\nfunction cartesianDependencyTuples(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): Array<Record<string, string>> {\n return dependencies.reduce<Array<Record<string, string>>>(\n (tuples, key) => {\n const values = finiteValuesForDependency(key, domainsByKey[key]);\n return tuples.flatMap((tuple) =>\n values.map((value) => ({ ...tuple, [key]: value })),\n );\n },\n [{}],\n );\n}\n\nfunction withoutDependentProjection(\n domain: InputDomainDescriptor,\n): InputDomainDescriptor {\n const rest = { ...domain } as InputDomainDescriptor & {\n dependencies?: unknown;\n };\n delete rest.dependencies;\n return rest as InputDomainDescriptor;\n}\n\nfunction toLazyTargetDomain(\n key: string,\n domain: InputDomainDescriptor,\n dependencies: readonly string[],\n): CardTargetDomainDescriptor | BoardTargetDomainDescriptor | null {\n if (domain.type === \"cardTarget\") {\n return {\n type: \"cardTarget\",\n projection: \"lazy\",\n targetKind: \"card\",\n zoneIds: domain.zoneIds,\n ...(domain.selection ? { selection: domain.selection } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n };\n }\n if (domain.type === \"boardTarget\") {\n return {\n type: \"boardTarget\",\n projection: \"lazy\",\n targetKind: domain.targetKind,\n boardId: domain.boardId,\n ...(domain.valueKind ? { valueKind: domain.valueKind } : {}),\n ...(domain.selection ? { selection: domain.selection } : {}),\n dependencies: {\n mode: \"lazy\",\n dependsOn: dependencies,\n resolver: { inputKey: key },\n },\n };\n }\n return null;\n}\n\nfunction dependencyCaseCount(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): number {\n return dependencies\n .map((key) => finiteValuesForDependency(key, domainsByKey[key]).length)\n .reduce((total, count) => total * count, 1);\n}\n\nfunction unsupportedDefaultInputError(key: string, collector: InputCollector) {\n return new Error(\n `Interaction input '${key}' uses a '${collector.kind}' collector without a default-renderable domain or target metadata. ` +\n \"Use formInput.choice(...), formInput.choiceList(...), formInput.number(...), formInput.resourceMap(...), cardInput(...), or boardInput(...). \" +\n \"For custom payloads, use a custom interaction surface with paramsSchema instead of the default InteractionForm.\",\n );\n}\n\nexport function collectInputDomains<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n eligibleTargets: Record<string, string[]>,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, InputDomainDescriptor> {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n const result: Record<string, InputDomainDescriptor> = {};\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") {\n continue;\n }\n if (collector.kind === \"prompt\") {\n const optionFactory = collector.meta?.options;\n if (!optionFactory) continue;\n result[key] = {\n type: \"choice\",\n choices: optionFactory(domainState, playerId, queries() as unknown).map(\n (option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n ...(() => {\n const issue = collector.validateTarget?.(\n domainState,\n playerId,\n queries() as unknown,\n String(option.id),\n );\n return issue\n ? {\n disabled: true,\n disabledReason: issue.message ?? issue.errorCode,\n }\n : {};\n })(),\n }),\n ),\n };\n continue;\n }\n if (collector.domain) {\n const domainProjector = collector.domain;\n const dependencies = collector.dependsOn ?? [];\n if (\n options.includeEligibleTargets === false &&\n !Object.prototype.hasOwnProperty.call(eligibleTargets, key)\n ) {\n const lazyDomain = lazyTargetDomainFromCollectorMetadata(\n key,\n collector,\n dependencies,\n );\n if (lazyDomain) {\n result[key] = lazyDomain;\n continue;\n }\n }\n const baseDomain = withSelection(\n domainProjector(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n {},\n ),\n collector,\n );\n if (dependencies.length === 0) {\n result[key] = baseDomain;\n continue;\n }\n const caseCount = dependencyCaseCount(dependencies, result);\n const lazyDomain =\n caseCount > MAX_EAGER_DEPENDENT_DOMAIN_CASES\n ? toLazyTargetDomain(key, baseDomain, dependencies)\n : null;\n if (lazyDomain) {\n result[key] = lazyDomain;\n continue;\n }\n const dependentCases = cartesianDependencyTuples(\n dependencies,\n result,\n ).map((values) => ({\n when: values,\n domain: withoutDependentProjection(\n withSelection(\n domainProjector(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n values,\n ),\n collector,\n ),\n ),\n }));\n result[key] = {\n ...baseDomain,\n dependencies: {\n mode: \"eager\",\n dependentCases,\n },\n } as InputDomainDescriptor;\n continue;\n }\n throw unsupportedDefaultInputError(key, collector);\n }\n return result;\n}\n\nexport function collectInteractionInputs<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): InteractionInputDescriptorShape[] {\n const collectors = interactionInputsOf(interaction);\n const dependencyKeys = new Set(\n Object.values(collectors).flatMap((collector) => [\n ...(collector.dependsOn ?? []),\n ]),\n );\n const collectedEligibleTargets =\n options.includeEligibleTargets === false && dependencyKeys.size === 0\n ? {}\n : collectEligibleTargets(interaction, domainState, playerId, options);\n const eligibleTargets =\n options.includeEligibleTargets === false\n ? Object.fromEntries(\n Object.entries(collectedEligibleTargets).filter(([key]) =>\n dependencyKeys.has(key),\n ),\n )\n : collectedEligibleTargets;\n const domainsByKey = collectInputDomains(\n interaction,\n domainState,\n playerId,\n eligibleTargets,\n options,\n );\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n return Object.entries(collectors).flatMap(([key, collector]) => {\n if (collector.kind === \"rng\") {\n return [];\n }\n const domain = domainsByKey[key];\n if (!domain && collector.kind === \"prompt\") {\n return [];\n }\n if (!domain) {\n throw unsupportedDefaultInputError(key, collector);\n }\n const dynamicDefault = collector.resolveDefaultValue?.(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n domain,\n );\n const defaultValue =\n \"defaultValue\" in collector ? collector.defaultValue : dynamicDefault;\n warnConcreteDependentChoiceDefault({\n inputKey: key,\n collector,\n domain,\n defaultValue,\n dependencyKeys,\n options,\n });\n return [\n {\n key,\n kind: collector.kind,\n domain,\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n },\n ];\n });\n}\n\nconst concreteDependentChoiceDefaultWarnings = new Set<string>();\n\nfunction warnConcreteDependentChoiceDefault({\n inputKey,\n collector,\n domain,\n defaultValue,\n dependencyKeys,\n options,\n}: {\n inputKey: string;\n collector: InputCollector;\n domain: InputDomainDescriptor;\n defaultValue: unknown;\n dependencyKeys: ReadonlySet<string>;\n options: CollectorProjectionOptions<CollectorState>;\n}): void {\n if (\n !options.diagnostics ||\n !dependencyKeys.has(inputKey) ||\n collector.kind !== \"form\" ||\n domain.type !== \"choice\" ||\n defaultValue === undefined ||\n defaultValue === null\n ) {\n return;\n }\n\n const warningKey = `${inputKey}:${String(defaultValue)}`;\n if (concreteDependentChoiceDefaultWarnings.has(warningKey)) {\n return;\n }\n concreteDependentChoiceDefaultWarnings.add(warningKey);\n options.diagnostics.event({\n type: \"authoringWarning\",\n code: \"dependent-choice-concrete-default\",\n message: `Form choice input \"${inputKey}\" feeds another collector and defaulted to \"${String(\n defaultValue,\n )}\". Dependent choices that select the object an action applies to should usually use defaultValue: () => undefined so collection stays explicit.`,\n });\n}\n\nexport function collectPromptOptions(\n interaction: {\n inputs: Record<string, InputCollector>;\n },\n domainState: unknown,\n playerId: string,\n queries: unknown,\n): Array<{ id: string; label?: string }> | undefined {\n for (const collector of Object.values(interaction.inputs)) {\n if (collector.kind !== \"prompt\") continue;\n const factory = collector.meta?.options;\n if (!factory) continue;\n return factory(domainState, playerId, queries).map((option) => ({\n id: String(option.id),\n ...(option.label !== undefined ? { label: option.label } : {}),\n }));\n }\n return undefined;\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectCardZoneIds,\n collectFirstCardZoneId,\n interactionInputsOf,\n} from \"./collector-introspection\";\nimport {\n collectInteractionInputs,\n collectPromptOptions,\n} 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 deriveInteractionKind(\n inputs: Record<string, InputCollector>,\n): \"action\" | \"prompt\" {\n for (const collector of Object.values(inputs)) {\n if (collector.kind === \"prompt\") {\n return \"prompt\";\n }\n }\n return \"action\";\n}\n\nfunction isTargetCollector(collector: InputCollector): boolean {\n switch (collector.kind) {\n case \"card\":\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isManyCollector(collector: InputCollector): boolean {\n return collector.selection?.mode === \"many\";\n}\n\nfunction terminalCollectorsForInputs(\n inputs: Record<string, InputCollector>,\n): InputCollector[] {\n const terminalKeys = new Set(Object.keys(inputs));\n for (const collector of Object.values(inputs)) {\n for (const dependencyKey of collector.dependsOn ?? []) {\n terminalKeys.delete(dependencyKey);\n }\n }\n const collectors: InputCollector[] = [];\n for (const key of terminalKeys) {\n const collector = inputs[key];\n if (collector) collectors.push(collector);\n }\n return collectors;\n}\n\nfunction deriveCommitPolicy(\n inputs: Record<string, InputCollector>,\n explicit: InteractionDescriptorShape[\"commit\"] | undefined,\n): InteractionDescriptorShape[\"commit\"] {\n const collectors = Object.values(inputs);\n const hasManyCollector = collectors.some(isManyCollector);\n if (explicit) {\n if (explicit.mode === \"autoWhenReady\" && hasManyCollector) {\n throw new Error(\n 'Interactions with many(...) inputs must use commit: { mode: \"manual\" }.',\n );\n }\n return explicit;\n }\n if (hasManyCollector) {\n return { mode: \"manual\" };\n }\n if (collectors.length === 0 || !collectors.some(isTargetCollector)) {\n return { mode: \"manual\" };\n }\n const terminalCollectors = terminalCollectorsForInputs(inputs);\n if (terminalCollectors.length === 0) {\n return { mode: \"manual\" };\n }\n return terminalCollectors.every(\n (collector) => isTargetCollector(collector) || collector.kind === \"rng\",\n ) && terminalCollectors.some(isTargetCollector)\n ? { mode: \"autoWhenReady\" }\n : { mode: \"manual\" };\n}\n\nfunction projectInteractionMetadata(interaction: {\n inputs: Record<string, InputCollector>;\n commit?: InteractionDescriptorShape[\"commit\"];\n 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: deriveInteractionKind(interaction.inputs),\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 \"INSUFFICIENT_RESOURCES\":\n if (decision.missingResources) {\n return {\n status: \"insufficientResources\",\n reason: decision.message ?? decision.code,\n missingResources: { ...decision.missingResources },\n };\n }\n return {\n status: \"blocked\",\n reason: decision.message ?? decision.code,\n code: decision.code,\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 Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n state: TrustedState<Contract>,\n playerId: TrustedPlayerId<Contract>,\n interactionId: TrustedInteractionId<Contract, Definitions, Views>,\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >,\n decision: InteractionDecision,\n options: {\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >;\n includeEligibleTargets?: boolean;\n includeDiagnosticReasons?: boolean;\n } = {},\n): TrustedInteractionDescriptorShape<Contract, Definitions, Views> {\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n const domainState =\n options.projection?.domainState ?? scope.toDomainState(state);\n const phaseName = state.flow.currentPhase as PhaseName;\n const interactionInputs = interactionInputsOf(interaction);\n const metadata = projectInteractionMetadata({\n ...interaction,\n inputs: interactionInputs,\n interactionId: String(interactionId),\n });\n const queries = options.projection?.q ?? createStateQueries(domainState);\n const derived = options.projection?.derived;\n const shouldMaterializeInputDomains =\n decision.available || decision.code !== FrameworkErrorCodes.NOT_YOUR_TURN;\n const promptContext =\n metadata.kind === \"prompt\"\n ? {\n to: playerId,\n title: metadata.label,\n options: shouldMaterializeInputDomains\n ? collectPromptOptions(\n { inputs: interactionInputs },\n domainState,\n playerId as unknown as string,\n queries,\n )\n : undefined,\n }\n : undefined;\n const inputs = shouldMaterializeInputDomains\n ? enrichResourceInputPresentation(\n collectInteractionInputs(interaction, domainState, playerId, {\n queries,\n derived,\n eligibleTargetCache: options.projection?.eligibleTargets,\n eligibleTargetCachePrefix: `${phaseName}:${String(\n interactionId,\n )}:${String(playerId)}`,\n includeEligibleTargets: options.includeEligibleTargets,\n diagnostics: scope.diagnostics,\n }),\n scope.definition.contract.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(interaction),\n zoneIds: collectCardZoneIds(interaction),\n inputs,\n cost: decision.cost ? { ...decision.cost } : undefined,\n currentResources: decision.cost\n ? {\n ...(queries.player.resources(playerId) as\n | Record<string, number>\n | undefined),\n }\n : undefined,\n availability: interactionAvailabilityFromDecision(decision),\n reasons:\n options.includeDiagnosticReasons && !decision.available && decision.ruleId\n ? [{ ruleId: decision.ruleId, errorCode: decision.code }]\n : undefined,\n };\n if (metadata.kind === \"prompt\") {\n return {\n ...baseDescriptor,\n kind: \"prompt\",\n context: promptContext ?? {\n to: playerId,\n title: humanizeInteractionId(interactionId),\n },\n } as Descriptor;\n }\n return {\n ...baseDescriptor,\n kind: \"action\",\n } as Descriptor;\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport { FrameworkErrorCodes } from \"../../model\";\nimport {\n parseInteractionParams,\n prepareInteractionProjectionParams,\n validateCollectorTargets,\n} from \"./collector-params\";\nimport { buildInteractionDescriptor } from \"./interaction-descriptor\";\nimport type { createInteractionAuthorization } from \"./interaction-authorization\";\nimport type { createStageResolver } from \"./stage-resolver\";\nimport {\n makeValidationError,\n type InteractionDecision,\n type InteractionDiagnosticsMode,\n type InteractionExplanation,\n type InteractionDecisionResult,\n type ResolveDecisionInput,\n type TrustedInteractionDescriptorShape,\n type TrustedInteractionId,\n} from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype StageResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createStageResolver<Contract, Definitions, Views>>;\n\ntype AuthorizationFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n typeof createInteractionAuthorization<Contract, Definitions, Views>\n>;\n\ntype InteractionRuleIssue = {\n ruleId: string;\n errorCode: string;\n message?: string;\n};\n\ntype RuleValidationIssue = {\n errorCode: string;\n message?: string;\n};\n\nfunction domainEligibleCount(domain: unknown): number | \"lazy\" {\n if (!domain || typeof domain !== \"object\") return \"lazy\";\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 \"lazy\";\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 Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n stages: StageResolverFor<Contract, Definitions, Views>,\n authorization: AuthorizationFor<Contract, Definitions, Views>,\n options: { diagnostics?: InteractionDiagnosticsMode } = {},\n) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type InteractionId = TrustedInteractionId<Contract, Definitions, Views>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n\n 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 evaluateInteractionCost(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n playerId: PlayerId,\n params: Record<string, unknown>,\n projection?: ProjectionContext<DomainState, State>,\n ):\n | { cost?: Record<string, number>; missing?: Record<string, number> }\n | { error: unknown } {\n if (!interaction.cost) {\n return {};\n }\n const args = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId, params },\n },\n projection,\n );\n try {\n const cost = { ...interaction.cost(args) };\n const typedCost = cost as Parameters<typeof args.q.player.canAfford>[1];\n const missing = args.q.player.canAfford(playerId, typedCost)\n ? {}\n : { ...args.q.player.missingResources(playerId, typedCost) };\n return { cost, missing };\n } catch (error) {\n return { error };\n }\n }\n\n function resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params = {},\n mode,\n projection,\n }: ResolveDecisionInput<Contract>): InteractionDecisionResult<\n Contract,\n Definitions,\n Views\n > {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) {\n return {\n found: false,\n validation: makeValidationError(\n \"unsupported-action\",\n `Interaction '${interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n ),\n };\n }\n const trustedInteractionId = interactionId as InteractionId;\n\n const parseForSubmit = mode === \"submit\";\n const parsed = parseForSubmit\n ? parseInteractionParams(interaction, params, {\n skipRng: true,\n playerId,\n })\n : ({\n ok: true,\n params: prepareInteractionProjectionParams(interaction, params),\n } as const);\n if (!parsed.ok) {\n 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, includeEligibleTargets: false },\n ),\n validation: makeValidationError(\n \"invalid-action-params\",\n parsed.message,\n ),\n };\n }\n\n const phase = scope.phaseByName(phaseName);\n const isSimultaneousSubmit =\n isSimultaneousPhase(phase) &&\n interactionId === SIMULTANEOUS_SUBMIT_INTERACTION_ID;\n const alreadySubmitted =\n isSimultaneousSubmit &&\n state.runtime.simultaneous?.current?.phaseName === phaseName &&\n Boolean(state.runtime.simultaneous.current.submissions[playerId]);\n const canResubmit =\n isSimultaneousSubmit &&\n (phase as { canResubmit?: boolean }).canResubmit === true;\n\n const actorAuthorization =\n authorization.resolveInteractionActorAuthorization(\n state,\n interaction,\n projection,\n );\n const authorized = authorization.isActorAuthorized(\n state,\n playerId,\n actorAuthorization,\n );\n let visible = authorization.isInteractionVisible(\n interaction,\n actorAuthorization,\n authorized,\n );\n if (alreadySubmitted && !canResubmit && mode !== \"submit\") {\n visible = false;\n }\n const stageAllow = stages.resolveActiveStageAllowlist(\n state,\n phaseName,\n projection,\n );\n const stageAllowed = !stageAllow || stageAllow.has(interactionId);\n const stepAllowed = stages.isInteractionAllowedInStep(\n state,\n interaction,\n projection,\n );\n\n let validation: ReducerValidationResult = { valid: true };\n if (!authorized) {\n validation =\n actorAuthorization.mode === \"addressees\"\n ? makeValidationError(\n \"prompt-not-owned\",\n `Interaction '${interactionId}' is not addressed to '${playerId}'.`,\n )\n : makeValidationError(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${interactionId}').`,\n );\n } else if (alreadySubmitted && !canResubmit) {\n validation = makeValidationError(\n \"ALREADY_SUBMITTED\",\n `Interaction '${interactionId}' has already been submitted by '${playerId}'.`,\n );\n } else if (!stageAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current stage.`,\n );\n } else if (!stepAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current step.`,\n );\n }\n\n const canEvaluateProjectionDetails =\n mode !== \"submit\" && visible && authorized && stageAllowed && stepAllowed;\n const canContinueSubmitValidation = mode === \"submit\" && validation.valid;\n let cost: Record<string, number> | undefined;\n let missingResources: Record<string, number> | undefined;\n let costAffordable = true;\n if (canContinueSubmitValidation || canEvaluateProjectionDetails) {\n const costDecision = evaluateInteractionCost(\n state,\n interaction,\n playerId,\n parsed.params,\n projection,\n );\n if (\"error\" in costDecision) {\n costAffordable = false;\n validation = makeValidationError(\n \"cost-unavailable\",\n `Interaction '${interactionId}' cost could not be evaluated.`,\n );\n } else {\n cost = costDecision.cost ?? undefined;\n missingResources = costDecision.missing ?? undefined;\n costAffordable =\n !missingResources ||\n Object.values(missingResources).every((amount) => amount <= 0);\n if (!costAffordable) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n \"INSUFFICIENT_RESOURCES\",\n `Interaction '${interactionId}' cannot be afforded.`,\n );\n }\n }\n }\n }\n\n let ruleAvailabilityIssue: InteractionRuleIssue | undefined;\n if (\n (canContinueSubmitValidation || canEvaluateProjectionDetails) &&\n interaction.rules\n ) {\n const availabilityArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId },\n },\n projection,\n );\n for (const rule of interaction.rules) {\n if (!rule.available) continue;\n if (!rule.available(availabilityArgs)) {\n ruleAvailabilityIssue = issueFromRule({\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 let authoredValidation:\n | {\n ruleId: string;\n errorCode: string;\n message?: string;\n }\n | undefined;\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n if (validation.valid && mode === \"submit\") {\n validation = validateCollectorTargets(\n interaction,\n projection?.domainState ?? scope.toDomainState(state),\n playerId,\n parsed.params,\n );\n }\n }\n\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n const validateArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: {\n playerId,\n params: parsed.params,\n },\n },\n projection,\n );\n for (const rule of interaction.rules ?? []) {\n if (!rule.validate) continue;\n authoredValidation = issueFromRuleValidationResult(\n {\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 available =\n stageAllowed &&\n stepAllowed &&\n authorized &&\n !ruleAvailabilityIssue &&\n costAffordable &&\n !authoredValidation;\n const descriptorDecision: InteractionDecision = available\n ? { available: true, cost }\n : !authorized\n ? {\n available: false,\n code: FrameworkErrorCodes.NOT_YOUR_TURN,\n message: \"Not your turn\",\n cost,\n }\n : !stageAllowed\n ? {\n available: false,\n code: FrameworkErrorCodes.WRONG_PHASE,\n message: \"Interaction not allowed in current stage\",\n cost,\n }\n : !stepAllowed\n ? {\n available: false,\n code: FrameworkErrorCodes.WRONG_STEP,\n message: \"Interaction not allowed in current step\",\n cost,\n }\n : ruleAvailabilityIssue\n ? {\n available: false,\n code: ruleAvailabilityIssue.errorCode,\n ruleId: ruleAvailabilityIssue.ruleId,\n message:\n ruleAvailabilityIssue.message ??\n ruleAvailabilityIssue.errorCode,\n cost,\n }\n : !costAffordable\n ? {\n available: false,\n code: \"INSUFFICIENT_RESOURCES\",\n message: \"INSUFFICIENT_RESOURCES\",\n cost,\n missingResources,\n }\n : authoredValidation\n ? {\n available: false,\n code: authoredValidation.errorCode,\n ruleId: authoredValidation.ruleId,\n message:\n authoredValidation.message ?? \"Interaction unavailable\",\n cost,\n }\n : {\n available: false,\n code: \"action-unavailable\",\n message: \"Interaction unavailable\",\n cost,\n };\n const descriptor = buildInteractionDescriptor(\n scope,\n state,\n playerId,\n trustedInteractionId,\n interaction,\n descriptorDecision,\n {\n projection,\n includeEligibleTargets: available || mode === \"card\",\n includeDiagnosticReasons: options.diagnostics === \"verbose\",\n },\n );\n return {\n found: true,\n interaction,\n parsedParams: parsed.params,\n visible,\n descriptor,\n validation,\n };\n }\n\n function resolveAvailableInteractionsFor(\n state: State,\n playerId: PlayerId,\n options: { projection?: ProjectionContext<DomainState, State> } = {},\n ) {\n const phaseName = state.flow.currentPhase as PhaseName;\n const descriptors: Descriptor[] = [];\n for (const [interactionId] of scope.interactionEntriesForPhase(phaseName)) {\n const decision = resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params: {},\n mode: \"descriptor\",\n projection: options.projection,\n });\n if (!decision.found || !decision.visible) continue;\n descriptors.push(decision.descriptor);\n }\n return descriptors;\n }\n\n function explainInteraction(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n projection?: ProjectionContext<DomainState, State>;\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 === \"addressees\"\n ? [...actorAuthorization.addressees]\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 : decision.found &&\n decision.descriptor.availability.status ===\n \"insufficientResources\"\n ? {\n available: false,\n code: \"INSUFFICIENT_RESOURCES\",\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 =\n authorized &&\n stages.isInteractionAllowedInStep(state, interaction, projection);\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 includeEligibleTargets: true,\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: domainEligibleCount(entry.domain),\n })),\n };\n }\n\n return {\n evaluateInteractionCost,\n explainInteraction,\n resolveAvailableInteractionsFor,\n resolveInteractionDecision,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n StageSpec,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport function createStageResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n\n function resolveActiveStage(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): { id: string; stage: StageSpec<DomainState, Manifest> } | null {\n const stages = scope.stagesForPhase(phaseName);\n if (stages.length === 0) return null;\n const domainState = projection?.domainState ?? scope.toDomainState(state);\n const context = scope.buildContext(state);\n for (const [stageId, stage] of stages) {\n const matches = stage.when\n ? stage.when({\n ...context,\n state: domainState,\n })\n : true;\n if (matches) return { id: stageId, stage };\n }\n return null;\n }\n\n function resolveActiveStageAllowlist(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): Set<string> | null {\n const cacheKey = String(phaseName);\n if (projection?.stageAllowlists.has(cacheKey)) {\n return projection.stageAllowlists.get(cacheKey) ?? null;\n }\n const activeStage = resolveActiveStage(state, phaseName, projection);\n const allowlist = activeStage ? new Set(activeStage.stage.allow) : null;\n projection?.stageAllowlists.set(cacheKey, allowlist);\n return allowlist;\n }\n\n function isInteractionAllowedInStep(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): boolean {\n const allowedSteps = interaction.__steps ?? [];\n if (allowedSteps.length === 0) {\n return true;\n }\n const currentStep = (\n (projection?.domainState ?? scope.toDomainState(state)).phase as {\n step?: unknown;\n }\n ).step;\n return (\n typeof currentStep === \"string\" && allowedSteps.includes(currentStep)\n );\n }\n\n return {\n isInteractionAllowedInStep,\n resolveActiveStage,\n resolveActiveStageAllowlist,\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerReject,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport { collectEligibleTargets } from \"./collector-eligibility\";\nimport {\n collectFirstCardZoneId,\n findCardInputKey,\n findCardInputKeyForZone,\n} from \"./collector-introspection\";\nimport { parseInteractionParams } from \"./collector-params\";\nimport { createInteractionAuthorization } from \"./interaction-authorization\";\nimport { createInteractionDecisionResolver } from \"./interaction-decision\";\nimport { createStageResolver } from \"./stage-resolver\";\nimport {\n rejectResult,\n type TrustedInput,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\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 Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n options: { diagnostics?: InteractionDiagnosticsMode } = {},\n) {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const stages = createStageResolver(scope);\n const authorization = createInteractionAuthorization(scope);\n const decisions = createInteractionDecisionResolver(\n scope,\n stages,\n authorization,\n options,\n );\n\n function validateClientInput(\n state: State,\n input: ReducerInput,\n ): ReducerValidationResult {\n if (input.kind === \"interaction\") {\n const decision = decisions.resolveInteractionDecision({\n state,\n playerId: input.playerId as PlayerId,\n interactionId: input.interactionId,\n params: (input.params ?? {}) as Record<string, unknown>,\n mode: \"submit\",\n });\n return decision.validation;\n }\n return { valid: true };\n }\n\n function validateOrReject(\n state: State,\n input: ReducerInput,\n ): ReducerReject | null {\n const validation = validateClientInput(state, input);\n if (validation.valid) {\n return null;\n }\n const invalidValidation = validation as Exclude<\n ReducerValidationResult,\n { valid: true }\n >;\n return rejectResult(invalidValidation.errorCode, invalidValidation.message);\n }\n\n return {\n collectEligibleTargets,\n collectFirstCardZoneId,\n evaluateInteractionCost: decisions.evaluateInteractionCost,\n explainInteraction: decisions.explainInteraction,\n findCardInputKey,\n findCardInputKeyForZone,\n isActorAuthorized: authorization.isActorAuthorized,\n isInteractionAllowedInStep: stages.isInteractionAllowedInStep,\n parseInteractionParams,\n resolveActiveStage: stages.resolveActiveStage,\n resolveActiveStageAllowlist: stages.resolveActiveStageAllowlist,\n resolveAvailableInteractionsFor: decisions.resolveAvailableInteractionsFor,\n resolveInteractionActorAuthorization:\n authorization.resolveInteractionActorAuthorization,\n resolveInteractionDecision: decisions.resolveInteractionDecision,\n validateClientInput,\n validateOrReject,\n };\n}\n","import { safeParseOrThrow } from \"../../parse-utils\";\nimport { applySetupBootstrap } from \"../../setup-bootstrap\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n ExactManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeSetupSelection,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../../model\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport { isPerPlayer } from \"../../per-player\";\nimport { normalizeResult } from \"./runtime-scope\";\nimport { createMutableRandomHelpers } from \"./rng-sampler\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type {\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createLifecycleRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type ExactManifest = ExactManifestContractOf<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveSelectedSetup(\n setup: RuntimeSetupSelectionInput<Manifest> | null | undefined,\n ): State[\"runtime\"][\"setup\"] {\n if (!setup) {\n return null;\n }\n const manifestProfile = scope.manifestSetupProfilesById[setup.profileId];\n if (!manifestProfile) {\n throw new Error(`Unknown setup profile '${setup.profileId}'.`);\n }\n const resolvedOptionValues: Record<string, string | null> =\n Object.fromEntries(\n scope.definition.contract.manifest.literals.setupOptionIds.map(\n (optionId: string) => [optionId, null] as const,\n ),\n );\n\n for (const [optionId, choiceId] of Object.entries(\n manifestProfile.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId;\n }\n for (const [optionId, choiceId] of Object.entries(\n setup.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId ?? null;\n }\n\n return {\n profileId: setup.profileId,\n optionValues:\n resolvedOptionValues as RuntimeSetupSelection<Manifest>[\"optionValues\"],\n };\n }\n\n function resolveInitialPhase(setup: State[\"runtime\"][\"setup\"]): PhaseName {\n const setupProfile = setup\n ? scope.reducerSetupProfiles[setup.profileId]\n : null;\n const resolvedPhase = (setupProfile?.initialPhase ??\n scope.defaultInitialPhase ??\n scope.phaseEntries[0]?.[0]) as PhaseName | undefined;\n if (!resolvedPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n if (!scope.definition.phases[resolvedPhase]) {\n throw new Error(`Unknown initial phase '${resolvedPhase}'.`);\n }\n return resolvedPhase;\n }\n\n function applySelectedSetupBootstrap(state: State): State {\n const setup = state.runtime.setup;\n if (!setup) {\n return state;\n }\n\n const bootstrap = scope.reducerSetupProfiles[setup.profileId]?.bootstrap;\n if (!bootstrap || bootstrap.length === 0) {\n return state;\n }\n\n return applySetupBootstrap(state, bootstrap) as State;\n }\n\n function initPhaseState(\n state: State,\n phaseName: PhaseName,\n playerIds: PlayerId[],\n ): State {\n const phase = scope.phaseByName(phaseName);\n const phaseState = phase.initialState\n ? phase.initialState({\n manifest: scope.definition.contract.manifest,\n state,\n playerIds,\n setup: state.runtime.setup,\n })\n : safeParseOrThrow(phase.state, {}, `phase:${phaseName}:initialState`);\n return {\n ...state,\n phase: safeParseOrThrow(\n phase.state,\n phaseState,\n `phase:${phaseName}`,\n ) as State[\"phase\"],\n flow: {\n ...state.flow,\n currentPhase: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n };\n }\n\n function enterPhase({\n state,\n phaseName,\n playerIds,\n event,\n }: {\n state: State;\n phaseName: PhaseName;\n playerIds: PlayerId[];\n event: \"initialize\" | \"transition\";\n }): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n const workingState = initPhaseState(state, phaseName, playerIds);\n const phase = scope.phaseByName(phaseName);\n let nextState: State = workingState;\n const instructions: RuntimeInstructionForState<State>[] = [];\n if (phase.enter) {\n const random = createMutableRandomHelpers(workingState.runtime.rng);\n const entered = normalizeResult(\n phase.enter(\n scope.buildRuntimeArgs(\n workingState,\n {\n event,\n state: scope.toDomainState(workingState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(workingState),\n );\n if (entered.type === \"reject\") {\n throw new Error(\n entered.message ??\n (event === \"initialize\"\n ? `Reducer phase '${phaseName}' rejected during initialization.`\n : `Reducer phase '${phaseName}' rejected during phase initialization.`),\n );\n }\n nextState = {\n ...entered.state,\n runtime: { ...workingState.runtime, rng: random.currentRng() },\n } as State;\n if (entered.instructions) instructions.push(...entered.instructions);\n }\n\n const activeStage = interactions.resolveActiveStage(nextState, phaseName);\n if (activeStage?.stage.onEnter) {\n const random = createMutableRandomHelpers(nextState.runtime.rng);\n const stageEntered = normalizeResult(\n activeStage.stage.onEnter(\n scope.buildRuntimeArgs(\n nextState,\n {\n event,\n state: scope.toDomainState(nextState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(nextState),\n );\n if (stageEntered.type === \"reject\") {\n throw new Error(\n stageEntered.message ??\n (event === \"initialize\"\n ? `Reducer stage '${phaseName}.${activeStage.id}' rejected during initialization.`\n : `Reducer stage '${phaseName}.${activeStage.id}' rejected during stage initialization.`),\n );\n }\n nextState = {\n ...stageEntered.state,\n runtime: { ...nextState.runtime, rng: random.currentRng() },\n } as State;\n if (stageEntered.instructions) {\n instructions.push(...stageEntered.instructions);\n }\n }\n return { state: nextState, instructions };\n }\n\n function initializePhaseResult(\n state: State,\n phaseName: PhaseName,\n ): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n return enterPhase({\n state,\n phaseName,\n playerIds: scope.buildContext(state).playerOrder as PlayerId[],\n event: \"transition\",\n });\n }\n\n function createInitialState({\n table,\n playerIds,\n rngSeed,\n setup,\n }: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n }): { state: State; initialPhase: PhaseName } {\n const tableWithManifestDefaults = applyManifestTableDefaults(\n table,\n playerIds,\n );\n const parsedTable = safeParseOrThrow(\n scope.definition.contract.manifest.tableSchema,\n tableWithManifestDefaults,\n \"table\",\n ) as State[\"table\"];\n const selectedSetup = resolveSelectedSetup(setup);\n const initialSetup =\n selectedSetup as RuntimeSetupSelection<ExactManifest> | null;\n const initialPhase = resolveInitialPhase(selectedSetup);\n const initialQueries = createStateQueries({ table: parsedTable });\n return {\n initialPhase,\n state: {\n table: parsedTable,\n publicState: safeParseOrThrow(\n scope.definition.contract.state.public,\n scope.definition.initial?.public?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"publicState\",\n ) as State[\"publicState\"],\n privateState: Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n scope.definition.contract.state.private,\n scope.definition.initial?.private?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n playerId,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"privateState\"],\n hiddenState: safeParseOrThrow(\n scope.definition.contract.state.hidden,\n scope.definition.initial?.hidden?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"hiddenState\",\n ) as State[\"hiddenState\"],\n flow: {\n currentPhase: initialPhase as State[\"flow\"][\"currentPhase\"],\n turn: 0,\n round: 0,\n activePlayers: [],\n },\n phase: {} as State[\"phase\"],\n runtime: {\n rng: {\n seed: rngSeed ?? null,\n cursor: 0,\n trace: [],\n },\n setup: selectedSetup,\n simultaneous: { current: null },\n lastTransition: null,\n } as State[\"runtime\"],\n },\n };\n }\n\n function applyManifestTableDefaults(\n table: State[\"table\"],\n playerIds: PlayerId[],\n ): State[\"table\"] {\n const manifest = scope.definition.contract.manifest;\n const defaultZones = manifest.defaults.zones(playerIds);\n const tableZones = table.zones ?? {};\n const tableResources = table.resources;\n return {\n ...table,\n playerOrder:\n table.playerOrder && table.playerOrder.length > 0\n ? table.playerOrder\n : playerIds,\n zones: {\n ...defaultZones,\n ...tableZones,\n shared: {\n ...(defaultZones.shared ?? {}),\n ...(tableZones.shared ?? {}),\n },\n perPlayer: {\n ...(defaultZones.perPlayer ?? {}),\n ...(tableZones.perPlayer ?? {}),\n },\n visibility: {\n ...(defaultZones.visibility ?? {}),\n ...(tableZones.visibility ?? {}),\n },\n cardSetIdsByZoneId: {\n ...(defaultZones.cardSetIdsByZoneId ?? {}),\n ...(tableZones.cardSetIdsByZoneId ?? {}),\n },\n },\n decks: {\n ...manifest.defaults.decks(playerIds),\n ...table.decks,\n },\n hands: {\n ...manifest.defaults.hands(playerIds),\n ...table.hands,\n },\n handVisibility: {\n ...manifest.defaults.handVisibility(playerIds),\n ...table.handVisibility,\n },\n ownerOfCard: {\n ...manifest.defaults.ownerOfCard(playerIds),\n ...table.ownerOfCard,\n },\n visibility: {\n ...manifest.defaults.visibility(playerIds),\n ...table.visibility,\n },\n resources:\n isPerPlayer(tableResources) && tableResources.entries.length > 0\n ? tableResources\n : manifest.defaults.resources(playerIds),\n } as State[\"table\"];\n }\n\n function initializeSession(\n input: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n },\n drainInstructions: (\n state: State,\n instructions: RuntimeInstructionForState<State>[],\n ) => State,\n ): SessionState {\n const initial = createInitialState(input);\n const bootstrappedState = applySelectedSetupBootstrap(initial.state);\n const entered = enterPhase({\n state: bootstrappedState,\n phaseName: initial.initialPhase,\n playerIds: input.playerIds,\n event: \"initialize\",\n });\n return scope.toSessionState(\n drainInstructions(entered.state, entered.instructions),\n );\n }\n\n return {\n createInitialState,\n enterPhase,\n initializePhaseResult,\n initializeSession,\n initPhaseState,\n resolveInitialPhase,\n resolveSelectedSetup,\n };\n}\n","import { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { RuntimeTableRecord, TableQueriesOfState } from \"../../model\";\n\ntype ProjectionFxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\nexport type ProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState = ProjectionFxState,\n> = {\n readonly domainState: State;\n readonly q: TableQueriesOfState<State>;\n readonly derived: DerivedResolver;\n readonly fx: ReturnType<typeof createReducerFx<FxState>>;\n readonly eligibleTargets: Map<string, string[]>;\n readonly stageAllowlists: Map<string, Set<string> | null>;\n};\n\nexport function createProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState,\n>(options: {\n domainState: State;\n combinedState: FxState;\n}): ProjectionContext<State, FxState> {\n const q = createStateQueries(options.domainState);\n return {\n domainState: options.domainState,\n q,\n derived: createDerivedResolver(options.domainState, { q }),\n fx: createReducerFx<FxState>(),\n eligibleTargets: new Map(),\n stageAllowlists: new Map(),\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n InteractionDescriptorShape,\n createInteractionResolver,\n} from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\nimport {\n createProjectionContext,\n type ProjectionContext,\n} from \"./projection-context\";\nimport { collectCardZoneIds } from \"./collector-introspection\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n simultaneousSubmitInteraction,\n} from \"./simultaneous-player\";\n\ntype ProjectionMode = \"full\" | \"actionsOnly\";\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 CanonicalJson =\n | null\n | boolean\n | number\n | string\n | CanonicalJson[]\n | { [key: string]: CanonicalJson };\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function createDescriptorRegistry(\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 = stableStringify(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 resolveZoneHandlesFor(\n combinedState: State,\n playerId: PlayerId,\n actorSeat: number,\n projection: ProjectionContext<DomainState, State>,\n registry: DescriptorRegistry,\n ) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const zoneIds = new Set<string>(scope.zonesForPhase(phaseName).map(String));\n for (const [, interaction] of scope.interactionEntriesForPhase(phaseName)) {\n for (const zoneId of collectCardZoneIds(interaction)) {\n zoneIds.add(String(zoneId));\n }\n }\n const zones = [...zoneIds];\n if (zones.length === 0) return {};\n const q = projection.q;\n const result: Record<\n string,\n {\n cardIds: string[];\n cardViewsById: Record<string, string>;\n playableByCardId: Record<string, string[]>;\n }\n > = {};\n for (const zoneId of zones) {\n const table = combinedState.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n const isPlayerZone =\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {});\n const cardIds = Array.from(\n isPlayerZone\n ? (q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly string[])\n : (q.zone.sharedCards(zoneId as never) as readonly string[]),\n );\n const cardInteractionIds = scope\n .interactionEntriesForPhase(phaseName)\n .filter(([, interaction]) =>\n collectCardZoneIds(interaction).map(String).includes(zoneId),\n )\n .map(([interactionId]) => interactionId);\n const cardViewsById: Record<string, string> = {};\n const playableByCardId: Record<string, string[]> = {};\n for (const cardId of cardIds) {\n cardViewsById[cardId] = JSON.stringify(q.card.get(cardId as never));\n const perCard: string[] = [];\n for (const interactionId of cardInteractionIds) {\n const interaction = scope.findInteractionInPhase(\n phaseName,\n interactionId,\n );\n if (!interaction) continue;\n const cardKey = interactions.findCardInputKeyForZone(\n interaction,\n zoneId,\n );\n const params = cardKey ? { [cardKey]: cardId } : {};\n const decision = interactions.resolveInteractionDecision({\n state: combinedState,\n playerId,\n interactionId,\n params,\n mode: \"card\",\n projection,\n });\n if (!decision.found || !decision.visible) continue;\n const cardDomain = cardKey\n ? decision.descriptor.inputs.find((input) => input.key === cardKey)\n ?.domain\n : undefined;\n const cardTargets =\n cardDomain?.type === \"cardTarget\" &&\n cardDomain.projection === \"resolved\"\n ? cardDomain.eligibleTargets\n : undefined;\n if (cardKey && !cardTargets?.includes(cardId)) {\n continue;\n }\n perCard.push(\n registry.add(\n {\n ...decision.descriptor,\n zoneId,\n },\n actorSeat,\n ),\n );\n }\n playableByCardId[cardId] = perCard;\n }\n result[zoneId] = {\n cardIds,\n cardViewsById,\n playableByCardId,\n };\n }\n return result;\n }\n\n function resolveCurrentStageFor(\n combinedState: State,\n projection?: ProjectionContext<DomainState, State>,\n ): string {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n return (\n interactions.resolveActiveStage(combinedState, phaseName, projection)\n ?.id ?? phaseName\n );\n }\n\n function resolveGuidanceFor(combinedState: State) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName) as {\n name?: unknown;\n guidance?: { summary?: unknown; objective?: unknown };\n };\n const phaseSummary = normalizeGuidanceText(phase.guidance?.summary);\n const phaseObjective = normalizeGuidanceText(phase.guidance?.objective);\n const setupProfileId = combinedState.runtime.setup?.profileId;\n const setupProfile =\n setupProfileId == null\n ? undefined\n : scope.manifestSetupProfilesById[String(setupProfileId)];\n const setupGuidance = setupProfile?.guidance;\n const setupSummary = normalizeGuidanceText(setupGuidance?.summary);\n const setup =\n setupProfileId == null || !setupProfile\n ? undefined\n : {\n profileId: String(setupProfileId),\n name: setupProfile.name,\n ...(setupSummary ? { summary: setupSummary } : {}),\n steps: (setupGuidance?.steps ?? []).map((step) => ({\n id: step.id,\n label: step.label,\n ...(step.description ? { description: step.description } : {}),\n })),\n };\n return {\n phase: {\n id: String(phaseName),\n label:\n normalizeGuidanceText(phase.name) ??\n humanizeGuidanceId(String(phaseName)),\n ...(phaseSummary ? { summary: phaseSummary } : {}),\n ...(phaseObjective ? { objective: phaseObjective } : {}),\n },\n ...(setup ? { setup } : {}),\n };\n }\n\n function normalizeGuidanceText(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\n function humanizeGuidanceId(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\n function resolveStageSeatsFor(state: SessionState): string[] {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (isSimultaneousPhase(phase)) {\n return resolveSimultaneousActors(scope, combinedState, phase).map(String);\n }\n return [...state.domain.flow.activePlayers];\n }\n\n function resolveSimultaneousPhaseFor(state: SessionState) {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) return null;\n const current = state.runtime.simultaneous?.current;\n if (!current || current.phaseName !== phaseName) return null;\n const submit = simultaneousSubmitInteraction(phase);\n if (!submit) return null;\n const actorIds = current.actors.map(String);\n const sealedPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] !== undefined,\n );\n const pendingPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] === undefined,\n );\n return {\n phaseName: String(current.phaseName),\n interactionId: SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n actorIds,\n sealedPlayerIds,\n pendingPlayerIds,\n };\n }\n\n function resolveSharedViewFor(\n combinedState: State,\n projection: ProjectionContext<DomainState, State>,\n ): unknown {\n const view = scope.definition.views.shared;\n const viewArgs = {\n ...scope.buildContext(combinedState),\n ...scope.runtimeHelpers,\n fx: projection.fx,\n q: projection.q,\n derived: projection.derived,\n state: projection.domainState,\n } as unknown as Parameters<typeof view.project>[0];\n return view.project(viewArgs);\n }\n\n function resolvePlayerViewFor(\n combinedState: State,\n playerId: PlayerId,\n sharedView: unknown,\n projection: ProjectionContext<DomainState, State>,\n ): unknown {\n const view = scope.definition.views.player;\n const viewArgs = {\n ...scope.buildContext(combinedState),\n ...scope.runtimeHelpers,\n fx: projection.fx,\n q: projection.q,\n derived: projection.derived,\n state: projection.domainState,\n playerId,\n shared: sharedView,\n } as unknown as Parameters<typeof view.project>[0];\n return view.project(viewArgs);\n }\n\n function projectSeatsDynamic({\n state,\n playerIds,\n projectionMode = \"full\",\n }: {\n state: SessionState;\n playerIds: PlayerId[];\n projectionMode?: ProjectionMode;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n const timing = createProjectionTimingMetadata();\n const registry = createDescriptorRegistry(timing);\n type SeatProjection = {\n view?: ReturnType<typeof resolvePlayerViewFor>;\n availableInteractionRefs: string[];\n zones?: ReturnType<typeof resolveZoneHandlesFor>;\n };\n const seats: Record<string, SeatProjection> = {};\n const sharedView =\n projectionMode === \"full\"\n ? measureProjectionTiming(timing, \"resolveViewMs\", () =>\n resolveSharedViewFor(combinedState, projection),\n )\n : undefined;\n for (const [actorSeat, playerId] of playerIds.entries()) {\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.map((descriptor) =>\n registry.add(descriptor, actorSeat),\n );\n const fullProjection =\n projectionMode === \"full\"\n ? {\n view: measureProjectionTiming(timing, \"resolveViewMs\", () =>\n resolvePlayerViewFor(\n combinedState,\n playerId,\n sharedView,\n projection,\n ),\n ),\n zones: measureProjectionTiming(\n timing,\n \"resolveZoneHandlesMs\",\n () =>\n resolveZoneHandlesFor(\n combinedState,\n playerId,\n actorSeat,\n projection,\n registry,\n ),\n ),\n }\n : {};\n seats[playerId as unknown as string] = {\n ...fullProjection,\n availableInteractionRefs,\n };\n }\n return withProjectionTiming(\n {\n currentStage: resolveCurrentStageFor(combinedState, projection),\n stageSeats: resolveStageSeatsFor(state),\n simultaneousPhase: resolveSimultaneousPhaseFor(state),\n ...(projectionMode === \"full\" ? { sharedView } : {}),\n guidance: resolveGuidanceFor(combinedState),\n recentEvents: [],\n interactionsByRef: registry.entries(),\n seats,\n },\n timing,\n );\n }\n\n return {\n projectSeatsDynamic,\n resolveCurrentStageFor,\n resolveStageSeatsFor,\n resolvePlayerViewFor,\n resolveSharedViewFor,\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): CanonicalJson {\n const canonical = toCanonicalJson(value);\n return normalizeOrderInsensitiveDescriptorFields(canonical);\n}\n\nfunction normalizeOrderInsensitiveDescriptorFields(\n value: CanonicalJson,\n): CanonicalJson {\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 (\n (key === \"eligibleTargets\" || key === \"dependentCases\") &&\n Array.isArray(normalized)\n ) {\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, CanonicalJson> {\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 toCanonicalJson(value: unknown): CanonicalJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toCanonicalJson(item));\n }\n if (typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => [key, toCanonicalJson(item)]),\n );\n }\n return null;\n}\n\nfunction hashJson(value: CanonicalJson): string {\n return `sha256:${sha256Hex(canonicalJson(value))}`;\n}\n\nfunction canonicalJson(value: CanonicalJson): string {\n return JSON.stringify(canonicalizeJson(value));\n}\n\nfunction canonicalizeJson(value: CanonicalJson): CanonicalJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"canonical JSON contains a non-finite number\");\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeJson(item));\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, canonicalizeJson(item)]),\n );\n}\n\nfunction compareCanonicalJson(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableStringify(entry)).join(\",\")}]`;\n }\n const record = value as Record<string, unknown>;\n return `{${Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n .join(\",\")}}`;\n}\n\nfunction fnv1a64(value: string): string {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= BigInt(value.charCodeAt(index));\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash.toString(16).padStart(16, \"0\");\n}\n\nconst SHA256_K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\nfunction sha256Hex(input: string): string {\n const bytes = utf8Bytes(input);\n const bitLength = bytes.length * 8;\n bytes.push(0x80);\n while (bytes.length % 64 !== 56) {\n bytes.push(0);\n }\n for (let shift = 56; shift >= 0; shift -= 8) {\n bytes.push(Math.floor(bitLength / 2 ** shift) & 0xff);\n }\n\n let h0 = 0x6a09e667;\n let h1 = 0xbb67ae85;\n let h2 = 0x3c6ef372;\n let h3 = 0xa54ff53a;\n let h4 = 0x510e527f;\n let h5 = 0x9b05688c;\n let h6 = 0x1f83d9ab;\n let h7 = 0x5be0cd19;\n const words = new Array<number>(64);\n\n for (let offset = 0; offset < bytes.length; offset += 64) {\n for (let index = 0; index < 16; index += 1) {\n const base = offset + index * 4;\n words[index] =\n ((bytes[base] << 24) |\n (bytes[base + 1] << 16) |\n (bytes[base + 2] << 8) |\n bytes[base + 3]) >>>\n 0;\n }\n for (let index = 16; index < 64; index += 1) {\n const s0 =\n rotateRight(words[index - 15], 7) ^\n rotateRight(words[index - 15], 18) ^\n (words[index - 15] >>> 3);\n const s1 =\n rotateRight(words[index - 2], 17) ^\n rotateRight(words[index - 2], 19) ^\n (words[index - 2] >>> 10);\n words[index] = (words[index - 16] + s0 + words[index - 7] + s1) >>> 0;\n }\n\n let a = h0;\n let b = h1;\n let c = h2;\n let d = h3;\n let e = h4;\n let f = h5;\n let g = h6;\n let h = h7;\n\n for (let index = 0; index < 64; index += 1) {\n const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + SHA256_K[index] + words[index]) >>> 0;\n const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n h0 = (h0 + a) >>> 0;\n h1 = (h1 + b) >>> 0;\n h2 = (h2 + c) >>> 0;\n h3 = (h3 + d) >>> 0;\n h4 = (h4 + e) >>> 0;\n h5 = (h5 + f) >>> 0;\n h6 = (h6 + g) >>> 0;\n h7 = (h7 + h) >>> 0;\n }\n\n return [h0, h1, h2, h3, h4, h5, h6, h7]\n .map((word) => word.toString(16).padStart(8, \"0\"))\n .join(\"\");\n}\n\nfunction rotateRight(value: number, shift: number): number {\n return (value >>> shift) | (value << (32 - shift));\n}\n\nfunction utf8Bytes(input: string): number[] {\n const bytes: number[] = [];\n for (let index = 0; index < input.length; index += 1) {\n let codePoint = input.charCodeAt(index);\n if (\n codePoint >= 0xd800 &&\n codePoint <= 0xdbff &&\n index + 1 < input.length\n ) {\n const low = input.charCodeAt(index + 1);\n if (low >= 0xdc00 && low <= 0xdfff) {\n codePoint = 0x10000 + ((codePoint - 0xd800) << 10) + (low - 0xdc00);\n index += 1;\n }\n }\n if (codePoint < 0x80) {\n bytes.push(codePoint);\n } else if (codePoint < 0x800) {\n bytes.push(0xc0 | (codePoint >>> 6), 0x80 | (codePoint & 0x3f));\n } else if (codePoint < 0x10000) {\n bytes.push(\n 0xe0 | (codePoint >>> 12),\n 0x80 | ((codePoint >>> 6) & 0x3f),\n 0x80 | (codePoint & 0x3f),\n );\n } else {\n bytes.push(\n 0xf0 | (codePoint >>> 18),\n 0x80 | ((codePoint >>> 12) & 0x3f),\n 0x80 | ((codePoint >>> 6) & 0x3f),\n 0x80 | (codePoint & 0x3f),\n );\n }\n }\n return bytes;\n}\n","import type {\n ManifestContract,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeTableRecord,\n ViewMapOf,\n} from \"../../model\";\nimport type { StaticViewQueries } from \"../../model/spec/runtime-args\";\nimport type { TrustedRuntimeScope } from \"./runtime-scope\";\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return `{${entries\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`)\n .join(\",\")}}`;\n}\n\nfunction hashProjection(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\");\n}\n\nfunction readManifestVersion(manifest: unknown): string {\n const m = manifest as { version?: unknown; literals?: unknown };\n if (typeof m.version === \"string\" && m.version.length > 0) {\n return m.version;\n }\n if (m.literals && typeof m.literals === \"object\") {\n return hashProjection(stableStringify(m.literals));\n }\n return \"0\";\n}\n\nfunction createStaticViewQueries<\n Manifest extends ManifestContract<RuntimeTableRecord>,\n>(manifest: Manifest): StaticViewQueries<Manifest> {\n const staticBoards = manifest.staticBoards ?? {\n byId: {},\n hex: {},\n square: {},\n };\n const requireBoard = (\n boards: Record<string, unknown>,\n boardId: string,\n layout: \"board\" | \"hex\" | \"square\",\n ) => {\n const board = boards[boardId];\n if (!board) {\n throw new Error(`Unknown static ${layout} board '${boardId}'.`);\n }\n return board;\n };\n\n return {\n board: {\n get: (boardId) =>\n requireBoard(\n staticBoards.byId as Record<string, unknown>,\n boardId,\n \"board\",\n ) as never,\n hex: (boardId) =>\n requireBoard(\n staticBoards.hex as Record<string, unknown>,\n boardId,\n \"hex\",\n ) as never,\n square: (boardId) =>\n requireBoard(\n staticBoards.square as Record<string, unknown>,\n boardId,\n \"square\",\n ) as never,\n },\n };\n}\n\nexport function createStaticProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n return {\n projectStatic(): {\n view: unknown;\n hash: string;\n manifestVersion: string;\n } | null {\n const staticView = scope.definition.staticView;\n if (!staticView) return null;\n const manifest = scope.definition.contract.manifest;\n const view = staticView.project({\n manifest,\n q: createStaticViewQueries(manifest),\n });\n const serialized = stableStringify(view);\n return {\n view: JSON.parse(serialized) as unknown,\n hash: hashProjection(serialized),\n manifestVersion: readManifestVersion(manifest),\n };\n },\n };\n}\n","import type { ReducerBundleOptions, TrustedReducerBundle } from \"./types\";\nimport { summarizeDispatchTrace } from \"../diagnostics\";\nimport type { ReducerDiagnosticsSink } from \"../diagnostics\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../model\";\nimport type { InteractionDiagnosticsMode } from \"./trusted/interaction-types\";\nimport { createTrustedInstructionRunner } from \"./trusted/instruction-runner\";\nimport { createInteractionResolver } from \"./trusted/interaction-resolver\";\nimport { createLifecycleRunner } from \"./trusted/lifecycle-runner\";\nimport { createProjectionBuilder } from \"./trusted/projection-builder\";\nimport { createTrustedRuntimeScope } from \"./trusted/runtime-scope\";\nimport { createStaticProjectionBuilder } from \"./trusted/static-projection\";\n\nfunction resolveDiagnosticsSink(\n options: ReducerBundleOptions,\n): ReducerDiagnosticsSink | undefined {\n return typeof options.diagnostics === \"object\"\n ? options.diagnostics\n : undefined;\n}\n\nfunction resolveDescriptorDiagnostics(\n options: ReducerBundleOptions,\n): InteractionDiagnosticsMode | undefined {\n return (\n options.descriptorDiagnostics ??\n (options.diagnostics === \"verbose\" ? \"verbose\" : undefined)\n );\n}\n\nfunction inputIdentity(input: {\n kind: string;\n playerId?: string;\n interactionId?: string;\n}) {\n return {\n playerId: input.kind === \"interaction\" ? (input.playerId ?? \"\") : \"\",\n interactionId:\n input.kind === \"interaction\" ? (input.interactionId ?? \"\") : input.kind,\n };\n}\n\nexport function createTrustedReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n options: ReducerBundleOptions = {},\n): TrustedReducerBundle<Contract, Definitions, Views> {\n const scope = createTrustedRuntimeScope(definition, {\n diagnostics: resolveDiagnosticsSink(options),\n });\n const interactions = createInteractionResolver(scope, {\n diagnostics: resolveDescriptorDiagnostics(options),\n });\n const lifecycle = createLifecycleRunner(scope, interactions);\n const instructions = createTrustedInstructionRunner(\n scope,\n interactions,\n lifecycle,\n );\n const staticProjection = createStaticProjectionBuilder(scope);\n const projection = createProjectionBuilder(scope, interactions);\n let submissionCounter = 0;\n\n function nextSubmissionId(): string {\n submissionCounter += 1;\n return `sub-${submissionCounter}`;\n }\n\n return {\n async initialize(input) {\n return lifecycle.initializeSession(input, instructions.drainInstructions);\n },\n async initializePhase({ state, to }) {\n const combinedState = scope.toCombinedState(state);\n const from = combinedState.flow.currentPhase;\n const initialized = lifecycle.initializePhaseResult(combinedState, to);\n if (String(from) !== String(to)) {\n scope.diagnostics.event({\n type: \"phaseTransition\",\n from: String(from),\n to: String(to),\n reason: \"lifecycle\",\n });\n }\n return scope.toSessionState(\n instructions.drainInstructions(\n initialized.state,\n initialized.instructions,\n ),\n );\n },\n async validateInput({ state, input }) {\n return interactions.validateClientInput(\n scope.toCombinedState(state),\n input,\n );\n },\n explainInteraction({ state, playerId, interactionId }) {\n return interactions.explainInteraction({\n state: scope.toCombinedState(state),\n playerId,\n interactionId,\n });\n },\n async reduce({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n return reject;\n }\n const result = instructions.reduceOnce(combinedState, input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n instructions: result.instructions ?? [],\n events: result.events ?? [],\n ...(result.terminal ? { terminal: result.terminal } : {}),\n };\n },\n async dispatch({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const submissionId = nextSubmissionId();\n const identity = inputIdentity(input);\n scope.diagnostics.event({\n type: \"submitReceived\",\n submissionId,\n playerId: identity.playerId,\n interactionId: identity.interactionId,\n phase: String(combinedState.flow.currentPhase),\n });\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n scope.diagnostics.event({\n type: \"submitRejected\",\n submissionId,\n errorCode: reject.errorCode,\n ...(reject.message ? { message: reject.message } : {}),\n });\n return reject;\n }\n const result = instructions.dispatch(combinedState, input);\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 return result;\n }\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 {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n trace: result.trace,\n events: result.events ?? [],\n ...(result.terminal ? { terminal: result.terminal } : {}),\n };\n },\n projectStatic() {\n return staticProjection.projectStatic();\n },\n projectSeatsDynamic(input) {\n return projection.projectSeatsDynamic(input);\n },\n };\n}\n","import { z } from \"zod\";\nimport { Zod as ContractZod } from \"@dreamboard-games/reducer-contract\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport { runtimePayloadSchema } from \"./runtime-payload\";\nimport type {\n BaseGameSessionOfContract,\n GameStateOf,\n HiddenSchemaOfContract,\n ManifestContractOf,\n ManifestOf,\n PhaseMapOf,\n PhaseNameOfContract,\n PlayerIdOfState,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n RuntimeSetupSelection,\n TableOfManifest,\n ViewMapOf,\n} from \"../model\";\nimport { contractFingerprint } from \"../contract-fingerprint\";\nimport { StaleContractArtifactError } from \"../stale-contract-artifact-error\";\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 perPlayerSchema = <Value extends z.ZodTypeAny>(valueSchema: Value) =>\n z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([z.string(), valueSchema])),\n })\n .strict();\nconst runtimeComponentLocationSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"Detached\") }).strict(),\n z\n .object({\n type: z.literal(\"InDeck\"),\n deckId: z.string(),\n playedBy: z.string().nullable(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InHand\"),\n handId: z.string(),\n playerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: z.string().nullable().optional(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnSpace\"),\n boardId: z.string(),\n spaceId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InContainer\"),\n boardId: z.string(),\n containerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnEdge\"),\n boardId: z.string(),\n edgeId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnVertex\"),\n boardId: z.string(),\n vertexId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InSlot\"),\n host: z.union([\n z.object({ kind: z.literal(\"piece\"), id: z.string() }).strict(),\n z.object({ kind: z.literal(\"die\"), id: z.string() }).strict(),\n ]),\n slotId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n]);\nconst currentRuntimeTableSchema = z\n .object({\n playerOrder: z.array(z.string()),\n zones: z\n .object({\n shared: z.record(z.string(), z.array(z.string())),\n perPlayer: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n visibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cardSetIdsByZoneId: z\n .record(z.string(), z.array(z.string()))\n .optional(),\n })\n .strict(),\n decks: z.record(z.string(), z.array(z.string())),\n hands: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n handVisibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n cardSetId: z.string(),\n cardType: z.string(),\n name: z.string().optional(),\n text: z.string().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n pieces: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n pieceTypeId: z.string(),\n pieceName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n componentLocations: z.record(z.string(), runtimeComponentLocationSchema),\n ownerOfCard: z.record(z.string(), z.string().nullable()),\n visibility: z.record(\n z.string(),\n z\n .object({\n faceUp: z.boolean(),\n visibleTo: z.array(z.string()).nullable().optional(),\n })\n .strict(),\n ),\n resources: perPlayerSchema(runtimeRecordSchema),\n boards: z\n .object({\n byId: z.record(z.string(), runtimeRecordSchema),\n hex: z.record(z.string(), runtimeRecordSchema),\n square: z.record(z.string(), runtimeRecordSchema),\n network: z.record(z.string(), runtimeRecordSchema).optional(),\n track: z.record(z.string(), runtimeRecordSchema).optional(),\n })\n .strict(),\n dice: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n dieTypeId: z.string(),\n dieName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n sides: z.number().int(),\n value: z.number().int().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n })\n .strict();\n\nexport function createIngressRuntimeCodec<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n ManifestContractOf<Contract>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseNameOfContract<Contract>\n> {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n type DomainState = GameStateOf<Definition>;\n type State = BaseGameSessionOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNameOfContract<Contract>;\n type ReturnType = IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n Manifest,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseName\n >;\n type PlayerId = PlayerIdOfState<DomainState>;\n\n const { phaseNameSchema } = collectIngressPhaseSchemas(definition);\n const playerIdSchema = definition.contract.manifest.ids\n .playerId as z.ZodType<PlayerId>;\n const liveContractFingerprint = contractFingerprint(definition).value;\n\n const flowSchema = z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n });\n const runtimeStateSchema = z.object({\n rng: z.object({\n seed: z.number().int().nullable(),\n cursor: z.number().int(),\n trace: z.array(z.string()),\n }),\n setup: z\n .object({\n profileId: z.string(),\n optionValues: z.record(z.string(), z.string().nullable()),\n })\n .nullable(),\n simultaneous: z.object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: runtimePayloadSchema,\n }),\n ),\n })\n .nullable(),\n }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable(),\n });\n const parseRuntimeInput = createRuntimeInputParser(playerIdSchema);\n\n // The return type uses branded/mapped types derived from the contract generic.\n // TypeScript cannot verify that plain objects satisfy these deep mapped types,\n // but the runtime Zod parsing ensures correctness.\n return {\n defaultRuntimeState(\n seed: number | null = null,\n setup: RuntimeSetupSelection<Manifest> | null = null,\n ) {\n const runtimeState: State[\"runtime\"] = {\n rng: {\n seed,\n cursor: 0,\n trace: [],\n },\n setup,\n simultaneous: { current: null },\n lastTransition: null,\n };\n return runtimeState;\n },\n parseInitialTable(rawTable: unknown, playerIds: string[] | undefined) {\n const table = safeParseOrThrow(\n currentRuntimeTableSchema,\n rawTable,\n \"table\",\n ) as unknown as TableOfManifest<ManifestOf<Contract>>;\n return {\n table,\n playerIds: safeParseOrThrow(\n z.array(playerIdSchema),\n playerIds && playerIds.length > 0 ? playerIds : table.playerOrder,\n \"table.playerOrder\",\n ),\n };\n },\n parseState(rawState: RawReducerSessionState) {\n const envelope = safeParseOrThrow(\n ContractZod.ReducerSessionStateSchema,\n rawState,\n \"state\",\n );\n const encodedContractFingerprint = (\n envelope as { meta?: { contractFingerprint?: string } }\n ).meta?.contractFingerprint;\n if (\n encodedContractFingerprint &&\n encodedContractFingerprint !== liveContractFingerprint\n ) {\n throw new StaleContractArtifactError({\n artifact: \"session-state\",\n expected: liveContractFingerprint,\n found: encodedContractFingerprint,\n });\n }\n const table = safeParseOrThrow(\n definition.contract.manifest.tableSchema,\n envelope.domain.table,\n \"domain.table\",\n );\n const playerIds = [...table.playerOrder] as PlayerId[];\n const privateState = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n definition.contract.state.private,\n envelope.domain.privateState[playerId] ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"domain\"][\"privateState\"];\n const flow = safeParseOrThrow(\n flowSchema,\n {\n currentPhase: envelope.domain.flow.currentPhase,\n turn: envelope.domain.flow.turn,\n round: envelope.domain.flow.round,\n activePlayers: envelope.domain.flow.activePlayers,\n },\n \"domain.flow\",\n );\n const currentPhaseDefinition = definition.phases[flow.currentPhase];\n if (!currentPhaseDefinition) {\n throw new Error(`Unknown reducer phase '${flow.currentPhase}'.`);\n }\n const rawPhaseState = envelope.domain.phase;\n const phase = safeParseOrThrow(\n currentPhaseDefinition.state,\n rawPhaseState ?? {},\n `phase:${flow.currentPhase}`,\n ) as State[\"domain\"][\"phase\"];\n\n const parsedState: State = {\n domain: {\n table,\n publicState: safeParseOrThrow(\n definition.contract.state.public,\n envelope.domain.publicState,\n \"domain.publicState\",\n ) as State[\"domain\"][\"publicState\"],\n privateState,\n hiddenState: safeParseOrThrow(\n definition.contract.state.hidden,\n envelope.domain.hiddenState,\n \"domain.hiddenState\",\n ) as State[\"domain\"][\"hiddenState\"],\n flow,\n phase,\n },\n runtime: safeParseOrThrow(\n runtimeStateSchema,\n envelope.runtime,\n \"runtime\",\n ) as unknown as State[\"runtime\"],\n };\n return parsedState;\n },\n serializeState(state: State) {\n return {\n meta: { contractFingerprint: liveContractFingerprint },\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 { z } from \"zod\";\nimport { RuntimeJsonSchema, assertJsonWithinLimits } from \"../../runtime-json\";\nimport type { RuntimePayload } from \"../model\";\n\nexport { RuntimeJsonSchema, 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 { z } from \"zod\";\nimport type { ReducerGameContractLike } from \"./model\";\n\ntype FingerprintableContract = ReducerGameContractLike & {\n phases?: Record<string, z.ZodTypeAny>;\n errors?: Record<string, string> | undefined;\n};\n\ntype FingerprintableDefinition = {\n contract: FingerprintableContract;\n phases?: Record<string, z.ZodTypeAny | { state?: z.ZodTypeAny }>;\n};\n\ntype CanonicalJson =\n | null\n | boolean\n | number\n | string\n | CanonicalJson[]\n | { [key: string]: CanonicalJson };\n\nexport type ContractFingerprint = {\n /** \"cfp1:\" + first 16 hex chars of sha256 over the canonical payload. */\n value: string;\n /** Component hashes that fed the final fingerprint. */\n parts: {\n manifest: string;\n publicState: string;\n privateState: string;\n hiddenState: string;\n phases: Record<string, string>;\n errors: string;\n };\n};\n\n/**\n * Compute a stable shape fingerprint for stale generated artifacts.\n *\n * The fingerprint intentionally tracks decoded shape, not semantic refinements:\n * Zod schemas are converted with `unrepresentable: \"any\"`, so refinements and\n * custom validators that do not affect the JSON shape do not invalidate stored\n * sessions or generated base states.\n */\nexport function contractFingerprint(\n source: FingerprintableContract | FingerprintableDefinition,\n): ContractFingerprint {\n const contract = \"contract\" in source ? source.contract : source;\n const phases = source.phases;\n const phaseEntries = Object.entries(phases ?? {}).sort(([left], [right]) =>\n compareJson(left, right),\n );\n const parts: ContractFingerprint[\"parts\"] = {\n manifest: hashJson(contract.manifest?.literals ?? {}),\n publicState: hashSchema(contract.state.public),\n privateState: hashSchema(contract.state.private),\n hiddenState: hashSchema(contract.state.hidden),\n phases: Object.fromEntries(\n phaseEntries.map(([phaseName, phase]) => [\n phaseName,\n hashSchema(phaseSchema(phase)),\n ]),\n ),\n errors: contract.errors ? hashJson(contract.errors) : \"\",\n };\n return {\n value: `cfp1:${sha256Hex(canonicalJson(parts)).slice(0, 16)}`,\n parts,\n };\n}\n\nfunction phaseSchema(\n phase: z.ZodTypeAny | { state?: z.ZodTypeAny },\n): z.ZodTypeAny {\n if (phase && typeof phase === \"object\" && \"state\" in phase && phase.state) {\n return phase.state;\n }\n return phase as z.ZodTypeAny;\n}\n\nfunction hashSchema(schema: z.ZodTypeAny): string {\n return hashJson(\n normalizeJsonSchema(\n z.toJSONSchema(schema, { unrepresentable: \"any\" }),\n ) as CanonicalJson,\n );\n}\n\nfunction normalizeJsonSchema(value: unknown, key?: string): unknown {\n if (Array.isArray(value)) {\n const normalized = value.map((item) => normalizeJsonSchema(item));\n if (key === \"required\" || key === \"enum\" || key === \"type\") {\n return [...normalized].sort((left, right) =>\n compareJson(JSON.stringify(left), JSON.stringify(right)),\n );\n }\n return normalized;\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(\n ([entryKey, item]) => [entryKey, normalizeJsonSchema(item, entryKey)],\n ),\n );\n }\n return value;\n}\n\nfunction hashJson(value: unknown): string {\n return sha256Hex(canonicalJson(toCanonicalJson(value)));\n}\n\nfunction toCanonicalJson(value: unknown): CanonicalJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : null;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toCanonicalJson(item));\n }\n if (typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => [key, toCanonicalJson(item)]),\n );\n }\n return null;\n}\n\nfunction canonicalJson(value: CanonicalJson): string {\n return JSON.stringify(canonicalizeJson(value));\n}\n\nfunction canonicalizeJson(value: CanonicalJson): CanonicalJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"canonical JSON contains a non-finite number\");\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeJson(item));\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => compareJson(left, right))\n .map(([key, item]) => [key, canonicalizeJson(item)]),\n );\n}\n\nfunction compareJson(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nconst SHA256_K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\n\nfunction sha256Hex(input: string): string {\n const bytes = utf8Bytes(input);\n const bitLength = bytes.length * 8;\n bytes.push(0x80);\n while (bytes.length % 64 !== 56) {\n bytes.push(0);\n }\n for (let shift = 56; shift >= 0; shift -= 8) {\n bytes.push(Math.floor(bitLength / 2 ** shift) & 0xff);\n }\n\n let h0 = 0x6a09e667;\n let h1 = 0xbb67ae85;\n let h2 = 0x3c6ef372;\n let h3 = 0xa54ff53a;\n let h4 = 0x510e527f;\n let h5 = 0x9b05688c;\n let h6 = 0x1f83d9ab;\n let h7 = 0x5be0cd19;\n const words = new Array<number>(64);\n\n for (let offset = 0; offset < bytes.length; offset += 64) {\n for (let index = 0; index < 16; index += 1) {\n const base = offset + index * 4;\n words[index] =\n ((bytes[base]! << 24) |\n (bytes[base + 1]! << 16) |\n (bytes[base + 2]! << 8) |\n bytes[base + 3]!) >>>\n 0;\n }\n for (let index = 16; index < 64; index += 1) {\n const s0 =\n rotateRight(words[index - 15]!, 7) ^\n rotateRight(words[index - 15]!, 18) ^\n (words[index - 15]! >>> 3);\n const s1 =\n rotateRight(words[index - 2]!, 17) ^\n rotateRight(words[index - 2]!, 19) ^\n (words[index - 2]! >>> 10);\n words[index] = (words[index - 16]! + s0 + words[index - 7]! + s1) >>> 0;\n }\n\n let a = h0;\n let b = h1;\n let c = h2;\n let d = h3;\n let e = h4;\n let f = h5;\n let g = h6;\n let h = h7;\n\n for (let index = 0; index < 64; index += 1) {\n const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + SHA256_K[index]! + words[index]!) >>> 0;\n const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n h0 = (h0 + a) >>> 0;\n h1 = (h1 + b) >>> 0;\n h2 = (h2 + c) >>> 0;\n h3 = (h3 + d) >>> 0;\n h4 = (h4 + e) >>> 0;\n h5 = (h5 + f) >>> 0;\n h6 = (h6 + g) >>> 0;\n h7 = (h7 + h) >>> 0;\n }\n\n return [h0, h1, h2, h3, h4, h5, h6, h7]\n .map((value) => value.toString(16).padStart(8, \"0\"))\n .join(\"\");\n}\n\nfunction rotateRight(value: number, bits: number): number {\n return (value >>> bits) | (value << (32 - bits));\n}\n\nfunction utf8Bytes(input: string): number[] {\n return Array.from(new TextEncoder().encode(input));\n}\n","import { z } from \"zod\";\nimport { Zod as ContractZod } from \"@dreamboard-games/reducer-contract\";\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 } as RawRuntimeInput;\n };\n}\n","import { z } from \"zod\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewMapOf,\n} from \"../model\";\n\nfunction createPhaseNameSchema<PhaseName extends string>(\n phaseNames: readonly PhaseName[],\n): z.ZodType<PhaseName> {\n const allowed = new Set(phaseNames);\n return z.custom<PhaseName>(\n (value: unknown) =>\n typeof value === \"string\" && allowed.has(value as PhaseName),\n { message: \"Invalid phase name\" },\n );\n}\n\nexport function collectIngressPhaseSchemas<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): {\n phaseEntries: Array<\n [\n PhaseNameOfContract<Contract>,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n phaseNames: PhaseNameOfContract<Contract>[];\n phaseNameSchema: z.ZodType<PhaseNameOfContract<Contract>>;\n} {\n type PhaseName = PhaseNameOfContract<Contract>;\n const phaseEntries = Object.entries(definition.phases) as Array<\n [\n PhaseName,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n const phaseNames = phaseEntries.map(([phaseName]) => phaseName);\n return {\n phaseEntries,\n phaseNames,\n phaseNameSchema: createPhaseNameSchema(phaseNames),\n };\n}\n","import { createTrustedReducerBundle } from \"./trusted-bundle\";\nimport { createIngressRuntimeCodec } from \"../ingress/runtime-codec\";\nimport {\n Builders,\n REDUCER_CONTRACT_VERSION,\n type Wire,\n} from \"@dreamboard-games/reducer-contract\";\nimport type {\n ManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ReducerReject,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../model\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\nimport type { DispatchTraceEntry } from \"../core/types\";\nimport type {\n UntrustedReducerSessionState,\n UntrustedRuntimeInput,\n} from \"../ingress/types\";\nimport type { ReducerBundle, ReducerBundleOptions } from \"./types\";\n\n/**\n * Pass the wire-validated `interaction` input through to the trusted\n * bundle. Both layers speak the same single-kind shape now — the routing\n * here only normalizes `params` to a concrete object when the caller\n * elided it.\n *\n * The wire schema admits exactly one player-originated variant\n * (`{ kind: \"interaction\" }`) and the engine's `TrustedRuntimeInput`\n * uses the same discriminator, so this is a straight pass-through.\n * Continuation inputs are engine-internal and never traverse this routing.\n */\nfunction routeInteraction(input: UntrustedRuntimeInput): {\n kind: \"interaction\";\n playerId: string;\n interactionId: string;\n params: unknown;\n} {\n return {\n kind: \"interaction\",\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.params,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Wire-protocol adapter.\n//\n// The trusted bundle (see ./trusted-bundle.ts) keeps the SDK reducer runtime\n// instruction shape at reducer boundaries where:\n// - Results discriminate on `type: \"accept\" | \"reject\"`.\n// - Reducer-returned instructions carry `kind`.\n// - Dispatch traces use normalized runtime instructions.\n// The generated reducer-contract (`packages/reducer-contract`) defines the\n// canonical wire shape consumed by the Kotlin host:\n// - Results discriminate on `kind: \"accept\" | \"reject\"`.\n// - Each effect carries an `effectId`, never an inline `resume`.\n// - Continuations live in a sibling `continuations: Record<effectId, ...>`\n// map on reduce results, or on the matching `appliedEffect` trace entry\n// for dispatch results.\n// - Each DispatchTrace entry discriminates on `kind` (no `type` field).\n//\n// This module is the ONLY place in the SDK reducer that converts runtime\n// instructions into wire effects. It does so through\n// `@dreamboard-games/reducer-contract` (the single source of truth for\n// wire-effect construction) rather than hand-rolling the mapping locally —\n// hand-rolled mappings are how wire drift sneaks in (see the catan\n// rollDie regression).\n// ---------------------------------------------------------------------------\n\ntype InternalInstruction<State> = RuntimeInstructionForState<State>;\n\nfunction extractContinuation<State>(\n instruction: InternalInstruction<State>,\n): Wire.ContinuationToken | undefined {\n const continuation = (\n instruction as {\n continuation?: Wire.ContinuationToken | null | undefined;\n }\n ).continuation;\n if (continuation === undefined || continuation === null) return undefined;\n return {\n id: continuation.id,\n data: continuation.data as Wire.JsonValue,\n };\n}\n\n/**\n * Route one engine-internal effect through the generated builder that owns\n * its wire shape. The builder mints the effectId, enforces the correct\n * required/optional key set, and attaches the continuation privately via\n * `__continuation` so `materializeAccept` can split it out at the wire\n * boundary.\n *\n * Why dispatch through the builder instead of constructing `Wire.Effect`\n * directly? The schema + builders are the SSOT for wire shapes. Duplicating\n * that knowledge here once caused the catan rollDie bug; never again.\n */\nfunction toPendingEffect<State>(\n instruction: InternalInstruction<State>,\n fx: Builders.EffectBuilders,\n): Builders.PendingEffect {\n const continuation = extractContinuation<State>(instruction);\n switch (instruction.kind) {\n case \"flow.transition\":\n return fx.transition({ to: instruction.to as string }, continuation);\n case \"engine.rollDie\":\n return fx.rollDie(\n { dieId: (instruction as { dieId: string }).dieId },\n continuation,\n );\n case \"engine.shuffleSharedZone\":\n return fx.shuffleSharedZone(\n { zoneId: (instruction as { zoneId: string }).zoneId as string },\n continuation,\n );\n case \"engine.shufflePlayerZone\":\n return fx.shufflePlayerZone(\n {\n zoneId: (instruction as { zoneId: string }).zoneId as string,\n playerId: (instruction as { playerId: string }).playerId as string,\n },\n continuation,\n );\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `toPendingEffect: unsupported instruction kind '${(_exhaustive as { kind: string }).kind}'.`,\n );\n }\n }\n}\n\nfunction toWireReduceResult<State>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n instructions?: InternalInstruction<State>[];\n terminal?: Wire.GameOutcome;\n events?: Wire.GameEvent[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.ReduceResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const pending = (result.instructions ?? []).map((instruction) =>\n toPendingEffect<State>(instruction, fx),\n );\n const { effects, continuations } = Builders.materializeAccept(pending);\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n ...(result.terminal ? { terminal: result.terminal } : {}),\n effects,\n continuations,\n events: result.events ?? [],\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?: Wire.GameOutcome;\n events?: Wire.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 mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const trace: Wire.DispatchTrace[] = [];\n for (const entry of result.trace) {\n switch (entry.type) {\n case \"acceptedClientInput\": {\n const engineInput = entry.input as {\n kind: \"interaction\" | \"continuation\";\n playerId?: string;\n interactionId?: string;\n params?: Wire.JsonValue;\n };\n let wireInput: Wire.GameInput;\n if (engineInput.kind === \"interaction\") {\n wireInput = {\n kind: \"interaction\",\n playerId: engineInput.playerId ?? \"\",\n interactionId: engineInput.interactionId ?? \"\",\n params: engineInput.params ?? {},\n };\n } else {\n // Continuation inputs are engine-internal and shouldn't appear in\n // client-addressed dispatch traces; synthesize a best-effort wire\n // shape so the trace stays well-typed.\n wireInput = {\n kind: \"interaction\",\n playerId: \"\",\n interactionId: \"\",\n params: {},\n };\n }\n trace.push({\n kind: \"acceptedClientInput\",\n input: wireInput,\n });\n break;\n }\n case \"appliedInstruction\": {\n const pending = toPendingEffect<State>(\n entry.instruction as InternalInstruction<State>,\n fx,\n );\n const { effects, continuations } = Builders.materializeAccept([\n pending,\n ]);\n const [wireEffect] = effects;\n if (wireEffect === undefined) {\n throw new Error(\n \"materializeAccept returned no effects for a single pending effect\",\n );\n }\n const continuation = continuations[wireEffect.effectId];\n trace.push(\n continuation === undefined\n ? { kind: \"appliedEffect\", effect: wireEffect }\n : { kind: \"appliedEffect\", effect: wireEffect, continuation },\n );\n break;\n }\n case \"rngConsumption\":\n trace.push({\n kind: \"rngConsumption\",\n operation: entry.operation,\n traceEntry: entry.traceEntry,\n });\n break;\n default: {\n const _exhaustive: never = entry;\n throw new Error(\n `toWireDispatchResult: unknown trace entry type '${(_exhaustive as { type: string }).type}'.`,\n );\n }\n }\n }\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n ...(result.terminal ? { terminal: result.terminal } : {}),\n trace,\n events: result.events ?? [],\n };\n}\n\nfunction toWireDispatchTrace<State, PlayerId extends string>(result: {\n type: \"accept\";\n state: State;\n trace: DispatchTraceEntry<State, PlayerId>[];\n}): Wire.DispatchTrace[] {\n return (\n toWireDispatchResult(result, (state) => state as never) as {\n kind: \"accept\";\n trace: Wire.DispatchTrace[];\n }\n ).trace;\n}\n\nexport function createReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n options: ReducerBundleOptions = {},\n): ReducerBundle {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n const trustedBundle = createTrustedReducerBundle(definition, options);\n const codec = createIngressRuntimeCodec(definition);\n type Manifest = ManifestContractOf<Definition[\"contract\"]>;\n type TrustedState = Awaited<ReturnType<typeof trustedBundle.initialize>>;\n\n function parseTrustedState(state: unknown): TrustedState {\n return codec.parseState(\n state as UntrustedReducerSessionState,\n ) as TrustedState;\n }\n\n function parseRuntimePlayerId(playerId: unknown) {\n if (typeof playerId !== \"string\") {\n throw new Error(\"Expected a string playerId.\");\n }\n return codec.parsePlayerId(playerId);\n }\n\n const bundle = {\n ...trustedBundle,\n // Top-level protocol version. The Kotlin ReducerBundleAdapter reads this\n // on bundle load and rejects bundles whose major version does not match\n // the host's compiled-in REDUCER_CONTRACT_VERSION.\n reducerContractVersion: REDUCER_CONTRACT_VERSION,\n async initialize({\n table,\n playerIds,\n rngSeed,\n setup,\n }: Wire.InitializeRequest) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as unknown as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n return codec.serializeState(\n await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n }),\n );\n },\n async initializePhase({ state, to }: Wire.InitializePhaseRequest) {\n const decodedState = parseTrustedState(state);\n return codec.serializeState(\n await trustedBundle.initializePhase({\n state: decodedState,\n to: to as never,\n }),\n );\n },\n async validateInput({ state, input }: Wire.ValidateInputRequest) {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n return trustedBundle.validateInput({\n state: parseTrustedState(state),\n input: routed as never,\n });\n },\n explainInteraction({ state, playerId, interactionId }) {\n return trustedBundle.explainInteraction({\n state: parseTrustedState(state),\n playerId: parseRuntimePlayerId(playerId),\n interactionId,\n });\n },\n async reduce({\n state,\n input,\n }: Wire.ReduceRequest): Promise<Wire.ReduceResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.reduce({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireReduceResult<TrustedState>(result as never, (nextState) =>\n codec.serializeState(nextState as never),\n );\n },\n async dispatch({\n state,\n input,\n }: Wire.DispatchRequest): Promise<Wire.DispatchResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireDispatchResult(result as never, (nextState: TrustedState) =>\n codec.serializeState(nextState as never),\n );\n },\n /**\n * Wire-side passthrough for the session-scoped static projection. The\n * host calls this once per reducer session, caches the payload, and\n * thereafter merges it back into every seat view on the client. Returns\n * `null` when `defineGame` did not declare a `staticView`.\n */\n projectStatic() {\n return trustedBundle.projectStatic() as Wire.BoardStaticProjection | null;\n },\n projectSeatsDynamic({\n state,\n playerIds,\n projectionMode,\n }: Wire.ProjectSeatsDynamicRequest) {\n const parsedState = parseTrustedState(state);\n const parsedPlayerIds = playerIds.map((pid) => codec.parsePlayerId(pid));\n return trustedBundle.projectSeatsDynamic({\n state: parsedState,\n playerIds: parsedPlayerIds,\n projectionMode: projectionMode ?? undefined,\n }) as Wire.SeatProjectionBundle;\n },\n createInProcessRuntime() {\n let state: TrustedState | null = null;\n const requireState = () => {\n if (!state) {\n throw new Error(\"In-process reducer runtime has no state.\");\n }\n return state;\n };\n return {\n async initialize({ table, playerIds, rngSeed, setup }) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n state = await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n });\n },\n hydrate({ state: snapshot }) {\n state = parseTrustedState(snapshot);\n },\n async dispatch({ input }) {\n const validatedWire = codec.parseInput(\n input as UntrustedRuntimeInput,\n );\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: requireState(),\n input: routed as never,\n });\n if (result.type === \"reject\") {\n return {\n kind: \"reject\" as const,\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n state = result.state;\n return {\n kind: \"accept\" as const,\n state: codec.serializeState(state as never),\n trace: toWireDispatchTrace(result as never),\n };\n },\n projectSeatsDynamic({ playerIds, projectionMode }) {\n const parsedPlayerIds = playerIds.map((pid) =>\n parseRuntimePlayerId(pid),\n );\n return trustedBundle.projectSeatsDynamic({\n state: requireState(),\n playerIds: parsedPlayerIds,\n projectionMode: projectionMode ?? undefined,\n });\n },\n explainInteraction({ playerId, interactionId }) {\n return trustedBundle.explainInteraction({\n state: requireState(),\n playerId: parseRuntimePlayerId(playerId),\n interactionId,\n });\n },\n snapshot() {\n return codec.serializeState(requireState());\n },\n unsafeState() {\n return requireState();\n },\n };\n },\n } satisfies ReducerBundle;\n\n return bundle;\n}\n","/**\n * State composition primitives.\n *\n * `pipe` threads a seed state through a sequence of `State -> State`\n * transformations, left to right. It is the preferred way to compose curried\n * writers (the `ops.*` namespace) in reducers:\n *\n * return accept(\n * pipe(state,\n * ops.spendPlayerResources({ playerId, resources: cost }),\n * ops.placePieceOnVertex({ boardId, vertexId, pieceId, ownerId: playerId }),\n * ),\n * );\n */\n/**\n * A state-preserving transformation.\n *\n * `Op<State>` is polymorphic in the exact input subtype — given a state `S`\n * that extends `State`, it returns the same `S`. This lets curried writers\n * from `ops.*` and author-written helpers thread through phase-scoped `pipe`\n * calls without losing the narrowed phase state type.\n */\nexport type Op<State> = <S extends State>(state: S) => S;\n\nexport function pipe<State>(\n state: State,\n ...ops: ReadonlyArray<Op<NoInfer<State>>>\n): State {\n let result = state;\n for (const op of ops) {\n result = op(result);\n }\n return result;\n}\n"],"mappings":"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","names":["z","z","z","z","z","z","z","toDomainState","toDomainState","toCombinedState","toSessionState","fxForState","buildContext","buildRuntimeArgs","options","lazyDomain","descriptorDecision","options","stableStringify","z","z","z","z","hashJson","sha256Hex","canonicalJson","toCanonicalJson","canonicalizeJson","SHA256_K","utf8Bytes","rotateRight","z","z","perPlayerSchema"]}