@dreamboard-games/sdk 0.5.0-alpha.12 → 0.5.0-alpha.14
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 +71 -2
- package/dist/{chunk-2IGXAYW4.js → chunk-W5G6VMMQ.js} +18 -15
- package/dist/chunk-W5G6VMMQ.js.map +1 -0
- package/dist/index.d.ts +119 -3
- package/dist/index.js +248 -2
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +22 -6
- package/dist/react.js +282 -33
- package/dist/react.js.map +1 -1
- package/dist/{model-BeslAXVA.d.ts → shortcuts-Chlx8o7p.d.ts} +93 -8
- package/package.json +1 -1
- package/dist/chunk-2IGXAYW4.js.map +0 -1
package/README.md
CHANGED
|
@@ -349,13 +349,82 @@ install the React adapter. The `/react` entry delegates selectors to that packag
|
|
|
349
349
|
the application bundler resolves its supported React subscription dependencies.
|
|
350
350
|
|
|
351
351
|
`/react` classifies each card press as a tap, hold, drag or browse. Enable
|
|
352
|
-
`dragFeature`, export `useCardGesture`, `useDropArea` and `useDragOverlay` from the
|
|
352
|
+
`dragFeature`, export `useCardGesture`, `useActiveCard`, `useDropArea` and `useDragOverlay` from the
|
|
353
353
|
binding, and use the copied Hand and BoardTargets components or your own renderer.
|
|
354
354
|
The SDK prescribes no layout. Headless `game.drag` remains browser-free and handles
|
|
355
|
-
atomic domain routing. `fanLayout` computes arc positions for a hand,
|
|
355
|
+
atomic domain routing. `fanLayout` computes arc positions for a hand,
|
|
356
|
+
`handFan` adds a focused, readable card with configurable presets and timing,
|
|
357
|
+
and
|
|
356
358
|
`originsFeature` adds `card.getOrigin()` so a newly shown card can animate from
|
|
357
359
|
the zone or player it came from.
|
|
358
360
|
|
|
361
|
+
## Opt-in game shortcuts
|
|
362
|
+
|
|
363
|
+
Install `shortcutsFeature` in the same `createGameHook<Definition>()` binding as
|
|
364
|
+
other features, and export its inferred `useGameShortcuts` and
|
|
365
|
+
`useShortcutTarget` and `useShortcutHints` hooks. A child inside the bound `GameProvider` installs the
|
|
366
|
+
app's bindings once:
|
|
367
|
+
|
|
368
|
+
```tsx
|
|
369
|
+
function AppShortcuts() {
|
|
370
|
+
useGameShortcuts({
|
|
371
|
+
bindings: [
|
|
372
|
+
{
|
|
373
|
+
keys: ["1", "2", "3", "4", "5", "6", "7", "8", "9"],
|
|
374
|
+
label: "Draw cards",
|
|
375
|
+
target: "zone",
|
|
376
|
+
zoneId: "deck",
|
|
377
|
+
interaction: "play.draw",
|
|
378
|
+
inputs: ({ key }) => ({ count: Number(key) }),
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
keys: ["f"],
|
|
382
|
+
label: "Flip card",
|
|
383
|
+
target: "card",
|
|
384
|
+
input: "card",
|
|
385
|
+
interaction: "play.flip",
|
|
386
|
+
inputs: ({ target }) => ({ card: target.value }),
|
|
387
|
+
},
|
|
388
|
+
],
|
|
389
|
+
});
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
These interaction and input names are examples from an authored reducer. The
|
|
395
|
+
binding's discriminated types derive from that reducer: interaction names,
|
|
396
|
+
input keys, target kinds, and every required payload field must match. A game
|
|
397
|
+
that exposes a counted draw submits one `count` payload; shortcuts never repeat
|
|
398
|
+
a draw-one action. No actions or keys are supplied by default.
|
|
399
|
+
|
|
400
|
+
Card controls using `useCardGesture` share its canonical pointer and keyboard
|
|
401
|
+
focus. Zone controls spread
|
|
402
|
+
`useShortcutTarget({ kind: "zone", zoneId: "deck", hostId: "table" }).props`;
|
|
403
|
+
`hostId` must be the actual host allowed by that zone's attachment. Selectable
|
|
404
|
+
board and tile controls can use the same hook with their canonical
|
|
405
|
+
`SelectionTarget`. Hidden cards retain their opaque seat references.
|
|
406
|
+
|
|
407
|
+
Keys are exact browser `event.key` strings. The adapter ignores held repeats,
|
|
408
|
+
composition, editing controls, modifier combinations, and open modal or menu
|
|
409
|
+
surfaces. It prevents the browser default only when a single eligible binding
|
|
410
|
+
handles the key. Source and seat changes clear the gesture target; unmounting
|
|
411
|
+
removes the listener and binding hints.
|
|
412
|
+
|
|
413
|
+
Input factories must be pure: eligibility and hints evaluate them against the
|
|
414
|
+
current projected domains. `game.shortcuts.getHints(target)` returns only
|
|
415
|
+
currently usable, unambiguous keys with their labels and typed interaction
|
|
416
|
+
names, for menus or help. `useShortcutHints(target)` reads those hints reactively
|
|
417
|
+
and returns no hints when the feature is absent. The mounted
|
|
418
|
+
`useGameShortcuts` hook returns `{ target, hints }` for a reserved help/status
|
|
419
|
+
area. Rejected actions and transport failures use the binding's existing
|
|
420
|
+
`onError` handler; callbacks from an old source, seat, or unmounted child are
|
|
421
|
+
ignored. `game.shortcuts.handle(key, target)` uses the same
|
|
422
|
+
atomic `interaction.submit(params)` path available to authored action buttons.
|
|
423
|
+
Explicit params are validated against the current projected descriptor without
|
|
424
|
+
mutating drafts. Existing `submit()` continues to submit the interaction draft
|
|
425
|
+
and defaults; both forms share availability and in-flight lifecycle barriers.
|
|
426
|
+
The headless feature installs no DOM listeners.
|
|
427
|
+
|
|
359
428
|
## Local development and tests
|
|
360
429
|
|
|
361
430
|
`localSource(game, { players, seed, as, options })` executes the production reducer
|
|
@@ -324,8 +324,9 @@ var InteractionObject = class {
|
|
|
324
324
|
getAvailability() {
|
|
325
325
|
return this.descriptor.availability;
|
|
326
326
|
}
|
|
327
|
-
getIsAvailable() {
|
|
328
|
-
|
|
327
|
+
getIsAvailable(params) {
|
|
328
|
+
const descriptor = params === void 0 ? this.descriptor : this.owner.descriptorFor(this.descriptor, params);
|
|
329
|
+
return descriptor.availability.status === "available";
|
|
329
330
|
}
|
|
330
331
|
getUnavailableReason() {
|
|
331
332
|
return this.descriptor.availability.status === "available" ? null : this.descriptor.availability.reason;
|
|
@@ -349,11 +350,14 @@ var InteractionObject = class {
|
|
|
349
350
|
getInputs() {
|
|
350
351
|
return this.inputObjects;
|
|
351
352
|
}
|
|
352
|
-
readiness() {
|
|
353
|
-
return getInteractionDraftReadiness(
|
|
353
|
+
readiness(params = this.draft) {
|
|
354
|
+
return getInteractionDraftReadiness(
|
|
355
|
+
this.owner.descriptorFor(this.descriptor, params),
|
|
356
|
+
params
|
|
357
|
+
);
|
|
354
358
|
}
|
|
355
|
-
getIsReady() {
|
|
356
|
-
return this.readiness().ready;
|
|
359
|
+
getIsReady(params) {
|
|
360
|
+
return this.readiness(params).ready;
|
|
357
361
|
}
|
|
358
362
|
getMissingInputs() {
|
|
359
363
|
return this.readiness().missingInputs;
|
|
@@ -364,8 +368,8 @@ var InteractionObject = class {
|
|
|
364
368
|
currentLifetime() {
|
|
365
369
|
return this.source === this.owner.options.source && this.epoch === this.owner.epoch && !this.owner.disposed;
|
|
366
370
|
}
|
|
367
|
-
submit() {
|
|
368
|
-
return this.currentLifetime() ? this.owner.submit(this.key, false) : Promise.resolve({ accepted: false, errorCode: "CLOSED" });
|
|
371
|
+
submit(params) {
|
|
372
|
+
return this.currentLifetime() ? this.owner.submit(this.key, false, params) : Promise.resolve({ accepted: false, errorCode: "CLOSED" });
|
|
369
373
|
}
|
|
370
374
|
cancel() {
|
|
371
375
|
return this.currentLifetime() ? this.owner.submit(this.key, true) : Promise.resolve({ accepted: false, errorCode: "CLOSED" });
|
|
@@ -1129,13 +1133,13 @@ var Controller = class {
|
|
|
1129
1133
|
}
|
|
1130
1134
|
);
|
|
1131
1135
|
}
|
|
1132
|
-
async submit(key, cancel) {
|
|
1136
|
+
async submit(key, cancel, params) {
|
|
1133
1137
|
const source = this.options.source;
|
|
1134
1138
|
const interaction = this.current(key);
|
|
1135
1139
|
if (this.disposed || this.sourceState.connection !== "ready" || this.sourceState.request || this.pending)
|
|
1136
1140
|
return { accepted: false, errorCode: "BUSY" };
|
|
1137
1141
|
if (!interaction) return { accepted: false, errorCode: "UNAVAILABLE" };
|
|
1138
|
-
if (cancel ? !interaction.getStep()?.canCancel : !interaction.getIsAvailable() || !interaction.getIsReady())
|
|
1142
|
+
if (cancel ? !interaction.getStep()?.canCancel : !interaction.getIsAvailable(params) || !interaction.getIsReady(params))
|
|
1139
1143
|
return { accepted: false, errorCode: "UNAVAILABLE" };
|
|
1140
1144
|
if (!("submit" in source) || !("cancel" in source))
|
|
1141
1145
|
return { accepted: false, errorCode: "READ_ONLY" };
|
|
@@ -1143,8 +1147,7 @@ var Controller = class {
|
|
|
1143
1147
|
const operation = {
|
|
1144
1148
|
source,
|
|
1145
1149
|
key,
|
|
1146
|
-
|
|
1147
|
-
revision: this.revisions.get(key) ?? 0,
|
|
1150
|
+
draftRevision: params === void 0 ? this.revisions.get(key) ?? 0 : void 0,
|
|
1148
1151
|
version: this.sourceState.snapshot.version,
|
|
1149
1152
|
epoch: this.epoch,
|
|
1150
1153
|
accepted: false,
|
|
@@ -1154,7 +1157,7 @@ var Controller = class {
|
|
|
1154
1157
|
try {
|
|
1155
1158
|
const result = await (cancel ? commandSource.cancel(interaction.id) : commandSource.submit(
|
|
1156
1159
|
interaction.id,
|
|
1157
|
-
interaction.readiness().values
|
|
1160
|
+
interaction.readiness(params).values
|
|
1158
1161
|
));
|
|
1159
1162
|
if (this.pending !== operation) return result;
|
|
1160
1163
|
if (!result.accepted) {
|
|
@@ -1185,7 +1188,7 @@ var Controller = class {
|
|
|
1185
1188
|
if (this.sourceState.connection !== "ready" || (this.sourceState.snapshot?.version ?? -1) <= operation.version)
|
|
1186
1189
|
return;
|
|
1187
1190
|
this.pending = null;
|
|
1188
|
-
if ((this.revisions.get(operation.key) ?? 0) === operation.
|
|
1191
|
+
if (operation.draftRevision !== void 0 && (this.revisions.get(operation.key) ?? 0) === operation.draftRevision)
|
|
1189
1192
|
this.reset(operation.key);
|
|
1190
1193
|
else this.refresh();
|
|
1191
1194
|
}
|
|
@@ -1708,4 +1711,4 @@ export {
|
|
|
1708
1711
|
createGestureRecognizer,
|
|
1709
1712
|
magneticDropPoint
|
|
1710
1713
|
};
|
|
1711
|
-
//# sourceMappingURL=chunk-
|
|
1714
|
+
//# sourceMappingURL=chunk-W5G6VMMQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/headless/runtime-features.ts","../src/headless/input-control.ts","../src/headless/instance.ts","../src/headless/interaction-inputs.ts","../src/headless/interaction-router.ts","../src/headless/gesture.ts","../src/headless/drop-targets.ts"],"sourcesContent":["import type { SeatBoardTopology } from \"../shared/seat-topology-schema.js\";\nimport type { ActionProps } from \"./model.js\";\nimport type { InputDomain } from \"../shared/protocol/frame.js\";\nimport type { RuntimeJson } from \"../shared/runtime-json.js\";\nimport type {\n GameSource,\n SourceSnapshot,\n SourceState,\n SubmitResult,\n} from \"./sources/types.js\";\nimport type {\n RuntimeSelectionTarget,\n RuntimeDropTarget,\n RuntimeTargetOptions,\n} from \"./targets.js\";\n\n/** Internal operations over admitted projections; never a game facade widened to unknown. */\nexport const runtimeFeatures = Symbol(\"runtimeFeatures\");\nexport interface RuntimeInput {\n readonly key: string;\n readonly kind: import(\"./model.js\").InteractionInputDescriptor[\"kind\"];\n getDomain(): InputDomain;\n getIsEligible(value: RuntimeJson): boolean;\n getIsSelected(value: RuntimeJson): boolean;\n getTargetProps(value: RuntimeJson): ActionProps;\n}\nexport interface RuntimeInteraction {\n readonly key: string;\n getIsAvailable(params?: Readonly<Record<string, RuntimeJson>>): boolean;\n getIsReady(params?: Readonly<Record<string, RuntimeJson>>): boolean;\n getStatus(): \"open\" | \"submitting\" | \"submitted\";\n submit(params?: Readonly<Record<string, RuntimeJson>>): Promise<SubmitResult>;\n getInputs(): readonly RuntimeInput[];\n}\nexport interface RuntimeFeatureSnapshot {\n readonly view: unknown;\n readonly snapshot: SourceSnapshot | null;\n readonly connection: SourceState[\"connection\"];\n readonly request: SourceState[\"request\"];\n readonly interactions: { list(): readonly RuntimeInteraction[] };\n readonly zones: {\n find(id: string, hostId: string): { readonly count: number } | undefined;\n };\n readonly cards: {\n find(\n id: string,\n ): { getInteractions(): readonly RuntimeInteraction[] } | undefined;\n };\n}\nexport interface RuntimeFeatureGame extends RuntimeFeatureSnapshot {\n getSnapshot(): RuntimeFeatureSnapshot;\n getOptions(): { readonly source: GameSource };\n subscribe(listener: () => void): () => void;\n}\nexport interface RuntimeBoard {\n readonly id: string;\n readonly data: SeatBoardTopology;\n readonly game: RuntimeFeatureGame;\n}\nexport interface RuntimeCollection<Value> {\n get(id: string): Value;\n find(id: string): Value | undefined;\n getAll(): readonly Value[];\n}\nexport interface RuntimeFeatureContext {\n readonly game: RuntimeFeatureGame;\n getBoards(): Readonly<Record<string, SeatBoardTopology>>;\n createBoard(data: SeatBoardTopology): RuntimeBoard;\n routeTarget(\n target: RuntimeSelectionTarget,\n options?: RuntimeTargetOptions,\n ): void;\n routeCardDrop(cardId: string, target: RuntimeDropTarget): void;\n invalidate(): void;\n}\n","import type { ActionProps } from \"./model.js\";\nimport type { InputDomain } from \"../shared/protocol/frame.js\";\nimport type { RuntimeJson } from \"../shared/runtime-json.js\";\n\ntype Domain<Type extends InputDomain[\"type\"]> = Extract<\n InputDomain,\n { type: Type }\n>;\ntype Editable<Value> = {\n readonly value: Value;\n readonly setValue: (value: Value) => void;\n};\ntype Control<Type extends \"boundedNumber\" | \"resourceMap\", Value> = {\n readonly type: Type;\n readonly domain: Domain<Type>;\n} & (\n | ({ readonly mode: \"single\" } & Editable<Value | undefined>)\n | ({ readonly mode: \"many\" } & Editable<Value[]>)\n);\nexport interface InputTargetOption<Value = RuntimeJson> {\n readonly value: Value;\n readonly label: string;\n readonly selected: boolean;\n readonly props: ActionProps;\n}\n/** A captured, descriptor-driven editor. Its handlers retain the input's lifetime. */\nexport type InputControl = {\n readonly key: string;\n readonly disabled: boolean;\n readonly props: {\n readonly disabled: boolean;\n readonly [key: `data-${string}`]: string | number | boolean | undefined;\n };\n} & (\n | Control<\"boundedNumber\", number>\n | Control<\"resourceMap\", Record<string, number>>\n | { readonly type: \"targets\"; readonly options: readonly InputTargetOption[] }\n);\n\ninterface ControlInput {\n readonly key: string;\n getDomain(): InputDomain;\n getValue(): RuntimeJson | undefined;\n setValue(value: RuntimeJson): void;\n clear(): void;\n getTargetOptions(): readonly InputTargetOption[];\n}\n/** Drafts can contain incomplete edits, so normalize only the displayed field values. */\nfunction resourceValue(\n domain: Domain<\"resourceMap\">,\n value: RuntimeJson | undefined,\n): Record<string, number> {\n const record =\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value\n : {};\n return Object.fromEntries(\n domain.resources.map((resource) => {\n const amount = record[resource.resourceId];\n return [resource.resourceId, typeof amount === \"number\" ? amount : 0];\n }),\n );\n}\nexport function createInputControl(\n input: ControlInput,\n props: InputControl[\"props\"],\n): InputControl {\n const domain = input.getDomain();\n const current = input.getValue();\n const common = { key: input.key, disabled: props.disabled, props };\n if (domain.type === \"boundedNumber\") {\n if (domain.selection?.mode === \"many\")\n return {\n ...common,\n type: \"boundedNumber\",\n domain,\n mode: \"many\",\n value: Array.isArray(current)\n ? current.filter(\n (value): value is number => typeof value === \"number\",\n )\n : [],\n setValue: (value) => input.setValue(value),\n };\n return {\n ...common,\n type: \"boundedNumber\",\n domain,\n mode: \"single\",\n value: typeof current === \"number\" ? current : undefined,\n setValue: (value) =>\n value === undefined ? input.clear() : input.setValue(value),\n };\n }\n if (domain.type === \"resourceMap\") {\n if (domain.selection?.mode === \"many\")\n return {\n ...common,\n type: \"resourceMap\",\n domain,\n mode: \"many\",\n value: Array.isArray(current)\n ? current.map((value) => resourceValue(domain, value))\n : [],\n setValue: (value) => input.setValue(value),\n };\n return {\n ...common,\n type: \"resourceMap\",\n domain,\n mode: \"single\",\n value: current === undefined ? undefined : resourceValue(domain, current),\n setValue: (value) =>\n value === undefined ? input.clear() : input.setValue(value),\n };\n }\n return { ...common, type: \"targets\", options: input.getTargetOptions() };\n}\n","import { BoardProjectionSchema } from \"../shared/seat-topology-schema.js\";\nimport type { ProjectedTile } from \"../shared/seat-topology-schema.js\";\nimport type { SeatTileRef } from \"../shared/domain/seat-reference.js\";\nimport type { SeatBoardTopology } from \"../shared/seat-topology-schema.js\";\nimport type { ViewCard } from \"../shared/domain/cards.js\";\nimport {\n runtimeFeatures,\n type RuntimeFeatureContext,\n type RuntimeCollection,\n} from \"./runtime-features.js\";\nimport type { ReadonlyData } from \"./model.js\";\nimport { createInputControl } from \"./input-control.js\";\nimport { requireLookup } from \"../shared/lookup.js\";\nimport type {\n RuntimeBoardTarget,\n RuntimeSelectionTarget,\n RuntimeTargetOptions,\n RuntimeDropTarget,\n} from \"./targets.js\";\nimport { immutableCopy } from \"../shared/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 GameSource,\n SourceState,\n SourceSnapshot,\n SubmitResult,\n InteractionDescriptor,\n InteractionInputDescriptor,\n NativeEvent,\n} from \"./model.js\";\n\ntype Values = Readonly<Record<string, RuntimeJson>>;\ntype DraftMap = Readonly<Record<string, Values | undefined>>;\ntype RuntimeLocalState = { drafts: DraftMap; activeInteraction: string | null };\n/** Concrete controller options; game-specific keys are bound by createGameInstance. */\ntype RuntimeOptions = {\n readonly source: GameSource;\n readonly initialState?: Partial<RuntimeLocalState>;\n readonly state?: Partial<RuntimeLocalState>;\n readonly onDraftsChange?: (drafts: DraftMap) => void;\n readonly onActiveInteractionChange?: (key: string | null) => void;\n readonly onError?: (error: unknown) => void;\n readonly debug?: boolean;\n};\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 (domain.valueKind === \"board-id\" && target.valueKind === \"board-id\"\n ? domain.boardId === target.boardId\n : domain.valueKind === \"board-space\" &&\n target.valueKind === \"board-space\" &&\n domain.eligibleTargets.some(\n (candidate) => candidate.boardId === target.value.boardId,\n ))\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(params?: Values) {\n const descriptor =\n params === undefined\n ? this.descriptor\n : this.owner.descriptorFor(this.descriptor, params);\n return 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(params = this.draft) {\n return getInteractionDraftReadiness(\n this.owner.descriptorFor(this.descriptor, params),\n params,\n );\n }\n getIsReady(params?: Values) {\n return this.readiness(params).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(params?: Values) {\n return this.currentLifetime()\n ? this.owner.submit(this.key, false, params)\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}\nfunction createInputTargetLabels(\n domain: InteractionInputDescriptor[\"domain\"],\n snapshot: SourceSnapshot | null,\n boards: Readonly<Record<string, SeatBoardTopology>>,\n): ReadonlyMap<string, string> {\n const targetLabels = new Map<string, string>();\n const hosts = Object.values(snapshot?.frame.zones ?? {}).flatMap((zones) =>\n Object.values(zones),\n );\n if (domain.type === \"cardTarget\") {\n domain.eligibleTargets.forEach((id, index) => {\n const card = hosts\n .map((zone) => zone.cardViewsById[id])\n .find((card) => card !== undefined);\n targetLabels.set(\n inputValueKey(id),\n card ? card.name || `Card ${index + 1}` : `Card back ${index + 1}`,\n );\n });\n }\n if (domain.type === \"tileTarget\" || domain.type === \"boardTarget\") {\n if (domain.type === \"tileTarget\") {\n const presentations = [\n ...hosts.flatMap((zone) => zone.tiles),\n ...Object.values(boards).flatMap((board) =>\n board.layout === \"generic\" ? [] : board.tiles,\n ),\n ];\n domain.eligibleTargets.forEach((ref, index) => {\n const tile = presentations.find((tile) => tile.ref === ref);\n targetLabels.set(\n inputValueKey(ref),\n tile?.disclosure === \"visible\"\n ? tile.name || `Tile ${index + 1}`\n : `Tile back ${index + 1}`,\n );\n });\n } else {\n domain.eligibleTargets.forEach((value, index) => {\n const boardId =\n typeof value === \"string\"\n ? domain.valueKind === \"board-id\"\n ? domain.boardId\n : undefined\n : value.boardId;\n const id = typeof value === \"string\" ? value : value.spaceId;\n const board = boardId === undefined ? undefined : boards[boardId];\n const name =\n domain.targetKind === \"space\"\n ? board?.spaces[id]?.name\n : board && board.layout !== \"generic\"\n ? (domain.targetKind === \"edge\"\n ? board.edges\n : board.vertices\n ).find((target) => target.id === id)?.label\n : undefined;\n const kind =\n domain.targetKind === \"space\"\n ? \"Space\"\n : domain.targetKind === \"edge\"\n ? \"Edge\"\n : \"Vertex\";\n targetLabels.set(inputValueKey(value), name || `${kind} ${index + 1}`);\n });\n }\n }\n return targetLabels;\n}\nclass InputObject {\n readonly targetLabels: ReadonlyMap<string, string>;\n readonly snapshot: SourceSnapshot | null;\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 const snapshot = interaction.owner.sourceState.snapshot;\n this.snapshot = snapshot;\n this.targetLabels = createInputTargetLabels(\n descriptor.domain,\n snapshot,\n descriptor.domain.type === \"tileTarget\" ||\n descriptor.domain.type === \"boardTarget\"\n ? interaction.owner.getBoardProjections(snapshot?.frame.view)\n : {},\n );\n }\n currentLifetime() {\n return (\n this.interaction.currentLifetime() &&\n (this.descriptor.domain.type !== \"tileTarget\" ||\n this.snapshot === this.interaction.owner.sourceState.snapshot)\n );\n }\n get game() {\n return this.interaction.game;\n }\n get domainType() {\n return this.descriptor.domain.type;\n }\n get selectionMode() {\n return isManyInput(this.descriptor) ? \"many\" : \"single\";\n }\n getTargetOptions() {\n const domain = this.getDomain();\n return this.getEligibleTargets().map((value) => ({\n value,\n label:\n this.targetLabels.get(inputValueKey(value)) ??\n (domain.type === \"choice\" || domain.type === \"choiceList\"\n ? domain.choices.find((choice) => Object.is(choice.value, value))\n ?.label\n : undefined) ??\n (value === null\n ? \"None\"\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value)),\n selected: this.getIsSelected(value),\n props: this.getTargetProps(value),\n }));\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.currentLifetime()) return;\n this.interaction.owner.setInput(this.interaction.key, this.key, value);\n }\n clear() {\n if (!this.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 (\n domain.type === \"cardTarget\" ||\n domain.type === \"boardTarget\" ||\n domain.type === \"tileTarget\"\n )\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.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 getControl() {\n const disabled =\n !this.interaction.getIsAvailable() ||\n this.interaction.status !== \"open\" ||\n !this.interaction.connected;\n return createInputControl(this, {\n ...data(\"option\", this.interaction.key, this.key),\n \"data-seat\": this.interaction.seat,\n disabled,\n \"data-disabled\": disabled,\n });\n }\n}\nclass CardObject {\n readonly epoch: number;\n readonly seat: number;\n readonly view: ReadonlyData<ViewCard> | null;\n readonly hidden: boolean;\n readonly backImage: string | null;\n constructor(\n readonly owner: Controller,\n readonly id: string,\n readonly zone: string,\n readonly hostId: string,\n readonly index: number,\n view: ReadonlyData<ViewCard> | undefined,\n backImage: 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 = view ?? null;\n this.hidden = this.view === null;\n this.backImage = backImage ?? 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?: RuntimeTargetOptions) {\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?: RuntimeTargetOptions) {\n if (this.epoch !== this.owner.epoch || this.owner.disposed) return;\n this.owner.selectCard(this.id, options);\n }\n getSelectHandler(options?: RuntimeTargetOptions) {\n return () => this.select(options);\n }\n getProps(options?: RuntimeTargetOptions) {\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 TileObject {\n readonly epoch: number;\n readonly snapshot: SourceSnapshot | null;\n constructor(\n readonly owner: Controller,\n readonly data: ProjectedTile,\n readonly zone: string,\n readonly hostId: string,\n readonly index: number,\n readonly routes: readonly InteractionObject[],\n ) {\n this.epoch = owner.epoch;\n this.snapshot = owner.sourceState.snapshot;\n }\n get ref() {\n return this.data.ref;\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) =>\n route\n .getInputs()\n .some(\n (input) =>\n input.descriptor.domain.type === \"tileTarget\" &&\n input.getIsEligible(this.ref),\n ),\n );\n }\n getIsSelected() {\n return this.routes.some((route) =>\n route\n .getInputs()\n .some(\n (input) =>\n input.descriptor.domain.type === \"tileTarget\" &&\n input.getIsSelected(this.ref),\n ),\n );\n }\n getCanSelect(options?: RuntimeTargetOptions) {\n return this.routes.some(\n (route) =>\n route.getIsAvailable() &&\n (!options?.interaction || route.key === options.interaction) &&\n route\n .getInputs()\n .some(\n (input) =>\n input.descriptor.domain.type === \"tileTarget\" &&\n (!options?.input || input.key === options.input) &&\n !input.getTargetProps(this.ref).disabled,\n ),\n );\n }\n select(options?: RuntimeTargetOptions) {\n if (\n this.owner.disposed ||\n this.epoch !== this.owner.epoch ||\n this.snapshot !== this.owner.sourceState.snapshot\n )\n return;\n this.owner.routeTarget({ kind: \"tile\", value: this.ref }, options);\n }\n getSelectHandler(options?: RuntimeTargetOptions) {\n return () => this.select(options);\n }\n getTargetProps(options?: RuntimeTargetOptions) {\n const disabled = !this.getCanSelect(options);\n return {\n type: \"button\" as const,\n disabled,\n \"data-action\": \"select\",\n \"data-value\": this.ref,\n \"data-interaction\": options?.interaction,\n \"data-input\": options?.input,\n \"data-eligible\": this.getIsEligible(),\n \"data-selected\": this.getIsSelected(),\n \"data-disabled\": disabled,\n \"data-hidden\": this.data.disclosure === \"concealed\",\n onClick: this.getSelectHandler(options),\n };\n }\n}\nclass ZoneObject {\n constructor(\n readonly owner: Controller,\n readonly id: string,\n readonly hostId: string,\n readonly cards: readonly CardObject[],\n readonly tiles: readonly TileObject[],\n ) {}\n get game() {\n return this.owner.instance;\n }\n get count() {\n return this.cards.length + this.tiles.length;\n }\n getIsEmpty() {\n return this.count === 0;\n }\n getTiles() {\n return this.tiles;\n }\n getTile(ref: SeatTileRef) {\n return requireLookup(this.findTile(ref), `Tile in zone ${this.id}`, ref);\n }\n findTile(ref: SeatTileRef) {\n return this.tiles.find((tile) => tile.ref === ref);\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\ninterface RuntimeModel {\n readonly snapshot: SourceSnapshot | null;\n readonly view: SourceSnapshot[\"frame\"][\"view\"] | null;\n readonly version: number | null;\n readonly connection: SourceState[\"connection\"];\n readonly request: SourceState[\"request\"];\n readonly failure: SourceState[\"failure\"];\n readonly state: {\n readonly drafts: DraftMap;\n readonly activeInteraction: string | null;\n };\n readonly phase: PhaseObject;\n readonly turn: {\n readonly activePlayerIds: readonly string[];\n readonly currentPlayerId: string | null;\n readonly order: readonly string[];\n readonly isMine: boolean;\n };\n readonly me: {\n readonly id: string;\n readonly player: PlayerObject;\n getCanAct(): boolean;\n } | null;\n readonly players: RuntimeCollection<PlayerObject> & {\n readonly order: readonly string[];\n next(id: string): PlayerObject;\n };\n readonly interactions: {\n get(key: string): InteractionObject;\n find(key: string): InteractionObject | undefined;\n list(): readonly InteractionObject[];\n listAvailable(): readonly InteractionObject[];\n };\n readonly inputs: {\n get(key: string, name: string): InputObject;\n find(key: string, name: string): InputObject | undefined;\n };\n readonly zones: {\n get(id: string, hostId: string): ZoneObject;\n find(id: string, hostId: string): ZoneObject | undefined;\n getAll(): readonly ZoneObject[];\n };\n readonly cards: Pick<RuntimeCollection<CardObject>, \"get\" | \"find\">;\n readonly events: { readonly recent: SourceSnapshot[\"frame\"][\"events\"] };\n}\ninterface RuntimeCore extends RuntimeModel {\n readonly store: Pick<\n ReturnType<typeof createStore<RuntimeModel>>,\n \"get\" | \"subscribe\"\n >;\n getSnapshot(): RuntimeModel;\n getOptions(): RuntimeOptions;\n setOptions(options: RuntimeOptions): void;\n subscribe(listener: () => void): () => void;\n dispose(): void;\n assertCoverage(): void;\n}\ninterface RuntimeContext extends Omit<\n RuntimeFeatureContext,\n \"game\" | \"getBoards\"\n> {\n readonly [runtimeFeatures]: RuntimeFeatureContext;\n}\n\nclass Controller {\n readonly boardProjections = new WeakMap<\n object,\n Readonly<Record<string, SeatBoardTopology>>\n >();\n getBoardProjections(\n view: unknown,\n ): Readonly<Record<string, SeatBoardTopology>> {\n if (view === null || typeof view !== \"object\" || Array.isArray(view))\n return {};\n const cached = this.boardProjections.get(view);\n if (cached) return cached;\n const payload: unknown = Reflect.get(view, \"boards\");\n const boards =\n payload === undefined\n ? {}\n : immutableCopy(BoardProjectionSchema.parse(payload));\n this.boardProjections.set(view, boards);\n return boards;\n }\n epoch = 0;\n options: RuntimeOptions;\n localDrafts: DraftMap;\n localActive: string | null;\n disposed = false;\n readonly instance: RuntimeCore;\n readonly store: ReturnType<typeof createStore<RuntimeModel>>;\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 draftRevision: number | undefined;\n version: number;\n epoch: number;\n accepted: boolean;\n cancel: boolean;\n } | null = null;\n building: RuntimeModel | 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?: (core: RuntimeCore, context: RuntimeContext) => Features,\n ) {\n this.options = options;\n this.localDrafts = options.initialState?.drafts ?? EMPTY_DRAFTS;\n this.localActive = options.initialState?.activeInteraction ?? null;\n this.sourceState = options.source.store.get();\n const current = () => this.building ?? this.store.get();\n const root: RuntimeCore = {\n get snapshot() {\n return current().snapshot;\n },\n get view() {\n return current().view;\n },\n get version() {\n return current().version;\n },\n get connection() {\n return current().connection;\n },\n get failure() {\n return current().failure;\n },\n get request() {\n return current().request;\n },\n get state() {\n return current().state;\n },\n get phase() {\n return current().phase;\n },\n get turn() {\n return current().turn;\n },\n get me() {\n return current().me;\n },\n get players() {\n return current().players;\n },\n get interactions() {\n return current().interactions;\n },\n get inputs() {\n return current().inputs;\n },\n get zones() {\n return current().zones;\n },\n get cards() {\n return current().cards;\n },\n get events() {\n return current().events;\n },\n store: {\n get: () => this.store.get(),\n subscribe: (listener: () => void) => this.store.subscribe(listener),\n },\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 };\n // Keep live projections out of enumeration, spreads, and serialization.\n for (const [key, descriptor] of Object.entries(\n Object.getOwnPropertyDescriptors(root),\n )) {\n if (descriptor.get) {\n Object.defineProperty(root, key, {\n enumerable: false,\n configurable: false,\n });\n }\n }\n Object.defineProperty(root, \"store\", {\n enumerable: false,\n configurable: false,\n writable: false,\n });\n this.instance = root;\n this.store = createStore(Object.freeze(this.build()));\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 runtime: RuntimeFeatureContext = {\n game: this.instance,\n getBoards: () => this.getBoardProjections(this.instance.view),\n createBoard: (data: SeatBoardTopology) =>\n this.object(\"board\", {\n id: data.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 const context: RuntimeContext = { ...runtime, [runtimeFeatures]: runtime };\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: (): unknown =>\n 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 Object.setPrototypeOf(value, this.prototypes[hook]);\n return Object.freeze(value);\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 ?? 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).flatMap((hosts) =>\n Object.values(hosts),\n )) {\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);\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 input.descriptor.domain.type === \"tileTarget\"))\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?: RuntimeTargetOptions) {\n const card = this.store.get().cards.find(id);\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(\n key: string,\n cancel: boolean,\n params?: Values,\n ): 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(params) || !interaction.getIsReady(params)\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 draftRevision:\n params === undefined ? (this.revisions.get(key) ?? 0) : undefined,\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(params).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 (\n operation.draftRevision !== undefined &&\n (this.revisions.get(operation.key) ?? 0) === operation.draftRevision\n )\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(target: RuntimeSelectionTarget, options?: RuntimeTargetOptions) {\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 (target.kind === \"tile\"\n ? input.descriptor.domain.type === \"tileTarget\"\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: RuntimeDropTarget) {\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);\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 if (\n !cardInput ||\n cardInput.descriptor.domain.type !== \"cardTarget\" ||\n !cardInput.getIsEligible(cardId)\n )\n return;\n const input =\n target.kind === \"interaction\"\n ? undefined\n : interaction.findInput(target.inputKey);\n if (\n target.kind !== \"interaction\" &&\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 const chosen = next[cardInput.key];\n // Dropping adds a card; it never toggles an already chosen card back out.\n if (\n !input &&\n isManyInput(cardInput.descriptor) &&\n Array.isArray(chosen) &&\n chosen.includes(cardId)\n ) {\n this.activate(interaction.key);\n return;\n }\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:\n input && target.kind !== \"interaction\"\n ? { inputKey: input.key, value: target.value }\n : undefined,\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?: RuntimeModel): RuntimeModel {\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 ?? {}).flatMap(\n ([id, hosts]) =>\n Object.entries(hosts).map(([hostId, zone]) =>\n this.object(\n \"zone\",\n new ZoneObject(\n this,\n id,\n hostId,\n Object.freeze(\n zone.cardIds.map((cardId, index) =>\n this.object(\n \"card\",\n new CardObject(\n this,\n cardId,\n id,\n hostId,\n index,\n zone.cardViewsById[cardId],\n zone.cardBacksById[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] ??\n EMPTY,\n request || this.pending\n ? \"submitting\"\n : \"open\",\n connection === \"ready\",\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n Object.freeze(\n zone.tiles.map(\n (tile, index) =>\n new TileObject(\n this,\n tile,\n id,\n hostId,\n index,\n Object.freeze(\n interactionObjects.filter((interaction) =>\n interaction\n .getInputs()\n .some(\n (input) =>\n input.descriptor.domain.type ===\n \"tileTarget\" &&\n input.getIsEligible(tile.ref),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n );\n const find = (id: string, hostId: string) =>\n objects.find((zone) => zone.id === id && zone.hostId === hostId);\n return {\n get: (id: string, hostId: string) =>\n requireLookup(find(id, hostId), \"Zone\", id),\n find,\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: RuntimeModel = {\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 };\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 // Composition boundary: callers bind this source and feature callbacks to G.\n // Runtime classes keep concrete descriptor contracts; only this facade exposes G/F.\n const controller = new Controller(\n options as RuntimeOptions,\n options.features as\n ((core: RuntimeCore, context: RuntimeContext) => Features) | undefined,\n );\n // eslint-disable-next-line no-restricted-syntax -- Controller construction binds this source and feature map to the public G/F/S facade.\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","import type { Point } from \"./features/pointer-session.js\";\n\n/** Measured with emulated touch; confirm on physical devices before changing. */\nexport const GESTURE_THRESHOLDS = Object.freeze({\n /** Movement, in CSS pixels, before a press becomes a drag or a browse. */\n slop: 8,\n /** A touch or pen held this long without moving inspects the card. */\n holdMs: 350,\n /** A mouse resting on a card this long inspects it. */\n hoverMs: 250,\n /** A finger drags when upward travel exceeds this multiple of sideways travel. */\n axisBias: 1.25,\n});\n\nexport interface GesturePointer {\n readonly pointerId: number;\n readonly pointerType: string;\n readonly clientX: number;\n readonly clientY: number;\n}\n\n/**\n * How a press ended. A tap leaves selection to the native click; a hold\n * inspected the card; a browse handed sideways movement to native scrolling.\n */\nexport type GestureKind = \"tap\" | \"hold\" | \"drag\" | \"browse\";\n\nexport interface GestureCallbacks {\n /** A touch or pen stayed still for `holdMs`. */\n hold(): void;\n /** Return false when the card cannot be dragged; the press then browses. */\n dragStart(origin: Point): boolean;\n dragMove(point: Point): void;\n /** The pointer lifted. */\n end(kind: GestureKind, point: Point): void;\n /** The browser or the caller cancelled. A cancelled drag never drops. */\n cancel(kind: GestureKind): void;\n}\n\nexport interface GestureRecognizer {\n move(event: GesturePointer): void;\n up(event: GesturePointer): void;\n cancel(event?: Pick<GesturePointer, \"pointerId\">): void;\n}\n\nexport interface GestureOptions {\n /** Hands keep sideways scrolling; piles can be dragged toward any destination. */\n readonly dragDirection?: \"up\" | \"any\";\n}\n\n/**\n * Classifies one press. A mouse drags in any direction and never holds. A\n * finger drags upward, browses sideways and holds when still, so cards can use\n * `touch-action: pan-x` and keep native sideways scrolling.\n */\nexport function createGestureRecognizer(\n down: GesturePointer,\n callbacks: GestureCallbacks,\n options: GestureOptions = {},\n): GestureRecognizer {\n const origin = { x: down.clientX, y: down.clientY };\n const mouse = down.pointerType === \"mouse\";\n let kind: GestureKind = \"tap\";\n let finished = false;\n const holdTimer = mouse\n ? undefined\n : setTimeout(() => {\n kind = \"hold\";\n callbacks.hold();\n }, GESTURE_THRESHOLDS.holdMs);\n const point = (event: GesturePointer) => ({\n x: event.clientX,\n y: event.clientY,\n });\n const ours = (event?: Pick<GesturePointer, \"pointerId\">) =>\n !finished && (!event || event.pointerId === down.pointerId);\n function finish() {\n finished = true;\n clearTimeout(holdTimer);\n }\n return {\n move(event) {\n if (!ours(event)) return;\n if (kind === \"drag\") return callbacks.dragMove(point(event));\n const dx = event.clientX - origin.x;\n const dy = event.clientY - origin.y;\n if (kind !== \"tap\" || Math.hypot(dx, dy) < GESTURE_THRESHOLDS.slop)\n return;\n clearTimeout(holdTimer);\n const lifts =\n mouse ||\n options.dragDirection === \"any\" ||\n -dy > GESTURE_THRESHOLDS.axisBias * Math.abs(dx);\n if (lifts && callbacks.dragStart(origin)) {\n kind = \"drag\";\n callbacks.dragMove(point(event));\n } else kind = \"browse\";\n },\n up(event) {\n if (!ours(event)) return;\n finish();\n callbacks.end(kind, point(event));\n },\n cancel(event) {\n if (!ours(event)) return;\n finish();\n callbacks.cancel(kind);\n },\n };\n}\n\n/** Magnetic rectangular UI targets. A wider exit band prevents edge flicker.\n * Call only for eligible targets; SVG board spaces keep native hit testing. */\nexport function magneticDropPoint(\n point: Point,\n box: { x: number; y: number; width: number; height: number },\n retained: boolean,\n coarse: boolean,\n): Point | null {\n const radius = coarse ? (retained ? 52 : 28) : retained ? 36 : 18;\n if (box.width <= 0 || box.height <= 0) return null;\n const x = Math.max(box.x, Math.min(point.x, box.x + box.width));\n const y = Math.max(box.y, Math.min(point.y, box.y + box.height));\n return Math.hypot(point.x - x, point.y - y) <= radius ? { x, y } : null;\n}\n","import { inputValueKey } from \"../shared/input-domain.js\";\nimport type { RuntimeDropTarget } from \"./targets.js\";\n\n/** Targets are rebuilt with every frame; compare their route and destination. */\nexport function isSameDropTarget(\n left: RuntimeDropTarget,\n right: RuntimeDropTarget,\n): boolean {\n if (\n left.interactionKey !== right.interactionKey ||\n left.cardInputKey !== right.cardInputKey\n )\n return false;\n if (left.kind === \"interaction\" || right.kind === \"interaction\")\n return left.kind === right.kind;\n return (\n left.kind === right.kind &&\n left.valueKind === right.valueKind &&\n inputValueKey(left.value) === inputValueKey(right.value) &&\n (left.valueKind !== \"board-id\" ||\n (right.valueKind === \"board-id\" && left.boardId === right.boardId)) &&\n left.inputKey === right.inputKey\n );\n}\n"],"mappings":"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","names":["card","tile","data","options","input"]}
|