@dreamboard-games/sdk 0.5.0-alpha.2 → 0.5.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +462 -53
- package/dist/board-element-CqtxU5VZ.d.ts +13 -0
- package/dist/chunk-3RFGPBES.js +1792 -0
- package/dist/chunk-3RFGPBES.js.map +1 -0
- package/dist/chunk-CZRPUWCT.js +1602 -0
- package/dist/chunk-CZRPUWCT.js.map +1 -0
- package/dist/chunk-DMSXVMYY.js +7199 -0
- package/dist/chunk-DMSXVMYY.js.map +1 -0
- package/dist/chunk-U6R7FAH4.js +630 -0
- package/dist/chunk-U6R7FAH4.js.map +1 -0
- package/dist/chunk-YT3RPO5J.js +635 -0
- package/dist/chunk-YT3RPO5J.js.map +1 -0
- package/dist/diagnostics-ZAPEBlJP.d.ts +64 -0
- package/dist/extract-CwJWDrSD.d.ts +6850 -0
- package/dist/index.d.ts +5177 -1
- package/dist/index.js +1990 -6
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +158 -0
- package/dist/react.js +1119 -0
- package/dist/react.js.map +1 -0
- package/dist/reducer.d.ts +1028 -97
- package/dist/reducer.js +4892 -125
- package/dist/reducer.js.map +1 -1
- package/dist/shortcuts-B_RrufOM.d.ts +822 -0
- package/dist/testing.d.ts +529 -569
- package/dist/testing.js +2588 -934
- package/dist/testing.js.map +1 -1
- package/dist/types-BxXRINRF.d.ts +118 -0
- package/package.json +39 -144
- package/dist/HandView-Bi2lxzQP.d.ts +0 -79
- package/dist/ResourceCounter-BFxJknqp.d.ts +0 -98
- package/dist/ThemeProvider-CElaL2ik.d.ts +0 -99
- package/dist/attributes-DbvyMbXw.d.ts +0 -68
- package/dist/browser-interaction.d.ts +0 -910
- package/dist/browser-interaction.js +0 -119
- package/dist/browser-interaction.js.map +0 -1
- package/dist/chunk-32PFKDV7.js +0 -11705
- package/dist/chunk-32PFKDV7.js.map +0 -1
- package/dist/chunk-3BAD4VC2.js +0 -263
- package/dist/chunk-3BAD4VC2.js.map +0 -1
- package/dist/chunk-3SKDNDPG.js +0 -104
- package/dist/chunk-3SKDNDPG.js.map +0 -1
- package/dist/chunk-5YV2WHJ4.js +0 -25
- package/dist/chunk-5YV2WHJ4.js.map +0 -1
- package/dist/chunk-ANRB4XKA.js +0 -90
- package/dist/chunk-ANRB4XKA.js.map +0 -1
- package/dist/chunk-BI4G3PM2.js +0 -1864
- package/dist/chunk-BI4G3PM2.js.map +0 -1
- package/dist/chunk-EVCLTY4Q.js +0 -935
- package/dist/chunk-EVCLTY4Q.js.map +0 -1
- package/dist/chunk-GDPKTBUR.js +0 -564
- package/dist/chunk-GDPKTBUR.js.map +0 -1
- package/dist/chunk-H6VDGFL5.js +0 -2903
- package/dist/chunk-H6VDGFL5.js.map +0 -1
- package/dist/chunk-LR3ZTWQF.js +0 -5960
- package/dist/chunk-LR3ZTWQF.js.map +0 -1
- package/dist/chunk-PF7L4BMG.js +0 -117
- package/dist/chunk-PF7L4BMG.js.map +0 -1
- package/dist/chunk-PN5O6GG2.js +0 -32
- package/dist/chunk-PN5O6GG2.js.map +0 -1
- package/dist/chunk-PZ5AY32C.js +0 -10
- package/dist/chunk-PZ5AY32C.js.map +0 -1
- package/dist/chunk-S2JEDVWH.js +0 -7165
- package/dist/chunk-S2JEDVWH.js.map +0 -1
- package/dist/chunk-T3ZKNUZ7.js +0 -1
- package/dist/chunk-T3ZKNUZ7.js.map +0 -1
- package/dist/chunk-UGH54WZ2.js +0 -223
- package/dist/chunk-UGH54WZ2.js.map +0 -1
- package/dist/chunk-VCDWP5VL.js +0 -746
- package/dist/chunk-VCDWP5VL.js.map +0 -1
- package/dist/chunk-VDXOF4FW.js +0 -69
- package/dist/chunk-VDXOF4FW.js.map +0 -1
- package/dist/chunk-WHR5UW3F.js +0 -1988
- package/dist/chunk-WHR5UW3F.js.map +0 -1
- package/dist/chunk-Y75CFE77.js +0 -17
- package/dist/chunk-Y75CFE77.js.map +0 -1
- package/dist/chunk-Z7QCREWI.js +0 -3435
- package/dist/chunk-Z7QCREWI.js.map +0 -1
- package/dist/chunk-ZZGN2ATS.js +0 -1941
- package/dist/chunk-ZZGN2ATS.js.map +0 -1
- package/dist/components-gAbIz7hK.d.ts +0 -1284
- package/dist/definitions-BgmV_GhC.d.ts +0 -300
- package/dist/diagnostics-DIi3ina7.d.ts +0 -50
- package/dist/digest.d.ts +0 -8
- package/dist/game-CsZScpcn.d.ts +0 -763
- package/dist/hex-board-view-aKkblDp6.d.ts +0 -1228
- package/dist/index-CcT9Q7N7.d.ts +0 -193
- package/dist/index.d-DjzoK7zn.d.ts +0 -2101
- package/dist/package-set.d.ts +0 -13
- package/dist/package-set.js +0 -12
- package/dist/package-set.js.map +0 -1
- package/dist/player-state-Cqpyeql0.d.ts +0 -371
- package/dist/plugin-runtime-contract.d.ts +0 -17
- package/dist/plugin-runtime-contract.js +0 -92
- package/dist/plugin-runtime-contract.js.map +0 -1
- package/dist/primitive-props-BNHDkgd7.d.ts +0 -16
- package/dist/protocol-dYgafTYY.d.ts +0 -314
- package/dist/reducer/advanced.d.ts +0 -82
- package/dist/reducer/advanced.js +0 -51
- package/dist/reducer/advanced.js.map +0 -1
- package/dist/reducer-contract.d.ts +0 -11
- package/dist/reducer-contract.js +0 -16
- package/dist/reducer-contract.js.map +0 -1
- package/dist/reference-games/index.d.ts +0 -31
- package/dist/reference-games/index.js +0 -48
- package/dist/reference-games/index.js.map +0 -1
- package/dist/runtime/primitives.d.ts +0 -250
- package/dist/runtime/primitives.js +0 -189
- package/dist/runtime/primitives.js.map +0 -1
- package/dist/runtime/runtime-api.d.ts +0 -2
- package/dist/runtime/runtime-api.js +0 -1
- package/dist/runtime/runtime-api.js.map +0 -1
- package/dist/runtime/workspace-contract.d.ts +0 -392
- package/dist/runtime/workspace-contract.js +0 -28
- package/dist/runtime/workspace-contract.js.map +0 -1
- package/dist/runtime-RJ5orDJU.d.ts +0 -1699
- package/dist/runtime-api-Bz5pwNU_.d.ts +0 -296
- package/dist/runtime-json-CQ9QbLZ5.d.ts +0 -5
- package/dist/runtime.d.ts +0 -83
- package/dist/runtime.js +0 -242
- package/dist/runtime.js.map +0 -1
- package/dist/schema.d.ts +0 -379
- package/dist/stale-contract-artifact-error-XLaweZtF.d.ts +0 -18
- package/dist/testing-compiler.d.ts +0 -37
- package/dist/testing-compiler.js +0 -272
- package/dist/testing-compiler.js.map +0 -1
- package/dist/testing-runtime.d.ts +0 -119
- package/dist/testing-runtime.js +0 -212
- package/dist/testing-runtime.js.map +0 -1
- package/dist/types-DJj5MJkl.d.ts +0 -256
- package/dist/types-DR7DoB1x.d.ts +0 -28
- package/dist/types-JWCYHmu7.d.ts +0 -122
- package/dist/types.d.ts +0 -1958
- package/dist/types.js +0 -14
- package/dist/types.js.map +0 -1
- package/dist/ui/components.d.ts +0 -17
- package/dist/ui/components.js +0 -216
- package/dist/ui/components.js.map +0 -1
- package/dist/ui/defaults.d.ts +0 -19
- package/dist/ui/defaults.js +0 -104
- package/dist/ui/defaults.js.map +0 -1
- package/dist/ui/player-state.d.ts +0 -2
- package/dist/ui/player-state.js +0 -1
- package/dist/ui/player-state.js.map +0 -1
- package/dist/ui/plugin-styles.css +0 -2
- package/dist/ui-contract-GTUPkf8z.d.ts +0 -1168
- package/dist/ui.d.ts +0 -317
- package/dist/ui.js +0 -277
- package/dist/ui.js.map +0 -1
- package/dist/views-BpuWcOyN.d.ts +0 -1641
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/testing/inspection/flow-diagnostic.ts","../src/testing/inspection/inspect-scenario.ts","../src/testing/exploration/cursor.ts","../src/testing/exploration/explore-scenario.ts","../src/testing/ui-fixture/canonical.ts","../src/testing/reducer-scenario/create-reducer-scenario-runner.ts","../src/testing/ui-scenario/define-ui-scenario.ts","../src/testing/ui-fixture/create-fixture-host-harness.ts","../src/testing/ui-fixture/FixturePluginRuntime.tsx","../src/testing/ui-fixture/compile-plugin-protocol-tape.ts","../src/testing/ui-fixture/deterministic-environment.ts","../src/testing/ui-fixture/schema.ts","../src/testing/ui-fixture/compiler.ts","../src/testing/ui-scenario/replay-builders.ts"],"sourcesContent":["import type { ActorRef, FlowDiagnostic } from \"./types.js\";\n\nexport type SchedulerFlowProjection = {\n readonly phase: string;\n readonly step: string | null;\n readonly activePlayerIds: readonly string[];\n readonly pendingPlayerIds: readonly string[];\n /**\n * Causal continuation ownership supplied by trusted scheduler authority.\n * An empty list means the scheduler has proved no edge or cannot prove one;\n * callers must never infer an edge from inactive turns or descriptor prose.\n */\n readonly continuationDependencies?: readonly {\n readonly waiterPlayerId: string;\n readonly blockerPlayerIds: readonly string[];\n }[];\n};\n\nexport function createFlowDiagnostic(options: {\n readonly scheduler: SchedulerFlowProjection;\n readonly playerIds: readonly string[];\n}): FlowDiagnostic {\n const actor = (playerId: string): ActorRef | null => {\n const seat = options.playerIds.indexOf(playerId);\n return seat < 0 ? null : { seat, playerId };\n };\n const actors = (playerIds: readonly string[]): ActorRef[] =>\n [...new Set(playerIds)]\n .flatMap((playerId) => {\n const resolved = actor(playerId);\n return resolved ? [resolved] : [];\n })\n .sort((left, right) => left.seat - right.seat);\n\n const blockedBy = (options.scheduler.continuationDependencies ?? [])\n .flatMap((dependency) => {\n const waiter = actor(dependency.waiterPlayerId);\n const blockers = actors(dependency.blockerPlayerIds);\n return waiter && blockers.length > 0\n ? [\n {\n actor: waiter,\n blockers,\n source: \"scheduler\" as const,\n },\n ]\n : [];\n })\n .sort((left, right) => left.actor.seat - right.actor.seat);\n\n return {\n phase: options.scheduler.phase,\n step: options.scheduler.step,\n activeActors: actors(options.scheduler.activePlayerIds),\n pendingActors: actors(options.scheduler.pendingPlayerIds),\n continuationWaiters: actors(\n blockedBy.map((dependency) => dependency.actor.playerId),\n ),\n blockedBy,\n };\n}\n","import type { InteractionDescriptorLike } from \"../definitions.js\";\nimport type {\n ScenarioCheckpoint,\n ScenarioCommandTraceEntry,\n ScenarioReplay,\n ScenarioReplayDefinition,\n} from \"../definitions.js\";\nimport type { ScenarioDefinitionGameLike } from \"../scenario-definition-validation.js\";\nimport {\n inspectScenarioReplayAuthority,\n replayScenario,\n} from \"../scenario-replay.js\";\nimport { createFlowDiagnostic } from \"./flow-diagnostic.js\";\nimport type {\n ActorRef,\n InspectAction,\n InspectInteraction,\n InspectNode,\n InspectScenarioResult,\n PerspectiveRef,\n PerspectiveSelector,\n ScenarioDispatchTraceEntry,\n ScenarioIdentity,\n Sha256Digest,\n} from \"./types.js\";\n\nexport class ScenarioInspectionError extends Error {\n readonly code:\n | \"TEST_PERSPECTIVE_INVALID\"\n | \"TEST_SCENARIO_INVALID\"\n | \"TEST_SEED_RANGE_INVALID\";\n readonly context: Readonly<Record<string, string | number | boolean>>;\n\n constructor(options: {\n readonly code: ScenarioInspectionError[\"code\"];\n readonly message: string;\n readonly context?: Readonly<Record<string, string | number | boolean>>;\n }) {\n super(options.message);\n this.name = \"ScenarioInspectionError\";\n this.code = options.code;\n this.context = options.context ?? {};\n }\n}\n\nexport type InspectScenarioOptions<Game extends ScenarioDefinitionGameLike> = {\n readonly game: Game;\n readonly scenario: ScenarioReplayDefinition<Game>;\n readonly identity: ScenarioIdentity;\n readonly perspective: PerspectiveSelector;\n readonly at?: ScenarioCheckpoint;\n readonly seed?: number;\n};\n\nexport async function inspectScenario<\n const Game extends ScenarioDefinitionGameLike,\n>(options: InspectScenarioOptions<Game>): Promise<InspectScenarioResult> {\n assertScenarioIdentity(options.identity, options.scenario);\n assertSeed(options.seed);\n const selectedScenario =\n options.seed === undefined\n ? options.scenario\n : {\n ...options.scenario,\n setup: { ...options.scenario.setup, seed: options.seed },\n };\n const checkpoint =\n options.at ??\n ({\n segment: \"given\",\n completed: selectedScenario.given.length,\n } satisfies ScenarioCheckpoint);\n const replay = await replayScenario({\n game: options.game,\n scenario: selectedScenario,\n at: checkpoint,\n });\n const node = inspectScenarioReplayNode({\n replay,\n perspective: options.perspective,\n });\n return {\n schemaVersion: 1,\n scenario: structuredClone(options.identity),\n node,\n seedSource: options.seed === undefined ? \"scenario\" : \"override\",\n };\n}\n\nexport function inspectScenarioReplayNode<Game>(options: {\n readonly replay: ScenarioReplay<Game>;\n readonly perspective: PerspectiveSelector;\n}): InspectNode {\n const baseAuthority = inspectScenarioReplayAuthority({\n replay: options.replay,\n perspective: { kind: \"spectator\" },\n });\n const perspective = resolvePerspective(\n options.perspective,\n baseAuthority.scenario.setup.players,\n baseAuthority.playerIds,\n );\n const authority = inspectScenarioReplayAuthority({\n replay: options.replay,\n perspective:\n perspective.kind === \"spectator\"\n ? perspective\n : { kind: \"player\", seat: perspective.actor.seat },\n });\n const actor = perspective.kind === \"player\" ? perspective.actor : null;\n const interactions = actor\n ? authority.interactions.map(({ descriptor, explanation }) =>\n inspectInteraction(actor, descriptor, explanation),\n )\n : [];\n const actions = actor\n ? authority.interactions.flatMap(\n ({ explanation, actionability }): InspectAction[] => {\n if (\n !actionability.found ||\n !actionability.visible ||\n actionability.descriptor.availability.status !== \"available\" ||\n actionability.inputSatisfiability?.status !== \"yes\"\n ) {\n return [];\n }\n return [\n {\n actor,\n interactionId: actionability.descriptor.interactionId,\n inputs: explanation.inputs,\n explanation,\n hasConcreteCommand: true,\n },\n ];\n },\n )\n : [];\n const node: InspectNode = {\n checkpoint: authority.checkpoint,\n checkpointDigest: authority.checkpointDigest as Sha256Digest,\n setup: structuredClone(authority.scenario.setup),\n flow: createFlowDiagnostic({\n playerIds: authority.playerIds,\n scheduler: authority.scheduler,\n }),\n perspective,\n publicState: authority.publicState,\n view: authority.view,\n interactions,\n actions,\n entropy: {\n seed: authority.entropy.seed ?? authority.scenario.setup.seed,\n draws: structuredClone(authority.entropy.draws),\n },\n dispatchTrace: projectDispatchTrace(\n authority.commandTrace,\n authority.playerIds,\n perspective,\n ),\n };\n return node;\n}\n\nfunction resolvePerspective(\n selector: PerspectiveSelector,\n playerCount: number,\n declaredPlayerIds: readonly string[],\n): PerspectiveRef {\n if (selector.kind === \"spectator\") return { kind: \"spectator\" };\n const seat = selector.seat;\n if (!Number.isSafeInteger(seat) || seat < 0 || seat >= playerCount) {\n throw new ScenarioInspectionError({\n code: \"TEST_PERSPECTIVE_INVALID\",\n message: `Perspective seat ${String(seat)} is outside this ${playerCount}-player scenario.`,\n context: {\n requestedSeat: seat,\n minimumSeat: 0,\n maximumSeat: Math.max(0, playerCount - 1),\n },\n });\n }\n return {\n kind: \"player\",\n actor: {\n seat,\n playerId: declaredPlayerIds[seat] ?? `player-${seat + 1}`,\n },\n };\n}\n\nfunction inspectInteraction(\n actor: ActorRef,\n descriptor: InteractionDescriptorLike,\n explanation: InspectInteraction[\"explanation\"],\n): InspectInteraction {\n const availability = descriptor.availability ?? {\n status: \"blocked\" as const,\n reason: \"Interaction descriptor has no availability.\",\n };\n return {\n actor,\n interactionId: String(descriptor.interactionId ?? \"\"),\n availability: {\n status: availability.status,\n ...(\"code\" in availability && typeof availability.code === \"string\"\n ? { code: availability.code }\n : {}),\n ...(\"reason\" in availability && typeof availability.reason === \"string\"\n ? { reason: availability.reason }\n : {}),\n },\n inputs: explanation.inputs,\n explanation,\n };\n}\n\nfunction projectDispatchTrace<Game>(\n commandTrace: readonly ScenarioCommandTraceEntry<Game>[],\n playerIds: readonly string[],\n perspective: PerspectiveRef,\n): ScenarioDispatchTraceEntry[] {\n if (perspective.kind === \"spectator\") return [];\n const selectedSeat = perspective.actor.seat;\n return commandTrace.flatMap((entry): ScenarioDispatchTraceEntry[] => {\n if (entry.command.actor.seat !== selectedSeat) return [];\n return entry.trace.flatMap((trace): ScenarioDispatchTraceEntry[] => {\n switch (trace.kind) {\n case \"acceptedClientInput\": {\n const seat = playerIds.indexOf(trace.playerId);\n return seat < 0\n ? []\n : [\n {\n kind: \"acceptedCommand\",\n actor: { seat, playerId: trace.playerId },\n interactionId: trace.interactionId,\n },\n ];\n }\n case \"appliedInstruction\":\n return [\n {\n kind: \"appliedInstruction\",\n instructionKind: trace.instruction,\n },\n ];\n case \"rngConsumption\":\n return [{ kind: \"entropyDraw\", drawIndex: trace.drawIndex }];\n }\n });\n });\n}\n\nfunction assertScenarioIdentity<Game>(\n identity: ScenarioIdentity,\n scenario: ScenarioReplayDefinition<Game>,\n): void {\n if (identity.id !== scenario.id) {\n throw new ScenarioInspectionError({\n code: \"TEST_SCENARIO_INVALID\",\n message: \"Scenario identity does not match the authored default export.\",\n context: { identityId: identity.id, scenarioId: scenario.id },\n });\n }\n}\n\nfunction assertSeed(seed: number | undefined): void {\n if (seed !== undefined && !Number.isSafeInteger(seed)) {\n throw new ScenarioInspectionError({\n code: \"TEST_SEED_RANGE_INVALID\",\n message: \"Seed override must be a safe integer.\",\n context: { requestedSeed: seed },\n });\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport { digestPluginRuntimeJson } from \"@dreamboard-games/plugin-runtime-contract\";\nimport type {\n PerspectiveRef,\n ScenarioIdentity,\n Sha256Digest,\n} from \"../inspection/types.js\";\n\nconst CURSOR_VERSION = 1;\n\ntype CursorPayload = {\n readonly version: typeof CURSOR_VERSION;\n readonly scenarioSourceDigest: Sha256Digest;\n readonly checkpointDigest: Sha256Digest;\n readonly perspective: PerspectiveRef;\n readonly seedOverride: number | null;\n readonly nextOrdinal: number;\n};\n\nexport class ExploreCursorError extends Error {\n readonly code = \"TEST_EXPLORE_CURSOR_STALE\";\n readonly scenarioSourceDigest: Sha256Digest;\n readonly checkpointDigest: Sha256Digest;\n\n constructor(options: {\n readonly scenarioSourceDigest: Sha256Digest;\n readonly checkpointDigest: Sha256Digest;\n }) {\n super(\"The exploration cursor no longer matches scenario authority.\");\n this.name = \"ExploreCursorError\";\n this.scenarioSourceDigest = options.scenarioSourceDigest;\n this.checkpointDigest = options.checkpointDigest;\n }\n}\n\nexport function createExploreCursor(options: {\n readonly scenario: ScenarioIdentity;\n readonly checkpointDigest: Sha256Digest;\n readonly perspective: PerspectiveRef;\n readonly seedOverride?: number;\n readonly nextOrdinal: number;\n}): string {\n assertOrdinal(options.nextOrdinal);\n const payload: CursorPayload = {\n version: CURSOR_VERSION,\n scenarioSourceDigest: options.scenario.sourceDigest,\n checkpointDigest: options.checkpointDigest,\n perspective: options.perspective,\n seedOverride: options.seedOverride ?? null,\n nextOrdinal: options.nextOrdinal,\n };\n const encoded = Buffer.from(JSON.stringify(payload), \"utf8\").toString(\n \"base64url\",\n );\n const digest = digestPluginRuntimeJson(payload).slice(\"sha256:\".length);\n return `dbx1.${encoded}.${digest}`;\n}\n\nexport function readExploreCursor(options: {\n readonly cursor: string;\n readonly scenario: ScenarioIdentity;\n readonly checkpointDigest: Sha256Digest;\n readonly perspective: PerspectiveRef;\n readonly seedOverride?: number;\n}): number {\n const stale = () => {\n throw new ExploreCursorError({\n scenarioSourceDigest: options.scenario.sourceDigest,\n checkpointDigest: options.checkpointDigest,\n });\n };\n const [prefix, encoded, digest, extra] = options.cursor.split(\".\");\n if (prefix !== \"dbx1\" || !encoded || !digest || extra !== undefined) stale();\n\n let payload: CursorPayload;\n try {\n payload = JSON.parse(\n Buffer.from(encoded, \"base64url\").toString(\"utf8\"),\n ) as CursorPayload;\n } catch {\n return stale();\n }\n\n if (\n digestPluginRuntimeJson(payload).slice(\"sha256:\".length) !== digest ||\n payload.version !== CURSOR_VERSION ||\n payload.scenarioSourceDigest !== options.scenario.sourceDigest ||\n payload.checkpointDigest !== options.checkpointDigest ||\n payload.seedOverride !== (options.seedOverride ?? null) ||\n JSON.stringify(payload.perspective) !== JSON.stringify(options.perspective)\n ) {\n return stale();\n }\n assertOrdinal(payload.nextOrdinal);\n return payload.nextOrdinal;\n}\n\nfunction assertOrdinal(value: number): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(\n \"Explore cursor ordinal must be a non-negative safe integer.\",\n );\n }\n}\n","import {\n advanceScenarioReplay,\n enumerateScenarioInteractionParams,\n replayScenario,\n} from \"../scenario-replay.js\";\nimport type {\n ScenarioCheckpoint,\n ScenarioCommand,\n ScenarioReplay,\n ScenarioReplayDefinition,\n} from \"../definitions.js\";\nimport { ScenarioReplayError } from \"../definitions.js\";\nimport type { ScenarioDefinitionGameLike } from \"../scenario-definition-validation.js\";\nimport { projectScenarioCommandParams } from \"../scenario-player-refs.js\";\nimport {\n compareCanonicalScenarioJson,\n digestScenarioJson,\n} from \"../canonical.js\";\nimport {\n inspectScenario,\n inspectScenarioReplayNode,\n type InspectScenarioOptions,\n} from \"../inspection/inspect-scenario.js\";\nimport type { InspectNode, Sha256Digest } from \"../inspection/types.js\";\nimport { createExploreCursor, readExploreCursor } from \"./cursor.js\";\nimport type {\n ExploreScenarioResult,\n ExploreSeedResult,\n ExploreTransitionResult,\n} from \"./types.js\";\n\nexport const DEFAULT_EXPLORE_LIMIT = 50;\nexport const MAX_EXPLORE_LIMIT = 200;\nexport const DEFAULT_EXPLORE_EVALUATIONS = 5_000;\nexport const MAX_EXPLORE_EVALUATIONS = 100_000;\nexport const MAX_EXPLORE_SEEDS = 64;\n\nexport class ScenarioExploreError extends Error {\n readonly code: \"TEST_EXPLORE_LIMIT_INVALID\" | \"TEST_SEED_RANGE_INVALID\";\n readonly context: Readonly<Record<string, string | number | boolean>>;\n\n constructor(options: {\n readonly code: ScenarioExploreError[\"code\"];\n readonly message: string;\n readonly context: Readonly<Record<string, string | number | boolean>>;\n }) {\n super(options.message);\n this.name = \"ScenarioExploreError\";\n this.code = options.code;\n this.context = options.context;\n }\n}\n\ntype SeedRange = {\n readonly start: number;\n readonly end: number;\n};\n\nexport type ExploreScenarioOptions<Game extends ScenarioDefinitionGameLike> =\n Omit<InspectScenarioOptions<Game>, \"seed\"> & {\n readonly seed?: number;\n readonly seedRange?: SeedRange;\n readonly limit?: number;\n readonly maxEvaluations?: number;\n readonly cursor?: string;\n };\n\nexport async function exploreScenario<\n const Game extends ScenarioDefinitionGameLike,\n>(options: ExploreScenarioOptions<Game>): Promise<ExploreScenarioResult> {\n if (options.seedRange) {\n if (\n options.seed !== undefined ||\n options.cursor !== undefined ||\n options.limit !== undefined\n ) {\n throw new ScenarioExploreError({\n code: \"TEST_SEED_RANGE_INVALID\",\n message:\n \"Seed-range exploration cannot be combined with a seed override, cursor, or transition-page limit.\",\n context: { start: options.seedRange.start, end: options.seedRange.end },\n });\n }\n return exploreSeeds(options, options.seedRange);\n }\n return exploreTransitions(options);\n}\n\nasync function exploreTransitions<Game extends ScenarioDefinitionGameLike>(\n options: ExploreScenarioOptions<Game>,\n): Promise<ExploreTransitionResult> {\n const limit = options.limit ?? DEFAULT_EXPLORE_LIMIT;\n const maxEvaluations = options.maxEvaluations ?? DEFAULT_EXPLORE_EVALUATIONS;\n assertTransitionLimits(limit, maxEvaluations);\n const selectedScenario = scenarioWithSeed(options.scenario, options.seed);\n const checkpoint = defaultCheckpoint(selectedScenario, options.at);\n const replay = await replayScenario({\n game: options.game,\n scenario: selectedScenario,\n at: checkpoint,\n });\n const node = inspectScenarioReplayNode({\n replay,\n perspective: options.perspective,\n });\n const startOrdinal = options.cursor\n ? readExploreCursor({\n cursor: options.cursor,\n scenario: options.identity,\n checkpointDigest: node.checkpointDigest,\n perspective: node.perspective,\n seedOverride: options.seed,\n })\n : 0;\n if (node.perspective.kind === \"spectator\") {\n return {\n schemaVersion: 1,\n mode: \"transitions\",\n scenario: options.identity,\n perspective: node.perspective,\n node,\n candidates: [],\n omissions: [],\n page: {\n limit,\n evaluated: 0,\n truncated: false,\n nextCursor: null,\n },\n };\n }\n\n const accepted: ExploreTransitionResult[\"candidates\"][number][] = [];\n const omissions: ExploreTransitionResult[\"omissions\"][number][] = [];\n let evaluated = 0;\n for (const action of node.actions) {\n const remaining = maxEvaluations - evaluated;\n if (remaining <= 0) {\n omissions.push({\n actor: action.actor,\n interactionId: action.interactionId,\n code: \"INPUT_DOMAIN_BUDGET\",\n });\n continue;\n }\n const enumeration = enumerateScenarioInteractionParams({\n replay,\n seat: action.actor.seat,\n interactionId: action.interactionId,\n maxEvaluations: remaining,\n });\n if (\n !enumeration.found ||\n !enumeration.visible ||\n !enumeration.enumeration\n ) {\n continue;\n }\n evaluated += enumeration.enumeration.evaluated;\n if (enumeration.enumeration.status !== \"enumerated\") {\n omissions.push({\n actor: action.actor,\n interactionId: action.interactionId,\n code:\n enumeration.enumeration.status === \"budget\"\n ? \"INPUT_DOMAIN_BUDGET\"\n : \"INPUT_DOMAIN_NOT_ENUMERABLE\",\n ...(enumeration.enumeration.inputKey\n ? { inputKey: enumeration.enumeration.inputKey }\n : {}),\n });\n continue;\n }\n const assignments = [...enumeration.enumeration.assignments].sort(\n compareCanonicalScenarioJson,\n );\n for (const assignment of assignments) {\n const command: ScenarioCommand = {\n actor: { seat: action.actor.seat },\n interactionId: action.interactionId,\n params: projectScenarioCommandParams({\n game: options.game,\n phase: node.flow.phase,\n interactionId: action.interactionId,\n params: assignment,\n playerIds: node.setup.players\n ? Array.from(\n { length: node.setup.players },\n (_, seat) =>\n options.game.contract.manifest.literals.playerIds[seat] ??\n `player-${seat + 1}`,\n )\n : [],\n path: `explore.${action.interactionId}`,\n }),\n };\n const advanced = await advanceScenarioReplay({\n replay,\n command: command as never,\n });\n if (advanced.kind !== \"accepted\") continue;\n const afterNode = inspectScenarioReplayNode({\n replay: advanced.replay,\n perspective: options.perspective,\n });\n accepted.push({\n ordinal: accepted.length,\n command,\n after: {\n checkpointDigest: afterNode.checkpointDigest,\n flow: afterNode.flow,\n publicStateDigest: digestScenarioJson(\n afterNode.publicState,\n ) as Sha256Digest,\n viewDigest: digestScenarioJson(afterNode.view) as Sha256Digest,\n actions: afterNode.actions.map(({ actor, interactionId }) => ({\n actor,\n interactionId,\n })),\n entropy: afterNode.entropy,\n dispatchTrace: afterNode.dispatchTrace,\n },\n });\n }\n }\n\n const candidates = accepted.slice(startOrdinal, startOrdinal + limit);\n const nextOrdinal = startOrdinal + candidates.length;\n const truncated = nextOrdinal < accepted.length;\n return {\n schemaVersion: 1,\n mode: \"transitions\",\n scenario: structuredClone(options.identity),\n perspective: node.perspective,\n node,\n candidates,\n omissions,\n page: {\n limit,\n evaluated,\n truncated,\n nextCursor: truncated\n ? createExploreCursor({\n scenario: options.identity,\n checkpointDigest: node.checkpointDigest,\n perspective: node.perspective,\n seedOverride: options.seed,\n nextOrdinal,\n })\n : null,\n },\n };\n}\n\nasync function exploreSeeds<Game extends ScenarioDefinitionGameLike>(\n options: ExploreScenarioOptions<Game>,\n range: SeedRange,\n): Promise<ExploreSeedResult> {\n assertSeedRange(range);\n const checkpoint = defaultCheckpoint(options.scenario, options.at);\n const variants: ExploreSeedResult[\"variants\"][number][] = [];\n for (let seed = range.start; seed <= range.end; seed += 1) {\n try {\n const inspected = await inspectScenario({\n game: options.game,\n scenario: options.scenario,\n identity: options.identity,\n perspective: options.perspective,\n at: checkpoint,\n seed,\n });\n const replay = await replayScenario({\n game: options.game,\n scenario: scenarioWithSeed(options.scenario, seed),\n at: checkpoint,\n });\n const counts = await concreteOptionCounts({\n replay,\n node: inspected.node,\n maxEvaluations: options.maxEvaluations ?? DEFAULT_EXPLORE_EVALUATIONS,\n });\n variants.push({\n seed,\n status: \"replayed\",\n checkpointDigest: inspected.node.checkpointDigest,\n entropy: inspected.node.entropy,\n observable: {\n publicState: inspected.node.publicState,\n view: inspected.node.view,\n },\n signature: {\n phase: inspected.node.flow.phase,\n step: inspected.node.flow.step,\n actions: inspected.node.actions.map(({ actor, interactionId }) => ({\n seat: actor.seat,\n interactionId,\n concreteOptionCount:\n counts.get(`${actor.seat}:${interactionId}`) ?? \"lazy\",\n })),\n },\n });\n } catch (error) {\n if (!(error instanceof ScenarioReplayError)) throw error;\n variants.push({\n seed,\n status: \"rejected\",\n rejection: {\n segment: error.segment,\n sourceIndex: error.index,\n interactionId: error.interactionId,\n errorCode: error.errorCode,\n },\n });\n }\n }\n return {\n schemaVersion: 1,\n mode: \"seeds\",\n scenario: structuredClone(options.identity),\n perspective: (await inspectSeedPerspective(options)).node.perspective,\n checkpoint,\n variants,\n };\n}\n\nasync function inspectSeedPerspective<Game extends ScenarioDefinitionGameLike>(\n options: ExploreScenarioOptions<Game>,\n) {\n return inspectScenario({\n game: options.game,\n scenario: options.scenario,\n identity: options.identity,\n perspective: options.perspective,\n at: { segment: \"setup\", completed: 0 },\n });\n}\n\nasync function concreteOptionCounts<Game>(options: {\n readonly replay: ScenarioReplay<Game>;\n readonly node: InspectNode;\n readonly maxEvaluations: number;\n}): Promise<Map<string, number | \"lazy\">> {\n assertTransitionLimits(DEFAULT_EXPLORE_LIMIT, options.maxEvaluations);\n const counts = new Map<string, number | \"lazy\">();\n let evaluated = 0;\n for (const action of options.node.actions) {\n const remaining = options.maxEvaluations - evaluated;\n if (remaining <= 0) {\n counts.set(`${action.actor.seat}:${action.interactionId}`, \"lazy\");\n continue;\n }\n const result = enumerateScenarioInteractionParams({\n replay: options.replay,\n seat: action.actor.seat,\n interactionId: action.interactionId,\n maxEvaluations: remaining,\n });\n if (!result.found || !result.visible || !result.enumeration) continue;\n evaluated += result.enumeration.evaluated;\n counts.set(\n `${action.actor.seat}:${action.interactionId}`,\n result.enumeration.status === \"enumerated\"\n ? result.enumeration.assignments.length\n : \"lazy\",\n );\n }\n return counts;\n}\n\nfunction scenarioWithSeed<Game>(\n scenario: ScenarioReplayDefinition<Game>,\n seed: number | undefined,\n): ScenarioReplayDefinition<Game> {\n return seed === undefined\n ? scenario\n : { ...scenario, setup: { ...scenario.setup, seed } };\n}\n\nfunction defaultCheckpoint<Game>(\n scenario: ScenarioReplayDefinition<Game>,\n at: ScenarioCheckpoint | undefined,\n): ScenarioCheckpoint {\n return (at ?? {\n segment: \"given\",\n completed: scenario.given.length,\n }) as ScenarioCheckpoint;\n}\n\nfunction assertTransitionLimits(limit: number, maxEvaluations: number): void {\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_EXPLORE_LIMIT) {\n throw new ScenarioExploreError({\n code: \"TEST_EXPLORE_LIMIT_INVALID\",\n message: `Explore limit must be between 1 and ${MAX_EXPLORE_LIMIT}.`,\n context: { requested: limit, minimum: 1, maximum: MAX_EXPLORE_LIMIT },\n });\n }\n if (\n !Number.isSafeInteger(maxEvaluations) ||\n maxEvaluations < 1 ||\n maxEvaluations > MAX_EXPLORE_EVALUATIONS\n ) {\n throw new ScenarioExploreError({\n code: \"TEST_EXPLORE_LIMIT_INVALID\",\n message: `Explore max evaluations must be between 1 and ${MAX_EXPLORE_EVALUATIONS}.`,\n context: {\n requested: maxEvaluations,\n minimum: 1,\n maximum: MAX_EXPLORE_EVALUATIONS,\n },\n });\n }\n}\n\nfunction assertSeedRange(range: SeedRange): void {\n const width = range.end - range.start + 1;\n if (\n !Number.isSafeInteger(range.start) ||\n !Number.isSafeInteger(range.end) ||\n range.start > range.end ||\n !Number.isSafeInteger(width) ||\n width < 1 ||\n width > MAX_EXPLORE_SEEDS\n ) {\n throw new ScenarioExploreError({\n code: \"TEST_SEED_RANGE_INVALID\",\n message: `Seed range must contain 1 through ${MAX_EXPLORE_SEEDS} inclusive safe-integer seeds.`,\n context: {\n start: range.start,\n end: range.end,\n maximumWidth: MAX_EXPLORE_SEEDS,\n },\n });\n }\n}\n","import { createHash } from \"node:crypto\";\nimport type {\n PluginProtocolTape,\n UIReplayRequest,\n UIScenarioFixture,\n} from \"./schema.js\";\n\ntype CanonicalJson =\n | null\n | boolean\n | number\n | string\n | readonly CanonicalJson[]\n | { readonly [key: string]: CanonicalJson };\n\nconst sha256DigestPattern = /^sha256:[a-f0-9]{64}$/;\n\nfunction compareCanonicalStrings(left: string, right: string): number {\n return left === right ? 0 : left < right ? -1 : 1;\n}\n\nexport function isSha256Digest(value: string): boolean {\n return sha256DigestPattern.test(value);\n}\n\nexport function canonicalizeUIFixtureJson(value: unknown): CanonicalJson {\n if (value === null) {\n return null;\n }\n switch (typeof value) {\n case \"boolean\":\n case \"string\":\n return value;\n case \"number\":\n if (Number.isFinite(value)) {\n return value;\n }\n break;\n case \"object\": {\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeUIFixtureJson(item));\n }\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n break;\n }\n const entries = Object.entries(value as Record<string, unknown>);\n return Object.fromEntries(\n entries\n .filter(([, item]) => item !== undefined)\n .sort(([left], [right]) => compareCanonicalStrings(left, right))\n .map(([key, item]) => [key, canonicalizeUIFixtureJson(item)]),\n );\n }\n }\n throw new Error(\n `UI fixture values must be deterministic JSON. Received ${typeof value}.`,\n );\n}\n\nexport function canonicalUIFixtureJson(value: unknown): string {\n return JSON.stringify(canonicalizeUIFixtureJson(value));\n}\n\nexport function digestUIFixtureJson(value: unknown): string {\n return sha256(canonicalUIFixtureJson(value));\n}\n\nexport function digestUIFixtureRequest(request: UIReplayRequest): string {\n return digestUIFixtureJson({\n digestVersion: \"ui-replay-request@2\",\n request,\n });\n}\n\nexport function digestUIFixtureTransportRequest(request: {\n readonly operation: \"validate\" | \"submit\";\n readonly basis?: {\n readonly version: number;\n readonly actionSetVersion: string;\n readonly perspectivePlayerId: string;\n };\n readonly interactionId?: string;\n readonly payload?: unknown;\n}): string {\n return digestUIFixtureJson({\n digestVersion: \"ui-fixture-runtime-command@3\",\n request,\n });\n}\n\nexport function digestPluginProtocolTape(tape: PluginProtocolTape): string {\n return digestUIFixtureJson({\n digestVersion: \"plugin-protocol-tape@2\",\n tape,\n });\n}\n\nexport function canonicalizeUIScenarioFixture(\n fixture: UIScenarioFixture,\n): UIScenarioFixture {\n return canonicalizeUIFixtureJson({\n ...fixture,\n tags: [...fixture.tags].sort(),\n environment: {\n ...fixture.environment,\n viewportTags: [...fixture.environment.viewportTags].sort(),\n },\n }) as unknown as UIScenarioFixture;\n}\n\nexport function serializeUIScenarioFixture(fixture: UIScenarioFixture): string {\n return `${JSON.stringify(canonicalizeUIScenarioFixture(fixture), null, 2)}\\n`;\n}\n\nexport function digestUIScenarioFixture(fixture: UIScenarioFixture): string {\n return sha256(serializeUIScenarioFixture(fixture));\n}\n\nfunction sha256(value: string): string {\n return `sha256:${createHash(\"sha256\").update(value).digest(\"hex\")}`;\n}\n","import {\n computePluginActionSetVersion,\n materializePluginGameplayFrame,\n} from \"@dreamboard-games/plugin-runtime-contract\";\nimport { digestUIFixtureJson } from \"../ui-fixture/canonical.js\";\nimport type {\n CreateReducerScenarioRunnerOptions,\n ReducerScenarioFrame,\n ReducerScenarioExchange,\n ReducerScenarioOperation,\n ReducerScenarioRunner,\n ReducerScenarioTrace,\n} from \"./types.js\";\n\nexport function createReducerScenarioRunner(\n options: CreateReducerScenarioRunnerOptions,\n): ReducerScenarioRunner {\n return {\n async run(\n operations: readonly ReducerScenarioOperation[],\n ): Promise<ReducerScenarioTrace> {\n let state = structuredClone(options.initialState);\n let gameVersion = options.initialGameVersion ?? 1;\n const frames: ReducerScenarioFrame[] = [];\n const exchanges: ReducerScenarioExchange[] = [];\n\n const appendFrame = (id: string): ReducerScenarioFrame => {\n const dynamicProjection = options.bundle.project({\n state,\n playerIds: [options.viewer.playerId],\n });\n const staticProjection = options.bundle.boardStatic();\n const flow = readFlowState(state);\n const materialized = materializePluginGameplayFrame({\n currentPhase: flow.currentPhase,\n activePlayers: flow.activePlayers,\n dynamicProjection,\n staticProjection,\n perspectivePlayerId: options.viewer.playerId,\n version: gameVersion,\n actionSetVersion: \"pending\",\n });\n const actionSetVersion = computePluginActionSetVersion({\n version: gameVersion,\n availableInteractions: materialized.availableInteractions,\n });\n const frame = {\n id,\n reducerState: structuredClone(state),\n dynamicProjection,\n staticProjection,\n gameVersion,\n actionSetVersion,\n projectionDigest: digestUIFixtureJson({\n digestVersion: \"reducer-scenario-frame@2\",\n scenarioId: options.scenarioId,\n frameId: id,\n dynamicProjection,\n staticProjection,\n gameVersion,\n actionSetVersion,\n }),\n } satisfies ReducerScenarioFrame;\n frames.push(frame);\n return frame;\n };\n\n appendFrame(\"frame-1\");\n\n for (const operation of operations) {\n const fromFrame = frames[frames.length - 1];\n if (!fromFrame) {\n throw new Error(\"Reducer scenario runner lost its initial frame.\");\n }\n if (operation.operation === \"validate\") {\n // Authoring probes execute the canonical operation without committing it.\n const dispatched = await options.bundle.dispatch({\n state: structuredClone(state),\n input: operation.input,\n });\n const result =\n dispatched.kind === \"accept\"\n ? { valid: true }\n : {\n valid: false,\n errorCode: dispatched.errorCode,\n message: dispatched.message,\n };\n exchanges.push({\n id: operation.id,\n operation: \"validate\",\n fromFrameId: fromFrame.id,\n input: operation.input,\n result,\n });\n continue;\n }\n\n const result = await options.bundle.dispatch({\n state,\n input: operation.input,\n });\n if (result.kind === \"reject\") {\n exchanges.push({\n id: operation.id,\n operation: \"submit\",\n fromFrameId: fromFrame.id,\n input: operation.input,\n result: {\n kind: \"rejected\",\n diagnostics: [\n {\n code: result.errorCode,\n message: result.message ?? result.errorCode,\n },\n ],\n },\n });\n continue;\n }\n\n state = structuredClone(result.state);\n gameVersion += 1;\n const toFrame = appendFrame(`frame-${frames.length + 1}`);\n exchanges.push({\n id: operation.id,\n operation: \"submit\",\n fromFrameId: fromFrame.id,\n input: operation.input,\n result: {\n kind: \"accepted\",\n toFrameId: toFrame.id,\n },\n });\n }\n\n return {\n scenarioId: options.scenarioId,\n gameId: options.gameId,\n viewer: options.viewer,\n frames,\n exchanges,\n };\n },\n };\n}\n\nfunction readFlowState(state: {\n readonly domain?: {\n readonly flow?: {\n readonly currentPhase?: string;\n readonly activePlayers?: readonly string[];\n };\n };\n}): { currentPhase: string | null; activePlayers: readonly string[] } {\n return {\n currentPhase: state.domain?.flow?.currentPhase ?? null,\n activePlayers: [...(state.domain?.flow?.activePlayers ?? [])],\n };\n}\n","import type {\n ReferenceGameUIScenarioDefinition,\n UIScenarioDefinition,\n} from \"./types.js\";\n\nexport function defineUIScenario<const TScenario extends UIScenarioDefinition>(\n scenario: TScenario,\n): Readonly<TScenario> {\n return Object.freeze(scenario);\n}\n\nexport function defineReferenceGameUIScenario<\n const TScenario extends ReferenceGameUIScenarioDefinition,\n>(scenario: TScenario): Readonly<TScenario> {\n return Object.freeze(scenario);\n}\n","import {\n DREAMBOARD_PLUGIN_PROTOCOL,\n DREAMBOARD_PLUGIN_PROTOCOL_VERSION,\n type HostToPluginEnvelope,\n type PluginProtocolTape,\n type PluginToHostPayload,\n type SubmitInteractionCommand,\n} from \"@dreamboard-games/plugin-runtime-contract\";\nimport type { PluginTransport } from \"../../runtime/core/types.js\";\nimport { digestUIFixtureTransportRequest } from \"./canonical.js\";\n\nexport interface FixtureHostEvent {\n readonly sequence: number;\n readonly atMs: number;\n readonly kind:\n | \"frame-sent\"\n | \"submit-received\"\n | \"ack-received\"\n | \"ready-received\"\n | \"diagnostic\";\n readonly requestDigest?: string;\n readonly frameId?: string;\n readonly projectionDigest?: string;\n readonly result?: \"accepted\" | \"rejected\";\n}\n\nexport interface FixtureHostHarness {\n readonly transport: PluginTransport;\n readonly tape: PluginProtocolTape;\n reset(): void;\n flush(): Promise<void>;\n advanceHost(): Promise<void>;\n getCurrentFrameId(): string;\n getEvents(): readonly FixtureHostEvent[];\n assertConsumed(): void;\n}\n\nexport interface CreateFixtureHostHarnessOptions {\n readonly tape: PluginProtocolTape;\n readonly strict?: boolean;\n readonly latencyMs?: number;\n readonly channelId?: string;\n readonly onEvent?: (event: FixtureHostEvent) => void;\n readonly nowMs?: () => number;\n}\n\nconst DEFAULT_CHANNEL_ID = \"fixture-channel\";\n\nexport function createFixtureHostHarness(\n options: CreateFixtureHostHarnessOptions,\n): FixtureHostHarness {\n const strict = options.strict ?? true;\n const latencyMs = options.latencyMs ?? 0;\n const channelId = options.channelId ?? DEFAULT_CHANNEL_ID;\n const events: FixtureHostEvent[] = [];\n const frameById = new Map(\n options.tape.frames.map((frame) => [frame.id, frame]),\n );\n let eventSequence = 0;\n let envelopeSequence = 0;\n let stepCursor = 0;\n let currentFrameId: string | null = null;\n let onMessage: ((message: HostToPluginEnvelope) => void) | null = null;\n let firstFixtureError: Error | null = null;\n const pendingHandlers = new Set<Promise<void>>();\n\n const record = (event: Omit<FixtureHostEvent, \"sequence\" | \"atMs\">) => {\n const entry = {\n sequence: ++eventSequence,\n atMs: options.nowMs?.() ?? eventSequence,\n ...event,\n };\n events.push(entry);\n options.onEvent?.(entry);\n };\n\n const createFixtureError = (code: string, message: string): Error => {\n record({ kind: \"diagnostic\" });\n const error = new Error(message);\n error.name = \"FixtureHostHarnessError\";\n Object.assign(error, { errorCode: code });\n return error;\n };\n\n const rememberFixtureError = (error: unknown) => {\n if (firstFixtureError) {\n return;\n }\n firstFixtureError =\n error instanceof Error\n ? error\n : createFixtureError(\n \"fixture-unknown-error\",\n \"Fixture host failed with an unknown error.\",\n );\n };\n\n const throwFixtureError = () => {\n if (firstFixtureError) {\n throw firstFixtureError;\n }\n };\n\n const sendHostPayload = (payload: HostToPluginEnvelope[\"payload\"]) => {\n if (!onMessage) {\n return;\n }\n onMessage({\n protocol: DREAMBOARD_PLUGIN_PROTOCOL,\n version: DREAMBOARD_PLUGIN_PROTOCOL_VERSION,\n channelId,\n sequence: ++envelopeSequence,\n payload,\n });\n };\n\n const sendInit = () => {\n sendHostPayload({\n type: \"runtime.init\",\n session: options.tape.session,\n });\n };\n\n const publishFrame = (frameId: string) => {\n const frame = frameById.get(frameId);\n if (!frame) {\n throw createFixtureError(\n \"fixture-missing-frame\",\n `Plugin protocol tape references missing frame '${frameId}'.`,\n );\n }\n currentFrameId = frame.id;\n record({\n kind: \"frame-sent\",\n frameId: frame.id,\n projectionDigest: frame.projectionDigest,\n });\n sendHostPayload({\n type: \"gameplay.frame\",\n frame: frame.frame,\n });\n };\n\n const drainHostFrames = () => {\n while (options.tape.steps[stepCursor]?.kind === \"host.frame\") {\n const step = options.tape.steps[stepCursor] as Extract<\n PluginProtocolTape[\"steps\"][number],\n { kind: \"host.frame\" }\n >;\n stepCursor += 1;\n publishFrame(step.frameId);\n }\n };\n\n const drainOneHostFrame = () => {\n if (options.tape.steps[stepCursor]?.kind !== \"host.frame\") {\n return;\n }\n const step = options.tape.steps[stepCursor] as Extract<\n PluginProtocolTape[\"steps\"][number],\n { kind: \"host.frame\" }\n >;\n stepCursor += 1;\n publishFrame(step.frameId);\n };\n\n const waitForConfiguredLatency = async () => {\n if (latencyMs <= 0) {\n await Promise.resolve();\n return;\n }\n await new Promise<void>((resolve) => setTimeout(resolve, latencyMs));\n };\n\n const consumeExpectedStep = <Kind extends \"client.submit\">(\n kind: Kind,\n requestDigest: string,\n ): Extract<PluginProtocolTape[\"steps\"][number], { kind: Kind }> => {\n const step = options.tape.steps[stepCursor];\n if (!step) {\n throw createFixtureError(\n \"fixture-protocol-exhausted\",\n `Plugin protocol tape has no remaining step for ${kind}.`,\n );\n }\n if (step.kind !== kind) {\n throw createFixtureError(\n \"fixture-protocol-step-mismatch\",\n `Expected protocol step '${step.kind}' but received '${kind}'.`,\n );\n }\n if (step.fromFrameId !== currentFrameId) {\n throw createFixtureError(\n \"fixture-protocol-frame-mismatch\",\n `Expected protocol from frame '${step.fromFrameId}' but current frame is '${currentFrameId ?? \"<none>\"}'.`,\n );\n }\n if (step.requestDigest !== requestDigest) {\n const mode = strict ? \"strict\" : \"compatible\";\n throw createFixtureError(\n \"fixture-protocol-digest-mismatch\",\n `${mode} fixture protocol digest mismatch for ${kind}: expected ${step.requestDigest}, received ${requestDigest}.`,\n );\n }\n stepCursor += 1;\n return step as Extract<PluginProtocolTape[\"steps\"][number], { kind: Kind }>;\n };\n\n const handleSubmit = async (command: SubmitInteractionCommand) => {\n const requestDigest = digestUIFixtureTransportRequest({\n operation: \"submit\",\n basis: command.basis,\n interactionId: command.interactionId,\n payload: command.params,\n });\n const step = consumeExpectedStep(\"client.submit\", requestDigest);\n record({\n kind: \"submit-received\",\n requestDigest,\n result: step.response.accepted ? \"accepted\" : \"rejected\",\n });\n await waitForConfiguredLatency();\n sendHostPayload({\n ...step.response,\n clientActionId: command.clientActionId,\n });\n if (step.response.accepted) {\n await waitForConfiguredLatency();\n drainHostFrames();\n }\n };\n\n const handleClientPayload = (payload: PluginToHostPayload) => {\n const trackHandler = (promise: Promise<void>) => {\n pendingHandlers.add(promise);\n promise\n .catch((error) => {\n rememberFixtureError(error);\n })\n .finally(() => {\n pendingHandlers.delete(promise);\n });\n };\n\n switch (payload.type) {\n case \"runtime.ready\":\n record({ kind: \"ready-received\" });\n break;\n case \"runtime.ack\":\n record({ kind: \"ack-received\" });\n break;\n case \"interaction.submit\":\n trackHandler(handleSubmit(payload));\n break;\n case \"runtime.error\":\n record({ kind: \"diagnostic\" });\n break;\n default: {\n const _exhaustive: never = payload;\n return _exhaustive;\n }\n }\n };\n\n const transport: PluginTransport = {\n start(nextOnMessage) {\n onMessage = nextOnMessage;\n queueMicrotask(() => {\n sendInit();\n drainOneHostFrame();\n });\n return () => {\n onMessage = null;\n };\n },\n send(message) {\n handleClientPayload(message);\n },\n };\n\n return {\n transport,\n tape: options.tape,\n reset() {\n eventSequence = 0;\n envelopeSequence = 0;\n stepCursor = 0;\n currentFrameId = null;\n firstFixtureError = null;\n pendingHandlers.clear();\n events.length = 0;\n if (onMessage) {\n sendInit();\n drainOneHostFrame();\n }\n },\n async flush() {\n await waitForConfiguredLatency();\n await Promise.resolve();\n while (pendingHandlers.size > 0) {\n await Promise.allSettled([...pendingHandlers]);\n }\n throwFixtureError();\n },\n async advanceHost() {\n await waitForConfiguredLatency();\n drainHostFrames();\n throwFixtureError();\n },\n getCurrentFrameId() {\n if (!currentFrameId) {\n throw createFixtureError(\n \"fixture-frame-not-started\",\n \"Fixture host has not emitted a gameplay frame.\",\n );\n }\n return currentFrameId;\n },\n getEvents() {\n return events.map((event) => ({ ...event }));\n },\n assertConsumed() {\n throwFixtureError();\n if (stepCursor !== options.tape.steps.length) {\n throw createFixtureError(\n \"fixture-unconsumed-protocol-steps\",\n `Plugin protocol tape consumed ${stepCursor} of ${options.tape.steps.length} protocol step(s).`,\n );\n }\n },\n };\n}\n","import React, { useMemo } from \"react\";\nimport { createPluginRuntimeClient } from \"../../runtime/core/create-plugin-runtime-client.js\";\nimport { PluginRuntimeBoundary } from \"../../runtime/components/PluginRuntimeBoundary.js\";\nimport type { PluginRuntimeClient } from \"../../runtime/core/types.js\";\nimport type { FixtureHostHarness } from \"./create-fixture-host-harness.js\";\n\nexport function FixturePluginRuntime({\n harness,\n runtime,\n children,\n}: {\n harness: FixtureHostHarness;\n runtime?: PluginRuntimeClient;\n children: React.ReactNode;\n}) {\n const fixtureRuntime = useMemo(\n () =>\n runtime ?? createPluginRuntimeClient({ transport: harness.transport }),\n [harness.transport, runtime],\n );\n return (\n <PluginRuntimeBoundary runtime={fixtureRuntime}>\n {children}\n </PluginRuntimeBoundary>\n );\n}\n","import {\n materializePluginGameplayFrame,\n type PluginSessionDescriptor,\n} from \"@dreamboard-games/plugin-runtime-contract\";\nimport { digestUIFixtureTransportRequest } from \"./canonical.js\";\nimport type { PluginProtocolTape, UIFixtureFrame } from \"./schema.js\";\nimport type { UIFixtureProtocolStep } from \"./schema.js\";\nimport type {\n ReducerScenarioExchange,\n ReducerScenarioFrame,\n ReducerScenarioTrace,\n} from \"../reducer-scenario/types.js\";\n\nexport interface CompilePluginProtocolTapeOptions {\n readonly trace: ReducerScenarioTrace;\n readonly session: PluginSessionDescriptor;\n}\n\nexport function compilePluginProtocolTape(\n options: CompilePluginProtocolTapeOptions,\n): PluginProtocolTape {\n const frames = options.trace.frames.map((frame) =>\n materializeTraceFrame(frame, options.trace.viewer.playerId),\n );\n const frameById = new Map(frames.map((frame) => [frame.id, frame]));\n const steps: UIFixtureProtocolStep[] = [];\n\n const firstFrame = frames[0];\n if (!firstFrame) {\n throw new Error(\n `Reducer scenario '${options.trace.scenarioId}' did not record frames.`,\n );\n }\n steps.push({\n id: `${firstFrame.id}.host-frame`,\n kind: \"host.frame\",\n frameId: firstFrame.id,\n });\n\n for (const exchange of options.trace.exchanges) {\n const fromFrame = frameById.get(exchange.fromFrameId);\n if (!fromFrame) {\n throw new Error(\n `Reducer exchange '${exchange.id}' references missing frame '${exchange.fromFrameId}'.`,\n );\n }\n if (exchange.operation === \"validate\") {\n // Reducer validation remains part of the authored scenario trace, but\n // protocol v4 performs no live host validation round trip.\n continue;\n }\n\n steps.push({\n id: exchange.id,\n kind: \"client.submit\",\n fromFrameId: exchange.fromFrameId,\n requestDigest: digestRuntimeCommand(exchange, fromFrame),\n response:\n exchange.result.kind === \"accepted\"\n ? {\n type: \"interaction.result\",\n clientActionId: exchange.id,\n accepted: true,\n }\n : {\n type: \"interaction.result\",\n clientActionId: exchange.id,\n accepted: false,\n errorCode:\n exchange.result.diagnostics[0]?.code ?? \"fixture-rejected\",\n message: exchange.result.diagnostics[0]?.message,\n },\n });\n if (exchange.result.kind === \"accepted\") {\n if (!frameById.has(exchange.result.toFrameId)) {\n throw new Error(\n `Reducer exchange '${exchange.id}' references missing toFrameId '${exchange.result.toFrameId}'.`,\n );\n }\n steps.push({\n id: `${exchange.id}.host-frame`,\n kind: \"host.frame\",\n frameId: exchange.result.toFrameId,\n });\n }\n }\n\n return {\n session: options.session,\n frames,\n steps,\n };\n}\n\nfunction materializeTraceFrame(\n frame: ReducerScenarioFrame,\n perspectivePlayerId: string,\n): UIFixtureFrame {\n const flow = readFlowState(frame.reducerState);\n return {\n id: frame.id,\n frame: materializePluginGameplayFrame({\n currentPhase: flow.currentPhase,\n activePlayers: flow.activePlayers,\n dynamicProjection: frame.dynamicProjection,\n staticProjection: frame.staticProjection,\n perspectivePlayerId,\n version: frame.gameVersion,\n actionSetVersion: frame.actionSetVersion,\n }),\n projectionDigest: frame.projectionDigest,\n };\n}\n\nfunction digestRuntimeCommand(\n exchange: ReducerScenarioExchange,\n frame: UIFixtureFrame,\n): string {\n return digestUIFixtureTransportRequest({\n operation: exchange.operation === \"validate\" ? \"validate\" : \"submit\",\n basis: frame.frame.basis,\n interactionId: exchange.input.interactionId,\n payload: exchange.input.params,\n });\n}\n\nfunction readFlowState(state: {\n readonly domain?: {\n readonly flow?: {\n readonly currentPhase?: string;\n readonly activePlayers?: readonly string[];\n };\n };\n}): { currentPhase: string | null; activePlayers: readonly string[] } {\n return {\n currentPhase: state.domain?.flow?.currentPhase ?? null,\n activePlayers: [...(state.domain?.flow?.activePlayers ?? [])],\n };\n}\n","export interface FixtureEnvironmentInit {\n readonly clockIso: string;\n readonly randomSeed: string;\n readonly locale: \"en-US\";\n readonly timezone: \"UTC\";\n readonly reducedMotion: true;\n readonly network: \"blocked\";\n}\n\nexport const defaultFixtureEnvironmentInit: FixtureEnvironmentInit = {\n clockIso: \"2026-01-01T00:00:00.000Z\",\n randomSeed: \"dreamboard-ui-fixture\",\n locale: \"en-US\",\n timezone: \"UTC\",\n reducedMotion: true,\n network: \"blocked\",\n};\n\nexport type DeterministicIdFactory = () => string;\n\nexport function createDeterministicIdFactory(\n seed: string,\n): DeterministicIdFactory {\n let cursor = 0;\n return () => {\n cursor += 1;\n return `fixture-${slug(seed)}-${cursor.toString(36).padStart(4, \"0\")}`;\n };\n}\n\nexport function fixtureEnvironmentInitFor(options: {\n readonly clockIso: string;\n readonly randomSeed: string;\n}): FixtureEnvironmentInit {\n return {\n ...defaultFixtureEnvironmentInit,\n clockIso: options.clockIso,\n randomSeed: options.randomSeed,\n };\n}\n\nfunction slug(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 48) || \"seed\"\n );\n}\n","import { z } from \"zod\";\nimport {\n BROWSER_INTERACTION_ACTUATOR_KINDS,\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n browserInteractionEffectSchema,\n} from \"../../browser-interaction/index.js\";\nimport type {\n BrowserInteractionEffectRequest,\n BrowserInteractionIntentRequest,\n} from \"../../browser-interaction/index.js\";\nimport { RuntimeJsonSchema } from \"../../runtime-json.js\";\nimport { digestUIFixtureRequest, isSha256Digest } from \"./canonical.js\";\nimport {\n DREAMBOARD_PLUGIN_PROTOCOL_VERSION as PLUGIN_RUNTIME_PROTOCOL_VERSION,\n PluginProtocolFrameSchema,\n PluginProtocolStepSchema,\n PluginProtocolTapeSchema,\n type PluginProtocolFrame,\n type PluginProtocolStep,\n type PluginProtocolTape as RuntimePluginProtocolTape,\n} from \"@dreamboard-games/plugin-runtime-contract\";\n\nexport const UI_SCENARIO_FIXTURE_SCHEMA_VERSION = 2;\nexport const UI_SCENARIO_FIXTURE_BUNDLE_SCHEMA_VERSION = 2;\nexport const UI_SCENARIO_FIXTURE_SUPPORTED_BROWSER_PROTOCOL_MAJOR = 3;\nexport const UI_SCENARIO_FIXTURE_PLUGIN_RUNTIME_PROTOCOL =\n PLUGIN_RUNTIME_PROTOCOL_VERSION;\n\nconst digestSchema = z.string().refine(isSha256Digest, {\n message: \"Expected a sha256:<64 lowercase hex> digest.\",\n});\n\nconst nonEmptyStringSchema = z.string().min(1);\nconst jsonSchema = RuntimeJsonSchema;\n\nconst environmentSchema = z\n .object({\n clockIso: nonEmptyStringSchema,\n randomSeed: nonEmptyStringSchema,\n locale: z.literal(\"en-US\"),\n timezone: z.literal(\"UTC\"),\n viewportTags: z.array(z.enum([\"desktop\", \"tablet\", \"phone\", \"touch\"])),\n })\n .strict();\n\nexport const uiFixtureFrameSchema = PluginProtocolFrameSchema;\nexport const uiFixtureProtocolStepSchema = PluginProtocolStepSchema;\nexport const pluginProtocolTapeSchema = PluginProtocolTapeSchema.refine(\n (tape) => tape.frames.length > 0,\n \"UI fixture protocol tapes require at least one gameplay frame.\",\n);\n\nconst browserInteractionIntentRequestSchema = z\n .object({\n surface: nonEmptyStringSchema,\n scopeId: nonEmptyStringSchema.optional(),\n interactionKey: nonEmptyStringSchema.optional(),\n interactionId: nonEmptyStringSchema.optional(),\n intent: nonEmptyStringSchema,\n inputKey: nonEmptyStringSchema.optional(),\n candidateValue: jsonSchema.optional(),\n candidateValueKey: nonEmptyStringSchema.optional(),\n actuatorKind: z.enum(BROWSER_INTERACTION_ACTUATOR_KINDS).optional(),\n allowDisabled: z.boolean().optional(),\n })\n .strict();\n\nconst browserInteractionEffectRequestSchema = z\n .object({\n surface: nonEmptyStringSchema,\n scopeId: nonEmptyStringSchema.optional(),\n interactionKey: nonEmptyStringSchema.optional(),\n interactionId: nonEmptyStringSchema.optional(),\n effect: browserInteractionEffectSchema,\n allowDisabled: z.boolean().optional(),\n })\n .strict();\n\nexport const uiReplayRequestSchema = z.union([\n browserInteractionIntentRequestSchema,\n browserInteractionEffectRequestSchema,\n]);\n\nexport const uiReplayExecutionSchema = z.union([\n z\n .object({\n kind: z.literal(\"activate\"),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"fill\"),\n value: z.string(),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"drag\"),\n target: browserInteractionEffectRequestSchema,\n })\n .strict(),\n]);\n\nexport const uiStepExpectationSchema = z\n .object({\n frameId: nonEmptyStringSchema.optional(),\n projectionDigest: digestSchema.optional(),\n semanticDigest: digestSchema.optional(),\n draftDigest: digestSchema.optional(),\n submissionDigest: digestSchema.optional(),\n focusedInteractionKey: nonEmptyStringSchema.optional(),\n visibleInteractionKeys: z.array(nonEmptyStringSchema).optional(),\n })\n .strict();\n\nexport const uiResolvedReplayIdentitySchema = z\n .object({\n stepId: nonEmptyStringSchema,\n surface: nonEmptyStringSchema,\n scopeId: nonEmptyStringSchema,\n interactionKey: nonEmptyStringSchema,\n interactionId: nonEmptyStringSchema,\n actuatorId: nonEmptyStringSchema,\n descriptorDigest: digestSchema.optional(),\n draftDigest: digestSchema.optional(),\n })\n .strict();\n\nexport const portableSemanticReplayStepSchema = z\n .object({\n stepId: nonEmptyStringSchema,\n requestDigest: digestSchema,\n resolve: uiReplayRequestSchema,\n execute: uiReplayExecutionSchema,\n expectedIdentity: uiResolvedReplayIdentitySchema.optional(),\n expect: uiStepExpectationSchema,\n })\n .strict();\n\nexport const uiScenarioReplayStepSchema = z.union([\n portableSemanticReplayStepSchema,\n z\n .object({\n stepId: nonEmptyStringSchema,\n kind: z.literal(\"assert\"),\n expect: uiStepExpectationSchema,\n })\n .strict(),\n]);\n\nexport const uiScenarioFixtureSchema = z\n .object({\n schemaVersion: z.literal(UI_SCENARIO_FIXTURE_SCHEMA_VERSION),\n browserInteractionProtocol: z.literal(\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n ),\n pluginRuntimeProtocol: z.literal(PLUGIN_RUNTIME_PROTOCOL_VERSION),\n id: nonEmptyStringSchema,\n title: nonEmptyStringSchema,\n gameId: nonEmptyStringSchema,\n tags: z.array(nonEmptyStringSchema),\n source: z\n .object({\n scenarioId: nonEmptyStringSchema,\n reducerFingerprint: nonEmptyStringSchema,\n uiContractFingerprint: nonEmptyStringSchema,\n renderModule: nonEmptyStringSchema,\n renderModuleDigest: digestSchema,\n sourceDigest: digestSchema,\n sourceFiles: z.array(nonEmptyStringSchema).optional(),\n })\n .strict(),\n viewer: z\n .object({\n seatId: nonEmptyStringSchema,\n playerId: nonEmptyStringSchema.optional(),\n })\n .strict(),\n environment: environmentSchema,\n protocol: pluginProtocolTapeSchema,\n replay: z.array(uiScenarioReplayStepSchema),\n expected: z\n .object({\n initialProjectionDigest: digestSchema,\n finalProjectionDigest: digestSchema,\n finalSemanticDigest: digestSchema,\n submissionDigest: digestSchema,\n })\n .strict(),\n })\n .strict();\n\nexport const uiScenarioFixtureBundleIndexSchema = z\n .object({\n schemaVersion: z.literal(UI_SCENARIO_FIXTURE_BUNDLE_SCHEMA_VERSION),\n bundleId: nonEmptyStringSchema,\n sdkCommit: nonEmptyStringSchema,\n pluginRuntimeProtocol: z.literal(PLUGIN_RUNTIME_PROTOCOL_VERSION),\n browserInteractionProtocol: z.literal(\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n ),\n fixtures: z.array(\n z\n .object({\n id: nonEmptyStringSchema,\n file: nonEmptyStringSchema,\n sha256: digestSchema,\n renderModule: nonEmptyStringSchema,\n renderModuleSha256: digestSchema,\n components: z.array(nonEmptyStringSchema),\n capabilities: z.array(nonEmptyStringSchema),\n })\n .strict(),\n ),\n })\n .strict();\n\nexport type UIReplayRequest =\n | BrowserInteractionIntentRequest\n | BrowserInteractionEffectRequest;\nexport type UIReplayExecution = z.infer<typeof uiReplayExecutionSchema>;\nexport type UIStepExpectation = z.infer<typeof uiStepExpectationSchema>;\nexport type UIResolvedReplayIdentity = z.infer<\n typeof uiResolvedReplayIdentitySchema\n>;\nexport type PortableSemanticReplayStep = z.infer<\n typeof portableSemanticReplayStepSchema\n>;\nexport type UIScenarioReplayStep = z.infer<typeof uiScenarioReplayStepSchema>;\nexport type UIFixtureFrame = PluginProtocolFrame;\nexport type UIFixtureProtocolStep = PluginProtocolStep;\nexport type PluginProtocolTape = RuntimePluginProtocolTape;\nexport type UIScenarioFixture = Omit<\n z.infer<typeof uiScenarioFixtureSchema>,\n \"protocol\" | \"replay\"\n> & {\n readonly protocol: PluginProtocolTape;\n readonly replay: readonly UIScenarioReplayStep[];\n};\nexport type UIScenarioFixtureBundleIndex = z.infer<\n typeof uiScenarioFixtureBundleIndexSchema\n>;\n\nexport function parseUIScenarioFixture(value: unknown): UIScenarioFixture {\n const fixture = uiScenarioFixtureSchema.parse(\n value,\n ) as unknown as UIScenarioFixture;\n validateUIScenarioFixtureReferences(fixture);\n return fixture;\n}\n\nexport function parseUIScenarioFixtureBundleIndex(\n value: unknown,\n): UIScenarioFixtureBundleIndex {\n const bundle = uiScenarioFixtureBundleIndexSchema.parse(value);\n assertSupportedBrowserInteractionProtocol(bundle.browserInteractionProtocol);\n const ids = new Set<string>();\n for (const entry of bundle.fixtures) {\n if (ids.has(entry.id)) {\n throw new Error(`Duplicate fixture id '${entry.id}' in bundle index.`);\n }\n ids.add(entry.id);\n }\n return bundle;\n}\n\nexport function assertSupportedBrowserInteractionProtocol(\n version: string,\n): void {\n const major = Number(version.split(\".\")[0]);\n if (major !== UI_SCENARIO_FIXTURE_SUPPORTED_BROWSER_PROTOCOL_MAJOR) {\n throw new Error(\n `Unsupported browser-interaction protocol '${version}'. Expected major ${UI_SCENARIO_FIXTURE_SUPPORTED_BROWSER_PROTOCOL_MAJOR}.`,\n );\n }\n}\n\nfunction validateUIScenarioFixtureReferences(fixture: UIScenarioFixture): void {\n assertSupportedBrowserInteractionProtocol(fixture.browserInteractionProtocol);\n const frameIds = new Set<string>();\n const stepIds = new Set<string>();\n\n for (const frame of fixture.protocol.frames) {\n if (frameIds.has(frame.id)) {\n throw new Error(`Duplicate fixture frame id '${frame.id}'.`);\n }\n frameIds.add(frame.id);\n }\n\n for (const step of fixture.protocol.steps) {\n if (stepIds.has(step.id)) {\n throw new Error(`Duplicate protocol step id '${step.id}'.`);\n }\n stepIds.add(step.id);\n if (step.kind === \"host.frame\") {\n if (!frameIds.has(step.frameId)) {\n throw new Error(\n `Protocol step '${step.id}' references missing frameId '${step.frameId}'.`,\n );\n }\n continue;\n }\n if (!frameIds.has(step.fromFrameId)) {\n throw new Error(\n `Protocol step '${step.id}' references missing fromFrameId '${step.fromFrameId}'.`,\n );\n }\n }\n\n for (const step of fixture.replay) {\n if (\"resolve\" in step) {\n const actualDigest = digestUIFixtureRequest(\n step.resolve as unknown as UIReplayRequest,\n );\n if (step.requestDigest !== actualDigest) {\n throw new Error(\n `Replay step '${step.stepId}' requestDigest ${step.requestDigest} does not match ${actualDigest}.`,\n );\n }\n }\n const expectedFrameId = step.expect.frameId;\n if (expectedFrameId && !frameIds.has(expectedFrameId)) {\n throw new Error(\n `Replay step '${step.stepId}' expects missing frameId '${expectedFrameId}'.`,\n );\n }\n }\n}\n","import {\n canonicalizeUIScenarioFixture,\n digestUIFixtureJson,\n serializeUIScenarioFixture,\n} from \"./canonical.js\";\nimport { DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION } from \"../../browser-interaction/index.js\";\nimport { DREAMBOARD_PLUGIN_PROTOCOL_VERSION as PLUGIN_RUNTIME_PROTOCOL_VERSION } from \"@dreamboard-games/plugin-runtime-contract\";\nimport {\n parseUIScenarioFixture,\n type PortableSemanticReplayStep,\n type PluginProtocolTape,\n type UIResolvedReplayIdentity,\n type UIScenarioFixture,\n type UIScenarioReplayStep,\n type UIStepExpectation,\n} from \"./schema.js\";\n\nexport interface CompileUIScenarioFixtureOptions {\n readonly id: string;\n readonly title: string;\n readonly gameId: string;\n readonly tags?: readonly string[];\n readonly source: UIScenarioFixture[\"source\"];\n readonly viewer: UIScenarioFixture[\"viewer\"];\n readonly environment: UIScenarioFixture[\"environment\"];\n readonly protocol: PluginProtocolTape;\n readonly replay?: readonly UIScenarioReplayStep[];\n readonly expected?: Partial<UIScenarioFixture[\"expected\"]>;\n}\n\nexport type UIReplayIdentityCandidate = UIResolvedReplayIdentity;\n\nexport function compileUIScenarioFixture(\n options: CompileUIScenarioFixtureOptions,\n): UIScenarioFixture {\n const firstFrame = options.protocol.frames[0];\n const finalFrame = lastPublishedFrame(options.protocol);\n if (!firstFrame || !finalFrame) {\n throw new Error(\n \"compileUIScenarioFixture requires at least one protocol frame.\",\n );\n }\n\n const replay = options.replay ?? [];\n const submissionDigest =\n options.expected?.submissionDigest ??\n digestUIFixtureJson({\n digestVersion: \"ui-submission@1\",\n fixtureId: options.id,\n replay: replay.map((step) =>\n \"requestDigest\" in step ? step.requestDigest : step.stepId,\n ),\n });\n const finalSemanticDigest =\n options.expected?.finalSemanticDigest ??\n digestUIFixtureJson({\n digestVersion: \"ui-semantic@1\",\n fixtureId: options.id,\n frameId: finalFrame.id,\n projectionDigest: finalFrame.projectionDigest,\n });\n\n return parseUIScenarioFixture(\n canonicalizeUIScenarioFixture({\n schemaVersion: 2,\n browserInteractionProtocol:\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n pluginRuntimeProtocol: PLUGIN_RUNTIME_PROTOCOL_VERSION,\n id: options.id,\n title: options.title,\n gameId: options.gameId,\n tags: [...(options.tags ?? [])],\n source: options.source,\n viewer: options.viewer,\n environment: options.environment,\n protocol: options.protocol,\n replay,\n expected: {\n initialProjectionDigest:\n options.expected?.initialProjectionDigest ??\n firstFrame.projectionDigest,\n finalProjectionDigest:\n options.expected?.finalProjectionDigest ??\n finalFrame.projectionDigest,\n finalSemanticDigest,\n submissionDigest,\n },\n }),\n );\n}\n\nfunction lastPublishedFrame(\n protocol: PluginProtocolTape,\n): PluginProtocolTape[\"frames\"][number] | undefined {\n const frameById = new Map(protocol.frames.map((frame) => [frame.id, frame]));\n for (let index = protocol.steps.length - 1; index >= 0; index -= 1) {\n const step = protocol.steps[index];\n if (step?.kind === \"host.frame\") {\n return frameById.get(step.frameId);\n }\n }\n return protocol.frames[protocol.frames.length - 1];\n}\n\nexport function assertDeterministicUIScenarioFixture(\n first: UIScenarioFixture,\n second: UIScenarioFixture,\n): void {\n const firstBytes = serializeUIScenarioFixture(first);\n const secondBytes = serializeUIScenarioFixture(second);\n if (firstBytes !== secondBytes) {\n throw new Error(\n `UI scenario fixture '${first.id}' is non-deterministic across compilation runs.`,\n );\n }\n}\n\nexport function assertUniqueReplayIdentity(\n step: Pick<PortableSemanticReplayStep, \"stepId\" | \"expectedIdentity\">,\n candidates: readonly UIReplayIdentityCandidate[],\n): UIReplayIdentityCandidate {\n if (candidates.length !== 1) {\n throw new Error(\n `Replay step '${step.stepId}' resolved ${candidates.length} identities; expected exactly one.`,\n );\n }\n const candidate = candidates[0];\n if (!candidate) {\n throw new Error(`Replay step '${step.stepId}' did not resolve.`);\n }\n\n const expected = step.expectedIdentity;\n if (!expected) {\n return candidate;\n }\n for (const key of [\n \"surface\",\n \"scopeId\",\n \"interactionKey\",\n \"interactionId\",\n \"actuatorId\",\n \"descriptorDigest\",\n \"draftDigest\",\n ] as const) {\n const expectedValue = expected[key];\n if (expectedValue !== undefined && candidate[key] !== expectedValue) {\n throw new Error(\n `Replay step '${step.stepId}' resolved ${key} '${String(\n candidate[key],\n )}', expected '${expectedValue}'.`,\n );\n }\n }\n return candidate;\n}\n\nexport function assertUIStepExpectationSatisfied(\n stepId: string,\n expected: UIStepExpectation,\n actual: UIStepExpectation,\n): void {\n for (const key of [\n \"frameId\",\n \"projectionDigest\",\n \"semanticDigest\",\n \"draftDigest\",\n \"submissionDigest\",\n \"focusedInteractionKey\",\n ] as const) {\n if (expected[key] !== undefined && expected[key] !== actual[key]) {\n throw new Error(\n `Replay step '${stepId}' expected ${key} '${expected[key]}', received '${actual[key]}'.`,\n );\n }\n }\n if (expected.visibleInteractionKeys) {\n const actualKeys = new Set(actual.visibleInteractionKeys ?? []);\n const missing = expected.visibleInteractionKeys.filter(\n (key) => !actualKeys.has(key),\n );\n if (missing.length > 0) {\n throw new Error(\n `Replay step '${stepId}' missing visible interactions: ${missing.join(\n \", \",\n )}.`,\n );\n }\n }\n}\n","import {\n digestUIFixtureRequest,\n type PortableSemanticReplayStep,\n type UIResolvedReplayIdentity,\n type UIScenarioReplayStep,\n type UIStepExpectation,\n} from \"../ui-fixture/index.js\";\n\ntype ReplayRequest = PortableSemanticReplayStep[\"resolve\"];\ntype DragTarget = Extract<\n PortableSemanticReplayStep[\"execute\"],\n { kind: \"drag\" }\n>[\"target\"];\n\ninterface ReplayStepOptions {\n readonly stepId: string;\n readonly resolve: ReplayRequest;\n readonly expect: UIStepExpectation;\n readonly expectedIdentity?: UIResolvedReplayIdentity;\n}\n\ninterface FillReplayStepOptions extends ReplayStepOptions {\n readonly value: string;\n}\n\ninterface DragReplayStepOptions extends ReplayStepOptions {\n readonly target: DragTarget;\n}\n\nfunction semanticStep(\n options: ReplayStepOptions,\n execute: Exclude<UIScenarioReplayStep, { kind: \"assert\" }>[\"execute\"],\n): UIScenarioReplayStep {\n return {\n stepId: options.stepId,\n requestDigest: digestUIFixtureRequest(options.resolve),\n resolve: options.resolve,\n execute,\n expectedIdentity: options.expectedIdentity,\n expect: options.expect,\n };\n}\n\nexport function activate(options: ReplayStepOptions): UIScenarioReplayStep {\n return semanticStep(options, { kind: \"activate\" });\n}\n\nexport function fill(options: FillReplayStepOptions): UIScenarioReplayStep {\n return semanticStep(options, { kind: \"fill\", value: options.value });\n}\n\nexport function press(options: ReplayStepOptions): UIScenarioReplayStep {\n return activate(options);\n}\n\nexport function drag(options: DragReplayStepOptions): UIScenarioReplayStep {\n return semanticStep(options, { kind: \"drag\", target: options.target });\n}\n\nexport function submit(options: ReplayStepOptions): UIScenarioReplayStep {\n return activate(options);\n}\n\nexport function assertStep(\n stepId: string,\n expect: UIStepExpectation,\n): UIScenarioReplayStep {\n return {\n stepId,\n kind: \"assert\",\n expect,\n };\n}\n"],"mappings":"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","names":["result","readFlowState"]}
|
|
1
|
+
{"version":3,"sources":["../src/testing/player-roster.ts","../src/testing/scenario-definition-validation.ts","../src/testing/scenario-schema.ts","../src/testing/definitions.ts","../src/testing/scenario-assertion-error.ts","../src/testing/create-expect-api.ts","../src/testing/reducer-runtime.ts","../src/testing/scenario-player-refs.ts","../src/testing/scenario-replay.ts","../src/testing/inspection/flow-diagnostic.ts","../src/testing/inspection/inspect-scenario.ts","../src/testing/canonical.ts","../src/testing/exploration/cursor.ts","../src/testing/exploration/explore-scenario.ts","../src/testing/reducer-scenario/create-reducer-scenario-runner.ts","../src/testing/sources/test-source.ts","../src/testing/sources/local-source.ts","../src/testing/sources/scenario-source.ts","../src/testing/sources/fuzz.ts","../src/testing/candidate-verification.ts"],"sourcesContent":["import type { AnyReducerGameDefinition } from \"../reducer/model.js\";\n\n/** Local testing convenience creates the explicit roster used by the session. */\nexport function resolvePlayerRoster(\n game: Pick<AnyReducerGameDefinition, \"contract\">,\n count: number,\n): string[] {\n const setup = game.contract.manifest.normalSetup;\n if (\n !Number.isSafeInteger(count) ||\n count < setup.minPlayers ||\n count > setup.maxPlayers\n )\n throw new Error(\"Player count is outside manifest limits.\");\n return Array.from({ length: count }, (_, seat) => `player-${seat + 1}`);\n}\n","import { resolvePlayerRoster } from \"./player-roster.js\";\nimport type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../reducer/model.js\";\nimport { collectReducerDefinitionIndex } from \"../reducer/definition-index.js\";\nimport type { RuntimeJson } from \"../shared/runtime-json.js\";\nimport * as z from \"zod\";\nimport { createAuthorParamSchemasByPhase } from \"../reducer/client-param-schemas.js\";\nimport {\n appendScenarioPath,\n resolveScenarioSeatReferences,\n} from \"./scenario-schema.js\";\nimport { ScenarioSchemaValueError } from \"./scenario-schema.js\";\n\nexport type ScenarioDefinitionValidationCode =\n | \"INVALID_TYPE\"\n | \"UNKNOWN_FIELD\"\n | \"INVALID_VALUE\"\n | \"UNSAFE_INTEGER\"\n | \"OUT_OF_RANGE\"\n | \"UNKNOWN_INTERACTION\"\n | \"INVALID_COMMAND_PARAMS\"\n | \"NON_SERIALIZABLE\";\n\nexport class ScenarioDefinitionValidationError extends Error {\n readonly code: ScenarioDefinitionValidationCode;\n readonly path: string;\n\n constructor(options: {\n readonly code: ScenarioDefinitionValidationCode;\n readonly path: string;\n readonly reason: string;\n }) {\n super(\n `Invalid scenario definition at '${options.path}': ${options.reason}.`,\n );\n this.name = \"ScenarioDefinitionValidationError\";\n this.code = options.code;\n this.path = options.path;\n }\n}\n\ntype ScenarioDefinitionLike = {\n readonly id: string;\n readonly description?: string;\n readonly setup: {\n readonly players: number;\n readonly seed: number;\n readonly options?: Readonly<Record<string, RuntimeJson>>;\n };\n readonly given: readonly unknown[];\n readonly when: readonly unknown[];\n readonly checkpoints?: Readonly<\n Record<\n string,\n | { readonly segment: \"setup\"; readonly completed: 0 }\n | { readonly segment: \"given\" | \"when\"; readonly completed: number }\n >\n >;\n readonly then: (...args: never[]) => unknown;\n};\n\nconst checkpointIdPattern = /^[a-z0-9][a-z0-9-]*$/u;\n\nfunction validateCheckpoints(definition: Record<string, unknown>): void {\n if (!Object.prototype.hasOwnProperty.call(definition, \"checkpoints\")) return;\n const checkpoints = requireObject(\n definition.checkpoints,\n \"scenario.checkpoints\",\n );\n assertJsonSerializable(checkpoints, \"scenario.checkpoints\");\n const occupied = new Map<string, string>();\n for (const [id, candidate] of Object.entries(checkpoints)) {\n const path = appendScenarioPath(\"scenario.checkpoints\", id);\n if (!checkpointIdPattern.test(id) || id === \"setup\") {\n fail({\n code: \"INVALID_VALUE\",\n path,\n reason:\n \"checkpoint ids must be lowercase kebab-case and cannot be 'setup'\",\n });\n }\n const checkpoint = requireObject(candidate, path);\n assertExactKeys(checkpoint, [\"segment\", \"completed\"], path);\n assertOwn(checkpoint, \"segment\", path);\n assertOwn(checkpoint, \"completed\", path);\n if (![\"setup\", \"given\", \"when\"].includes(String(checkpoint.segment))) {\n fail({\n code: \"INVALID_VALUE\",\n path: appendScenarioPath(path, \"segment\"),\n reason: \"expected setup, given, or when\",\n });\n }\n const completed = assertSafeInteger(\n checkpoint.completed,\n appendScenarioPath(path, \"completed\"),\n );\n const segment = checkpoint.segment as \"setup\" | \"given\" | \"when\";\n const maximum =\n segment === \"setup\"\n ? 0\n : (definition[segment] as readonly unknown[]).length;\n if (\n completed < 0 ||\n completed > maximum ||\n (segment === \"setup\" && completed !== 0)\n ) {\n fail({\n code: \"OUT_OF_RANGE\",\n path: appendScenarioPath(path, \"completed\"),\n reason: `expected 0 through ${maximum} for ${segment}`,\n });\n }\n const coordinate = `${segment}:${completed}`;\n const previous = occupied.get(coordinate);\n if (previous !== undefined) {\n fail({\n code: \"INVALID_VALUE\",\n path,\n reason: `duplicates checkpoint '${previous}' at ${coordinate}`,\n });\n }\n occupied.set(coordinate, id);\n }\n}\n\nfunction fail(options: {\n readonly code: ScenarioDefinitionValidationCode;\n readonly path: string;\n readonly reason: string;\n}): never {\n throw new ScenarioDefinitionValidationError(options);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction requireObject(value: unknown, path: string): Record<string, unknown> {\n if (!isPlainObject(value)) {\n fail({ code: \"INVALID_TYPE\", path, reason: \"expected a plain object\" });\n }\n return value;\n}\n\nfunction assertExactKeys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n path: string,\n): void {\n const allowedSet = new Set(allowed);\n for (const key of Object.keys(value)) {\n if (!allowedSet.has(key)) {\n fail({\n code: \"UNKNOWN_FIELD\",\n path: appendScenarioPath(path, key),\n reason: \"field is not part of the scenario contract\",\n });\n }\n }\n}\n\nfunction assertOwn(\n value: Record<string, unknown>,\n key: string,\n path: string,\n): void {\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n fail({\n code: \"INVALID_TYPE\",\n path: appendScenarioPath(path, key),\n reason: \"required field is missing\",\n });\n }\n}\n\nfunction assertSafeInteger(value: unknown, path: string): number {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) {\n fail({\n code: \"UNSAFE_INTEGER\",\n path,\n reason: \"expected a finite safe integer\",\n });\n }\n return value;\n}\n\nfunction assertJsonSerializable(\n value: unknown,\n path: string,\n ancestors: Set<object> = new Set(),\n): void {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n fail({\n code: \"NON_SERIALIZABLE\",\n path,\n reason: \"non-finite numbers are not JSON-serializable\",\n });\n }\n return;\n }\n if (typeof value !== \"object\") {\n fail({\n code: \"NON_SERIALIZABLE\",\n path,\n reason: `${typeof value} values are not JSON-serializable`,\n });\n }\n if (ancestors.has(value)) {\n fail({\n code: \"NON_SERIALIZABLE\",\n path,\n reason: \"cyclic values are not JSON-serializable\",\n });\n }\n\n if (!Array.isArray(value) && !isPlainObject(value)) {\n fail({\n code: \"NON_SERIALIZABLE\",\n path,\n reason: \"class instances are not JSON-serializable scenario data\",\n });\n }\n\n ancestors.add(value);\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n if (!Object.prototype.hasOwnProperty.call(value, index)) {\n fail({\n code: \"NON_SERIALIZABLE\",\n path: appendScenarioPath(path, index),\n reason: \"sparse array entries are not allowed\",\n });\n }\n assertJsonSerializable(\n value[index],\n appendScenarioPath(path, index),\n ancestors,\n );\n }\n const extraKeys = Reflect.ownKeys(value).filter((key) => {\n if (key === \"length\") return false;\n return typeof key !== \"string\" || !/^(0|[1-9][0-9]*)$/.test(key);\n });\n if (extraKeys.length > 0) {\n const key = extraKeys[0] as PropertyKey;\n fail({\n code: \"NON_SERIALIZABLE\",\n path: appendScenarioPath(path, key),\n reason: \"array metadata is not JSON-serializable\",\n });\n }\n ancestors.delete(value);\n return;\n }\n\n const descriptors = Object.getOwnPropertyDescriptors(value);\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key === \"symbol\") {\n fail({\n code: \"NON_SERIALIZABLE\",\n path: appendScenarioPath(path, key),\n reason: \"symbol keys are not JSON-serializable\",\n });\n }\n const descriptor = descriptors[key];\n if (\n descriptor === undefined ||\n !descriptor.enumerable ||\n !(\"value\" in descriptor)\n ) {\n fail({\n code: \"NON_SERIALIZABLE\",\n path: appendScenarioPath(path, key),\n reason: \"only enumerable data properties are allowed\",\n });\n }\n assertJsonSerializable(\n descriptor.value,\n appendScenarioPath(path, key),\n ancestors,\n );\n }\n ancestors.delete(value);\n}\n\nfunction commandSchemas<Contract extends ReducerGameContractLike>(\n game: AnyReducerGameDefinition<Contract>,\n interactionId: string,\n): readonly z.ZodTypeAny[] {\n const schemasByPhase = createAuthorParamSchemasByPhase(game);\n const schemas = Object.values(schemasByPhase).flatMap((schemas) => {\n const schema = schemas[interactionId];\n return schema ? [schema as z.ZodTypeAny] : [];\n });\n // Dependent collectors require replay state; authoring can check only the\n // declared key and atomic command shape before that state exists.\n const index = collectReducerDefinitionIndex(game);\n for (const phase of index.phasesByName.values()) {\n const steps = phase.interactions.find(([id]) => id === interactionId)?.[1]\n .steps;\n if (steps)\n schemas.push(\n z\n .partialRecord(\n z.enum(steps.entries.map((step) => step.key)),\n z.unknown(),\n )\n .refine((params) => Object.keys(params).length === 1),\n );\n }\n return schemas;\n}\n\nfunction issuePath(\n path: string,\n issue: { readonly path: PropertyKey[] },\n): string {\n return issue.path.reduce(appendScenarioPath, path);\n}\n\nfunction validateCommand<Contract extends ReducerGameContractLike>(options: {\n readonly game: AnyReducerGameDefinition<Contract>;\n readonly command: unknown;\n readonly path: string;\n readonly playerIds: readonly string[];\n}): void {\n const command = requireObject(options.command, options.path);\n assertJsonSerializable(command, options.path);\n assertExactKeys(command, [\"actor\", \"interactionId\", \"params\"], options.path);\n for (const field of [\"actor\", \"interactionId\", \"params\"] as const) {\n assertOwn(command, field, options.path);\n }\n\n const actorPath = appendScenarioPath(options.path, \"actor\");\n const actor = requireObject(command.actor, actorPath);\n assertExactKeys(actor, [\"seat\"], actorPath);\n assertOwn(actor, \"seat\", actorPath);\n const actorSeat = assertSafeInteger(\n actor.seat,\n appendScenarioPath(actorPath, \"seat\"),\n );\n if (actorSeat < 0 || actorSeat >= options.playerIds.length) {\n fail({\n code: \"OUT_OF_RANGE\",\n path: appendScenarioPath(actorPath, \"seat\"),\n reason: `expected a seat from 0 through ${Math.max(0, options.playerIds.length - 1)}`,\n });\n }\n\n const interactionPath = appendScenarioPath(options.path, \"interactionId\");\n if (\n typeof command.interactionId !== \"string\" ||\n command.interactionId === \"\"\n ) {\n fail({\n code: \"INVALID_TYPE\",\n path: interactionPath,\n reason: \"expected a non-empty string\",\n });\n }\n\n const paramsPath = appendScenarioPath(options.path, \"params\");\n const schemas = commandSchemas(options.game, command.interactionId);\n if (schemas.length === 0) {\n fail({\n code: \"UNKNOWN_INTERACTION\",\n path: interactionPath,\n reason: `interaction '${command.interactionId}' is not declared by the game`,\n });\n }\n\n let firstSeatError: ScenarioSchemaValueError | undefined;\n let firstIssue:\n { readonly path: PropertyKey[]; readonly message: string } | undefined;\n for (const schema of schemas) {\n try {\n const resolved = resolveScenarioSeatReferences({\n schema,\n value: command.params,\n playerIds: options.playerIds,\n path: paramsPath,\n });\n const parsed = schema.safeParse(resolved);\n if (parsed.success) return;\n firstIssue ??= parsed.error.issues[0];\n } catch (error) {\n if (error instanceof ScenarioSchemaValueError) {\n firstSeatError ??= error;\n continue;\n }\n throw error;\n }\n }\n\n if (firstSeatError) {\n fail({\n code: firstSeatError.message.includes(\"seat from\")\n ? \"OUT_OF_RANGE\"\n : \"INVALID_COMMAND_PARAMS\",\n path: firstSeatError.path,\n reason: firstSeatError.message,\n });\n }\n fail({\n code: \"INVALID_COMMAND_PARAMS\",\n path: firstIssue ? issuePath(paramsPath, firstIssue) : paramsPath,\n reason:\n firstIssue?.message ?? \"parameters do not match the interaction contract\",\n });\n}\n\nexport function validateScenarioDefinition<\n Contract extends ReducerGameContractLike,\n>(\n game: AnyReducerGameDefinition<Contract>,\n value: unknown,\n): asserts value is ScenarioDefinitionLike {\n const definition = requireObject(value, \"scenario\");\n assertExactKeys(\n definition,\n [\"id\", \"description\", \"setup\", \"given\", \"when\", \"checkpoints\", \"then\"],\n \"scenario\",\n );\n for (const field of [\"id\", \"setup\", \"given\", \"when\", \"then\"] as const) {\n assertOwn(definition, field, \"scenario\");\n }\n if (typeof definition.id !== \"string\" || definition.id === \"\") {\n fail({\n code: \"INVALID_TYPE\",\n path: \"scenario.id\",\n reason: \"expected a non-empty string\",\n });\n }\n if (\n Object.prototype.hasOwnProperty.call(definition, \"description\") &&\n typeof definition.description !== \"string\"\n ) {\n fail({\n code: \"INVALID_TYPE\",\n path: \"scenario.description\",\n reason: \"expected a string when provided\",\n });\n }\n\n const setup = requireObject(definition.setup, \"scenario.setup\");\n assertExactKeys(setup, [\"players\", \"seed\", \"options\"], \"scenario.setup\");\n assertOwn(setup, \"players\", \"scenario.setup\");\n assertOwn(setup, \"seed\", \"scenario.setup\");\n const players = assertSafeInteger(setup.players, \"scenario.setup.players\");\n const normalSetup = game.contract.manifest.normalSetup;\n if (players < normalSetup.minPlayers || players > normalSetup.maxPlayers) {\n fail({\n code: \"OUT_OF_RANGE\",\n path: \"scenario.setup.players\",\n reason: `expected ${normalSetup.minPlayers} through ${normalSetup.maxPlayers} players`,\n });\n }\n assertSafeInteger(setup.seed, \"scenario.setup.seed\");\n\n assertJsonSerializable(definition.id, \"scenario.id\");\n if (Object.prototype.hasOwnProperty.call(definition, \"description\")) {\n assertJsonSerializable(definition.description, \"scenario.description\");\n }\n assertJsonSerializable(setup, \"scenario.setup\");\n if (!Array.isArray(definition.given)) {\n fail({\n code: \"INVALID_TYPE\",\n path: \"scenario.given\",\n reason: \"expected an array\",\n });\n }\n if (!Array.isArray(definition.when)) {\n fail({\n code: \"INVALID_TYPE\",\n path: \"scenario.when\",\n reason: \"expected an array\",\n });\n }\n if (typeof definition.then !== \"function\") {\n fail({\n code: \"INVALID_TYPE\",\n path: \"scenario.then\",\n reason: \"expected an assertion function\",\n });\n }\n\n validateCheckpoints(definition);\n\n const playerIds = resolvePlayerRoster(game, players);\n definition.given.forEach((command, index) =>\n validateCommand({\n game,\n command,\n path: `scenario.given[${index}]`,\n playerIds,\n }),\n );\n definition.when.forEach((command, index) =>\n validateCommand({\n game,\n command,\n path: `scenario.when[${index}]`,\n playerIds,\n }),\n );\n}\n","import * as z from \"zod\";\nimport { manifestSchemaFamily } from \"../reducer/model/manifest.js\";\n\nexport class ScenarioSchemaValueError extends Error {\n readonly path: string;\n\n constructor(path: string, message: string) {\n super(message);\n this.name = \"ScenarioSchemaValueError\";\n this.path = path;\n }\n}\n\nexport function appendScenarioPath(path: string, key: PropertyKey): string {\n if (typeof key === \"number\") {\n return `${path}[${key}]`;\n }\n if (typeof key === \"symbol\") {\n return `${path}[${String(key)}]`;\n }\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)\n ? `${path}.${key}`\n : `${path}[${JSON.stringify(key)}]`;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction resolvePlayerSeatReference(options: {\n readonly value: unknown;\n readonly playerIds: readonly string[];\n readonly path: string;\n}): string {\n if (!isPlainObject(options.value)) {\n throw new ScenarioSchemaValueError(\n options.path,\n \"expected a seat reference shaped as { seat: number }\",\n );\n }\n const keys = Object.keys(options.value);\n if (keys.length !== 1 || keys[0] !== \"seat\") {\n throw new ScenarioSchemaValueError(\n options.path,\n \"expected a seat reference with only the 'seat' field\",\n );\n }\n const seat = options.value.seat;\n const seatPath = appendScenarioPath(options.path, \"seat\");\n if (typeof seat !== \"number\" || !Number.isSafeInteger(seat)) {\n throw new ScenarioSchemaValueError(\n seatPath,\n \"expected a finite safe integer\",\n );\n }\n if (seat < 0 || seat >= options.playerIds.length) {\n throw new ScenarioSchemaValueError(\n seatPath,\n `expected a seat from 0 through ${Math.max(0, options.playerIds.length - 1)}`,\n );\n }\n const playerId = options.playerIds[seat];\n if (playerId === undefined) {\n throw new ScenarioSchemaValueError(\n seatPath,\n `could not resolve seat ${seat}`,\n );\n }\n return playerId;\n}\n\nfunction projectPlayerSeatReference(options: {\n readonly value: unknown;\n readonly playerIds: readonly string[];\n readonly path: string;\n}): { readonly seat: number } {\n if (typeof options.value !== \"string\") {\n throw new ScenarioSchemaValueError(\n options.path,\n \"expected a runtime player id string\",\n );\n }\n const seat = options.playerIds.indexOf(options.value);\n if (seat < 0) {\n throw new ScenarioSchemaValueError(\n options.path,\n `runtime player id '${options.value}' is not assigned to a scenario seat`,\n );\n }\n return { seat };\n}\n\ntype ScenarioSchemaTransformOptions = {\n readonly schema: z.core.SomeType;\n readonly value: unknown;\n readonly playerIds: readonly string[];\n readonly path: string;\n};\n\n/**\n * Resolve only schemas carrying the semantic `playerId` manifest family.\n * Ordinary strings and objects with a coincidental `seat` key are untouched.\n */\nexport function resolveScenarioSeatReferences(\n options: ScenarioSchemaTransformOptions,\n): unknown {\n return transformScenarioSchemaValue({ ...options, direction: \"resolve\" });\n}\n\n/**\n * Convert runtime player ids back to pasteable scenario seat references using\n * the same semantic schema walker as command replay.\n */\nexport function projectScenarioSeatReferences(\n options: ScenarioSchemaTransformOptions,\n): unknown {\n return transformScenarioSchemaValue({ ...options, direction: \"project\" });\n}\n\nfunction transformScenarioSchemaValue(\n options: ScenarioSchemaTransformOptions & {\n readonly direction: \"resolve\" | \"project\";\n },\n): unknown {\n const { schema, value, playerIds, path } = options;\n\n if (manifestSchemaFamily(schema) === \"playerId\") {\n return options.direction === \"resolve\"\n ? resolvePlayerSeatReference({ value, playerIds, path })\n : projectPlayerSeatReference({ value, playerIds, path });\n }\n\n if (schema instanceof z.ZodOptional || schema instanceof z.ZodExactOptional) {\n return value === undefined\n ? value\n : transformScenarioSchemaValue({\n schema: schema.unwrap(),\n value,\n playerIds,\n path,\n direction: options.direction,\n });\n }\n if (schema instanceof z.ZodNullable) {\n return value === null\n ? value\n : transformScenarioSchemaValue({\n schema: schema.unwrap(),\n value,\n playerIds,\n path,\n direction: options.direction,\n });\n }\n if (\n schema instanceof z.ZodDefault ||\n schema instanceof z.ZodPrefault ||\n schema instanceof z.ZodCatch ||\n schema instanceof z.ZodReadonly ||\n schema instanceof z.ZodNonOptional\n ) {\n return transformScenarioSchemaValue({\n schema: schema.unwrap(),\n value,\n playerIds,\n path,\n direction: options.direction,\n });\n }\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value;\n return value.map((item, index) =>\n transformScenarioSchemaValue({\n schema: schema.element,\n value: item,\n playerIds,\n path: appendScenarioPath(path, index),\n direction: options.direction,\n }),\n );\n }\n if (schema instanceof z.ZodTuple) {\n if (!Array.isArray(value)) return value;\n const definition = schema._zod.def;\n const items = definition.items ?? [];\n return value.map((item: unknown, index) => {\n const itemSchema = items[index] ?? definition.rest;\n return itemSchema\n ? transformScenarioSchemaValue({\n schema: itemSchema,\n value: item,\n playerIds,\n path: appendScenarioPath(path, index),\n direction: options.direction,\n })\n : item;\n });\n }\n if (schema instanceof z.ZodObject) {\n if (!isPlainObject(value)) return value;\n const output: Record<string, unknown> = { ...value };\n for (const [key, childSchema] of Object.entries<z.core.SomeType>(\n schema.shape,\n )) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n output[key] = transformScenarioSchemaValue({\n schema: childSchema,\n value: value[key],\n playerIds,\n path: appendScenarioPath(path, key),\n direction: options.direction,\n });\n }\n return output;\n }\n if (schema instanceof z.ZodRecord) {\n if (!isPlainObject(value)) return value;\n if (manifestSchemaFamily(schema.keyType) === \"playerId\") {\n throw new ScenarioSchemaValueError(\n path,\n \"player-valued record keys cannot be represented by scenario seat references\",\n );\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n transformScenarioSchemaValue({\n schema: schema.valueType,\n value: item,\n playerIds,\n path: appendScenarioPath(path, key),\n direction: options.direction,\n }),\n ]),\n );\n }\n if (schema instanceof z.ZodUnion) {\n let firstSeatError: ScenarioSchemaValueError | undefined;\n for (const option of schema.options) {\n try {\n if (\n options.direction === \"project\" &&\n !z.core.safeParse(option, value).success\n ) {\n continue;\n }\n const resolved = transformScenarioSchemaValue({\n schema: option,\n value,\n playerIds,\n path,\n direction: options.direction,\n });\n if (\n options.direction === \"project\" ||\n z.core.safeParse(option, resolved).success\n ) {\n return resolved;\n }\n } catch (error) {\n if (\n firstSeatError === undefined &&\n error instanceof ScenarioSchemaValueError\n ) {\n firstSeatError = error;\n }\n }\n }\n if (firstSeatError) throw firstSeatError;\n return value;\n }\n if (schema instanceof z.ZodIntersection) {\n const definition = schema._zod.def;\n const leftResolved = transformScenarioSchemaValue({\n schema: definition.left,\n value,\n playerIds,\n path,\n direction: options.direction,\n });\n return transformScenarioSchemaValue({\n schema: definition.right,\n value: leftResolved,\n playerIds,\n path,\n direction: options.direction,\n });\n }\n if (schema instanceof z.ZodPipe) {\n return transformScenarioSchemaValue({\n schema: schema.in,\n value,\n playerIds,\n path,\n direction: options.direction,\n });\n }\n if (schema instanceof z.ZodLazy) {\n return transformScenarioSchemaValue({\n schema: schema.unwrap(),\n value,\n playerIds,\n path,\n direction: options.direction,\n });\n }\n\n return value;\n}\n","import type { CollectorValueOf } from \"../reducer/model/spec/inputs\";\nimport type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../reducer/model.js\";\nimport type { ReducerBundleContract } from \"../shared/worker-contract.js\";\nimport { type RuntimeJson } from \"../shared/runtime-json\";\nimport type { z } from \"zod\";\nimport type {\n ClientParamsOfInteractionOfDefinition,\n GameStateOf,\n InteractionIdOfDefinitionPhase,\n InteractionSpecByNameOfDefinitionPhase,\n PhaseNamesOfDefinition,\n ViewOfDefinition,\n} from \"../reducer/model/definition.js\";\nimport type { ManifestIdSchema } from \"../reducer/model/manifest.js\";\nimport type {\n DispatchTraceSummaryEntry,\n ReducerDiagnosticEvent,\n} from \"../reducer/diagnostics.js\";\nimport {\n ScenarioDefinitionValidationError,\n validateScenarioDefinition,\n} from \"./scenario-definition-validation.js\";\n\nexport {\n ScenarioDefinitionValidationError,\n type ScenarioDefinitionValidationCode,\n} from \"./scenario-definition-validation.js\";\n\nexport type InteractionDescriptorLike = {\n interactionId?: string;\n surface?: string;\n kind?: string;\n availability?: InteractionAvailabilityLike;\n} & Record<string, unknown>;\n\nexport type InteractionAvailabilityLike =\n | { status: \"available\" }\n | { status: \"notYourTurn\"; reason: string }\n | { status: \"blocked\"; reason: string; code?: string };\n\nexport type InteractionExplanationLike = {\n interactionId: string;\n phase: string;\n step: string | null;\n availability:\n \"available\" | \"notYourTurn\" | \"wrongPhase\" | \"wrongStep\" | \"blocked\";\n rules: ReadonlyArray<{\n ruleId: string;\n outcome: \"passed\" | \"failed\" | \"notEvaluated\";\n errorCode?: string;\n message?: string;\n }>;\n actor: { required: readonly string[]; playerIsActor: boolean };\n inputs: ReadonlyArray<{\n key: string;\n kind: string;\n eligibleCount: number | \"unknown\";\n }>;\n};\n\nexport type SnapshotMatcherHandler = (\n name: string | undefined,\n actual: unknown,\n) => void;\n\nexport type RejectionExpectation = {\n errorCode?: string;\n message?: string | RegExp;\n};\n\nexport type ExpectMatchers = {\n toBe: (expected: unknown) => void;\n toEqual: (expected: unknown) => void;\n toMatchObject: (expected: Record<string, unknown>) => void;\n toBeDefined: () => void;\n toBeUndefined: () => void;\n toBeNull: () => void;\n toContain: (expected: unknown) => void;\n toContainEqual: (expected: unknown) => void;\n toHaveLength: (expected: number) => void;\n toBeGreaterThan: (expected: number) => void;\n toBeGreaterThanOrEqual: (expected: number) => void;\n toThrow: (predicate?: string | RegExp | ((error: Error) => boolean)) => void;\n toMatchSnapshot: (filename?: string) => void;\n toRejectWith: (expected: RejectionExpectation) => Promise<void>;\n toHaveInteraction: (\n interactionId: string,\n opts?: Partial<InteractionDescriptorLike>,\n ) => void;\n toBeGatedBy: (reason: string, opts?: { interactionId?: string }) => void;\n toBeAvailable: (explanation?: InteractionExplanationLike) => void;\n not: {\n toHaveInteraction: (interactionId: string) => void;\n };\n};\n\nexport type ExpectFn = (actual: unknown) => ExpectMatchers;\n\nexport type ScenarioSeatRef = {\n readonly seat: number;\n};\n\nexport type ScenarioActor = ScenarioSeatRef;\n\nexport type ScenarioSetup = {\n readonly players: number;\n readonly seed: number;\n readonly options?: Readonly<Record<string, RuntimeJson>>;\n};\n\ntype ScenarioTupleOutput<\n Items extends readonly z.core.SomeType[],\n Rest extends z.core.SomeType | null,\n Value,\n> = Rest extends z.core.SomeType\n ? readonly [\n ...{\n [Index in keyof Items]: ScenarioSchemaOutput<\n Items[Index],\n Index extends keyof Value ? Value[Index] : z.output<Items[Index]>\n >;\n },\n ...ScenarioSchemaOutput<Rest>[],\n ]\n : readonly [\n ...{\n [Index in keyof Items]: ScenarioSchemaOutput<\n Items[Index],\n Index extends keyof Value ? Value[Index] : z.output<Items[Index]>\n >;\n },\n ];\n\ntype OptionalScenarioObjectKeys<Shape extends z.core.$ZodShape> = {\n [Key in keyof Shape]: undefined extends z.output<Shape[Key]> ? Key : never;\n}[keyof Shape];\n\ntype ScenarioObjectOutput<Shape extends z.core.$ZodShape, Value> = {\n readonly [\n Key in Exclude<keyof Shape, OptionalScenarioObjectKeys<Shape>>\n ]: ScenarioSchemaOutput<\n Shape[Key],\n Key extends keyof Value ? Value[Key] : z.output<Shape[Key]>\n >;\n} & {\n readonly [Key in OptionalScenarioObjectKeys<Shape>]?: ScenarioSchemaOutput<\n Shape[Key],\n Key extends keyof Value ? Value[Key] : z.output<Shape[Key]>\n >;\n};\n\n/**\n * Authoring projection of an input schema. Only semantic player-id leaves are\n * replaced; ordinary strings retain their original type.\n */\nexport type ScenarioSchemaOutput<\n Schema extends z.core.SomeType,\n Value = z.output<Schema>,\n> =\n Schema extends ManifestIdSchema<unknown, \"playerId\">\n ? ScenarioSeatRef\n : Schema extends z.ZodOptional<infer Inner>\n ? ScenarioSchemaOutput<Inner, Value> | undefined\n : Schema extends z.ZodExactOptional<infer Inner>\n ? ScenarioSchemaOutput<Inner, Value> | undefined\n : Schema extends z.ZodNullable<infer Inner>\n ? ScenarioSchemaOutput<Inner, Value> | null\n : Schema extends z.ZodDefault<infer Inner>\n ? ScenarioSchemaOutput<Inner, Value>\n : Schema extends z.ZodPrefault<infer Inner>\n ? ScenarioSchemaOutput<Inner, Value>\n : Schema extends z.ZodCatch<infer Inner>\n ? ScenarioSchemaOutput<Inner, Value>\n : Schema extends z.ZodReadonly<infer Inner>\n ? Readonly<ScenarioSchemaOutput<Inner, Value>>\n : Schema extends z.ZodNonOptional<infer Inner>\n ? Exclude<ScenarioSchemaOutput<Inner, Value>, undefined>\n : Schema extends z.ZodArray<infer Element>\n ? Value extends readonly (infer Item)[]\n ? readonly ScenarioSchemaOutput<Element, Item>[]\n : never\n : Schema extends z.ZodTuple<infer Items, infer Rest>\n ? ScenarioTupleOutput<Items, Rest, Value>\n : Schema extends z.ZodObject<infer Shape>\n ? ScenarioObjectOutput<\n Shape,\n Value & z.output<Schema>\n >\n : Schema extends z.ZodRecord<infer Key, infer Element>\n ? Key extends ManifestIdSchema<unknown, \"playerId\">\n ? never\n : Readonly<\n Record<\n Extract<\n z.output<Key>,\n string | number | symbol\n >,\n ScenarioSchemaOutput<\n Element,\n Value extends Readonly<\n Record<string, infer Item>\n >\n ? Item\n : z.output<Element>\n >\n >\n >\n : Schema extends z.ZodIntersection<\n infer Left,\n infer Right\n >\n ? ScenarioSchemaOutput<Left, Value> &\n ScenarioSchemaOutput<Right, Value>\n : Schema extends z.ZodPipe<infer Input, z.ZodType>\n ? ScenarioSchemaOutput<Input>\n : Schema extends z.ZodLazy<infer Inner>\n ? ScenarioSchemaOutput<Inner, Value>\n : Schema extends z.ZodUnion<infer Options>\n ? ScenarioSchemaOutput<\n Options[number],\n Value\n >\n : Value & z.output<Schema>;\n\ntype InputCollectorsOfInteraction<Interaction> = Interaction extends {\n readonly steps: {\n readonly collectors: infer Collectors extends Readonly<\n Record<string, unknown>\n >;\n };\n}\n ? Collectors\n : Interaction extends {\n readonly inputs?: infer Collectors;\n }\n ? NonNullable<Collectors> extends Readonly<Record<string, unknown>>\n ? NonNullable<Collectors>\n : Record<string, never>\n : Record<string, never>;\n\ntype ScenarioParamsOfCollectors<\n Collectors extends Readonly<Record<string, unknown>>,\n> = {\n readonly [\n Key in keyof Collectors as Collectors[Key] extends {\n readonly kind: \"rng\";\n }\n ? never\n : Key\n ]: Collectors[Key] extends {\n readonly schema: infer Schema extends z.core.SomeType;\n }\n ? ScenarioSchemaOutput<Schema, CollectorValueOf<Collectors[Key]>>\n : never;\n};\n\ntype ScenarioStepParams<Params> = {\n [Key in keyof Params]: Pick<Params, Key> &\n Partial<Record<Exclude<keyof Params, Key>, never>>;\n}[keyof Params];\n\ntype ScenarioParamsOfInteraction<Interaction> = Interaction extends {\n readonly steps: unknown;\n}\n ? ScenarioStepParams<\n ScenarioParamsOfCollectors<InputCollectorsOfInteraction<Interaction>>\n >\n : ScenarioParamsOfCollectors<InputCollectorsOfInteraction<Interaction>>;\n\nexport type ScenarioCommand<\n InteractionId extends string = string,\n Params = Record<string, unknown>,\n> = {\n readonly actor: ScenarioActor;\n readonly interactionId: InteractionId;\n readonly params: Params;\n};\n\ntype ScenarioCommandForPhase<\n Game,\n Phase extends PhaseNamesOfDefinition<Game>,\n> = {\n [\n InteractionId in InteractionIdOfDefinitionPhase<Game, Phase>\n ]: ScenarioCommand<\n InteractionId,\n ScenarioParamsOfInteraction<\n InteractionSpecByNameOfDefinitionPhase<Game, Phase, InteractionId>\n >\n >;\n}[InteractionIdOfDefinitionPhase<Game, Phase>];\n\nexport type ScenarioCommandOf<Game> = {\n [Phase in PhaseNamesOfDefinition<Game>]: ScenarioCommandForPhase<Game, Phase>;\n}[PhaseNamesOfDefinition<Game>];\n\n/** Production params remain available for runtime implementors and diagnostics. */\nexport type RuntimeParamsOfScenarioCommand<\n Game,\n Phase extends PhaseNamesOfDefinition<Game>,\n InteractionId extends InteractionIdOfDefinitionPhase<Game, Phase>,\n> = ClientParamsOfInteractionOfDefinition<Game, Phase, InteractionId>;\n\nexport type ScenarioReplayDefinition<Game> = {\n readonly id: string;\n readonly description?: string;\n readonly setup: ScenarioSetup;\n readonly given: readonly ScenarioCommandOf<Game>[];\n readonly when: readonly ScenarioCommandOf<Game>[];\n};\n\ntype DeepReadonly<Value> = Value extends\n string | number | boolean | bigint | symbol\n ? Value\n : Value extends (...args: never[]) => unknown\n ? Value\n : Value extends readonly (infer Item)[]\n ? readonly DeepReadonly<Item>[]\n : Value extends object\n ? { readonly [Key in keyof Value]: DeepReadonly<Value[Key]> }\n : Value;\n\ntype ScenarioPlayerView<Game> = ViewOfDefinition<Game>;\n\nexport type ScenarioFlowDiagnostics = {\n readonly currentPhase: string | null;\n readonly activeSeats: readonly ScenarioSeatRef[];\n};\n\nexport type ScenarioDiagnostics = {\n readonly events: readonly ReducerDiagnosticEvent[];\n readonly lastDispatch: {\n readonly submissionId: string;\n readonly trace: readonly DispatchTraceSummaryEntry[];\n } | null;\n readonly flow: ScenarioFlowDiagnostics;\n};\n\nexport type ScenarioProbeAccepted<Game> = {\n readonly kind: \"accepted\";\n readonly command: ScenarioCommandOf<Game>;\n readonly checkpointDigest: string;\n readonly trace: readonly DispatchTraceSummaryEntry[];\n toBeAccepted(): void;\n toRejectWith(expected: RejectionExpectation): never;\n};\n\nexport type ScenarioProbeRejected<Game> = {\n readonly kind: \"rejected\";\n readonly command: ScenarioCommandOf<Game>;\n readonly errorCode: string;\n readonly message?: string;\n readonly trace: readonly DispatchTraceSummaryEntry[];\n toBeAccepted(): never;\n toRejectWith(expected: RejectionExpectation): void;\n};\n\nexport type ScenarioProbeResult<Game> =\n ScenarioProbeAccepted<Game> | ScenarioProbeRejected<Game>;\n\nexport type ScenarioAssertionContext<Game> = {\n readonly expect: ExpectFn;\n state(): DeepReadonly<GameStateOf<Game>>;\n view(seat: ScenarioSeatRef): DeepReadonly<ScenarioPlayerView<Game>>;\n interactions(seat: ScenarioSeatRef): readonly InteractionDescriptorLike[];\n explain(\n seat: ScenarioSeatRef,\n interactionId: string,\n ): InteractionExplanationLike;\n readonly diagnostics: ScenarioDiagnostics;\n probe(command: ScenarioCommandOf<Game>): Promise<ScenarioProbeResult<Game>>;\n};\n\nexport type ScenarioDefinition<Game> = ScenarioReplayDefinition<Game> & {\n /** Named authored states for CLI, Workbench, demo, and test adapters. */\n readonly checkpoints?: Readonly<\n Record<ScenarioCheckpointId, ScenarioCheckpoint>\n >;\n readonly then: (\n context: ScenarioAssertionContext<Game>,\n ) => void | Promise<void>;\n};\n\nexport type ScenarioCheckpoint =\n | { readonly segment: \"setup\"; readonly completed: 0 }\n | { readonly segment: \"given\"; readonly completed: number }\n | { readonly segment: \"when\"; readonly completed: number };\n\nexport type ScenarioCheckpointId = string;\n\nexport type ScenarioCheckpointSelector =\n ScenarioCheckpoint | ScenarioCheckpointId;\n\n/** Resolve authored names while keeping replay DTOs structurally checkpointed. */\nexport function resolveScenarioCheckpoint<Game>(\n definition: Pick<\n ScenarioDefinition<Game>,\n \"checkpoints\" | \"given\" | \"id\" | \"when\"\n >,\n selector: ScenarioCheckpointSelector,\n): ScenarioCheckpoint {\n if (typeof selector !== \"string\") {\n return structuredClone(selector);\n }\n const checkpoint = definition.checkpoints?.[selector];\n if (checkpoint === undefined) {\n const available = Object.keys(definition.checkpoints ?? {}).sort();\n throw new ScenarioDefinitionValidationError({\n code: \"INVALID_VALUE\",\n path: \"scenario.checkpoints\",\n reason:\n `checkpoint '${selector}' is not declared by scenario '${definition.id}'` +\n (available.length === 0\n ? \"; no named checkpoints are available\"\n : `; available checkpoints: ${available.join(\", \")}`),\n });\n }\n return structuredClone(checkpoint);\n}\n\nexport type ScenarioReplaySegment = \"given\" | \"when\";\n\nexport type ScenarioCommandTraceEntry<Game> = {\n readonly segment: ScenarioReplaySegment;\n readonly index: number;\n readonly command: ScenarioCommandOf<Game>;\n readonly trace: readonly DispatchTraceSummaryEntry[];\n};\n\nexport type ScenarioReplay<Game> = {\n readonly scenarioId: string;\n readonly checkpoint: ScenarioCheckpoint;\n readonly checkpointDigest: string;\n readonly complete: boolean;\n readonly trace: readonly ScenarioCommandTraceEntry<Game>[];\n state(): DeepReadonly<GameStateOf<Game>>;\n view(seat: ScenarioSeatRef): DeepReadonly<ScenarioPlayerView<Game>>;\n interactions(seat: ScenarioSeatRef): readonly InteractionDescriptorLike[];\n explain(\n seat: ScenarioSeatRef,\n interactionId: string,\n ): InteractionExplanationLike;\n readonly diagnostics: ScenarioDiagnostics;\n clone(): ScenarioReplay<Game>;\n};\n\nexport type ReplayScenarioOptions<Game> = {\n /** Exact production artifact to execute; omitted for ordinary authored replay. */\n readonly bundle?: ReducerBundleContract;\n readonly game: Game;\n readonly scenario: ScenarioReplayDefinition<Game>;\n readonly at?: ScenarioCheckpoint;\n};\n\nexport type AssertScenarioOptions<Game> = {\n readonly replay: ScenarioReplay<Game>;\n readonly assertion: ScenarioDefinition<Game>[\"then\"];\n};\n\nexport type ScenarioReplayErrorOptions = {\n readonly scenarioId: string;\n readonly segment: ScenarioReplaySegment;\n readonly index: number;\n readonly interactionId: string;\n readonly errorCode: string;\n readonly reducerMessage?: string;\n readonly trace?: readonly DispatchTraceSummaryEntry[];\n};\n\nexport class ScenarioReplayError extends Error {\n readonly scenarioId: string;\n readonly segment: ScenarioReplaySegment;\n readonly index: number;\n readonly interactionId: string;\n readonly errorCode: string;\n readonly reducerMessage?: string;\n readonly trace: readonly DispatchTraceSummaryEntry[];\n\n constructor(options: ScenarioReplayErrorOptions) {\n super(\n `Scenario '${options.scenarioId}' rejected ${options.segment}[${options.index}] ` +\n `interaction '${options.interactionId}' with ${options.errorCode}` +\n (options.reducerMessage ? `: ${options.reducerMessage}` : \".\"),\n );\n this.name = \"ScenarioReplayError\";\n this.scenarioId = options.scenarioId;\n this.segment = options.segment;\n this.index = options.index;\n this.interactionId = options.interactionId;\n this.errorCode = options.errorCode;\n this.reducerMessage = options.reducerMessage;\n this.trace = options.trace ?? [];\n }\n}\n\ntype NoExtraScenarioFields<Actual, Expected> = Record<\n Exclude<keyof Actual, keyof Expected>,\n never\n>;\n\nexport type ScenarioAuthoring<Game> = {\n defineScenario<const Definition extends ScenarioDefinition<Game>>(\n definition: Definition &\n NoExtraScenarioFields<Definition, ScenarioDefinition<Game>>,\n ): Definition;\n};\n\nexport function createScenarioAuthoring<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(game: Game & { readonly contract: Contract }): ScenarioAuthoring<Game> {\n return {\n defineScenario<const Definition extends ScenarioDefinition<Game>>(\n definition: Definition &\n NoExtraScenarioFields<Definition, ScenarioDefinition<Game>>,\n ): Definition {\n validateScenarioDefinition(game, definition);\n return definition;\n },\n };\n}\n\n/** Select and clone the only serializable portion of a loaded scenario. */\nexport function toScenarioReplayDefinition<Game>(\n definition: ScenarioDefinition<Game>,\n): ScenarioReplayDefinition<Game> {\n const replay = {\n id: definition.id,\n ...(definition.description === undefined\n ? {}\n : { description: definition.description }),\n setup: definition.setup,\n given: definition.given,\n when: definition.when,\n } satisfies ScenarioReplayDefinition<Game>;\n return structuredClone(replay);\n}\n","export const SCENARIO_ASSERTION_ERROR_CODE =\n \"SCENARIO_ASSERTION_FAILED\" as const;\n\n/** A failed SDK matcher or probe expectation authored in `scenario.then`. */\nexport class ScenarioAssertionError extends Error {\n readonly code = SCENARIO_ASSERTION_ERROR_CODE;\n\n constructor(message: string) {\n super(message);\n this.name = \"ScenarioAssertionError\";\n }\n}\n\nexport function scenarioAssertionFailure(message: string): never {\n throw new ScenarioAssertionError(message);\n}\n","import type {\n ExpectFn,\n ExpectMatchers,\n InteractionDescriptorLike,\n RejectionExpectation,\n InteractionExplanationLike,\n SnapshotMatcherHandler,\n} from \"./definitions.js\";\nimport type { ReducerDiagnosticEvent } from \"../reducer/diagnostics.js\";\nimport { scenarioAssertionFailure } from \"./scenario-assertion-error.js\";\n\ntype CreateExpectApiOptions = {\n matchSnapshot?: SnapshotMatcherHandler;\n lastDiagnosticRejection?: () =>\n | Extract<ReducerDiagnosticEvent, { type: \"submitRejected\" }>\n | null\n | undefined;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isDeepStrictEqual(actual: unknown, expected: unknown): boolean {\n if (Object.is(actual, expected)) return true;\n if (typeof actual !== typeof expected) return false;\n if (actual === null || expected === null) return false;\n if (typeof actual !== \"object\" || typeof expected !== \"object\") return false;\n\n if (actual instanceof Date || expected instanceof Date) {\n return (\n actual instanceof Date &&\n expected instanceof Date &&\n Object.is(actual.getTime(), expected.getTime())\n );\n }\n if (actual instanceof RegExp || expected instanceof RegExp) {\n return (\n actual instanceof RegExp &&\n expected instanceof RegExp &&\n actual.source === expected.source &&\n actual.flags === expected.flags\n );\n }\n if (Array.isArray(actual) || Array.isArray(expected)) {\n return (\n Array.isArray(actual) &&\n Array.isArray(expected) &&\n actual.length === expected.length &&\n actual.every((value, index) => isDeepStrictEqual(value, expected[index]))\n );\n }\n\n const actualPrototype: unknown = Object.getPrototypeOf(actual);\n const expectedPrototype: unknown = Object.getPrototypeOf(expected);\n if (actualPrototype !== expectedPrototype) return false;\n\n const actualRecord = actual as Record<string, unknown>;\n const expectedRecord = expected as Record<string, unknown>;\n const actualKeys = Object.keys(actualRecord);\n const expectedKeys = Object.keys(expectedRecord);\n return (\n actualKeys.length === expectedKeys.length &&\n actualKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(expectedRecord, key) &&\n isDeepStrictEqual(actualRecord[key], expectedRecord[key]),\n )\n );\n}\n\nfunction matchPartial(\n actual: unknown,\n expected: unknown,\n path: string = \"value\",\n): string | null {\n if (!isRecord(expected)) {\n return isDeepStrictEqual(actual, expected)\n ? null\n : `${path} does not match`;\n }\n if (!isRecord(actual)) {\n return `${path} is not an object`;\n }\n for (const [key, expectedValue] of Object.entries(expected)) {\n const actualValue = actual[key];\n if (!(key in actual)) {\n return `${path}.${key} is missing`;\n }\n const mismatch = matchPartial(actualValue, expectedValue, `${path}.${key}`);\n if (mismatch) {\n return mismatch;\n }\n }\n return null;\n}\n\nfunction asDescriptorList(actual: unknown): InteractionDescriptorLike[] {\n if (!Array.isArray(actual)) {\n scenarioAssertionFailure(\"Expected interaction descriptor array.\");\n }\n return actual as InteractionDescriptorLike[];\n}\n\nfunction findInteraction(\n descriptors: readonly InteractionDescriptorLike[],\n interactionId: string,\n): InteractionDescriptorLike | null {\n return (\n descriptors.find(\n (descriptor) => descriptor.interactionId === interactionId,\n ) ?? null\n );\n}\n\nfunction assertDescriptorMatches(\n descriptor: InteractionDescriptorLike,\n opts: Partial<InteractionDescriptorLike> | undefined,\n): void {\n if (!opts) {\n return;\n }\n const mismatch = matchPartial(descriptor, opts, \"interaction\");\n if (mismatch) {\n scenarioAssertionFailure(mismatch);\n }\n}\n\nfunction createSubmissionErrorMatcher(\n actual: unknown,\n expected: RejectionExpectation,\n options: CreateExpectApiOptions,\n): Promise<void> {\n if (\n isRecord(actual) &&\n (actual.kind === \"accepted\" || actual.kind === \"rejected\")\n ) {\n if (actual.kind === \"accepted\") {\n scenarioAssertionFailure(\n \"Expected probe command to reject, but it was accepted.\",\n );\n }\n const errorCode =\n typeof actual.errorCode === \"string\" ? actual.errorCode : undefined;\n const message = typeof actual.message === \"string\" ? actual.message : \"\";\n if (expected.errorCode !== undefined && errorCode !== expected.errorCode) {\n scenarioAssertionFailure(\n `Expected rejection errorCode '${expected.errorCode}', received '${errorCode ?? \"undefined\"}'.`,\n );\n }\n if (typeof expected.message === \"string\" && message !== expected.message) {\n scenarioAssertionFailure(\n `Expected rejection message '${expected.message}', received '${message}'.`,\n );\n }\n if (expected.message instanceof RegExp && !expected.message.test(message)) {\n scenarioAssertionFailure(\n `Expected rejection message '${message}' to match ${String(expected.message)}.`,\n );\n }\n return Promise.resolve();\n }\n\n const resolvePromise = (): Promise<unknown> => {\n if (typeof actual === \"function\") {\n return Promise.resolve().then(() => (actual as () => unknown)());\n }\n return Promise.resolve(actual);\n };\n\n return resolvePromise().then(\n () => scenarioAssertionFailure(\"Expected promise to reject.\"),\n (error: unknown) => {\n if (!(error instanceof Error)) {\n scenarioAssertionFailure(\"Expected rejection to be an Error.\");\n }\n if (\n expected.errorCode !== undefined &&\n (error as Error & { errorCode?: string }).errorCode !==\n expected.errorCode\n ) {\n scenarioAssertionFailure(\n `Expected rejection errorCode '${expected.errorCode}', received '${\n (error as Error & { errorCode?: string }).errorCode ?? \"undefined\"\n }'.${formatLastDiagnosticRejection(options)}`,\n );\n }\n if (\n typeof expected.message === \"string\" &&\n error.message !== expected.message\n ) {\n scenarioAssertionFailure(\n `Expected rejection message '${expected.message}', received '${error.message}'.${formatLastDiagnosticRejection(\n options,\n )}`,\n );\n }\n if (\n expected.message instanceof RegExp &&\n !expected.message.test(error.message)\n ) {\n scenarioAssertionFailure(\n `Expected rejection message '${error.message}' to match ${String(\n expected.message,\n )}.${formatLastDiagnosticRejection(options)}`,\n );\n }\n },\n );\n}\n\nfunction formatLastDiagnosticRejection(\n options: CreateExpectApiOptions,\n): string {\n const rejection = options.lastDiagnosticRejection?.();\n if (!rejection) return \"\";\n const rule = rejection.ruleId ? ` ruleId=${rejection.ruleId}` : \"\";\n const message = rejection.message ? ` message=${rejection.message}` : \"\";\n return `\\nlast rejection: errorCode=${rejection.errorCode}${rule}${message}`;\n}\n\nfunction assertLength(actual: unknown, expected: number): void {\n if (\n actual === null ||\n actual === undefined ||\n typeof (actual as { length?: unknown }).length !== \"number\"\n ) {\n scenarioAssertionFailure(\n \"toHaveLength expects a value with a numeric length.\",\n );\n }\n const length = (actual as { length: number }).length;\n if (length !== expected) {\n scenarioAssertionFailure(\n `Expected length ${expected}, received ${length}.`,\n );\n }\n}\n\nfunction formatInteractionExplanation(\n explanation: InteractionExplanationLike | undefined,\n): string {\n if (!explanation) {\n return \"\";\n }\n const lines = [\n `availability: ${explanation.availability}`,\n ...explanation.rules.map((rule) => {\n const code = rule.errorCode ? ` (${rule.errorCode})` : \"\";\n const message = rule.message ? `: ${rule.message}` : \"\";\n return `rule ${rule.ruleId} ${rule.outcome}${code}${message}`;\n }),\n ...explanation.inputs.map(\n (input) => `input ${input.key} eligibleCount=${input.eligibleCount}`,\n ),\n ];\n return `\\n${lines.join(\"\\n\")}`;\n}\n\nfunction assertThrown(\n actual: unknown,\n predicate?: string | RegExp | ((error: Error) => boolean),\n): void {\n if (typeof actual !== \"function\") {\n scenarioAssertionFailure(\"toThrow expects a function.\");\n }\n try {\n (actual as () => unknown)();\n } catch (error) {\n if (!(error instanceof Error)) {\n scenarioAssertionFailure(\"Thrown value is not an Error.\");\n }\n if (predicate === undefined) {\n return;\n }\n if (typeof predicate === \"string\" && error.message !== predicate) {\n scenarioAssertionFailure(\n `Expected thrown message '${predicate}', received '${error.message}'.`,\n );\n }\n if (predicate instanceof RegExp && !predicate.test(error.message)) {\n scenarioAssertionFailure(\n `Expected thrown message '${error.message}' to match ${String(predicate)}.`,\n );\n }\n if (typeof predicate === \"function\" && !predicate(error)) {\n scenarioAssertionFailure(\"Thrown error did not satisfy predicate.\");\n }\n return;\n }\n scenarioAssertionFailure(\"Expected function to throw.\");\n}\n\nexport function createExpectApi(\n options: CreateExpectApiOptions = {},\n): ExpectFn {\n const buildMatchers = (actual: unknown): ExpectMatchers => ({\n toBe: (expected: unknown) => {\n if (actual !== expected) {\n scenarioAssertionFailure(\n `Expected '${String(actual)}' to be '${String(expected)}'.`,\n );\n }\n },\n toEqual: (expected: unknown) => {\n if (!isDeepStrictEqual(actual, expected)) {\n scenarioAssertionFailure(\"Expected values to be deeply equal.\");\n }\n },\n toMatchObject: (expected: Record<string, unknown>) => {\n const mismatch = matchPartial(actual, expected);\n if (mismatch) {\n scenarioAssertionFailure(mismatch);\n }\n },\n toBeDefined: () => {\n if (actual === undefined) {\n scenarioAssertionFailure(\"Expected value to be defined.\");\n }\n },\n toBeUndefined: () => {\n if (actual !== undefined) {\n scenarioAssertionFailure(\n `Expected value to be undefined, but received '${String(actual)}'.`,\n );\n }\n },\n toBeNull: () => {\n if (actual !== null) {\n scenarioAssertionFailure(\n `Expected value to be null, but received '${String(actual)}'.`,\n );\n }\n },\n toContain: (expected: unknown) => {\n if (Array.isArray(actual)) {\n if (!actual.includes(expected)) {\n scenarioAssertionFailure(\"Expected array to contain value.\");\n }\n return;\n }\n if (typeof actual === \"string\") {\n if (!actual.includes(String(expected))) {\n scenarioAssertionFailure(\"Expected string to contain value.\");\n }\n return;\n }\n scenarioAssertionFailure(\n \"toContain expects an array or string actual value.\",\n );\n },\n toContainEqual: (expected: unknown) => {\n if (!Array.isArray(actual)) {\n scenarioAssertionFailure(\n \"toContainEqual expects an array actual value.\",\n );\n }\n if (!actual.some((value) => isDeepStrictEqual(value, expected))) {\n scenarioAssertionFailure(\"Expected array to contain an equal value.\");\n }\n },\n toHaveLength: (expected: number) => {\n assertLength(actual, expected);\n },\n toBeGreaterThan: (expected: number) => {\n if (typeof actual !== \"number\") {\n scenarioAssertionFailure(\n \"toBeGreaterThan expects a number actual value.\",\n );\n }\n if (actual <= expected) {\n scenarioAssertionFailure(`Expected ${actual} to be > ${expected}.`);\n }\n },\n toBeGreaterThanOrEqual: (expected: number) => {\n if (typeof actual !== \"number\") {\n scenarioAssertionFailure(\n \"toBeGreaterThanOrEqual expects a number actual value.\",\n );\n }\n if (actual < expected) {\n scenarioAssertionFailure(`Expected ${actual} to be >= ${expected}.`);\n }\n },\n toThrow: (predicate) => {\n assertThrown(actual, predicate);\n },\n toMatchSnapshot: (filename) => {\n if (!options.matchSnapshot) {\n scenarioAssertionFailure(\n \"Snapshot matching is not configured for this expect API.\",\n );\n }\n options.matchSnapshot(filename, actual);\n },\n toRejectWith: (expected) =>\n createSubmissionErrorMatcher(actual, expected, options),\n toHaveInteraction: (interactionId, opts) => {\n const descriptors = asDescriptorList(actual);\n const descriptor = findInteraction(descriptors, interactionId);\n if (!descriptor) {\n scenarioAssertionFailure(\n `Expected interaction '${interactionId}' to exist.`,\n );\n }\n assertDescriptorMatches(descriptor, opts);\n },\n toBeGatedBy: (reason, opts) => {\n const descriptor = Array.isArray(actual)\n ? (() => {\n if (!opts?.interactionId) {\n scenarioAssertionFailure(\n \"toBeGatedBy on a descriptor array requires opts.interactionId.\",\n );\n }\n return findInteraction(\n asDescriptorList(actual),\n opts.interactionId,\n );\n })()\n : (actual as InteractionDescriptorLike | null);\n if (!descriptor) {\n scenarioAssertionFailure(\"Expected interaction descriptor to exist.\");\n }\n if (descriptor.availability?.status === \"available\") {\n scenarioAssertionFailure(\"Expected interaction to be unavailable.\");\n }\n const actualReason =\n descriptor.availability?.status === \"notYourTurn\" ||\n descriptor.availability?.status === \"blocked\"\n ? descriptor.availability.reason\n : undefined;\n if (actualReason !== reason) {\n scenarioAssertionFailure(\n `Expected unavailable reason '${reason}', received '${\n actualReason ?? \"undefined\"\n }'.`,\n );\n }\n },\n toBeAvailable: (explanation) => {\n const descriptor = Array.isArray(actual)\n ? (() => {\n if (!explanation?.interactionId) {\n scenarioAssertionFailure(\n \"toBeAvailable on a descriptor array requires an explanation.\",\n );\n }\n return findInteraction(\n asDescriptorList(actual),\n explanation.interactionId,\n );\n })()\n : (actual as InteractionDescriptorLike | null);\n if (!descriptor) {\n scenarioAssertionFailure(\n `Expected interaction descriptor to exist.${formatInteractionExplanation(\n explanation,\n )}`,\n );\n }\n if (descriptor.availability?.status !== \"available\") {\n scenarioAssertionFailure(\n `Expected interaction '${descriptor.interactionId ?? \"unknown\"}' to be available.${formatInteractionExplanation(\n explanation,\n )}`,\n );\n }\n },\n not: {\n toHaveInteraction: (interactionId) => {\n const descriptors = asDescriptorList(actual);\n if (findInteraction(descriptors, interactionId)) {\n scenarioAssertionFailure(\n `Expected interaction '${interactionId}' to be absent.`,\n );\n }\n },\n },\n });\n\n return (actual: unknown) => buildMatchers(actual);\n}\n","import { ReducerSessionStateSchema } from \"../shared/runtime-schema.js\";\nimport { RuntimeJsonSchema } from \"../shared/runtime-json.js\";\nimport { encodeSeatParams } from \"../reducer/bundle/trusted/seat-interactions.js\";\nimport { createSeatDisclosure } from \"../reducer/bundle/trusted/tile-disclosure.js\";\nimport type * as Wire from \"../shared/runtime-types\";\nimport type { ReducerBundleContract } from \"../shared/worker-contract\";\nimport { createReducerBundle } from \"../reducer/bundle/create-reducer-bundle\";\nimport type { ReducerBundleOptions } from \"../reducer/bundle/types\";\nimport { createIngressRuntimeCodec } from \"../reducer/ingress/session-codec\";\nimport {\n createTrustedRuntimeScope,\n type TrustedSessionState,\n} from \"../reducer/bundle/trusted/runtime-scope\";\nimport { createInteractionResolver } from \"../reducer/bundle/trusted/interaction-resolver\";\nimport { createProjectionBuilder } from \"../reducer/bundle/trusted/projection-builder\";\nimport { concealCards } from \"../reducer/bundle/trusted/card-concealment\";\nimport type {\n InteractionActionabilityResult,\n InteractionExplanation,\n InteractionInputEnumerationResult,\n} from \"../reducer/bundle/trusted/interaction-types\";\nimport type { ClientParamSchema } from \"../reducer/client-param-schemas\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ReducerValidationResult,\n ViewOfContract,\n} from \"../reducer/model\";\n\nimport { createPendingSelectionReconciler } from \"../reducer/bundle/trusted/pending-selection.js\";\n\ntype InspectionInput = {\n referenceBasis: Wire.ReferenceBasis;\n state: Wire.ReducerSessionState;\n playerId: unknown;\n interactionId: string;\n};\ntype ReductionResult =\n | Extract<Wire.DispatchResult, { kind: \"reject\" }>\n | Omit<Extract<Wire.DispatchResult, { kind: \"accept\" }>, \"trace\">;\n\n/** Scenario conveniences; all state changes use the production bundle. */\nexport type ReducerTestingRuntime = Omit<ReducerBundleContract, \"project\"> & {\n dispatchClient: ReducerBundleContract[\"dispatch\"];\n validateInput(input: Wire.DispatchRequest): Promise<ReducerValidationResult>;\n reduce(input: Wire.DispatchRequest): Promise<ReductionResult>;\n project(\n input: Wire.ProjectRequest & { projectionMode?: \"full\" | \"actionsOnly\" },\n ): Wire.SeatProjectionBundle;\n explainInteraction(input: InspectionInput): InteractionExplanation;\n currentClientParamSchema(input: InspectionInput): ClientParamSchema | null;\n currentAuthorParamSchema(input: InspectionInput): ClientParamSchema | null;\n resolveInteractionActionability(\n input: InspectionInput,\n ): InteractionActionabilityResult;\n enumerateInteractionParams(\n input: InspectionInput & { maxEvaluations: number },\n ): InteractionInputEnumerationResult;\n};\n\nexport function createReducerTestingRuntime<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n options: ReducerBundleOptions = {},\n bundle: ReducerBundleContract = createReducerBundle(definition, options),\n): ReducerTestingRuntime {\n const codec = createIngressRuntimeCodec(definition);\n // The codec validates the authored schemas; its erased phase return type\n // cannot express the contract-specific phase-state mapping.\n const parseState = (state: Wire.ReducerSessionState) =>\n // eslint-disable-next-line no-restricted-syntax -- This codec parses the same Contract schemas and current phase before the testing runtime receives its trusted session state.\n codec.parseState(state) as unknown as TrustedSessionState<Contract>;\n const scope = createTrustedRuntimeScope(definition);\n const interactions = createInteractionResolver(scope, {\n diagnostics:\n options.descriptorDiagnostics ??\n (options.diagnostics === \"verbose\" ? \"verbose\" : undefined),\n });\n const projection = createProjectionBuilder(scope, interactions);\n const reconcilePending = createPendingSelectionReconciler(\n scope,\n interactions,\n );\n function inspect({\n state,\n playerId,\n interactionId,\n referenceBasis,\n }: InspectionInput) {\n if (typeof playerId !== \"string\")\n throw new Error(\"Expected a string playerId.\");\n const [perspective] = codec.parseStatePerspectives(state, [playerId]);\n return {\n state: reconcilePending(\n scope.toCombinedState(parseState(state)),\n referenceBasis,\n ),\n playerId: perspective,\n interactionId,\n };\n }\n // Tests act with full knowledge of the table; seats name the cards hidden\n // from them by position, so dispatch does too.\n async function dispatch({\n state,\n input,\n referenceBasis,\n }: Wire.DispatchRequest): Promise<Wire.DispatchResult> {\n if (\n input.kind !== \"interaction\" ||\n !codec.isStatePlayer(state, input.playerId)\n )\n return bundle.dispatch({ state, input, referenceBasis });\n const combinedState = reconcilePending(\n scope.toCombinedState(parseState(state)),\n referenceBasis,\n );\n const playerId = codec.parsePlayerId(input.playerId);\n const disclosure = createSeatDisclosure(\n combinedState.table,\n scope.manifest,\n playerId,\n referenceBasis,\n );\n return bundle.dispatch({\n state: ReducerSessionStateSchema.parse(\n scope.toSessionState(combinedState),\n ),\n referenceBasis,\n input: {\n ...input,\n params: RuntimeJsonSchema.parse(\n encodeSeatParams(\n input.params as Record<string, unknown>,\n interactions.inputCollectors(\n combinedState,\n playerId,\n input.interactionId,\n ),\n disclosure,\n concealCards(combinedState.table, playerId, disclosure),\n ),\n ),\n },\n });\n }\n return {\n ...bundle,\n dispatch,\n dispatchClient: (request) => Promise.resolve(bundle.dispatch(request)),\n async validateInput(request) {\n const result = await dispatch({\n ...request,\n state: structuredClone(request.state),\n });\n return result.kind === \"reject\"\n ? {\n valid: false,\n errorCode: result.errorCode,\n ...(result.message === undefined\n ? {}\n : { message: result.message }),\n }\n : { valid: true };\n },\n async reduce(input) {\n const result = await dispatch(input);\n if (result.kind === \"reject\") return result;\n return {\n kind: result.kind,\n state: result.state,\n events: result.events,\n ...(result.terminal ? { terminal: result.terminal } : {}),\n };\n },\n project({ state, playerIds, projectionMode, referenceBasis }) {\n if (projectionMode !== \"actionsOnly\")\n return bundle.project({ state, playerIds, referenceBasis });\n const perspectives = codec.parseStatePerspectives(state, playerIds);\n // eslint-disable-next-line no-restricted-syntax -- This game-bound actions-only projector assembles the wire seat bundle from parsed session and player IDs.\n return projection.project({\n state: scope.toSessionState(\n reconcilePending(\n scope.toCombinedState(parseState(state)),\n referenceBasis,\n ),\n ),\n playerIds: perspectives,\n projectionMode,\n referenceBasis,\n }) as unknown as Wire.SeatProjectionBundle;\n },\n explainInteraction(input) {\n return interactions.explainInteraction(inspect(input));\n },\n currentAuthorParamSchema(input) {\n return interactions.currentAuthorParamSchema(inspect(input));\n },\n currentClientParamSchema(input) {\n return interactions.currentClientParamSchema(inspect(input));\n },\n resolveInteractionActionability(input) {\n return interactions.resolveInteractionActionability(inspect(input));\n },\n enumerateInteractionParams(input) {\n return interactions.enumerateInteractionParams({\n ...inspect(input),\n maxEvaluations: input.maxEvaluations,\n });\n },\n };\n}\n","import type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../reducer/model.js\";\nimport type { z } from \"zod\";\nimport { createAuthorParamSchemasByPhase } from \"../reducer/client-param-schemas.js\";\nimport type { ScenarioSeatRef } from \"./definitions.js\";\nimport {\n projectScenarioSeatReferences,\n resolveScenarioSeatReferences,\n ScenarioSchemaValueError,\n} from \"./scenario-schema.js\";\n\nexport class ScenarioCommandParamsError extends Error {\n readonly path: string;\n\n constructor(path: string, message: string) {\n super(`${path}: ${message}`);\n this.name = \"ScenarioCommandParamsError\";\n this.path = path;\n }\n}\n\nexport function isScenarioSeatRef(value: unknown): value is ScenarioSeatRef {\n if (!isPlainRecord(value)) return false;\n const keys = Object.keys(value);\n return (\n keys.length === 1 &&\n keys[0] === \"seat\" &&\n Number.isSafeInteger(value.seat) &&\n (value.seat as number) >= 0\n );\n}\n\nexport function resolveScenarioSeatRef(options: {\n readonly ref: ScenarioSeatRef;\n readonly playerIds: readonly string[];\n readonly path: string;\n}): string {\n if (!isScenarioSeatRef(options.ref)) {\n throw new ScenarioCommandParamsError(\n options.path,\n \"expected a scenario seat reference\",\n );\n }\n const playerId = options.playerIds[options.ref.seat];\n if (playerId === undefined) {\n throw new ScenarioCommandParamsError(\n `${options.path}.seat`,\n `seat ${options.ref.seat} is out of range for ${options.playerIds.length} player(s)`,\n );\n }\n return playerId;\n}\n\nexport function resolveScenarioCommandParams<\n Contract extends ReducerGameContractLike,\n>(options: {\n readonly game: AnyReducerGameDefinition<Contract>;\n readonly phase: string;\n readonly interactionId: string;\n readonly params: unknown;\n readonly playerIds: readonly string[];\n readonly path: string;\n readonly currentSchema?: z.ZodTypeAny | null;\n}): Record<string, unknown> {\n const candidateSchemas = authorParamSchemaCandidates(options);\n let firstSeatError: ScenarioSchemaValueError | undefined;\n let firstIssue:\n { readonly path: PropertyKey[]; readonly message: string } | undefined;\n for (const schema of candidateSchemas) {\n try {\n const resolved = resolveScenarioSeatReferences({\n schema,\n value: options.params,\n playerIds: options.playerIds,\n path: `${options.path}.params`,\n });\n const parsed = schema.safeParse(resolved);\n if (parsed.success) {\n return resolved as Record<string, unknown>;\n }\n firstIssue ??= parsed.error.issues[0];\n } catch (error) {\n if (error instanceof ScenarioSchemaValueError) {\n firstSeatError ??= error;\n continue;\n }\n throw error;\n }\n }\n\n if (firstSeatError) {\n throw new ScenarioCommandParamsError(\n firstSeatError.path,\n firstSeatError.message,\n );\n }\n const suffix =\n firstIssue?.path\n .map((part) =>\n typeof part === \"number\" ? `[${part}]` : `.${String(part)}`,\n )\n .join(\"\") ?? \"\";\n throw new ScenarioCommandParamsError(\n `${options.path}.params${suffix}`,\n firstIssue?.message ?? \"invalid interaction parameters\",\n );\n}\n\n/** Convert runtime command params into the semantic, pasteable scenario form. */\nexport function projectScenarioCommandParams<\n Contract extends ReducerGameContractLike,\n>(options: {\n readonly game: AnyReducerGameDefinition<Contract>;\n readonly phase: string;\n readonly interactionId: string;\n readonly params: unknown;\n readonly playerIds: readonly string[];\n readonly path: string;\n readonly currentSchema?: z.ZodTypeAny | null;\n}): Record<string, unknown> {\n const candidateSchemas = authorParamSchemaCandidates(options);\n let firstSeatError: ScenarioSchemaValueError | undefined;\n for (const schema of candidateSchemas) {\n if (!schema.safeParse(options.params).success) continue;\n try {\n const projected = projectScenarioSeatReferences({\n schema,\n value: options.params,\n playerIds: options.playerIds,\n path: `${options.path}.params`,\n });\n if (isPlainRecord(projected)) return projected;\n } catch (error) {\n if (error instanceof ScenarioSchemaValueError) {\n firstSeatError ??= error;\n continue;\n }\n throw error;\n }\n }\n if (firstSeatError) {\n throw new ScenarioCommandParamsError(\n firstSeatError.path,\n firstSeatError.message,\n );\n }\n throw new ScenarioCommandParamsError(\n `${options.path}.params`,\n \"runtime interaction parameters do not match an authoring parameter schema\",\n );\n}\n\nfunction authorParamSchemaCandidates<\n Contract extends ReducerGameContractLike,\n>(options: {\n readonly game: AnyReducerGameDefinition<Contract>;\n readonly phase: string;\n readonly interactionId: string;\n readonly path: string;\n readonly currentSchema?: z.ZodTypeAny | null;\n}): z.ZodTypeAny[] {\n if (options.currentSchema) return [options.currentSchema];\n const schemas = createAuthorParamSchemasByPhase(options.game);\n const currentPhaseSchema = schemas[options.phase]?.[options.interactionId] as\n z.ZodTypeAny | undefined;\n const candidateSchemas = [\n ...(currentPhaseSchema ? [currentPhaseSchema] : []),\n ...Object.entries(schemas).flatMap(([phase, schemasForPhase]) => {\n if (phase === options.phase) return [];\n const schema = schemasForPhase[options.interactionId] as\n z.ZodTypeAny | undefined;\n return schema ? [schema] : [];\n }),\n ];\n if (candidateSchemas.length === 0) {\n throw new ScenarioCommandParamsError(\n `${options.path}.interactionId`,\n `interaction '${options.interactionId}' has no authoring parameter schema`,\n );\n }\n return candidateSchemas;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n","import type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../reducer/model.js\";\nimport type { ReducerBundleContract } from \"../shared/worker-contract.js\";\nimport { resolvePlayerRoster } from \"./player-roster.js\";\nimport type { z } from \"zod\";\nimport { RuntimeJsonSchema, type RuntimeJson } from \"../shared/runtime-json.js\";\nimport type * as Wire from \"../shared/runtime-types.js\";\nimport { digestPluginRuntimeJson } from \"../shared/protocol/digest.js\";\nimport { createReducerTestingRuntime } from \"./reducer-runtime.js\";\nimport type {\n InteractionActionabilityResult,\n InteractionInputEnumerationResult,\n} from \"../reducer/bundle/trusted/interaction-types.js\";\nimport type {\n DispatchTraceSummaryEntry,\n ReducerDiagnosticEvent,\n} from \"../reducer/diagnostics.js\";\nimport { createExpectApi } from \"./create-expect-api.js\";\nimport { scenarioAssertionFailure } from \"./scenario-assertion-error.js\";\nimport {\n ScenarioDefinitionValidationError,\n ScenarioReplayError,\n type AssertScenarioOptions,\n type InteractionDescriptorLike,\n type InteractionExplanationLike,\n type ReplayScenarioOptions,\n type RejectionExpectation,\n type ScenarioAssertionContext,\n type ScenarioCheckpoint,\n type ScenarioCommandOf,\n type ScenarioCommandTraceEntry,\n type ScenarioDiagnostics,\n type ScenarioProbeResult,\n type ScenarioReplay,\n type ScenarioReplayDefinition,\n type ScenarioReplaySegment,\n type ScenarioSeatRef,\n} from \"./definitions.js\";\nimport { validateScenarioDefinition } from \"./scenario-definition-validation.js\";\nimport {\n resolveScenarioCommandParams,\n resolveScenarioSeatRef,\n} from \"./scenario-player-refs.js\";\n\ntype ScenarioBundle = ReturnType<typeof createReducerTestingRuntime>;\n\ntype ScenarioRuntimeOperations = {\n readonly createBundle: (events: ReducerDiagnosticEvent[]) => ScenarioBundle;\n readonly resolveCommandParams: (\n options: Omit<Parameters<typeof resolveScenarioCommandParams>[0], \"game\">,\n ) => Record<string, unknown>;\n};\n\ntype ScenarioReplayState<Game> = ScenarioRuntimeOperations & {\n readonly game: Game;\n readonly scenario: ScenarioReplayDefinition<Game>;\n readonly playerIds: readonly string[];\n readonly reducerState: Wire.ReducerSessionState;\n readonly terminal: Wire.GameOutcome | null;\n readonly checkpoint: ScenarioCheckpoint;\n readonly trace: readonly ScenarioCommandTraceEntry<Game>[];\n readonly events: readonly ReducerDiagnosticEvent[];\n};\n\nexport type ScenarioReplayPerspective =\n | { readonly kind: \"player\"; readonly seat: number }\n | { readonly kind: \"spectator\" };\n\nexport type ScenarioReplayInspectionAuthority<Game> = {\n readonly game: Game;\n readonly scenario: ScenarioReplayDefinition<Game>;\n readonly playerIds: readonly string[];\n readonly checkpoint: ScenarioCheckpoint;\n readonly checkpointDigest: string;\n readonly publicState: unknown;\n readonly view: unknown;\n readonly scheduler: {\n readonly phase: string;\n readonly step: string | null;\n readonly activePlayerIds: readonly string[];\n readonly pendingPlayerIds: readonly string[];\n readonly continuationDependencies: readonly {\n readonly waiterPlayerId: string;\n readonly blockerPlayerIds: readonly string[];\n }[];\n };\n readonly interactions: readonly {\n readonly descriptor: InteractionDescriptorLike;\n readonly explanation: InteractionExplanationLike;\n readonly actionability: InteractionActionabilityResult;\n }[];\n readonly entropy: {\n readonly seed: number | null;\n readonly draws: readonly Wire.RngDraw[];\n };\n readonly commandTrace: readonly ScenarioCommandTraceEntry<Game>[];\n};\n\nexport type ScenarioReplayAdvanceResult<Game> =\n | {\n readonly kind: \"accepted\";\n readonly replay: ScenarioReplay<Game>;\n readonly trace: readonly DispatchTraceSummaryEntry[];\n }\n | {\n readonly kind: \"rejected\";\n readonly errorCode: string;\n readonly message?: string;\n readonly trace: readonly DispatchTraceSummaryEntry[];\n };\n\nexport async function replayScenario<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(\n options: ReplayScenarioOptions<Game> & {\n readonly game: { readonly contract: Contract };\n },\n): Promise<ScenarioReplay<Game>> {\n validateReplayDefinition(options.game, options.scenario);\n const scenario = cloneReplayDefinition(options.scenario);\n const checkpoint = normalizeCheckpoint(scenario, options.at);\n const playerIds = resolvePlayerRoster(options.game, scenario.setup.players);\n const events: ReducerDiagnosticEvent[] = [];\n const operations: ScenarioRuntimeOperations = {\n createBundle: (events) =>\n createScenarioBundle(options.game, events, options.bundle),\n resolveCommandParams: (params) =>\n resolveScenarioCommandParams({ ...params, game: options.game }),\n };\n const bundle = operations.createBundle(events);\n const normalSetup = options.game.contract.manifest.normalSetup;\n const table = normalSetup.createInitialTable({ playerIds });\n const initialized = await bundle.initialize({\n table: RuntimeJsonSchema.parse(table),\n playerIds: [...playerIds],\n rngSeed: scenario.setup.seed,\n options: scenario.setup.options,\n });\n\n const runtime = new ScenarioReplayImplementation<Game>({\n ...operations,\n game: options.game,\n scenario,\n playerIds,\n reducerState: initialized.state,\n terminal: initialized.terminal ?? null,\n checkpoint: { segment: \"setup\", completed: 0 },\n trace: [],\n events,\n });\n await runtime.replayTo(checkpoint);\n return runtime;\n}\n\nexport type ScenarioRuntimeCheckpointMaterialization = {\n readonly checkpoint: ScenarioCheckpoint;\n readonly checkpointDigest: string;\n readonly playerIds: readonly string[];\n readonly state: Wire.ReducerSessionState;\n readonly terminal: Wire.GameOutcome | null;\n};\n\n/**\n * Trusted tool-side materialization for CLI, Workbench, and backend adapters.\n * The returned reducer snapshot must never cross a player/browser boundary.\n */\nexport async function materializeScenarioRuntimeCheckpoint<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(\n options: ReplayScenarioOptions<Game> & {\n readonly game: { readonly contract: Contract };\n },\n): Promise<ScenarioRuntimeCheckpointMaterialization> {\n const replay = requireScenarioReplayImplementation(\n await replayScenario(options),\n );\n return {\n checkpoint: structuredClone(replay.checkpoint),\n checkpointDigest: replay.checkpointDigest,\n playerIds: [...replay.playerIds],\n state: structuredClone(replay.reducerState),\n terminal: structuredClone(replay.terminal),\n };\n}\n\nfunction cloneReplayDefinition<Game>(\n scenario: ScenarioReplayDefinition<Game>,\n): ScenarioReplayDefinition<Game> {\n return structuredClone({\n id: scenario.id,\n ...(scenario.description === undefined\n ? {}\n : { description: scenario.description }),\n setup: scenario.setup,\n given: scenario.given,\n when: scenario.when,\n });\n}\n\nexport async function assertScenario<Game>(\n options: AssertScenarioOptions<Game>,\n): Promise<void> {\n const replay = requireScenarioReplayImplementation(options.replay);\n if (!replay.complete) {\n throw new Error(\n `Scenario '${replay.scenarioId}' assertions require a full replay; checkpoint is ${replay.checkpoint.segment}:${replay.checkpoint.completed}.`,\n );\n }\n const context: ScenarioAssertionContext<Game> = {\n expect: createExpectApi({\n lastDiagnosticRejection: () => lastRejectedEvent(replay.diagnostics),\n }),\n state: replay.state,\n view: replay.view,\n interactions: replay.interactions,\n explain: replay.explain,\n get diagnostics() {\n return replay.diagnostics;\n },\n probe: (command) => replay.probe(command),\n };\n await options.assertion(context);\n}\n\nexport async function probeScenarioCommand<Game>(options: {\n readonly replay: ScenarioReplay<Game>;\n readonly command: ScenarioCommandOf<Game>;\n}): Promise<ScenarioProbeResult<Game>> {\n return requireScenarioReplayImplementation(options.replay).probe(\n options.command,\n );\n}\n\nclass ScenarioReplayImplementation<Game> implements ScenarioReplay<Game> {\n private readonly authoritySessionId = crypto.randomUUID();\n private authorityVersion = 1;\n private referenceBasis() {\n return {\n sessionId: this.authoritySessionId,\n version: this.authorityVersion,\n };\n }\n readonly operations: ScenarioRuntimeOperations;\n readonly scenarioId: string;\n readonly scenario: ScenarioReplayDefinition<Game>;\n readonly game: Game;\n readonly playerIds: readonly string[];\n readonly bundle: ScenarioBundle;\n readonly events: ReducerDiagnosticEvent[];\n checkpoint: ScenarioCheckpoint;\n reducerState: Wire.ReducerSessionState;\n terminal: Wire.GameOutcome | null;\n trace: ScenarioCommandTraceEntry<Game>[];\n\n constructor(state: ScenarioReplayState<Game>) {\n this.scenarioId = state.scenario.id;\n this.scenario = state.scenario;\n this.game = state.game;\n this.playerIds = [...state.playerIds];\n this.reducerState = structuredClone(state.reducerState);\n this.terminal = structuredClone(state.terminal);\n this.checkpoint = structuredClone(state.checkpoint);\n this.trace = structuredClone(\n state.trace,\n ) as ScenarioCommandTraceEntry<Game>[];\n this.events = structuredClone(state.events) as ReducerDiagnosticEvent[];\n this.operations = {\n createBundle: state.createBundle,\n resolveCommandParams: state.resolveCommandParams,\n };\n this.bundle = this.operations.createBundle(this.events);\n\n this.state = this.state.bind(this);\n this.view = this.view.bind(this);\n this.interactions = this.interactions.bind(this);\n this.explain = this.explain.bind(this);\n }\n\n get checkpointDigest(): string {\n return digestPluginRuntimeJson({\n digestVersion: \"scenario-checkpoint@1\",\n scenarioId: this.scenarioId,\n checkpoint: this.checkpoint,\n reducerState: this.reducerState,\n terminal: this.terminal,\n trace: this.trace,\n });\n }\n\n get complete(): boolean {\n return (\n this.checkpoint.segment === \"when\" &&\n this.checkpoint.completed === this.scenario.when.length\n );\n }\n\n get diagnostics(): ScenarioDiagnostics {\n const flow = readFlowState(this.reducerState);\n return {\n events: structuredClone(this.events),\n lastDispatch: lastAcceptedDispatch(this.events),\n flow: {\n currentPhase: flow.currentPhase,\n activeSeats: flow.activePlayers.flatMap((playerId) => {\n const seat = this.playerIds.indexOf(playerId);\n return seat < 0 ? [] : [{ seat }];\n }),\n },\n };\n }\n\n state(): ReturnType<ScenarioReplay<Game>[\"state\"]> {\n // The bound runtime decoded this state with Game's schemas. Reconstruct\n // the public readonly projection at this single replay facade boundary.\n return structuredClone(this.reducerState.domain) as ReturnType<\n ScenarioReplay<Game>[\"state\"]\n >;\n }\n\n view(seat: ScenarioSeatRef): ReturnType<ScenarioReplay<Game>[\"view\"]> {\n const playerId = this.playerId(seat, \"seat\");\n const projection = this.project(playerId);\n // This projection was produced by the view callback bound to the same Game.\n return structuredClone(\n projection.seats?.[playerId]?.view ?? null,\n ) as ReturnType<ScenarioReplay<Game>[\"view\"]>;\n }\n\n interactions(seat: ScenarioSeatRef): readonly InteractionDescriptorLike[] {\n const playerId = this.playerId(seat, \"seat\");\n const projection = this.project(playerId);\n const refs =\n (projection.seats?.[playerId]?.availableInteractionRefs as\n readonly string[] | undefined) ?? [];\n const interactionsByRef =\n (projection.interactionsByRef as\n Readonly<Record<string, InteractionDescriptorLike>> | undefined) ?? {};\n return structuredClone(\n refs.flatMap((ref) => {\n const descriptor = interactionsByRef[ref];\n return descriptor ? [descriptor] : [];\n }),\n );\n }\n\n explain(\n seat: ScenarioSeatRef,\n interactionId: string,\n ): InteractionExplanationLike {\n return structuredClone(\n this.bundle.explainInteraction({\n referenceBasis: this.referenceBasis(),\n state: this.reducerState,\n playerId: this.playerId(seat, \"seat\"),\n interactionId,\n }),\n );\n }\n\n clone(): ScenarioReplay<Game> {\n return new ScenarioReplayImplementation<Game>({\n ...this.operations,\n game: this.game,\n scenario: this.scenario,\n playerIds: this.playerIds,\n reducerState: this.reducerState,\n terminal: this.terminal,\n checkpoint: this.checkpoint,\n trace: this.trace,\n events: this.events,\n });\n }\n\n inspectionAuthority(\n perspective: ScenarioReplayPerspective,\n ): ScenarioReplayInspectionAuthority<Game> {\n const selectedPlayerId =\n perspective.kind === \"player\"\n ? this.playerId({ seat: perspective.seat }, \"perspective.seat\")\n : null;\n const projection = this.bundle.project({\n state: this.reducerState,\n referenceBasis: this.referenceBasis(),\n playerIds: selectedPlayerId ? [selectedPlayerId] : [],\n });\n const descriptors = selectedPlayerId\n ? descriptorsForPlayer(projection, selectedPlayerId)\n : [];\n const flow = readFlowState(this.reducerState);\n return {\n game: this.game,\n scenario: structuredClone(this.scenario),\n playerIds: [...this.playerIds],\n checkpoint: structuredClone(this.checkpoint),\n checkpointDigest: this.checkpointDigest,\n publicState: structuredClone(this.reducerState.domain.publicState),\n view: structuredClone(\n selectedPlayerId\n ? (projection.seats[selectedPlayerId]?.view ?? null)\n : null,\n ),\n scheduler: {\n phase: flow.currentPhase ?? \"\",\n step: readPhaseStep(this.reducerState.domain.phase),\n activePlayerIds: [...(projection.schedulerFlow?.activePlayerIds ?? [])],\n pendingPlayerIds: [\n ...(projection.schedulerFlow?.pendingPlayerIds ??\n projection.simultaneousPhase?.pendingPlayerIds ??\n []),\n ],\n continuationDependencies: structuredClone(\n projection.schedulerFlow?.continuationDependencies ?? [],\n ),\n },\n interactions: descriptors.map((descriptor) => ({\n descriptor: structuredClone(descriptor),\n explanation: structuredClone(\n this.bundle.explainInteraction({\n referenceBasis: this.referenceBasis(),\n state: this.reducerState,\n playerId: selectedPlayerId!,\n interactionId: String(descriptor.interactionId ?? \"\"),\n }),\n ),\n actionability: structuredClone(\n this.bundle.resolveInteractionActionability({\n referenceBasis: this.referenceBasis(),\n state: this.reducerState,\n playerId: selectedPlayerId!,\n interactionId: String(descriptor.interactionId ?? \"\"),\n }),\n ),\n })),\n entropy: {\n seed: this.reducerState.runtime.rng.seed,\n draws: structuredClone(this.reducerState.runtime.rng.draws ?? []),\n },\n commandTrace: structuredClone(this.trace),\n };\n }\n\n currentAuthorParamSchema(seat: number, interactionId: string) {\n return this.bundle.currentAuthorParamSchema({\n referenceBasis: this.referenceBasis(),\n state: this.reducerState,\n playerId: this.playerId({ seat }, \"actor\"),\n interactionId,\n }) as z.ZodTypeAny | null;\n }\n\n currentClientParamSchema(seat: number, interactionId: string) {\n return this.bundle.currentClientParamSchema({\n referenceBasis: this.referenceBasis(),\n state: this.reducerState,\n playerId: this.playerId({ seat }, \"actor\"),\n interactionId,\n }) as z.ZodTypeAny | null;\n }\n\n enumerateInteractionParams(options: {\n readonly seat: number;\n readonly interactionId: string;\n readonly maxEvaluations: number;\n }): InteractionInputEnumerationResult {\n return structuredClone(\n this.bundle.enumerateInteractionParams({\n referenceBasis: this.referenceBasis(),\n state: this.reducerState,\n playerId: this.playerId({ seat: options.seat }, \"perspective.seat\"),\n interactionId: options.interactionId,\n maxEvaluations: options.maxEvaluations,\n }),\n );\n }\n\n async advance(\n command: ScenarioCommandOf<Game>,\n ): Promise<ScenarioReplayAdvanceResult<Game>> {\n const clone = new ScenarioReplayImplementation<Game>({\n ...this.operations,\n game: this.game,\n scenario: this.scenario,\n playerIds: this.playerIds,\n reducerState: this.reducerState,\n terminal: this.terminal,\n checkpoint: this.checkpoint,\n trace: this.trace,\n events: this.events,\n });\n const result = await clone.dispatch(command, \"probe\", 0);\n if (result.kind === \"accept\") {\n clone.trace.push({\n segment: this.checkpoint.segment === \"when\" ? \"when\" : \"given\",\n index: this.checkpoint.completed,\n command: structuredClone(command),\n trace: structuredClone(result.trace),\n });\n return {\n kind: \"accepted\",\n replay: clone,\n trace: structuredClone(result.trace),\n };\n }\n return {\n kind: \"rejected\",\n errorCode: result.errorCode,\n ...(result.message === undefined ? {} : { message: result.message }),\n trace: structuredClone(result.trace),\n };\n }\n\n async replayTo(target: ScenarioCheckpoint): Promise<void> {\n const givenCount =\n target.segment === \"setup\"\n ? 0\n : target.segment === \"given\"\n ? target.completed\n : this.scenario.given.length;\n const whenCount = target.segment === \"when\" ? target.completed : 0;\n for (let index = 0; index < givenCount; index += 1) {\n await this.dispatchRequired(\"given\", index, this.scenario.given[index]);\n }\n this.checkpoint = { segment: \"given\", completed: givenCount };\n for (let index = 0; index < whenCount; index += 1) {\n await this.dispatchRequired(\"when\", index, this.scenario.when[index]);\n }\n this.checkpoint = structuredClone(target);\n }\n\n async probe(\n command: ScenarioCommandOf<Game>,\n ): Promise<ScenarioProbeResult<Game>> {\n const clone = requireScenarioReplayImplementation(this.clone());\n const result = await clone.dispatch(command, \"probe\", 0);\n if (result.kind === \"accept\") {\n const accepted = {\n kind: \"accepted\" as const,\n command,\n checkpointDigest: digestPluginRuntimeJson({\n digestVersion: \"scenario-probe@1\",\n from: this.checkpointDigest,\n command,\n reducerState: clone.reducerState,\n trace: result.trace,\n }),\n trace: result.trace,\n toBeAccepted() {},\n toRejectWith(expected: RejectionExpectation): never {\n scenarioAssertionFailure(\n `Expected probe to reject${expected.errorCode ? ` with ${expected.errorCode}` : \"\"}, but it was accepted.`,\n );\n },\n } satisfies ScenarioProbeResult<Game>;\n return accepted;\n }\n const rejected = {\n kind: \"rejected\" as const,\n command,\n errorCode: result.errorCode,\n ...(result.message === undefined ? {} : { message: result.message }),\n trace: result.trace,\n toBeAccepted(): never {\n scenarioAssertionFailure(\n `Expected probe to be accepted, but it rejected with ${result.errorCode}.`,\n );\n },\n toRejectWith(expected: RejectionExpectation): void {\n assertRejectionMatches(result, expected);\n },\n } satisfies ScenarioProbeResult<Game>;\n return rejected;\n }\n\n private async dispatchRequired(\n segment: ScenarioReplaySegment,\n index: number,\n command: ScenarioCommandOf<Game>,\n ): Promise<void> {\n const result = await this.dispatch(command, segment, index);\n if (result.kind === \"reject\") {\n throw new ScenarioReplayError({\n scenarioId: this.scenarioId,\n segment,\n index,\n interactionId: command.interactionId,\n errorCode: result.errorCode,\n reducerMessage: result.message,\n trace: result.trace,\n });\n }\n this.trace.push({\n segment,\n index,\n command: structuredClone(command),\n trace: result.trace,\n });\n }\n\n private async dispatch(\n command: ScenarioCommandOf<Game>,\n segment: ScenarioReplaySegment | \"probe\",\n index: number,\n ): Promise<\n | { readonly kind: \"accept\"; readonly trace: DispatchTraceSummaryEntry[] }\n | {\n readonly kind: \"reject\";\n readonly errorCode: string;\n readonly message?: string;\n readonly trace: DispatchTraceSummaryEntry[];\n }\n > {\n if (this.terminal)\n return { kind: \"reject\", errorCode: \"game-ended\", trace: [] };\n const phase = readFlowState(this.reducerState).currentPhase ?? \"\";\n const playerId = resolveScenarioSeatRef({\n ref: command.actor,\n playerIds: this.playerIds,\n path: `scenario.${segment}[${index}].actor`,\n });\n const params = this.operations.resolveCommandParams({\n currentSchema: this.currentAuthorParamSchema(\n command.actor.seat,\n command.interactionId,\n ),\n phase,\n interactionId: command.interactionId,\n params: command.params,\n playerIds: this.playerIds,\n path: `scenario.${segment}[${index}]`,\n });\n const result = await this.bundle.dispatch({\n state: this.reducerState,\n referenceBasis: this.referenceBasis(),\n input: {\n kind: \"interaction\",\n basis: {\n ...this.referenceBasis(),\n perspectivePlayerId: playerId,\n actionSetVersion: \"scenario\",\n },\n playerId,\n interactionId: command.interactionId,\n params: params as RuntimeJson,\n },\n });\n if (result.kind === \"reject\") {\n return {\n kind: \"reject\",\n errorCode: result.errorCode,\n ...(result.message === undefined ? {} : { message: result.message }),\n trace: [],\n };\n }\n this.reducerState = structuredClone(result.state);\n this.authorityVersion++;\n this.terminal = result.terminal ?? null;\n return {\n kind: \"accept\",\n trace: summarizeWireTrace(result.trace),\n };\n }\n\n private playerId(seat: ScenarioSeatRef, path: string): string {\n return resolveScenarioSeatRef({\n ref: seat,\n playerIds: this.playerIds,\n path,\n });\n }\n\n private project(playerId: string): Wire.SeatProjectionBundle {\n return this.bundle.project({\n state: this.reducerState,\n referenceBasis: this.referenceBasis(),\n playerIds: [playerId],\n });\n }\n}\n\nexport function inspectScenarioReplayAuthority<Game>(options: {\n readonly replay: ScenarioReplay<Game>;\n readonly perspective: ScenarioReplayPerspective;\n}): ScenarioReplayInspectionAuthority<Game> {\n return requireScenarioReplayImplementation(\n options.replay,\n ).inspectionAuthority(options.perspective);\n}\n\nexport function currentScenarioClientParamSchema<Game>(\n replay: ScenarioReplay<Game>,\n seat: number,\n interactionId: string,\n) {\n return requireScenarioReplayImplementation(replay).currentClientParamSchema(\n seat,\n interactionId,\n );\n}\n\nexport function enumerateScenarioInteractionParams<Game>(options: {\n readonly replay: ScenarioReplay<Game>;\n readonly seat: number;\n readonly interactionId: string;\n readonly maxEvaluations: number;\n}): InteractionInputEnumerationResult {\n return requireScenarioReplayImplementation(\n options.replay,\n ).enumerateInteractionParams(options);\n}\n\nexport function advanceScenarioReplay<Game>(options: {\n readonly replay: ScenarioReplay<Game>;\n readonly command: ScenarioCommandOf<Game>;\n}): Promise<ScenarioReplayAdvanceResult<Game>> {\n return requireScenarioReplayImplementation(options.replay).advance(\n options.command,\n );\n}\n\nfunction descriptorsForPlayer(\n projection: Wire.SeatProjectionBundle,\n playerId: string,\n): InteractionDescriptorLike[] {\n const refs =\n (projection.seats[playerId]?.availableInteractionRefs as\n readonly string[] | undefined) ?? [];\n const interactionsByRef =\n (projection.interactionsByRef as\n Readonly<Record<string, InteractionDescriptorLike>> | undefined) ?? {};\n return refs.flatMap((ref) => {\n const descriptor = interactionsByRef[ref];\n return descriptor ? [descriptor] : [];\n });\n}\n\nfunction createScenarioBundle<Contract extends ReducerGameContractLike>(\n game: AnyReducerGameDefinition<Contract>,\n events: ReducerDiagnosticEvent[],\n bundle?: ReducerBundleContract,\n): ScenarioBundle {\n return createReducerTestingRuntime(\n game,\n {\n diagnostics: {\n event(event) {\n events.push(structuredClone(event));\n },\n },\n },\n bundle,\n );\n}\n\nfunction validateReplayDefinition<\n Contract extends ReducerGameContractLike,\n Game,\n>(\n game: AnyReducerGameDefinition<Contract>,\n replay: ScenarioReplayDefinition<Game>,\n): void {\n validateScenarioDefinition(game, {\n ...replay,\n then: () => undefined,\n });\n}\n\nfunction normalizeCheckpoint<Game>(\n scenario: ScenarioReplayDefinition<Game>,\n checkpoint: ScenarioCheckpoint | undefined,\n): ScenarioCheckpoint {\n if (checkpoint === undefined) {\n return { segment: \"when\", completed: scenario.when.length };\n }\n const maximum =\n checkpoint.segment === \"setup\"\n ? 0\n : checkpoint.segment === \"given\"\n ? scenario.given.length\n : scenario.when.length;\n if (\n !Number.isSafeInteger(checkpoint.completed) ||\n checkpoint.completed < 0 ||\n checkpoint.completed > maximum ||\n (checkpoint.segment === \"setup\" && checkpoint.completed !== 0)\n ) {\n throw new ScenarioDefinitionValidationError({\n code: \"OUT_OF_RANGE\",\n path: \"at.completed\",\n reason: `expected 0 through ${maximum} for ${checkpoint.segment}`,\n });\n }\n return structuredClone(checkpoint);\n}\n\nfunction readFlowState(state: Wire.ReducerSessionState): {\n readonly currentPhase: string | null;\n readonly activePlayers: readonly string[];\n} {\n const flow = (state.domain as { flow?: unknown } | undefined)?.flow;\n if (typeof flow !== \"object\" || flow === null) {\n return { currentPhase: null, activePlayers: [] };\n }\n const record = flow as {\n readonly currentPhase?: unknown;\n readonly activePlayers?: unknown;\n };\n return {\n currentPhase:\n typeof record.currentPhase === \"string\" ? record.currentPhase : null,\n activePlayers: Array.isArray(record.activePlayers)\n ? record.activePlayers.filter(\n (playerId): playerId is string => typeof playerId === \"string\",\n )\n : [],\n };\n}\n\nfunction readPhaseStep(phase: unknown): string | null {\n if (!phase || typeof phase !== \"object\") return null;\n const step = (phase as { readonly step?: unknown }).step;\n return typeof step === \"string\" ? step : null;\n}\n\nfunction summarizeWireTrace(\n trace: readonly Wire.DispatchTrace[],\n): DispatchTraceSummaryEntry[] {\n return trace.flatMap((entry): DispatchTraceSummaryEntry[] => {\n switch (entry.kind) {\n case \"acceptedClientInput\":\n return [\n {\n kind: \"acceptedClientInput\",\n interactionId: entry.input.interactionId,\n playerId: entry.input.playerId,\n },\n ];\n case \"phaseEntered\":\n return [{ kind: \"phaseEntered\", from: entry.from, to: entry.to }];\n case \"rngConsumption\":\n return [\n {\n kind: \"rngConsumption\",\n version: entry.version,\n operation: entry.operation,\n drawIndex: entry.drawIndex,\n },\n ];\n }\n });\n}\n\nfunction lastAcceptedDispatch(\n events: readonly ReducerDiagnosticEvent[],\n): ScenarioDiagnostics[\"lastDispatch\"] {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event?.type === \"submitAccepted\") {\n return {\n submissionId: event.submissionId,\n trace: structuredClone(event.trace),\n };\n }\n }\n return null;\n}\n\nfunction lastRejectedEvent(\n diagnostics: ScenarioDiagnostics,\n): Extract<ReducerDiagnosticEvent, { type: \"submitRejected\" }> | null {\n for (let index = diagnostics.events.length - 1; index >= 0; index -= 1) {\n const event = diagnostics.events[index];\n if (event?.type === \"submitRejected\") return event;\n }\n return null;\n}\n\nfunction assertRejectionMatches(\n rejection: { readonly errorCode: string; readonly message?: string },\n expected: RejectionExpectation,\n): void {\n if (\n expected.errorCode !== undefined &&\n rejection.errorCode !== expected.errorCode\n ) {\n scenarioAssertionFailure(\n `Expected rejection errorCode '${expected.errorCode}', received '${rejection.errorCode}'.`,\n );\n }\n if (\n typeof expected.message === \"string\" &&\n rejection.message !== expected.message\n ) {\n scenarioAssertionFailure(\n `Expected rejection message '${expected.message}', received '${rejection.message ?? \"undefined\"}'.`,\n );\n }\n if (\n expected.message instanceof RegExp &&\n !expected.message.test(rejection.message ?? \"\")\n ) {\n scenarioAssertionFailure(\n `Expected rejection message '${rejection.message ?? \"\"}' to match ${String(expected.message)}.`,\n );\n }\n}\n\nfunction requireScenarioReplayImplementation<Game>(\n replay: ScenarioReplay<Game>,\n): ScenarioReplayImplementation<Game> {\n if (!(replay instanceof ScenarioReplayImplementation)) {\n throw new Error(\n \"Scenario replay was not created by replayScenario(); alternate replay implementations are not supported.\",\n );\n }\n return replay;\n}\n","import type { ActorRef, FlowDiagnostic } from \"./types.js\";\n\nexport type SchedulerFlowProjection = {\n readonly phase: string;\n readonly step: string | null;\n readonly activePlayerIds: readonly string[];\n readonly pendingPlayerIds: readonly string[];\n /**\n * Causal continuation ownership supplied by trusted scheduler authority.\n * An empty list means the scheduler has proved no edge or cannot prove one;\n * callers must never infer an edge from inactive turns or descriptor prose.\n */\n readonly continuationDependencies?: readonly {\n readonly waiterPlayerId: string;\n readonly blockerPlayerIds: readonly string[];\n }[];\n};\n\nexport function createFlowDiagnostic(options: {\n readonly scheduler: SchedulerFlowProjection;\n readonly playerIds: readonly string[];\n}): FlowDiagnostic {\n const actor = (playerId: string): ActorRef | null => {\n const seat = options.playerIds.indexOf(playerId);\n return seat < 0 ? null : { seat, playerId };\n };\n const actors = (playerIds: readonly string[]): ActorRef[] =>\n [...new Set(playerIds)]\n .flatMap((playerId) => {\n const resolved = actor(playerId);\n return resolved ? [resolved] : [];\n })\n .sort((left, right) => left.seat - right.seat);\n\n const blockedBy = (options.scheduler.continuationDependencies ?? [])\n .flatMap((dependency) => {\n const waiter = actor(dependency.waiterPlayerId);\n const blockers = actors(dependency.blockerPlayerIds);\n return waiter && blockers.length > 0\n ? [\n {\n actor: waiter,\n blockers,\n source: \"scheduler\" as const,\n },\n ]\n : [];\n })\n .sort((left, right) => left.actor.seat - right.actor.seat);\n\n return {\n phase: options.scheduler.phase,\n step: options.scheduler.step,\n activeActors: actors(options.scheduler.activePlayerIds),\n pendingActors: actors(options.scheduler.pendingPlayerIds),\n continuationWaiters: actors(\n blockedBy.map((dependency) => dependency.actor.playerId),\n ),\n blockedBy,\n };\n}\n","import type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../../reducer/model.js\";\nimport type { InteractionDescriptorLike } from \"../definitions.js\";\nimport type {\n ScenarioCheckpoint,\n ScenarioCommandTraceEntry,\n ScenarioReplay,\n ScenarioReplayDefinition,\n} from \"../definitions.js\";\nimport {\n inspectScenarioReplayAuthority,\n replayScenario,\n} from \"../scenario-replay.js\";\nimport { createFlowDiagnostic } from \"./flow-diagnostic.js\";\nimport type {\n ActorRef,\n InspectAction,\n InspectInteraction,\n InspectNode,\n InspectScenarioResult,\n PerspectiveRef,\n PerspectiveSelector,\n ScenarioDispatchTraceEntry,\n ScenarioIdentity,\n Sha256Digest,\n} from \"./types.js\";\n\nexport class ScenarioInspectionError extends Error {\n readonly code:\n | \"TEST_PERSPECTIVE_INVALID\"\n | \"TEST_SCENARIO_INVALID\"\n | \"TEST_SEED_RANGE_INVALID\";\n readonly context: Readonly<Record<string, string | number | boolean>>;\n\n constructor(options: {\n readonly code: ScenarioInspectionError[\"code\"];\n readonly message: string;\n readonly context?: Readonly<Record<string, string | number | boolean>>;\n }) {\n super(options.message);\n this.name = \"ScenarioInspectionError\";\n this.code = options.code;\n this.context = options.context ?? {};\n }\n}\n\nexport type InspectScenarioOptions<Game> = {\n readonly game: Game;\n readonly scenario: ScenarioReplayDefinition<Game>;\n readonly identity: ScenarioIdentity;\n readonly perspective: PerspectiveSelector;\n readonly at?: ScenarioCheckpoint;\n readonly seed?: number;\n};\n\nexport async function inspectScenario<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(\n options: InspectScenarioOptions<Game> & {\n readonly game: { readonly contract: Contract };\n },\n): Promise<InspectScenarioResult> {\n assertScenarioIdentity(options.identity, options.scenario);\n assertSeed(options.seed);\n const selectedScenario =\n options.seed === undefined\n ? options.scenario\n : {\n ...options.scenario,\n setup: { ...options.scenario.setup, seed: options.seed },\n };\n const checkpoint =\n options.at ??\n ({\n segment: \"given\",\n completed: selectedScenario.given.length,\n } satisfies ScenarioCheckpoint);\n const replay = await replayScenario({\n game: options.game,\n scenario: selectedScenario,\n at: checkpoint,\n });\n const node = inspectScenarioReplayNode({\n replay,\n perspective: options.perspective,\n });\n return {\n schemaVersion: 1,\n scenario: structuredClone(options.identity),\n node,\n seedSource: options.seed === undefined ? \"scenario\" : \"override\",\n };\n}\n\nexport function inspectScenarioReplayNode<Game>(options: {\n readonly replay: ScenarioReplay<Game>;\n readonly perspective: PerspectiveSelector;\n}): InspectNode {\n const baseAuthority = inspectScenarioReplayAuthority({\n replay: options.replay,\n perspective: { kind: \"spectator\" },\n });\n const perspective = resolvePerspective(\n options.perspective,\n baseAuthority.playerIds,\n );\n const authority = inspectScenarioReplayAuthority({\n replay: options.replay,\n perspective:\n perspective.kind === \"spectator\"\n ? perspective\n : { kind: \"player\", seat: perspective.actor.seat },\n });\n const actor = perspective.kind === \"player\" ? perspective.actor : null;\n const interactions = actor\n ? authority.interactions.map(({ descriptor, explanation }) =>\n inspectInteraction(actor, descriptor, explanation),\n )\n : [];\n const actions = actor\n ? authority.interactions.flatMap(\n ({ explanation, actionability }): InspectAction[] => {\n if (\n !actionability.found ||\n !actionability.visible ||\n actionability.descriptor.availability.status !== \"available\" ||\n actionability.inputSatisfiability?.status !== \"yes\"\n ) {\n return [];\n }\n return [\n {\n actor,\n interactionId: actionability.descriptor.interactionId,\n inputs: explanation.inputs,\n explanation,\n hasConcreteCommand: true,\n },\n ];\n },\n )\n : [];\n const node: InspectNode = {\n checkpoint: authority.checkpoint,\n checkpointDigest: authority.checkpointDigest as Sha256Digest,\n setup: structuredClone(authority.scenario.setup),\n flow: createFlowDiagnostic({\n playerIds: authority.playerIds,\n scheduler: authority.scheduler,\n }),\n perspective,\n publicState: authority.publicState,\n view: authority.view,\n interactions,\n actions,\n entropy: {\n seed: authority.entropy.seed ?? authority.scenario.setup.seed,\n draws: structuredClone(authority.entropy.draws),\n },\n dispatchTrace: projectDispatchTrace(\n authority.commandTrace,\n authority.playerIds,\n perspective,\n ),\n };\n return node;\n}\n\nfunction resolvePerspective(\n selector: PerspectiveSelector,\n playerIds: readonly string[],\n): PerspectiveRef {\n if (selector.kind === \"spectator\") return { kind: \"spectator\" };\n const seat = selector.seat;\n if (!Number.isSafeInteger(seat) || seat < 0 || seat >= playerIds.length) {\n throw new ScenarioInspectionError({\n code: \"TEST_PERSPECTIVE_INVALID\",\n message: `Perspective seat ${String(seat)} is outside this ${playerIds.length}-player scenario.`,\n context: {\n requestedSeat: seat,\n minimumSeat: 0,\n maximumSeat: Math.max(0, playerIds.length - 1),\n },\n });\n }\n return {\n kind: \"player\",\n actor: {\n seat,\n playerId: playerIds[seat],\n },\n };\n}\n\nfunction inspectInteraction(\n actor: ActorRef,\n descriptor: InteractionDescriptorLike,\n explanation: InspectInteraction[\"explanation\"],\n): InspectInteraction {\n const availability = descriptor.availability ?? {\n status: \"blocked\" as const,\n reason: \"Interaction descriptor has no availability.\",\n };\n return {\n actor,\n interactionId: String(descriptor.interactionId ?? \"\"),\n availability: {\n status: availability.status,\n ...(\"code\" in availability && typeof availability.code === \"string\"\n ? { code: availability.code }\n : {}),\n ...(\"reason\" in availability && typeof availability.reason === \"string\"\n ? { reason: availability.reason }\n : {}),\n },\n inputs: explanation.inputs,\n explanation,\n };\n}\n\nfunction projectDispatchTrace<Game>(\n commandTrace: readonly ScenarioCommandTraceEntry<Game>[],\n playerIds: readonly string[],\n perspective: PerspectiveRef,\n): ScenarioDispatchTraceEntry[] {\n if (perspective.kind === \"spectator\") return [];\n const selectedSeat = perspective.actor.seat;\n return commandTrace.flatMap((entry): ScenarioDispatchTraceEntry[] => {\n if (entry.command.actor.seat !== selectedSeat) return [];\n return entry.trace.flatMap((trace): ScenarioDispatchTraceEntry[] => {\n switch (trace.kind) {\n case \"acceptedClientInput\": {\n const seat = playerIds.indexOf(trace.playerId);\n return seat < 0\n ? []\n : [\n {\n kind: \"acceptedCommand\",\n actor: { seat, playerId: trace.playerId },\n interactionId: trace.interactionId,\n },\n ];\n }\n case \"phaseEntered\":\n return [\n {\n kind: \"phaseEntered\",\n from: trace.from,\n to: trace.to,\n },\n ];\n case \"rngConsumption\":\n return [{ kind: \"entropyDraw\", drawIndex: trace.drawIndex }];\n }\n });\n });\n}\n\nfunction assertScenarioIdentity<Game>(\n identity: ScenarioIdentity,\n scenario: ScenarioReplayDefinition<Game>,\n): void {\n if (identity.id !== scenario.id) {\n throw new ScenarioInspectionError({\n code: \"TEST_SCENARIO_INVALID\",\n message: \"Scenario identity does not match the authored default export.\",\n context: { identityId: identity.id, scenarioId: scenario.id },\n });\n }\n}\n\nfunction assertSeed(seed: number | undefined): void {\n if (seed !== undefined && !Number.isSafeInteger(seed)) {\n throw new ScenarioInspectionError({\n code: \"TEST_SEED_RANGE_INVALID\",\n message: \"Seed override must be a safe integer.\",\n context: { requestedSeed: seed },\n });\n }\n}\n","import {\n digestPluginRuntimeJson,\n encodeCanonicalPluginRuntimeJson,\n} from \"../shared/protocol/digest.js\";\nimport type { Sha256Digest } from \"./inspection/types.js\";\n\nexport function canonicalScenarioJson(value: unknown): string {\n return encodeCanonicalPluginRuntimeJson(value);\n}\n\nexport function digestScenarioJson(value: unknown): Sha256Digest {\n return digestPluginRuntimeJson(value) as Sha256Digest;\n}\n\nexport function compareCanonicalScenarioJson(\n left: unknown,\n right: unknown,\n): number {\n const leftJson = canonicalScenarioJson(left);\n const rightJson = canonicalScenarioJson(right);\n return leftJson === rightJson ? 0 : leftJson < rightJson ? -1 : 1;\n}\n","import * as z from \"zod\";\nimport { digestPluginRuntimeJson } from \"../../shared/protocol/digest.js\";\nimport type {\n PerspectiveRef,\n ScenarioIdentity,\n Sha256Digest,\n} from \"../inspection/types.js\";\n\nconst CURSOR_VERSION = 1;\n\nconst cursorPayloadSchema = z.strictObject({\n version: z.literal(CURSOR_VERSION),\n scenarioSourceDigest: z.templateLiteral([\"sha256:\", z.string()]),\n checkpointDigest: z.templateLiteral([\"sha256:\", z.string()]),\n perspective: z.discriminatedUnion(\"kind\", [\n z.strictObject({\n kind: z.literal(\"player\"),\n actor: z.strictObject({\n seat: z.number().int().nonnegative(),\n playerId: z.string(),\n }),\n }),\n z.strictObject({ kind: z.literal(\"spectator\") }),\n ]),\n seedOverride: z.number().nullable(),\n nextOrdinal: z.number().int().nonnegative(),\n});\n\ntype CursorPayload = z.infer<typeof cursorPayloadSchema>;\n\nexport class ExploreCursorError extends Error {\n readonly code = \"TEST_EXPLORE_CURSOR_STALE\";\n readonly scenarioSourceDigest: Sha256Digest;\n readonly checkpointDigest: Sha256Digest;\n\n constructor(options: {\n readonly scenarioSourceDigest: Sha256Digest;\n readonly checkpointDigest: Sha256Digest;\n }) {\n super(\"The exploration cursor no longer matches scenario authority.\");\n this.name = \"ExploreCursorError\";\n this.scenarioSourceDigest = options.scenarioSourceDigest;\n this.checkpointDigest = options.checkpointDigest;\n }\n}\n\nexport function createExploreCursor(options: {\n readonly scenario: ScenarioIdentity;\n readonly checkpointDigest: Sha256Digest;\n readonly perspective: PerspectiveRef;\n readonly seedOverride?: number;\n readonly nextOrdinal: number;\n}): string {\n assertOrdinal(options.nextOrdinal);\n const payload: CursorPayload = {\n version: CURSOR_VERSION,\n scenarioSourceDigest: options.scenario.sourceDigest,\n checkpointDigest: options.checkpointDigest,\n perspective: options.perspective,\n seedOverride: options.seedOverride ?? null,\n nextOrdinal: options.nextOrdinal,\n };\n const encoded = btoa(\n Array.from(new TextEncoder().encode(JSON.stringify(payload)), (byte) =>\n String.fromCharCode(byte),\n ).join(\"\"),\n )\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n const digest = digestPluginRuntimeJson(payload).slice(\"sha256:\".length);\n return `dbx1.${encoded}.${digest}`;\n}\n\nexport function readExploreCursor(options: {\n readonly cursor: string;\n readonly scenario: ScenarioIdentity;\n readonly checkpointDigest: Sha256Digest;\n readonly perspective: PerspectiveRef;\n readonly seedOverride?: number;\n}): number {\n const stale = () => {\n throw new ExploreCursorError({\n scenarioSourceDigest: options.scenario.sourceDigest,\n checkpointDigest: options.checkpointDigest,\n });\n };\n const [prefix, encoded, digest, extra] = options.cursor.split(\".\");\n if (prefix !== \"dbx1\" || !encoded || !digest || extra !== undefined) stale();\n\n let payload: CursorPayload;\n try {\n payload = cursorPayloadSchema.parse(\n JSON.parse(\n new TextDecoder(\"utf-8\", { fatal: true }).decode(\n Uint8Array.from(\n atob(encoded.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\")),\n (character) => character.charCodeAt(0),\n ),\n ),\n ),\n );\n } catch {\n return stale();\n }\n\n if (\n digestPluginRuntimeJson(payload).slice(\"sha256:\".length) !== digest ||\n payload.scenarioSourceDigest !== options.scenario.sourceDigest ||\n payload.checkpointDigest !== options.checkpointDigest ||\n payload.seedOverride !== (options.seedOverride ?? null) ||\n JSON.stringify(payload.perspective) !== JSON.stringify(options.perspective)\n ) {\n return stale();\n }\n return payload.nextOrdinal;\n}\n\nfunction assertOrdinal(value: number): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(\n \"Explore cursor ordinal must be a non-negative safe integer.\",\n );\n }\n}\n","import type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../../reducer/model.js\";\nimport { currentScenarioClientParamSchema } from \"../scenario-replay.js\";\nimport {\n advanceScenarioReplay,\n enumerateScenarioInteractionParams,\n replayScenario,\n} from \"../scenario-replay.js\";\nimport type {\n ScenarioCheckpoint,\n ScenarioCommand,\n ScenarioCommandOf,\n ScenarioReplay,\n ScenarioReplayDefinition,\n} from \"../definitions.js\";\nimport { ScenarioReplayError } from \"../definitions.js\";\nimport { projectScenarioCommandParams } from \"../scenario-player-refs.js\";\nimport {\n compareCanonicalScenarioJson,\n digestScenarioJson,\n} from \"../canonical.js\";\nimport {\n inspectScenario,\n inspectScenarioReplayNode,\n type InspectScenarioOptions,\n} from \"../inspection/inspect-scenario.js\";\nimport type { InspectNode } from \"../inspection/types.js\";\nimport { createExploreCursor, readExploreCursor } from \"./cursor.js\";\nimport type {\n ExploreScenarioResult,\n ExploreSeedResult,\n ExploreTransitionResult,\n} from \"./types.js\";\n\nexport const DEFAULT_EXPLORE_LIMIT = 50;\nexport const MAX_EXPLORE_LIMIT = 200;\nexport const DEFAULT_EXPLORE_EVALUATIONS = 5_000;\nexport const MAX_EXPLORE_EVALUATIONS = 100_000;\nexport const MAX_EXPLORE_SEEDS = 64;\n\nexport class ScenarioExploreError extends Error {\n readonly code: \"TEST_EXPLORE_LIMIT_INVALID\" | \"TEST_SEED_RANGE_INVALID\";\n readonly context: Readonly<Record<string, string | number | boolean>>;\n\n constructor(options: {\n readonly code: ScenarioExploreError[\"code\"];\n readonly message: string;\n readonly context: Readonly<Record<string, string | number | boolean>>;\n }) {\n super(options.message);\n this.name = \"ScenarioExploreError\";\n this.code = options.code;\n this.context = options.context;\n }\n}\n\ntype SeedRange = {\n readonly start: number;\n readonly end: number;\n};\n\nexport type ExploreScenarioOptions<Game> = Omit<\n InspectScenarioOptions<Game>,\n \"seed\"\n> & {\n readonly seed?: number;\n readonly seedRange?: SeedRange;\n readonly limit?: number;\n readonly maxEvaluations?: number;\n readonly cursor?: string;\n};\n\nexport async function exploreScenario<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(\n options: ExploreScenarioOptions<Game> & {\n readonly game: { readonly contract: Contract };\n },\n): Promise<ExploreScenarioResult> {\n if (options.seedRange) {\n if (\n options.seed !== undefined ||\n options.cursor !== undefined ||\n options.limit !== undefined\n ) {\n throw new ScenarioExploreError({\n code: \"TEST_SEED_RANGE_INVALID\",\n message:\n \"Seed-range exploration cannot be combined with a seed override, cursor, or transition-page limit.\",\n context: { start: options.seedRange.start, end: options.seedRange.end },\n });\n }\n return exploreSeeds(options, options.seedRange);\n }\n return exploreTransitions(options);\n}\n\nasync function exploreTransitions<\n Contract extends ReducerGameContractLike,\n Game extends AnyReducerGameDefinition<Contract>,\n>(\n options: ExploreScenarioOptions<Game> & {\n readonly game: { readonly contract: Contract };\n },\n): Promise<ExploreTransitionResult> {\n const limit = options.limit ?? DEFAULT_EXPLORE_LIMIT;\n const maxEvaluations = options.maxEvaluations ?? DEFAULT_EXPLORE_EVALUATIONS;\n assertTransitionLimits(limit, maxEvaluations);\n const selectedScenario = scenarioWithSeed(options.scenario, options.seed);\n const checkpoint = defaultCheckpoint(selectedScenario, options.at);\n const replay = await replayScenario({\n game: options.game,\n scenario: selectedScenario,\n at: checkpoint,\n });\n const node = inspectScenarioReplayNode({\n replay,\n perspective: options.perspective,\n });\n const startOrdinal = options.cursor\n ? readExploreCursor({\n cursor: options.cursor,\n scenario: options.identity,\n checkpointDigest: node.checkpointDigest,\n perspective: node.perspective,\n seedOverride: options.seed,\n })\n : 0;\n if (node.perspective.kind === \"spectator\") {\n return {\n schemaVersion: 1,\n mode: \"transitions\",\n scenario: options.identity,\n perspective: node.perspective,\n node,\n candidates: [],\n omissions: [],\n page: {\n limit,\n evaluated: 0,\n truncated: false,\n nextCursor: null,\n },\n };\n }\n\n const accepted: ExploreTransitionResult[\"candidates\"][number][] = [];\n const omissions: ExploreTransitionResult[\"omissions\"][number][] = [];\n let evaluated = 0;\n for (const action of node.actions) {\n const remaining = maxEvaluations - evaluated;\n if (remaining <= 0) {\n omissions.push({\n actor: action.actor,\n interactionId: action.interactionId,\n code: \"INPUT_DOMAIN_BUDGET\",\n });\n continue;\n }\n const enumeration = enumerateScenarioInteractionParams({\n replay,\n seat: action.actor.seat,\n interactionId: action.interactionId,\n maxEvaluations: remaining,\n });\n if (\n !enumeration.found ||\n !enumeration.visible ||\n !enumeration.enumeration\n ) {\n continue;\n }\n evaluated += enumeration.enumeration.evaluated;\n if (enumeration.enumeration.status !== \"enumerated\") {\n omissions.push({\n actor: action.actor,\n interactionId: action.interactionId,\n code:\n enumeration.enumeration.status === \"budget\"\n ? \"INPUT_DOMAIN_BUDGET\"\n : \"INPUT_DOMAIN_NOT_ENUMERABLE\",\n ...(enumeration.enumeration.inputKey\n ? { inputKey: enumeration.enumeration.inputKey }\n : {}),\n });\n continue;\n }\n const assignments = [...enumeration.enumeration.assignments].sort(\n compareCanonicalScenarioJson,\n );\n for (const assignment of assignments) {\n const command: ScenarioCommand = {\n actor: { seat: action.actor.seat },\n interactionId: action.interactionId,\n params: projectScenarioCommandParams({\n game: options.game,\n currentSchema: currentScenarioClientParamSchema(\n replay,\n action.actor.seat,\n action.interactionId,\n ),\n phase: node.flow.phase,\n interactionId: action.interactionId,\n params: assignment,\n playerIds: replay.state().table.playerOrder,\n path: `explore.${action.interactionId}`,\n }),\n };\n const advanced = await advanceScenarioReplay({\n replay,\n // Both the action and assignment came from this game's authoritative\n // collector enumeration; bind their dynamic keys at the replay boundary.\n command: command as ScenarioCommandOf<Game>,\n });\n if (advanced.kind !== \"accepted\") continue;\n const afterNode = inspectScenarioReplayNode({\n replay: advanced.replay,\n perspective: options.perspective,\n });\n accepted.push({\n ordinal: accepted.length,\n command,\n after: {\n checkpointDigest: afterNode.checkpointDigest,\n flow: afterNode.flow,\n publicStateDigest: digestScenarioJson(afterNode.publicState),\n viewDigest: digestScenarioJson(afterNode.view),\n actions: afterNode.actions.map(({ actor, interactionId }) => ({\n actor,\n interactionId,\n })),\n entropy: afterNode.entropy,\n dispatchTrace: afterNode.dispatchTrace,\n },\n });\n }\n }\n\n const candidates = accepted.slice(startOrdinal, startOrdinal + limit);\n const nextOrdinal = startOrdinal + candidates.length;\n const truncated = nextOrdinal < accepted.length;\n return {\n schemaVersion: 1,\n mode: \"transitions\",\n scenario: structuredClone(options.identity),\n perspective: node.perspective,\n node,\n candidates,\n omissions,\n page: {\n limit,\n evaluated,\n truncated,\n nextCursor: truncated\n ? createExploreCursor({\n scenario: options.identity,\n checkpointDigest: node.checkpointDigest,\n perspective: node.perspective,\n seedOverride: options.seed,\n nextOrdinal,\n })\n : null,\n },\n };\n}\n\nasync function exploreSeeds<\n Contract extends ReducerGameContractLike,\n Game extends AnyReducerGameDefinition<Contract>,\n>(\n options: ExploreScenarioOptions<Game> & {\n readonly game: { readonly contract: Contract };\n },\n range: SeedRange,\n): Promise<ExploreSeedResult> {\n assertSeedRange(range);\n const checkpoint = defaultCheckpoint(options.scenario, options.at);\n const variants: ExploreSeedResult[\"variants\"][number][] = [];\n for (let seed = range.start; seed <= range.end; seed += 1) {\n try {\n const inspected = await inspectScenario({\n game: options.game,\n scenario: options.scenario,\n identity: options.identity,\n perspective: options.perspective,\n at: checkpoint,\n seed,\n });\n const replay = await replayScenario({\n game: options.game,\n scenario: scenarioWithSeed(options.scenario, seed),\n at: checkpoint,\n });\n const counts = await concreteOptionCounts({\n replay,\n node: inspected.node,\n maxEvaluations: options.maxEvaluations ?? DEFAULT_EXPLORE_EVALUATIONS,\n });\n variants.push({\n seed,\n status: \"replayed\",\n checkpointDigest: inspected.node.checkpointDigest,\n entropy: inspected.node.entropy,\n observable: {\n publicState: inspected.node.publicState,\n view: inspected.node.view,\n },\n signature: {\n phase: inspected.node.flow.phase,\n step: inspected.node.flow.step,\n actions: inspected.node.actions.map(({ actor, interactionId }) => ({\n seat: actor.seat,\n interactionId,\n concreteOptionCount:\n counts.get(`${actor.seat}:${interactionId}`) ?? \"unknown\",\n })),\n },\n });\n } catch (error) {\n if (!(error instanceof ScenarioReplayError)) throw error;\n variants.push({\n seed,\n status: \"rejected\",\n rejection: {\n segment: error.segment,\n sourceIndex: error.index,\n interactionId: error.interactionId,\n errorCode: error.errorCode,\n },\n });\n }\n }\n return {\n schemaVersion: 1,\n mode: \"seeds\",\n scenario: structuredClone(options.identity),\n perspective: (await inspectSeedPerspective(options)).node.perspective,\n checkpoint,\n variants,\n };\n}\n\nasync function inspectSeedPerspective<\n Contract extends ReducerGameContractLike,\n Game extends AnyReducerGameDefinition<Contract>,\n>(\n options: ExploreScenarioOptions<Game> & {\n readonly game: { readonly contract: Contract };\n },\n) {\n return inspectScenario({\n game: options.game,\n scenario: options.scenario,\n identity: options.identity,\n perspective: options.perspective,\n at: { segment: \"setup\", completed: 0 },\n });\n}\n\nasync function concreteOptionCounts<Game>(options: {\n readonly replay: ScenarioReplay<Game>;\n readonly node: InspectNode;\n readonly maxEvaluations: number;\n}): Promise<Map<string, number | \"unknown\">> {\n assertTransitionLimits(DEFAULT_EXPLORE_LIMIT, options.maxEvaluations);\n const counts = new Map<string, number | \"unknown\">();\n let evaluated = 0;\n for (const action of options.node.actions) {\n const remaining = options.maxEvaluations - evaluated;\n if (remaining <= 0) {\n counts.set(`${action.actor.seat}:${action.interactionId}`, \"unknown\");\n continue;\n }\n const result = enumerateScenarioInteractionParams({\n replay: options.replay,\n seat: action.actor.seat,\n interactionId: action.interactionId,\n maxEvaluations: remaining,\n });\n if (!result.found || !result.visible || !result.enumeration) continue;\n evaluated += result.enumeration.evaluated;\n counts.set(\n `${action.actor.seat}:${action.interactionId}`,\n result.enumeration.status === \"enumerated\"\n ? result.enumeration.assignments.length\n : \"unknown\",\n );\n }\n return counts;\n}\n\nfunction scenarioWithSeed<Game>(\n scenario: ScenarioReplayDefinition<Game>,\n seed: number | undefined,\n): ScenarioReplayDefinition<Game> {\n return seed === undefined\n ? scenario\n : { ...scenario, setup: { ...scenario.setup, seed } };\n}\n\nfunction defaultCheckpoint<Game>(\n scenario: ScenarioReplayDefinition<Game>,\n at: ScenarioCheckpoint | undefined,\n): ScenarioCheckpoint {\n return (\n at ?? {\n segment: \"given\",\n completed: scenario.given.length,\n }\n );\n}\n\nfunction assertTransitionLimits(limit: number, maxEvaluations: number): void {\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_EXPLORE_LIMIT) {\n throw new ScenarioExploreError({\n code: \"TEST_EXPLORE_LIMIT_INVALID\",\n message: `Explore limit must be between 1 and ${MAX_EXPLORE_LIMIT}.`,\n context: { requested: limit, minimum: 1, maximum: MAX_EXPLORE_LIMIT },\n });\n }\n if (\n !Number.isSafeInteger(maxEvaluations) ||\n maxEvaluations < 1 ||\n maxEvaluations > MAX_EXPLORE_EVALUATIONS\n ) {\n throw new ScenarioExploreError({\n code: \"TEST_EXPLORE_LIMIT_INVALID\",\n message: `Explore max evaluations must be between 1 and ${MAX_EXPLORE_EVALUATIONS}.`,\n context: {\n requested: maxEvaluations,\n minimum: 1,\n maximum: MAX_EXPLORE_EVALUATIONS,\n },\n });\n }\n}\n\nfunction assertSeedRange(range: SeedRange): void {\n const width = range.end - range.start + 1;\n if (\n !Number.isSafeInteger(range.start) ||\n !Number.isSafeInteger(range.end) ||\n range.start > range.end ||\n !Number.isSafeInteger(width) ||\n width < 1 ||\n width > MAX_EXPLORE_SEEDS\n ) {\n throw new ScenarioExploreError({\n code: \"TEST_SEED_RANGE_INVALID\",\n message: `Seed range must contain 1 through ${MAX_EXPLORE_SEEDS} inclusive safe-integer seeds.`,\n context: {\n start: range.start,\n end: range.end,\n maximumWidth: MAX_EXPLORE_SEEDS,\n },\n });\n }\n}\n","import { computePluginActionSetVersion } from \"../../shared/protocol/digest.js\";\nimport { materializePluginGameplayFrame } from \"../../shared/protocol/projection.js\";\nimport { digestScenarioJson } from \"../canonical.js\";\nimport type {\n CreateReducerScenarioRunnerOptions,\n ReducerScenarioFrame,\n ReducerScenarioExchange,\n ReducerScenarioOperation,\n ReducerScenarioRunner,\n ReducerScenarioTrace,\n} from \"./types.js\";\n\nexport function createReducerScenarioRunner(\n options: CreateReducerScenarioRunnerOptions,\n): ReducerScenarioRunner {\n return {\n async run(\n operations: readonly ReducerScenarioOperation[],\n ): Promise<ReducerScenarioTrace> {\n let state = structuredClone(options.initialState);\n let gameVersion = options.initialGameVersion ?? 1;\n const sessionId = crypto.randomUUID();\n const frames: ReducerScenarioFrame[] = [];\n const exchanges: ReducerScenarioExchange[] = [];\n\n const appendFrame = (id: string): ReducerScenarioFrame => {\n const dynamicProjection = options.bundle.project({\n state,\n referenceBasis: { sessionId, version: gameVersion },\n playerIds: [options.viewer.playerId],\n });\n const flow = readFlowState(state);\n const materialized = materializePluginGameplayFrame({\n currentPhase: flow.currentPhase,\n activePlayers: flow.activePlayers,\n dynamicProjection,\n perspectivePlayerId: options.viewer.playerId,\n version: gameVersion,\n sessionId,\n actionSetVersion: \"pending\",\n });\n const actionSetVersion = computePluginActionSetVersion({\n version: gameVersion,\n availableInteractions: materialized.availableInteractions,\n });\n const frame = {\n id,\n reducerState: structuredClone(state),\n dynamicProjection,\n gameVersion,\n actionSetVersion,\n projectionDigest: digestScenarioJson({\n digestVersion: \"reducer-scenario-frame@2\",\n scenarioId: options.scenarioId,\n frameId: id,\n dynamicProjection,\n gameVersion,\n actionSetVersion,\n }),\n } satisfies ReducerScenarioFrame;\n frames.push(frame);\n return frame;\n };\n\n appendFrame(\"frame-1\");\n\n for (const operation of operations) {\n const fromFrame = frames[frames.length - 1];\n if (!fromFrame) {\n throw new Error(\"Reducer scenario runner lost its initial frame.\");\n }\n if (operation.operation === \"validate\") {\n // Authoring probes execute the canonical operation without committing it.\n const dispatched = await options.bundle.dispatch({\n state: structuredClone(state),\n referenceBasis: { sessionId, version: gameVersion },\n input: operation.input,\n });\n const result =\n dispatched.kind === \"accept\"\n ? { valid: true as const }\n : {\n valid: false as const,\n errorCode: dispatched.errorCode,\n message: dispatched.message,\n };\n exchanges.push({\n id: operation.id,\n operation: \"validate\",\n fromFrameId: fromFrame.id,\n input: operation.input,\n result,\n });\n continue;\n }\n\n const result = await options.bundle.dispatch({\n state,\n referenceBasis: { sessionId, version: gameVersion },\n input: operation.input,\n });\n if (result.kind === \"reject\") {\n exchanges.push({\n id: operation.id,\n operation: \"submit\",\n fromFrameId: fromFrame.id,\n input: operation.input,\n result: {\n kind: \"rejected\",\n diagnostics: [\n {\n code: result.errorCode,\n message: result.message ?? result.errorCode,\n },\n ],\n },\n });\n continue;\n }\n\n state = structuredClone(result.state);\n gameVersion += 1;\n const toFrame = appendFrame(`frame-${frames.length + 1}`);\n exchanges.push({\n id: operation.id,\n operation: \"submit\",\n fromFrameId: fromFrame.id,\n input: operation.input,\n result: {\n kind: \"accepted\",\n toFrameId: toFrame.id,\n },\n });\n }\n\n return {\n scenarioId: options.scenarioId,\n gameId: options.gameId,\n viewer: options.viewer,\n frames,\n exchanges,\n };\n },\n };\n}\n\nfunction readFlowState(state: {\n readonly domain?: {\n readonly flow?: {\n readonly currentPhase?: string;\n readonly activePlayers?: readonly string[];\n };\n };\n}): { currentPhase: string | null; activePlayers: readonly string[] } {\n return {\n currentPhase: state.domain?.flow?.currentPhase ?? null,\n activePlayers: [...(state.domain?.flow?.activePlayers ?? [])],\n };\n}\n","import { createSourceLifecycle } from \"../../headless/sources/lifecycle.js\";\nimport { immutableCopy } from \"../../shared/immutable.js\";\nimport { SourceSnapshotSchema } from \"../../headless/sources/static.js\";\nimport type {\n CommandSource,\n SourceSnapshot,\n SubmitResult,\n} from \"../../headless/sources/types.js\";\nimport type { RuntimeJson } from \"../../shared/runtime-json.js\";\nimport { computePluginActionSetVersion } from \"../../shared/protocol/digest.js\";\n\nexport interface CapturedSubmission {\n readonly operation: \"submit\" | \"cancel\";\n readonly interactionId: string;\n readonly params?: RuntimeJson;\n resolve(result: SubmitResult): void;\n}\nexport interface TestSource extends CommandSource {\n readonly submissions: readonly CapturedSubmission[];\n emit(snapshot: SourceSnapshot): void;\n recovering(): void;\n fail(error: Error): void;\n}\n/** Test-owned transport control; all request/barrier behavior remains production code. */\nexport function createTestSource(initial: SourceSnapshot): TestSource {\n const sessionId = crypto.randomUUID();\n const submissions: CapturedSubmission[] = [];\n const lifecycle = createSourceLifecycle({\n send(command) {\n submissions.push(\n Object.freeze({\n operation:\n command.type === \"interaction.submit\" ? \"submit\" : \"cancel\",\n interactionId: command.interactionId,\n ...(command.type === \"interaction.submit\"\n ? { params: immutableCopy(command.params) }\n : {}),\n resolve(result: SubmitResult) {\n lifecycle.result({\n ...result,\n type: \"interaction.result\",\n clientActionId: command.clientActionId,\n });\n },\n }),\n );\n },\n recover() {},\n close() {},\n });\n function emit(value: SourceSnapshot) {\n const snapshot = SourceSnapshotSchema.parse(value);\n lifecycle.session({ sessionId, players: snapshot.players });\n lifecycle.frame({\n ...snapshot.frame,\n basis: {\n sessionId,\n version: snapshot.version,\n perspectivePlayerId: snapshot.me,\n actionSetVersion: computePluginActionSetVersion({\n version: snapshot.version,\n availableInteractions: snapshot.frame.availableInteractions,\n }),\n },\n });\n }\n emit(initial);\n return {\n ...lifecycle.source,\n get submissions() {\n return [...submissions];\n },\n emit,\n recovering: lifecycle.recovering,\n fail: lifecycle.fail,\n };\n}\n","import type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../../reducer/model.js\";\nimport { resolvePlayerRoster } from \"../player-roster.js\";\nimport { createStore } from \"@tanstack/store\";\nimport * as z from \"zod\";\nimport { createSourceLifecycle } from \"../../headless/sources/lifecycle.js\";\nimport { immutableCopy } from \"../../shared/immutable.js\";\nimport type {\n SourceState,\n SubmitResult,\n} from \"../../headless/sources/types.js\";\nimport {\n ReducerSessionStateSchema,\n GameOutcomeSchema,\n} from \"../../shared/runtime-schema.js\";\nimport type {\n GameInput,\n ReducerSessionState,\n} from \"../../shared/runtime-types.js\";\nimport {\n RuntimeJsonSchema,\n type RuntimeJson,\n} from \"../../shared/runtime-json.js\";\nimport { materializePluginGameplayFrame } from \"../../shared/protocol/projection.js\";\nimport { computePluginActionSetVersion } from \"../../shared/protocol/digest.js\";\nimport { createReducerTestingRuntime } from \"../reducer-runtime.js\";\nimport type { OptionsOfContract } from \"../../reducer/model/extract.js\";\nimport type { ScenarioCommandOf } from \"../definitions.js\";\nimport {\n projectScenarioCommandParams,\n resolveScenarioCommandParams,\n resolveScenarioSeatRef,\n} from \"../scenario-player-refs.js\";\nimport type { LocalCheckpoint, LocalSource } from \"./types.js\";\n\nconst checkpointSchema = z\n .object({\n state: ReducerSessionStateSchema,\n terminal: GameOutcomeSchema.nullable(),\n })\n .strict();\ntype Runtime = ReturnType<typeof createReducerTestingRuntime>;\nexport async function localSource<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(\n game: Game & { readonly contract: Contract },\n options: {\n players: number;\n seed: number;\n as?: string;\n options?: OptionsOfContract<Game[\"contract\"]>;\n },\n): Promise<LocalSource<Game>> {\n const setup = game.contract.manifest.normalSetup;\n const playerIds = resolvePlayerRoster(game, options.players);\n const runtime = createReducerTestingRuntime(game);\n const initial = await runtime.initialize({\n table: RuntimeJsonSchema.parse(setup.createInitialTable({ playerIds })),\n playerIds,\n rngSeed: options.seed,\n options: options.options,\n });\n return createLocalProvider(\n game,\n runtime,\n playerIds,\n { state: initial.state, terminal: initial.terminal ?? null },\n options.as ?? playerIds[0],\n );\n}\n\n/** Scenario materialization enters here without initializing/replaying on restore. */\nexport function createLocalProvider<\n Contract extends ReducerGameContractLike,\n Game extends AnyReducerGameDefinition<Contract>,\n>(\n game: Game & { readonly contract: Contract },\n runtime: Runtime,\n playerIds: readonly string[],\n initial: LocalCheckpoint,\n selectedPlayerId: string,\n): LocalSource<Game> {\n let checkpoint = immutableCopy(checkpointSchema.parse(initial));\n let revision = 1;\n let playerId = selectedPlayerId;\n let epoch = 0;\n let disposed = false;\n let inFlight = false;\n let disconnect = () => {};\n const session = {\n sessionId: crypto.randomUUID(),\n players: playerIds.map((id) => ({ playerId: id, displayName: id })),\n };\n const store = createStore<SourceState>({\n snapshot: null,\n connection: \"connecting\",\n request: null,\n failure: null,\n });\n let lifecycle: ReturnType<typeof createSourceLifecycle>;\n function assertOpen() {\n if (disposed) throw new Error(\"Local source disposed.\");\n }\n function assertIdle() {\n assertOpen();\n if (inFlight || store.get().request)\n throw new Error(\"A gameplay interaction is already pending.\");\n }\n function makeFrame(\n state: ReducerSessionState = checkpoint.state,\n perspective = playerId,\n ) {\n const projection = runtime.project({\n state,\n playerIds: [perspective],\n referenceBasis: { sessionId: session.sessionId, version: revision },\n });\n const provisional = materializePluginGameplayFrame({\n currentPhase: state.domain.flow.currentPhase,\n activePlayers: projection.schedulerFlow?.activePlayerIds ?? [],\n dynamicProjection: projection,\n perspectivePlayerId: perspective,\n sessionId: session.sessionId,\n version: revision,\n actionSetVersion: \"pending\",\n });\n return {\n ...provisional,\n basis: {\n ...provisional.basis,\n actionSetVersion: computePluginActionSetVersion({\n version: revision,\n availableInteractions: provisional.availableInteractions,\n }),\n },\n };\n }\n function publish() {\n lifecycle.frame(makeFrame());\n }\n async function execute(\n input: GameInput,\n authored = false,\n ): Promise<SubmitResult> {\n assertOpen();\n if (inFlight) throw new Error(\"A gameplay interaction is already pending.\");\n if (checkpoint.terminal)\n return { accepted: false, errorCode: \"game-ended\" };\n inFlight = true;\n const generation = epoch;\n try {\n const result = await (\n authored ? runtime.dispatch : runtime.dispatchClient\n )({\n state: checkpoint.state,\n input,\n referenceBasis: { sessionId: session.sessionId, version: revision },\n });\n if (disposed || generation !== epoch)\n throw new Error(\"Local source lifetime changed.\");\n if (result.kind === \"reject\")\n return {\n accepted: false,\n errorCode: result.errorCode,\n ...(result.message === undefined ? {} : { message: result.message }),\n };\n checkpoint = immutableCopy({\n state: result.state,\n terminal: result.terminal ?? null,\n });\n revision++;\n publish();\n return { accepted: true };\n } finally {\n if (generation === epoch) inFlight = false;\n }\n }\n function replaceLifetime() {\n if (!playerIds.includes(playerId))\n throw new Error(\"Unknown local source seat.\");\n epoch++;\n inFlight = false;\n disconnect();\n lifecycle?.source.dispose();\n const generation = epoch;\n lifecycle = createSourceLifecycle({\n context: { sessionId: session.sessionId, playerId },\n send(command) {\n const current = lifecycle;\n void execute(\n command.type === \"interaction.cancel\"\n ? {\n kind: \"interaction.cancel\",\n basis: command.basis,\n playerId,\n interactionId: command.interactionId,\n }\n : {\n kind: \"interaction\",\n basis: command.basis,\n playerId,\n interactionId: command.interactionId,\n params: command.params,\n },\n )\n .then((result) => {\n if (generation === epoch)\n current.result({\n ...result,\n type: \"interaction.result\",\n clientActionId: command.clientActionId,\n });\n })\n .catch((error) => {\n if (generation === epoch)\n current.fail(\n error instanceof Error ? error : new Error(String(error)),\n );\n });\n },\n recover: publish,\n close() {},\n });\n lifecycle.session(session);\n publish();\n store.setState(() => lifecycle.source.store.get());\n const subscription = lifecycle.source.store.subscribe(() =>\n store.setState(() => lifecycle.source.store.get()),\n );\n disconnect = () => subscription.unsubscribe();\n }\n replaceLifetime();\n return {\n store: {\n get: () => store.get(),\n subscribe: (listener) => store.subscribe(listener),\n },\n async submit(interactionId, params) {\n assertIdle();\n return lifecycle.source.submit(interactionId, params);\n },\n async cancel(interactionId) {\n assertIdle();\n return lifecycle.source.cancel(interactionId);\n },\n async apply(command: ScenarioCommandOf<Game>) {\n assertIdle();\n const actor = resolveScenarioSeatRef({\n ref: command.actor,\n playerIds,\n path: \"command.actor\",\n });\n const currentSchema = runtime.currentAuthorParamSchema({\n referenceBasis: { sessionId: session.sessionId, version: revision },\n state: checkpoint.state,\n playerId: actor,\n interactionId: command.interactionId,\n }) as z.ZodTypeAny | null;\n const params = resolveScenarioCommandParams({\n game,\n currentSchema,\n phase: checkpoint.state.domain.flow.currentPhase,\n interactionId: command.interactionId,\n params: command.params,\n playerIds,\n path: \"command\",\n });\n return execute(\n {\n kind: \"interaction\",\n basis: makeFrame(checkpoint.state, actor).basis,\n playerId: actor,\n interactionId: command.interactionId,\n params: params as RuntimeJson,\n },\n true,\n );\n },\n switchSeat(next) {\n assertOpen();\n if (!playerIds.includes(next))\n throw new Error(\"Unknown local source seat.\");\n if (next === playerId) return;\n playerId = next;\n replaceLifetime();\n },\n checkpoint() {\n assertOpen();\n return structuredClone(checkpoint);\n },\n restore(value) {\n assertOpen();\n const next = checkpointSchema.parse(value);\n runtime.project({\n state: next.state,\n playerIds: [...playerIds],\n referenceBasis: { sessionId: session.sessionId, version: revision + 1 },\n });\n // Production projection validates the game-specific table before this read.\n const restoredRoster = (\n next.state.domain.table as { playerOrder: string[] }\n ).playerOrder;\n if (\n restoredRoster.length !== playerIds.length ||\n restoredRoster.some((id, index) => id !== playerIds[index])\n )\n throw new Error(\"Checkpoint roster does not match the local session.\");\n checkpoint = immutableCopy(next);\n revision++;\n replaceLifetime();\n },\n inspect() {\n assertOpen();\n return store.get().snapshot!;\n },\n async explore({ maxEvaluations }) {\n assertOpen();\n if (!Number.isSafeInteger(maxEvaluations) || maxEvaluations < 1)\n throw new Error(\"Enumeration budget must be a positive integer.\");\n if (checkpoint.terminal) return [];\n const commands: ScenarioCommandOf<Game>[] = [];\n let remaining = maxEvaluations;\n const capturedState = checkpoint.state;\n const capturedEpoch = epoch;\n const capturedRevision = revision;\n for (const descriptor of store.get().snapshot!.frame\n .availableInteractions) {\n if (remaining <= 0) break;\n const result = runtime.enumerateInteractionParams({\n referenceBasis: { sessionId: session.sessionId, version: revision },\n state: checkpoint.state,\n playerId,\n interactionId: descriptor.interactionId,\n maxEvaluations: remaining,\n });\n if (!result.found || !result.visible || !result.enumeration) continue;\n remaining -= result.enumeration.evaluated;\n for (const params of result.enumeration.assignments) {\n const probe = await runtime.dispatch({\n state: structuredClone(capturedState),\n referenceBasis: {\n sessionId: session.sessionId,\n version: capturedRevision,\n },\n input: {\n kind: \"interaction\",\n basis: makeFrame(capturedState).basis,\n playerId,\n interactionId: descriptor.interactionId,\n params: params as RuntimeJson,\n },\n });\n if (\n disposed ||\n capturedEpoch !== epoch ||\n capturedRevision !== revision\n )\n throw new Error(\"Source changed during exploration.\");\n if (probe.kind === \"reject\") continue;\n const projected = projectScenarioCommandParams({\n game,\n currentSchema: runtime.currentAuthorParamSchema({\n referenceBasis: {\n sessionId: session.sessionId,\n version: revision,\n },\n state: checkpoint.state,\n playerId,\n interactionId: descriptor.interactionId,\n }) as z.ZodTypeAny | null,\n phase: checkpoint.state.domain.flow.currentPhase,\n interactionId: descriptor.interactionId,\n params,\n playerIds,\n path: \"explore\",\n });\n commands.push({\n actor: { seat: playerIds.indexOf(playerId) },\n interactionId: descriptor.interactionId,\n params: projected,\n } as ScenarioCommandOf<Game>);\n }\n }\n return commands;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n epoch++;\n lifecycle.source.dispose();\n disconnect();\n },\n };\n}\n","import type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../../reducer/model.js\";\nimport { materializeScenarioRuntimeCheckpoint } from \"../scenario-replay.js\";\nimport { createReducerTestingRuntime } from \"../reducer-runtime.js\";\nimport {\n resolveScenarioCheckpoint,\n type ScenarioDefinition,\n type ScenarioCheckpointSelector,\n} from \"../definitions.js\";\nimport { createLocalProvider } from \"./local-source.js\";\nimport type { LocalSource } from \"./types.js\";\n\nexport async function scenarioSource<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(\n game: Game & { readonly contract: Contract },\n scenario: ScenarioDefinition<Game>,\n options: { at?: ScenarioCheckpointSelector; as?: string } = {},\n): Promise<LocalSource<Game>> {\n const materialized = await materializeScenarioRuntimeCheckpoint({\n game,\n scenario,\n ...(options.at === undefined\n ? {}\n : { at: resolveScenarioCheckpoint(scenario, options.at) }),\n });\n return createLocalProvider(\n game,\n createReducerTestingRuntime(game),\n materialized.playerIds,\n { state: materialized.state, terminal: materialized.terminal },\n options.as ?? materialized.playerIds[0],\n );\n}\n","import type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../../reducer/model.js\";\nimport { nextRandomInt } from \"../../reducer/rng.js\";\nimport type { RuntimeRngState } from \"../../reducer/model/runtime.js\";\nimport type { ScenarioCommandOf } from \"../definitions.js\";\nimport { localSource } from \"./local-source.js\";\nimport type { LocalCheckpoint } from \"./types.js\";\n\nexport interface FuzzResult<Game> {\n readonly commands: readonly ScenarioCommandOf<Game>[];\n readonly checkpoint: LocalCheckpoint;\n readonly error?: Error;\n}\n/** Deterministic testing choice RNG is independent from the game's authoritative RNG. */\nexport async function fuzz<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(\n game: Game & { readonly contract: Contract },\n options: {\n seed: number;\n steps: number;\n players?: number;\n maxEvaluations?: number;\n },\n): Promise<FuzzResult<Game>> {\n if (!Number.isSafeInteger(options.steps) || options.steps < 0)\n throw new Error(\"Fuzz steps must be a nonnegative integer.\");\n const players =\n options.players ?? game.contract.manifest.normalSetup.minPlayers;\n const source = await localSource(game, { players, seed: options.seed });\n let rng: RuntimeRngState = {\n seed: options.seed,\n cursor: 0,\n draws: [],\n trace: [],\n };\n const commands: ScenarioCommandOf<Game>[] = [];\n try {\n for (\n let step = 0;\n step < options.steps && !source.checkpoint().terminal;\n step++\n ) {\n const actors: string[] = [];\n for (const player of source.inspect().players) {\n source.switchSeat(player.playerId);\n if (\n source\n .inspect()\n .frame.availableInteractions.some(\n (interaction) => interaction.availability.status === \"available\",\n )\n )\n actors.push(player.playerId);\n }\n if (actors.length === 0) break;\n const [actorIndex, actorRng] = nextRandomInt(actors.length, rng);\n rng = actorRng;\n source.switchSeat(actors[actorIndex]);\n const choices = await source.explore({\n maxEvaluations: options.maxEvaluations ?? 5000,\n });\n if (choices.length === 0) break;\n const [index, next] = nextRandomInt(choices.length, rng);\n rng = next;\n const command = choices[index];\n commands.push(command);\n const result = await source.apply(command);\n if (!result.accepted)\n throw new Error(`Explored command rejected: ${result.errorCode}`);\n }\n return { commands, checkpoint: source.checkpoint() };\n } catch (error) {\n return {\n commands,\n checkpoint: source.checkpoint(),\n error: error instanceof Error ? error : new Error(String(error)),\n };\n } finally {\n source.dispose();\n }\n}\n","import type {\n AnyReducerGameDefinition,\n ReducerGameContractLike,\n} from \"../reducer/model.js\";\nimport {\n assertReducerBundleContract,\n type ReducerBundleContract,\n} from \"../shared/worker-contract.js\";\nimport type { DispatchTraceSummaryEntry } from \"../reducer/diagnostics.js\";\nimport { ScenarioReplayError, type ScenarioDefinition } from \"./definitions.js\";\nimport { assertScenario, replayScenario } from \"./scenario-replay.js\";\n\nexport {\n materializeScenarioRuntimeCheckpoint,\n type ScenarioRuntimeCheckpointMaterialization,\n} from \"./scenario-replay.js\";\n\nexport type CandidateVerificationScenario<Game> = ScenarioDefinition<Game>;\n\nexport type CandidateVerificationInput<Game> = {\n /** The exact compiled production artifact under verification. */\n readonly bundle: ReducerBundleContract;\n /** Authored scenario schemas and inspection metadata; not execution authority. */\n readonly reducer: Game;\n readonly scenarios:\n | Readonly<Record<string, CandidateVerificationScenario<Game>>>\n | readonly CandidateVerificationScenario<Game>[];\n readonly maxScenarios?: number;\n readonly maxStepsPerScenario?: number;\n};\n\nexport type CandidateVerificationReplayDiagnostic = {\n readonly kind: \"replay\";\n readonly message: string;\n readonly scenarioId?: string;\n readonly segment?: \"given\" | \"when\";\n readonly index?: number;\n readonly interactionId?: string;\n readonly errorCode?: string;\n readonly reducerMessage?: string;\n readonly trace?: readonly DispatchTraceSummaryEntry[];\n};\n\nexport type CandidateVerificationAssertionDiagnostic = {\n readonly kind: \"assertion\";\n readonly message: string;\n};\n\nexport type CandidateVerificationLimitDiagnostic = {\n readonly kind: \"limit\";\n readonly message: string;\n readonly actualSteps: number;\n readonly maxStepsPerScenario: number;\n};\n\nexport type CandidateVerificationScenarioResult = {\n readonly id: string;\n readonly status: \"passed\" | \"failed\";\n readonly diagnostic?:\n | CandidateVerificationReplayDiagnostic\n | CandidateVerificationAssertionDiagnostic\n | CandidateVerificationLimitDiagnostic;\n};\n\nexport type CandidateVerificationResult = {\n readonly status: \"passed\" | \"failed\";\n readonly scenarioSummary: {\n readonly total: number;\n readonly passed: number;\n readonly failed: number;\n readonly scenarios: readonly CandidateVerificationScenarioResult[];\n };\n};\n\nconst CANDIDATE_INPUT_FIELDS = new Set([\n \"reducer\",\n \"bundle\",\n \"scenarios\",\n \"maxScenarios\",\n \"maxStepsPerScenario\",\n]);\nconst MAX_DIAGNOSTIC_MESSAGE_LENGTH = 2_000;\nconst MAX_DIAGNOSTIC_TRACE_ENTRIES = 100;\n\nexport async function runCandidateVerification<\n Contract extends ReducerGameContractLike,\n const Game extends AnyReducerGameDefinition<Contract>,\n>(\n input: CandidateVerificationInput<Game> & {\n readonly reducer: { readonly contract: Contract };\n },\n): Promise<CandidateVerificationResult> {\n assertCandidateInputFields(input);\n assertReducerBundleContract(input.bundle, \"candidate verification\");\n const scenarios = normalizeScenarios(input.scenarios);\n if (scenarios.length === 0) {\n throw new Error(\"Candidate verification requires at least one scenario.\");\n }\n\n const maxScenarios = input.maxScenarios ?? scenarios.length;\n assertPositiveInteger(maxScenarios, \"maxScenarios\");\n if (scenarios.length > maxScenarios) {\n throw new Error(\n `Candidate verification contains ${scenarios.length} scenarios, exceeding limit ${maxScenarios}.`,\n );\n }\n\n const maxStepsPerScenario = input.maxStepsPerScenario ?? 1_000;\n assertPositiveInteger(maxStepsPerScenario, \"maxStepsPerScenario\");\n\n const results: CandidateVerificationScenarioResult[] = [];\n for (const scenario of scenarios) {\n results.push(\n await runScenario({\n reducer: input.reducer,\n bundle: input.bundle,\n scenario,\n maxStepsPerScenario,\n }),\n );\n }\n\n const failed = results.filter((result) => result.status === \"failed\").length;\n return {\n status: failed === 0 ? \"passed\" : \"failed\",\n scenarioSummary: {\n total: results.length,\n passed: results.length - failed,\n failed,\n scenarios: results,\n },\n };\n}\n\nasync function runScenario<\n Contract extends ReducerGameContractLike,\n Game extends AnyReducerGameDefinition<Contract>,\n>(input: {\n readonly reducer: Game & { readonly contract: Contract };\n readonly bundle: ReducerBundleContract;\n readonly scenario: CandidateVerificationScenario<Game>;\n readonly maxStepsPerScenario: number;\n}): Promise<CandidateVerificationScenarioResult> {\n const actualSteps = input.scenario.given.length + input.scenario.when.length;\n if (actualSteps > input.maxStepsPerScenario) {\n return {\n id: input.scenario.id,\n status: \"failed\",\n diagnostic: {\n kind: \"limit\",\n message:\n `Scenario contains ${actualSteps} replay steps, exceeding ` +\n `maxStepsPerScenario limit ${input.maxStepsPerScenario}.`,\n actualSteps,\n maxStepsPerScenario: input.maxStepsPerScenario,\n },\n };\n }\n\n let replay;\n try {\n replay = await replayScenario({\n game: input.reducer,\n bundle: input.bundle,\n scenario: input.scenario,\n });\n } catch (error) {\n return {\n id: input.scenario.id,\n status: \"failed\",\n diagnostic: replayDiagnostic(error),\n };\n }\n\n try {\n await assertScenario({ replay, assertion: input.scenario.then });\n return { id: input.scenario.id, status: \"passed\" };\n } catch (error) {\n return {\n id: input.scenario.id,\n status: \"failed\",\n diagnostic: {\n kind: \"assertion\",\n message: boundedMessage(error),\n },\n };\n }\n}\n\nfunction assertCandidateInputFields(input: object): void {\n for (const field of Object.keys(input)) {\n if (!CANDIDATE_INPUT_FIELDS.has(field)) {\n throw new Error(\n `Candidate verification input contains unsupported field '${field}'.`,\n );\n }\n }\n}\n\nfunction assertPositiveInteger(value: number, field: string): void {\n if (!Number.isSafeInteger(value) || value < 1) {\n throw new Error(`${field} must be a positive safe integer.`);\n }\n}\n\nfunction normalizeScenarios<Game>(\n input:\n | Readonly<Record<string, CandidateVerificationScenario<Game>>>\n | readonly CandidateVerificationScenario<Game>[],\n): CandidateVerificationScenario<Game>[] {\n if (typeof input !== \"object\" || input === null) {\n throw new Error(\n \"Candidate verification scenarios must be an array or record.\",\n );\n }\n const scenarios: CandidateVerificationScenario<Game>[] = Object.values(input);\n const seenIds = new Set<string>();\n for (const scenario of scenarios) {\n if (typeof scenario?.id !== \"string\" || scenario.id.length === 0) {\n throw new Error(\"Candidate verification scenario id is required.\");\n }\n if (seenIds.has(scenario.id)) {\n throw new Error(\n `Candidate verification scenario id '${scenario.id}' is duplicated.`,\n );\n }\n seenIds.add(scenario.id);\n }\n return scenarios;\n}\n\nfunction replayDiagnostic(\n error: unknown,\n): CandidateVerificationReplayDiagnostic {\n if (error instanceof ScenarioReplayError) {\n return {\n kind: \"replay\",\n message: boundedMessage(error),\n scenarioId: error.scenarioId,\n segment: error.segment,\n index: error.index,\n interactionId: error.interactionId,\n errorCode: error.errorCode,\n ...(error.reducerMessage === undefined\n ? {}\n : { reducerMessage: boundedText(error.reducerMessage) }),\n trace: error.trace.slice(0, MAX_DIAGNOSTIC_TRACE_ENTRIES),\n };\n }\n return { kind: \"replay\", message: boundedMessage(error) };\n}\n\nfunction boundedMessage(error: unknown): string {\n return boundedText(error instanceof Error ? error.message : String(error));\n}\n\nfunction boundedText(value: string): string {\n return value.slice(0, MAX_DIAGNOSTIC_MESSAGE_LENGTH);\n}\n"],"mappings":"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","names":["z","isPlainObject","schemas","events","z","readFlowState","result","z"]}
|