@dreamboard-games/sdk 0.2.0 → 0.2.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/{ThemeProvider-fy0_QzgO.d.ts → ThemeProvider-BBMVT3KG.d.ts} +1 -1
  2. package/dist/attributes-BeRyboMS.d.ts +279 -0
  3. package/dist/browser-interaction.d.ts +708 -0
  4. package/dist/browser-interaction.js +106 -0
  5. package/dist/browser-interaction.js.map +1 -0
  6. package/dist/{bundle-TIZcw8LB.d.ts → bundle-CDd5FKeD.d.ts} +3 -1
  7. package/dist/{chunk-U5C6BONG.js → chunk-326PGVAA.js} +2 -2
  8. package/dist/{chunk-VFTAA4WO.js → chunk-MKXPVOUT.js} +4 -2
  9. package/dist/chunk-MKXPVOUT.js.map +1 -0
  10. package/dist/{chunk-GKKBPPSW.js → chunk-MZNVHMJ5.js} +4 -4
  11. package/dist/{chunk-KAELH4KC.js → chunk-NKCRKGR2.js} +2 -2
  12. package/dist/{chunk-WN74KVNY.js → chunk-PEI3FIL2.js} +2 -2
  13. package/dist/chunk-PEI3FIL2.js.map +1 -0
  14. package/dist/chunk-QLG6VEMW.js +1691 -0
  15. package/dist/chunk-QLG6VEMW.js.map +1 -0
  16. package/dist/{chunk-WYPQ3GG5.js → chunk-WG4JQL3S.js} +4 -1
  17. package/dist/{chunk-WYPQ3GG5.js.map → chunk-WG4JQL3S.js.map} +1 -1
  18. package/dist/{chunk-7YAHLYBR.js → chunk-XV6D3ET4.js} +8 -4
  19. package/dist/{chunk-7YAHLYBR.js.map → chunk-XV6D3ET4.js.map} +1 -1
  20. package/dist/{chunk-TDSWKVZ4.js → chunk-ZABVH7AO.js} +1236 -17
  21. package/dist/chunk-ZABVH7AO.js.map +1 -0
  22. package/dist/{components-D5ZRE2Hl.d.ts → components-BoiVSYqx.d.ts} +1 -1
  23. package/dist/generated/runtime/primitives.d.ts +5 -4
  24. package/dist/generated/runtime/primitives.js +4 -3
  25. package/dist/generated/runtime-api.d.ts +1 -1
  26. package/dist/generated/runtime.d.ts +5 -4
  27. package/dist/generated/runtime.js +7 -6
  28. package/dist/generated/workspace-contract.d.ts +5 -4
  29. package/dist/generated/workspace-contract.js +6 -5
  30. package/dist/{hex-board-view-D_07hO6O.d.ts → hex-board-view-1iAyJRFn.d.ts} +1 -0
  31. package/dist/index.js +1 -1
  32. package/dist/infrastructure/reducer-bundle-abi.d.ts +113 -113
  33. package/dist/infrastructure/reducer-bundle-abi.js +1 -1
  34. package/dist/package-set.d.ts +2 -2
  35. package/dist/package-set.js +1 -1
  36. package/dist/reducer.d.ts +1 -1
  37. package/dist/reducer.js +305 -12
  38. package/dist/reducer.js.map +1 -1
  39. package/dist/runtime/primitives.d.ts +6 -5
  40. package/dist/runtime/primitives.js +4 -3
  41. package/dist/runtime/workspace-contract.d.ts +6 -5
  42. package/dist/runtime/workspace-contract.js +6 -5
  43. package/dist/{runtime-api-DWxvTr-O.d.ts → runtime-api-CPLm_XDG.d.ts} +6 -0
  44. package/dist/runtime.d.ts +5 -4
  45. package/dist/runtime.js +6 -5
  46. package/dist/testing.d.ts +2 -2
  47. package/dist/ui/components.d.ts +2 -2
  48. package/dist/ui/components.js +1 -1
  49. package/dist/{ui-contract-iQfTtUSL.d.ts → ui-contract-rzKBwOLC.d.ts} +5 -3
  50. package/dist/ui.d.ts +5 -5
  51. package/dist/ui.js +2 -2
  52. package/package.json +15 -9
  53. package/src/browser-interaction/attributes.ts +211 -0
  54. package/src/browser-interaction/canonical.ts +77 -0
  55. package/src/browser-interaction/constants.ts +77 -0
  56. package/src/browser-interaction/effects.ts +176 -0
  57. package/src/browser-interaction/index.ts +111 -0
  58. package/src/browser-interaction/normalize.ts +997 -0
  59. package/src/browser-interaction/registry.ts +70 -0
  60. package/src/browser-interaction/resolve.ts +596 -0
  61. package/src/browser-interaction/schemas.ts +152 -0
  62. package/src/browser-interaction/types.ts +304 -0
  63. package/src/browser-interaction.ts +1 -0
  64. package/src/generated/reducer-contract/wire.ts +1 -1
  65. package/src/generated/reducer-contract/zod.ts +3 -1
  66. package/src/package-set.ts +1 -1
  67. package/src/reducer/bundle/ingress-bundle.ts +1 -1
  68. package/src/reducer/bundle/trusted/interaction-types.ts +3 -0
  69. package/src/reducer/bundle/trusted/projection-builder.ts +337 -13
  70. package/src/reducer/ingress/input-codec.ts +1 -1
  71. package/src/reducer/ingress/session-codec.ts +1 -1
  72. package/src/runtime-internal/components/InteractionForm.tsx +345 -7
  73. package/src/runtime-internal/components/PluginRuntime.tsx +2 -0
  74. package/src/runtime-internal/components/board/target-layer.ts +2 -0
  75. package/src/runtime-internal/context/PluginStateContext.tsx +41 -0
  76. package/src/runtime-internal/hooks/useBoardInteractions.ts +73 -11
  77. package/src/runtime-internal/primitives/board.tsx +71 -0
  78. package/src/runtime-internal/primitives/interaction.tsx +160 -1
  79. package/src/runtime-internal/types/plugin-state.ts +6 -0
  80. package/src/runtime-internal/utils/browser-interaction-effects.ts +240 -0
  81. package/src/runtime-internal/utils/interaction-draft-digest.ts +252 -0
  82. package/src/runtime-internal/utils/semantic-projection-digest.ts +407 -0
  83. package/src/ui/components/board/HexGrid.tsx +3 -0
  84. package/src/ui/components/board/target-layer.ts +1 -0
  85. package/dist/chunk-TDSWKVZ4.js.map +0 -1
  86. package/dist/chunk-VFTAA4WO.js.map +0 -1
  87. package/dist/chunk-WN74KVNY.js.map +0 -1
  88. /package/dist/{chunk-U5C6BONG.js.map → chunk-326PGVAA.js.map} +0 -0
  89. /package/dist/{chunk-GKKBPPSW.js.map → chunk-MZNVHMJ5.js.map} +0 -0
  90. /package/dist/{chunk-KAELH4KC.js.map → chunk-NKCRKGR2.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/browser-interaction/constants.ts","../src/browser-interaction/canonical.ts","../src/browser-interaction/effects.ts","../src/browser-interaction/attributes.ts","../src/browser-interaction/registry.ts","../src/browser-interaction/normalize.ts","../src/browser-interaction/resolve.ts","../src/browser-interaction/schemas.ts"],"sourcesContent":["export const DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_NAME =\n \"dreamboard-browser-interaction\" as const;\n\nexport const DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION = \"2.0.0\" as const;\n\nexport const BROWSER_INTERACTION_ATTRIBUTES = {\n protocol: \"data-dreamboard-browser-protocol\",\n surface: \"data-dreamboard-browser-surface\",\n scope: \"data-dreamboard-browser-scope\",\n role: \"data-dreamboard-browser-role\",\n intent: \"data-dreamboard-browser-intent\",\n interactionKey: \"data-dreamboard-interaction-key\",\n interactionId: \"data-dreamboard-interaction-id\",\n descriptorDigest: \"data-dreamboard-descriptor-digest\",\n draftDigest: \"data-dreamboard-draft-digest\",\n readiness: \"data-dreamboard-readiness\",\n inputKey: \"data-dreamboard-input-key\",\n candidateValue: \"data-dreamboard-candidate-value\",\n candidateState: \"data-dreamboard-candidate-state\",\n actuatorKind: \"data-dreamboard-actuator-kind\",\n enabled: \"data-dreamboard-actuator-enabled\",\n actuatorId: \"data-dreamboard-actuator-id\",\n semanticEffects: \"data-dreamboard-semantic-effects\",\n acceptedEffectPatterns: \"data-dreamboard-accepted-effect-patterns\",\n preparationPatterns: \"data-dreamboard-preparation-patterns\",\n preparesIntent: \"data-dreamboard-prepares-intent\",\n preparesInputKey: \"data-dreamboard-prepares-input-key\",\n preparesCandidateValue: \"data-dreamboard-prepares-candidate-value\",\n preparesActuatorKind: \"data-dreamboard-prepares-actuator-kind\",\n diagnostic: \"data-dreamboard-browser-diagnostic\",\n} as const;\n\nexport const BROWSER_INTERACTION_RECORD_ROLES = [\n \"interaction\",\n \"actuator\",\n] as const;\n\nexport const GAMEPLAY_BROWSER_INTERACTION_SURFACE = \"gameplay\" as const;\n\nexport const GAMEPLAY_BROWSER_INTERACTION_INTENTS = [\n \"arm\",\n \"reveal\",\n \"invoke\",\n \"select\",\n \"toggle\",\n \"increment\",\n \"decrement\",\n \"fill\",\n \"submit\",\n] as const;\n\nexport const GAMEPLAY_BROWSER_INTERACTION_EFFECT_KINDS = [\n \"setCandidate\",\n \"adjustResource\",\n \"setScalar\",\n \"commit\",\n \"invoke\",\n] as const;\n\nexport const BROWSER_INTERACTION_READINESS_VALUES = [\n \"ready\",\n \"blocked\",\n \"unavailable\",\n] as const;\n\nexport const BROWSER_INTERACTION_CANDIDATE_STATES = [\n \"selected\",\n \"unselected\",\n \"mixed\",\n] as const;\n\nexport const BROWSER_INTERACTION_ACTUATOR_KINDS = [\n \"click\",\n \"fill\",\n \"keyboard\",\n \"pointer\",\n] as const;\n","export type CanonicalBrowserInteractionValue =\n | null\n | boolean\n | number\n | string\n | readonly CanonicalBrowserInteractionValue[]\n | { readonly [key: string]: CanonicalBrowserInteractionValue };\n\nfunction assertCanonicalValue(\n value: unknown,\n): asserts value is CanonicalBrowserInteractionValue {\n if (value === null) return;\n switch (typeof value) {\n case \"boolean\":\n case \"string\":\n return;\n case \"number\":\n if (Number.isFinite(value)) return;\n break;\n case \"object\":\n if (Array.isArray(value)) {\n value.forEach(assertCanonicalValue);\n return;\n }\n if (Object.getPrototypeOf(value) !== Object.prototype) break;\n for (const [key, item] of Object.entries(value)) {\n if (item === undefined) {\n throw new Error(\n `Browser interaction candidate '${key}' cannot be undefined.`,\n );\n }\n assertCanonicalValue(item);\n }\n return;\n }\n throw new Error(\n `Browser interaction candidates must be JSON-serializable primitives, arrays or plain objects. Received ${typeof value}.`,\n );\n}\n\nfunction canonicalizeValue(\n value: CanonicalBrowserInteractionValue,\n): CanonicalBrowserInteractionValue {\n if (Array.isArray(value)) {\n return value.map(canonicalizeValue);\n }\n if (value && typeof value === \"object\") {\n const objectValue = value as {\n readonly [key: string]: CanonicalBrowserInteractionValue;\n };\n return Object.fromEntries(\n Object.keys(objectValue)\n .sort()\n .map((key) => [key, canonicalizeValue(objectValue[key])]),\n );\n }\n return value;\n}\n\nexport function encodeCanonicalCandidateValue(value: unknown): string {\n assertCanonicalValue(value);\n return JSON.stringify(canonicalizeValue(value));\n}\n\nexport function decodeCanonicalCandidateValue(\n encoded: string,\n): CanonicalBrowserInteractionValue {\n const parsed = JSON.parse(encoded) as unknown;\n assertCanonicalValue(parsed);\n return canonicalizeValue(parsed);\n}\n\nexport function compareStableJson(a: unknown, b: unknown): number {\n const encodedA = encodeCanonicalCandidateValue(a);\n const encodedB = encodeCanonicalCandidateValue(b);\n return encodedA.localeCompare(encodedB);\n}\n","import {\n decodeCanonicalCandidateValue,\n encodeCanonicalCandidateValue,\n type CanonicalBrowserInteractionValue,\n} from \"./canonical.js\";\nimport type {\n BrowserInteractionEffectPattern,\n BrowserInteractionSurfaceEffect,\n GameplaySemanticEffect,\n} from \"./types.js\";\n\nexport function encodeBrowserInteractionEffect(\n effect: BrowserInteractionSurfaceEffect,\n): string {\n return encodeCanonicalCandidateValue(effect);\n}\n\nexport function decodeBrowserInteractionEffect(\n encoded: string,\n): BrowserInteractionSurfaceEffect {\n const decoded = decodeCanonicalCandidateValue(encoded);\n if (!decoded || typeof decoded !== \"object\" || Array.isArray(decoded)) {\n throw new Error(\"Browser interaction effect must be a canonical object.\");\n }\n const decodedObject = decoded as {\n readonly [key: string]: CanonicalBrowserInteractionValue;\n };\n const kind = decodedObject.kind;\n if (typeof kind !== \"string\" || kind.length === 0) {\n throw new Error(\"Browser interaction effect requires a string kind.\");\n }\n return decodedObject as BrowserInteractionSurfaceEffect;\n}\n\nexport function encodeBrowserInteractionEffectPattern(\n pattern: BrowserInteractionEffectPattern,\n): string {\n return encodeCanonicalCandidateValue(pattern);\n}\n\nexport function decodeBrowserInteractionEffectPattern(\n encoded: string,\n): BrowserInteractionEffectPattern {\n const decoded = decodeCanonicalCandidateValue(encoded);\n assertBrowserInteractionEffectPattern(decoded);\n return decoded;\n}\n\nexport function browserInteractionEffectPatternMatches(\n pattern: BrowserInteractionEffectPattern,\n effect: BrowserInteractionSurfaceEffect,\n): boolean {\n switch (pattern.kind) {\n case \"exact\":\n return (\n encodeBrowserInteractionEffect(pattern.effect) ===\n encodeBrowserInteractionEffect(effect)\n );\n case \"match\": {\n if (effect.kind !== pattern.effectKind) return false;\n for (const [field, expected] of Object.entries(pattern.fields ?? {})) {\n const actual = effect[field];\n if (actual === undefined) return false;\n if (\n encodeCanonicalCandidateValue(actual) !==\n encodeCanonicalCandidateValue(expected)\n ) {\n return false;\n }\n }\n const scalar = pattern.scalar;\n if (scalar) {\n const actual = effect[scalar.field];\n if (typeof actual !== \"number\" || !Number.isFinite(actual)) {\n return false;\n }\n if (scalar.integer === true && !Number.isInteger(actual)) {\n return false;\n }\n if (scalar.min !== undefined && actual < scalar.min) {\n return false;\n }\n if (scalar.max !== undefined && actual > scalar.max) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\nexport function assertBrowserInteractionEffectPattern(\n value: unknown,\n): asserts value is BrowserInteractionEffectPattern {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Browser interaction effect pattern must be an object.\");\n }\n const pattern = value as {\n readonly [key: string]: unknown;\n };\n if (pattern.kind === \"exact\") {\n decodeBrowserInteractionEffect(\n encodeCanonicalCandidateValue(pattern.effect),\n );\n return;\n }\n if (pattern.kind === \"match\") {\n if (\n typeof pattern.effectKind !== \"string\" ||\n pattern.effectKind.length === 0\n ) {\n throw new Error(\n \"Browser interaction match pattern requires an effectKind.\",\n );\n }\n if (pattern.fields !== undefined) {\n if (\n !pattern.fields ||\n typeof pattern.fields !== \"object\" ||\n Array.isArray(pattern.fields)\n ) {\n throw new Error(\n \"Browser interaction match pattern fields must be an object.\",\n );\n }\n }\n if (pattern.scalar !== undefined) {\n if (\n !pattern.scalar ||\n typeof pattern.scalar !== \"object\" ||\n Array.isArray(pattern.scalar) ||\n typeof (pattern.scalar as { readonly field?: unknown }).field !==\n \"string\" ||\n (pattern.scalar as { readonly field: string }).field.length === 0\n ) {\n throw new Error(\n \"Browser interaction scalar pattern requires a scalar field.\",\n );\n }\n }\n return;\n }\n throw new Error(\"Unknown browser interaction effect pattern kind.\");\n}\n\nexport function gameplaySetCandidateEffect(input: {\n readonly inputKey: string;\n readonly candidateValue: CanonicalBrowserInteractionValue;\n readonly beforeSelected: boolean;\n readonly afterSelected: boolean;\n}): GameplaySemanticEffect {\n return { kind: \"setCandidate\", ...input };\n}\n\nexport function gameplayAdjustResourceEffect(input: {\n readonly inputKey: string;\n readonly resourceKey: CanonicalBrowserInteractionValue;\n readonly delta: -1 | 1;\n}): GameplaySemanticEffect {\n return { kind: \"adjustResource\", ...input };\n}\n\nexport function gameplaySetScalarEffect(input: {\n readonly inputKey: string;\n readonly value: number;\n}): GameplaySemanticEffect {\n return { kind: \"setScalar\", ...input };\n}\n\nexport function gameplayCommitEffect(): GameplaySemanticEffect {\n return { kind: \"commit\" };\n}\n\nexport function gameplayInvokeEffect(): GameplaySemanticEffect {\n return { kind: \"invoke\" };\n}\n","import {\n BROWSER_INTERACTION_ATTRIBUTES,\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n GAMEPLAY_BROWSER_INTERACTION_SURFACE,\n} from \"./constants.js\";\nimport { encodeCanonicalCandidateValue } from \"./canonical.js\";\nimport {\n encodeBrowserInteractionEffect,\n encodeBrowserInteractionEffectPattern,\n} from \"./effects.js\";\nimport type {\n BrowserInteractionActuatorKind,\n BrowserInteractionCandidateState,\n BrowserInteractionEffectPattern,\n BrowserInteractionIntent,\n BrowserInteractionPreparationTarget,\n BrowserInteractionReadiness,\n BrowserInteractionSurfaceEffect,\n GameplayBrowserInteractionIntent,\n GameplaySemanticEffect,\n GameplaySemanticEffectPattern,\n} from \"./types.js\";\n\nexport type BrowserInteractionAttributeMap = Record<string, string | boolean>;\n\nexport interface BrowserInteractionRootAttributesInput {\n readonly surface: string;\n readonly scopeId: string;\n readonly interactionKey: string;\n readonly interactionId: string;\n readonly descriptorDigest?: string;\n readonly draftDigest?: string;\n readonly readiness: BrowserInteractionReadiness;\n}\n\nexport interface BrowserInteractionActuatorAttributesInput {\n readonly surface: string;\n readonly scopeId: string;\n readonly interactionKey: string;\n readonly interactionId: string;\n readonly descriptorDigest?: string;\n readonly draftDigest?: string;\n readonly intent: BrowserInteractionIntent;\n readonly inputKey?: string;\n readonly candidateValue?: unknown;\n readonly candidateState?: BrowserInteractionCandidateState;\n readonly enabled?: boolean;\n readonly actuatorKind: BrowserInteractionActuatorKind;\n readonly actuatorId?: string;\n readonly semanticEffects?: readonly BrowserInteractionSurfaceEffect[];\n readonly acceptedEffectPatterns?: readonly BrowserInteractionEffectPattern[];\n readonly preparationPatterns?: readonly BrowserInteractionEffectPattern[];\n readonly prepares?: BrowserInteractionPreparationTarget;\n}\n\nfunction baseGameplayAttributes(\n input: Pick<\n BrowserInteractionRootAttributesInput,\n \"surface\" | \"scopeId\" | \"interactionKey\" | \"interactionId\"\n >,\n): BrowserInteractionAttributeMap {\n return {\n [BROWSER_INTERACTION_ATTRIBUTES.protocol]:\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n [BROWSER_INTERACTION_ATTRIBUTES.surface]: input.surface,\n [BROWSER_INTERACTION_ATTRIBUTES.scope]: input.scopeId,\n [BROWSER_INTERACTION_ATTRIBUTES.interactionKey]: input.interactionKey,\n [BROWSER_INTERACTION_ATTRIBUTES.interactionId]: input.interactionId,\n };\n}\n\nexport function createBrowserInteractionRootAttributes(\n input: BrowserInteractionRootAttributesInput,\n): BrowserInteractionAttributeMap {\n return {\n ...baseGameplayAttributes(input),\n [BROWSER_INTERACTION_ATTRIBUTES.role]: \"interaction\",\n [BROWSER_INTERACTION_ATTRIBUTES.descriptorDigest]:\n input.descriptorDigest ?? \"\",\n [BROWSER_INTERACTION_ATTRIBUTES.draftDigest]: input.draftDigest ?? \"\",\n [BROWSER_INTERACTION_ATTRIBUTES.readiness]: input.readiness,\n };\n}\n\nexport function createBrowserInteractionActuatorAttributes(\n input: BrowserInteractionActuatorAttributesInput,\n): BrowserInteractionAttributeMap {\n const attrs: BrowserInteractionAttributeMap = {\n ...baseGameplayAttributes(input),\n [BROWSER_INTERACTION_ATTRIBUTES.role]: \"actuator\",\n [BROWSER_INTERACTION_ATTRIBUTES.intent]: input.intent,\n [BROWSER_INTERACTION_ATTRIBUTES.actuatorKind]: input.actuatorKind,\n [BROWSER_INTERACTION_ATTRIBUTES.enabled]:\n input.enabled === false ? \"false\" : \"true\",\n };\n if (input.descriptorDigest) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.descriptorDigest] =\n input.descriptorDigest;\n }\n if (input.draftDigest) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.draftDigest] = input.draftDigest;\n }\n if (input.actuatorId) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.actuatorId] = input.actuatorId;\n }\n if (input.inputKey) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.inputKey] = input.inputKey;\n }\n if (\"candidateValue\" in input) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.candidateValue] =\n encodeCanonicalCandidateValue(input.candidateValue);\n }\n if (input.candidateState) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.candidateState] = input.candidateState;\n }\n if (input.semanticEffects && input.semanticEffects.length > 0) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.semanticEffects] = JSON.stringify(\n input.semanticEffects.map(encodeBrowserInteractionEffect),\n );\n }\n if (input.acceptedEffectPatterns && input.acceptedEffectPatterns.length > 0) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.acceptedEffectPatterns] =\n JSON.stringify(\n input.acceptedEffectPatterns.map(encodeBrowserInteractionEffectPattern),\n );\n }\n if (input.preparationPatterns && input.preparationPatterns.length > 0) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.preparationPatterns] = JSON.stringify(\n input.preparationPatterns.map(encodeBrowserInteractionEffectPattern),\n );\n }\n if (input.prepares) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.preparesIntent] =\n input.prepares.intent;\n if (input.prepares.inputKey) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.preparesInputKey] =\n input.prepares.inputKey;\n }\n if (input.prepares.candidateValueKey) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.preparesCandidateValue] =\n input.prepares.candidateValueKey;\n } else if (\"candidateValue\" in input.prepares) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.preparesCandidateValue] =\n encodeCanonicalCandidateValue(input.prepares.candidateValue);\n }\n if (input.prepares.actuatorKind) {\n attrs[BROWSER_INTERACTION_ATTRIBUTES.preparesActuatorKind] =\n input.prepares.actuatorKind;\n }\n }\n return attrs;\n}\n\nexport type GameplayInteractionRootAttributesInput = Omit<\n BrowserInteractionRootAttributesInput,\n \"surface\"\n>;\n\nexport type GameplayActuatorAttributesInput = Omit<\n BrowserInteractionActuatorAttributesInput,\n | \"surface\"\n | \"intent\"\n | \"semanticEffects\"\n | \"acceptedEffectPatterns\"\n | \"preparationPatterns\"\n> & {\n readonly intent: GameplayBrowserInteractionIntent;\n readonly semanticEffects?: readonly GameplaySemanticEffect[];\n readonly acceptedEffectPatterns?: readonly GameplaySemanticEffectPattern[];\n readonly preparationPatterns?: readonly GameplaySemanticEffectPattern[];\n};\n\nexport function createGameplayInteractionRootAttributes(\n input: GameplayInteractionRootAttributesInput,\n): BrowserInteractionAttributeMap {\n return createBrowserInteractionRootAttributes({\n ...input,\n surface: GAMEPLAY_BROWSER_INTERACTION_SURFACE,\n });\n}\n\nexport function createGameplayActuatorAttributes(\n input: GameplayActuatorAttributesInput,\n): BrowserInteractionAttributeMap {\n return createBrowserInteractionActuatorAttributes({\n ...input,\n surface: GAMEPLAY_BROWSER_INTERACTION_SURFACE,\n });\n}\n\nexport function createBrowserInteractionActuatorKey(input: {\n readonly surface: string;\n readonly scopeId: string;\n readonly interactionKey: string;\n readonly intent: BrowserInteractionIntent;\n readonly inputKey?: string;\n readonly candidateValueKey?: string;\n readonly actuatorKind: BrowserInteractionActuatorKind;\n}): string {\n return [\n input.surface,\n input.scopeId,\n input.interactionKey,\n input.intent,\n input.inputKey ?? \"\",\n input.candidateValueKey ?? \"\",\n input.actuatorKind,\n ]\n .map((part) => encodeURIComponent(part))\n .join(\"|\");\n}\n","import {\n GAMEPLAY_BROWSER_INTERACTION_EFFECT_KINDS,\n GAMEPLAY_BROWSER_INTERACTION_INTENTS,\n GAMEPLAY_BROWSER_INTERACTION_SURFACE,\n} from \"./constants.js\";\nimport type {\n BrowserInteractionIntent,\n BrowserInteractionRegistry,\n BrowserInteractionSurface,\n BrowserInteractionSurfaceDefinition,\n} from \"./types.js\";\n\nexport function defineBrowserInteractionSurface<\n Surface extends BrowserInteractionSurface,\n Intent extends BrowserInteractionIntent,\n>(\n definition: BrowserInteractionSurfaceDefinition<Surface, Intent>,\n): BrowserInteractionSurfaceDefinition<Surface, Intent> {\n const seen = new Set<string>();\n for (const intent of definition.intents) {\n if (seen.has(intent)) {\n throw new Error(\n `Browser interaction surface '${definition.surface}' declares duplicate intent '${intent}'.`,\n );\n }\n seen.add(intent);\n }\n return definition;\n}\n\nexport const gameplayBrowserInteractionSurface =\n defineBrowserInteractionSurface({\n surface: GAMEPLAY_BROWSER_INTERACTION_SURFACE,\n intents: GAMEPLAY_BROWSER_INTERACTION_INTENTS,\n effectKinds: GAMEPLAY_BROWSER_INTERACTION_EFFECT_KINDS,\n });\n\nexport function createBrowserInteractionRegistry(\n definitions: readonly BrowserInteractionSurfaceDefinition[] = [\n gameplayBrowserInteractionSurface,\n ],\n): BrowserInteractionRegistry {\n const surfaces = new Map<\n BrowserInteractionSurface,\n BrowserInteractionSurfaceDefinition\n >();\n for (const definition of definitions) {\n const existing = surfaces.get(definition.surface);\n if (existing) {\n const existingIntents = existing.intents.join(\",\");\n const nextIntents = definition.intents.join(\",\");\n const existingEffectKinds = (existing.effectKinds ?? []).join(\",\");\n const nextEffectKinds = (definition.effectKinds ?? []).join(\",\");\n if (\n existingIntents !== nextIntents ||\n existingEffectKinds !== nextEffectKinds\n ) {\n throw new Error(\n `Browser interaction surface '${definition.surface}' is already registered with a different intent vocabulary or effect vocabulary.`,\n );\n }\n continue;\n }\n surfaces.set(definition.surface, definition);\n }\n return { surfaces };\n}\n\nexport const defaultBrowserInteractionRegistry =\n createBrowserInteractionRegistry();\n","import {\n BROWSER_INTERACTION_ACTUATOR_KINDS,\n BROWSER_INTERACTION_ATTRIBUTES,\n BROWSER_INTERACTION_CANDIDATE_STATES,\n BROWSER_INTERACTION_READINESS_VALUES,\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_NAME,\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n GAMEPLAY_BROWSER_INTERACTION_SURFACE,\n} from \"./constants.js\";\nimport {\n decodeCanonicalCandidateValue,\n encodeCanonicalCandidateValue,\n} from \"./canonical.js\";\nimport {\n browserInteractionEffectPatternMatches,\n decodeBrowserInteractionEffect,\n decodeBrowserInteractionEffectPattern,\n encodeBrowserInteractionEffect,\n encodeBrowserInteractionEffectPattern,\n} from \"./effects.js\";\nimport { createBrowserInteractionActuatorKey } from \"./attributes.js\";\nimport { defaultBrowserInteractionRegistry } from \"./registry.js\";\nimport type {\n BrowserInteractionActuator,\n BrowserInteractionActuatorKind,\n BrowserInteractionCandidateState,\n BrowserInteractionDiagnostic,\n BrowserInteractionEffectPattern,\n BrowserInteractionEntity,\n BrowserInteractionRawRecord,\n BrowserInteractionReadiness,\n BrowserInteractionRegistry,\n BrowserInteractionSemanticSurfaceSnapshot,\n BrowserInteractionSnapshot,\n BrowserInteractionSurfaceEffect,\n BrowserInteractionSurface,\n BrowserInteractionSurfaceSnapshot,\n} from \"./types.js\";\n\ninterface PendingInteraction {\n interactionKey: string;\n interactionId: string;\n descriptorDigest?: string;\n draftDigest?: string;\n readiness: BrowserInteractionReadiness;\n rootSeen: boolean;\n actuators: BrowserInteractionActuator[];\n diagnostics: BrowserInteractionDiagnostic[];\n}\n\ninterface PendingSemanticSurface {\n kind: \"semantic\";\n surface: BrowserInteractionSurface;\n scopeId: string;\n interactions: Map<string, PendingInteraction>;\n diagnostics: BrowserInteractionDiagnostic[];\n}\n\ninterface PendingUnknownSurface {\n kind: \"unknown\";\n surface: BrowserInteractionSurface;\n scopeId: string;\n diagnostics: BrowserInteractionDiagnostic[];\n}\n\ntype PendingSurface = PendingSemanticSurface | PendingUnknownSurface;\n\nexport interface NormalizeBrowserInteractionRecordsOptions {\n readonly registry?: BrowserInteractionRegistry;\n}\n\nexport function normalizeBrowserInteractionRecords(\n records: readonly BrowserInteractionRawRecord[],\n options: NormalizeBrowserInteractionRecordsOptions = {},\n): BrowserInteractionSnapshot {\n const registry = options.registry ?? defaultBrowserInteractionRegistry;\n const diagnostics: BrowserInteractionDiagnostic[] = [];\n const surfaces = new Map<string, PendingSurface>();\n\n const getSurface = (\n surface: string,\n scopeId: string,\n ): PendingSurface | null => {\n const registered = registry.surfaces.get(surface);\n const key = `${surface}\\0${scopeId}`;\n const existing = surfaces.get(key);\n if (existing) return existing;\n if (!registered) {\n const diagnostic = diagnosticFor({\n code: \"unknown-surface\",\n message: `Unknown browser interaction surface '${surface}'.`,\n surface,\n scopeId,\n });\n diagnostics.push(diagnostic);\n const pending: PendingUnknownSurface = {\n kind: \"unknown\",\n surface,\n scopeId,\n diagnostics: [diagnostic],\n };\n surfaces.set(key, pending);\n return pending;\n }\n const pending: PendingSemanticSurface = {\n kind: \"semantic\",\n surface,\n scopeId,\n interactions: new Map(),\n diagnostics: [],\n };\n surfaces.set(key, pending);\n return pending;\n };\n\n for (const record of records) {\n const attributes = record.attributes;\n const protocol = text(attributes, BROWSER_INTERACTION_ATTRIBUTES.protocol);\n const surface = text(attributes, BROWSER_INTERACTION_ATTRIBUTES.surface);\n const scopeId = text(attributes, BROWSER_INTERACTION_ATTRIBUTES.scope);\n const role = text(attributes, BROWSER_INTERACTION_ATTRIBUTES.role);\n\n if (protocol !== DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION) {\n diagnostics.push(\n diagnosticFor({\n code: \"invalid-protocol\",\n message: `Expected browser interaction protocol ${DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION}.`,\n surface,\n scopeId,\n }),\n );\n continue;\n }\n if (\n !surface ||\n !scopeId ||\n (role !== \"interaction\" && role !== \"actuator\")\n ) {\n diagnostics.push(\n diagnosticFor({\n code: \"invalid-record\",\n message:\n \"Browser interaction records require protocol, surface, scope and role.\",\n surface,\n scopeId,\n }),\n );\n continue;\n }\n\n const pendingSurface = getSurface(surface, scopeId);\n if (!pendingSurface || pendingSurface.kind !== \"semantic\") {\n continue;\n }\n const interactionKey = text(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.interactionKey,\n );\n const interactionId = text(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.interactionId,\n );\n if (!interactionKey || !interactionId) {\n pushSurfaceDiagnostic(\n pendingSurface,\n diagnostics,\n diagnosticFor({\n code: \"invalid-record\",\n message:\n \"Browser interaction records require interaction key and id.\",\n surface,\n scopeId,\n }),\n );\n continue;\n }\n const interaction = getInteraction(\n pendingSurface,\n interactionKey,\n interactionId,\n );\n\n if (role === \"interaction\") {\n interaction.rootSeen = true;\n interaction.descriptorDigest = optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.descriptorDigest,\n );\n interaction.draftDigest = optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.draftDigest,\n );\n interaction.readiness = parseReadiness(\n text(attributes, BROWSER_INTERACTION_ATTRIBUTES.readiness),\n );\n continue;\n }\n\n const actuator = parseGameplayActuator(attributes, {\n surface,\n scopeId,\n interactionKey,\n interactionId,\n });\n if (actuator.diagnostics.length > 0) {\n interaction.diagnostics.push(...actuator.diagnostics);\n diagnostics.push(...actuator.diagnostics);\n }\n const registered = registry.surfaces.get(surface);\n if (registered && !registered.intents.includes(actuator.intent)) {\n const diagnostic = diagnosticFor({\n code: \"unknown-intent\",\n message: `Unknown browser interaction intent '${actuator.intent}' for surface '${surface}'.`,\n surface,\n scopeId,\n interactionKey,\n intent: actuator.intent,\n actuatorId: actuator.actuatorId,\n });\n interaction.diagnostics.push(diagnostic);\n diagnostics.push(diagnostic);\n }\n if (registered?.effectKinds) {\n for (const effect of actuator.semanticEffects) {\n if (!registered.effectKinds.includes(effect.kind)) {\n const diagnostic = diagnosticFor({\n code: \"unknown-surface-effect\",\n message: `Unknown browser interaction effect '${effect.kind}' for surface '${surface}'.`,\n surface,\n scopeId,\n interactionKey,\n intent: actuator.intent,\n actuatorId: actuator.actuatorId,\n });\n interaction.diagnostics.push(diagnostic);\n diagnostics.push(diagnostic);\n }\n }\n for (const pattern of [\n ...actuator.acceptedEffectPatterns,\n ...actuator.preparationPatterns,\n ]) {\n const effectKind =\n pattern.kind === \"exact\" ? pattern.effect.kind : pattern.effectKind;\n if (!registered.effectKinds.includes(effectKind)) {\n const diagnostic = diagnosticFor({\n code: \"unknown-surface-effect\",\n message: `Unknown browser interaction effect '${effectKind}' for surface '${surface}'.`,\n surface,\n scopeId,\n interactionKey,\n intent: actuator.intent,\n actuatorId: actuator.actuatorId,\n });\n interaction.diagnostics.push(diagnostic);\n diagnostics.push(diagnostic);\n }\n }\n }\n interaction.actuators.push(actuator);\n }\n\n for (const surface of surfaces.values()) {\n if (surface.kind !== \"semantic\") continue;\n for (const interaction of surface.interactions.values()) {\n if (interaction.rootSeen || interaction.actuators.length === 0) continue;\n const diagnostic = diagnosticFor({\n code: \"orphan-actuator\",\n message:\n \"Browser interaction actuators require a rendered semantic root.\",\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n });\n interaction.diagnostics.push(diagnostic);\n diagnostics.push(diagnostic);\n }\n }\n\n const snapshot: BrowserInteractionSnapshot = {\n protocol: {\n name: DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_NAME,\n version: DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n },\n surfaces: [...surfaces.values()].map(finalizeSurface).sort(compareSurface),\n diagnostics: [],\n };\n const validationDiagnostics = validateBrowserInteractionSnapshot(snapshot);\n return {\n ...snapshot,\n diagnostics: [...diagnostics, ...validationDiagnostics].sort(\n compareDiagnostic,\n ),\n };\n}\n\nexport function validateBrowserInteractionSnapshot(\n snapshot: BrowserInteractionSnapshot,\n): readonly BrowserInteractionDiagnostic[] {\n const diagnostics: BrowserInteractionDiagnostic[] = [];\n for (const surface of snapshot.surfaces) {\n if (!isSemanticSurfaceSnapshot(surface)) continue;\n for (const interaction of surface.interactions) {\n const enabledByKey = new Map<string, BrowserInteractionActuator[]>();\n for (const actuator of interaction.actuators) {\n if (!actuator.enabled) continue;\n const key = actuatorIdentityKey({\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n actuator,\n });\n const group = enabledByKey.get(key) ?? [];\n group.push(actuator);\n enabledByKey.set(key, group);\n }\n for (const [key, actuators] of enabledByKey) {\n if (actuators.length > 1) {\n diagnostics.push(\n diagnosticFor({\n code: \"duplicate-enabled-actuator\",\n message: `Duplicate enabled actuator for '${key}'.`,\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n intent: actuators[0]?.intent,\n actuatorId: actuators[0]?.actuatorId,\n }),\n );\n }\n }\n diagnostics.push(\n ...diagnosticsForPreparationCycles(surface, interaction),\n ...diagnosticsForPreparationPatternAmbiguity(surface, interaction),\n ...diagnosticsForInvalidAcceptedPatterns(surface, interaction),\n ...diagnosticsForGameplayEffectCompatibility(surface, interaction),\n );\n }\n }\n return diagnostics.sort(compareDiagnostic);\n}\n\nfunction diagnosticsForInvalidAcceptedPatterns(\n surface: BrowserInteractionSemanticSurfaceSnapshot,\n interaction: BrowserInteractionEntity,\n): BrowserInteractionDiagnostic[] {\n const diagnostics: BrowserInteractionDiagnostic[] = [];\n for (const actuator of interaction.actuators) {\n for (const pattern of actuator.acceptedEffectPatterns) {\n if (\n pattern.kind === \"match\" &&\n Object.keys(pattern.fields ?? {}).length === 0 &&\n pattern.scalar === undefined\n ) {\n diagnostics.push(\n diagnosticFor({\n code: \"invalid-effect-pattern\",\n message:\n \"Accepted-effect match patterns must be bounded by fields or scalar constraints.\",\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n intent: actuator.intent,\n actuatorId: actuator.actuatorId,\n }),\n );\n }\n }\n }\n return diagnostics;\n}\n\nfunction diagnosticsForGameplayEffectCompatibility(\n surface: BrowserInteractionSemanticSurfaceSnapshot,\n interaction: BrowserInteractionEntity,\n): BrowserInteractionDiagnostic[] {\n if (surface.surface !== GAMEPLAY_BROWSER_INTERACTION_SURFACE) return [];\n const diagnostics: BrowserInteractionDiagnostic[] = [];\n for (const actuator of interaction.actuators) {\n for (const effect of actuator.semanticEffects) {\n if (!gameplayIntentCanPerformEffect(actuator.intent, effect.kind)) {\n diagnostics.push(\n diagnosticFor({\n code: \"effect-intent-incompatibility\",\n message:\n \"Gameplay browser interaction intent is incompatible with its semantic effect.\",\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n intent: actuator.intent,\n actuatorId: actuator.actuatorId,\n }),\n );\n }\n }\n }\n return diagnostics;\n}\n\nfunction gameplayIntentCanPerformEffect(intent: string, effectKind: string) {\n switch (effectKind) {\n case \"setCandidate\":\n return intent === \"select\" || intent === \"toggle\";\n case \"adjustResource\":\n return intent === \"increment\" || intent === \"decrement\";\n case \"setScalar\":\n return (\n intent === \"fill\" || intent === \"increment\" || intent === \"decrement\"\n );\n case \"commit\":\n return intent === \"submit\" || intent === \"invoke\";\n case \"invoke\":\n return intent === \"invoke\" || intent === \"select\" || intent === \"toggle\";\n default:\n return true;\n }\n}\n\nfunction parseGameplayActuator(\n attributes: Readonly<Record<string, string | boolean | null | undefined>>,\n context: {\n surface: string;\n scopeId: string;\n interactionKey: string;\n interactionId: string;\n },\n): BrowserInteractionActuator {\n const diagnostics: BrowserInteractionDiagnostic[] = [];\n const intent = text(attributes, BROWSER_INTERACTION_ATTRIBUTES.intent);\n const actuatorKind = parseActuatorKind(\n text(attributes, BROWSER_INTERACTION_ATTRIBUTES.actuatorKind),\n );\n const inputKey = optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.inputKey,\n );\n const candidate = parseCandidate(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.candidateValue,\n context,\n intent,\n diagnostics,\n );\n const candidateState = parseCandidateState(\n optionalText(attributes, BROWSER_INTERACTION_ATTRIBUTES.candidateState),\n );\n const explicitId = optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.actuatorId,\n );\n const enabled = parseEnabled(\n attributes[BROWSER_INTERACTION_ATTRIBUTES.enabled],\n );\n const actuatorId =\n explicitId ??\n createBrowserInteractionActuatorKey({\n surface: context.surface,\n scopeId: context.scopeId,\n interactionKey: context.interactionKey,\n intent,\n inputKey,\n candidateValueKey: candidate?.candidateValueKey,\n actuatorKind,\n });\n const preparesIntent = optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.preparesIntent,\n );\n const preparesCandidate = parseCandidate(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.preparesCandidateValue,\n context,\n preparesIntent ?? intent,\n diagnostics,\n );\n const prepares =\n preparesIntent === undefined\n ? undefined\n : {\n intent: preparesIntent,\n inputKey: optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.preparesInputKey,\n ),\n candidateValue: preparesCandidate?.candidateValue,\n candidateValueKey: preparesCandidate?.candidateValueKey,\n actuatorKind: parseOptionalActuatorKind(\n optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.preparesActuatorKind,\n ),\n ),\n };\n const semanticEffects = parseEffectList(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.semanticEffects,\n context,\n intent,\n diagnostics,\n );\n const acceptedEffectPatterns = parseEffectPatternList(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.acceptedEffectPatterns,\n context,\n intent,\n diagnostics,\n );\n const preparationPatterns = parseEffectPatternList(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.preparationPatterns,\n context,\n intent,\n diagnostics,\n );\n\n if (!intent) {\n diagnostics.push(\n diagnosticFor({\n code: \"invalid-record\",\n message: \"Browser interaction actuator records require an intent.\",\n ...context,\n }),\n );\n }\n\n return {\n actuatorId,\n intent,\n descriptorDigest: optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.descriptorDigest,\n ),\n draftDigest: optionalText(\n attributes,\n BROWSER_INTERACTION_ATTRIBUTES.draftDigest,\n ),\n inputKey,\n candidateValue: candidate?.candidateValue,\n candidateValueKey: candidate?.candidateValueKey,\n candidateState,\n enabled,\n actuatorKind,\n semanticEffects,\n acceptedEffectPatterns,\n preparationPatterns,\n prepares,\n diagnostics: diagnostics.sort(compareDiagnostic),\n };\n}\n\nfunction parseEffectList(\n attributes: Readonly<Record<string, string | boolean | null | undefined>>,\n attribute: string,\n context: {\n surface: string;\n scopeId: string;\n interactionKey: string;\n },\n intent: string,\n diagnostics: BrowserInteractionDiagnostic[],\n): BrowserInteractionSurfaceEffect[] {\n const encodedList = optionalText(attributes, attribute);\n if (encodedList === undefined) return [];\n try {\n const raw = JSON.parse(encodedList) as unknown;\n if (!Array.isArray(raw) || raw.some((item) => typeof item !== \"string\")) {\n throw new Error(\"Expected encoded effect array.\");\n }\n return raw\n .map((encoded) => decodeBrowserInteractionEffect(encoded))\n .sort((a, b) =>\n encodeBrowserInteractionEffect(a).localeCompare(\n encodeBrowserInteractionEffect(b),\n ),\n );\n } catch {\n diagnostics.push(\n diagnosticFor({\n code: \"invalid-effect-payload\",\n message: \"Invalid browser interaction semantic effect payload.\",\n ...context,\n intent,\n }),\n );\n return [];\n }\n}\n\nfunction parseEffectPatternList(\n attributes: Readonly<Record<string, string | boolean | null | undefined>>,\n attribute: string,\n context: {\n surface: string;\n scopeId: string;\n interactionKey: string;\n },\n intent: string,\n diagnostics: BrowserInteractionDiagnostic[],\n): BrowserInteractionEffectPattern[] {\n const encodedList = optionalText(attributes, attribute);\n if (encodedList === undefined) return [];\n try {\n const raw = JSON.parse(encodedList) as unknown;\n if (!Array.isArray(raw) || raw.some((item) => typeof item !== \"string\")) {\n throw new Error(\"Expected encoded effect pattern array.\");\n }\n return raw\n .map((encoded) => decodeBrowserInteractionEffectPattern(encoded))\n .sort((a, b) =>\n encodeBrowserInteractionEffectPattern(a).localeCompare(\n encodeBrowserInteractionEffectPattern(b),\n ),\n );\n } catch {\n diagnostics.push(\n diagnosticFor({\n code: \"invalid-effect-pattern\",\n message: \"Invalid browser interaction semantic effect pattern.\",\n ...context,\n intent,\n }),\n );\n return [];\n }\n}\n\nfunction parseCandidate(\n attributes: Readonly<Record<string, string | boolean | null | undefined>>,\n attribute: string,\n context: {\n surface: string;\n scopeId: string;\n interactionKey: string;\n },\n intent: string,\n diagnostics: BrowserInteractionDiagnostic[],\n) {\n const encoded = optionalText(attributes, attribute);\n if (encoded === undefined) return undefined;\n try {\n const candidateValue = decodeCanonicalCandidateValue(encoded);\n return {\n candidateValue,\n candidateValueKey: encodeCanonicalCandidateValue(candidateValue),\n };\n } catch {\n diagnostics.push(\n diagnosticFor({\n code: \"invalid-candidate\",\n message: `Invalid canonical browser interaction candidate '${encoded}'.`,\n ...context,\n intent,\n }),\n );\n return undefined;\n }\n}\n\nfunction getInteraction(\n surface: PendingSemanticSurface,\n interactionKey: string,\n interactionId: string,\n): PendingInteraction {\n const existing = surface.interactions.get(interactionKey);\n if (existing) return existing;\n const next: PendingInteraction = {\n interactionKey,\n interactionId,\n readiness: \"ready\",\n rootSeen: false,\n actuators: [],\n diagnostics: [],\n };\n surface.interactions.set(interactionKey, next);\n return next;\n}\n\nfunction finalizeSurface(\n surface: PendingSurface,\n): BrowserInteractionSurfaceSnapshot {\n if (surface.kind !== \"semantic\") {\n return {\n surface: surface.surface,\n scopeId: surface.scopeId,\n diagnostics: surface.diagnostics.sort(compareDiagnostic),\n };\n }\n const interactions: BrowserInteractionEntity[] = [\n ...surface.interactions.values(),\n ]\n .map((interaction) => ({\n interactionKey: interaction.interactionKey,\n interactionId: interaction.interactionId,\n descriptorDigest: interaction.descriptorDigest,\n draftDigest: interaction.draftDigest,\n readiness: interaction.readiness,\n actuators: interaction.actuators.sort(compareActuator),\n diagnostics: interaction.diagnostics.sort(compareDiagnostic),\n }))\n .sort((a, b) => a.interactionKey.localeCompare(b.interactionKey));\n return {\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactions,\n diagnostics: surface.diagnostics.sort(compareDiagnostic),\n };\n}\n\nfunction diagnosticsForPreparationCycles(\n surface: BrowserInteractionSemanticSurfaceSnapshot,\n interaction: BrowserInteractionEntity,\n): BrowserInteractionDiagnostic[] {\n const diagnostics: BrowserInteractionDiagnostic[] = [];\n diagnostics.push(\n ...diagnosticsForEffectPreparationCycles(surface, interaction),\n );\n const actuators = new Map<string, BrowserInteractionActuator>();\n for (const actuator of interaction.actuators) {\n actuators.set(\n actuatorIdentityKey({\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n actuator,\n }),\n actuator,\n );\n }\n for (const actuator of interaction.actuators) {\n const visited = new Set<string>();\n let current: BrowserInteractionActuator | undefined = actuator;\n while (current?.prepares) {\n const key = actuatorIdentityKey({\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n actuator: current,\n });\n if (visited.has(key)) {\n diagnostics.push(\n diagnosticFor({\n code: \"preparation-cycle\",\n message: `Preparation cycle detected for actuator '${current.actuatorId}'.`,\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n intent: current.intent,\n actuatorId: current.actuatorId,\n }),\n );\n break;\n }\n visited.add(key);\n current = actuators.get(\n targetIdentityKey({\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n target: current.prepares,\n }),\n );\n }\n }\n return diagnostics;\n}\n\nfunction diagnosticsForEffectPreparationCycles(\n surface: BrowserInteractionSemanticSurfaceSnapshot,\n interaction: BrowserInteractionEntity,\n): BrowserInteractionDiagnostic[] {\n const diagnostics: BrowserInteractionDiagnostic[] = [];\n const actuatorKeys = new Map<BrowserInteractionActuator, string>();\n interaction.actuators.forEach((actuator, index) => {\n actuatorKeys.set(actuator, `${actuator.actuatorId}\\0${index}`);\n });\n for (const actuator of interaction.actuators) {\n const visited = new Set<string>();\n let current: BrowserInteractionActuator | undefined = actuator;\n while (current) {\n const key = actuatorKeys.get(current);\n if (!key) break;\n if (visited.has(key)) {\n diagnostics.push(\n diagnosticFor({\n code: \"preparation-cycle\",\n message: `Semantic preparation cycle detected for actuator '${current.actuatorId}'.`,\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n intent: current.intent,\n actuatorId: current.actuatorId,\n }),\n );\n break;\n }\n visited.add(key);\n current = interaction.actuators.find((candidate) =>\n current?.preparationPatterns.some((pattern) =>\n candidate.semanticEffects.some((effect) =>\n browserInteractionEffectPatternMatches(pattern, effect),\n ),\n ),\n );\n }\n }\n return diagnostics;\n}\n\nfunction diagnosticsForPreparationPatternAmbiguity(\n surface: BrowserInteractionSemanticSurfaceSnapshot,\n interaction: BrowserInteractionEntity,\n): BrowserInteractionDiagnostic[] {\n const diagnostics: BrowserInteractionDiagnostic[] = [];\n for (const target of interaction.actuators) {\n for (const effect of target.semanticEffects) {\n const matches = interaction.actuators.filter((actuator) =>\n actuator.preparationPatterns.some((pattern) =>\n browserInteractionEffectPatternMatches(pattern, effect),\n ),\n );\n const uniqueActuatorIds = new Set(\n matches.map((match) => match.actuatorId),\n );\n if (uniqueActuatorIds.size > 1) {\n diagnostics.push(\n diagnosticFor({\n code: \"ambiguous-preparation-pattern\",\n message:\n \"Multiple preparation patterns can prepare the same semantic effect.\",\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n intent: target.intent,\n actuatorId: target.actuatorId,\n }),\n );\n }\n }\n }\n return diagnostics;\n}\n\nexport function actuatorIdentityKey(input: {\n readonly surface: string;\n readonly scopeId: string;\n readonly interactionKey: string;\n readonly actuator: Pick<\n BrowserInteractionActuator,\n \"intent\" | \"inputKey\" | \"candidateValueKey\" | \"actuatorKind\"\n >;\n}): string {\n return createBrowserInteractionActuatorKey({\n surface: input.surface,\n scopeId: input.scopeId,\n interactionKey: input.interactionKey,\n intent: input.actuator.intent,\n inputKey: input.actuator.inputKey,\n candidateValueKey: input.actuator.candidateValueKey,\n actuatorKind: input.actuator.actuatorKind,\n });\n}\n\nexport function isGameplaySurfaceSnapshot(\n surface: BrowserInteractionSurfaceSnapshot,\n): surface is BrowserInteractionSemanticSurfaceSnapshot<\n typeof GAMEPLAY_BROWSER_INTERACTION_SURFACE\n> {\n return surface.surface === GAMEPLAY_BROWSER_INTERACTION_SURFACE;\n}\n\nexport function isSemanticSurfaceSnapshot(\n surface: BrowserInteractionSurfaceSnapshot,\n): surface is BrowserInteractionSemanticSurfaceSnapshot {\n return \"interactions\" in surface;\n}\n\nexport function targetIdentityKey(input: {\n readonly surface: string;\n readonly scopeId: string;\n readonly interactionKey: string;\n readonly target: {\n readonly intent: string;\n readonly inputKey?: string;\n readonly candidateValueKey?: string;\n readonly actuatorKind?: BrowserInteractionActuatorKind;\n };\n}): string {\n return createBrowserInteractionActuatorKey({\n surface: input.surface,\n scopeId: input.scopeId,\n interactionKey: input.interactionKey,\n intent: input.target.intent,\n inputKey: input.target.inputKey,\n candidateValueKey: input.target.candidateValueKey,\n actuatorKind: input.target.actuatorKind ?? \"click\",\n });\n}\n\nfunction pushSurfaceDiagnostic(\n surface: PendingSemanticSurface,\n all: BrowserInteractionDiagnostic[],\n diagnostic: BrowserInteractionDiagnostic,\n) {\n surface.diagnostics.push(diagnostic);\n all.push(diagnostic);\n}\n\nfunction diagnosticFor(\n input: Omit<BrowserInteractionDiagnostic, \"severity\">,\n): BrowserInteractionDiagnostic {\n return { severity: \"error\", ...input };\n}\n\nfunction text(\n attributes: Readonly<Record<string, string | boolean | null | undefined>>,\n key: string,\n): string {\n const value = attributes[key];\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n return value ?? \"\";\n}\n\nfunction optionalText(\n attributes: Readonly<Record<string, string | boolean | null | undefined>>,\n key: string,\n): string | undefined {\n const value = text(attributes, key);\n return value === \"\" ? undefined : value;\n}\n\nfunction parseReadiness(value: string): BrowserInteractionReadiness {\n return BROWSER_INTERACTION_READINESS_VALUES.includes(\n value as BrowserInteractionReadiness,\n )\n ? (value as BrowserInteractionReadiness)\n : \"blocked\";\n}\n\nfunction parseCandidateState(\n value: string | undefined,\n): BrowserInteractionCandidateState | undefined {\n return BROWSER_INTERACTION_CANDIDATE_STATES.includes(\n value as BrowserInteractionCandidateState,\n )\n ? (value as BrowserInteractionCandidateState)\n : undefined;\n}\n\nfunction parseActuatorKind(value: string): BrowserInteractionActuatorKind {\n return parseOptionalActuatorKind(value) ?? \"click\";\n}\n\nfunction parseOptionalActuatorKind(\n value: string | undefined,\n): BrowserInteractionActuatorKind | undefined {\n return BROWSER_INTERACTION_ACTUATOR_KINDS.includes(\n value as BrowserInteractionActuatorKind,\n )\n ? (value as BrowserInteractionActuatorKind)\n : undefined;\n}\n\nfunction parseEnabled(value: string | boolean | null | undefined): boolean {\n if (value === false || value === \"false\") return false;\n return true;\n}\n\nfunction compareSurface(\n a: BrowserInteractionSurfaceSnapshot,\n b: BrowserInteractionSurfaceSnapshot,\n): number {\n return (\n a.surface.localeCompare(b.surface) || a.scopeId.localeCompare(b.scopeId)\n );\n}\n\nfunction compareActuator(\n a: BrowserInteractionActuator,\n b: BrowserInteractionActuator,\n): number {\n return a.actuatorId.localeCompare(b.actuatorId);\n}\n\nfunction compareDiagnostic(\n a: BrowserInteractionDiagnostic,\n b: BrowserInteractionDiagnostic,\n): number {\n return (\n a.code.localeCompare(b.code) ||\n (a.surface ?? \"\").localeCompare(b.surface ?? \"\") ||\n (a.scopeId ?? \"\").localeCompare(b.scopeId ?? \"\") ||\n (a.interactionKey ?? \"\").localeCompare(b.interactionKey ?? \"\") ||\n (a.intent ?? \"\").localeCompare(b.intent ?? \"\") ||\n (a.actuatorId ?? \"\").localeCompare(b.actuatorId ?? \"\") ||\n a.message.localeCompare(b.message)\n );\n}\n","import { encodeCanonicalCandidateValue } from \"./canonical.js\";\nimport {\n browserInteractionEffectPatternMatches,\n encodeBrowserInteractionEffect,\n} from \"./effects.js\";\nimport {\n actuatorIdentityKey,\n isSemanticSurfaceSnapshot,\n targetIdentityKey,\n validateBrowserInteractionSnapshot,\n} from \"./normalize.js\";\nimport type {\n BrowserInteractionActuator,\n BrowserInteractionDiagnostic,\n BrowserInteractionEffectRequest,\n BrowserInteractionEffectResolution,\n BrowserInteractionEntity,\n BrowserInteractionIntentRequest,\n BrowserInteractionResolution,\n BrowserInteractionSemanticSurfaceSnapshot,\n BrowserInteractionSnapshot,\n BrowserInteractionSurfaceEffect,\n} from \"./types.js\";\n\nexport function resolveBrowserInteractionIntent(\n snapshot: BrowserInteractionSnapshot,\n request: BrowserInteractionIntentRequest,\n): BrowserInteractionResolution {\n const snapshotDiagnostics = [\n ...snapshot.diagnostics,\n ...validateBrowserInteractionSnapshot(snapshot),\n ];\n if (\n snapshotDiagnostics.some((diagnostic) => diagnostic.severity === \"error\")\n ) {\n return {\n ok: false,\n code: \"invalid-snapshot\",\n diagnostics: snapshotDiagnostics,\n };\n }\n\n const candidateValueKey =\n request.candidateValueKey ??\n (\"candidateValue\" in request\n ? encodeCanonicalCandidateValue(request.candidateValue)\n : undefined);\n const surfaces = snapshot.surfaces.filter(\n (surface): surface is BrowserInteractionSemanticSurfaceSnapshot =>\n isSemanticSurfaceSnapshot(surface) &&\n surface.surface === request.surface &&\n (request.scopeId === undefined || surface.scopeId === request.scopeId),\n );\n const matches = surfaces.flatMap((surface) =>\n surface.interactions.flatMap((interaction) => {\n if (\n request.interactionKey !== undefined &&\n interaction.interactionKey !== request.interactionKey\n ) {\n return [];\n }\n if (\n request.interactionId !== undefined &&\n interaction.interactionId !== request.interactionId\n ) {\n return [];\n }\n return interaction.actuators\n .filter((actuator) =>\n actuatorMatchesRequest(actuator, request, candidateValueKey),\n )\n .map((actuator) => ({ surface, interaction, actuator }));\n }),\n );\n const enabledMatches = matches.filter((match) => match.actuator.enabled);\n const actionable = request.allowDisabled === true ? matches : enabledMatches;\n\n if (actionable.length === 1) {\n const match = actionable[0];\n if (!match) throw new Error(\"unreachable browser interaction match\");\n return {\n ok: true,\n actuator: match.actuator,\n surface: match.surface.surface,\n scopeId: match.surface.scopeId,\n interactionKey: match.interaction.interactionKey,\n diagnostics: [],\n };\n }\n\n if (actionable.length > 1) {\n return {\n ok: false,\n code: \"ambiguous\",\n diagnostics: actionable.map((match) =>\n diagnosticFor({\n code: \"ambiguous-actuator\",\n message: \"Browser interaction intent resolved to multiple actuators.\",\n surface: match.surface.surface,\n scopeId: match.surface.scopeId,\n interactionKey: match.interaction.interactionKey,\n intent: match.actuator.intent,\n actuatorId: match.actuator.actuatorId,\n }),\n ),\n };\n }\n\n const preparation = findPreparationChain(\n surfaces,\n request,\n candidateValueKey,\n );\n if (preparation.length > 0) {\n return {\n ok: false,\n code: \"preparation-required\",\n diagnostics: [\n diagnosticFor({\n code: \"unavailable-actuator\",\n message:\n \"Requested browser interaction intent requires preparation before its actuator is available.\",\n surface: request.surface,\n scopeId: request.scopeId,\n interactionKey: request.interactionKey,\n intent: request.intent,\n }),\n ],\n preparation,\n };\n }\n\n return {\n ok: false,\n code: matches.length > 0 ? \"unavailable\" : \"not-found\",\n diagnostics: [\n diagnosticFor({\n code: \"unavailable-actuator\",\n message:\n matches.length > 0\n ? \"Browser interaction intent exists but has no enabled actuator.\"\n : \"Browser interaction intent is not present in the current snapshot.\",\n surface: request.surface,\n scopeId: request.scopeId,\n interactionKey: request.interactionKey,\n intent: request.intent,\n }),\n ],\n };\n}\n\nexport function resolveBrowserInteractionEffect(\n snapshot: BrowserInteractionSnapshot,\n request: BrowserInteractionEffectRequest,\n): BrowserInteractionEffectResolution {\n const snapshotDiagnostics = [\n ...snapshot.diagnostics,\n ...validateBrowserInteractionSnapshot(snapshot),\n ];\n if (\n snapshotDiagnostics.some((diagnostic) => diagnostic.severity === \"error\")\n ) {\n return {\n ok: false,\n code: \"invalid-snapshot\",\n diagnostics: snapshotDiagnostics,\n };\n }\n\n const effectDiagnostics = validateEffectRequest(request.effect, request);\n if (effectDiagnostics.length > 0) {\n return {\n ok: false,\n code: \"invalid-effect\",\n diagnostics: effectDiagnostics,\n };\n }\n\n const surfaces = matchingSurfaces(snapshot, request);\n const matches = collectInteractionMatches(surfaces, request);\n const exactMatches = matches.filter((match) =>\n match.actuator.semanticEffects.some(\n (effect) =>\n encodeBrowserInteractionEffect(effect) ===\n encodeBrowserInteractionEffect(request.effect),\n ),\n );\n const enabledExactMatches = exactMatches.filter(\n (match) => match.actuator.enabled,\n );\n const actionableExactMatches =\n request.allowDisabled === true ? exactMatches : enabledExactMatches;\n\n if (actionableExactMatches.length === 1) {\n const match = actionableExactMatches[0];\n if (!match) throw new Error(\"unreachable browser effect match\");\n return effectSuccess(match, request.effect, \"exact\");\n }\n\n if (actionableExactMatches.length > 1) {\n return effectAmbiguous(\n actionableExactMatches,\n \"duplicate-enabled-effect-actuator\",\n \"Browser interaction effect resolved to multiple exact actuators.\",\n );\n }\n\n if (exactMatches.length > 0 && enabledExactMatches.length === 0) {\n return effectUnavailable(\n request,\n \"disabled-effect-actuator\",\n \"Browser interaction effect exists but has no enabled actuator.\",\n );\n }\n\n const acceptedMatches = matches.filter((match) =>\n match.actuator.acceptedEffectPatterns.some((pattern) =>\n browserInteractionEffectPatternMatches(pattern, request.effect),\n ),\n );\n const enabledAcceptedMatches = acceptedMatches.filter(\n (match) => match.actuator.enabled,\n );\n const actionableAcceptedMatches =\n request.allowDisabled === true ? acceptedMatches : enabledAcceptedMatches;\n\n if (actionableAcceptedMatches.length === 1) {\n const match = actionableAcceptedMatches[0];\n if (!match) throw new Error(\"unreachable browser accepted effect match\");\n return effectSuccess(match, request.effect, \"accepted-pattern\");\n }\n\n if (actionableAcceptedMatches.length > 1) {\n return effectAmbiguous(\n actionableAcceptedMatches,\n \"duplicate-accepted-effect-pattern-match\",\n \"Browser interaction effect matched multiple accepted-effect patterns.\",\n );\n }\n\n if (acceptedMatches.length > 0 && enabledAcceptedMatches.length === 0) {\n return effectUnavailable(\n request,\n \"disabled-effect-actuator\",\n \"Browser interaction effect pattern exists but has no enabled actuator.\",\n );\n }\n\n const preparation = findEffectPreparationChain(surfaces, request);\n if (preparation.ok) {\n return {\n ok: false,\n code: \"preparation-required\",\n diagnostics: [\n diagnosticFor({\n code: \"unavailable-actuator\",\n message:\n \"Requested browser interaction effect requires preparation before its actuator is available.\",\n surface: request.surface,\n scopeId: request.scopeId,\n interactionKey: request.interactionKey,\n }),\n ],\n preparation: preparation.preparation,\n };\n }\n if (preparation.diagnostics.length > 0) {\n return {\n ok: false,\n code: \"ambiguous\",\n diagnostics: preparation.diagnostics,\n };\n }\n\n return {\n ok: false,\n code: \"not-found\",\n diagnostics: [\n diagnosticFor({\n code: \"missing-effect\",\n message:\n \"Browser interaction effect is not present in the current snapshot.\",\n surface: request.surface,\n scopeId: request.scopeId,\n interactionKey: request.interactionKey,\n }),\n ],\n };\n}\n\nfunction actuatorMatchesRequest(\n actuator: BrowserInteractionActuator,\n request: BrowserInteractionIntentRequest,\n candidateValueKey: string | undefined,\n): boolean {\n return (\n actuator.intent === request.intent &&\n (request.inputKey === undefined ||\n actuator.inputKey === request.inputKey) &&\n (candidateValueKey === undefined ||\n actuator.candidateValueKey === candidateValueKey) &&\n (request.actuatorKind === undefined ||\n actuator.actuatorKind === request.actuatorKind)\n );\n}\n\nfunction findPreparationChain(\n surfaces: readonly BrowserInteractionSemanticSurfaceSnapshot[],\n request: BrowserInteractionIntentRequest,\n candidateValueKey: string | undefined,\n): BrowserInteractionActuator[] {\n const targetRequest = {\n ...request,\n candidateValueKey,\n };\n const preparationMatches = surfaces.flatMap((surface) =>\n surface.interactions.flatMap((interaction) => {\n if (!interactionMatchesRequest(interaction, request)) return [];\n return interaction.actuators\n .filter(\n (actuator) =>\n actuator.enabled &&\n actuator.prepares &&\n actuator.prepares.intent === targetRequest.intent &&\n (targetRequest.inputKey === undefined ||\n actuator.prepares.inputKey === targetRequest.inputKey) &&\n (targetRequest.candidateValueKey === undefined ||\n actuator.prepares.candidateValueKey ===\n targetRequest.candidateValueKey) &&\n (targetRequest.actuatorKind === undefined ||\n actuator.prepares.actuatorKind === targetRequest.actuatorKind),\n )\n .map((actuator) => ({ surface, interaction, actuator }));\n }),\n );\n if (preparationMatches.length !== 1) return [];\n const match = preparationMatches[0];\n if (!match) return [];\n return expandPreparationChain(\n match.surface,\n match.interaction,\n match.actuator,\n );\n}\n\nfunction expandPreparationChain(\n surface: BrowserInteractionSemanticSurfaceSnapshot,\n interaction: BrowserInteractionEntity,\n actuator: BrowserInteractionActuator,\n): BrowserInteractionActuator[] {\n const byKey = new Map<string, BrowserInteractionActuator>();\n for (const candidate of interaction.actuators) {\n byKey.set(\n actuatorIdentityKey({\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n actuator: candidate,\n }),\n candidate,\n );\n }\n const chain: BrowserInteractionActuator[] = [];\n const visited = new Set<string>();\n let current: BrowserInteractionActuator | undefined = actuator;\n while (current) {\n const key = actuatorIdentityKey({\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n actuator: current,\n });\n if (visited.has(key)) return [];\n visited.add(key);\n chain.push(current);\n current = current.prepares\n ? byKey.get(\n targetIdentityKey({\n surface: surface.surface,\n scopeId: surface.scopeId,\n interactionKey: interaction.interactionKey,\n target: current.prepares,\n }),\n )\n : undefined;\n }\n return chain;\n}\n\nfunction interactionMatchesRequest(\n interaction: BrowserInteractionEntity,\n request: BrowserInteractionIntentRequest,\n): boolean {\n return (\n (request.interactionKey === undefined ||\n interaction.interactionKey === request.interactionKey) &&\n (request.interactionId === undefined ||\n interaction.interactionId === request.interactionId)\n );\n}\n\nfunction matchingSurfaces(\n snapshot: BrowserInteractionSnapshot,\n request: Pick<BrowserInteractionEffectRequest, \"surface\" | \"scopeId\">,\n): BrowserInteractionSemanticSurfaceSnapshot[] {\n return snapshot.surfaces.filter(\n (surface): surface is BrowserInteractionSemanticSurfaceSnapshot =>\n isSemanticSurfaceSnapshot(surface) &&\n surface.surface === request.surface &&\n (request.scopeId === undefined || surface.scopeId === request.scopeId),\n );\n}\n\nfunction collectInteractionMatches(\n surfaces: readonly BrowserInteractionSemanticSurfaceSnapshot[],\n request: Pick<\n BrowserInteractionEffectRequest,\n \"interactionKey\" | \"interactionId\"\n >,\n) {\n return surfaces.flatMap((surface) =>\n surface.interactions.flatMap((interaction) => {\n if (\n request.interactionKey !== undefined &&\n interaction.interactionKey !== request.interactionKey\n ) {\n return [];\n }\n if (\n request.interactionId !== undefined &&\n interaction.interactionId !== request.interactionId\n ) {\n return [];\n }\n return interaction.actuators.map((actuator) => ({\n surface,\n interaction,\n actuator,\n }));\n }),\n );\n}\n\nfunction effectSuccess(\n match: {\n readonly surface: BrowserInteractionSemanticSurfaceSnapshot;\n readonly interaction: BrowserInteractionEntity;\n readonly actuator: BrowserInteractionActuator;\n },\n effect: BrowserInteractionSurfaceEffect,\n kind: \"exact\" | \"accepted-pattern\",\n): BrowserInteractionEffectResolution {\n return {\n ok: true,\n actuator: match.actuator,\n surface: match.surface.surface,\n scopeId: match.surface.scopeId,\n interactionKey: match.interaction.interactionKey,\n match: kind,\n effect,\n diagnostics: [],\n };\n}\n\nfunction effectAmbiguous(\n matches: readonly {\n readonly surface: BrowserInteractionSemanticSurfaceSnapshot;\n readonly interaction: BrowserInteractionEntity;\n readonly actuator: BrowserInteractionActuator;\n }[],\n code:\n | \"duplicate-enabled-effect-actuator\"\n | \"duplicate-accepted-effect-pattern-match\",\n message: string,\n): BrowserInteractionEffectResolution {\n return {\n ok: false,\n code: \"ambiguous\",\n diagnostics: matches.map((match) =>\n diagnosticFor({\n code,\n message,\n surface: match.surface.surface,\n scopeId: match.surface.scopeId,\n interactionKey: match.interaction.interactionKey,\n intent: match.actuator.intent,\n actuatorId: match.actuator.actuatorId,\n }),\n ),\n };\n}\n\nfunction effectUnavailable(\n request: BrowserInteractionEffectRequest,\n code: \"disabled-effect-actuator\",\n message: string,\n): BrowserInteractionEffectResolution {\n return {\n ok: false,\n code: \"unavailable\",\n diagnostics: [\n diagnosticFor({\n code,\n message,\n surface: request.surface,\n scopeId: request.scopeId,\n interactionKey: request.interactionKey,\n }),\n ],\n };\n}\n\nfunction findEffectPreparationChain(\n surfaces: readonly BrowserInteractionSemanticSurfaceSnapshot[],\n request: BrowserInteractionEffectRequest,\n):\n | {\n readonly ok: true;\n readonly preparation: readonly BrowserInteractionActuator[];\n }\n | {\n readonly ok: false;\n readonly diagnostics: readonly BrowserInteractionDiagnostic[];\n } {\n const matches = collectInteractionMatches(surfaces, request).filter((match) =>\n match.actuator.preparationPatterns.some((pattern) =>\n browserInteractionEffectPatternMatches(pattern, request.effect),\n ),\n );\n const enabledMatches = matches.filter((match) => match.actuator.enabled);\n if (enabledMatches.length === 1) {\n const match = enabledMatches[0];\n if (!match) return { ok: false, diagnostics: [] };\n return { ok: true, preparation: [match.actuator] };\n }\n if (enabledMatches.length > 1) {\n return {\n ok: false,\n diagnostics: enabledMatches.map((match) =>\n diagnosticFor({\n code: \"ambiguous-preparation-pattern\",\n message:\n \"Browser interaction effect resolved to multiple preparation actuators.\",\n surface: match.surface.surface,\n scopeId: match.surface.scopeId,\n interactionKey: match.interaction.interactionKey,\n intent: match.actuator.intent,\n actuatorId: match.actuator.actuatorId,\n }),\n ),\n };\n }\n return { ok: false, diagnostics: [] };\n}\n\nfunction validateEffectRequest(\n effect: BrowserInteractionSurfaceEffect,\n request: Pick<\n BrowserInteractionEffectRequest,\n \"surface\" | \"scopeId\" | \"interactionKey\"\n >,\n): readonly BrowserInteractionDiagnostic[] {\n if (!effect || typeof effect.kind !== \"string\" || effect.kind.length === 0) {\n return [\n diagnosticFor({\n code: \"invalid-effect-payload\",\n message: \"Browser interaction effect requires a string kind.\",\n surface: request.surface,\n scopeId: request.scopeId,\n interactionKey: request.interactionKey,\n }),\n ];\n }\n if (effect.kind === \"setScalar\") {\n const value = effect.value;\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return [\n diagnosticFor({\n code: \"invalid-scalar-argument\",\n message:\n \"setScalar browser interaction effects require a finite value.\",\n surface: request.surface,\n scopeId: request.scopeId,\n interactionKey: request.interactionKey,\n }),\n ];\n }\n }\n return [];\n}\n\nfunction diagnosticFor(\n input: Omit<BrowserInteractionDiagnostic, \"severity\">,\n): BrowserInteractionDiagnostic {\n return { severity: \"error\", ...input };\n}\n","import { z } from \"zod\";\nimport {\n BROWSER_INTERACTION_ACTUATOR_KINDS,\n BROWSER_INTERACTION_CANDIDATE_STATES,\n BROWSER_INTERACTION_READINESS_VALUES,\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_NAME,\n DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION,\n GAMEPLAY_BROWSER_INTERACTION_SURFACE,\n} from \"./constants.js\";\n\nconst jsonValueSchema: z.ZodType<unknown> = z.lazy(() =>\n z.union([\n z.null(),\n z.boolean(),\n z.number().finite(),\n z.string(),\n z.array(jsonValueSchema),\n z.record(z.string(), jsonValueSchema),\n ]),\n);\n\nexport const browserInteractionEffectSchema = z\n .object({\n kind: z.string().min(1),\n })\n .catchall(jsonValueSchema);\n\nexport const browserInteractionEffectPatternSchema = z.union([\n z.object({\n kind: z.literal(\"exact\"),\n effect: browserInteractionEffectSchema,\n }),\n z.object({\n kind: z.literal(\"match\"),\n effectKind: z.string().min(1),\n fields: z.record(z.string(), jsonValueSchema).optional(),\n scalar: z\n .object({\n field: z.string().min(1),\n min: z.number().finite().optional(),\n max: z.number().finite().optional(),\n integer: z.boolean().optional(),\n })\n .optional(),\n }),\n]);\n\nexport const gameplaySemanticEffectSchema = z.union([\n z.object({\n kind: z.literal(\"setCandidate\"),\n inputKey: z.string(),\n candidateValue: jsonValueSchema,\n beforeSelected: z.boolean(),\n afterSelected: z.boolean(),\n }),\n z.object({\n kind: z.literal(\"adjustResource\"),\n inputKey: z.string(),\n resourceKey: jsonValueSchema,\n delta: z.union([z.literal(-1), z.literal(1)]),\n }),\n z.object({\n kind: z.literal(\"setScalar\"),\n inputKey: z.string(),\n value: z.number().finite(),\n }),\n z.object({\n kind: z.literal(\"commit\"),\n }),\n z.object({\n kind: z.literal(\"invoke\"),\n }),\n]);\n\nexport const browserInteractionDiagnosticSchema = z.object({\n code: z.string(),\n severity: z.enum([\"error\", \"warning\"]),\n message: z.string(),\n surface: z.string().optional(),\n scopeId: z.string().optional(),\n interactionKey: z.string().optional(),\n intent: z.string().optional(),\n actuatorId: z.string().optional(),\n});\n\nexport const browserInteractionActuatorSchema = z.object({\n actuatorId: z.string(),\n intent: z.string(),\n inputKey: z.string().optional(),\n candidateValue: jsonValueSchema.optional(),\n candidateValueKey: z.string().optional(),\n candidateState: z.enum(BROWSER_INTERACTION_CANDIDATE_STATES).optional(),\n enabled: z.boolean(),\n actuatorKind: z.enum(BROWSER_INTERACTION_ACTUATOR_KINDS),\n semanticEffects: z.array(browserInteractionEffectSchema),\n acceptedEffectPatterns: z.array(browserInteractionEffectPatternSchema),\n preparationPatterns: z.array(browserInteractionEffectPatternSchema),\n prepares: z\n .object({\n intent: z.string(),\n inputKey: z.string().optional(),\n candidateValue: jsonValueSchema.optional(),\n candidateValueKey: z.string().optional(),\n actuatorKind: z.enum(BROWSER_INTERACTION_ACTUATOR_KINDS).optional(),\n })\n .optional(),\n diagnostics: z.array(browserInteractionDiagnosticSchema),\n});\n\nexport const browserGameplayInteractionSchema = z.object({\n interactionKey: z.string(),\n interactionId: z.string(),\n descriptorDigest: z.string().optional(),\n draftDigest: z.string().optional(),\n readiness: z.enum(BROWSER_INTERACTION_READINESS_VALUES),\n actuators: z.array(browserInteractionActuatorSchema),\n diagnostics: z.array(browserInteractionDiagnosticSchema),\n});\n\nexport const browserGameplaySurfaceSnapshotSchema = z.object({\n surface: z.literal(GAMEPLAY_BROWSER_INTERACTION_SURFACE),\n scopeId: z.string(),\n interactions: z.array(browserGameplayInteractionSchema),\n diagnostics: z.array(browserInteractionDiagnosticSchema),\n});\n\nexport const browserSemanticSurfaceSnapshotSchema = z.object({\n surface: z.string(),\n scopeId: z.string(),\n interactions: z.array(browserGameplayInteractionSchema),\n diagnostics: z.array(browserInteractionDiagnosticSchema),\n});\n\nexport const browserUnknownSurfaceSnapshotSchema = z.object({\n surface: z.string(),\n scopeId: z.string(),\n diagnostics: z.array(browserInteractionDiagnosticSchema),\n});\n\nexport const browserInteractionSnapshotSchema = z.object({\n protocol: z.object({\n name: z.literal(DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_NAME),\n version: z.literal(DREAMBOARD_BROWSER_INTERACTION_PROTOCOL_VERSION),\n }),\n surfaces: z.array(\n z.union([\n browserSemanticSurfaceSnapshotSchema,\n browserUnknownSurfaceSnapshotSchema,\n ]),\n ),\n diagnostics: z.array(browserInteractionDiagnosticSchema),\n});\n"],"mappings":"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","names":["pending","diagnosticFor"]}
