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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/REFERENCE.md +153 -51
  2. package/dist/authoring/index.js +2 -2
  3. package/dist/{chunk-52DH7VQF.js → chunk-2TAKLJJD.js} +5 -2
  4. package/dist/{chunk-52DH7VQF.js.map → chunk-2TAKLJJD.js.map} +1 -1
  5. package/dist/{chunk-TGMXBRKY.js → chunk-3BLN5POZ.js} +5 -3
  6. package/dist/chunk-3BLN5POZ.js.map +1 -0
  7. package/dist/{chunk-RKGJ64UN.js → chunk-44N3T2A5.js} +2 -2
  8. package/dist/{chunk-IU6KGPY7.js → chunk-5CQIJHGF.js} +6 -2
  9. package/dist/{chunk-IU6KGPY7.js.map → chunk-5CQIJHGF.js.map} +1 -1
  10. package/dist/{chunk-5IHU5CUK.js → chunk-IYX5OO2K.js} +12 -22
  11. package/dist/chunk-IYX5OO2K.js.map +1 -0
  12. package/dist/{chunk-Q322XCY2.js → chunk-VTK4TIXC.js} +3 -3
  13. package/dist/{chunk-KYEWGZ2Y.js → chunk-VTNEWMWJ.js} +2 -2
  14. package/dist/{chunk-KYEWGZ2Y.js.map → chunk-VTNEWMWJ.js.map} +1 -1
  15. package/dist/{chunk-3QIZKXJ2.js → chunk-XV27IQHA.js} +3 -3
  16. package/dist/{chunk-NO537WSS.js → chunk-YGQTL63W.js} +2 -2
  17. package/dist/{chunk-VLG4YST5.js → chunk-ZYONCTZ2.js} +2 -2
  18. package/dist/codegen.js +1 -1
  19. package/dist/{index.d-DMASeF6M.d.ts → index.d-C0PKOVbh.d.ts} +25 -4
  20. package/dist/index.js +2 -2
  21. package/dist/package-set.d.ts +2 -2
  22. package/dist/package-set.js +2 -2
  23. package/dist/{protocol-835hEGne.d.ts → protocol-nS2ojsGr.d.ts} +5 -0
  24. package/dist/reducer/advanced.d.ts +2 -2
  25. package/dist/reducer-contract.d.ts +1 -1
  26. package/dist/reducer-contract.js +2 -2
  27. package/dist/reducer.d.ts +23 -20
  28. package/dist/reducer.js +131 -84
  29. package/dist/reducer.js.map +1 -1
  30. package/dist/runtime/primitives.js +3 -3
  31. package/dist/runtime/workspace-contract.js +4 -4
  32. package/dist/runtime.d.ts +3 -3
  33. package/dist/runtime.js +9 -9
  34. package/dist/testing-runtime.d.ts +2 -2
  35. package/dist/testing-runtime.js +2 -2
  36. package/dist/testing.d.ts +5 -5
  37. package/dist/testing.js +4 -4
  38. package/dist/{types-DcADVHe9.d.ts → types-B_3pObUV.d.ts} +1 -1
  39. package/dist/{types-aI4V9CWe.d.ts → types-CTeN_QAk.d.ts} +1 -1
  40. package/dist/types.d.ts +4 -0
  41. package/dist/{views-32rSsfeU.d.ts → views-Qx-EHBP8.d.ts} +27 -10
  42. package/package.json +1 -2
  43. package/dist/chunk-5IHU5CUK.js.map +0 -1
  44. package/dist/chunk-TGMXBRKY.js.map +0 -1
  45. /package/dist/{chunk-RKGJ64UN.js.map → chunk-44N3T2A5.js.map} +0 -0
  46. /package/dist/{chunk-Q322XCY2.js.map → chunk-VTK4TIXC.js.map} +0 -0
  47. /package/dist/{chunk-3QIZKXJ2.js.map → chunk-XV27IQHA.js.map} +0 -0
  48. /package/dist/{chunk-NO537WSS.js.map → chunk-YGQTL63W.js.map} +0 -0
  49. /package/dist/{chunk-VLG4YST5.js.map → chunk-ZYONCTZ2.js.map} +0 -0
