@dreamboard-games/sdk 0.5.0-alpha.3 → 0.5.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -2
- package/dist/board-target-B0QG6OYx.d.ts +8 -0
- package/dist/chunk-3JXUL4VN.js +139 -0
- package/dist/chunk-3JXUL4VN.js.map +1 -0
- package/dist/{chunk-LRILEVKC.js → chunk-C77SYIVT.js} +82 -109
- package/dist/chunk-C77SYIVT.js.map +1 -0
- package/dist/{chunk-SP234IY4.js → chunk-OOFMBCFF.js} +178 -203
- package/dist/chunk-OOFMBCFF.js.map +1 -0
- package/dist/{chunk-ZPRKWPEP.js → chunk-UG2Q4NLG.js} +108 -29
- package/dist/chunk-UG2Q4NLG.js.map +1 -0
- package/dist/{chunk-FMM5LVJW.js → chunk-XU6WJW6K.js} +26 -12
- package/dist/chunk-XU6WJW6K.js.map +1 -0
- package/dist/{diagnostics-B0lgnuZ6.d.ts → diagnostics-B8d5aLad.d.ts} +2 -2
- package/dist/{definition-BaHNPZol.d.ts → extract-gVKcB8Og.d.ts} +484 -387
- package/dist/index.d.ts +404 -175
- package/dist/index.js +266 -215
- package/dist/index.js.map +1 -1
- package/dist/model-vdpLHrxh.d.ts +432 -0
- package/dist/react.d.ts +35 -7
- package/dist/react.js +136 -8
- package/dist/react.js.map +1 -1
- package/dist/reducer.d.ts +169 -118
- package/dist/reducer.js +206 -328
- package/dist/reducer.js.map +1 -1
- package/dist/testing.d.ts +5 -3
- package/dist/testing.js +9 -6
- package/dist/testing.js.map +1 -1
- package/dist/{types-DimqnJBq.d.ts → types-Bj5ZLTUV.d.ts} +38 -10
- package/package.json +19 -16
- package/dist/chunk-FMM5LVJW.js.map +0 -1
- package/dist/chunk-LRILEVKC.js.map +0 -1
- package/dist/chunk-SP234IY4.js.map +0 -1
- package/dist/chunk-VUWNJXLJ.js +0 -52
- package/dist/chunk-VUWNJXLJ.js.map +0 -1
- package/dist/chunk-ZPRKWPEP.js.map +0 -1
- package/dist/model-BHro6yXu.d.ts +0 -288
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/headless/instance.ts","../src/headless/interaction-inputs.ts","../src/headless/interaction-router.ts"],"sourcesContent":["import { requireLookup } from \"../shared/lookup.js\";\nimport type {\n RuntimeBoardTarget,\n SelectionTarget,\n TargetOptions,\n DropTarget,\n} from \"./targets.js\";\nimport { immutableCopy } from \"./sources/immutable.js\";\nimport { createStore } from \"@tanstack/store\";\nimport {\n inputTargetInDomain,\n inputValueKey,\n inputValueInDomain,\n} from \"../shared/input-domain.js\";\nimport {\n getInteractionDraftReadiness,\n routeInteractionTarget,\n routeCardInputIntent,\n shouldAutoSubmitInteraction,\n} from \"./interaction-router.js\";\nimport {\n inputSelection,\n isManyInput,\n isManyTargetSelectable,\n} from \"./interaction-inputs.js\";\nimport type { RuntimeJson } from \"../shared/runtime-json.js\";\nimport type {\n Features,\n FeatureContext,\n GameInstance,\n CoreInstance,\n InstanceOptions,\n ReadModel,\n GameSource,\n SourceState,\n SourceSnapshot,\n SubmitResult,\n InteractionDescriptor,\n InteractionInputDescriptor,\n NativeEvent,\n FieldEvent,\n} from \"./model.js\";\n\ntype Values = Readonly<Record<string, RuntimeJson>>;\ntype DraftMap = Readonly<Record<string, Values | undefined>>;\ntype RuntimeOptions = InstanceOptions<unknown>;\nconst EMPTY: Values = Object.freeze({});\nconst EMPTY_DRAFTS: DraftMap = Object.freeze({});\nconst equalValue = (a: unknown, b: unknown) =>\n Object.is(a, b) ||\n (typeof a === \"object\" &&\n typeof b === \"object\" &&\n inputValueKey(a) === inputValueKey(b));\nfunction inDomain(\n input: InteractionInputDescriptor,\n value: unknown,\n partial = false,\n) {\n return inputValueInDomain(input.domain, value, input.domain.selection, {\n ignoreMinimum: partial,\n });\n}\nfunction matchesBoardTarget(\n input: InteractionInputDescriptor,\n target: RuntimeBoardTarget,\n) {\n const domain = input.domain;\n return (\n domain.type === \"boardTarget\" &&\n domain.valueKind === target.valueKind &&\n (domain.targetKind === target.kind ||\n (target.kind === \"space\" && domain.targetKind === \"tile\")) &&\n domain.boardId ===\n (target.valueKind === \"board-id\" ? target.boardId : target.value.boardId)\n );\n}\nfunction immutableValues(value: Values): Values {\n return immutableCopy(value);\n}\nfunction data(\n action: string,\n interaction: string,\n input?: string,\n value?: RuntimeJson,\n) {\n return {\n \"data-action\": action,\n \"data-interaction\": interaction,\n ...(input ? { \"data-input\": input } : {}),\n ...(value === undefined\n ? {}\n : {\n \"data-value\":\n typeof value === \"string\" ? value : JSON.stringify(value),\n }),\n };\n}\nexport class AmbiguousTargetError extends Error {\n constructor(id: string) {\n super(\n `Target '${id}' belongs to more than one eligible input. Choose an interaction and input explicitly.`,\n );\n this.name = \"AmbiguousTargetError\";\n }\n}\n\nclass InteractionObject {\n readonly key: string;\n readonly id: string;\n readonly phase: string;\n readonly label: string;\n readonly help?: string;\n readonly kind: \"inputs\" | \"steps\";\n readonly inputObjects: readonly InputObject[];\n readonly seat: number;\n readonly draft: Values;\n readonly draftIdentity: Values;\n readonly source: GameSource;\n readonly epoch: number;\n constructor(\n readonly owner: Controller,\n readonly descriptor: InteractionDescriptor,\n draft: Values,\n readonly status: \"open\" | \"submitting\" | \"submitted\",\n readonly connected: boolean,\n ) {\n this.seat =\n descriptor.actorSeat ??\n owner.sourceState.snapshot?.players.findIndex(\n (player) => player.playerId === owner.sourceState.snapshot?.me,\n ) ??\n -1;\n this.draftIdentity = draft;\n this.draft = immutableValues(draft);\n this.source = owner.options.source;\n this.epoch = owner.epoch;\n this.key = descriptor.interactionKey;\n this.id = descriptor.interactionId;\n this.phase = descriptor.phaseName;\n this.label = descriptor.label;\n this.help = descriptor.help;\n this.kind = descriptor.step ? \"steps\" : \"inputs\";\n this.inputObjects = Object.freeze(\n descriptor.inputs.map((input) =>\n owner.object(\"input\", new InputObject(this, input)),\n ),\n );\n }\n get game() {\n return this.owner.instance;\n }\n getAvailability() {\n return this.descriptor.availability;\n }\n getIsAvailable() {\n return this.descriptor.availability.status === \"available\";\n }\n getUnavailableReason() {\n return this.descriptor.availability.status === \"available\"\n ? null\n : this.descriptor.availability.reason;\n }\n getStep() {\n return this.descriptor.step ?? null;\n }\n getStepIndex() {\n return this.descriptor.step?.index ?? null;\n }\n getInput(key: string) {\n return requireLookup(\n this.findInput(key),\n `Input in interaction ${this.key}`,\n key,\n );\n }\n findInput(key: string) {\n return this.inputObjects.find((input) => input.key === key);\n }\n getInputs() {\n return this.inputObjects;\n }\n readiness() {\n return getInteractionDraftReadiness(this.descriptor, this.draft);\n }\n getIsReady() {\n return this.readiness().ready;\n }\n getMissingInputs() {\n return this.readiness().missingInputs;\n }\n getStatus() {\n return this.status;\n }\n currentLifetime() {\n return (\n this.source === this.owner.options.source &&\n this.epoch === this.owner.epoch &&\n !this.owner.disposed\n );\n }\n submit() {\n return this.currentLifetime()\n ? this.owner.submit(this.key, false)\n : Promise.resolve({ accepted: false as const, errorCode: \"CLOSED\" });\n }\n cancel() {\n return this.currentLifetime()\n ? this.owner.submit(this.key, true)\n : Promise.resolve({ accepted: false as const, errorCode: \"CLOSED\" });\n }\n reset() {\n if (this.currentLifetime()) this.owner.reset(this.key);\n }\n activate() {\n if (this.currentLifetime()) this.owner.activate(this.key);\n }\n getSubmitHandler() {\n return (event?: NativeEvent) => {\n event?.preventDefault();\n this.owner.handle(() => this.submit());\n };\n }\n getSubmitProps() {\n const disabled =\n !this.getIsAvailable() ||\n !this.getIsReady() ||\n this.status !== \"open\" ||\n !this.connected;\n return {\n ...data(\"submit\", this.key),\n \"data-seat\": this.seat,\n type: \"button\" as const,\n disabled,\n \"data-ready\": this.getIsReady(),\n \"data-disabled\": disabled,\n onClick: this.getSubmitHandler(),\n };\n }\n}\nclass InputObject {\n readonly key: string;\n readonly kind: InteractionInputDescriptor[\"kind\"];\n constructor(\n readonly interaction: InteractionObject,\n readonly descriptor: InteractionInputDescriptor,\n ) {\n this.key = descriptor.key;\n this.kind = descriptor.kind;\n }\n get game() {\n return this.interaction.game;\n }\n getDomain() {\n return this.descriptor.domain;\n }\n getValue(): RuntimeJson | undefined {\n return (\n this.interaction.draft[this.key] ??\n (Object.hasOwn(this.interaction.draft, this.key)\n ? null\n : this.descriptor.defaultValue)\n );\n }\n setValue(value: RuntimeJson) {\n if (!this.interaction.currentLifetime()) return;\n this.interaction.owner.setInput(this.interaction.key, this.key, value);\n }\n clear() {\n if (!this.interaction.currentLifetime()) return;\n this.interaction.owner.clearInput(this.interaction.key, this.key);\n }\n getIsReady() {\n const descriptor = {\n ...this.interaction.descriptor,\n inputs: [this.descriptor],\n };\n return getInteractionDraftReadiness(descriptor, {\n [this.key]: this.getValue(),\n }).ready;\n }\n getEligibleTargets(): readonly RuntimeJson[] {\n const domain = this.descriptor.domain;\n if (domain.type === \"cardTarget\" || domain.type === \"boardTarget\")\n return domain.eligibleTargets;\n if (domain.type === \"choice\" || domain.type === \"choiceList\")\n return domain.choices\n .filter((choice) => !choice.disabled)\n .map((choice) => choice.value);\n return [];\n }\n getIsEligible(value: RuntimeJson) {\n const input = this.descriptor;\n return (\n inputTargetInDomain(input.domain, value) &&\n isManyTargetSelectable(input, this.getValue(), value)\n );\n }\n getIsSelected(value: RuntimeJson) {\n const current = this.getValue();\n return isManyInput(this.descriptor) && Array.isArray(current)\n ? current.some((item) => equalValue(item, value))\n : equalValue(current, value);\n }\n getSelectHandler(value: RuntimeJson) {\n return () => {\n if (this.interaction.currentLifetime())\n this.interaction.owner.select(this.interaction.key, this.key, value);\n };\n }\n getTargetProps(value: RuntimeJson) {\n const eligible = this.getIsEligible(value);\n const disabled =\n !eligible ||\n !this.interaction.getIsAvailable() ||\n this.interaction.status !== \"open\" ||\n !this.interaction.connected;\n return {\n ...data(\"select\", this.interaction.key, this.key, value),\n \"data-seat\": this.interaction.seat,\n type: \"button\" as const,\n disabled,\n \"data-eligible\": eligible,\n \"data-selected\": this.getIsSelected(value),\n \"data-disabled\": disabled,\n onClick: () => this.getSelectHandler(value)(),\n };\n }\n getFieldProps() {\n const disabled =\n !this.interaction.getIsAvailable() ||\n this.interaction.status !== \"open\" ||\n !this.interaction.connected;\n return {\n ...data(\"option\", this.interaction.key, this.key),\n \"data-seat\": this.interaction.seat,\n value: this.getValue() ?? \"\",\n disabled,\n \"data-disabled\": disabled,\n onChange: (event: FieldEvent) => {\n if (event.currentTarget.value === \"\") {\n this.clear();\n return;\n }\n this.setValue(\n this.descriptor.domain.type === \"boundedNumber\"\n ? Number(event.currentTarget.value)\n : event.currentTarget.value,\n );\n },\n };\n }\n}\nclass CardObject {\n readonly epoch: number;\n readonly seat: number;\n readonly view: Readonly<Record<string, RuntimeJson>> | null;\n readonly hidden: boolean;\n constructor(\n readonly owner: Controller,\n readonly id: string,\n readonly zone: string,\n readonly index: number,\n encoded: string | undefined,\n readonly routes: readonly InteractionObject[],\n ) {\n this.epoch = owner.epoch;\n this.seat =\n owner.sourceState.snapshot?.players.findIndex(\n (player) => player.playerId === owner.sourceState.snapshot?.me,\n ) ?? -1;\n this.view = encoded\n ? immutableCopy(JSON.parse(encoded) as Record<string, RuntimeJson>)\n : null;\n this.hidden = this.view === null;\n }\n get game() {\n return this.owner.instance;\n }\n getInteractions() {\n return this.routes;\n }\n getIsEligible() {\n return this.routes.some((route) => route.getIsAvailable());\n }\n getIsSelected() {\n return this.routes.some((route) =>\n route\n .getInputs()\n .some(\n (input) =>\n input.descriptor.domain.type === \"cardTarget\" &&\n input.getIsSelected(this.id),\n ),\n );\n }\n getCanSelect(options?: TargetOptions<unknown>) {\n return this.routes.some(\n (route) =>\n route.getIsAvailable() &&\n (!options?.interaction || route.key === options.interaction) &&\n route.status === \"open\" &&\n route.connected &&\n route\n .getInputs()\n .some(\n (input) =>\n input.descriptor.domain.type === \"cardTarget\" &&\n (!options?.input || input.key === options.input) &&\n input.getIsEligible(this.id),\n ),\n );\n }\n select(options?: TargetOptions<unknown>) {\n if (this.epoch !== this.owner.epoch || this.owner.disposed) return;\n this.owner.selectCard(this.id, options);\n }\n getSelectHandler(options?: TargetOptions<unknown>) {\n return () => this.select(options);\n }\n getProps(options?: TargetOptions<unknown>) {\n return {\n type: \"button\" as const,\n disabled: !this.getCanSelect(options),\n \"data-action\": \"select\",\n \"data-value\": this.id,\n \"data-interaction\": options?.interaction,\n \"data-input\": options?.input,\n \"data-eligible\": this.getIsEligible(),\n \"data-selected\": this.getIsSelected(),\n \"data-disabled\": !this.getCanSelect(options),\n \"data-hidden\": this.hidden,\n \"data-seat\": this.seat,\n onClick: this.getSelectHandler(options),\n };\n }\n}\nclass ZoneObject {\n constructor(\n readonly owner: Controller,\n readonly id: string,\n readonly cards: readonly CardObject[],\n ) {}\n get game() {\n return this.owner.instance;\n }\n get count() {\n return this.cards.length;\n }\n getIsEmpty() {\n return this.count === 0;\n }\n getCard(id: string) {\n return requireLookup(this.findCard(id), `Card in zone ${this.id}`, id);\n }\n findCard(id: string) {\n return this.cards.find((card) => card.id === id);\n }\n getCards(options?: { sort?: (a: CardObject, b: CardObject) => number }) {\n return options?.sort ? [...this.cards].sort(options.sort) : this.cards;\n }\n}\nclass PlayerObject {\n readonly id: string;\n readonly name: string;\n readonly color?: string;\n constructor(\n readonly owner: Controller,\n summary: SourceSnapshot[\"players\"][number],\n readonly index: number,\n readonly isMe: boolean,\n readonly active: boolean,\n ) {\n this.id = summary.playerId;\n this.name = summary.displayName;\n this.color = summary.color;\n }\n get game() {\n return this.owner.instance;\n }\n}\nclass PhaseObject {\n constructor(readonly current: string | null) {}\n is(name: string) {\n return this.current === name;\n }\n switch<R>(routes: Record<string, () => R>): R | null {\n return this.current === null ? null : routes[this.current]();\n }\n}\n\nclass Controller {\n epoch = 0;\n options: RuntimeOptions;\n localDrafts: DraftMap;\n localActive: string | null;\n disposed = false;\n readonly instance: CoreInstance<unknown>;\n readonly store: ReturnType<typeof createStore<ReadModel<unknown>>>;\n readonly prototypes = {\n interaction: Object.create(InteractionObject.prototype) as object,\n input: Object.create(InputObject.prototype) as object,\n card: Object.create(CardObject.prototype) as object,\n zone: Object.create(ZoneObject.prototype) as object,\n board: {},\n };\n subscription: { unsubscribe(): void } | undefined;\n sourceState: SourceState;\n reportedFailures = new WeakMap<GameSource, Readonly<Error>>();\n pending: {\n source: GameSource;\n key: string;\n draft: Values;\n revision: number;\n version: number;\n epoch: number;\n accepted: boolean;\n cancel: boolean;\n } | null = null;\n building: ReadModel<unknown> | undefined;\n rootProperties = new Map<PropertyKey, PropertyDescriptor>();\n featureDisposals: (() => void)[] = [];\n warned = new Set<string>();\n invalidControlledState: RuntimeOptions[\"state\"] | undefined;\n observed = new Set<string>();\n revisions = new Map<string, number>();\n lastDrafts: DraftMap = EMPTY_DRAFTS;\n lastInteractions: readonly InteractionObject[] = [];\n lastSnapshotDrafts: DraftMap | undefined;\n trackDrafts() {\n const drafts = this.drafts();\n for (const key of new Set([\n ...Object.keys(this.lastDrafts),\n ...Object.keys(drafts),\n ]))\n if (this.lastDrafts[key] !== drafts[key])\n this.revisions.set(key, (this.revisions.get(key) ?? 0) + 1);\n this.lastDrafts = drafts;\n }\n constructor(\n options: RuntimeOptions,\n features?: (\n core: CoreInstance<unknown>,\n context: FeatureContext<unknown>,\n ) => Features,\n ) {\n this.options = options;\n this.localDrafts =\n (options.initialState?.drafts as DraftMap) ?? EMPTY_DRAFTS;\n this.localActive = options.initialState?.activeInteraction ?? null;\n this.sourceState = options.source.store.get();\n const root = {\n getSnapshot: () => this.building ?? this.store.get(),\n getOptions: () => this.options,\n setOptions: (next: RuntimeOptions) => this.setOptions(next),\n subscribe: (listener: () => void) => {\n const sub = this.store.subscribe(listener);\n return () => sub.unsubscribe();\n },\n dispose: () => this.dispose(),\n assertCoverage: () => this.assertCoverage(),\n inspect: () => this.store.get(),\n };\n this.instance = root as CoreInstance<unknown>;\n for (const key of [\n \"snapshot\",\n \"view\",\n \"version\",\n \"connection\",\n \"failure\",\n \"request\",\n \"state\",\n \"phase\",\n \"turn\",\n \"me\",\n \"players\",\n \"interactions\",\n \"inputs\",\n \"zones\",\n \"cards\",\n \"events\",\n ] as const)\n Object.defineProperty(root, key, {\n get: () => (this.building ?? this.store.get())[key],\n });\n this.store = createStore(Object.freeze(this.build()));\n Object.defineProperty(root, \"store\", {\n value: {\n get: () => this.store.get(),\n subscribe: (listener: () => void) => this.store.subscribe(listener),\n },\n });\n if (\"apply\" in options.source)\n Object.defineProperty(root, \"apply\", {\n value: (action: unknown) =>\n (\n this.options.source as GameSource & {\n apply(action: unknown): unknown;\n }\n ).apply(action),\n });\n if (\"explore\" in options.source)\n Object.defineProperty(root, \"explore\", {\n value: (...args: unknown[]) =>\n (\n this.options.source as GameSource & {\n explore(...args: unknown[]): unknown;\n }\n ).explore(...args),\n });\n const context: FeatureContext<unknown> = {\n createBoard: (id, data) =>\n this.object(\"board\", {\n id,\n data: immutableCopy(data),\n game: this.instance,\n }),\n routeTarget: (target, options) => this.routeTarget(target, options),\n routeCardDrop: (cardId, target) => this.routeCardDrop(cardId, target),\n invalidate: () => {\n if (!this.disposed) this.refresh();\n },\n };\n for (const feature of Object.values(\n features?.(this.instance, context) ?? {},\n )) {\n if (feature.root)\n for (const key of Reflect.ownKeys(feature.root)) {\n if (key in root || this.rootProperties.has(key))\n throw new Error(`Overlapping feature property '${String(key)}'.`);\n this.rootProperties.set(\n key,\n Object.getOwnPropertyDescriptor(feature.root, key)!,\n );\n Object.defineProperty(root, key, {\n get: () => Reflect.get(this.building ?? this.store.get(), key),\n });\n }\n for (const hook of [\n \"interaction\",\n \"input\",\n \"zone\",\n \"card\",\n \"board\",\n ] as const)\n this.install(this.prototypes[hook], feature[hook]);\n if (feature.dispose) this.featureDisposals.push(feature.dispose);\n }\n this.refresh();\n this.subscribeSource();\n this.reportSourceFailure();\n }\n install(target: object, extension: object | undefined) {\n if (!extension) return;\n for (const key of Reflect.ownKeys(extension)) {\n if (\n key in target ||\n [\n \"game\",\n \"owner\",\n \"descriptor\",\n \"draft\",\n \"inputObjects\",\n \"status\",\n \"connected\",\n \"key\",\n \"id\",\n \"phase\",\n \"label\",\n \"help\",\n \"kind\",\n \"interaction\",\n \"view\",\n \"hidden\",\n \"zone\",\n \"index\",\n \"routes\",\n \"cards\",\n ].includes(String(key))\n )\n throw new Error(`Overlapping feature property '${String(key)}'.`);\n }\n Object.defineProperties(\n target,\n Object.getOwnPropertyDescriptors(extension),\n );\n }\n object<T extends object>(hook: keyof Controller[\"prototypes\"], value: T): T {\n return Object.freeze(Object.setPrototypeOf(value, this.prototypes[hook]));\n }\n drafts() {\n if (\n this.options.state &&\n this.options.state === this.invalidControlledState\n )\n return EMPTY_DRAFTS;\n return (this.options.state?.drafts as DraftMap) ?? this.localDrafts;\n }\n active() {\n if (\n this.options.state &&\n this.options.state === this.invalidControlledState\n )\n return null;\n return this.options.state?.activeInteraction !== undefined\n ? this.options.state.activeInteraction\n : this.localActive;\n }\n writeDrafts(next: DraftMap) {\n if (this.options.state?.drafts === undefined) this.localDrafts = next;\n this.options.onDraftsChange?.(next);\n this.refresh();\n }\n writeDraft(key: string, value: Values | undefined) {\n const drafts = this.drafts();\n const next = { ...drafts };\n if (value === undefined) delete next[key];\n else next[key] = immutableValues(value);\n this.writeDrafts(Object.freeze(next));\n }\n activate(key: string | null) {\n if (this.disposed || (key !== null && !this.current(key))) return;\n if (this.options.state?.activeInteraction === undefined)\n this.localActive = key;\n this.options.onActiveInteractionChange?.(key);\n this.refresh();\n }\n descriptorFor(base: InteractionDescriptor, draft: Values) {\n const zones = this.sourceState.snapshot?.frame.zones ?? {};\n for (const input of base.inputs) {\n const card = draft[input.key];\n if (input.domain.type !== \"cardTarget\" || typeof card !== \"string\")\n continue;\n for (const zone of Object.values(zones)) {\n const route = zone.playableByCardId[card]?.find(\n (value) => value.interactionKey === base.interactionKey,\n );\n if (route) return route;\n }\n }\n return base;\n }\n current(key: string) {\n return this.store.get().interactions.find(key) as unknown as\n InteractionObject | undefined;\n }\n editable(key: string) {\n const interaction = this.current(key);\n return !this.disposed &&\n this.sourceState.connection === \"ready\" &&\n !this.sourceState.request &&\n interaction?.getIsAvailable()\n ? interaction\n : undefined;\n }\n setInput(key: string, inputKey: string, value: RuntimeJson) {\n const interaction = this.editable(key);\n if (!interaction?.findInput(inputKey)) return;\n this.writeDraft(key, { ...this.drafts()[key], [inputKey]: value });\n }\n clearInput(key: string, inputKey: string) {\n if (!this.editable(key)?.findInput(inputKey)) return;\n const value = { ...this.drafts()[key] };\n delete value[inputKey];\n this.writeDraft(key, value);\n }\n reset(key: string) {\n if (this.disposed) return;\n this.writeDraft(key, undefined);\n if (this.active() === key) this.activate(null);\n }\n select(\n key: string,\n inputKey: string,\n value: RuntimeJson,\n route?: InteractionObject,\n ) {\n const interaction = route ?? this.editable(key);\n if (\n route &&\n (!route.currentLifetime() ||\n !route.getIsAvailable() ||\n this.sourceState.connection !== \"ready\" ||\n this.sourceState.request ||\n this.pending)\n )\n return;\n const input = interaction?.findInput(inputKey);\n if (!interaction || !input?.getIsEligible(value)) return;\n if (\n isManyInput(input.descriptor) ||\n (typeof value === \"string\" &&\n (input.descriptor.domain.type === \"cardTarget\" ||\n input.descriptor.domain.type === \"boardTarget\"))\n ) {\n let next: Record<string, unknown> = { ...this.drafts()[key] };\n routeInteractionTarget(\n {\n getDraft: () => next,\n setInput: (_key, k, v) => {\n next = { ...next, [k]: v };\n },\n clearInput: (_key, k) => {\n if (k) delete next[k];\n },\n },\n interaction.descriptor,\n { inputKey, value },\n );\n this.writeDraft(key, next as Values);\n } else this.setInput(key, inputKey, value);\n this.activate(key);\n const current = this.current(key);\n if (\n current &&\n Object.hasOwn(this.drafts()[key] ?? EMPTY, inputKey) &&\n shouldAutoSubmitInteraction(current.descriptor) &&\n current.getIsReady()\n )\n this.handle(() => this.submit(key, false));\n }\n selectCard(id: string, options?: TargetOptions<unknown>) {\n const card = this.store.get().cards.find(id) as unknown as\n CardObject | undefined;\n if (\n !card ||\n this.sourceState.request ||\n this.sourceState.connection !== \"ready\"\n )\n return;\n const candidates = card.routes.flatMap((interaction) => {\n if (\n !interaction.getIsAvailable() ||\n !interaction.currentLifetime() ||\n (options?.interaction && interaction.key !== options.interaction)\n )\n return [];\n return interaction\n .getInputs()\n .filter(\n (input) =>\n input.descriptor.domain.type === \"cardTarget\" &&\n (!options?.input || input.key === options.input) &&\n input.getIsEligible(id),\n )\n .map((input) => ({ interaction, input }));\n });\n if (candidates.length > 1) throw new AmbiguousTargetError(id);\n const candidate = candidates[0];\n if (candidate)\n this.select(\n candidate.interaction.key,\n candidate.input.key,\n id,\n candidate.interaction,\n );\n }\n handle(submit: () => Promise<SubmitResult>) {\n const source = this.options.source;\n const active = () => !this.disposed && this.options.source === source;\n void submit().then(\n (result) => {\n if (active() && !result.accepted)\n this.options.onError?.(\n new Error(result.message ?? result.errorCode, { cause: result }),\n );\n },\n (error) => {\n if (!active()) return;\n const state = source.store.get();\n if (state.failure === error || state.connection === \"closed\") return;\n this.options.onError?.(error);\n },\n );\n }\n async submit(key: string, cancel: boolean): Promise<SubmitResult> {\n const source = this.options.source;\n const interaction = this.current(key);\n if (\n this.disposed ||\n this.sourceState.connection !== \"ready\" ||\n this.sourceState.request ||\n this.pending\n )\n return { accepted: false, errorCode: \"BUSY\" };\n if (!interaction) return { accepted: false, errorCode: \"UNAVAILABLE\" };\n if (\n cancel\n ? !interaction.getStep()?.canCancel\n : !interaction.getIsAvailable() || !interaction.getIsReady()\n )\n return { accepted: false, errorCode: \"UNAVAILABLE\" };\n if (!(\"submit\" in source) || !(\"cancel\" in source))\n return { accepted: false, errorCode: \"READ_ONLY\" };\n const commandSource = source as GameSource & {\n submit(id: string, params: RuntimeJson): Promise<SubmitResult>;\n cancel(id: string): Promise<SubmitResult>;\n };\n const operation = {\n source,\n key,\n draft: this.drafts()[key] ?? EMPTY,\n revision: this.revisions.get(key) ?? 0,\n version: this.sourceState.snapshot!.version,\n epoch: this.epoch,\n accepted: false,\n cancel,\n };\n this.pending = operation;\n try {\n const result = await (cancel\n ? commandSource.cancel(interaction.id)\n : commandSource.submit(\n interaction.id,\n interaction.readiness().values as RuntimeJson,\n ));\n if (this.pending !== operation) return result;\n if (!result.accepted) {\n this.pending = null;\n this.refresh();\n return result;\n }\n operation.accepted = true;\n this.finishBarrier();\n return result;\n } catch (error) {\n if (this.pending === operation) {\n this.pending = null;\n this.refresh();\n }\n throw error;\n }\n }\n finishBarrier() {\n const operation = this.pending;\n if (\n !operation?.accepted ||\n this.sourceState.request ||\n operation.source !== this.options.source ||\n operation.epoch !== this.epoch\n )\n return;\n if (\n this.sourceState.connection === \"closed\" ||\n this.sourceState.connection === \"failed\"\n ) {\n this.pending = null;\n this.refresh();\n return;\n }\n if (\n this.sourceState.connection !== \"ready\" ||\n (this.sourceState.snapshot?.version ?? -1) <= operation.version\n )\n return;\n this.pending = null;\n if ((this.revisions.get(operation.key) ?? 0) === operation.revision)\n this.reset(operation.key);\n else this.refresh();\n }\n reportSourceFailure() {\n const failure = this.sourceState.failure;\n if (\n !failure ||\n !this.options.onError ||\n this.reportedFailures.get(this.options.source) === failure\n )\n return;\n this.reportedFailures.set(this.options.source, failure);\n this.options.onError?.(failure);\n }\n subscribeSource() {\n const source = this.options.source;\n this.subscription = source.store.subscribe(() => {\n if (this.disposed || this.options.source !== source) return;\n const next = source.store.get();\n const previousSnapshot = this.sourceState.snapshot;\n this.sourceState = next;\n if (\n previousSnapshot &&\n next.snapshot &&\n previousSnapshot.me !== next.snapshot.me\n ) {\n this.epoch++;\n this.invalidControlledState = this.options.state;\n this.pending = null;\n this.localDrafts = EMPTY_DRAFTS;\n this.localActive = null;\n this.options.onDraftsChange?.({});\n this.options.onActiveInteractionChange?.(null);\n }\n this.reconcile();\n this.refresh();\n this.finishBarrier();\n this.reportSourceFailure();\n });\n }\n setOptions(next: RuntimeOptions) {\n if (this.disposed) throw new Error(\"Game instance is disposed.\");\n const changed = next.source !== this.options.source;\n if (changed) {\n this.epoch++;\n this.subscription?.unsubscribe();\n this.options.source.dispose();\n this.pending = null;\n }\n this.options = next;\n if (changed) {\n this.invalidControlledState = next.state;\n this.localDrafts = EMPTY_DRAFTS;\n this.localActive = null;\n this.sourceState = next.source.store.get();\n this.options.onDraftsChange?.({});\n this.options.onActiveInteractionChange?.(null);\n this.subscribeSource();\n }\n this.reconcile();\n this.refresh();\n this.reportSourceFailure();\n }\n reconcile() {\n const snapshot = this.sourceState.snapshot;\n if (!snapshot) return;\n const drafts = this.drafts();\n let changed = false;\n const next: Record<string, Values | undefined> = { ...drafts };\n for (const [key, values] of Object.entries(drafts)) {\n if (!values) continue;\n const base = snapshot.frame.availableInteractions.find(\n (value) => value.interactionKey === key,\n );\n if (!base) {\n if (this.pending?.key !== key) {\n delete next[key];\n changed = true;\n }\n continue;\n }\n const descriptor = this.descriptorFor(base, values);\n const kept = { ...values };\n let fieldChanged = false;\n for (const [name, value] of Object.entries(values)) {\n const input = descriptor.inputs.find((input) => input.key === name);\n if (!input && this.pending?.key === key) continue;\n const selection = input && inputSelection(input);\n if (input && selection?.mode === \"many\" && Array.isArray(value)) {\n const eligible = value.filter((item) =>\n inputTargetInDomain(input.domain, item),\n );\n const max = selection.max;\n const retained =\n max === undefined ? eligible : eligible.slice(0, max);\n if (retained.length !== value.length) {\n kept[name] = retained;\n changed = true;\n fieldChanged = true;\n }\n continue;\n }\n if (!input || !inDomain(input, value, true)) {\n delete kept[name];\n changed = true;\n fieldChanged = true;\n }\n }\n if (fieldChanged) next[key] = immutableValues(kept);\n }\n if (changed) this.writeDrafts(Object.freeze(next));\n const active = this.active();\n if (\n active &&\n !snapshot.frame.availableInteractions.some(\n (value) => value.interactionKey === active,\n )\n )\n this.activate(null);\n }\n dispose() {\n if (this.disposed) return;\n this.disposed = true;\n this.featureDisposals.forEach((dispose) => dispose());\n this.subscription?.unsubscribe();\n this.pending = null;\n this.options.source.dispose();\n this.sourceState = this.options.source.store.get();\n this.refresh();\n }\n assertCoverage() {\n const missing =\n this.sourceState.snapshot?.frame.availableInteractions\n .filter(\n (d) =>\n d.availability.status === \"available\" &&\n !this.observed.has(d.interactionKey),\n )\n .map((d) => d.interactionKey) ?? [];\n if (missing.length)\n throw new Error(`Interactions not read: ${missing.join(\", \")}`);\n }\n routeTarget(\n target: SelectionTarget<unknown>,\n options?: TargetOptions<unknown>,\n ) {\n if (target.kind === \"card\") {\n this.selectCard(target.value, options);\n return;\n }\n const candidates = this.lastInteractions.flatMap((interaction) =>\n interaction\n .getInputs()\n .filter(\n (input) =>\n matchesBoardTarget(input.descriptor, target) &&\n input.getIsEligible(target.value) &&\n interaction.getIsAvailable() &&\n (!options?.interaction ||\n interaction.key === options.interaction) &&\n (!options?.input || input.key === options.input),\n )\n .map((input) => ({ interaction, input })),\n );\n if (candidates.length > 1)\n throw new AmbiguousTargetError(JSON.stringify(target.value));\n const match = candidates[0];\n if (match)\n this.select(match.interaction.key, match.input.key, target.value);\n }\n routeCardDrop(cardId: string, target: DropTarget<unknown>) {\n if (\n this.disposed ||\n this.sourceState.request ||\n this.pending ||\n this.sourceState.connection !== \"ready\"\n )\n return;\n const card = this.store.get().cards.find(cardId) as unknown as\n CardObject | undefined;\n const interaction = card?.routes.find(\n (route) => route.key === target.interactionKey,\n );\n if (!interaction?.currentLifetime() || !interaction.getIsAvailable())\n return;\n const cardInput = interaction.findInput(target.cardInputKey);\n const input = interaction.findInput(target.inputKey);\n if (\n !cardInput ||\n cardInput.descriptor.domain.type !== \"cardTarget\" ||\n !cardInput.getIsEligible(cardId) ||\n !input ||\n !matchesBoardTarget(input.descriptor, target) ||\n !input.getIsEligible(target.value)\n )\n return;\n let next: Record<string, unknown> = { ...this.drafts()[interaction.key] };\n routeCardInputIntent(\n {\n getDraft: () => next,\n setInput: (_key, key, value) => {\n next = { ...next, [key]: value };\n },\n clearInput: (_key, key) => {\n if (key) delete next[key];\n },\n },\n interaction.descriptor,\n {\n cardId,\n cardInputKey: cardInput.key,\n dropTarget: { inputKey: input.key, value: target.value },\n },\n );\n this.writeDraft(interaction.key, next as Values);\n this.activate(interaction.key);\n const current = this.current(interaction.key);\n if (\n current &&\n shouldAutoSubmitInteraction(current.descriptor) &&\n current.getIsReady()\n )\n this.handle(() => current.submit());\n }\n warnUnread() {\n const environment =\n (import.meta as { env?: { DEV?: boolean } }).env?.DEV ??\n (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env\n ?.NODE_ENV === \"development\";\n if (!(this.options.debug ?? environment)) return;\n queueMicrotask(() => {\n if (this.disposed) return;\n for (const descriptor of this.sourceState.snapshot?.frame\n .availableInteractions ?? []) {\n const key = descriptor.interactionKey;\n if (\n descriptor.availability.status === \"available\" &&\n !this.observed.has(key) &&\n !this.warned.has(key)\n ) {\n this.warned.add(key);\n console.warn(`Available interaction '${key}' has not been read.`);\n }\n }\n });\n }\n build(previous?: ReadModel<unknown>): ReadModel<unknown> {\n this.trackDrafts();\n const { snapshot, connection, request, failure } = this.sourceState;\n const old = previous?.snapshot;\n const drafts = this.drafts();\n const active = this.active();\n const sameSnapshot = snapshot === old;\n const sameActors = sameSnapshot;\n const summaries = snapshot?.players ?? [];\n const activeIds = snapshot?.frame.flow.activePlayers ?? [];\n const playerObjects =\n sameActors && previous\n ? previous.players.getAll()\n : Object.freeze(\n summaries.map((player, index) =>\n Object.freeze(\n new PlayerObject(\n this,\n player,\n index,\n player.playerId === snapshot?.me,\n activeIds.includes(player.playerId),\n ),\n ),\n ),\n );\n const players =\n sameActors && previous\n ? previous.players\n : {\n order: Object.freeze(playerObjects.map((p) => p.id)),\n get: (id: string) =>\n requireLookup(\n playerObjects.find((p) => p.id === id),\n \"Player\",\n id,\n ),\n find: (id: string) => playerObjects.find((p) => p.id === id),\n getAll: () => playerObjects,\n next: (id: string) => {\n const index = playerObjects.findIndex((p) => p.id === id);\n return requireLookup(\n index < 0\n ? undefined\n : playerObjects[(index + 1) % playerObjects.length],\n \"Next player after\",\n id,\n );\n },\n };\n const me =\n sameActors && previous\n ? previous.me\n : snapshot\n ? {\n id: snapshot.me,\n player: players.get(snapshot.me),\n getCanAct: () =>\n snapshot.frame.availableInteractions.some(\n (value) => value.availability.status === \"available\",\n ),\n }\n : null;\n const descriptors = snapshot?.frame.availableInteractions ?? [];\n const interactionObjects = descriptors.map((base) => {\n const key = base.interactionKey;\n const draft = drafts[key] ?? EMPTY;\n const descriptor = this.descriptorFor(base, draft);\n const status =\n request || this.pending\n ? request?.interactionId === descriptor.interactionId &&\n request.phase === \"awaiting-frame\"\n ? \"submitted\"\n : \"submitting\"\n : \"open\";\n const oldObject = this.lastInteractions.find(\n (value) => value.key === key,\n );\n return oldObject?.descriptor === descriptor &&\n oldObject.epoch === this.epoch &&\n oldObject.source === this.options.source &&\n oldObject.draftIdentity === draft &&\n oldObject.status === status &&\n oldObject.connected === (connection === \"ready\")\n ? oldObject\n : this.object(\n \"interaction\",\n new InteractionObject(\n this,\n descriptor,\n draft,\n status,\n connection === \"ready\",\n ),\n );\n });\n const interactionsSame =\n previous &&\n interactionObjects.length === this.lastInteractions.length &&\n interactionObjects.every(\n (value, index) => value === this.lastInteractions[index],\n );\n this.lastInteractions = Object.freeze(interactionObjects);\n const interactions = interactionsSame\n ? previous.interactions\n : {\n get: (key: string) => {\n this.observed.add(key);\n return requireLookup(\n interactionObjects.find((value) => value.key === key),\n \"Interaction\",\n key,\n );\n },\n find: (key: string) => {\n this.observed.add(key);\n return interactionObjects.find((value) => value.key === key);\n },\n list: () => {\n interactionObjects.forEach((value) => this.observed.add(value.key));\n return Object.freeze(interactionObjects);\n },\n listAvailable: () => {\n const available = interactionObjects.filter((value) =>\n value.getIsAvailable(),\n );\n available.forEach((value) => this.observed.add(value.key));\n return Object.freeze(available);\n },\n };\n const inputs =\n interactionsSame && previous\n ? previous.inputs\n : {\n get: (key: string, name: string) =>\n requireLookup(\n interactions.find(key)?.findInput(name),\n `Input in interaction ${key}`,\n name,\n ),\n find: (key: string, name: string) =>\n interactions.find(key)?.findInput(name),\n };\n const zonesSame = sameSnapshot && interactionsSame && previous;\n const zones = zonesSame\n ? previous.zones\n : (() => {\n const objects = Object.entries(snapshot?.frame.zones ?? {}).map(\n ([id, zone]) =>\n this.object(\n \"zone\",\n new ZoneObject(\n this,\n id,\n Object.freeze(\n zone.cardIds.map((cardId, index) =>\n this.object(\n \"card\",\n new CardObject(\n this,\n cardId,\n id,\n index,\n zone.cardViewsById[cardId],\n Object.freeze(\n (zone.playableByCardId[cardId] ?? []).map(\n (descriptor) =>\n this.object(\n \"interaction\",\n new InteractionObject(\n this,\n descriptor,\n drafts[descriptor.interactionKey] ?? EMPTY,\n request || this.pending\n ? \"submitting\"\n : \"open\",\n connection === \"ready\",\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n );\n return {\n get: (id: string) =>\n requireLookup(\n objects.find((zone) => zone.id === id),\n \"Zone\",\n id,\n ),\n find: (id: string) => objects.find((zone) => zone.id === id),\n getAll: () => Object.freeze(objects),\n };\n })();\n const cards = zonesSame\n ? previous.cards\n : {\n get: (id: string) =>\n requireLookup(\n zones\n .getAll()\n .map((zone) => zone.findCard(id))\n .find((card) => card !== undefined),\n \"Card\",\n id,\n ),\n find: (id: string) =>\n zones\n .getAll()\n .map((zone) => zone.findCard(id))\n .find((card) => card !== undefined),\n };\n const capturedState =\n this.lastSnapshotDrafts === drafts &&\n previous?.state.activeInteraction === active\n ? previous.state\n : immutableCopy({ drafts, activeInteraction: active });\n this.lastSnapshotDrafts = drafts;\n for (const value of [players, me, interactions, inputs, zones, cards])\n if (value) Object.freeze(value);\n const model = {\n snapshot,\n view: snapshot?.frame.view ?? null,\n version: snapshot?.version ?? null,\n connection,\n request,\n failure,\n state: capturedState,\n phase:\n sameSnapshot && previous\n ? previous.phase\n : Object.freeze(\n new PhaseObject(snapshot?.frame.flow.currentPhase ?? null),\n ),\n turn:\n sameSnapshot && previous\n ? previous.turn\n : Object.freeze({\n activePlayerIds: activeIds,\n currentPlayerId: activeIds.length === 1 ? activeIds[0] : null,\n order: players.order,\n isMine: snapshot ? activeIds.includes(snapshot.me) : false,\n }),\n me,\n players,\n interactions,\n inputs,\n zones,\n cards,\n events:\n sameSnapshot && previous\n ? previous.events\n : Object.freeze({\n recent: snapshot?.frame.events ?? Object.freeze([]),\n }),\n } as unknown as ReadModel<unknown>;\n this.building = model;\n try {\n for (const [key, descriptor] of this.rootProperties)\n Object.defineProperty(model, key, {\n value: descriptor.get\n ? descriptor.get.call(this.instance)\n : descriptor.value,\n enumerable: true,\n });\n } finally {\n this.building = undefined;\n }\n return model;\n }\n refresh() {\n if (!this.store) return;\n this.store.setState((previous) => Object.freeze(this.build(previous)));\n this.warnUnread();\n }\n}\nexport function createGameInstance<G>() {\n return function <\n const F extends Features = Record<never, never>,\n S extends GameSource = GameSource,\n >(\n options: InstanceOptions<G, S> & {\n features?: (core: CoreInstance<G>, context: FeatureContext<G>) => F;\n },\n ): GameInstance<G, F, S> {\n const controller = new Controller(\n options as RuntimeOptions,\n options.features as\n | ((\n core: CoreInstance<unknown>,\n context: FeatureContext<unknown>,\n ) => Features)\n | undefined,\n );\n return controller.instance as unknown as GameInstance<G, F, S>;\n };\n}\n","import type {\n InteractionDescriptor,\n InteractionInputDescriptor,\n InputSelection,\n} from \"../shared/protocol/frame.js\";\nimport { inputDomainErrors, inputValueKey } from \"../shared/input-domain.js\";\nimport type { RuntimeJson } from \"../shared/runtime-json.js\";\n\nexport function interactionInputKeys(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n): string[] {\n return descriptor.inputs.map((input) => input.key);\n}\n\nexport function applyInteractionInputDefaults<\n Params extends Record<string, unknown>,\n>(\n descriptor: Pick<InteractionDescriptor, \"inputs\" | \"step\">,\n params: Readonly<Partial<Params>>,\n): Partial<Params> {\n const next: Record<string, unknown> = descriptor.step\n ? Object.fromEntries(\n Object.entries(params).filter(([key]) =>\n descriptor.inputs.some((input) => input.key === key),\n ),\n )\n : { ...params };\n for (const input of descriptor.inputs) {\n if (next[input.key] !== undefined) continue;\n if (!(\"defaultValue\" in input)) continue;\n next[input.key] = input.defaultValue;\n }\n return next as Partial<Params>;\n}\n\nexport function validateInteractionInputDomains(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n params: Readonly<Record<string, unknown>>,\n): Partial<Record<string, readonly string[]>> {\n const fieldErrors: Record<string, string[]> = {};\n\n for (const rawInput of descriptor.inputs) {\n const input = rawInput;\n const value = params[input.key];\n if (value === undefined) continue;\n for (const error of inputDomainErrors(\n input.domain,\n value,\n input.domain.selection,\n ))\n pushFieldError(fieldErrors, input.key, error);\n }\n\n return fieldErrors;\n}\n\nexport function isInputValueReady(\n input: InteractionInputDescriptor,\n value: unknown,\n): boolean {\n if (value === undefined) return false;\n if (value === null)\n return (\n input.domain.type === \"choice\" &&\n (input.domain.choices ?? []).some(\n (choice) => choice.value === null && !choice.disabled,\n )\n );\n const selection = inputSelection(input);\n if (selection?.mode !== \"many\") return true;\n return Array.isArray(value) && value.length >= selection.min;\n}\n\nexport function isManyInput(input: InteractionInputDescriptor): boolean {\n return inputSelection(input)?.mode === \"many\";\n}\n\nexport function toggleManyValue(\n current: unknown,\n value: RuntimeJson,\n selection: InputSelection,\n): RuntimeJson[] {\n if (selection.mode !== \"many\") return [value];\n const previous = Array.isArray(current) ? (current as RuntimeJson[]) : [];\n const existing = previous.findIndex((item) => sameValue(item, value));\n if (existing >= 0) {\n return previous.filter((item) => !sameValue(item, value));\n }\n if (selection.max !== undefined && previous.length >= selection.max) {\n return previous;\n }\n return [...previous, value];\n}\n\nexport function isManyTargetSelectable(\n input: InteractionInputDescriptor,\n current: unknown,\n targetId: RuntimeJson,\n): boolean {\n const selection = inputSelection(input);\n if (selection?.mode !== \"many\") return true;\n const currentValues = Array.isArray(current)\n ? (current as RuntimeJson[])\n : [];\n if (currentValues.some((item) => sameValue(item, targetId))) return true;\n return selection.max === undefined || currentValues.length < selection.max;\n}\n\nexport function hasInteractionFieldErrors(\n fieldErrors: Partial<Record<string, readonly string[]>>,\n): boolean {\n return Object.values(fieldErrors).some(\n (messages) => (messages?.length ?? 0) > 0,\n );\n}\n\nexport function inputByKey(\n descriptor: Pick<InteractionDescriptor, \"inputs\">,\n key: string,\n): InteractionInputDescriptor | undefined {\n return descriptor.inputs.find((input) => input.key === key);\n}\n\nexport function inputSelection(\n input: InteractionInputDescriptor,\n): InputSelection | undefined {\n if (input.domain.selection) return input.domain.selection;\n // choiceList is already an array domain; expose its selection bounds for toggling and reconciliation.\n if (input.domain.type === \"choiceList\")\n return {\n mode: \"many\",\n min: input.domain.min ?? 0,\n max: input.domain.max ?? input.domain.choices.length,\n };\n return undefined;\n}\n\nfunction pushFieldError(\n fieldErrors: Record<string, string[]>,\n key: string,\n message: string,\n): void {\n fieldErrors[key] = [...(fieldErrors[key] ?? []), message];\n}\n\nfunction sameValue(left: RuntimeJson, right: RuntimeJson): boolean {\n return inputValueKey(left) === inputValueKey(right);\n}\n","import type { InteractionDescriptor } from \"../shared/protocol/frame.js\";\nimport {\n applyInteractionInputDefaults,\n hasInteractionFieldErrors,\n inputByKey,\n interactionInputKeys,\n inputSelection,\n isInputValueReady,\n toggleManyValue,\n validateInteractionInputDomains,\n} from \"./interaction-inputs.js\";\nimport type { RuntimeJson } from \"../shared/runtime-json.js\";\n\nexport interface InteractionDraftMutation {\n key: string;\n value: unknown;\n}\n\nexport interface InteractionDraftReadiness {\n values: Record<string, unknown>;\n missingInputs: readonly string[];\n fieldErrors: Partial<Record<string, readonly string[]>>;\n ready: boolean;\n}\n\nexport interface RoutedInteractionTarget {\n inputKey: string;\n value: RuntimeJson;\n extraInputs?: Record<string, unknown>;\n}\n\nexport interface RoutedCardInputIntent {\n cardInputKey: string;\n cardId: string;\n dropTarget?: {\n inputKey: string;\n value: RuntimeJson;\n };\n}\n\nexport interface RoutedInteractionTargetResult {\n params: Record<string, unknown>;\n readiness: InteractionDraftReadiness;\n}\n\nexport function applyInteractionDraftMutation(\n store: DraftStore,\n descriptor: InteractionDescriptor,\n mutations: readonly InteractionDraftMutation[],\n): Record<string, unknown> {\n const originalDraft: Record<string, unknown> = {\n ...store.getDraft(descriptor.interactionKey),\n };\n const nextDraft: Record<string, unknown> = {\n ...originalDraft,\n };\n\n const currentKeys = new Set(interactionInputKeys(descriptor));\n for (const { key, value } of mutations) {\n if (!descriptor.step || currentKeys.has(key)) nextDraft[key] = value;\n }\n if (descriptor.step) {\n for (const key of Object.keys(nextDraft))\n if (!currentKeys.has(key)) delete nextDraft[key];\n }\n\n const allKeys = new Set([\n ...Object.keys(originalDraft),\n ...Object.keys(nextDraft),\n ]);\n for (const key of allKeys) {\n if (!(key in nextDraft)) {\n store.clearInput(descriptor.interactionKey, key);\n continue;\n }\n if (originalDraft[key] !== nextDraft[key]) {\n store.setInput(descriptor.interactionKey, key, nextDraft[key]);\n }\n }\n\n return nextDraft;\n}\n\nexport function getInteractionDraftReadiness(\n descriptor: InteractionDescriptor,\n draft: Readonly<Record<string, unknown>>,\n): InteractionDraftReadiness {\n const values = applyInteractionInputDefaults<Record<string, unknown>>(\n descriptor,\n draft,\n ) as Record<string, unknown>;\n const missingInputs = interactionInputKeys(descriptor).filter((key) => {\n const input = inputByKey(descriptor, key);\n const value = values[key];\n return input\n ? !isInputValueReady(input, value)\n : value === null || value === undefined;\n });\n const fieldErrors = validateInteractionInputDomains(descriptor, values);\n return {\n values,\n missingInputs,\n fieldErrors,\n ready:\n missingInputs.length === 0 && !hasInteractionFieldErrors(fieldErrors),\n };\n}\n\nexport function routeInteractionTarget(\n store: DraftStore,\n descriptor: InteractionDescriptor,\n target: RoutedInteractionTarget,\n): RoutedInteractionTargetResult {\n const input = inputByKey(descriptor, target.inputKey);\n const currentDraft = store.getDraft(descriptor.interactionKey);\n const selection = input ? inputSelection(input) : undefined;\n const targetValue =\n selection?.mode === \"many\"\n ? toggleManyValue(\n currentDraft[target.inputKey] ?? input?.defaultValue,\n target.value,\n selection,\n )\n : target.value;\n const params = applyInteractionDraftMutation(store, descriptor, [\n ...Object.entries(target.extraInputs ?? {}).map(([key, value]) => ({\n key,\n value,\n })),\n { key: target.inputKey, value: targetValue },\n ]);\n return {\n params,\n readiness: getInteractionDraftReadiness(descriptor, params),\n };\n}\n\nexport function routeCardInputIntent(\n store: DraftStore,\n descriptor: InteractionDescriptor,\n intent: RoutedCardInputIntent,\n): RoutedInteractionTargetResult {\n return routeInteractionTarget(store, descriptor, {\n inputKey: intent.cardInputKey,\n value: intent.cardId,\n extraInputs: intent.dropTarget\n ? { [intent.dropTarget.inputKey]: intent.dropTarget.value }\n : undefined,\n });\n}\n\nexport function shouldAutoSubmitInteraction(\n descriptor: InteractionDescriptor,\n): boolean {\n return (\n descriptor.commit.mode === \"autoWhenReady\" &&\n !descriptor.inputs.some((input) => input.domain.selection?.mode === \"many\")\n );\n}\n\ninterface DraftStore {\n getDraft(key: string): Record<string, unknown>;\n setInput(interaction: string, key: string, value: unknown): void;\n clearInput(interaction: string, key: string): void;\n}\n"],"mappings":"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","names":["data","options","input"]}
|
|
@@ -13,11 +13,11 @@ import {
|
|
|
13
13
|
SystemActionEventSchema,
|
|
14
14
|
canonicalizePluginRuntimeJson,
|
|
15
15
|
digestPluginRuntimeJson
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-XU6WJW6K.js";
|
|
17
17
|
|
|
18
18
|
// src/shared/protocol/protocol.ts
|
|
19
19
|
var DREAMBOARD_PLUGIN_PROTOCOL = "dreamboard-plugin";
|
|
20
|
-
var DREAMBOARD_PLUGIN_PROTOCOL_VERSION =
|
|
20
|
+
var DREAMBOARD_PLUGIN_PROTOCOL_VERSION = 6;
|
|
21
21
|
|
|
22
22
|
// src/shared/protocol/schema.ts
|
|
23
23
|
import { z } from "zod";
|
|
@@ -34,7 +34,8 @@ var PluginPlayerSummarySchema = z.object({
|
|
|
34
34
|
}).strict();
|
|
35
35
|
var PluginSessionDescriptorSchema = z.object({
|
|
36
36
|
sessionId: z.string().min(1),
|
|
37
|
-
players: z.array(PluginPlayerSummarySchema)
|
|
37
|
+
players: z.array(PluginPlayerSummarySchema),
|
|
38
|
+
assets: z.record(z.string(), z.instanceof(Blob)).optional()
|
|
38
39
|
}).strict();
|
|
39
40
|
var ZoneHandlesSnapshotSchema = z.object({
|
|
40
41
|
cardIds: z.array(z.string()),
|
|
@@ -160,7 +161,8 @@ function staticSource(input) {
|
|
|
160
161
|
Object.freeze({
|
|
161
162
|
snapshot,
|
|
162
163
|
connection: "ready",
|
|
163
|
-
request: null
|
|
164
|
+
request: null,
|
|
165
|
+
failure: null
|
|
164
166
|
})
|
|
165
167
|
);
|
|
166
168
|
return {
|
|
@@ -170,7 +172,12 @@ function staticSource(input) {
|
|
|
170
172
|
},
|
|
171
173
|
dispose() {
|
|
172
174
|
store.setState(
|
|
173
|
-
(state) => Object.freeze({
|
|
175
|
+
(state) => Object.freeze({
|
|
176
|
+
snapshot: state.snapshot,
|
|
177
|
+
connection: "closed",
|
|
178
|
+
request: null,
|
|
179
|
+
failure: null
|
|
180
|
+
})
|
|
174
181
|
);
|
|
175
182
|
}
|
|
176
183
|
};
|
|
@@ -273,16 +280,23 @@ function hydrateInteractionRefs(registry, value, path) {
|
|
|
273
280
|
|
|
274
281
|
// src/headless/sources/lifecycle.ts
|
|
275
282
|
import { createStore as createStore2 } from "@tanstack/store";
|
|
283
|
+
import { z as z3 } from "zod";
|
|
284
|
+
var CardImageViewSchema = z3.looseObject({
|
|
285
|
+
frontImage: z3.string().optional(),
|
|
286
|
+
backImage: z3.string().optional()
|
|
287
|
+
});
|
|
276
288
|
function createSourceLifecycle(options) {
|
|
277
289
|
let context = options.context ? immutableCopy(options.context) : null;
|
|
278
290
|
const store = createStore2(
|
|
279
291
|
Object.freeze({
|
|
280
292
|
snapshot: null,
|
|
281
293
|
connection: "connecting",
|
|
282
|
-
request: null
|
|
294
|
+
request: null,
|
|
295
|
+
failure: null
|
|
283
296
|
})
|
|
284
297
|
);
|
|
285
298
|
let session = null;
|
|
299
|
+
let assetUrls = null;
|
|
286
300
|
let basis = null;
|
|
287
301
|
let pending = null;
|
|
288
302
|
let timer;
|
|
@@ -292,22 +306,33 @@ function createSourceLifecycle(options) {
|
|
|
292
306
|
clearTimeout(timer);
|
|
293
307
|
timer = void 0;
|
|
294
308
|
};
|
|
295
|
-
const
|
|
296
|
-
(state)
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
309
|
+
const publish = (state) => {
|
|
310
|
+
if (state.request) Object.freeze(state.request);
|
|
311
|
+
store.setState(() => Object.freeze(state));
|
|
312
|
+
};
|
|
313
|
+
const recovering = () => {
|
|
314
|
+
if (closed) return;
|
|
315
|
+
publish({ ...store.get(), connection: "recovering", failure: null });
|
|
316
|
+
};
|
|
317
|
+
const close = (failure) => {
|
|
303
318
|
if (closed) return;
|
|
304
319
|
closed = true;
|
|
305
320
|
clearTimer();
|
|
306
|
-
|
|
321
|
+
for (const url of Object.values(assetUrls ?? {})) URL.revokeObjectURL(url);
|
|
322
|
+
pending?.reject(failure ?? new Error("Gameplay source disposed."));
|
|
307
323
|
pending = null;
|
|
308
324
|
options.close();
|
|
309
|
-
|
|
325
|
+
const snapshot = store.get().snapshot;
|
|
326
|
+
publish(
|
|
327
|
+
failure ? {
|
|
328
|
+
connection: "failed",
|
|
329
|
+
snapshot,
|
|
330
|
+
request: null,
|
|
331
|
+
failure: Object.freeze(failure)
|
|
332
|
+
} : { connection: "closed", snapshot, request: null, failure: null }
|
|
333
|
+
);
|
|
310
334
|
};
|
|
335
|
+
const fail = (error) => close(error);
|
|
311
336
|
const arm = () => {
|
|
312
337
|
clearTimer();
|
|
313
338
|
timer = setTimeout(() => {
|
|
@@ -316,7 +341,7 @@ function createSourceLifecycle(options) {
|
|
|
316
341
|
return;
|
|
317
342
|
}
|
|
318
343
|
recovered = true;
|
|
319
|
-
|
|
344
|
+
recovering();
|
|
320
345
|
try {
|
|
321
346
|
options.recover();
|
|
322
347
|
if (pending && !pending.accepted) options.send(pending.command);
|
|
@@ -332,7 +357,12 @@ function createSourceLifecycle(options) {
|
|
|
332
357
|
if (!frame || frame.version <= pending.command.basis.version) return;
|
|
333
358
|
clearTimer();
|
|
334
359
|
pending = null;
|
|
335
|
-
|
|
360
|
+
publish({
|
|
361
|
+
snapshot: frame,
|
|
362
|
+
request: null,
|
|
363
|
+
connection: "ready",
|
|
364
|
+
failure: null
|
|
365
|
+
});
|
|
336
366
|
};
|
|
337
367
|
const start = async (operation, interactionId, params) => {
|
|
338
368
|
const state = store.get();
|
|
@@ -355,7 +385,8 @@ function createSourceLifecycle(options) {
|
|
|
355
385
|
const promise = new Promise((resolve, reject) => {
|
|
356
386
|
pending = { command, resolve, reject, accepted: false };
|
|
357
387
|
});
|
|
358
|
-
|
|
388
|
+
publish({
|
|
389
|
+
...state,
|
|
359
390
|
request: {
|
|
360
391
|
interactionId,
|
|
361
392
|
operation,
|
|
@@ -377,7 +408,7 @@ function createSourceLifecycle(options) {
|
|
|
377
408
|
},
|
|
378
409
|
submit: (interactionId, params) => start("submit", interactionId, params),
|
|
379
410
|
cancel: (interactionId) => start("cancel", interactionId),
|
|
380
|
-
dispose: () =>
|
|
411
|
+
dispose: () => close(null)
|
|
381
412
|
};
|
|
382
413
|
return {
|
|
383
414
|
source,
|
|
@@ -391,12 +422,10 @@ function createSourceLifecycle(options) {
|
|
|
391
422
|
}
|
|
392
423
|
},
|
|
393
424
|
fail,
|
|
394
|
-
recovering
|
|
395
|
-
if (!closed) patch({ connection: "recovering" });
|
|
396
|
-
},
|
|
425
|
+
recovering,
|
|
397
426
|
session(value) {
|
|
398
427
|
if (closed) return;
|
|
399
|
-
const parsed = PluginSessionDescriptorSchema.parse(value);
|
|
428
|
+
const { assets, ...parsed } = PluginSessionDescriptorSchema.parse(value);
|
|
400
429
|
if ((context?.sessionId ?? session?.sessionId) && parsed.sessionId !== (context?.sessionId ?? session?.sessionId)) {
|
|
401
430
|
fail(new Error("Gameplay session changed."));
|
|
402
431
|
return;
|
|
@@ -406,6 +435,12 @@ function createSourceLifecycle(options) {
|
|
|
406
435
|
return;
|
|
407
436
|
}
|
|
408
437
|
session = immutableCopy(parsed);
|
|
438
|
+
assetUrls ??= Object.fromEntries(
|
|
439
|
+
Object.entries(assets ?? {}).map(([path, blob]) => [
|
|
440
|
+
path,
|
|
441
|
+
URL.createObjectURL(blob)
|
|
442
|
+
])
|
|
443
|
+
);
|
|
409
444
|
},
|
|
410
445
|
frame(value) {
|
|
411
446
|
if (closed) return;
|
|
@@ -427,9 +462,13 @@ function createSourceLifecycle(options) {
|
|
|
427
462
|
return;
|
|
428
463
|
}
|
|
429
464
|
if (basis && parsed.basis.version < basis.version) return;
|
|
430
|
-
const { basis: nextBasis, ...frame } = immutableCopy(
|
|
465
|
+
const { basis: nextBasis, ...frame } = immutableCopy(
|
|
466
|
+
withCardImageUrls(parsed, assetUrls)
|
|
467
|
+
);
|
|
431
468
|
basis = nextBasis;
|
|
432
|
-
|
|
469
|
+
publish({
|
|
470
|
+
failure: null,
|
|
471
|
+
request: store.get().request,
|
|
433
472
|
snapshot: Object.freeze({
|
|
434
473
|
me: context.playerId,
|
|
435
474
|
players: session.players,
|
|
@@ -457,12 +496,23 @@ function createSourceLifecycle(options) {
|
|
|
457
496
|
if (!result.accepted) {
|
|
458
497
|
clearTimer();
|
|
459
498
|
pending = null;
|
|
460
|
-
|
|
499
|
+
publish({
|
|
500
|
+
snapshot: store.get().snapshot,
|
|
501
|
+
request: null,
|
|
502
|
+
connection: "ready",
|
|
503
|
+
failure: null
|
|
504
|
+
});
|
|
461
505
|
return;
|
|
462
506
|
}
|
|
463
507
|
pending.accepted = true;
|
|
464
508
|
recovered = false;
|
|
465
|
-
|
|
509
|
+
const state = store.get();
|
|
510
|
+
publish({
|
|
511
|
+
connection: state.connection === "recovering" ? "recovering" : "ready",
|
|
512
|
+
snapshot: state.snapshot,
|
|
513
|
+
failure: null,
|
|
514
|
+
request: { ...state.request, phase: "awaiting-frame" }
|
|
515
|
+
});
|
|
466
516
|
arm();
|
|
467
517
|
finishBarrier();
|
|
468
518
|
}
|
|
@@ -471,6 +521,35 @@ function createSourceLifecycle(options) {
|
|
|
471
521
|
function asError(error) {
|
|
472
522
|
return error instanceof Error ? error : new Error(String(error));
|
|
473
523
|
}
|
|
524
|
+
function withCardImageUrls(frame, urls) {
|
|
525
|
+
if (urls === null || Object.keys(urls).length === 0) return frame;
|
|
526
|
+
const resolve = (encoded) => {
|
|
527
|
+
const card = CardImageViewSchema.parse(JSON.parse(encoded));
|
|
528
|
+
for (const key of ["frontImage", "backImage"]) {
|
|
529
|
+
const path = card[key];
|
|
530
|
+
const url = path === void 0 ? void 0 : urls[path];
|
|
531
|
+
if (url !== void 0) card[key] = url;
|
|
532
|
+
}
|
|
533
|
+
return JSON.stringify(card);
|
|
534
|
+
};
|
|
535
|
+
return {
|
|
536
|
+
...frame,
|
|
537
|
+
zones: Object.fromEntries(
|
|
538
|
+
Object.entries(frame.zones).map(([zoneId, zone]) => [
|
|
539
|
+
zoneId,
|
|
540
|
+
{
|
|
541
|
+
...zone,
|
|
542
|
+
cardViewsById: Object.fromEntries(
|
|
543
|
+
Object.entries(zone.cardViewsById).map(([cardId, encoded]) => [
|
|
544
|
+
cardId,
|
|
545
|
+
resolve(encoded)
|
|
546
|
+
])
|
|
547
|
+
)
|
|
548
|
+
}
|
|
549
|
+
])
|
|
550
|
+
)
|
|
551
|
+
};
|
|
552
|
+
}
|
|
474
553
|
|
|
475
554
|
export {
|
|
476
555
|
DREAMBOARD_PLUGIN_PROTOCOL,
|
|
@@ -508,4 +587,4 @@ export {
|
|
|
508
587
|
digestPluginCommandRequest,
|
|
509
588
|
materializePluginGameplayFrame
|
|
510
589
|
};
|
|
511
|
-
//# sourceMappingURL=chunk-
|
|
590
|
+
//# sourceMappingURL=chunk-UG2Q4NLG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/protocol/protocol.ts","../src/shared/protocol/schema.ts","../src/headless/sources/static.ts","../src/shared/protocol/digest.ts","../src/shared/protocol/projection.ts","../src/headless/sources/lifecycle.ts"],"sourcesContent":["import type {\n GameplayBasis,\n InteractionDescriptor,\n PluginGameplayFrame,\n PluginSessionDescriptor,\n} from \"./frame.js\";\nimport type { RuntimeJson } from \"../runtime-json.js\";\n\nexport const DREAMBOARD_PLUGIN_PROTOCOL = \"dreamboard-plugin\" as const;\nexport const DREAMBOARD_PLUGIN_PROTOCOL_VERSION = 6 as const;\n\nexport type InteractionResult =\n | {\n readonly type: \"interaction.result\";\n readonly clientActionId: string;\n readonly accepted: true;\n }\n | {\n readonly type: \"interaction.result\";\n readonly clientActionId: string;\n readonly accepted: false;\n readonly errorCode: string;\n readonly message?: string;\n };\n\nexport interface SubmitInteractionCommand {\n readonly type: \"interaction.submit\";\n readonly clientActionId: string;\n readonly basis: GameplayBasis;\n readonly interactionId: string;\n readonly params: RuntimeJson;\n}\n\nexport interface CancelInteractionCommand {\n readonly type: \"interaction.cancel\";\n readonly clientActionId: string;\n readonly basis: GameplayBasis;\n readonly interactionId: string;\n}\n\nexport type HostToPluginPayload =\n | {\n readonly type: \"runtime.init\";\n readonly session: PluginSessionDescriptor;\n }\n | {\n readonly type: \"gameplay.frame\";\n readonly frame: PluginGameplayFrame;\n }\n | InteractionResult;\n\nexport type PluginToHostPayload =\n | { readonly type: \"runtime.ready\" }\n | { readonly type: \"runtime.resume\" }\n | {\n readonly type: \"runtime.ack\";\n /** Echoes the host envelope sequence. It is delivery order only. */\n readonly sequence: number;\n readonly clientReceivedAtMs?: number;\n readonly clientRenderedAtMs?: number;\n }\n | SubmitInteractionCommand\n | CancelInteractionCommand\n | {\n readonly type: \"runtime.error\";\n readonly message: string;\n readonly code?: string;\n };\n\nexport interface PluginProtocolEnvelope<Payload> {\n readonly protocol: typeof DREAMBOARD_PLUGIN_PROTOCOL;\n readonly version: typeof DREAMBOARD_PLUGIN_PROTOCOL_VERSION;\n readonly channelId: string;\n /** Delivery order only. It is not a game revision. */\n readonly sequence: number;\n readonly payload: Payload;\n}\n\nexport type HostToPluginEnvelope = PluginProtocolEnvelope<HostToPluginPayload>;\nexport type PluginToHostEnvelope = PluginProtocolEnvelope<PluginToHostPayload>;\n\nexport type ActionSetVersionInput = {\n readonly version: number;\n readonly availableInteractions: readonly InteractionDescriptor[];\n};\n","import * as ReducerWireZod from \"../runtime-schema\";\nimport { z } from \"zod\";\nimport {\n DREAMBOARD_PLUGIN_PROTOCOL,\n DREAMBOARD_PLUGIN_PROTOCOL_VERSION,\n} from \"./protocol.js\";\nimport { RuntimeJsonSchema } from \"../runtime-json.js\";\nimport type {\n GameOutcome,\n GameplayBasis,\n PluginGameplayFrame,\n PluginSessionDescriptor,\n ZoneHandlesSnapshot,\n} from \"./frame.js\";\nimport type {\n HostToPluginPayload,\n InteractionResult,\n PluginProtocolEnvelope,\n PluginToHostPayload,\n} from \"./protocol.js\";\n\nexport const BoardStaticProjectionSchema =\n ReducerWireZod.BoardStaticProjectionSchema;\nexport const GameEventDetailSchema = ReducerWireZod.GameEventDetailSchema;\nexport const SystemActionEventSchema = ReducerWireZod.SystemActionEventSchema;\nexport const GameEventSchema = ReducerWireZod.GameEventSchema;\nexport const SeatProjectionBundleSchema =\n ReducerWireZod.SeatProjectionBundleSchema;\n\nexport const PlayerIdSchema = z.string().min(1);\n\nexport const PluginPlayerSummarySchema = z\n .object({\n playerId: PlayerIdSchema,\n displayName: z.string(),\n color: z.string().optional(),\n })\n .strict();\n\nexport const PluginSessionDescriptorSchema = z\n .object({\n sessionId: z.string().min(1),\n players: z.array(PluginPlayerSummarySchema),\n assets: z.record(z.string(), z.instanceof(Blob)).optional(),\n })\n .strict() satisfies z.ZodType<PluginSessionDescriptor>;\n\nexport {\n InteractionCommitPolicySchema,\n InputSelectionSchema,\n InputDomainSchema,\n InteractionChoiceOptionSchema,\n InteractionInputDescriptorSchema,\n InteractionAvailabilitySchema,\n InteractionDescriptorSchema,\n} from \"../interaction-schema.js\";\nimport { InteractionDescriptorSchema } from \"../interaction-schema.js\";\n\nexport const ZoneHandlesSnapshotSchema = z\n .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 })\n .strict() satisfies z.ZodType<ZoneHandlesSnapshot>;\n\nexport const SimultaneousPhaseSnapshotSchema =\n ReducerWireZod.SimultaneousPhaseProjectionSchema;\n\nexport const GameplayBasisSchema = z\n .object({\n version: z.number().int().nonnegative(),\n actionSetVersion: z.string().min(1),\n perspectivePlayerId: PlayerIdSchema,\n })\n .strict() satisfies z.ZodType<GameplayBasis>;\n\nexport const GameOutcomeSchema =\n ReducerWireZod.GameOutcomeSchema satisfies z.ZodType<GameOutcome>;\n\nexport const SeatFrameSchema = z\n .object({\n events: z.array(GameEventSchema).max(32),\n view: z.record(z.string(), RuntimeJsonSchema).nullable(),\n flow: z\n .object({\n currentPhase: z.string().nullable(),\n activePlayers: z.array(PlayerIdSchema),\n simultaneousPhase: SimultaneousPhaseSnapshotSchema.nullable(),\n })\n .strict(),\n availableInteractions: z.array(InteractionDescriptorSchema),\n zones: z.record(z.string(), ZoneHandlesSnapshotSchema),\n })\n .strict();\n\nexport const PluginGameplayFrameSchema = SeatFrameSchema.extend({\n basis: GameplayBasisSchema,\n}) satisfies z.ZodType<PluginGameplayFrame>;\n\nexport const InteractionResultSchema = z.discriminatedUnion(\"accepted\", [\n z\n .object({\n type: z.literal(\"interaction.result\"),\n clientActionId: z.string().min(1),\n accepted: z.literal(true),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"interaction.result\"),\n clientActionId: z.string().min(1),\n accepted: z.literal(false),\n errorCode: z.string().min(1),\n message: z.string().optional(),\n })\n .strict(),\n]) satisfies z.ZodType<InteractionResult>;\n\nexport const SubmitInteractionCommandSchema = z\n .object({\n type: z.literal(\"interaction.submit\"),\n clientActionId: z.string().min(1),\n basis: GameplayBasisSchema,\n interactionId: z.string().min(1),\n params: RuntimeJsonSchema,\n })\n .strict();\n\nexport const CancelInteractionCommandSchema =\n SubmitInteractionCommandSchema.omit({ params: true })\n .extend({ type: z.literal(\"interaction.cancel\") })\n .strict();\n\nexport const HostToPluginPayloadSchema = z.discriminatedUnion(\"type\", [\n z\n .object({\n type: z.literal(\"runtime.init\"),\n session: PluginSessionDescriptorSchema,\n })\n .strict(),\n z\n .object({\n type: z.literal(\"gameplay.frame\"),\n frame: PluginGameplayFrameSchema,\n })\n .strict(),\n InteractionResultSchema,\n]) satisfies z.ZodType<HostToPluginPayload>;\n\nexport const PluginToHostPayloadSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"runtime.ready\") }).strict(),\n z.object({ type: z.literal(\"runtime.resume\") }).strict(),\n z\n .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 })\n .strict(),\n SubmitInteractionCommandSchema,\n CancelInteractionCommandSchema,\n z\n .object({\n type: z.literal(\"runtime.error\"),\n message: z.string(),\n code: z.string().optional(),\n })\n .strict(),\n]) satisfies z.ZodType<PluginToHostPayload>;\n\nexport function createPluginProtocolEnvelopeSchema<Payload>(\n payloadSchema: z.ZodType<Payload>,\n): z.ZodType<PluginProtocolEnvelope<Payload>> {\n return z\n .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 })\n .strict();\n}\n\nexport const HostToPluginEnvelopeSchema = createPluginProtocolEnvelopeSchema(\n HostToPluginPayloadSchema,\n);\n\nexport const PluginToHostEnvelopeSchema = createPluginProtocolEnvelopeSchema(\n PluginToHostPayloadSchema,\n);\n\nexport function parsePluginSessionDescriptor(\n value: unknown,\n): PluginSessionDescriptor {\n return PluginSessionDescriptorSchema.parse(value);\n}\n\nexport function parsePluginGameplayFrame(value: unknown): PluginGameplayFrame {\n return PluginGameplayFrameSchema.parse(value);\n}\n\nexport function parseHostToPluginEnvelope(\n value: unknown,\n): PluginProtocolEnvelope<HostToPluginPayload> {\n return HostToPluginEnvelopeSchema.parse(value);\n}\n\nexport function parsePluginToHostEnvelope(\n value: unknown,\n): PluginProtocolEnvelope<PluginToHostPayload> {\n return PluginToHostEnvelopeSchema.parse(value);\n}\n","import { createStore } from \"@tanstack/store\";\nimport { z } from \"zod\";\nimport {\n SeatFrameSchema,\n PluginPlayerSummarySchema,\n} from \"../../shared/protocol/schema.js\";\nimport { immutableCopy } from \"./immutable.js\";\nimport type { GameSource, SourceSnapshot, SourceState } from \"./types.js\";\n\nexport const SourceSnapshotSchema = z\n .object({\n me: z.string().min(1),\n players: z.array(PluginPlayerSummarySchema),\n frame: SeatFrameSchema,\n version: z.number().int().nonnegative(),\n })\n .strict();\n\n/** A read-only fixture source accepts the public seat snapshot, never wire basis. */\nexport function staticSource(input: SourceSnapshot): GameSource {\n const snapshot = immutableCopy(SourceSnapshotSchema.parse(input));\n if (!snapshot.players.some((player) => player.playerId === snapshot.me))\n throw new Error(\"Gameplay seat is absent from session.\");\n const store = createStore<SourceState>(\n Object.freeze({\n snapshot,\n connection: \"ready\",\n request: null,\n failure: null,\n }),\n );\n return {\n store: {\n get: () => store.get(),\n subscribe: (listener) => store.subscribe(listener),\n },\n dispose() {\n store.setState((state) =>\n Object.freeze({\n snapshot: state.snapshot,\n connection: \"closed\",\n request: null,\n failure: null,\n }),\n );\n },\n };\n}\n","import type { PluginGameplayFrame } from \"./frame.js\";\nimport {\n type ActionSetVersionInput,\n type SubmitInteractionCommand,\n type CancelInteractionCommand,\n} from \"./protocol.js\";\nimport {\n canonicalizePluginRuntimeJson,\n digestPluginRuntimeJson,\n encodeCanonicalPluginRuntimeJson,\n} from \"./json.js\";\n\nexport {\n canonicalizePluginRuntimeJson,\n digestPluginRuntimeJson,\n encodeCanonicalPluginRuntimeJson,\n};\n\nexport function computePluginActionSetVersion(\n input: ActionSetVersionInput,\n): string {\n return digestPluginRuntimeJson({\n digestVersion: \"plugin-action-set@5\",\n version: input.version,\n availableInteractions: input.availableInteractions,\n });\n}\n\nexport function digestPluginGameplayFrame(frame: PluginGameplayFrame): string {\n return digestPluginRuntimeJson({\n digestVersion: \"plugin-gameplay-frame@5\",\n frame,\n });\n}\n\nexport function digestPluginCommandRequest(\n command: SubmitInteractionCommand | CancelInteractionCommand,\n): string {\n return digestPluginRuntimeJson({\n digestVersion: \"plugin-command-request@5\",\n command,\n });\n}\n","import { canonicalizePluginRuntimeJson } from \"./json\";\nimport {\n BoardStaticProjectionSchema,\n PluginGameplayFrameSchema,\n SeatProjectionBundleSchema,\n} from \"./schema.js\";\nimport type {\n InteractionDescriptor,\n PlayerId,\n PluginGameplayFrame,\n ReducerBoardStaticProjection,\n ReducerSeatProjectionBundle,\n ZoneHandlesSnapshot,\n} from \"./frame.js\";\nimport type { RuntimeJson } from \"../runtime-json.js\";\n\nexport interface MaterializePluginGameplayFrameInput {\n readonly currentPhase: string | null;\n readonly activePlayers: readonly PlayerId[];\n readonly dynamicProjection: ReducerSeatProjectionBundle;\n readonly staticProjection?: ReducerBoardStaticProjection | null;\n readonly perspectivePlayerId: PlayerId;\n\n readonly version: number;\n readonly actionSetVersion: string;\n}\n\nexport function materializePluginGameplayFrame(\n input: MaterializePluginGameplayFrameInput,\n): PluginGameplayFrame {\n const dynamicProjection = SeatProjectionBundleSchema.parse(\n canonicalizePluginRuntimeJson(input.dynamicProjection),\n );\n const staticProjection =\n input.staticProjection == null\n ? null\n : BoardStaticProjectionSchema.parse(\n canonicalizePluginRuntimeJson(input.staticProjection),\n );\n\n const registry = dynamicProjection.interactionsByRef ?? {};\n const seat = dynamicProjection.seats[input.perspectivePlayerId] ?? null;\n\n const availableInteractions =\n seat == null\n ? []\n : hydrateInteractionRefs(\n registry,\n seat.availableInteractionRefs ?? [],\n \"availableInteractionRefs\",\n );\n const zones =\n seat?.zones == null ? {} : hydrateZones(registry, seat.zones, \"zones\");\n\n const frame = {\n events: dynamicProjection.events,\n basis: {\n version: input.version,\n actionSetVersion: input.actionSetVersion,\n perspectivePlayerId: input.perspectivePlayerId,\n },\n view: materializeView(staticProjection, seat?.view),\n flow: {\n currentPhase: input.currentPhase,\n activePlayers: [...input.activePlayers],\n simultaneousPhase: dynamicProjection.simultaneousPhase ?? null,\n },\n availableInteractions,\n zones,\n } satisfies PluginGameplayFrame;\n\n return PluginGameplayFrameSchema.parse(frame);\n}\n\nfunction materializeView(\n staticProjection: ReducerBoardStaticProjection | null,\n seatView: unknown,\n): RuntimeJson | null {\n const parts = [staticProjection?.view, seatView].filter(\n (part) => part !== undefined && part !== null,\n );\n if (parts.length === 0) return null;\n // Admitting schemas guarantee records and reject authored `boards` fields.\n return Object.assign({}, ...parts) as Record<string, RuntimeJson>;\n}\n\nfunction hydrateZones(\n registry: Readonly<Record<string, InteractionDescriptor>>,\n value: NonNullable<ReducerSeatProjectionBundle[\"seats\"][string][\"zones\"]>,\n path: string,\n): Record<string, ZoneHandlesSnapshot> {\n return Object.fromEntries(\n Object.entries(value).map(([zoneId, zone]) => [\n zoneId,\n {\n cardIds: zone.cardIds,\n cardViewsById: zone.cardViewsById,\n playableByCardId: Object.fromEntries(\n Object.entries(zone.playableByCardId).map(([cardId, refs]) => [\n cardId,\n hydrateInteractionRefs(\n registry,\n refs,\n `${path}.${zoneId}.playableByCardId.${cardId}`,\n ),\n ]),\n ),\n },\n ]),\n );\n}\n\nfunction hydrateInteractionRefs(\n registry: Readonly<Record<string, InteractionDescriptor>>,\n value: readonly string[],\n path: string,\n): InteractionDescriptor[] {\n return value.map((ref, index) => {\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}\n","import { createStore } from \"@tanstack/store\";\nimport { z } from \"zod\";\nimport type { ViewCard } from \"../../shared/domain/cards.js\";\nimport {\n PluginGameplayFrameSchema,\n PluginSessionDescriptorSchema,\n InteractionResultSchema,\n PluginToHostPayloadSchema,\n} from \"../../shared/protocol/schema.js\";\nimport type {\n GameplayBasis,\n PluginGameplayFrame,\n PluginSessionDescriptor,\n} from \"../../shared/protocol/frame.js\";\nimport { immutableCopy } from \"./immutable.js\";\nimport type {\n CommandSource,\n SourceCommand,\n SourceContext,\n SourceState,\n SubmitResult,\n} from \"./types.js\";\n\ninterface Pending {\n readonly command: SourceCommand;\n readonly resolve: (result: SubmitResult) => void;\n readonly reject: (error: Error) => void;\n accepted: boolean;\n}\n\nconst CardImageViewSchema = z.looseObject({\n frontImage: z.string().optional(),\n backImage: z.string().optional(),\n}) satisfies z.ZodType<Pick<ViewCard, \"frontImage\" | \"backImage\">>;\n\n/** Adapter-private lifecycle. Transport callbacks must belong to this lifetime. */\nexport function createSourceLifecycle(options: {\n context?: SourceContext;\n send(command: SourceCommand): void;\n recover(): void;\n close(): void;\n timeoutMs?: number;\n}) {\n let context = options.context ? immutableCopy(options.context) : null;\n const store = createStore<SourceState>(\n Object.freeze({\n snapshot: null,\n connection: \"connecting\",\n request: null,\n failure: null,\n }),\n );\n let session: Omit<PluginSessionDescriptor, \"assets\"> | null = null;\n let assetUrls: Readonly<Record<string, string>> | null = null;\n let basis: GameplayBasis | null = null;\n let pending: Pending | null = null;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let recovered = false;\n let closed = false;\n const clearTimer = () => {\n clearTimeout(timer);\n timer = undefined;\n };\n const publish = (state: SourceState) => {\n if (state.request) Object.freeze(state.request);\n store.setState(() => Object.freeze(state));\n };\n const recovering = () => {\n if (closed) return;\n publish({ ...store.get(), connection: \"recovering\", failure: null });\n };\n const close = (failure: Error | null) => {\n if (closed) return;\n closed = true;\n clearTimer();\n for (const url of Object.values(assetUrls ?? {})) URL.revokeObjectURL(url);\n pending?.reject(failure ?? new Error(\"Gameplay source disposed.\"));\n pending = null;\n options.close();\n const snapshot = store.get().snapshot;\n publish(\n failure\n ? {\n connection: \"failed\",\n snapshot,\n request: null,\n failure: Object.freeze(failure),\n }\n : { connection: \"closed\", snapshot, request: null, failure: null },\n );\n };\n const fail = (error: Error) => close(error);\n const arm = () => {\n clearTimer();\n timer = setTimeout(() => {\n if (recovered) {\n fail(new Error(\"Gameplay source recovery timed out.\"));\n return;\n }\n recovered = true;\n recovering();\n try {\n options.recover();\n if (pending && !pending.accepted) options.send(pending.command);\n arm();\n } catch (error) {\n fail(asError(error));\n }\n }, options.timeoutMs ?? 10_000);\n };\n const finishBarrier = () => {\n if (!pending?.accepted) return;\n const frame = store.get().snapshot;\n if (!frame || frame.version <= pending.command.basis.version) return;\n clearTimer();\n pending = null;\n publish({\n snapshot: frame,\n request: null,\n connection: \"ready\",\n failure: null,\n });\n };\n const start = async (\n operation: \"submit\" | \"cancel\",\n interactionId: string,\n params?: unknown,\n ) => {\n const state = store.get();\n if (closed || state.connection !== \"ready\" || !basis)\n return Promise.reject(new Error(\"Gameplay source is not open.\"));\n if (pending)\n return Promise.reject(\n new Error(\"A gameplay interaction is already pending.\"),\n );\n const command = immutableCopy(\n PluginToHostPayloadSchema.parse({\n type:\n operation === \"cancel\" ? \"interaction.cancel\" : \"interaction.submit\",\n clientActionId: crypto.randomUUID(),\n basis,\n interactionId,\n ...(operation === \"cancel\" ? {} : { params }),\n }) as SourceCommand,\n );\n recovered = false;\n const promise = new Promise<SubmitResult>((resolve, reject) => {\n pending = { command, resolve, reject, accepted: false };\n });\n publish({\n ...state,\n request: {\n interactionId,\n operation,\n phase: \"awaiting-result\",\n },\n });\n arm();\n try {\n options.send(command);\n } catch (error) {\n fail(asError(error));\n }\n return promise;\n };\n const source: CommandSource = {\n store: {\n get: () => store.get(),\n subscribe: (listener) => store.subscribe(listener),\n },\n submit: (interactionId, params) => start(\"submit\", interactionId, params),\n cancel: (interactionId) => start(\"cancel\", interactionId),\n dispose: () => close(null),\n };\n return {\n source,\n retry() {\n if (closed || !pending) return;\n try {\n if (pending.accepted) options.recover();\n else options.send(pending.command);\n } catch (error) {\n fail(asError(error));\n }\n },\n fail,\n recovering,\n session(value: unknown) {\n if (closed) return;\n const { assets, ...parsed } = PluginSessionDescriptorSchema.parse(value);\n if (\n (context?.sessionId ?? session?.sessionId) &&\n parsed.sessionId !== (context?.sessionId ?? session?.sessionId)\n ) {\n fail(new Error(\"Gameplay session changed.\"));\n return;\n }\n if (\n context &&\n !parsed.players.some((player) => player.playerId === context!.playerId)\n ) {\n fail(new Error(\"Gameplay seat is absent from session.\"));\n return;\n }\n session = immutableCopy(parsed);\n // Hosts repeat initialization until ready; the first delivery wins.\n assetUrls ??= Object.fromEntries(\n Object.entries(assets ?? {}).map(([path, blob]) => [\n path,\n URL.createObjectURL(blob),\n ]),\n );\n },\n frame(value: unknown) {\n if (closed) return;\n const parsed = PluginGameplayFrameSchema.parse(value);\n if (!session) {\n fail(new Error(\"Gameplay frame arrived before session metadata.\"));\n return;\n }\n context ??= {\n sessionId: session.sessionId,\n playerId: parsed.basis.perspectivePlayerId,\n };\n if (parsed.basis.perspectivePlayerId !== context.playerId) {\n fail(new Error(\"Gameplay perspective changed.\"));\n return;\n }\n if (\n !session.players.some((player) => player.playerId === context!.playerId)\n ) {\n fail(new Error(\"Gameplay seat is absent from session.\"));\n return;\n }\n if (basis && parsed.basis.version < basis.version) return;\n const { basis: nextBasis, ...frame } = immutableCopy(\n withCardImageUrls(parsed, assetUrls),\n );\n basis = nextBasis;\n publish({\n failure: null,\n request: store.get().request,\n snapshot: Object.freeze({\n me: context.playerId,\n players: session.players,\n frame: Object.freeze(frame),\n version: basis.version,\n }),\n connection: \"ready\",\n });\n finishBarrier();\n },\n result(value: unknown) {\n if (closed) return;\n const result = InteractionResultSchema.parse(value);\n if (\n !pending ||\n result.clientActionId !== pending.command.clientActionId ||\n pending.accepted\n )\n return;\n pending.resolve(\n immutableCopy(\n result.accepted\n ? { accepted: true }\n : {\n accepted: false,\n errorCode: result.errorCode,\n ...(result.message === undefined\n ? {}\n : { message: result.message }),\n },\n ),\n );\n if (!result.accepted) {\n clearTimer();\n pending = null;\n publish({\n snapshot: store.get().snapshot!,\n request: null,\n connection: \"ready\",\n failure: null,\n });\n return;\n }\n pending.accepted = true;\n recovered = false;\n const state = store.get();\n // A pending command was submitted from ready, so its snapshot exists.\n publish({\n connection: state.connection === \"recovering\" ? \"recovering\" : \"ready\",\n snapshot: state.snapshot!,\n failure: null,\n request: { ...state.request!, phase: \"awaiting-frame\" },\n });\n arm();\n finishBarrier();\n },\n };\n}\nfunction asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/** Replaces card image paths in encoded card views with delivered URLs. */\nfunction withCardImageUrls(\n frame: PluginGameplayFrame,\n urls: Readonly<Record<string, string>> | null,\n): PluginGameplayFrame {\n if (urls === null || Object.keys(urls).length === 0) return frame;\n const resolve = (encoded: string) => {\n const card = CardImageViewSchema.parse(JSON.parse(encoded) as unknown);\n for (const key of [\"frontImage\", \"backImage\"] as const) {\n const path = card[key];\n const url = path === undefined ? undefined : urls[path];\n if (url !== undefined) card[key] = url;\n }\n return JSON.stringify(card);\n };\n return {\n ...frame,\n zones: Object.fromEntries(\n Object.entries(frame.zones).map(([zoneId, zone]) => [\n zoneId,\n {\n ...zone,\n cardViewsById: Object.fromEntries(\n Object.entries(zone.cardViewsById).map(([cardId, encoded]) => [\n cardId,\n resolve(encoded),\n ]),\n ),\n },\n ]),\n ),\n };\n}\n"],"mappings":"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","names":["BoardStaticProjectionSchema","GameEventDetailSchema","SystemActionEventSchema","GameEventSchema","SeatProjectionBundleSchema","GameOutcomeSchema","z","z","SeatProjectionBundleSchema","BoardStaticProjectionSchema","createStore","z","z","createStore"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
+
PlayerBoardSpaceTargetSchema,
|
|
2
3
|
__export
|
|
3
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-3JXUL4VN.js";
|
|
4
5
|
|
|
5
6
|
// src/shared/runtime-json.ts
|
|
6
7
|
import { z } from "zod";
|
|
@@ -40,15 +41,26 @@ var InputDomainSchema = z2.discriminatedUnion("type", [
|
|
|
40
41
|
eligibleTargets: z2.array(z2.string()),
|
|
41
42
|
...selection
|
|
42
43
|
}),
|
|
43
|
-
z2.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
z2.discriminatedUnion("valueKind", [
|
|
45
|
+
z2.strictObject({
|
|
46
|
+
type: z2.literal("boardTarget"),
|
|
47
|
+
projection: z2.literal("resolved"),
|
|
48
|
+
targetKind: z2.enum(["edge", "vertex", "space", "tile"]),
|
|
49
|
+
boardId: z2.string(),
|
|
50
|
+
valueKind: z2.literal("board-id"),
|
|
51
|
+
eligibleTargets: z2.array(z2.string()),
|
|
52
|
+
...selection
|
|
53
|
+
}),
|
|
54
|
+
z2.strictObject({
|
|
55
|
+
type: z2.literal("boardTarget"),
|
|
56
|
+
projection: z2.literal("resolved"),
|
|
57
|
+
targetKind: z2.literal("space"),
|
|
58
|
+
boardId: z2.string(),
|
|
59
|
+
valueKind: z2.literal("player-board-space"),
|
|
60
|
+
eligibleTargets: z2.array(PlayerBoardSpaceTargetSchema),
|
|
61
|
+
...selection
|
|
62
|
+
})
|
|
63
|
+
]),
|
|
52
64
|
z2.strictObject({
|
|
53
65
|
type: z2.literal("resourceMap"),
|
|
54
66
|
resources: z2.array(
|
|
@@ -423,7 +435,9 @@ var AuthoredViewSchema = z3.object({
|
|
|
423
435
|
var SeatProjectionSchema = z3.strictObject({
|
|
424
436
|
view: AuthoredViewSchema.nullable().optional(),
|
|
425
437
|
availableInteractionRefs: z3.array(z3.string()).optional(),
|
|
426
|
-
zones: z3.record(z3.string(), ZoneInteractionRefsSchema).optional()
|
|
438
|
+
zones: z3.record(z3.string(), ZoneInteractionRefsSchema).optional(),
|
|
439
|
+
/** Resource balances by player that this seat may see. */
|
|
440
|
+
resources: z3.record(z3.string(), z3.record(z3.string(), z3.number().int())).optional()
|
|
427
441
|
});
|
|
428
442
|
var SimultaneousPhaseProjectionSchema = z3.strictObject({
|
|
429
443
|
phaseName: z3.string().min(1),
|
|
@@ -830,4 +844,4 @@ export {
|
|
|
830
844
|
encodeCanonicalPluginRuntimeJson,
|
|
831
845
|
digestPluginRuntimeJson
|
|
832
846
|
};
|
|
833
|
-
//# sourceMappingURL=chunk-
|
|
847
|
+
//# sourceMappingURL=chunk-XU6WJW6K.js.map
|