@@ -10626,6 +10626,7 @@ function HexGridImpl(props) {
10626
10626
  return /* @__PURE__ */ jsxs25(
10627
10627
  "g",
10628
10628
  {
10629
+ ...state.browserAttributes,
10629
10630
  transform: `translate(${pos.x}, ${pos.y})`,
10630
10631
  role: isSelectable ? "button" : void 0,
10631
10632
  className: clsx20(isSelectable && "cursor-pointer"),
@@ -10692,6 +10693,7 @@ function HexGridImpl(props) {
10692
10693
  return /* @__PURE__ */ jsxs25(
10693
10694
  "g",
10694
10695
  {
10696
+ ...state.browserAttributes,
10695
10697
  role: isSelectable ? "button" : void 0,
10696
10698
  className: clsx20(isSelectable && "cursor-pointer"),
10697
10699
  onPointerEnter: () => setHoveredEdgeId(edge.id),
@@ -10757,6 +10759,7 @@ function HexGridImpl(props) {
10757
10759
  return /* @__PURE__ */ jsxs25(
10758
10760
  "g",
10759
10761
  {
10762
+ ...state.browserAttributes,
10760
10763
  role: isSelectable ? "button" : void 0,
10761
10764
  className: clsx20(isSelectable && "cursor-pointer"),
10762
10765
  onPointerEnter: () => setHoveredVertexId(vertex.id),
@@ -10987,4 +10990,4 @@ export {
10987
10990
  HexGrid,
10988
10991
  createHexBoardView
10989
10992
  };
10990
- //# sourceMappingURL=chunk-WYPQ3GG5.js.map
10993
+ //# sourceMappingURL=chunk-WG4JQL3S.js.map