@@ -36,6 +36,7 @@ __export(zod_exports, {
36
36
  OutcomeStandingSchema: () => OutcomeStandingSchema,
37
37
  OutcomeTieBreakSchema: () => OutcomeTieBreakSchema,
38
38
  ProjectSeatsDynamicRequestSchema: () => ProjectSeatsDynamicRequestSchema,
39
+ ProjectionTimingMetadataSchema: () => ProjectionTimingMetadataSchema,
39
40
  ReduceRequestSchema: () => ReduceRequestSchema,
40
41
  ReduceResultAcceptSchema: () => ReduceResultAcceptSchema,
41
42
  ReduceResultRejectSchema: () => ReduceResultRejectSchema,
@@ -122,8 +123,9 @@ var ReducerRuntimeLogEntryStateCommitSchema = z.object({ "kind": z.literal("stat
122
123
  var ReducerRuntimeLogEntrySchema = z.discriminatedUnion("kind", [ReducerRuntimeLogEntryAcceptedClientInputSchema, ReducerRuntimeLogEntryAppliedEffectSchema, ReducerRuntimeLogEntryRngConsumptionSchema, ReducerRuntimeLogEntryStateCommitSchema]);
123
124
  var SeatProjectionSchema = z.object({ "view": JsonValueSchema.optional(), "availableInteractionRefs": JsonValueSchema.optional(), "zones": JsonValueSchema.optional() }).strict();
124
125
  var SimultaneousPhaseProjectionSchema = z.object({ "phaseName": z.string().min(1), "interactionId": z.string().min(1), "actorIds": z.array(z.string().min(1)), "sealedPlayerIds": z.array(z.string().min(1)), "pendingPlayerIds": z.array(z.string().min(1)) }).strict();
125
- var SeatProjectionBundleSchema = z.object({ "currentStage": z.union([z.string().min(1), z.null()]).optional(), "stageSeats": z.array(z.string().min(1)).optional(), "simultaneousPhase": z.union([SimultaneousPhaseProjectionSchema, z.null()]).optional(), "interactionsByRef": JsonValueSchema.optional(), "seats": z.record(z.string(), SeatProjectionSchema) }).strict();
126
- var ProjectSeatsDynamicRequestSchema = z.object({ "state": ReducerSessionStateSchema, "playerIds": z.array(z.string().min(1)), "viewId": z.string().min(1).optional(), "projectionMode": z.union([z.enum(["full", "actionsOnly"]), z.null()]).optional() }).strict();
126
+ var ProjectionTimingMetadataSchema = z.object({ "resolveAvailableInteractionsMs": z.number().finite().gte(0), "resolveViewMs": z.number().finite().gte(0), "resolveZoneHandlesMs": z.number().finite().gte(0), "descriptorHashMs": z.number().finite().gte(0) }).strict();
127
+ var SeatProjectionBundleSchema = z.object({ "currentStage": z.union([z.string().min(1), z.null()]).optional(), "stageSeats": z.array(z.string().min(1)).optional(), "simultaneousPhase": z.union([SimultaneousPhaseProjectionSchema, z.null()]).optional(), "sharedView": JsonValueSchema.optional(), "interactionsByRef": JsonValueSchema.optional(), "seats": z.record(z.string(), SeatProjectionSchema), "timing": ProjectionTimingMetadataSchema.optional() }).strict();
128
+ var ProjectSeatsDynamicRequestSchema = z.object({ "state": ReducerSessionStateSchema, "playerIds": z.array(z.string().min(1)), "projectionMode": z.union([z.enum(["full", "actionsOnly"]), z.null()]).optional() }).strict();
127
129
  var BoardStaticProjectionSchema = z.object({ "view": JsonValueSchema, "hash": z.string().min(1), "manifestVersion": z.string() }).strict();
128
130
 
129
131
  // ../reducer-contract/generated/version.ts
@@ -178,4 +180,4 @@ export {
178
180
  builders_exports,
179
181
  REDUCER_CONTRACT_VERSION
180
182
  };
181
- //# sourceMappingURL=chunk-TGMXBRKY.js.map
183
+ //# sourceMappingURL=chunk-3BLN5POZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../reducer-contract/generated/zod.ts","../../reducer-contract/generated/version.ts","../../reducer-contract/generated/builders.ts"],"sourcesContent":["// @generated by packages/reducer-contract/scripts/generate-ts.mjs\n// DO NOT EDIT BY HAND. Edit schema/reducer-runtime.schema.json and rerun `pnpm generate`.\n\n/* eslint-disable */\nimport { z } from \"zod\";\n\nexport const ReducerContractVersionSchema = z.string().regex(new RegExp(\"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+$\"));\n\nexport const EffectIdSchema = z.string().min(1);\n\nlet JsonValueSchemaInternal: z.ZodType<unknown>;\nJsonValueSchemaInternal = z.lazy(() => z.union([z.record(z.string(), JsonValueSchemaInternal), z.array(JsonValueSchemaInternal), z.string(), z.number(), z.boolean(), z.null()]));\nexport const JsonValueSchema = JsonValueSchemaInternal;\n\nexport const ContinuationTokenSchema = z.object({ \"id\": z.string().min(1), \"data\": JsonValueSchema }).strict();\n\nexport const ContinuationMapSchema = z.record(z.string(), ContinuationTokenSchema);\n\nexport const ReducerSetupSelectionSchema = z.object({ \"profileId\": z.string().min(1), \"optionValues\": z.record(z.string(), z.union([z.string(), z.null()])) }).strict();\n\nexport const RngStateSchema = z.object({ \"seed\": z.union([z.number().refine(Number.isInteger, { message: \"Expected integer\" }), z.null()]), \"cursor\": z.number().int(), \"trace\": z.array(z.string()) }).strict();\n\nexport const ReducerFlowStateSchema = z.object({ \"currentPhase\": z.string().min(1), \"turn\": z.number().int(), \"round\": z.number().int(), \"activePlayers\": z.array(z.string().min(1)) }).strict();\n\nexport const RuntimeSimultaneousSubmissionSchema = z.object({ \"interactionId\": z.string().min(1), \"params\": JsonValueSchema }).strict();\n\nexport const RuntimeSimultaneousCurrentSchema = z.object({ \"phaseName\": z.string().min(1), \"actors\": z.array(z.string().min(1)), \"submissions\": z.record(z.string(), RuntimeSimultaneousSubmissionSchema) }).strict();\n\nexport const RuntimeSimultaneousStateSchema = z.object({ \"current\": z.union([RuntimeSimultaneousCurrentSchema, z.null()]) }).strict();\n\nexport const TransitionRecordSchema = z.object({ \"from\": z.string().min(1), \"to\": z.string().min(1) }).strict();\n\nexport const ReducerRuntimeStateSchema = z.object({ \"rng\": RngStateSchema, \"setup\": z.union([ReducerSetupSelectionSchema, z.null()]), \"simultaneous\": RuntimeSimultaneousStateSchema, \"lastTransition\": z.union([TransitionRecordSchema, z.null()]) }).strict();\n\nexport const ReducerDomainStateSchema = z.object({ \"table\": JsonValueSchema, \"publicState\": JsonValueSchema, \"privateState\": z.record(z.string(), JsonValueSchema), \"hiddenState\": JsonValueSchema, \"flow\": ReducerFlowStateSchema, \"phase\": JsonValueSchema }).strict();\n\nexport const ReducerSessionMetaSchema = z.object({ \"contractFingerprint\": z.string().regex(new RegExp(\"^cfp[0-9]+:[a-f0-9]{16}$\")) }).strict();\n\nexport const ReducerSessionStateSchema = z.object({ \"meta\": ReducerSessionMetaSchema.optional(), \"domain\": ReducerDomainStateSchema, \"runtime\": ReducerRuntimeStateSchema }).strict();\n\nexport const GameInputInteractionSchema = z.object({ \"kind\": z.literal(\"interaction\"), \"playerId\": z.string().min(1), \"interactionId\": z.string().min(1), \"params\": JsonValueSchema }).strict();\n\nexport const GameInputSchema = z.discriminatedUnion(\"kind\", [GameInputInteractionSchema]);\n\nexport const EffectTransitionSchema = z.object({ \"effectId\": EffectIdSchema, \"type\": z.literal(\"transition\"), \"to\": z.string().min(1) }).strict();\n\nexport const EffectRollDieSchema = z.object({ \"effectId\": EffectIdSchema, \"type\": z.literal(\"rollDie\"), \"dieId\": z.string().min(1) }).strict();\n\nexport const EffectShuffleSharedZoneSchema = z.object({ \"effectId\": EffectIdSchema, \"type\": z.literal(\"shuffleSharedZone\"), \"zoneId\": z.string().min(1) }).strict();\n\nexport const EffectShufflePlayerZoneSchema = z.object({ \"effectId\": EffectIdSchema, \"type\": z.literal(\"shufflePlayerZone\"), \"zoneId\": z.string().min(1), \"playerId\": z.string().min(1) }).strict();\n\nexport const EffectSchema = z.discriminatedUnion(\"type\", [EffectTransitionSchema, EffectRollDieSchema, EffectShuffleSharedZoneSchema, EffectShufflePlayerZoneSchema]);\n\nexport const ReducerInputValidationResultSchema = z.object({ \"valid\": z.boolean(), \"errorCode\": z.string().optional(), \"message\": z.string().optional() }).strict();\n\nexport const InitializeRequestSchema = z.object({ \"table\": JsonValueSchema, \"playerIds\": z.array(z.string().min(1)), \"rngSeed\": z.union([z.number().refine(Number.isInteger, { message: \"Expected integer\" }), z.null()]).optional(), \"setup\": z.union([ReducerSetupSelectionSchema, z.null()]).optional() }).strict();\n\nexport const InitializePhaseRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"to\": z.string().min(1) }).strict();\n\nexport const ValidateInputRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"input\": GameInputSchema }).strict();\n\nexport const ReduceRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"input\": GameInputSchema }).strict();\n\nexport const DispatchRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"input\": GameInputSchema }).strict();\n\nexport const ReduceResultRejectSchema = z.object({ \"kind\": z.literal(\"reject\"), \"errorCode\": z.string().min(1), \"message\": z.string().optional() }).strict();\n\nexport const GameOutcomeReasonSchema = z.object({ \"code\": z.string().min(1), \"message\": z.string().min(1).optional() }).strict();\n\nexport const OutcomeResultSchema = z.enum([\"win\", \"draw\", \"loss\", \"eliminated\"]);\n\nexport const OutcomeScoreComponentSchema = z.object({ \"id\": z.string().min(1), \"label\": z.string().min(1), \"value\": z.number().finite() }).strict();\n\nexport const OutcomeTieBreakSchema = z.object({ \"id\": z.string().min(1), \"label\": z.string().min(1), \"value\": z.union([z.number().finite(), z.string()]) }).strict();\n\nexport const OutcomeStandingSchema = z.object({ \"playerId\": z.string().min(1), \"rank\": z.number().int().gte(1), \"result\": OutcomeResultSchema, \"score\": z.number().finite().optional(), \"scoreBreakdown\": z.array(OutcomeScoreComponentSchema).optional(), \"tieBreaks\": z.array(OutcomeTieBreakSchema).optional() }).strict();\n\nexport const GameOutcomeSchema = z.object({ \"reason\": GameOutcomeReasonSchema, \"standings\": z.array(OutcomeStandingSchema).min(1) }).strict();\n\nexport const GameEventDetailSchema = z.object({ \"label\": z.string().min(1), \"value\": z.union([z.string(), z.number().finite(), z.boolean()]) }).strict();\n\nexport const SystemActionEventSchema = z.object({ \"kind\": z.literal(\"systemAction\"), \"procedureId\": z.string().min(1), \"title\": z.string().min(1), \"summary\": z.string().min(1).optional(), \"details\": z.array(GameEventDetailSchema).max(16).optional() }).strict();\n\nexport const GameEventSchema = z.discriminatedUnion(\"kind\", [SystemActionEventSchema]);\n\nexport const ReduceResultAcceptSchema = z.object({ \"kind\": z.literal(\"accept\"), \"state\": ReducerSessionStateSchema, \"terminal\": GameOutcomeSchema.optional(), \"effects\": z.array(EffectSchema), \"continuations\": ContinuationMapSchema, \"events\": z.array(GameEventSchema).max(32) }).strict();\n\nexport const ReduceResultSchema = z.discriminatedUnion(\"kind\", [ReduceResultRejectSchema, ReduceResultAcceptSchema]);\n\nexport const DispatchTraceAcceptedClientInputSchema = z.object({ \"kind\": z.literal(\"acceptedClientInput\"), \"input\": GameInputSchema }).strict();\n\nexport const DispatchTraceAppliedEffectSchema = z.object({ \"kind\": z.literal(\"appliedEffect\"), \"effect\": EffectSchema, \"continuation\": ContinuationTokenSchema.optional() }).strict();\n\nexport const DispatchTraceRngConsumptionSchema = z.object({ \"kind\": z.literal(\"rngConsumption\"), \"operation\": z.string().min(1), \"traceEntry\": z.string() }).strict();\n\nexport const DispatchTraceSchema = z.discriminatedUnion(\"kind\", [DispatchTraceAcceptedClientInputSchema, DispatchTraceAppliedEffectSchema, DispatchTraceRngConsumptionSchema]);\n\nexport const DispatchResultRejectSchema = z.object({ \"kind\": z.literal(\"reject\"), \"errorCode\": z.string().min(1), \"message\": z.string().optional() }).strict();\n\nexport const DispatchResultAcceptSchema = z.object({ \"kind\": z.literal(\"accept\"), \"state\": ReducerSessionStateSchema, \"terminal\": GameOutcomeSchema.optional(), \"trace\": z.array(DispatchTraceSchema), \"events\": z.array(GameEventSchema).max(32) }).strict();\n\nexport const DispatchResultSchema = z.discriminatedUnion(\"kind\", [DispatchResultRejectSchema, DispatchResultAcceptSchema]);\n\nexport const ReducerRuntimeLogEntryAcceptedClientInputSchema = z.object({ \"kind\": z.literal(\"acceptedClientInput\"), \"version\": z.number().int(), \"input\": GameInputSchema }).strict();\n\nexport const ReducerRuntimeLogEntryAppliedEffectSchema = z.object({ \"kind\": z.literal(\"appliedEffect\"), \"version\": z.number().int(), \"effect\": EffectSchema, \"continuation\": z.union([ContinuationTokenSchema, z.null()]) }).strict();\n\nexport const ReducerRuntimeLogEntryRngConsumptionSchema = z.object({ \"kind\": z.literal(\"rngConsumption\"), \"version\": z.number().int(), \"operation\": z.string().min(1), \"traceEntry\": z.string() }).strict();\n\nexport const ReducerRuntimeLogEntryStateCommitSchema = z.object({ \"kind\": z.literal(\"stateCommit\"), \"version\": z.number().int(), \"state\": ReducerSessionStateSchema }).strict();\n\nexport const ReducerRuntimeLogEntrySchema = z.discriminatedUnion(\"kind\", [ReducerRuntimeLogEntryAcceptedClientInputSchema, ReducerRuntimeLogEntryAppliedEffectSchema, ReducerRuntimeLogEntryRngConsumptionSchema, ReducerRuntimeLogEntryStateCommitSchema]);\n\nexport const SeatProjectionSchema = z.object({ \"view\": JsonValueSchema.optional(), \"availableInteractionRefs\": JsonValueSchema.optional(), \"zones\": JsonValueSchema.optional() }).strict();\n\nexport const SimultaneousPhaseProjectionSchema = z.object({ \"phaseName\": z.string().min(1), \"interactionId\": z.string().min(1), \"actorIds\": z.array(z.string().min(1)), \"sealedPlayerIds\": z.array(z.string().min(1)), \"pendingPlayerIds\": z.array(z.string().min(1)) }).strict();\n\nexport const ProjectionTimingMetadataSchema = z.object({ \"resolveAvailableInteractionsMs\": z.number().finite().gte(0), \"resolveViewMs\": z.number().finite().gte(0), \"resolveZoneHandlesMs\": z.number().finite().gte(0), \"descriptorHashMs\": z.number().finite().gte(0) }).strict();\n\nexport const SeatProjectionBundleSchema = z.object({ \"currentStage\": z.union([z.string().min(1), z.null()]).optional(), \"stageSeats\": z.array(z.string().min(1)).optional(), \"simultaneousPhase\": z.union([SimultaneousPhaseProjectionSchema, z.null()]).optional(), \"sharedView\": JsonValueSchema.optional(), \"interactionsByRef\": JsonValueSchema.optional(), \"seats\": z.record(z.string(), SeatProjectionSchema), \"timing\": ProjectionTimingMetadataSchema.optional() }).strict();\n\nexport const ProjectSeatsDynamicRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"playerIds\": z.array(z.string().min(1)), \"projectionMode\": z.union([z.enum([\"full\", \"actionsOnly\"]), z.null()]).optional() }).strict();\n\nexport const BoardStaticProjectionSchema = z.object({ \"view\": JsonValueSchema, \"hash\": z.string().min(1), \"manifestVersion\": z.string() }).strict();\n","// @generated by packages/reducer-contract/scripts/generate-ts.mjs\n// DO NOT EDIT BY HAND. Edit schema/reducer-runtime.schema.json and rerun `pnpm generate`.\n\n/**\n * The wire-protocol version this package implements. Bumped in lockstep with\n * any breaking change to schema/reducer-runtime.schema.json. At bundle load\n * time hosts refuse bundles whose major version differs.\n */\nexport const REDUCER_CONTRACT_VERSION = \"0.3.0\" as const;\n","// @generated by packages/reducer-contract/scripts/generate-ts.mjs\n// DO NOT EDIT BY HAND. Edit schema/reducer-runtime.schema.json and rerun `pnpm generate`.\n\n/* eslint-disable */\nimport type * as Wire from \"./wire\";\n\n/**\n * Typed effect constructors. Authors MUST go through these; hand-constructing\n * Wire.Effect objects is banned by convention because it's how wire drift\n * re-enters the codebase.\n *\n * The `effectId` is minted by the runtime (see createEffectIdMinter below),\n * not by the author. Each builder returns a `PendingEffect` that carries\n * the optional continuation; the reducer bundle's accept materializer splits\n * pending effects into the wire's `effects[]` + `continuations` map.\n */\n\nexport type PendingEffect = Wire.Effect & {\n readonly __continuation?: Wire.ContinuationToken;\n};\n\nexport type EffectIdMinter = () => Wire.EffectId;\n\n/**\n * Produces sequential, deterministic effect ids scoped to a single accept\n * payload: \"ef0\", \"ef1\", ... . Uniqueness only needs to be local to the\n * payload because the host consumes and discards them per dispatch.\n */\nexport function createEffectIdMinter(): EffectIdMinter {\n let i = 0;\n return () => `ef${i++}` as Wire.EffectId;\n}\n\nexport type EffectBuilders = {\n transition(args: { to: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n rollDie(args: { dieId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n shuffleSharedZone(args: { zoneId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n shufflePlayerZone(args: { zoneId: string; playerId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n};\n\nexport function createEffectBuilders(mint: EffectIdMinter): EffectBuilders {\n return {\n transition(args, continuation) {\n const effect = { effectId: mint(), type: \"transition\" as const, to: args.to };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n rollDie(args, continuation) {\n const effect = { effectId: mint(), type: \"rollDie\" as const, dieId: args.dieId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n shuffleSharedZone(args, continuation) {\n const effect = { effectId: mint(), type: \"shuffleSharedZone\" as const, zoneId: args.zoneId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n shufflePlayerZone(args, continuation) {\n const effect = { effectId: mint(), type: \"shufflePlayerZone\" as const, zoneId: args.zoneId, playerId: args.playerId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n };\n}\n\n/**\n * Takes a list of PendingEffects and splits them into the canonical wire\n * shape: `effects[]` (stripped of `__continuation`) + `continuations` map\n * keyed by effectId. Use at the boundary where reduce/dispatch results leave\n * author code and enter the wire.\n */\nexport function materializeAccept(pending: ReadonlyArray<PendingEffect>): {\n effects: Wire.Effect[];\n continuations: Wire.ContinuationMap;\n} {\n const effects: Wire.Effect[] = [];\n const continuations: Wire.ContinuationMap = {};\n for (const pe of pending) {\n const { __continuation, ...effect } = pe as PendingEffect & { __continuation?: Wire.ContinuationToken };\n effects.push(effect as Wire.Effect);\n if (__continuation !== undefined) {\n continuations[(effect as Wire.Effect).effectId] = __continuation;\n }\n }\n return { effects, continuations };\n}\n"],"mappings":"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","names":[]}
@@ -11,7 +11,7 @@ import {
11
11
  usePluginSession,
12
12
  usePluginSessionDescriptor,
13
13
  useRuntimeContext
14
- } from "./chunk-VLG4YST5.js";
14
+ } from "./chunk-ZYONCTZ2.js";
15
15
  import {
16
16
  CardDragSurface,
17
17
  CardDropTargetView,
@@ -5976,4 +5976,4 @@ export {
5976
5976
  DiceValues,
5977
5977
  Dice
5978
5978
  };
5979
- //# sourceMappingURL=chunk-RKGJ64UN.js.map
5979
+ //# sourceMappingURL=chunk-44N3T2A5.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-3OZMHZK3.js";
4
4
  import {
5
5
  computePluginActionSetVersion
6
- } from "./chunk-5IHU5CUK.js";
6
+ } from "./chunk-IYX5OO2K.js";
7
7
 
8
8
  // src/testing/create-expect-api.ts
9
9
  function isRecord(value) {
@@ -476,6 +476,10 @@ function buildPluginFrame(options) {
476
476
  availableInteractions
477
477
  }),
478
478
  perspectivePlayerId: options.playerId || null,
479
+ sharedView: {
480
+ boardStatic: null,
481
+ dynamicView: projection.sharedView === void 0 ? null : projection.sharedView
482
+ },
479
483
  view: seat?.view ?? null,
480
484
  flow: {
481
485
  currentPhase: flow.currentPhase,
@@ -656,4 +660,4 @@ export {
656
660
  createExpectApi,
657
661
  createTestRuntime
658
662
  };
659
- //# sourceMappingURL=chunk-IU6KGPY7.js.map
663
+ //# sourceMappingURL=chunk-5CQIJHGF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/testing/create-expect-api.ts","../src/testing/create-test-runtime.ts"],"sourcesContent":["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\";\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 = Object.getPrototypeOf(actual);\n const expectedPrototype = 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 throw new Error(\"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 throw new Error(mismatch);\n }\n}\n\nfunction createSubmissionErrorMatcher(\n actual: unknown,\n expected: RejectionExpectation,\n options: CreateExpectApiOptions,\n): Promise<void> {\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()\n .then(() => {\n throw new Error(\"Expected promise to reject.\");\n })\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n throw new Error(\"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 throw new Error(\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 throw new Error(\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 throw new Error(\n `Expected rejection message '${error.message}' to match ${String(\n expected.message,\n )}.${formatLastDiagnosticRejection(options)}`,\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 throw new Error(\"toHaveLength expects a value with a numeric length.\");\n }\n const length = (actual as { length: number }).length;\n if (length !== expected) {\n throw new Error(`Expected length ${expected}, received ${length}.`);\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 throw new Error(\"toThrow expects a function.\");\n }\n try {\n (actual as () => unknown)();\n } catch (error) {\n if (!(error instanceof Error)) {\n throw new Error(\"Thrown value is not an Error.\");\n }\n if (predicate === undefined) {\n return;\n }\n if (typeof predicate === \"string\" && error.message !== predicate) {\n throw new Error(\n `Expected thrown message '${predicate}', received '${error.message}'.`,\n );\n }\n if (predicate instanceof RegExp && !predicate.test(error.message)) {\n throw new Error(\n `Expected thrown message '${error.message}' to match ${String(predicate)}.`,\n );\n }\n if (typeof predicate === \"function\" && !predicate(error)) {\n throw new Error(\"Thrown error did not satisfy predicate.\");\n }\n return;\n }\n throw new Error(\"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 throw new Error(\n `Expected '${String(actual)}' to be '${String(expected)}'.`,\n );\n }\n },\n toEqual: (expected: unknown) => {\n if (!isDeepStrictEqual(actual, expected)) {\n throw new Error(\"Expected values to be deeply equal.\");\n }\n },\n toMatchObject: (expected: Record<string, unknown>) => {\n const mismatch = matchPartial(actual, expected);\n if (mismatch) {\n throw new Error(mismatch);\n }\n },\n toBeDefined: () => {\n if (actual === undefined) {\n throw new Error(\"Expected value to be defined.\");\n }\n },\n toBeUndefined: () => {\n if (actual !== undefined) {\n throw new Error(\n `Expected value to be undefined, but received '${String(actual)}'.`,\n );\n }\n },\n toBeNull: () => {\n if (actual !== null) {\n throw new Error(\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 throw new Error(\"Expected array to contain value.\");\n }\n return;\n }\n if (typeof actual === \"string\") {\n if (!actual.includes(String(expected))) {\n throw new Error(\"Expected string to contain value.\");\n }\n return;\n }\n throw new Error(\"toContain expects an array or string actual value.\");\n },\n toContainEqual: (expected: unknown) => {\n if (!Array.isArray(actual)) {\n throw new Error(\"toContainEqual expects an array actual value.\");\n }\n if (!actual.some((value) => isDeepStrictEqual(value, expected))) {\n throw new Error(\"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 throw new Error(\"toBeGreaterThan expects a number actual value.\");\n }\n if (actual <= expected) {\n throw new Error(`Expected ${actual} to be > ${expected}.`);\n }\n },\n toBeGreaterThanOrEqual: (expected: number) => {\n if (typeof actual !== \"number\") {\n throw new Error(\n \"toBeGreaterThanOrEqual expects a number actual value.\",\n );\n }\n if (actual < expected) {\n throw new Error(`Expected ${actual} to be >= ${expected}.`);\n }\n },\n toThrow: (predicate) => {\n assertThrown(actual, predicate);\n },\n toMatchSnapshot: (filename) => {\n if (!options.matchSnapshot) {\n throw new Error(\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 throw new Error(`Expected interaction '${interactionId}' to exist.`);\n }\n assertDescriptorMatches(descriptor, opts);\n },\n toBeGatedBy: (reason, opts) => {\n const descriptor = Array.isArray(actual)\n ? (() => {\n if (!opts?.interactionId) {\n throw new Error(\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 throw new Error(\"Expected interaction descriptor to exist.\");\n }\n if (descriptor.availability?.status === \"available\") {\n throw new Error(\"Expected interaction to be unavailable.\");\n }\n const actualReason =\n descriptor.availability?.status === \"notYourTurn\" ||\n descriptor.availability?.status === \"insufficientResources\" ||\n descriptor.availability?.status === \"blocked\"\n ? descriptor.availability.reason\n : undefined;\n if (actualReason !== reason) {\n throw new Error(\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 throw new Error(\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 throw new Error(\n `Expected interaction descriptor to exist.${formatInteractionExplanation(\n explanation,\n )}`,\n );\n }\n if (descriptor.availability?.status !== \"available\") {\n throw new Error(\n `Expected interaction '${descriptor.interactionId ?? \"unknown\"}' to be available.${formatInteractionExplanation(\n explanation,\n )}`,\n );\n }\n },\n toBeActiveFor: (playerId, opts) => {\n const descriptor = Array.isArray(actual)\n ? (() => {\n if (!opts?.interactionId) {\n throw new Error(\n \"toBeActiveFor 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 throw new Error(\"Expected interaction descriptor to exist.\");\n }\n if (descriptor.context?.to !== playerId) {\n throw new Error(\n `Expected interaction to target '${playerId}', received '${\n descriptor.context?.to ?? \"undefined\"\n }'.`,\n );\n }\n if (descriptor.availability?.status !== \"available\") {\n throw new Error(\"Expected interaction to be available.\");\n }\n },\n not: {\n toHaveInteraction: (interactionId) => {\n const descriptors = asDescriptorList(actual);\n if (findInteraction(descriptors, interactionId)) {\n throw new Error(\n `Expected interaction '${interactionId}' to be absent.`,\n );\n }\n },\n },\n });\n\n return (actual: unknown) => buildMatchers(actual);\n}\n","import type {\n ReducerBundleContract,\n Wire,\n} from \"@dreamboard-games/reducer-contract\";\nimport type { InteractionDescriptor } from \"../runtime/reducer.js\";\nimport {\n computePluginActionSetVersion,\n type InteractionDescriptor as ContractInteractionDescriptor,\n type ZoneHandlesSnapshot as ContractZoneHandlesSnapshot,\n type PluginGameplayFrame,\n type PluginSessionDescriptor,\n} from \"@dreamboard-games/plugin-runtime-contract\";\nimport type {\n RuntimeAPI,\n SubmissionError,\n ValidationResult,\n} from \"../runtime/types/runtime-api.js\";\nimport type { PluginSessionState as RuntimePluginSessionState } from \"../runtime/types/runtime-api.js\";\nimport type {\n DispatchTraceSummaryEntry,\n ReducerDiagnosticEvent,\n} from \"../reducer/diagnostics.js\";\nimport { StaleContractArtifactError } from \"../reducer/stale-contract-artifact-error.js\";\nimport type { InteractionExplanationLike } from \"./definitions.js\";\n\ntype ReducerBundleLike = Pick<\n ReducerBundleContract,\n \"projectSeatsDynamic\" | \"validateInput\" | \"dispatch\"\n> & {\n explainInteraction?: (input: {\n state: Wire.ReducerSessionState;\n playerId: string;\n interactionId: string;\n }) => InteractionExplanationLike;\n};\n\ntype DeepReadonly<T> = T extends (...args: readonly unknown[]) => unknown\n ? T\n : T extends readonly (infer Item)[]\n ? readonly DeepReadonly<Item>[]\n : T extends object\n ? { readonly [Key in keyof T]: DeepReadonly<T[Key]> }\n : T;\n\ntype DeepMutable<T> = T extends (...args: readonly unknown[]) => unknown\n ? T\n : T extends readonly (infer Item)[]\n ? DeepMutable<Item>[]\n : T extends object\n ? { -readonly [Key in keyof T]: DeepMutable<T[Key]> }\n : T;\n\ntype BaseStateArtifact = {\n snapshot: DeepReadonly<Wire.ReducerSessionState>;\n fingerprint: {\n players: number;\n contractFingerprint?: string;\n };\n};\n\ntype WireZoneHandles = {\n cardIds?: readonly string[];\n cardViewsById?: Readonly<Record<string, string>>;\n playableByCardId?: Readonly<Record<string, readonly string[]>>;\n};\n\nexport type CreateTestRuntimeOptions = {\n baseId: string;\n baseStates: Record<string, BaseStateArtifact>;\n bundle: ReducerBundleLike;\n phase?: string;\n playerIds?: readonly string[];\n sessionId?: string;\n userId?: string | null;\n gameId?: string;\n displayNameByPlayerId?: Record<string, string>;\n contractFingerprint?: string;\n expectedBaseStateFingerprint?: string;\n};\n\nexport type CreatedTestRuntime = {\n runtime: RuntimeAPI;\n getFrame(): PluginGameplayFrame;\n getSessionDescriptor(): PluginSessionDescriptor;\n players(): readonly string[];\n seat(index: number): string;\n submit(\n playerId: string,\n interactionId: string,\n params?: unknown,\n ): Promise<void>;\n validate(\n playerId: string,\n interactionId: string,\n params?: unknown,\n ): Promise<ValidationResult>;\n explain(playerId: string, interactionId: string): InteractionExplanationLike;\n diagnostics: {\n readonly events: readonly ReducerDiagnosticEvent[];\n readonly lastDispatch: {\n submissionId: string;\n trace: readonly DispatchTraceSummaryEntry[];\n } | null;\n clear(): void;\n };\n};\n\nfunction cloneState<T>(value: T): DeepMutable<T> {\n return structuredClone(value) as DeepMutable<T>;\n}\n\nfunction createSubmissionError(\n errorCode: string | undefined,\n message: string | undefined,\n): SubmissionError {\n const error = new Error(message ?? \"Interaction rejected\") as SubmissionError;\n error.name = \"SubmissionError\";\n error.errorCode = errorCode;\n return error;\n}\n\nfunction summarizeWireTrace(\n trace: readonly unknown[] | undefined,\n): DispatchTraceSummaryEntry[] {\n return (trace ?? []).flatMap((entry): DispatchTraceSummaryEntry[] => {\n if (typeof entry !== \"object\" || entry === null) return [];\n const record = entry as Record<string, unknown>;\n switch (record.kind) {\n case \"acceptedClientInput\": {\n const input =\n typeof record.input === \"object\" && record.input !== null\n ? (record.input as Record<string, unknown>)\n : {};\n return [\n {\n kind: \"acceptedClientInput\",\n interactionId: String(input.interactionId ?? \"\"),\n playerId: String(input.playerId ?? \"\"),\n },\n ];\n }\n case \"appliedEffect\": {\n const effect =\n typeof record.effect === \"object\" && record.effect !== null\n ? (record.effect as Record<string, unknown>)\n : {};\n return [\n {\n kind: \"appliedInstruction\",\n instruction: String(effect.kind ?? effect.type ?? \"effect\"),\n },\n ];\n }\n case \"rngConsumption\":\n return [\n {\n kind: \"rngConsumption\",\n operation: String(record.operation ?? \"\"),\n traceEntry: String(record.traceEntry ?? \"\"),\n },\n ];\n default:\n return [];\n }\n });\n}\n\nfunction readFlowState(state: Wire.ReducerSessionState): {\n currentPhase: string | null;\n activePlayers: string[];\n} {\n const flow = ((\n state.domain as\n | { flow?: { currentPhase?: string; activePlayers?: string[] } }\n | undefined\n )?.flow ?? {}) as {\n currentPhase?: string;\n activePlayers?: string[];\n };\n return {\n currentPhase: flow.currentPhase ?? null,\n activePlayers: Array.isArray(flow.activePlayers) ? flow.activePlayers : [],\n };\n}\n\nfunction resolvePlayerIds(options: {\n baseState: BaseStateArtifact;\n explicitPlayerIds?: readonly string[];\n}): string[] {\n if (options.explicitPlayerIds && options.explicitPlayerIds.length > 0) {\n return [...options.explicitPlayerIds];\n }\n return Array.from(\n { length: options.baseState.fingerprint.players },\n (_, index) => `player-${index + 1}`,\n );\n}\n\nfunction isWireZoneHandles(value: unknown): value is WireZoneHandles {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction buildPluginFrame(options: {\n state: Wire.ReducerSessionState;\n bundle: ReducerBundleLike;\n playerId: string;\n version: number;\n expectedPhase: string | undefined;\n baseId: string;\n}): PluginGameplayFrame {\n const projection = options.bundle.projectSeatsDynamic({\n state: options.state,\n playerIds: [options.playerId],\n });\n\n const flow = readFlowState(options.state);\n if (options.expectedPhase && flow.currentPhase !== options.expectedPhase) {\n throw new Error(\n `Expected base '${options.baseId}' to be in phase '${options.expectedPhase}', received '${\n flow.currentPhase ?? \"null\"\n }'.`,\n );\n }\n\n const interactionsByRef =\n (projection.interactionsByRef as\n | Record<string, InteractionDescriptor>\n | undefined) ?? {};\n const hydrateRefs = (\n refs: readonly string[] | undefined,\n ): ContractInteractionDescriptor[] =>\n (refs ?? [])\n .map((ref) => interactionsByRef[ref])\n .filter((descriptor): descriptor is InteractionDescriptor =>\n Boolean(descriptor),\n ) as ContractInteractionDescriptor[];\n\n const seat = projection.seats?.[options.playerId];\n const zones = Object.fromEntries(\n Object.entries(\n (seat?.zones as Record<string, unknown> | undefined) ?? {},\n ).map(([zoneId, zoneValue]) => {\n const zone = isWireZoneHandles(zoneValue) ? zoneValue : {};\n return [\n zoneId,\n {\n cardIds: [...(zone.cardIds ?? [])],\n cardViewsById: { ...(zone.cardViewsById ?? {}) },\n playableByCardId: Object.fromEntries(\n Object.entries(zone.playableByCardId ?? {}).map(\n ([cardId, refs]) => [cardId, hydrateRefs(refs)],\n ),\n ),\n } satisfies ContractZoneHandlesSnapshot,\n ];\n }),\n ) as PluginGameplayFrame[\"zones\"];\n\n const availableInteractions = hydrateRefs(\n seat?.availableInteractionRefs as readonly string[] | undefined,\n );\n return {\n gameVersion: options.version,\n actionSetVersion: computePluginActionSetVersion({\n gameVersion: options.version,\n availableInteractions,\n }),\n perspectivePlayerId: options.playerId || null,\n view: seat?.view ?? null,\n flow: {\n currentPhase: flow.currentPhase,\n currentStage: projection.currentStage ?? null,\n activePlayers: flow.activePlayers,\n simultaneousPhase: projection.simultaneousPhase ?? null,\n },\n availableInteractions,\n recentEvents: [],\n zones,\n };\n}\n\nexport function createTestRuntime(\n options: CreateTestRuntimeOptions,\n): CreatedTestRuntime {\n const baseState = options.baseStates[options.baseId];\n if (!baseState) {\n throw new Error(`Unknown test base '${options.baseId}'.`);\n }\n const expectedBaseStateFingerprint =\n options.expectedBaseStateFingerprint ??\n baseState.fingerprint.contractFingerprint;\n if (\n options.contractFingerprint &&\n expectedBaseStateFingerprint &&\n options.contractFingerprint !== expectedBaseStateFingerprint\n ) {\n throw new StaleContractArtifactError({\n artifact: \"base-states\",\n expected: options.contractFingerprint,\n found: expectedBaseStateFingerprint,\n });\n }\n\n let currentState = cloneState(baseState.snapshot);\n const playerIds = resolvePlayerIds({\n baseState,\n explicitPlayerIds: options.playerIds,\n });\n const sessionId = options.sessionId ?? \"test-session\";\n const sessionDescriptor: PluginSessionDescriptor = {\n sessionId,\n players: playerIds.map((playerId) => ({\n playerId,\n displayName: options.displayNameByPlayerId?.[playerId] ?? playerId,\n })),\n };\n\n let version = 0;\n let submissionCounter = 0;\n const currentPlayerId = playerIds[0] ?? \"\";\n const diagnosticEvents: ReducerDiagnosticEvent[] = [];\n let lastDispatch: {\n submissionId: string;\n trace: readonly DispatchTraceSummaryEntry[];\n } | null = null;\n const toReadySessionState = (\n frame: PluginGameplayFrame,\n ): RuntimePluginSessionState => ({\n status: \"ready\",\n sessionId,\n controllingPlayerId: frame.perspectivePlayerId,\n });\n\n let lastPluginFrame: PluginGameplayFrame;\n let lastSessionState: RuntimePluginSessionState;\n\n const applyCurrentState = (): void => {\n version += 1;\n lastPluginFrame = buildPluginFrame({\n state: currentState,\n bundle: options.bundle,\n playerId: currentPlayerId,\n version,\n expectedPhase: version === 1 ? options.phase : undefined,\n baseId: options.baseId,\n });\n lastSessionState = toReadySessionState(lastPluginFrame);\n };\n\n applyCurrentState();\n\n const validate = async (\n playerId: string,\n interactionId: string,\n params: unknown = {},\n ): Promise<ValidationResult> => {\n const result = await options.bundle.validateInput({\n state: currentState,\n input: {\n kind: \"interaction\",\n playerId,\n interactionId,\n params: params as Wire.JsonValue,\n },\n });\n return {\n valid: result.valid,\n errorCode: result.errorCode,\n message: result.message,\n };\n };\n\n const submit = async (\n playerId: string,\n interactionId: string,\n params: unknown = {},\n ): Promise<void> => {\n submissionCounter += 1;\n const submissionId = `sub-${submissionCounter}`;\n diagnosticEvents.push({\n type: \"submitReceived\",\n submissionId,\n playerId,\n interactionId,\n phase: readFlowState(currentState).currentPhase ?? \"\",\n });\n const validation = await validate(playerId, interactionId, params);\n if (!validation.valid) {\n diagnosticEvents.push({\n type: \"submitRejected\",\n submissionId,\n errorCode: validation.errorCode ?? \"invalid-action\",\n ...(validation.message ? { message: validation.message } : {}),\n });\n throw createSubmissionError(validation.errorCode, validation.message);\n }\n const result = await options.bundle.dispatch({\n state: currentState,\n input: {\n kind: \"interaction\",\n playerId,\n interactionId,\n params: params as Wire.JsonValue,\n },\n });\n if (result.kind === \"reject\") {\n diagnosticEvents.push({\n type: \"submitRejected\",\n submissionId,\n errorCode: result.errorCode,\n ...(result.message ? { message: result.message } : {}),\n });\n throw createSubmissionError(result.errorCode, result.message);\n }\n const trace = summarizeWireTrace(result.trace);\n lastDispatch = { submissionId, trace };\n diagnosticEvents.push({\n type: \"submitAccepted\",\n submissionId,\n trace,\n });\n currentState = cloneState(result.state);\n applyCurrentState();\n };\n\n const explain = (\n playerId: string,\n interactionId: string,\n ): InteractionExplanationLike => {\n if (!options.bundle.explainInteraction) {\n throw new Error(\n \"This reducer bundle does not expose explainInteraction().\",\n );\n }\n return options.bundle.explainInteraction({\n state: currentState,\n playerId,\n interactionId,\n });\n };\n\n const runtime = {\n validateInteraction: (interactionId: string, params?: unknown) =>\n validate(currentPlayerId, interactionId, params),\n submitInteraction: (interactionId: string, params?: unknown) =>\n submit(currentPlayerId, interactionId, params),\n getSessionState: (): RuntimePluginSessionState => lastSessionState,\n disconnect: () => undefined,\n };\n\n return {\n runtime,\n getFrame: () => lastPluginFrame,\n getSessionDescriptor: () => sessionDescriptor,\n players: () => [...playerIds],\n seat: (index: number) => {\n if (!Number.isInteger(index) || index < 0 || index >= playerIds.length) {\n throw new Error(\n `seat(${index}) is out of range; base '${options.baseId}' has ${playerIds.length} player(s).`,\n );\n }\n return playerIds[index]!;\n },\n submit,\n validate,\n explain,\n diagnostics: {\n get events() {\n return diagnosticEvents;\n },\n get lastDispatch() {\n return lastDispatch;\n },\n clear() {\n diagnosticEvents.length = 0;\n lastDispatch = null;\n },\n },\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/testing/create-expect-api.ts","../src/testing/create-test-runtime.ts"],"sourcesContent":["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\";\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 = Object.getPrototypeOf(actual);\n const expectedPrototype = 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 throw new Error(\"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 throw new Error(mismatch);\n }\n}\n\nfunction createSubmissionErrorMatcher(\n actual: unknown,\n expected: RejectionExpectation,\n options: CreateExpectApiOptions,\n): Promise<void> {\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()\n .then(() => {\n throw new Error(\"Expected promise to reject.\");\n })\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n throw new Error(\"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 throw new Error(\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 throw new Error(\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 throw new Error(\n `Expected rejection message '${error.message}' to match ${String(\n expected.message,\n )}.${formatLastDiagnosticRejection(options)}`,\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 throw new Error(\"toHaveLength expects a value with a numeric length.\");\n }\n const length = (actual as { length: number }).length;\n if (length !== expected) {\n throw new Error(`Expected length ${expected}, received ${length}.`);\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 throw new Error(\"toThrow expects a function.\");\n }\n try {\n (actual as () => unknown)();\n } catch (error) {\n if (!(error instanceof Error)) {\n throw new Error(\"Thrown value is not an Error.\");\n }\n if (predicate === undefined) {\n return;\n }\n if (typeof predicate === \"string\" && error.message !== predicate) {\n throw new Error(\n `Expected thrown message '${predicate}', received '${error.message}'.`,\n );\n }\n if (predicate instanceof RegExp && !predicate.test(error.message)) {\n throw new Error(\n `Expected thrown message '${error.message}' to match ${String(predicate)}.`,\n );\n }\n if (typeof predicate === \"function\" && !predicate(error)) {\n throw new Error(\"Thrown error did not satisfy predicate.\");\n }\n return;\n }\n throw new Error(\"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 throw new Error(\n `Expected '${String(actual)}' to be '${String(expected)}'.`,\n );\n }\n },\n toEqual: (expected: unknown) => {\n if (!isDeepStrictEqual(actual, expected)) {\n throw new Error(\"Expected values to be deeply equal.\");\n }\n },\n toMatchObject: (expected: Record<string, unknown>) => {\n const mismatch = matchPartial(actual, expected);\n if (mismatch) {\n throw new Error(mismatch);\n }\n },\n toBeDefined: () => {\n if (actual === undefined) {\n throw new Error(\"Expected value to be defined.\");\n }\n },\n toBeUndefined: () => {\n if (actual !== undefined) {\n throw new Error(\n `Expected value to be undefined, but received '${String(actual)}'.`,\n );\n }\n },\n toBeNull: () => {\n if (actual !== null) {\n throw new Error(\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 throw new Error(\"Expected array to contain value.\");\n }\n return;\n }\n if (typeof actual === \"string\") {\n if (!actual.includes(String(expected))) {\n throw new Error(\"Expected string to contain value.\");\n }\n return;\n }\n throw new Error(\"toContain expects an array or string actual value.\");\n },\n toContainEqual: (expected: unknown) => {\n if (!Array.isArray(actual)) {\n throw new Error(\"toContainEqual expects an array actual value.\");\n }\n if (!actual.some((value) => isDeepStrictEqual(value, expected))) {\n throw new Error(\"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 throw new Error(\"toBeGreaterThan expects a number actual value.\");\n }\n if (actual <= expected) {\n throw new Error(`Expected ${actual} to be > ${expected}.`);\n }\n },\n toBeGreaterThanOrEqual: (expected: number) => {\n if (typeof actual !== \"number\") {\n throw new Error(\n \"toBeGreaterThanOrEqual expects a number actual value.\",\n );\n }\n if (actual < expected) {\n throw new Error(`Expected ${actual} to be >= ${expected}.`);\n }\n },\n toThrow: (predicate) => {\n assertThrown(actual, predicate);\n },\n toMatchSnapshot: (filename) => {\n if (!options.matchSnapshot) {\n throw new Error(\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 throw new Error(`Expected interaction '${interactionId}' to exist.`);\n }\n assertDescriptorMatches(descriptor, opts);\n },\n toBeGatedBy: (reason, opts) => {\n const descriptor = Array.isArray(actual)\n ? (() => {\n if (!opts?.interactionId) {\n throw new Error(\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 throw new Error(\"Expected interaction descriptor to exist.\");\n }\n if (descriptor.availability?.status === \"available\") {\n throw new Error(\"Expected interaction to be unavailable.\");\n }\n const actualReason =\n descriptor.availability?.status === \"notYourTurn\" ||\n descriptor.availability?.status === \"insufficientResources\" ||\n descriptor.availability?.status === \"blocked\"\n ? descriptor.availability.reason\n : undefined;\n if (actualReason !== reason) {\n throw new Error(\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 throw new Error(\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 throw new Error(\n `Expected interaction descriptor to exist.${formatInteractionExplanation(\n explanation,\n )}`,\n );\n }\n if (descriptor.availability?.status !== \"available\") {\n throw new Error(\n `Expected interaction '${descriptor.interactionId ?? \"unknown\"}' to be available.${formatInteractionExplanation(\n explanation,\n )}`,\n );\n }\n },\n toBeActiveFor: (playerId, opts) => {\n const descriptor = Array.isArray(actual)\n ? (() => {\n if (!opts?.interactionId) {\n throw new Error(\n \"toBeActiveFor 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 throw new Error(\"Expected interaction descriptor to exist.\");\n }\n if (descriptor.context?.to !== playerId) {\n throw new Error(\n `Expected interaction to target '${playerId}', received '${\n descriptor.context?.to ?? \"undefined\"\n }'.`,\n );\n }\n if (descriptor.availability?.status !== \"available\") {\n throw new Error(\"Expected interaction to be available.\");\n }\n },\n not: {\n toHaveInteraction: (interactionId) => {\n const descriptors = asDescriptorList(actual);\n if (findInteraction(descriptors, interactionId)) {\n throw new Error(\n `Expected interaction '${interactionId}' to be absent.`,\n );\n }\n },\n },\n });\n\n return (actual: unknown) => buildMatchers(actual);\n}\n","import type {\n ReducerBundleContract,\n Wire,\n} from \"@dreamboard-games/reducer-contract\";\nimport type { InteractionDescriptor } from \"../runtime/reducer.js\";\nimport {\n computePluginActionSetVersion,\n type InteractionDescriptor as ContractInteractionDescriptor,\n type ZoneHandlesSnapshot as ContractZoneHandlesSnapshot,\n type PluginGameplayFrame,\n type PluginSessionDescriptor,\n} from \"@dreamboard-games/plugin-runtime-contract\";\nimport type {\n RuntimeAPI,\n SubmissionError,\n ValidationResult,\n} from \"../runtime/types/runtime-api.js\";\nimport type { PluginSessionState as RuntimePluginSessionState } from \"../runtime/types/runtime-api.js\";\nimport type {\n DispatchTraceSummaryEntry,\n ReducerDiagnosticEvent,\n} from \"../reducer/diagnostics.js\";\nimport { StaleContractArtifactError } from \"../reducer/stale-contract-artifact-error.js\";\nimport type { InteractionExplanationLike } from \"./definitions.js\";\n\ntype ReducerBundleLike = Pick<\n ReducerBundleContract,\n \"projectSeatsDynamic\" | \"validateInput\" | \"dispatch\"\n> & {\n explainInteraction?: (input: {\n state: Wire.ReducerSessionState;\n playerId: string;\n interactionId: string;\n }) => InteractionExplanationLike;\n};\n\ntype DeepReadonly<T> = T extends (...args: readonly unknown[]) => unknown\n ? T\n : T extends readonly (infer Item)[]\n ? readonly DeepReadonly<Item>[]\n : T extends object\n ? { readonly [Key in keyof T]: DeepReadonly<T[Key]> }\n : T;\n\ntype DeepMutable<T> = T extends (...args: readonly unknown[]) => unknown\n ? T\n : T extends readonly (infer Item)[]\n ? DeepMutable<Item>[]\n : T extends object\n ? { -readonly [Key in keyof T]: DeepMutable<T[Key]> }\n : T;\n\ntype BaseStateArtifact = {\n snapshot: DeepReadonly<Wire.ReducerSessionState>;\n fingerprint: {\n players: number;\n contractFingerprint?: string;\n };\n};\n\ntype WireZoneHandles = {\n cardIds?: readonly string[];\n cardViewsById?: Readonly<Record<string, string>>;\n playableByCardId?: Readonly<Record<string, readonly string[]>>;\n};\n\nexport type CreateTestRuntimeOptions = {\n baseId: string;\n baseStates: Record<string, BaseStateArtifact>;\n bundle: ReducerBundleLike;\n phase?: string;\n playerIds?: readonly string[];\n sessionId?: string;\n userId?: string | null;\n gameId?: string;\n displayNameByPlayerId?: Record<string, string>;\n contractFingerprint?: string;\n expectedBaseStateFingerprint?: string;\n};\n\nexport type CreatedTestRuntime = {\n runtime: RuntimeAPI;\n getFrame(): PluginGameplayFrame;\n getSessionDescriptor(): PluginSessionDescriptor;\n players(): readonly string[];\n seat(index: number): string;\n submit(\n playerId: string,\n interactionId: string,\n params?: unknown,\n ): Promise<void>;\n validate(\n playerId: string,\n interactionId: string,\n params?: unknown,\n ): Promise<ValidationResult>;\n explain(playerId: string, interactionId: string): InteractionExplanationLike;\n diagnostics: {\n readonly events: readonly ReducerDiagnosticEvent[];\n readonly lastDispatch: {\n submissionId: string;\n trace: readonly DispatchTraceSummaryEntry[];\n } | null;\n clear(): void;\n };\n};\n\nfunction cloneState<T>(value: T): DeepMutable<T> {\n return structuredClone(value) as DeepMutable<T>;\n}\n\nfunction createSubmissionError(\n errorCode: string | undefined,\n message: string | undefined,\n): SubmissionError {\n const error = new Error(message ?? \"Interaction rejected\") as SubmissionError;\n error.name = \"SubmissionError\";\n error.errorCode = errorCode;\n return error;\n}\n\nfunction summarizeWireTrace(\n trace: readonly unknown[] | undefined,\n): DispatchTraceSummaryEntry[] {\n return (trace ?? []).flatMap((entry): DispatchTraceSummaryEntry[] => {\n if (typeof entry !== \"object\" || entry === null) return [];\n const record = entry as Record<string, unknown>;\n switch (record.kind) {\n case \"acceptedClientInput\": {\n const input =\n typeof record.input === \"object\" && record.input !== null\n ? (record.input as Record<string, unknown>)\n : {};\n return [\n {\n kind: \"acceptedClientInput\",\n interactionId: String(input.interactionId ?? \"\"),\n playerId: String(input.playerId ?? \"\"),\n },\n ];\n }\n case \"appliedEffect\": {\n const effect =\n typeof record.effect === \"object\" && record.effect !== null\n ? (record.effect as Record<string, unknown>)\n : {};\n return [\n {\n kind: \"appliedInstruction\",\n instruction: String(effect.kind ?? effect.type ?? \"effect\"),\n },\n ];\n }\n case \"rngConsumption\":\n return [\n {\n kind: \"rngConsumption\",\n operation: String(record.operation ?? \"\"),\n traceEntry: String(record.traceEntry ?? \"\"),\n },\n ];\n default:\n return [];\n }\n });\n}\n\nfunction readFlowState(state: Wire.ReducerSessionState): {\n currentPhase: string | null;\n activePlayers: string[];\n} {\n const flow = ((\n state.domain as\n | { flow?: { currentPhase?: string; activePlayers?: string[] } }\n | undefined\n )?.flow ?? {}) as {\n currentPhase?: string;\n activePlayers?: string[];\n };\n return {\n currentPhase: flow.currentPhase ?? null,\n activePlayers: Array.isArray(flow.activePlayers) ? flow.activePlayers : [],\n };\n}\n\nfunction resolvePlayerIds(options: {\n baseState: BaseStateArtifact;\n explicitPlayerIds?: readonly string[];\n}): string[] {\n if (options.explicitPlayerIds && options.explicitPlayerIds.length > 0) {\n return [...options.explicitPlayerIds];\n }\n return Array.from(\n { length: options.baseState.fingerprint.players },\n (_, index) => `player-${index + 1}`,\n );\n}\n\nfunction isWireZoneHandles(value: unknown): value is WireZoneHandles {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction buildPluginFrame(options: {\n state: Wire.ReducerSessionState;\n bundle: ReducerBundleLike;\n playerId: string;\n version: number;\n expectedPhase: string | undefined;\n baseId: string;\n}): PluginGameplayFrame {\n const projection = options.bundle.projectSeatsDynamic({\n state: options.state,\n playerIds: [options.playerId],\n });\n\n const flow = readFlowState(options.state);\n if (options.expectedPhase && flow.currentPhase !== options.expectedPhase) {\n throw new Error(\n `Expected base '${options.baseId}' to be in phase '${options.expectedPhase}', received '${\n flow.currentPhase ?? \"null\"\n }'.`,\n );\n }\n\n const interactionsByRef =\n (projection.interactionsByRef as\n | Record<string, InteractionDescriptor>\n | undefined) ?? {};\n const hydrateRefs = (\n refs: readonly string[] | undefined,\n ): ContractInteractionDescriptor[] =>\n (refs ?? [])\n .map((ref) => interactionsByRef[ref])\n .filter((descriptor): descriptor is InteractionDescriptor =>\n Boolean(descriptor),\n ) as ContractInteractionDescriptor[];\n\n const seat = projection.seats?.[options.playerId];\n const zones = Object.fromEntries(\n Object.entries(\n (seat?.zones as Record<string, unknown> | undefined) ?? {},\n ).map(([zoneId, zoneValue]) => {\n const zone = isWireZoneHandles(zoneValue) ? zoneValue : {};\n return [\n zoneId,\n {\n cardIds: [...(zone.cardIds ?? [])],\n cardViewsById: { ...(zone.cardViewsById ?? {}) },\n playableByCardId: Object.fromEntries(\n Object.entries(zone.playableByCardId ?? {}).map(\n ([cardId, refs]) => [cardId, hydrateRefs(refs)],\n ),\n ),\n } satisfies ContractZoneHandlesSnapshot,\n ];\n }),\n ) as PluginGameplayFrame[\"zones\"];\n\n const availableInteractions = hydrateRefs(\n seat?.availableInteractionRefs as readonly string[] | undefined,\n );\n return {\n gameVersion: options.version,\n actionSetVersion: computePluginActionSetVersion({\n gameVersion: options.version,\n availableInteractions,\n }),\n perspectivePlayerId: options.playerId || null,\n sharedView: {\n boardStatic: null,\n dynamicView:\n projection.sharedView === undefined\n ? null\n : (projection.sharedView as PluginGameplayFrame[\"sharedView\"][\"dynamicView\"]),\n },\n view: seat?.view ?? null,\n flow: {\n currentPhase: flow.currentPhase,\n currentStage: projection.currentStage ?? null,\n activePlayers: flow.activePlayers,\n simultaneousPhase: projection.simultaneousPhase ?? null,\n },\n availableInteractions,\n recentEvents: [],\n zones,\n };\n}\n\nexport function createTestRuntime(\n options: CreateTestRuntimeOptions,\n): CreatedTestRuntime {\n const baseState = options.baseStates[options.baseId];\n if (!baseState) {\n throw new Error(`Unknown test base '${options.baseId}'.`);\n }\n const expectedBaseStateFingerprint =\n options.expectedBaseStateFingerprint ??\n baseState.fingerprint.contractFingerprint;\n if (\n options.contractFingerprint &&\n expectedBaseStateFingerprint &&\n options.contractFingerprint !== expectedBaseStateFingerprint\n ) {\n throw new StaleContractArtifactError({\n artifact: \"base-states\",\n expected: options.contractFingerprint,\n found: expectedBaseStateFingerprint,\n });\n }\n\n let currentState = cloneState(baseState.snapshot);\n const playerIds = resolvePlayerIds({\n baseState,\n explicitPlayerIds: options.playerIds,\n });\n const sessionId = options.sessionId ?? \"test-session\";\n const sessionDescriptor: PluginSessionDescriptor = {\n sessionId,\n players: playerIds.map((playerId) => ({\n playerId,\n displayName: options.displayNameByPlayerId?.[playerId] ?? playerId,\n })),\n };\n\n let version = 0;\n let submissionCounter = 0;\n const currentPlayerId = playerIds[0] ?? \"\";\n const diagnosticEvents: ReducerDiagnosticEvent[] = [];\n let lastDispatch: {\n submissionId: string;\n trace: readonly DispatchTraceSummaryEntry[];\n } | null = null;\n const toReadySessionState = (\n frame: PluginGameplayFrame,\n ): RuntimePluginSessionState => ({\n status: \"ready\",\n sessionId,\n controllingPlayerId: frame.perspectivePlayerId,\n });\n\n let lastPluginFrame: PluginGameplayFrame;\n let lastSessionState: RuntimePluginSessionState;\n\n const applyCurrentState = (): void => {\n version += 1;\n lastPluginFrame = buildPluginFrame({\n state: currentState,\n bundle: options.bundle,\n playerId: currentPlayerId,\n version,\n expectedPhase: version === 1 ? options.phase : undefined,\n baseId: options.baseId,\n });\n lastSessionState = toReadySessionState(lastPluginFrame);\n };\n\n applyCurrentState();\n\n const validate = async (\n playerId: string,\n interactionId: string,\n params: unknown = {},\n ): Promise<ValidationResult> => {\n const result = await options.bundle.validateInput({\n state: currentState,\n input: {\n kind: \"interaction\",\n playerId,\n interactionId,\n params: params as Wire.JsonValue,\n },\n });\n return {\n valid: result.valid,\n errorCode: result.errorCode,\n message: result.message,\n };\n };\n\n const submit = async (\n playerId: string,\n interactionId: string,\n params: unknown = {},\n ): Promise<void> => {\n submissionCounter += 1;\n const submissionId = `sub-${submissionCounter}`;\n diagnosticEvents.push({\n type: \"submitReceived\",\n submissionId,\n playerId,\n interactionId,\n phase: readFlowState(currentState).currentPhase ?? \"\",\n });\n const validation = await validate(playerId, interactionId, params);\n if (!validation.valid) {\n diagnosticEvents.push({\n type: \"submitRejected\",\n submissionId,\n errorCode: validation.errorCode ?? \"invalid-action\",\n ...(validation.message ? { message: validation.message } : {}),\n });\n throw createSubmissionError(validation.errorCode, validation.message);\n }\n const result = await options.bundle.dispatch({\n state: currentState,\n input: {\n kind: \"interaction\",\n playerId,\n interactionId,\n params: params as Wire.JsonValue,\n },\n });\n if (result.kind === \"reject\") {\n diagnosticEvents.push({\n type: \"submitRejected\",\n submissionId,\n errorCode: result.errorCode,\n ...(result.message ? { message: result.message } : {}),\n });\n throw createSubmissionError(result.errorCode, result.message);\n }\n const trace = summarizeWireTrace(result.trace);\n lastDispatch = { submissionId, trace };\n diagnosticEvents.push({\n type: \"submitAccepted\",\n submissionId,\n trace,\n });\n currentState = cloneState(result.state);\n applyCurrentState();\n };\n\n const explain = (\n playerId: string,\n interactionId: string,\n ): InteractionExplanationLike => {\n if (!options.bundle.explainInteraction) {\n throw new Error(\n \"This reducer bundle does not expose explainInteraction().\",\n );\n }\n return options.bundle.explainInteraction({\n state: currentState,\n playerId,\n interactionId,\n });\n };\n\n const runtime = {\n validateInteraction: (interactionId: string, params?: unknown) =>\n validate(currentPlayerId, interactionId, params),\n submitInteraction: (interactionId: string, params?: unknown) =>\n submit(currentPlayerId, interactionId, params),\n getSessionState: (): RuntimePluginSessionState => lastSessionState,\n disconnect: () => undefined,\n };\n\n return {\n runtime,\n getFrame: () => lastPluginFrame,\n getSessionDescriptor: () => sessionDescriptor,\n players: () => [...playerIds],\n seat: (index: number) => {\n if (!Number.isInteger(index) || index < 0 || index >= playerIds.length) {\n throw new Error(\n `seat(${index}) is out of range; base '${options.baseId}' has ${playerIds.length} player(s).`,\n );\n }\n return playerIds[index]!;\n },\n submit,\n validate,\n explain,\n diagnostics: {\n get events() {\n return diagnosticEvents;\n },\n get lastDispatch() {\n return lastDispatch;\n },\n clear() {\n diagnosticEvents.length = 0;\n lastDispatch = null;\n },\n },\n };\n}\n"],"mappings":";;;;;;;;AAkBA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,kBAAkB,QAAiB,UAA4B;AACtE,MAAI,OAAO,GAAG,QAAQ,QAAQ,EAAG,QAAO;AACxC,MAAI,OAAO,WAAW,OAAO,SAAU,QAAO;AAC9C,MAAI,WAAW,QAAQ,aAAa,KAAM,QAAO;AACjD,MAAI,OAAO,WAAW,YAAY,OAAO,aAAa,SAAU,QAAO;AAEvE,MAAI,kBAAkB,QAAQ,oBAAoB,MAAM;AACtD,WACE,kBAAkB,QAClB,oBAAoB,QACpB,OAAO,GAAG,OAAO,QAAQ,GAAG,SAAS,QAAQ,CAAC;AAAA,EAElD;AACA,MAAI,kBAAkB,UAAU,oBAAoB,QAAQ;AAC1D,WACE,kBAAkB,UAClB,oBAAoB,UACpB,OAAO,WAAW,SAAS,UAC3B,OAAO,UAAU,SAAS;AAAA,EAE9B;AACA,MAAI,MAAM,QAAQ,MAAM,KAAK,MAAM,QAAQ,QAAQ,GAAG;AACpD,WACE,MAAM,QAAQ,MAAM,KACpB,MAAM,QAAQ,QAAQ,KACtB,OAAO,WAAW,SAAS,UAC3B,OAAO,MAAM,CAAC,OAAO,UAAU,kBAAkB,OAAO,SAAS,KAAK,CAAC,CAAC;AAAA,EAE5E;AAEA,QAAM,kBAAkB,OAAO,eAAe,MAAM;AACpD,QAAM,oBAAoB,OAAO,eAAe,QAAQ;AACxD,MAAI,oBAAoB,kBAAmB,QAAO;AAElD,QAAM,eAAe;AACrB,QAAM,iBAAiB;AACvB,QAAM,aAAa,OAAO,KAAK,YAAY;AAC3C,QAAM,eAAe,OAAO,KAAK,cAAc;AAC/C,SACE,WAAW,WAAW,aAAa,UACnC,WAAW;AAAA,IACT,CAAC,QACC,OAAO,UAAU,eAAe,KAAK,gBAAgB,GAAG,KACxD,kBAAkB,aAAa,GAAG,GAAG,eAAe,GAAG,CAAC;AAAA,EAC5D;AAEJ;AAEA,SAAS,aACP,QACA,UACA,OAAe,SACA;AACf,MAAI,CAAC,SAAS,QAAQ,GAAG;AACvB,WAAO,kBAAkB,QAAQ,QAAQ,IACrC,OACA,GAAG,IAAI;AAAA,EACb;AACA,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,aAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC3D,UAAM,cAAc,OAAO,GAAG;AAC9B,QAAI,EAAE,OAAO,SAAS;AACpB,aAAO,GAAG,IAAI,IAAI,GAAG;AAAA,IACvB;AACA,UAAM,WAAW,aAAa,aAAa,eAAe,GAAG,IAAI,IAAI,GAAG,EAAE;AAC1E,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAA8C;AACtE,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,SAAS,gBACP,aACA,eACkC;AAClC,SACE,YAAY;AAAA,IACV,CAAC,eAAe,WAAW,kBAAkB;AAAA,EAC/C,KAAK;AAET;AAEA,SAAS,wBACP,YACA,MACM;AACN,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AACA,QAAM,WAAW,aAAa,YAAY,MAAM,aAAa;AAC7D,MAAI,UAAU;AACZ,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AACF;AAEA,SAAS,6BACP,QACA,UACA,SACe;AACf,QAAM,iBAAiB,MAAwB;AAC7C,QAAI,OAAO,WAAW,YAAY;AAChC,aAAO,QAAQ,QAAQ,EAAE,KAAK,MAAO,OAAyB,CAAC;AAAA,IACjE;AACA,WAAO,QAAQ,QAAQ,MAAM;AAAA,EAC/B;AAEA,SAAO,eAAe,EACnB,KAAK,MAAM;AACV,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,QAAI,EAAE,iBAAiB,QAAQ;AAC7B,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QACE,SAAS,cAAc,UACtB,MAAyC,cACxC,SAAS,WACX;AACA,YAAM,IAAI;AAAA,QACR,iCAAiC,SAAS,SAAS,gBAChD,MAAyC,aAAa,WACzD,KAAK,8BAA8B,OAAO,CAAC;AAAA,MAC7C;AAAA,IACF;AACA,QACE,OAAO,SAAS,YAAY,YAC5B,MAAM,YAAY,SAAS,SAC3B;AACA,YAAM,IAAI;AAAA,QACR,+BAA+B,SAAS,OAAO,gBAAgB,MAAM,OAAO,KAAK;AAAA,UAC/E;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,QACE,SAAS,mBAAmB,UAC5B,CAAC,SAAS,QAAQ,KAAK,MAAM,OAAO,GACpC;AACA,YAAM,IAAI;AAAA,QACR,+BAA+B,MAAM,OAAO,cAAc;AAAA,UACxD,SAAS;AAAA,QACX,CAAC,IAAI,8BAA8B,OAAO,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF,CAAC;AACL;AAEA,SAAS,8BACP,SACQ;AACR,QAAM,YAAY,QAAQ,0BAA0B;AACpD,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,OAAO,UAAU,SAAS,WAAW,UAAU,MAAM,KAAK;AAChE,QAAM,UAAU,UAAU,UAAU,YAAY,UAAU,OAAO,KAAK;AACtE,SAAO;AAAA,4BAA+B,UAAU,SAAS,GAAG,IAAI,GAAG,OAAO;AAC5E;AAEA,SAAS,aAAa,QAAiB,UAAwB;AAC7D,MACE,WAAW,QACX,WAAW,UACX,OAAQ,OAAgC,WAAW,UACnD;AACA,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,QAAM,SAAU,OAA8B;AAC9C,MAAI,WAAW,UAAU;AACvB,UAAM,IAAI,MAAM,mBAAmB,QAAQ,cAAc,MAAM,GAAG;AAAA,EACpE;AACF;AAEA,SAAS,6BACP,aACQ;AACR,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ;AAAA,IACZ,iBAAiB,YAAY,YAAY;AAAA,IACzC,GAAG,YAAY,MAAM,IAAI,CAAC,SAAS;AACjC,YAAM,OAAO,KAAK,YAAY,KAAK,KAAK,SAAS,MAAM;AACvD,YAAM,UAAU,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;AACrD,aAAO,QAAQ,KAAK,MAAM,IAAI,KAAK,OAAO,GAAG,IAAI,GAAG,OAAO;AAAA,IAC7D,CAAC;AAAA,IACD,GAAG,YAAY,OAAO;AAAA,MACpB,CAAC,UAAU,SAAS,MAAM,GAAG,kBAAkB,MAAM,aAAa;AAAA,IACpE;AAAA,EACF;AACA,SAAO;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC;AAC9B;AAEA,SAAS,aACP,QACA,WACM;AACN,MAAI,OAAO,WAAW,YAAY;AAChC,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,MAAI;AACF,IAAC,OAAyB;AAAA,EAC5B,SAAS,OAAO;AACd,QAAI,EAAE,iBAAiB,QAAQ;AAC7B,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AACA,QAAI,cAAc,QAAW;AAC3B;AAAA,IACF;AACA,QAAI,OAAO,cAAc,YAAY,MAAM,YAAY,WAAW;AAChE,YAAM,IAAI;AAAA,QACR,4BAA4B,SAAS,gBAAgB,MAAM,OAAO;AAAA,MACpE;AAAA,IACF;AACA,QAAI,qBAAqB,UAAU,CAAC,UAAU,KAAK,MAAM,OAAO,GAAG;AACjE,YAAM,IAAI;AAAA,QACR,4BAA4B,MAAM,OAAO,cAAc,OAAO,SAAS,CAAC;AAAA,MAC1E;AAAA,IACF;AACA,QAAI,OAAO,cAAc,cAAc,CAAC,UAAU,KAAK,GAAG;AACxD,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AACA;AAAA,EACF;AACA,QAAM,IAAI,MAAM,6BAA6B;AAC/C;AAEO,SAAS,gBACd,UAAkC,CAAC,GACzB;AACV,QAAM,gBAAgB,CAAC,YAAqC;AAAA,IAC1D,MAAM,CAAC,aAAsB;AAC3B,UAAI,WAAW,UAAU;AACvB,cAAM,IAAI;AAAA,UACR,aAAa,OAAO,MAAM,CAAC,YAAY,OAAO,QAAQ,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS,CAAC,aAAsB;AAC9B,UAAI,CAAC,kBAAkB,QAAQ,QAAQ,GAAG;AACxC,cAAM,IAAI,MAAM,qCAAqC;AAAA,MACvD;AAAA,IACF;AAAA,IACA,eAAe,CAAC,aAAsC;AACpD,YAAM,WAAW,aAAa,QAAQ,QAAQ;AAC9C,UAAI,UAAU;AACZ,cAAM,IAAI,MAAM,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,aAAa,MAAM;AACjB,UAAI,WAAW,QAAW;AACxB,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAAA,IACF;AAAA,IACA,eAAe,MAAM;AACnB,UAAI,WAAW,QAAW;AACxB,cAAM,IAAI;AAAA,UACR,iDAAiD,OAAO,MAAM,CAAC;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU,MAAM;AACd,UAAI,WAAW,MAAM;AACnB,cAAM,IAAI;AAAA,UACR,4CAA4C,OAAO,MAAM,CAAC;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW,CAAC,aAAsB;AAChC,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,YAAI,CAAC,OAAO,SAAS,QAAQ,GAAG;AAC9B,gBAAM,IAAI,MAAM,kCAAkC;AAAA,QACpD;AACA;AAAA,MACF;AACA,UAAI,OAAO,WAAW,UAAU;AAC9B,YAAI,CAAC,OAAO,SAAS,OAAO,QAAQ,CAAC,GAAG;AACtC,gBAAM,IAAI,MAAM,mCAAmC;AAAA,QACrD;AACA;AAAA,MACF;AACA,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAAA,IACA,gBAAgB,CAAC,aAAsB;AACrC,UAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,cAAM,IAAI,MAAM,+CAA+C;AAAA,MACjE;AACA,UAAI,CAAC,OAAO,KAAK,CAAC,UAAU,kBAAkB,OAAO,QAAQ,CAAC,GAAG;AAC/D,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AAAA,IACF;AAAA,IACA,cAAc,CAAC,aAAqB;AAClC,mBAAa,QAAQ,QAAQ;AAAA,IAC/B;AAAA,IACA,iBAAiB,CAAC,aAAqB;AACrC,UAAI,OAAO,WAAW,UAAU;AAC9B,cAAM,IAAI,MAAM,gDAAgD;AAAA,MAClE;AACA,UAAI,UAAU,UAAU;AACtB,cAAM,IAAI,MAAM,YAAY,MAAM,YAAY,QAAQ,GAAG;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,wBAAwB,CAAC,aAAqB;AAC5C,UAAI,OAAO,WAAW,UAAU;AAC9B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,UAAU;AACrB,cAAM,IAAI,MAAM,YAAY,MAAM,aAAa,QAAQ,GAAG;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,SAAS,CAAC,cAAc;AACtB,mBAAa,QAAQ,SAAS;AAAA,IAChC;AAAA,IACA,iBAAiB,CAAC,aAAa;AAC7B,UAAI,CAAC,QAAQ,eAAe;AAC1B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,cAAQ,cAAc,UAAU,MAAM;AAAA,IACxC;AAAA,IACA,cAAc,CAAC,aACb,6BAA6B,QAAQ,UAAU,OAAO;AAAA,IACxD,mBAAmB,CAAC,eAAe,SAAS;AAC1C,YAAM,cAAc,iBAAiB,MAAM;AAC3C,YAAM,aAAa,gBAAgB,aAAa,aAAa;AAC7D,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,yBAAyB,aAAa,aAAa;AAAA,MACrE;AACA,8BAAwB,YAAY,IAAI;AAAA,IAC1C;AAAA,IACA,aAAa,CAAC,QAAQ,SAAS;AAC7B,YAAM,aAAa,MAAM,QAAQ,MAAM,KAClC,MAAM;AACL,YAAI,CAAC,MAAM,eAAe;AACxB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,UACL,iBAAiB,MAAM;AAAA,UACvB,KAAK;AAAA,QACP;AAAA,MACF,GAAG,IACF;AACL,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AACA,UAAI,WAAW,cAAc,WAAW,aAAa;AACnD,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AACA,YAAM,eACJ,WAAW,cAAc,WAAW,iBACpC,WAAW,cAAc,WAAW,2BACpC,WAAW,cAAc,WAAW,YAChC,WAAW,aAAa,SACxB;AACN,UAAI,iBAAiB,QAAQ;AAC3B,cAAM,IAAI;AAAA,UACR,gCAAgC,MAAM,gBACpC,gBAAgB,WAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,eAAe,CAAC,gBAAgB;AAC9B,YAAM,aAAa,MAAM,QAAQ,MAAM,KAClC,MAAM;AACL,YAAI,CAAC,aAAa,eAAe;AAC/B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,UACL,iBAAiB,MAAM;AAAA,UACvB,YAAY;AAAA,QACd;AAAA,MACF,GAAG,IACF;AACL,UAAI,CAAC,YAAY;AACf,cAAM,IAAI;AAAA,UACR,4CAA4C;AAAA,YAC1C;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,WAAW,cAAc,WAAW,aAAa;AACnD,cAAM,IAAI;AAAA,UACR,yBAAyB,WAAW,iBAAiB,SAAS,qBAAqB;AAAA,YACjF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,eAAe,CAAC,UAAU,SAAS;AACjC,YAAM,aAAa,MAAM,QAAQ,MAAM,KAClC,MAAM;AACL,YAAI,CAAC,MAAM,eAAe;AACxB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,UACL,iBAAiB,MAAM;AAAA,UACvB,KAAK;AAAA,QACP;AAAA,MACF,GAAG,IACF;AACL,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AACA,UAAI,WAAW,SAAS,OAAO,UAAU;AACvC,cAAM,IAAI;AAAA,UACR,mCAAmC,QAAQ,gBACzC,WAAW,SAAS,MAAM,WAC5B;AAAA,QACF;AAAA,MACF;AACA,UAAI,WAAW,cAAc,WAAW,aAAa;AACnD,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAAA,IACF;AAAA,IACA,KAAK;AAAA,MACH,mBAAmB,CAAC,kBAAkB;AACpC,cAAM,cAAc,iBAAiB,MAAM;AAC3C,YAAI,gBAAgB,aAAa,aAAa,GAAG;AAC/C,gBAAM,IAAI;AAAA,YACR,yBAAyB,aAAa;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,WAAoB,cAAc,MAAM;AAClD;;;AC1WA,SAAS,WAAc,OAA0B;AAC/C,SAAO,gBAAgB,KAAK;AAC9B;AAEA,SAAS,sBACP,WACA,SACiB;AACjB,QAAM,QAAQ,IAAI,MAAM,WAAW,sBAAsB;AACzD,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,SAAO;AACT;AAEA,SAAS,mBACP,OAC6B;AAC7B,UAAQ,SAAS,CAAC,GAAG,QAAQ,CAAC,UAAuC;AACnE,QAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO,CAAC;AACzD,UAAM,SAAS;AACf,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK,uBAAuB;AAC1B,cAAM,QACJ,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,OAChD,OAAO,QACR,CAAC;AACP,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,eAAe,OAAO,MAAM,iBAAiB,EAAE;AAAA,YAC/C,UAAU,OAAO,MAAM,YAAY,EAAE;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AACpB,cAAM,SACJ,OAAO,OAAO,WAAW,YAAY,OAAO,WAAW,OAClD,OAAO,SACR,CAAC;AACP,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,aAAa,OAAO,OAAO,QAAQ,OAAO,QAAQ,QAAQ;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK;AACH,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,WAAW,OAAO,OAAO,aAAa,EAAE;AAAA,YACxC,YAAY,OAAO,OAAO,cAAc,EAAE;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AACE,eAAO,CAAC;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,OAGrB;AACA,QAAM,OACJ,MAAM,QAGL,QAAQ,CAAC;AAIZ,SAAO;AAAA,IACL,cAAc,KAAK,gBAAgB;AAAA,IACnC,eAAe,MAAM,QAAQ,KAAK,aAAa,IAAI,KAAK,gBAAgB,CAAC;AAAA,EAC3E;AACF;AAEA,SAAS,iBAAiB,SAGb;AACX,MAAI,QAAQ,qBAAqB,QAAQ,kBAAkB,SAAS,GAAG;AACrE,WAAO,CAAC,GAAG,QAAQ,iBAAiB;AAAA,EACtC;AACA,SAAO,MAAM;AAAA,IACX,EAAE,QAAQ,QAAQ,UAAU,YAAY,QAAQ;AAAA,IAChD,CAAC,GAAG,UAAU,UAAU,QAAQ,CAAC;AAAA,EACnC;AACF;AAEA,SAAS,kBAAkB,OAA0C;AACnE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,iBAAiB,SAOF;AACtB,QAAM,aAAa,QAAQ,OAAO,oBAAoB;AAAA,IACpD,OAAO,QAAQ;AAAA,IACf,WAAW,CAAC,QAAQ,QAAQ;AAAA,EAC9B,CAAC;AAED,QAAM,OAAO,cAAc,QAAQ,KAAK;AACxC,MAAI,QAAQ,iBAAiB,KAAK,iBAAiB,QAAQ,eAAe;AACxE,UAAM,IAAI;AAAA,MACR,kBAAkB,QAAQ,MAAM,qBAAqB,QAAQ,aAAa,gBACxE,KAAK,gBAAgB,MACvB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBACH,WAAW,qBAEM,CAAC;AACrB,QAAM,cAAc,CAClB,UAEC,QAAQ,CAAC,GACP,IAAI,CAAC,QAAQ,kBAAkB,GAAG,CAAC,EACnC;AAAA,IAAO,CAAC,eACP,QAAQ,UAAU;AAAA,EACpB;AAEJ,QAAM,OAAO,WAAW,QAAQ,QAAQ,QAAQ;AAChD,QAAM,QAAQ,OAAO;AAAA,IACnB,OAAO;AAAA,MACJ,MAAM,SAAiD,CAAC;AAAA,IAC3D,EAAE,IAAI,CAAC,CAAC,QAAQ,SAAS,MAAM;AAC7B,YAAM,OAAO,kBAAkB,SAAS,IAAI,YAAY,CAAC;AACzD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,SAAS,CAAC,GAAI,KAAK,WAAW,CAAC,CAAE;AAAA,UACjC,eAAe,EAAE,GAAI,KAAK,iBAAiB,CAAC,EAAG;AAAA,UAC/C,kBAAkB,OAAO;AAAA,YACvB,OAAO,QAAQ,KAAK,oBAAoB,CAAC,CAAC,EAAE;AAAA,cAC1C,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,YAAY,IAAI,CAAC;AAAA,YAChD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,wBAAwB;AAAA,IAC5B,MAAM;AAAA,EACR;AACA,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,kBAAkB,8BAA8B;AAAA,MAC9C,aAAa,QAAQ;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,IACD,qBAAqB,QAAQ,YAAY;AAAA,IACzC,YAAY;AAAA,MACV,aAAa;AAAA,MACb,aACE,WAAW,eAAe,SACtB,OACC,WAAW;AAAA,IACpB;AAAA,IACA,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM;AAAA,MACJ,cAAc,KAAK;AAAA,MACnB,cAAc,WAAW,gBAAgB;AAAA,MACzC,eAAe,KAAK;AAAA,MACpB,mBAAmB,WAAW,qBAAqB;AAAA,IACrD;AAAA,IACA;AAAA,IACA,cAAc,CAAC;AAAA,IACf;AAAA,EACF;AACF;AAEO,SAAS,kBACd,SACoB;AACpB,QAAM,YAAY,QAAQ,WAAW,QAAQ,MAAM;AACnD,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,sBAAsB,QAAQ,MAAM,IAAI;AAAA,EAC1D;AACA,QAAM,+BACJ,QAAQ,gCACR,UAAU,YAAY;AACxB,MACE,QAAQ,uBACR,gCACA,QAAQ,wBAAwB,8BAChC;AACA,UAAM,IAAI,2BAA2B;AAAA,MACnC,UAAU;AAAA,MACV,UAAU,QAAQ;AAAA,MAClB,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,MAAI,eAAe,WAAW,UAAU,QAAQ;AAChD,QAAM,YAAY,iBAAiB;AAAA,IACjC;AAAA,IACA,mBAAmB,QAAQ;AAAA,EAC7B,CAAC;AACD,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,oBAA6C;AAAA,IACjD;AAAA,IACA,SAAS,UAAU,IAAI,CAAC,cAAc;AAAA,MACpC;AAAA,MACA,aAAa,QAAQ,wBAAwB,QAAQ,KAAK;AAAA,IAC5D,EAAE;AAAA,EACJ;AAEA,MAAI,UAAU;AACd,MAAI,oBAAoB;AACxB,QAAM,kBAAkB,UAAU,CAAC,KAAK;AACxC,QAAM,mBAA6C,CAAC;AACpD,MAAI,eAGO;AACX,QAAM,sBAAsB,CAC1B,WAC+B;AAAA,IAC/B,QAAQ;AAAA,IACR;AAAA,IACA,qBAAqB,MAAM;AAAA,EAC7B;AAEA,MAAI;AACJ,MAAI;AAEJ,QAAM,oBAAoB,MAAY;AACpC,eAAW;AACX,sBAAkB,iBAAiB;AAAA,MACjC,OAAO;AAAA,MACP,QAAQ,QAAQ;AAAA,MAChB,UAAU;AAAA,MACV;AAAA,MACA,eAAe,YAAY,IAAI,QAAQ,QAAQ;AAAA,MAC/C,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,uBAAmB,oBAAoB,eAAe;AAAA,EACxD;AAEA,oBAAkB;AAElB,QAAM,WAAW,OACf,UACA,eACA,SAAkB,CAAC,MACW;AAC9B,UAAM,SAAS,MAAM,QAAQ,OAAO,cAAc;AAAA,MAChD,OAAO;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,SAAS,OACb,UACA,eACA,SAAkB,CAAC,MACD;AAClB,yBAAqB;AACrB,UAAM,eAAe,OAAO,iBAAiB;AAC7C,qBAAiB,KAAK;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,cAAc,YAAY,EAAE,gBAAgB;AAAA,IACrD,CAAC;AACD,UAAM,aAAa,MAAM,SAAS,UAAU,eAAe,MAAM;AACjE,QAAI,CAAC,WAAW,OAAO;AACrB,uBAAiB,KAAK;AAAA,QACpB,MAAM;AAAA,QACN;AAAA,QACA,WAAW,WAAW,aAAa;AAAA,QACnC,GAAI,WAAW,UAAU,EAAE,SAAS,WAAW,QAAQ,IAAI,CAAC;AAAA,MAC9D,CAAC;AACD,YAAM,sBAAsB,WAAW,WAAW,WAAW,OAAO;AAAA,IACtE;AACA,UAAM,SAAS,MAAM,QAAQ,OAAO,SAAS;AAAA,MAC3C,OAAO;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,QAAI,OAAO,SAAS,UAAU;AAC5B,uBAAiB,KAAK;AAAA,QACpB,MAAM;AAAA,QACN;AAAA,QACA,WAAW,OAAO;AAAA,QAClB,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,MACtD,CAAC;AACD,YAAM,sBAAsB,OAAO,WAAW,OAAO,OAAO;AAAA,IAC9D;AACA,UAAM,QAAQ,mBAAmB,OAAO,KAAK;AAC7C,mBAAe,EAAE,cAAc,MAAM;AACrC,qBAAiB,KAAK;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC;AACD,mBAAe,WAAW,OAAO,KAAK;AACtC,sBAAkB;AAAA,EACpB;AAEA,QAAM,UAAU,CACd,UACA,kBAC+B;AAC/B,QAAI,CAAC,QAAQ,OAAO,oBAAoB;AACtC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,QAAQ,OAAO,mBAAmB;AAAA,MACvC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,UAAU;AAAA,IACd,qBAAqB,CAAC,eAAuB,WAC3C,SAAS,iBAAiB,eAAe,MAAM;AAAA,IACjD,mBAAmB,CAAC,eAAuB,WACzC,OAAO,iBAAiB,eAAe,MAAM;AAAA,IAC/C,iBAAiB,MAAiC;AAAA,IAClD,YAAY,MAAM;AAAA,EACpB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,sBAAsB,MAAM;AAAA,IAC5B,SAAS,MAAM,CAAC,GAAG,SAAS;AAAA,IAC5B,MAAM,CAAC,UAAkB;AACvB,UAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,SAAS,UAAU,QAAQ;AACtE,cAAM,IAAI;AAAA,UACR,QAAQ,KAAK,4BAA4B,QAAQ,MAAM,SAAS,UAAU,MAAM;AAAA,QAClF;AAAA,MACF;AACA,aAAO,UAAU,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACX,IAAI,SAAS;AACX,eAAO;AAAA,MACT;AAAA,MACA,IAAI,eAAe;AACjB,eAAO;AAAA,MACT;AAAA,MACA,QAAQ;AACN,yBAAiB,SAAS;AAC1B,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -69,7 +69,7 @@ function digestPluginGameplayFrame(frame) {
69
69
  });
70
70
  }
71
71
 
72
- // ../plugin-runtime-contract/dist/chunk-E4Y6SAWF.js
72
+ // ../plugin-runtime-contract/dist/chunk-IJQ3XRJF.js
73
73
  import { z } from "zod";
74
74
  var DREAMBOARD_PLUGIN_PROTOCOL = "dreamboard-plugin";
75
75
  var DREAMBOARD_PLUGIN_PROTOCOL_VERSION = 3;
@@ -133,6 +133,7 @@ var SeatProjectionBundleSchema = z.object({
133
133
  simultaneousPhase: z.unknown().nullable().optional(),
134
134
  guidance: GameGuidanceProjectionSchema.nullable().optional(),
135
135
  recentEvents: z.array(ProjectedGameEventSchema).optional(),
136
+ sharedView: z.unknown().optional(),
136
137
  interactionsByRef: z.record(z.string(), z.unknown()).optional(),
137
138
  seats: z.record(
138
139
  z.string(),
@@ -280,6 +281,10 @@ var PluginGameplayFrameSchema = z.object({
280
281
  gameVersion: z.number().int().nonnegative(),
281
282
  actionSetVersion: z.string().min(1),
282
283
  perspectivePlayerId: PlayerIdSchema.nullable(),
284
+ sharedView: z.object({
285
+ boardStatic: RuntimeJsonSchema.nullable(),
286
+ dynamicView: RuntimeJsonSchema.nullable()
287
+ }).strict(),
283
288
  view: RuntimeJsonSchema.nullable(),
284
289
  flow: z.object({
285
290
  currentPhase: z.string().nullable(),
@@ -429,7 +434,11 @@ function materializePluginGameplayFrame(input) {
429
434
  gameVersion: input.gameVersion,
430
435
  actionSetVersion: input.actionSetVersion,
431
436
  perspectivePlayerId: input.perspectivePlayerId,
432
- view: composeProjectionView(staticProjection, seat?.view),
437
+ sharedView: {
438
+ boardStatic: staticProjection?.view ?? null,
439
+ dynamicView: dynamicProjection.sharedView === void 0 ? null : dynamicProjection.sharedView
440
+ },
441
+ view: seat?.view === void 0 ? null : seat.view,
433
442
  flow: {
434
443
  currentPhase: input.currentPhase,
435
444
  currentStage: dynamicProjection.currentStage ?? null,
@@ -518,25 +527,6 @@ function hydrateInteractionRefs(registry, value, path) {
518
527
  return descriptor;
519
528
  });
520
529
  }
521
- function composeProjectionView(staticProjection, dynamicView) {
522
- const normalizedDynamicView = dynamicView === void 0 ? null : dynamicView;
523
- if (staticProjection == null) {
524
- return normalizedDynamicView;
525
- }
526
- if (normalizedDynamicView == null) {
527
- return staticProjection.view;
528
- }
529
- if (isRecord(staticProjection.view) && isRecord(normalizedDynamicView)) {
530
- return {
531
- ...staticProjection.view,
532
- ...normalizedDynamicView
533
- };
534
- }
535
- return {
536
- static: staticProjection.view,
537
- dynamic: normalizedDynamicView
538
- };
539
- }
540
530
  function arrayOfStrings(value, path) {
541
531
  if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
542
532
  throw new Error(`Seat projection ${path} must be an array of strings.`);
@@ -572,4 +562,4 @@ export {
572
562
  PluginProtocolTapeSchema,
573
563
  materializePluginGameplayFrame
574
564
  };
575
- //# sourceMappingURL=chunk-5IHU5CUK.js.map
565
+ //# sourceMappingURL=chunk-IYX5OO2K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../plugin-runtime-contract/dist/chunk-GX5V4QL7.js","../../plugin-runtime-contract/dist/chunk-IJQ3XRJF.js","../../plugin-runtime-contract/dist/index.js"],"sourcesContent":["// src/json.ts\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { bytesToHex, utf8ToBytes } from \"@noble/hashes/utils.js\";\nfunction canonicalizePluginRuntimeJson(value) {\n assertRuntimeJson(value);\n return canonicalizeJson(value);\n}\nfunction encodeCanonicalPluginRuntimeJson(value) {\n return JSON.stringify(canonicalizePluginRuntimeJson(value));\n}\nfunction digestPluginRuntimeJson(value) {\n return `sha256:${sha256Hex(encodeCanonicalPluginRuntimeJson(value))}`;\n}\nfunction canonicalizeJson(value) {\n if (value === null || typeof value === \"boolean\" || typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"canonical JSON contains a non-finite number\");\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeJson(item));\n }\n return Object.fromEntries(\n Object.entries(value).filter(([, item]) => item !== void 0).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([key, item]) => [key, canonicalizeJson(item)])\n );\n}\nfunction assertRuntimeJson(value) {\n if (value === null || typeof value === \"boolean\" || typeof value === \"string\") {\n return;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"runtime JSON contains a non-finite number\");\n }\n return;\n }\n if (Array.isArray(value)) {\n value.forEach(assertRuntimeJson);\n return;\n }\n if (typeof value === \"object\") {\n Object.values(value).forEach((item) => {\n if (item !== void 0) {\n assertRuntimeJson(item);\n }\n });\n return;\n }\n throw new Error(`runtime JSON contains unsupported ${typeof value} value`);\n}\nfunction sha256Hex(input) {\n return bytesToHex(sha256(utf8ToBytes(input)));\n}\n\n// src/digest.ts\nfunction computePluginActionSetVersion(input) {\n return digestPluginRuntimeJson({\n digestVersion: \"plugin-action-set@3\",\n gameVersion: input.gameVersion,\n availableInteractions: input.availableInteractions\n });\n}\nfunction digestPluginGameplayFrame(frame) {\n return digestPluginRuntimeJson({\n digestVersion: \"plugin-gameplay-frame@3\",\n frame\n });\n}\nfunction digestPluginCommandRequest(command) {\n return digestPluginRuntimeJson({\n digestVersion: \"plugin-command-request@3\",\n command\n });\n}\n\nexport {\n canonicalizePluginRuntimeJson,\n encodeCanonicalPluginRuntimeJson,\n digestPluginRuntimeJson,\n computePluginActionSetVersion,\n digestPluginGameplayFrame,\n digestPluginCommandRequest\n};\n","// src/schema.ts\nimport { z } from \"zod\";\n\n// src/protocol.ts\nvar DREAMBOARD_PLUGIN_PROTOCOL = \"dreamboard-plugin\";\nvar DREAMBOARD_PLUGIN_PROTOCOL_VERSION = 3;\n\n// src/schema.ts\nvar RuntimeJsonSchema = z.lazy(\n () => z.union([\n z.null(),\n z.boolean(),\n z.number().finite(),\n z.string(),\n z.array(RuntimeJsonSchema),\n z.record(z.string(), RuntimeJsonSchema)\n ])\n);\nvar BoardStaticProjectionSchema = z.object({\n view: RuntimeJsonSchema,\n hash: z.string().optional(),\n manifestVersion: z.string().optional()\n}).strict();\nvar SetupGuidanceStepSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n description: z.string().optional()\n}).strict();\nvar GameGuidanceProjectionSchema = z.object({\n phase: z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n summary: z.string().optional(),\n objective: z.string().optional()\n }).strict(),\n setup: z.object({\n profileId: z.string().min(1),\n name: z.string().min(1),\n summary: z.string().optional(),\n steps: z.array(SetupGuidanceStepSchema)\n }).strict().optional()\n}).strict();\nvar GameEventDetailSchema = z.object({\n label: z.string().min(1),\n value: z.union([z.string(), z.number().finite(), z.boolean()])\n}).strict();\nvar SystemActionEventSchema = z.object({\n kind: z.literal(\"systemAction\"),\n procedureId: z.string().min(1),\n title: z.string().min(1),\n summary: z.string().optional(),\n details: z.array(GameEventDetailSchema).optional()\n}).strict();\nvar GameEventSchema = z.discriminatedUnion(\"kind\", [\n SystemActionEventSchema\n]);\nvar ProjectedGameEventSchema = GameEventSchema.and(\n z.object({\n version: z.number().int().nonnegative(),\n index: z.number().int().nonnegative()\n }).strict()\n);\nvar SeatProjectionBundleSchema = z.object({\n currentStage: z.string().nullable().optional(),\n stageSeats: z.array(z.string()).optional(),\n simultaneousPhase: z.unknown().nullable().optional(),\n guidance: GameGuidanceProjectionSchema.nullable().optional(),\n recentEvents: z.array(ProjectedGameEventSchema).optional(),\n sharedView: z.unknown().optional(),\n interactionsByRef: z.record(z.string(), z.unknown()).optional(),\n seats: z.record(\n z.string(),\n z.object({\n view: z.unknown().optional(),\n availableInteractionRefs: z.array(z.string()).optional(),\n zones: z.unknown().optional()\n }).strict()\n )\n}).strict();\nvar PlayerIdSchema = z.string().min(1);\nvar PluginPlayerSummarySchema = z.object({\n playerId: PlayerIdSchema,\n displayName: z.string(),\n color: z.string().optional()\n}).strict();\nvar PluginSessionDescriptorSchema = z.object({\n sessionId: z.string().min(1),\n players: z.array(PluginPlayerSummarySchema)\n}).strict();\nvar InteractionCommitPolicySchema = z.discriminatedUnion(\"mode\", [\n z.object({ mode: z.literal(\"manual\") }).strict(),\n z.object({ mode: z.literal(\"autoWhenReady\") }).strict()\n]);\nvar InputSelectionSchema = z.discriminatedUnion(\"mode\", [\n z.object({ mode: z.literal(\"single\") }).strict(),\n z.object({\n mode: z.literal(\"many\"),\n min: z.number().int(),\n max: z.number().int().optional(),\n distinct: z.boolean().optional()\n }).strict()\n]);\nvar InputDomainDependencyCaseSchema = z.lazy(\n () => z.object({\n when: z.record(z.string(), z.string()),\n domain: InputDomainSchema\n }).strict()\n);\nvar InputDomainDependenciesSchema = z.discriminatedUnion(\"mode\", [\n z.object({\n mode: z.literal(\"eager\"),\n dependentCases: z.array(InputDomainDependencyCaseSchema)\n }).strict(),\n z.object({\n mode: z.literal(\"lazy\"),\n dependsOn: z.array(z.string()),\n resolver: z.object({\n interactionKey: z.string().optional(),\n inputKey: z.string()\n }).strict()\n }).strict()\n]);\nvar InputDomainSchema = z.object({\n type: z.string(),\n selection: InputSelectionSchema.optional(),\n dependencies: InputDomainDependenciesSchema.optional()\n}).catchall(RuntimeJsonSchema);\nvar InteractionChoiceOptionSchema = z.object({\n value: z.string().nullable(),\n label: z.string(),\n icon: z.string().optional(),\n badge: z.string().optional(),\n description: z.string().optional(),\n disabled: z.boolean().optional(),\n disabledReason: z.string().optional()\n}).strict();\nvar InteractionInputDescriptorSchema = z.object({\n key: z.string().min(1),\n kind: z.string().min(1),\n domain: InputDomainSchema,\n defaultValue: RuntimeJsonSchema.optional()\n}).strict();\nvar InteractionAvailabilitySchema = z.discriminatedUnion(\"status\", [\n z.object({ status: z.literal(\"available\") }).strict(),\n z.object({ status: z.literal(\"notYourTurn\"), reason: z.string() }).strict(),\n z.object({\n status: z.literal(\"insufficientResources\"),\n reason: z.string(),\n missingResources: z.record(z.string(), z.number().finite())\n }).strict(),\n z.object({\n status: z.literal(\"blocked\"),\n reason: z.string(),\n code: z.string().optional()\n }).strict()\n]);\nvar InteractionBaseSchema = z.object({\n phaseName: z.string().min(1),\n interactionKey: z.string().min(1),\n interactionId: z.string().min(1),\n label: z.string().min(1),\n help: z.string().optional(),\n zoneId: z.string().optional(),\n zoneIds: z.array(z.string()).optional(),\n commit: InteractionCommitPolicySchema,\n descriptorDigest: z.string().optional(),\n actorSeat: z.number().int().optional(),\n draftDigest: z.string().optional(),\n inputs: z.array(InteractionInputDescriptorSchema),\n cost: z.record(z.string(), RuntimeJsonSchema).optional(),\n currentResources: z.record(z.string(), RuntimeJsonSchema).optional(),\n availability: InteractionAvailabilitySchema,\n reasons: z.array(\n z.object({\n ruleId: z.string(),\n errorCode: z.string()\n }).strict()\n ).optional()\n}).strict();\nvar InteractionContextSchema = z.object({\n to: z.string().min(1),\n title: z.string().optional(),\n payload: z.record(z.string(), RuntimeJsonSchema).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string().optional()\n }).strict()\n ).optional()\n}).strict();\nvar InteractionDescriptorSchema = z.discriminatedUnion(\"kind\", [\n InteractionBaseSchema.extend({ kind: z.literal(\"action\") }).strict(),\n InteractionBaseSchema.extend({\n kind: z.literal(\"prompt\"),\n context: InteractionContextSchema\n }).strict()\n]);\nvar ZoneHandlesSnapshotSchema = z.object({\n cardIds: z.array(z.string()),\n cardViewsById: z.record(z.string(), z.string()),\n playableByCardId: z.record(\n z.string(),\n z.array(InteractionDescriptorSchema)\n )\n}).strict();\nvar SimultaneousPhaseSnapshotSchema = z.object({\n phaseName: z.string().min(1),\n interactionId: z.string().min(1),\n actorIds: z.array(PlayerIdSchema),\n sealedPlayerIds: z.array(PlayerIdSchema),\n pendingPlayerIds: z.array(PlayerIdSchema)\n}).strict();\nvar PluginGameplayFrameSchema = z.object({\n gameVersion: z.number().int().nonnegative(),\n actionSetVersion: z.string().min(1),\n perspectivePlayerId: PlayerIdSchema.nullable(),\n sharedView: z.object({\n boardStatic: RuntimeJsonSchema.nullable(),\n dynamicView: RuntimeJsonSchema.nullable()\n }).strict(),\n view: RuntimeJsonSchema.nullable(),\n flow: z.object({\n currentPhase: z.string().nullable(),\n currentStage: z.string().nullable(),\n activePlayers: z.array(PlayerIdSchema),\n simultaneousPhase: SimultaneousPhaseSnapshotSchema.nullable()\n }).strict(),\n availableInteractions: z.array(InteractionDescriptorSchema),\n guidance: GameGuidanceProjectionSchema.nullable().optional(),\n recentEvents: z.array(ProjectedGameEventSchema),\n zones: z.record(z.string(), ZoneHandlesSnapshotSchema)\n}).strict();\nvar ValidationResultSchema = z.object({\n valid: z.boolean(),\n errorCode: z.string().optional(),\n message: z.string().optional()\n}).strict();\nvar SubmissionResultSchema = z.discriminatedUnion(\"accepted\", [\n z.object({ accepted: z.literal(true) }).strict(),\n z.object({\n accepted: z.literal(false),\n errorCode: z.string().min(1),\n message: z.string().optional()\n }).strict()\n]);\nvar PluginInteractionBasisSchema = z.object({\n gameVersion: z.number().int().nonnegative(),\n actionSetVersion: z.string().min(1),\n perspectivePlayerId: PlayerIdSchema.nullable()\n}).strict();\nvar ValidateInteractionCommandSchema = z.object({\n type: z.literal(\"interaction.validate\"),\n requestId: z.string().min(1),\n basis: PluginInteractionBasisSchema,\n interactionId: z.string().min(1),\n params: RuntimeJsonSchema\n}).strict();\nvar SubmitInteractionCommandSchema = z.object({\n type: z.literal(\"interaction.submit\"),\n requestId: z.string().min(1),\n basis: PluginInteractionBasisSchema,\n interactionId: z.string().min(1),\n params: RuntimeJsonSchema\n}).strict();\nvar HostToPluginPayloadSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"runtime.init\"),\n session: PluginSessionDescriptorSchema\n }).strict(),\n z.object({\n type: z.literal(\"gameplay.frame\"),\n frame: PluginGameplayFrameSchema\n }).strict(),\n z.object({\n type: z.literal(\"interaction.validation-result\"),\n requestId: z.string().min(1),\n result: ValidationResultSchema\n }).strict(),\n z.object({\n type: z.literal(\"interaction.submit-result\"),\n requestId: z.string().min(1),\n result: SubmissionResultSchema\n }).strict()\n]);\nvar PluginToHostPayloadSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"runtime.ready\") }).strict(),\n z.object({\n type: z.literal(\"runtime.ack\"),\n sequence: z.number().int().nonnegative(),\n clientReceivedAtMs: z.number().finite().optional(),\n clientRenderedAtMs: z.number().finite().optional()\n }).strict(),\n ValidateInteractionCommandSchema,\n SubmitInteractionCommandSchema,\n z.object({\n type: z.literal(\"runtime.error\"),\n message: z.string(),\n code: z.string().optional()\n }).strict()\n]);\nfunction createPluginProtocolEnvelopeSchema(payloadSchema) {\n return z.object({\n protocol: z.literal(DREAMBOARD_PLUGIN_PROTOCOL),\n version: z.literal(DREAMBOARD_PLUGIN_PROTOCOL_VERSION),\n channelId: z.string().min(1),\n sequence: z.number().int().nonnegative(),\n payload: payloadSchema\n }).strict();\n}\nvar HostToPluginEnvelopeSchema = createPluginProtocolEnvelopeSchema(\n HostToPluginPayloadSchema\n);\nvar PluginToHostEnvelopeSchema = createPluginProtocolEnvelopeSchema(\n PluginToHostPayloadSchema\n);\nvar PluginProtocolFrameSchema = z.object({\n id: z.string().min(1),\n frame: PluginGameplayFrameSchema,\n projectionDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/)\n}).strict();\nvar PluginProtocolStepSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n id: z.string().min(1),\n kind: z.literal(\"host.frame\"),\n frameId: z.string().min(1)\n }).strict(),\n z.object({\n id: z.string().min(1),\n kind: z.literal(\"client.validate\"),\n fromFrameId: z.string().min(1),\n requestDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n response: ValidationResultSchema\n }).strict(),\n z.object({\n id: z.string().min(1),\n kind: z.literal(\"client.submit\"),\n fromFrameId: z.string().min(1),\n requestDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n response: SubmissionResultSchema\n }).strict()\n]);\nvar PluginProtocolTapeSchema = z.object({\n session: PluginSessionDescriptorSchema,\n frames: z.array(PluginProtocolFrameSchema),\n steps: z.array(PluginProtocolStepSchema)\n}).strict();\nfunction parsePluginSessionDescriptor(value) {\n return PluginSessionDescriptorSchema.parse(value);\n}\nfunction parsePluginGameplayFrame(value) {\n return PluginGameplayFrameSchema.parse(value);\n}\nfunction parseHostToPluginEnvelope(value) {\n return HostToPluginEnvelopeSchema.parse(value);\n}\nfunction parsePluginToHostEnvelope(value) {\n return PluginToHostEnvelopeSchema.parse(value);\n}\n\nexport {\n DREAMBOARD_PLUGIN_PROTOCOL,\n DREAMBOARD_PLUGIN_PROTOCOL_VERSION,\n RuntimeJsonSchema,\n BoardStaticProjectionSchema,\n SetupGuidanceStepSchema,\n GameGuidanceProjectionSchema,\n GameEventDetailSchema,\n SystemActionEventSchema,\n GameEventSchema,\n ProjectedGameEventSchema,\n SeatProjectionBundleSchema,\n PlayerIdSchema,\n PluginPlayerSummarySchema,\n PluginSessionDescriptorSchema,\n InteractionCommitPolicySchema,\n InputSelectionSchema,\n InputDomainDependenciesSchema,\n InputDomainSchema,\n InteractionChoiceOptionSchema,\n InteractionInputDescriptorSchema,\n InteractionAvailabilitySchema,\n InteractionContextSchema,\n InteractionDescriptorSchema,\n ZoneHandlesSnapshotSchema,\n SimultaneousPhaseSnapshotSchema,\n PluginGameplayFrameSchema,\n ValidationResultSchema,\n SubmissionResultSchema,\n PluginInteractionBasisSchema,\n ValidateInteractionCommandSchema,\n SubmitInteractionCommandSchema,\n HostToPluginPayloadSchema,\n PluginToHostPayloadSchema,\n createPluginProtocolEnvelopeSchema,\n HostToPluginEnvelopeSchema,\n PluginToHostEnvelopeSchema,\n PluginProtocolFrameSchema,\n PluginProtocolStepSchema,\n PluginProtocolTapeSchema,\n parsePluginSessionDescriptor,\n parsePluginGameplayFrame,\n parseHostToPluginEnvelope,\n parsePluginToHostEnvelope\n};\n","import {\n canonicalizePluginRuntimeJson,\n computePluginActionSetVersion,\n digestPluginCommandRequest,\n digestPluginGameplayFrame,\n digestPluginRuntimeJson,\n encodeCanonicalPluginRuntimeJson\n} from \"./chunk-GX5V4QL7.js\";\nimport {\n BoardStaticProjectionSchema,\n DREAMBOARD_PLUGIN_PROTOCOL,\n DREAMBOARD_PLUGIN_PROTOCOL_VERSION,\n GameEventDetailSchema,\n GameEventSchema,\n HostToPluginEnvelopeSchema,\n HostToPluginPayloadSchema,\n InputDomainDependenciesSchema,\n InputDomainSchema,\n InteractionAvailabilitySchema,\n InteractionCommitPolicySchema,\n InteractionContextSchema,\n InteractionDescriptorSchema,\n InteractionInputDescriptorSchema,\n PluginGameplayFrameSchema,\n PluginInteractionBasisSchema,\n PluginPlayerSummarySchema,\n PluginProtocolFrameSchema,\n PluginProtocolStepSchema,\n PluginProtocolTapeSchema,\n PluginSessionDescriptorSchema,\n PluginToHostEnvelopeSchema,\n PluginToHostPayloadSchema,\n ProjectedGameEventSchema,\n RuntimeJsonSchema,\n SeatProjectionBundleSchema,\n SimultaneousPhaseSnapshotSchema,\n SubmissionResultSchema,\n SubmitInteractionCommandSchema,\n SystemActionEventSchema,\n ValidateInteractionCommandSchema,\n ValidationResultSchema,\n ZoneHandlesSnapshotSchema,\n createPluginProtocolEnvelopeSchema,\n parseHostToPluginEnvelope,\n parsePluginGameplayFrame,\n parsePluginSessionDescriptor,\n parsePluginToHostEnvelope\n} from \"./chunk-IJQ3XRJF.js\";\n\n// src/projection.ts\nfunction materializePluginGameplayFrame(input) {\n const dynamicProjection = SeatProjectionBundleSchema.parse(\n canonicalizeReducerProjection(input.dynamicProjection)\n );\n const staticProjection = input.staticProjection == null ? null : BoardStaticProjectionSchema.parse(\n canonicalizeReducerProjection(input.staticProjection)\n );\n const registry = parseInteractionRegistry(\n dynamicProjection.interactionsByRef\n );\n const seat = input.perspectivePlayerId == null ? null : dynamicProjection.seats[input.perspectivePlayerId] ?? null;\n const availableInteractions = seat == null ? [] : hydrateInteractionRefs(\n registry,\n seat.availableInteractionRefs,\n \"availableInteractionRefs\"\n );\n const zones = seat?.zones == null ? {} : hydrateZones(registry, seat.zones, \"zones\");\n const frame = {\n gameVersion: input.gameVersion,\n actionSetVersion: input.actionSetVersion,\n perspectivePlayerId: input.perspectivePlayerId,\n sharedView: {\n boardStatic: staticProjection?.view ?? null,\n dynamicView: dynamicProjection.sharedView === void 0 ? null : dynamicProjection.sharedView\n },\n view: seat?.view === void 0 ? null : seat.view,\n flow: {\n currentPhase: input.currentPhase,\n currentStage: dynamicProjection.currentStage ?? null,\n activePlayers: [...input.activePlayers],\n simultaneousPhase: dynamicProjection.simultaneousPhase ?? null\n },\n availableInteractions,\n guidance: dynamicProjection.guidance ?? null,\n recentEvents: [...dynamicProjection.recentEvents ?? []],\n zones\n };\n return PluginGameplayFrameSchema.parse(frame);\n}\nfunction canonicalizeReducerProjection(value) {\n return canonicalizePluginRuntimeJson(value);\n}\nfunction parseInteractionRegistry(value) {\n if (value == null) return {};\n if (!isRecord(value)) {\n throw new Error(\"Seat projection interactionsByRef must be an object.\");\n }\n return Object.fromEntries(\n Object.entries(value).map(([ref, descriptor]) => [\n ref,\n InteractionDescriptorSchema.parse(descriptor)\n ])\n );\n}\nfunction hydrateZones(registry, value, path) {\n if (!isRecord(value)) {\n throw new Error(`Seat projection ${path} must be an object.`);\n }\n return Object.fromEntries(\n Object.entries(value).map(([zoneId, zoneValue]) => [\n zoneId,\n hydrateZone(registry, zoneValue, `${path}.${zoneId}`)\n ])\n );\n}\nfunction hydrateZone(registry, value, path) {\n if (!isRecord(value)) {\n throw new Error(`Seat projection ${path} must be an object.`);\n }\n const cardIds = arrayOfStrings(value.cardIds, `${path}.cardIds`);\n const cardViewsById = stringRecord(\n value.cardViewsById,\n `${path}.cardViewsById`\n );\n if (!isRecord(value.playableByCardId)) {\n throw new Error(\n `Seat projection ${path}.playableByCardId must be an object.`\n );\n }\n const playableByCardId = Object.fromEntries(\n Object.entries(value.playableByCardId).map(([cardId, refs]) => [\n cardId,\n hydrateInteractionRefs(\n registry,\n refs,\n `${path}.playableByCardId.${cardId}`\n )\n ])\n );\n return ZoneHandlesSnapshotSchema.parse({\n cardIds,\n cardViewsById,\n playableByCardId\n });\n}\nfunction hydrateInteractionRefs(registry, value, path) {\n if (!Array.isArray(value)) {\n throw new Error(`Seat projection ${path} must be an array of refs.`);\n }\n return value.map((ref, index) => {\n if (typeof ref !== \"string\") {\n throw new Error(\n `Seat projection ${path}[${index}] must be a ref string.`\n );\n }\n const descriptor = registry[ref];\n if (!descriptor) {\n throw new Error(\n `Seat projection ${path}[${index}] references '${ref}', which is missing from interactionsByRef.`\n );\n }\n return descriptor;\n });\n}\nfunction arrayOfStrings(value, path) {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`Seat projection ${path} must be an array of strings.`);\n }\n return value;\n}\nfunction stringRecord(value, path) {\n if (!isRecord(value)) {\n throw new Error(`Seat projection ${path} must be an object.`);\n }\n const result = {};\n for (const [key, item] of Object.entries(value)) {\n if (typeof item !== \"string\") {\n throw new Error(`Seat projection ${path}.${key} must be a string.`);\n }\n result[key] = item;\n }\n return result;\n}\nfunction isRecord(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value) && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);\n}\nexport {\n BoardStaticProjectionSchema,\n DREAMBOARD_PLUGIN_PROTOCOL,\n DREAMBOARD_PLUGIN_PROTOCOL_VERSION,\n GameEventDetailSchema,\n GameEventSchema,\n HostToPluginEnvelopeSchema,\n HostToPluginPayloadSchema,\n InputDomainDependenciesSchema,\n InputDomainSchema,\n InteractionAvailabilitySchema,\n InteractionCommitPolicySchema,\n InteractionContextSchema,\n InteractionDescriptorSchema,\n InteractionInputDescriptorSchema,\n PluginGameplayFrameSchema,\n PluginInteractionBasisSchema,\n PluginPlayerSummarySchema,\n PluginProtocolFrameSchema,\n PluginProtocolStepSchema,\n PluginProtocolTapeSchema,\n PluginSessionDescriptorSchema,\n PluginToHostEnvelopeSchema,\n PluginToHostPayloadSchema,\n ProjectedGameEventSchema,\n RuntimeJsonSchema,\n SeatProjectionBundleSchema,\n SimultaneousPhaseSnapshotSchema,\n SubmissionResultSchema,\n SubmitInteractionCommandSchema,\n SystemActionEventSchema,\n ValidateInteractionCommandSchema,\n ValidationResultSchema,\n ZoneHandlesSnapshotSchema,\n canonicalizePluginRuntimeJson,\n computePluginActionSetVersion,\n createPluginProtocolEnvelopeSchema,\n digestPluginCommandRequest,\n digestPluginGameplayFrame,\n digestPluginRuntimeJson,\n encodeCanonicalPluginRuntimeJson,\n materializePluginGameplayFrame,\n parseHostToPluginEnvelope,\n parsePluginGameplayFrame,\n parsePluginSessionDescriptor,\n parsePluginToHostEnvelope\n};\n"],"mappings":";AACA,SAAS,cAAc;AACvB,SAAS,YAAY,mBAAmB;AACxC,SAAS,8BAA8B,OAAO;AAC5C,oBAAkB,KAAK;AACvB,SAAO,iBAAiB,KAAK;AAC/B;AACA,SAAS,iCAAiC,OAAO;AAC/C,SAAO,KAAK,UAAU,8BAA8B,KAAK,CAAC;AAC5D;AACA,SAAS,wBAAwB,OAAO;AACtC,SAAO,UAAU,UAAU,iCAAiC,KAAK,CAAC,CAAC;AACrE;AACA,SAAS,iBAAiB,OAAO;AAC/B,MAAI,UAAU,QAAQ,OAAO,UAAU,aAAa,OAAO,UAAU,UAAU;AAC7E,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,iBAAiB,IAAI,CAAC;AAAA,EACnD;AACA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,SAAS,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,iBAAiB,IAAI,CAAC,CAAC;AAAA,EACpL;AACF;AACA,SAAS,kBAAkB,OAAO;AAChC,MAAI,UAAU,QAAQ,OAAO,UAAU,aAAa,OAAO,UAAU,UAAU;AAC7E;AAAA,EACF;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAQ,iBAAiB;AAC/B;AAAA,EACF;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,KAAK,EAAE,QAAQ,CAAC,SAAS;AACrC,UAAI,SAAS,QAAQ;AACnB,0BAAkB,IAAI;AAAA,MACxB;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,IAAI,MAAM,qCAAqC,OAAO,KAAK,QAAQ;AAC3E;AACA,SAAS,UAAU,OAAO;AACxB,SAAO,WAAW,OAAO,YAAY,KAAK,CAAC,CAAC;AAC9C;AAGA,SAAS,8BAA8B,OAAO;AAC5C,SAAO,wBAAwB;AAAA,IAC7B,eAAe;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,uBAAuB,MAAM;AAAA,EAC/B,CAAC;AACH;AACA,SAAS,0BAA0B,OAAO;AACxC,SAAO,wBAAwB;AAAA,IAC7B,eAAe;AAAA,IACf;AAAA,EACF,CAAC;AACH;;;ACtEA,SAAS,SAAS;AAGlB,IAAI,6BAA6B;AACjC,IAAI,qCAAqC;AAGzC,IAAI,oBAAoB,EAAE;AAAA,EACxB,MAAM,EAAE,MAAM;AAAA,IACZ,EAAE,KAAK;AAAA,IACP,EAAE,QAAQ;AAAA,IACV,EAAE,OAAO,EAAE,OAAO;AAAA,IAClB,EAAE,OAAO;AAAA,IACT,EAAE,MAAM,iBAAiB;AAAA,IACzB,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB;AAAA,EACxC,CAAC;AACH;AACA,IAAI,8BAA8B,EAAE,OAAO;AAAA,EACzC,MAAM;AAAA,EACN,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AACvC,CAAC,EAAE,OAAO;AACV,IAAI,0BAA0B,EAAE,OAAO;AAAA,EACrC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC,EAAE,OAAO;AACV,IAAI,+BAA+B,EAAE,OAAO;AAAA,EAC1C,OAAO,EAAE,OAAO;AAAA,IACd,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACpB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,CAAC,EAAE,OAAO;AAAA,EACV,OAAO,EAAE,OAAO;AAAA,IACd,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,OAAO,EAAE,MAAM,uBAAuB;AAAA,EACxC,CAAC,EAAE,OAAO,EAAE,SAAS;AACvB,CAAC,EAAE,OAAO;AACV,IAAI,wBAAwB,EAAE,OAAO;AAAA,EACnC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/D,CAAC,EAAE,OAAO;AACV,IAAI,0BAA0B,EAAE,OAAO;AAAA,EACrC,MAAM,EAAE,QAAQ,cAAc;AAAA,EAC9B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,SAAS,EAAE,MAAM,qBAAqB,EAAE,SAAS;AACnD,CAAC,EAAE,OAAO;AACV,IAAI,kBAAkB,EAAE,mBAAmB,QAAQ;AAAA,EACjD;AACF,CAAC;AACD,IAAI,2BAA2B,gBAAgB;AAAA,EAC7C,EAAE,OAAO;AAAA,IACP,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,IACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACtC,CAAC,EAAE,OAAO;AACZ;AACA,IAAI,6BAA6B,EAAE,OAAO;AAAA,EACxC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAAA,EACnD,UAAU,6BAA6B,SAAS,EAAE,SAAS;AAAA,EAC3D,cAAc,EAAE,MAAM,wBAAwB,EAAE,SAAS;AAAA,EACzD,YAAY,EAAE,QAAQ,EAAE,SAAS;AAAA,EACjC,mBAAmB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC9D,OAAO,EAAE;AAAA,IACP,EAAE,OAAO;AAAA,IACT,EAAE,OAAO;AAAA,MACP,MAAM,EAAE,QAAQ,EAAE,SAAS;AAAA,MAC3B,0BAA0B,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACvD,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,IAC9B,CAAC,EAAE,OAAO;AAAA,EACZ;AACF,CAAC,EAAE,OAAO;AACV,IAAI,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC;AACrC,IAAI,4BAA4B,EAAE,OAAO;AAAA,EACvC,UAAU;AAAA,EACV,aAAa,EAAE,OAAO;AAAA,EACtB,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC,EAAE,OAAO;AACV,IAAI,gCAAgC,EAAE,OAAO;AAAA,EAC3C,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,SAAS,EAAE,MAAM,yBAAyB;AAC5C,CAAC,EAAE,OAAO;AACV,IAAI,gCAAgC,EAAE,mBAAmB,QAAQ;AAAA,EAC/D,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC,EAAE,OAAO;AAAA,EAC/C,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,eAAe,EAAE,CAAC,EAAE,OAAO;AACxD,CAAC;AACD,IAAI,uBAAuB,EAAE,mBAAmB,QAAQ;AAAA,EACtD,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC,EAAE,OAAO;AAAA,EAC/C,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,MAAM;AAAA,IACtB,KAAK,EAAE,OAAO,EAAE,IAAI;AAAA,IACpB,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IAC/B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,EACjC,CAAC,EAAE,OAAO;AACZ,CAAC;AACD,IAAI,kCAAkC,EAAE;AAAA,EACtC,MAAM,EAAE,OAAO;AAAA,IACb,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,IACrC,QAAQ;AAAA,EACV,CAAC,EAAE,OAAO;AACZ;AACA,IAAI,gCAAgC,EAAE,mBAAmB,QAAQ;AAAA,EAC/D,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,OAAO;AAAA,IACvB,gBAAgB,EAAE,MAAM,+BAA+B;AAAA,EACzD,CAAC,EAAE,OAAO;AAAA,EACV,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,MAAM;AAAA,IACtB,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IAC7B,UAAU,EAAE,OAAO;AAAA,MACjB,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,MACpC,UAAU,EAAE,OAAO;AAAA,IACrB,CAAC,EAAE,OAAO;AAAA,EACZ,CAAC,EAAE,OAAO;AACZ,CAAC;AACD,IAAI,oBAAoB,EAAE,OAAO;AAAA,EAC/B,MAAM,EAAE,OAAO;AAAA,EACf,WAAW,qBAAqB,SAAS;AAAA,EACzC,cAAc,8BAA8B,SAAS;AACvD,CAAC,EAAE,SAAS,iBAAiB;AAC7B,IAAI,gCAAgC,EAAE,OAAO;AAAA,EAC3C,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AACtC,CAAC,EAAE,OAAO;AACV,IAAI,mCAAmC,EAAE,OAAO;AAAA,EAC9C,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrB,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,QAAQ;AAAA,EACR,cAAc,kBAAkB,SAAS;AAC3C,CAAC,EAAE,OAAO;AACV,IAAI,gCAAgC,EAAE,mBAAmB,UAAU;AAAA,EACjE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,WAAW,EAAE,CAAC,EAAE,OAAO;AAAA,EACpD,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,aAAa,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AAAA,EAC1E,EAAE,OAAO;AAAA,IACP,QAAQ,EAAE,QAAQ,uBAAuB;AAAA,IACzC,QAAQ,EAAE,OAAO;AAAA,IACjB,kBAAkB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC;AAAA,EAC5D,CAAC,EAAE,OAAO;AAAA,EACV,EAAE,OAAO;AAAA,IACP,QAAQ,EAAE,QAAQ,SAAS;AAAA,IAC3B,QAAQ,EAAE,OAAO;AAAA,IACjB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EAAE,OAAO;AACZ,CAAC;AACD,IAAI,wBAAwB,EAAE,OAAO;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAChC,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC/B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,QAAQ;AAAA,EACR,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACrC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQ,EAAE,MAAM,gCAAgC;AAAA,EAChD,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,EAAE,SAAS;AAAA,EACvD,kBAAkB,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,EAAE,SAAS;AAAA,EACnE,cAAc;AAAA,EACd,SAAS,EAAE;AAAA,IACT,EAAE,OAAO;AAAA,MACP,QAAQ,EAAE,OAAO;AAAA,MACjB,WAAW,EAAE,OAAO;AAAA,IACtB,CAAC,EAAE,OAAO;AAAA,EACZ,EAAE,SAAS;AACb,CAAC,EAAE,OAAO;AACV,IAAI,2BAA2B,EAAE,OAAO;AAAA,EACtC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,EAAE,SAAS;AAAA,EAC1D,SAAS,EAAE;AAAA,IACT,EAAE,OAAO;AAAA,MACP,IAAI,EAAE,OAAO;AAAA,MACb,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC,EAAE,OAAO;AAAA,EACZ,EAAE,SAAS;AACb,CAAC,EAAE,OAAO;AACV,IAAI,8BAA8B,EAAE,mBAAmB,QAAQ;AAAA,EAC7D,sBAAsB,OAAO,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC,EAAE,OAAO;AAAA,EACnE,sBAAsB,OAAO;AAAA,IAC3B,MAAM,EAAE,QAAQ,QAAQ;AAAA,IACxB,SAAS;AAAA,EACX,CAAC,EAAE,OAAO;AACZ,CAAC;AACD,IAAI,4BAA4B,EAAE,OAAO;AAAA,EACvC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC3B,eAAe,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,EAC9C,kBAAkB,EAAE;AAAA,IAClB,EAAE,OAAO;AAAA,IACT,EAAE,MAAM,2BAA2B;AAAA,EACrC;AACF,CAAC,EAAE,OAAO;AACV,IAAI,kCAAkC,EAAE,OAAO;AAAA,EAC7C,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC/B,UAAU,EAAE,MAAM,cAAc;AAAA,EAChC,iBAAiB,EAAE,MAAM,cAAc;AAAA,EACvC,kBAAkB,EAAE,MAAM,cAAc;AAC1C,CAAC,EAAE,OAAO;AACV,IAAI,4BAA4B,EAAE,OAAO;AAAA,EACvC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC1C,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAClC,qBAAqB,eAAe,SAAS;AAAA,EAC7C,YAAY,EAAE,OAAO;AAAA,IACnB,aAAa,kBAAkB,SAAS;AAAA,IACxC,aAAa,kBAAkB,SAAS;AAAA,EAC1C,CAAC,EAAE,OAAO;AAAA,EACV,MAAM,kBAAkB,SAAS;AAAA,EACjC,MAAM,EAAE,OAAO;AAAA,IACb,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,IAClC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,IAClC,eAAe,EAAE,MAAM,cAAc;AAAA,IACrC,mBAAmB,gCAAgC,SAAS;AAAA,EAC9D,CAAC,EAAE,OAAO;AAAA,EACV,uBAAuB,EAAE,MAAM,2BAA2B;AAAA,EAC1D,UAAU,6BAA6B,SAAS,EAAE,SAAS;AAAA,EAC3D,cAAc,EAAE,MAAM,wBAAwB;AAAA,EAC9C,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,yBAAyB;AACvD,CAAC,EAAE,OAAO;AACV,IAAI,yBAAyB,EAAE,OAAO;AAAA,EACpC,OAAO,EAAE,QAAQ;AAAA,EACjB,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC,EAAE,OAAO;AACV,IAAI,yBAAyB,EAAE,mBAAmB,YAAY;AAAA,EAC5D,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,OAAO;AAAA,EAC/C,EAAE,OAAO;AAAA,IACP,UAAU,EAAE,QAAQ,KAAK;AAAA,IACzB,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,CAAC,EAAE,OAAO;AACZ,CAAC;AACD,IAAI,+BAA+B,EAAE,OAAO;AAAA,EAC1C,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC1C,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAClC,qBAAqB,eAAe,SAAS;AAC/C,CAAC,EAAE,OAAO;AACV,IAAI,mCAAmC,EAAE,OAAO;AAAA,EAC9C,MAAM,EAAE,QAAQ,sBAAsB;AAAA,EACtC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,OAAO;AAAA,EACP,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC/B,QAAQ;AACV,CAAC,EAAE,OAAO;AACV,IAAI,iCAAiC,EAAE,OAAO;AAAA,EAC5C,MAAM,EAAE,QAAQ,oBAAoB;AAAA,EACpC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,OAAO;AAAA,EACP,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC/B,QAAQ;AACV,CAAC,EAAE,OAAO;AACV,IAAI,4BAA4B,EAAE,mBAAmB,QAAQ;AAAA,EAC3D,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,cAAc;AAAA,IAC9B,SAAS;AAAA,EACX,CAAC,EAAE,OAAO;AAAA,EACV,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,gBAAgB;AAAA,IAChC,OAAO;AAAA,EACT,CAAC,EAAE,OAAO;AAAA,EACV,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,+BAA+B;AAAA,IAC/C,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,QAAQ;AAAA,EACV,CAAC,EAAE,OAAO;AAAA,EACV,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,2BAA2B;AAAA,IAC3C,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,QAAQ;AAAA,EACV,CAAC,EAAE,OAAO;AACZ,CAAC;AACD,IAAI,4BAA4B,EAAE,mBAAmB,QAAQ;AAAA,EAC3D,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,eAAe,EAAE,CAAC,EAAE,OAAO;AAAA,EACtD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,aAAa;AAAA,IAC7B,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,IACvC,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IACjD,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EACnD,CAAC,EAAE,OAAO;AAAA,EACV;AAAA,EACA;AAAA,EACA,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,eAAe;AAAA,IAC/B,SAAS,EAAE,OAAO;AAAA,IAClB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EAAE,OAAO;AACZ,CAAC;AACD,SAAS,mCAAmC,eAAe;AACzD,SAAO,EAAE,OAAO;AAAA,IACd,UAAU,EAAE,QAAQ,0BAA0B;AAAA,IAC9C,SAAS,EAAE,QAAQ,kCAAkC;AAAA,IACrD,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC3B,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,IACvC,SAAS;AAAA,EACX,CAAC,EAAE,OAAO;AACZ;AACA,IAAI,6BAA6B;AAAA,EAC/B;AACF;AACA,IAAI,6BAA6B;AAAA,EAC/B;AACF;AACA,IAAI,4BAA4B,EAAE,OAAO;AAAA,EACvC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,OAAO;AAAA,EACP,kBAAkB,EAAE,OAAO,EAAE,MAAM,uBAAuB;AAC5D,CAAC,EAAE,OAAO;AACV,IAAI,2BAA2B,EAAE,mBAAmB,QAAQ;AAAA,EAC1D,EAAE,OAAO;AAAA,IACP,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACpB,MAAM,EAAE,QAAQ,YAAY;AAAA,IAC5B,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,CAAC,EAAE,OAAO;AAAA,EACV,EAAE,OAAO;AAAA,IACP,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACpB,MAAM,EAAE,QAAQ,iBAAiB;AAAA,IACjC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,eAAe,EAAE,OAAO,EAAE,MAAM,uBAAuB;AAAA,IACvD,UAAU;AAAA,EACZ,CAAC,EAAE,OAAO;AAAA,EACV,EAAE,OAAO;AAAA,IACP,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACpB,MAAM,EAAE,QAAQ,eAAe;AAAA,IAC/B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,eAAe,EAAE,OAAO,EAAE,MAAM,uBAAuB;AAAA,IACvD,UAAU;AAAA,EACZ,CAAC,EAAE,OAAO;AACZ,CAAC;AACD,IAAI,2BAA2B,EAAE,OAAO;AAAA,EACtC,SAAS;AAAA,EACT,QAAQ,EAAE,MAAM,yBAAyB;AAAA,EACzC,OAAO,EAAE,MAAM,wBAAwB;AACzC,CAAC,EAAE,OAAO;;;ACvSV,SAAS,+BAA+B,OAAO;AAC7C,QAAM,oBAAoB,2BAA2B;AAAA,IACnD,8BAA8B,MAAM,iBAAiB;AAAA,EACvD;AACA,QAAM,mBAAmB,MAAM,oBAAoB,OAAO,OAAO,4BAA4B;AAAA,IAC3F,8BAA8B,MAAM,gBAAgB;AAAA,EACtD;AACA,QAAM,WAAW;AAAA,IACf,kBAAkB;AAAA,EACpB;AACA,QAAM,OAAO,MAAM,uBAAuB,OAAO,OAAO,kBAAkB,MAAM,MAAM,mBAAmB,KAAK;AAC9G,QAAM,wBAAwB,QAAQ,OAAO,CAAC,IAAI;AAAA,IAChD;AAAA,IACA,KAAK;AAAA,IACL;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,SAAS,OAAO,CAAC,IAAI,aAAa,UAAU,KAAK,OAAO,OAAO;AACnF,QAAM,QAAQ;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,kBAAkB,MAAM;AAAA,IACxB,qBAAqB,MAAM;AAAA,IAC3B,YAAY;AAAA,MACV,aAAa,kBAAkB,QAAQ;AAAA,MACvC,aAAa,kBAAkB,eAAe,SAAS,OAAO,kBAAkB;AAAA,IAClF;AAAA,IACA,MAAM,MAAM,SAAS,SAAS,OAAO,KAAK;AAAA,IAC1C,MAAM;AAAA,MACJ,cAAc,MAAM;AAAA,MACpB,cAAc,kBAAkB,gBAAgB;AAAA,MAChD,eAAe,CAAC,GAAG,MAAM,aAAa;AAAA,MACtC,mBAAmB,kBAAkB,qBAAqB;AAAA,IAC5D;AAAA,IACA;AAAA,IACA,UAAU,kBAAkB,YAAY;AAAA,IACxC,cAAc,CAAC,GAAG,kBAAkB,gBAAgB,CAAC,CAAC;AAAA,IACtD;AAAA,EACF;AACA,SAAO,0BAA0B,MAAM,KAAK;AAC9C;AACA,SAAS,8BAA8B,OAAO;AAC5C,SAAO,8BAA8B,KAAK;AAC5C;AACA,SAAS,yBAAyB,OAAO;AACvC,MAAI,SAAS,KAAM,QAAO,CAAC;AAC3B,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AAAA,MAC/C;AAAA,MACA,4BAA4B,MAAM,UAAU;AAAA,IAC9C,CAAC;AAAA,EACH;AACF;AACA,SAAS,aAAa,UAAU,OAAO,MAAM;AAC3C,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM,mBAAmB,IAAI,qBAAqB;AAAA,EAC9D;AACA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,SAAS,MAAM;AAAA,MACjD;AAAA,MACA,YAAY,UAAU,WAAW,GAAG,IAAI,IAAI,MAAM,EAAE;AAAA,IACtD,CAAC;AAAA,EACH;AACF;AACA,SAAS,YAAY,UAAU,OAAO,MAAM;AAC1C,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM,mBAAmB,IAAI,qBAAqB;AAAA,EAC9D;AACA,QAAM,UAAU,eAAe,MAAM,SAAS,GAAG,IAAI,UAAU;AAC/D,QAAM,gBAAgB;AAAA,IACpB,MAAM;AAAA,IACN,GAAG,IAAI;AAAA,EACT;AACA,MAAI,CAAC,SAAS,MAAM,gBAAgB,GAAG;AACrC,UAAM,IAAI;AAAA,MACR,mBAAmB,IAAI;AAAA,IACzB;AAAA,EACF;AACA,QAAM,mBAAmB,OAAO;AAAA,IAC9B,OAAO,QAAQ,MAAM,gBAAgB,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM;AAAA,MAC7D;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG,IAAI,qBAAqB,MAAM;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,0BAA0B,MAAM;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AACA,SAAS,uBAAuB,UAAU,OAAO,MAAM;AACrD,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,mBAAmB,IAAI,4BAA4B;AAAA,EACrE;AACA,SAAO,MAAM,IAAI,CAAC,KAAK,UAAU;AAC/B,QAAI,OAAO,QAAQ,UAAU;AAC3B,YAAM,IAAI;AAAA,QACR,mBAAmB,IAAI,IAAI,KAAK;AAAA,MAClC;AAAA,IACF;AACA,UAAM,aAAa,SAAS,GAAG;AAC/B,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR,mBAAmB,IAAI,IAAI,KAAK,iBAAiB,GAAG;AAAA,MACtD;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AACA,SAAS,eAAe,OAAO,MAAM;AACnC,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAC3E,UAAM,IAAI,MAAM,mBAAmB,IAAI,+BAA+B;AAAA,EACxE;AACA,SAAO;AACT;AACA,SAAS,aAAa,OAAO,MAAM;AACjC,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM,mBAAmB,IAAI,qBAAqB;AAAA,EAC9D;AACA,QAAM,SAAS,CAAC;AAChB,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI,MAAM,mBAAmB,IAAI,IAAI,GAAG,oBAAoB;AAAA,IACpE;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AACA,SAAS,SAAS,OAAO;AACvB,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,MAAM,OAAO,eAAe,KAAK,MAAM,OAAO,aAAa,OAAO,eAAe,KAAK,MAAM;AACxK;","names":[]}
@@ -16,10 +16,10 @@ import {
16
16
  isInteractionAvailable,
17
17
  useResolvedCardTargetValue,
18
18
  useZoneCards
19
- } from "./chunk-RKGJ64UN.js";
19
+ } from "./chunk-44N3T2A5.js";
20
20
  import {
21
21
  useAuthoredPluginGameplayFrameSelector
22
- } from "./chunk-VLG4YST5.js";
22
+ } from "./chunk-ZYONCTZ2.js";
23
23
  import {
24
24
  CardFace,
25
25
  Dialog,
@@ -874,4 +874,4 @@ function createWorkspaceUIContract(options) {
874
874
  export {
875
875
  createWorkspaceUIContract
876
876
  };
877
- //# sourceMappingURL=chunk-Q322XCY2.js.map
877
+ //# sourceMappingURL=chunk-VTK4TIXC.js.map
@@ -1,6 +1,6 @@
1
1
  // src/authoring/generated-metadata.ts
2
2
  var GENERATED_AUTHORING_METADATA = {
3
- sdkVersion: "0.4.0-alpha.7",
3
+ sdkVersion: "0.4.0-alpha.8",
4
4
  codegenVersion: "0.3.0-alpha.0",
5
5
  manifestSchemaVersion: 2,
6
6
  generatedArtifactSchemaVersion: 1
@@ -9,4 +9,4 @@ var GENERATED_AUTHORING_METADATA = {
9
9
  export {
10
10
  GENERATED_AUTHORING_METADATA
11
11
  };
12
- //# sourceMappingURL=chunk-KYEWGZ2Y.js.map
12
+ //# sourceMappingURL=chunk-VTNEWMWJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/authoring/generated-metadata.ts"],"sourcesContent":["// Generated by scripts/generate-authoring-metadata.mjs. Do not edit by hand.\nimport type { GeneratedAuthoringMetadataV1 } from \"./types.js\";\n\nexport const GENERATED_AUTHORING_METADATA = {\n sdkVersion: \"0.4.0-alpha.7\",\n codegenVersion: \"0.3.0-alpha.0\",\n manifestSchemaVersion: 2,\n generatedArtifactSchemaVersion: 1,\n} as const satisfies GeneratedAuthoringMetadataV1;\n"],"mappings":";AAGO,IAAM,+BAA+B;AAAA,EAC1C,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,gCAAgC;AAClC;","names":[]}
1
+ {"version":3,"sources":["../src/authoring/generated-metadata.ts"],"sourcesContent":["// Generated by scripts/generate-authoring-metadata.mjs. Do not edit by hand.\nimport type { GeneratedAuthoringMetadataV1 } from \"./types.js\";\n\nexport const GENERATED_AUTHORING_METADATA = {\n sdkVersion: \"0.4.0-alpha.8\",\n codegenVersion: \"0.3.0-alpha.0\",\n manifestSchemaVersion: 2,\n generatedArtifactSchemaVersion: 1,\n} as const satisfies GeneratedAuthoringMetadataV1;\n"],"mappings":";AAGO,IAAM,+BAA+B;AAAA,EAC1C,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,gCAAgC;AAClC;","names":[]}
@@ -4,11 +4,11 @@ import {
4
4
  PluginSessionProvider,
5
5
  RuntimeContext,
6
6
  usePluginSession
7
- } from "./chunk-VLG4YST5.js";
7
+ } from "./chunk-ZYONCTZ2.js";
8
8
  import {
9
9
  HostToPluginEnvelopeSchema,
10
10
  RuntimeJsonSchema
11
- } from "./chunk-5IHU5CUK.js";
11
+ } from "./chunk-IYX5OO2K.js";
12
12
 
13
13
  // src/runtime/core/create-plugin-runtime-client.ts
14
14
  var defaultClock = {
@@ -330,4 +330,4 @@ export {
330
330
  createPluginRuntimeClient,
331
331
  PluginRuntimeBoundary
332
332
  };
333
- //# sourceMappingURL=chunk-3QIZKXJ2.js.map
333
+ //# sourceMappingURL=chunk-XV27IQHA.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  GENERATED_AUTHORING_METADATA
3
- } from "./chunk-KYEWGZ2Y.js";
3
+ } from "./chunk-VTNEWMWJ.js";
4
4
 
5
5
  // src/package-set.ts
6
6
  var DREAMBOARD_SDK_VERSION = GENERATED_AUTHORING_METADATA.sdkVersion;
@@ -18,4 +18,4 @@ export {
18
18
  DREAMBOARD_SDK_PACKAGES,
19
19
  DREAMBOARD_SDK_PACKAGE_SET
20
20
  };
21
- //# sourceMappingURL=chunk-NO537WSS.js.map
21
+ //# sourceMappingURL=chunk-YGQTL63W.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-WHR5UW3F.js";
6
6
  import {
7
7
  digestPluginGameplayFrame
8
- } from "./chunk-5IHU5CUK.js";
8
+ } from "./chunk-IYX5OO2K.js";
9
9
 
10
10
  // src/runtime/context/PluginGameplayFrameContext.tsx
11
11
  import {
@@ -561,4 +561,4 @@ export {
561
561
  RuntimeContext,
562
562
  useRuntimeContext
563
563
  };
564
- //# sourceMappingURL=chunk-VLG4YST5.js.map
564
+ //# sourceMappingURL=chunk-ZYONCTZ2.js.map