@qontinui/ui-bridge 0.2.0 → 0.3.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.
- package/dist/ai/index.d.mts +312 -155
- package/dist/ai/index.d.ts +312 -155
- package/dist/ai/index.js +2363 -67
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +2328 -68
- package/dist/ai/index.mjs.map +1 -1
- package/dist/annotations/index.d.mts +218 -0
- package/dist/annotations/index.d.ts +218 -0
- package/dist/annotations/index.js +246 -0
- package/dist/annotations/index.js.map +1 -0
- package/dist/annotations/index.mjs +241 -0
- package/dist/annotations/index.mjs.map +1 -0
- package/dist/assertions-BSR3afVr.d.ts +161 -0
- package/dist/assertions-CTw1hfOx.d.mts +161 -0
- package/dist/babel-plugin/index.js +504 -0
- package/dist/babel-plugin/index.js.map +1 -0
- package/dist/babel-plugin/index.mjs +488 -0
- package/dist/babel-plugin/index.mjs.map +1 -0
- package/dist/browser-capture-Bms60T6f.d.mts +47 -0
- package/dist/browser-capture-CsTU29mb.d.ts +47 -0
- package/dist/control/index.d.mts +26 -7
- package/dist/control/index.d.ts +26 -7
- package/dist/control/index.js +276 -48
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +276 -48
- package/dist/control/index.mjs.map +1 -1
- package/dist/core/index.d.mts +115 -44
- package/dist/core/index.d.ts +115 -44
- package/dist/core/index.js +0 -1560
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +1 -1549
- package/dist/core/index.mjs.map +1 -1
- package/dist/debug/index.d.mts +5 -3
- package/dist/debug/index.d.ts +5 -3
- package/dist/debug/index.js +925 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs +924 -2
- package/dist/debug/index.mjs.map +1 -1
- package/dist/index.d.mts +13 -9
- package/dist/index.d.ts +13 -9
- package/dist/index.js +8310 -3777
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8246 -3766
- package/dist/index.mjs.map +1 -1
- package/dist/{metrics-NC3csD0R.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
- package/dist/{metrics-C9XRi_mL.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
- package/dist/native/control/index.js +448 -0
- package/dist/native/control/index.js.map +1 -0
- package/dist/native/control/index.mjs +445 -0
- package/dist/native/control/index.mjs.map +1 -0
- package/dist/native/core/index.js +486 -0
- package/dist/native/core/index.js.map +1 -0
- package/dist/native/core/index.mjs +475 -0
- package/dist/native/core/index.mjs.map +1 -0
- package/dist/native/debug/index.js +408 -0
- package/dist/native/debug/index.js.map +1 -0
- package/dist/native/debug/index.mjs +406 -0
- package/dist/native/debug/index.mjs.map +1 -0
- package/dist/native/index.js +2232 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/index.mjs +2204 -0
- package/dist/native/index.mjs.map +1 -0
- package/dist/native/react/index.js +1377 -0
- package/dist/native/react/index.js.map +1 -0
- package/dist/native/react/index.mjs +1365 -0
- package/dist/native/react/index.mjs.map +1 -0
- package/dist/native/server/index.js +440 -0
- package/dist/native/server/index.js.map +1 -0
- package/dist/native/server/index.mjs +435 -0
- package/dist/native/server/index.mjs.map +1 -0
- package/dist/react/index.d.mts +121 -9
- package/dist/react/index.d.ts +121 -9
- package/dist/react/index.js +2239 -91
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +2239 -92
- package/dist/react/index.mjs.map +1 -1
- package/dist/{registry-CIEDjbQ9.d.ts → registry-C6dDtn1v.d.ts} +34 -15
- package/dist/{registry-SsSDq46X.d.mts → registry-POtcxnal.d.mts} +34 -15
- package/dist/render-log/index.d.mts +1 -1
- package/dist/render-log/index.d.ts +1 -1
- package/dist/server/express.d.mts +37 -0
- package/dist/server/express.d.ts +37 -0
- package/dist/server/express.js +298 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/express.mjs +294 -0
- package/dist/server/express.mjs.map +1 -0
- package/dist/server/handlers.d.mts +124 -0
- package/dist/server/handlers.d.ts +124 -0
- package/dist/server/handlers.js +7183 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/handlers.mjs +7180 -0
- package/dist/server/handlers.mjs.map +1 -0
- package/dist/server/index.d.mts +12 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.js +8384 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +8369 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/nextjs.d.mts +128 -0
- package/dist/server/nextjs.d.ts +128 -0
- package/dist/server/nextjs.js +390 -0
- package/dist/server/nextjs.js.map +1 -0
- package/dist/server/nextjs.mjs +385 -0
- package/dist/server/nextjs.mjs.map +1 -0
- package/dist/server/standalone.d.mts +7 -0
- package/dist/server/standalone.d.ts +7 -0
- package/dist/server/standalone.js +845 -0
- package/dist/server/standalone.js.map +1 -0
- package/dist/server/standalone.mjs +841 -0
- package/dist/server/standalone.mjs.map +1 -0
- package/dist/specs/index.d.mts +365 -0
- package/dist/specs/index.d.ts +365 -0
- package/dist/specs/index.js +2809 -0
- package/dist/specs/index.js.map +1 -0
- package/dist/specs/index.mjs +2786 -0
- package/dist/specs/index.mjs.map +1 -0
- package/dist/standalone-B6GLIEmR.d.ts +216 -0
- package/dist/standalone-CjdYqj3P.d.mts +216 -0
- package/dist/swc-plugin/index.d.mts +79 -0
- package/dist/swc-plugin/index.d.ts +79 -0
- package/dist/swc-plugin/index.js +15 -0
- package/dist/swc-plugin/index.js.map +1 -0
- package/dist/swc-plugin/index.mjs +9 -0
- package/dist/swc-plugin/index.mjs.map +1 -0
- package/dist/types-B2EfvEaq.d.ts +236 -0
- package/dist/{types-Dr6tH-bm.d.mts → types-C7gVYRnF.d.ts} +72 -2
- package/dist/{types-oCTrRxSw.d.ts → types-CJGrBEhC.d.mts} +72 -2
- package/dist/types-CebMQj76.d.ts +1275 -0
- package/dist/types-D_ypYl3T.d.mts +1275 -0
- package/dist/types-UBtp7R0u.d.mts +132 -0
- package/dist/types-UBtp7R0u.d.ts +132 -0
- package/dist/types-gO696T_t.d.mts +236 -0
- package/dist/{types-CPMbN_Iw.d.mts → types-suaYwWWg.d.mts} +519 -152
- package/dist/{types-CPMbN_Iw.d.ts → types-suaYwWWg.d.ts} +519 -152
- package/package.json +123 -4
- package/swc-plugin-wasm/ui_bridge_swc_plugin.wasm +0 -0
- package/dist/types-BvCfFuEV.d.ts +0 -534
- package/dist/types-CFT3Dnx4.d.mts +0 -534
- package/dist/websocket-client-CX4QJesI.d.ts +0 -124
- package/dist/websocket-client-C_Na0OSp.d.mts +0 -124
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/specs/types.ts","../../src/specs/validator.ts","../../src/specs/migration.ts","../../src/specs/store.ts","../../src/ai/fuzzy-matcher.ts","../../src/ai/alias-generator.ts","../../src/annotations/types.ts","../../src/annotations/store.ts","../../src/ai/search-engine.ts","../../src/ai/assertions.ts","../../src/specs/executor.ts"],"names":["aliases","globalStore","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Spec Types\n *\n * Type definitions for the UI Bridge specification system.\n * Specs define declarative assertions about UI elements that can be\n * authored, stored, executed, and used for regression testing.\n */\n\nimport type { AssertionType, AssertionResult, SearchCriteria } from '../ai/types';\n\n// =============================================================================\n// Categories & Severity\n// =============================================================================\n\nexport type SpecCategory =\n | 'element-presence'\n | 'accessibility'\n | 'form-validation'\n | 'state-consistency'\n | 'modal-dialog'\n | 'navigation'\n | 'cross-page-consistency'\n | 'custom';\n\nexport type SpecSeverity = 'critical' | 'warning' | 'info';\n\nexport type SpecSource = 'auto' | 'manual' | 'ai-generated';\n\n// =============================================================================\n// Targets\n// =============================================================================\n\n/**\n * Unified target for spec assertions.\n * Bridges to AssertionRequest.target (string | SearchCriteria).\n */\nexport type SpecTarget =\n | { type: 'elementId'; elementId: string; label?: string }\n | { type: 'search'; criteria: SearchCriteria; label?: string };\n\n// =============================================================================\n// Conditions (for conditional assertions)\n// =============================================================================\n\n/**\n * A condition that must be met for an assertion to be evaluated.\n * If the condition is not met, the assertion is skipped (passes with no opinion).\n *\n * Use case: \"Button is disabled WHEN runner is not connected\"\n * - The assertion only has an opinion when the runner is NOT connected\n * - When connected, the assertion should skip (not fail)\n */\nexport type AssertionCondition =\n | {\n /** Check if a target element exists */\n type: 'exists';\n target: SpecTarget;\n }\n | {\n /** Check if a target element does NOT exist */\n type: 'notExists';\n target: SpecTarget;\n }\n | {\n /** Check if a target element has specific text content */\n type: 'hasText';\n target: SpecTarget;\n text: string;\n };\n\n// =============================================================================\n// Assertions\n// =============================================================================\n\n/**\n * A single spec assertion — wraps an AssertionRequest with metadata.\n */\nexport interface SpecAssertion {\n id: string;\n description: string;\n category: SpecCategory;\n severity: SpecSeverity;\n target: SpecTarget;\n /** Strongly typed assertion type from ui-bridge/ai */\n assertionType: AssertionType;\n expected?: unknown;\n attributeName?: string;\n propertyName?: string;\n message?: string;\n timeout?: number;\n source: SpecSource;\n reviewed: boolean;\n enabled: boolean;\n notes?: string;\n /**\n * Optional condition that must be met for this assertion to be evaluated.\n * If condition is not met, the assertion is skipped (passes with no opinion).\n *\n * Example: \"A is false when B is false\" → condition checks if B is false,\n * and only then evaluates whether A is false. If B is true, skip.\n */\n condition?: AssertionCondition;\n}\n\n// =============================================================================\n// Groups\n// =============================================================================\n\n/**\n * A named collection of related spec assertions.\n */\nexport interface SpecGroup {\n id: string;\n name: string;\n description: string;\n category: SpecCategory;\n assertions: SpecAssertion[];\n stateId?: string;\n transitionId?: string;\n source: SpecSource;\n tags?: string[];\n}\n\n// =============================================================================\n// Config (the .spec.uibridge.json file format)\n// =============================================================================\n\nexport interface SpecMetadata {\n component?: string;\n author?: string;\n createdAt?: string;\n updatedAt?: string;\n pageUrl?: string;\n tags?: string[];\n /** Explicit element source: \"control\" for runner UI, \"external\" for browser tab */\n elementSource?: 'control' | 'external';\n [key: string]: unknown;\n}\n\n/**\n * Top-level spec config — the JSON file format.\n */\nexport interface SpecConfig {\n version: '1.0.0';\n description?: string;\n groups: SpecGroup[];\n /** Ungrouped assertions (convenience for simple specs) */\n assertions?: SpecAssertion[];\n metadata?: SpecMetadata;\n}\n\n// =============================================================================\n// Execution Results\n// =============================================================================\n\nexport interface SpecAssertionResult {\n assertionId: string;\n groupId?: string;\n severity: SpecSeverity;\n category: SpecCategory;\n skipped: boolean;\n /** Reason for skipping (if skipped) */\n skipReason?: 'disabled' | 'condition_not_met' | 'filtered';\n /** The underlying assertion result (null if skipped) */\n result: AssertionResult | null;\n}\n\nexport interface SpecGroupResult {\n groupId: string;\n groupName: string;\n assertionResults: SpecAssertionResult[];\n passedCount: number;\n failedCount: number;\n skippedCount: number;\n passed: boolean;\n durationMs: number;\n timestamp: number;\n}\n\nexport interface SpecExecutionResult {\n specVersion: string;\n groupResults: SpecGroupResult[];\n ungroupedResults: SpecAssertionResult[];\n totalAssertions: number;\n passedCount: number;\n failedCount: number;\n skippedCount: number;\n passed: boolean;\n durationMs: number;\n timestamp: number;\n}\n\nexport interface SpecExecutionOptions {\n categories?: SpecCategory[];\n severities?: SpecSeverity[];\n groupIds?: string[];\n assertionIds?: string[];\n stopOnFailure?: boolean;\n skipUnreviewed?: boolean;\n timeout?: number;\n}\n\n// =============================================================================\n// Coverage\n// =============================================================================\n\nexport interface SpecCoverage {\n totalElements: number;\n specifiedElements: number;\n coveragePercent: number;\n specifiedIds: string[];\n unspecifiedIds: string[];\n timestamp: number;\n}\n\n// =============================================================================\n// Events\n// =============================================================================\n\nexport type SpecEventType =\n | 'spec:loaded'\n | 'spec:unloaded'\n | 'spec:updated'\n | 'spec:cleared'\n | 'spec:assertion-added'\n | 'spec:assertion-removed'\n | 'spec:group-added'\n | 'spec:group-removed';\n\nexport interface SpecEvent {\n type: SpecEventType;\n specId?: string;\n groupId?: string;\n assertionId?: string;\n timestamp: number;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport const SPEC_CONFIG_VERSION = '1.0.0';\n\nexport const SPEC_FILE_EXTENSION = '.spec.uibridge.json';\n\nexport const VALID_ASSERTION_TYPES: readonly AssertionType[] = [\n 'visible',\n 'hidden',\n 'enabled',\n 'disabled',\n 'focused',\n 'checked',\n 'unchecked',\n 'hasText',\n 'containsText',\n 'hasValue',\n 'hasClass',\n 'exists',\n 'notExists',\n 'count',\n 'attribute',\n 'cssProperty',\n] as const;\n\nexport const VALID_SPEC_CATEGORIES: readonly SpecCategory[] = [\n 'element-presence',\n 'accessibility',\n 'form-validation',\n 'state-consistency',\n 'modal-dialog',\n 'navigation',\n 'cross-page-consistency',\n 'custom',\n] as const;\n\nexport const VALID_SPEC_SEVERITIES: readonly SpecSeverity[] = [\n 'critical',\n 'warning',\n 'info',\n] as const;\n\nexport const VALID_SPEC_SOURCES: readonly SpecSource[] = [\n 'auto',\n 'manual',\n 'ai-generated',\n] as const;\n","/**\n * Spec Validator\n *\n * Structural validation for .spec.uibridge.json files.\n * No JSON Schema dependency — validates manually.\n */\n\nimport type { AssertionType } from '../ai/types';\nimport {\n SPEC_CONFIG_VERSION,\n VALID_ASSERTION_TYPES,\n VALID_SPEC_CATEGORIES,\n VALID_SPEC_SEVERITIES,\n VALID_SPEC_SOURCES,\n} from './types';\nimport type { SpecCategory, SpecSeverity, SpecSource } from './types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isValidAssertionType(value: unknown): value is AssertionType {\n return typeof value === 'string' && (VALID_ASSERTION_TYPES as readonly string[]).includes(value);\n}\n\nexport function isValidSpecCategory(value: unknown): value is SpecCategory {\n return typeof value === 'string' && (VALID_SPEC_CATEGORIES as readonly string[]).includes(value);\n}\n\nexport function isValidSpecSeverity(value: unknown): value is SpecSeverity {\n return typeof value === 'string' && (VALID_SPEC_SEVERITIES as readonly string[]).includes(value);\n}\n\nexport function isValidSpecSource(value: unknown): value is SpecSource {\n return typeof value === 'string' && (VALID_SPEC_SOURCES as readonly string[]).includes(value);\n}\n\n// =============================================================================\n// Assertion Validation\n// =============================================================================\n\nexport function validateSpecAssertion(data: unknown, path = 'assertion'): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (!data || typeof data !== 'object') {\n errors.push({ path, message: 'must be an object' });\n return errors;\n }\n\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.id !== 'string' || obj.id.length === 0) {\n errors.push({ path: `${path}.id`, message: 'must be a non-empty string' });\n }\n\n if (typeof obj.description !== 'string') {\n errors.push({ path: `${path}.description`, message: 'must be a string' });\n }\n\n if (!isValidSpecCategory(obj.category)) {\n errors.push({\n path: `${path}.category`,\n message: `must be one of: ${VALID_SPEC_CATEGORIES.join(', ')}`,\n });\n }\n\n if (!isValidSpecSeverity(obj.severity)) {\n errors.push({\n path: `${path}.severity`,\n message: `must be one of: ${VALID_SPEC_SEVERITIES.join(', ')}`,\n });\n }\n\n // Target validation\n if (!obj.target || typeof obj.target !== 'object') {\n errors.push({ path: `${path}.target`, message: 'must be an object' });\n } else {\n const target = obj.target as Record<string, unknown>;\n if (target.type === 'elementId') {\n if (typeof target.elementId !== 'string' || target.elementId.length === 0) {\n errors.push({ path: `${path}.target.elementId`, message: 'must be a non-empty string' });\n }\n } else if (target.type === 'search') {\n if (!target.criteria || typeof target.criteria !== 'object') {\n errors.push({ path: `${path}.target.criteria`, message: 'must be an object' });\n }\n } else {\n errors.push({ path: `${path}.target.type`, message: 'must be \"elementId\" or \"search\"' });\n }\n }\n\n if (!isValidAssertionType(obj.assertionType)) {\n errors.push({\n path: `${path}.assertionType`,\n message: `must be one of: ${VALID_ASSERTION_TYPES.join(', ')}`,\n });\n }\n\n if (!isValidSpecSource(obj.source)) {\n errors.push({\n path: `${path}.source`,\n message: `must be one of: ${VALID_SPEC_SOURCES.join(', ')}`,\n });\n }\n\n if (typeof obj.reviewed !== 'boolean') {\n errors.push({ path: `${path}.reviewed`, message: 'must be a boolean' });\n }\n\n if (typeof obj.enabled !== 'boolean') {\n errors.push({ path: `${path}.enabled`, message: 'must be a boolean' });\n }\n\n if (obj.timeout !== undefined && (typeof obj.timeout !== 'number' || obj.timeout < 0)) {\n errors.push({ path: `${path}.timeout`, message: 'must be a non-negative number' });\n }\n\n return errors;\n}\n\n// =============================================================================\n// Group Validation\n// =============================================================================\n\nexport function validateSpecGroup(data: unknown, path = 'group'): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (!data || typeof data !== 'object') {\n errors.push({ path, message: 'must be an object' });\n return errors;\n }\n\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.id !== 'string' || obj.id.length === 0) {\n errors.push({ path: `${path}.id`, message: 'must be a non-empty string' });\n }\n\n if (typeof obj.name !== 'string') {\n errors.push({ path: `${path}.name`, message: 'must be a string' });\n }\n\n if (typeof obj.description !== 'string') {\n errors.push({ path: `${path}.description`, message: 'must be a string' });\n }\n\n if (!isValidSpecCategory(obj.category)) {\n errors.push({\n path: `${path}.category`,\n message: `must be one of: ${VALID_SPEC_CATEGORIES.join(', ')}`,\n });\n }\n\n if (!isValidSpecSource(obj.source)) {\n errors.push({\n path: `${path}.source`,\n message: `must be one of: ${VALID_SPEC_SOURCES.join(', ')}`,\n });\n }\n\n if (!Array.isArray(obj.assertions)) {\n errors.push({ path: `${path}.assertions`, message: 'must be an array' });\n } else {\n for (let i = 0; i < obj.assertions.length; i++) {\n errors.push(...validateSpecAssertion(obj.assertions[i], `${path}.assertions[${i}]`));\n }\n }\n\n return errors;\n}\n\n// =============================================================================\n// Config Validation\n// =============================================================================\n\nexport function validateSpecConfig(data: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n\n if (!data || typeof data !== 'object') {\n return { valid: false, errors: [{ path: '', message: 'must be an object' }] };\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.version !== SPEC_CONFIG_VERSION) {\n errors.push({ path: 'version', message: `must be \"${SPEC_CONFIG_VERSION}\"` });\n }\n\n if (obj.description !== undefined && typeof obj.description !== 'string') {\n errors.push({ path: 'description', message: 'must be a string if provided' });\n }\n\n if (!Array.isArray(obj.groups)) {\n errors.push({ path: 'groups', message: 'must be an array' });\n } else {\n for (let i = 0; i < obj.groups.length; i++) {\n errors.push(...validateSpecGroup(obj.groups[i], `groups[${i}]`));\n }\n }\n\n if (obj.assertions !== undefined) {\n if (!Array.isArray(obj.assertions)) {\n errors.push({ path: 'assertions', message: 'must be an array if provided' });\n } else {\n for (let i = 0; i < obj.assertions.length; i++) {\n errors.push(...validateSpecAssertion(obj.assertions[i], `assertions[${i}]`));\n }\n }\n }\n\n if (obj.metadata !== undefined && (typeof obj.metadata !== 'object' || obj.metadata === null)) {\n errors.push({ path: 'metadata', message: 'must be an object if provided' });\n }\n\n return { valid: errors.length === 0, errors };\n}\n","/**\n * Spec Migration\n *\n * Converts legacy TestGeneratorOutput format (from qontinui-schemas)\n * to the new SpecConfig format.\n */\n\nimport type { AssertionType } from '../ai/types';\nimport { VALID_ASSERTION_TYPES } from './types';\nimport type {\n SpecConfig,\n SpecGroup,\n SpecAssertion,\n SpecTarget,\n SpecCategory,\n SpecSeverity,\n SpecSource,\n} from './types';\n\n// =============================================================================\n// Legacy Types (inline — no dependency on qontinui-schemas)\n// =============================================================================\n\nexport interface LegacyTestTarget {\n type: 'elementId' | 'formId' | 'modalId';\n elementId?: string;\n formId?: string;\n modalId?: string;\n label?: string;\n}\n\nexport interface LegacyTestAssertion {\n id: string;\n description: string;\n category: string;\n severity: string;\n target: LegacyTestTarget;\n assertionType: string;\n expected?: unknown;\n attributeName?: string;\n source: string;\n reviewed: boolean;\n enabled: boolean;\n notes?: string;\n}\n\nexport interface LegacyTestSpecification {\n id: string;\n name: string;\n description: string;\n category: string;\n assertions: LegacyTestAssertion[];\n stateId: string;\n transitionId?: string;\n source: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface LegacyTestGeneratorOutput {\n version: string;\n projectId?: string;\n generatorType?: string;\n states?: unknown[];\n transitions?: unknown[];\n testSpecifications: LegacyTestSpecification[];\n snapshotMetadata?: Record<string, unknown>;\n explorationMetadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n}\n\n// =============================================================================\n// Coercion Helpers\n// =============================================================================\n\n/**\n * Coerce a raw string to a valid AssertionType, or return null.\n */\nexport function coerceAssertionType(raw: string): AssertionType | null {\n if ((VALID_ASSERTION_TYPES as readonly string[]).includes(raw)) {\n return raw as AssertionType;\n }\n return null;\n}\n\nfunction coerceCategory(raw: string): SpecCategory {\n const valid: SpecCategory[] = [\n 'element-presence',\n 'accessibility',\n 'form-validation',\n 'state-consistency',\n 'modal-dialog',\n 'navigation',\n 'cross-page-consistency',\n 'custom',\n ];\n return valid.includes(raw as SpecCategory) ? (raw as SpecCategory) : 'custom';\n}\n\nfunction coerceSeverity(raw: string): SpecSeverity {\n const valid: SpecSeverity[] = ['critical', 'warning', 'info'];\n return valid.includes(raw as SpecSeverity) ? (raw as SpecSeverity) : 'info';\n}\n\nfunction coerceSource(raw: string): SpecSource {\n if (raw === 'auto' || raw === 'manual' || raw === 'ai-generated') return raw;\n return 'auto';\n}\n\n// =============================================================================\n// Target Migration\n// =============================================================================\n\n/**\n * Convert a legacy TestTarget to a SpecTarget.\n */\nexport function migrateLegacyTarget(legacy: LegacyTestTarget): SpecTarget {\n switch (legacy.type) {\n case 'elementId':\n return {\n type: 'elementId',\n elementId: legacy.elementId || '',\n label: legacy.label,\n };\n case 'formId':\n return {\n type: 'search',\n criteria: {\n idPattern: legacy.formId || '',\n role: 'form',\n },\n label: legacy.label,\n };\n case 'modalId':\n return {\n type: 'search',\n criteria: {\n idPattern: legacy.modalId || '',\n role: 'dialog',\n },\n label: legacy.label,\n };\n default:\n return {\n type: 'elementId',\n elementId: '',\n label: legacy.label,\n };\n }\n}\n\n// =============================================================================\n// Assertion Migration\n// =============================================================================\n\n/**\n * Convert a legacy TestAssertion to a SpecAssertion.\n */\nexport function migrateLegacyAssertion(legacy: LegacyTestAssertion): SpecAssertion {\n const assertionType = coerceAssertionType(legacy.assertionType);\n\n return {\n id: legacy.id,\n description: legacy.description,\n category: coerceCategory(legacy.category),\n severity: coerceSeverity(legacy.severity),\n target: migrateLegacyTarget(legacy.target),\n assertionType: assertionType ?? 'exists',\n expected: legacy.expected,\n attributeName: legacy.attributeName,\n source: coerceSource(legacy.source),\n reviewed: legacy.reviewed,\n enabled: legacy.enabled,\n notes: legacy.notes,\n };\n}\n\n// =============================================================================\n// Full Migration\n// =============================================================================\n\n/**\n * Convert a legacy TestGeneratorOutput to a SpecConfig.\n */\nexport function migrateFromTestGeneratorOutput(legacy: LegacyTestGeneratorOutput): SpecConfig {\n const groups: SpecGroup[] = legacy.testSpecifications.map((spec) => ({\n id: spec.id,\n name: spec.name,\n description: spec.description,\n category: coerceCategory(spec.category),\n assertions: spec.assertions.map(migrateLegacyAssertion),\n stateId: spec.stateId,\n transitionId: spec.transitionId,\n source: coerceSource(spec.source),\n }));\n\n return {\n version: '1.0.0',\n description: legacy.generatorType\n ? `Migrated from ${legacy.generatorType} test generator output`\n : 'Migrated from legacy test generator output',\n groups,\n metadata: {\n createdAt: legacy.createdAt,\n updatedAt: legacy.updatedAt,\n ...(legacy.snapshotMetadata?.pageUrl\n ? { pageUrl: legacy.snapshotMetadata.pageUrl as string }\n : {}),\n ...(legacy.explorationMetadata?.targetUrl\n ? { pageUrl: legacy.explorationMetadata.targetUrl as string }\n : {}),\n },\n };\n}\n","/**\n * Spec Store\n *\n * In-memory store for spec configs with CRUD operations,\n * import/export, coverage tracking, and event emission.\n * Follows the AnnotationStore pattern.\n */\n\nimport type {\n SpecConfig,\n SpecGroup,\n SpecAssertion,\n SpecEvent,\n SpecCoverage,\n SpecCategory,\n SpecSeverity,\n} from './types';\nimport { SPEC_CONFIG_VERSION } from './types';\nimport { validateSpecConfig } from './validator';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SpecListener = (event: SpecEvent) => void;\n\nexport interface SpecFilterOptions {\n categories?: SpecCategory[];\n severities?: SpecSeverity[];\n enabledOnly?: boolean;\n reviewedOnly?: boolean;\n}\n\n// =============================================================================\n// Store\n// =============================================================================\n\nexport class SpecStore {\n private configs = new Map<string, SpecConfig>();\n private listeners = new Set<SpecListener>();\n\n // ---------------------------------------------------------------------------\n // CRUD — Config Level\n // ---------------------------------------------------------------------------\n\n load(specId: string, config: SpecConfig): void {\n this.configs.set(specId, config);\n this.emit({ type: 'spec:loaded', specId, timestamp: Date.now() });\n }\n\n unload(specId: string): boolean {\n const existed = this.configs.delete(specId);\n if (existed) {\n this.emit({ type: 'spec:unloaded', specId, timestamp: Date.now() });\n }\n return existed;\n }\n\n get(specId: string): SpecConfig | undefined {\n return this.configs.get(specId);\n }\n\n has(specId: string): boolean {\n return this.configs.has(specId);\n }\n\n getIds(): string[] {\n return Array.from(this.configs.keys());\n }\n\n getAll(): Map<string, SpecConfig> {\n return new Map(this.configs);\n }\n\n get count(): number {\n return this.configs.size;\n }\n\n clear(): void {\n this.configs.clear();\n this.emit({ type: 'spec:cleared', timestamp: Date.now() });\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — Group Level\n // ---------------------------------------------------------------------------\n\n addGroup(specId: string, group: SpecGroup): boolean {\n const config = this.configs.get(specId);\n if (!config) return false;\n\n config.groups.push(group);\n this.emit({ type: 'spec:group-added', specId, groupId: group.id, timestamp: Date.now() });\n return true;\n }\n\n removeGroup(specId: string, groupId: string): boolean {\n const config = this.configs.get(specId);\n if (!config) return false;\n\n const idx = config.groups.findIndex((g) => g.id === groupId);\n if (idx === -1) return false;\n\n config.groups.splice(idx, 1);\n this.emit({ type: 'spec:group-removed', specId, groupId, timestamp: Date.now() });\n return true;\n }\n\n getGroup(specId: string, groupId: string): SpecGroup | undefined {\n const config = this.configs.get(specId);\n if (!config) return undefined;\n return config.groups.find((g) => g.id === groupId);\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — Assertion Level\n // ---------------------------------------------------------------------------\n\n addAssertion(specId: string, groupId: string | null, assertion: SpecAssertion): boolean {\n const config = this.configs.get(specId);\n if (!config) return false;\n\n if (groupId) {\n const group = config.groups.find((g) => g.id === groupId);\n if (!group) return false;\n group.assertions.push(assertion);\n } else {\n if (!config.assertions) config.assertions = [];\n config.assertions.push(assertion);\n }\n\n this.emit({\n type: 'spec:assertion-added',\n specId,\n groupId: groupId ?? undefined,\n assertionId: assertion.id,\n timestamp: Date.now(),\n });\n return true;\n }\n\n removeAssertion(specId: string, groupId: string | null, assertionId: string): boolean {\n const config = this.configs.get(specId);\n if (!config) return false;\n\n let removed = false;\n\n if (groupId) {\n const group = config.groups.find((g) => g.id === groupId);\n if (group) {\n const idx = group.assertions.findIndex((a) => a.id === assertionId);\n if (idx !== -1) {\n group.assertions.splice(idx, 1);\n removed = true;\n }\n }\n } else if (config.assertions) {\n const idx = config.assertions.findIndex((a) => a.id === assertionId);\n if (idx !== -1) {\n config.assertions.splice(idx, 1);\n removed = true;\n }\n }\n\n if (removed) {\n this.emit({\n type: 'spec:assertion-removed',\n specId,\n groupId: groupId ?? undefined,\n assertionId,\n timestamp: Date.now(),\n });\n }\n return removed;\n }\n\n toggleAssertion(specId: string, groupId: string | null, assertionId: string): boolean {\n const assertion = this.findAssertion(specId, groupId, assertionId);\n if (!assertion) return false;\n assertion.enabled = !assertion.enabled;\n this.emit({ type: 'spec:updated', specId, timestamp: Date.now() });\n return true;\n }\n\n markReviewed(specId: string, groupId: string | null, assertionId: string): boolean {\n const assertion = this.findAssertion(specId, groupId, assertionId);\n if (!assertion) return false;\n assertion.reviewed = !assertion.reviewed;\n this.emit({ type: 'spec:updated', specId, timestamp: Date.now() });\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // Queries\n // ---------------------------------------------------------------------------\n\n getAllAssertions(): SpecAssertion[] {\n const result: SpecAssertion[] = [];\n for (const config of this.configs.values()) {\n for (const group of config.groups) {\n result.push(...group.assertions);\n }\n if (config.assertions) {\n result.push(...config.assertions);\n }\n }\n return result;\n }\n\n filterAssertions(opts: SpecFilterOptions): SpecAssertion[] {\n return this.getAllAssertions().filter((a) => {\n if (opts.categories && !opts.categories.includes(a.category)) return false;\n if (opts.severities && !opts.severities.includes(a.severity)) return false;\n if (opts.enabledOnly && !a.enabled) return false;\n if (opts.reviewedOnly && !a.reviewed) return false;\n return true;\n });\n }\n\n // ---------------------------------------------------------------------------\n // Coverage\n // ---------------------------------------------------------------------------\n\n getCoverage(allElementIds: string[]): SpecCoverage {\n const specifiedIdSet = new Set<string>();\n for (const assertion of this.getAllAssertions()) {\n if (assertion.target.type === 'elementId') {\n specifiedIdSet.add(assertion.target.elementId);\n }\n }\n\n const specifiedIds: string[] = [];\n const unspecifiedIds: string[] = [];\n for (const id of allElementIds) {\n if (specifiedIdSet.has(id)) {\n specifiedIds.push(id);\n } else {\n unspecifiedIds.push(id);\n }\n }\n\n const total = allElementIds.length;\n return {\n totalElements: total,\n specifiedElements: specifiedIds.length,\n coveragePercent: total > 0 ? (specifiedIds.length / total) * 100 : 0,\n specifiedIds,\n unspecifiedIds,\n timestamp: Date.now(),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Import / Export\n // ---------------------------------------------------------------------------\n\n importConfig(specId: string, config: SpecConfig): boolean {\n const result = validateSpecConfig(config);\n if (!result.valid) return false;\n this.configs.set(specId, config);\n this.emit({ type: 'spec:loaded', specId, timestamp: Date.now() });\n return true;\n }\n\n exportConfig(specId: string): SpecConfig | undefined {\n const config = this.configs.get(specId);\n if (!config) return undefined;\n return {\n ...config,\n version: SPEC_CONFIG_VERSION,\n metadata: {\n ...config.metadata,\n updatedAt: new Date().toISOString(),\n },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Events\n // ---------------------------------------------------------------------------\n\n on(listener: SpecListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(event: SpecEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch {\n // Don't let listener errors break the store\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Helpers\n // ---------------------------------------------------------------------------\n\n private findAssertion(\n specId: string,\n groupId: string | null,\n assertionId: string\n ): SpecAssertion | undefined {\n const config = this.configs.get(specId);\n if (!config) return undefined;\n\n if (groupId) {\n const group = config.groups.find((g) => g.id === groupId);\n if (!group) return undefined;\n return group.assertions.find((a) => a.id === assertionId);\n }\n\n return config.assertions?.find((a) => a.id === assertionId);\n }\n}\n\n// =============================================================================\n// Global Singleton\n// =============================================================================\n\nlet globalStore: SpecStore | null = null;\n\nexport function getGlobalSpecStore(): SpecStore {\n if (!globalStore) {\n globalStore = new SpecStore();\n }\n return globalStore;\n}\n\nexport function resetGlobalSpecStore(): void {\n globalStore = null;\n}\n","/**\n * Fuzzy Matcher\n *\n * Provides fuzzy text matching utilities for finding elements by natural language descriptions.\n * Implements multiple matching algorithms with configurable thresholds.\n */\n\n/**\n * Configuration for fuzzy matching\n */\nexport interface FuzzyMatchConfig {\n /** Minimum similarity threshold (0-1) */\n threshold: number;\n /** Weight for Levenshtein distance */\n levenshteinWeight: number;\n /** Weight for Jaro-Winkler similarity */\n jaroWinklerWeight: number;\n /** Weight for N-gram matching */\n ngramWeight: number;\n /** N-gram size */\n ngramSize: number;\n /** Case sensitive matching */\n caseSensitive: boolean;\n /** Ignore whitespace differences */\n ignoreWhitespace: boolean;\n}\n\n/**\n * Default fuzzy match configuration\n */\nexport const DEFAULT_FUZZY_CONFIG: FuzzyMatchConfig = {\n threshold: 0.7,\n levenshteinWeight: 0.3,\n jaroWinklerWeight: 0.4,\n ngramWeight: 0.3,\n ngramSize: 2,\n caseSensitive: false,\n ignoreWhitespace: true,\n};\n\n/**\n * Result from a fuzzy match operation\n */\nexport interface FuzzyMatchResult {\n /** Overall similarity score (0-1) */\n similarity: number;\n /** Whether the match passes the threshold */\n isMatch: boolean;\n /** Individual algorithm scores */\n scores: {\n levenshtein: number;\n jaroWinkler: number;\n ngram: number;\n };\n /** Normalized source string */\n normalizedSource: string;\n /** Normalized target string */\n normalizedTarget: string;\n}\n\n/**\n * Calculate Levenshtein distance between two strings\n */\nexport function levenshteinDistance(s1: string, s2: string): number {\n const len1 = s1.length;\n const len2 = s2.length;\n\n // Create distance matrix\n const matrix: number[][] = Array(len1 + 1)\n .fill(null)\n .map(() => Array(len2 + 1).fill(0));\n\n // Initialize first column and row\n for (let i = 0; i <= len1; i++) matrix[i][0] = i;\n for (let j = 0; j <= len2; j++) matrix[0][j] = j;\n\n // Fill in the rest of the matrix\n for (let i = 1; i <= len1; i++) {\n for (let j = 1; j <= len2; j++) {\n const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1, // deletion\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j - 1] + cost // substitution\n );\n }\n }\n\n return matrix[len1][len2];\n}\n\n/**\n * Calculate Levenshtein similarity (0-1)\n */\nexport function levenshteinSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const distance = levenshteinDistance(s1, s2);\n const maxLength = Math.max(s1.length, s2.length);\n\n return 1 - distance / maxLength;\n}\n\n/**\n * Calculate Jaro similarity between two strings\n */\nexport function jaroSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const matchDistance = Math.floor(Math.max(s1.length, s2.length) / 2) - 1;\n const s1Matches = new Array(s1.length).fill(false);\n const s2Matches = new Array(s2.length).fill(false);\n\n let matches = 0;\n let transpositions = 0;\n\n // Find matches\n for (let i = 0; i < s1.length; i++) {\n const start = Math.max(0, i - matchDistance);\n const end = Math.min(i + matchDistance + 1, s2.length);\n\n for (let j = start; j < end; j++) {\n if (s2Matches[j] || s1[i] !== s2[j]) continue;\n s1Matches[i] = true;\n s2Matches[j] = true;\n matches++;\n break;\n }\n }\n\n if (matches === 0) return 0;\n\n // Count transpositions\n let k = 0;\n for (let i = 0; i < s1.length; i++) {\n if (!s1Matches[i]) continue;\n while (!s2Matches[k]) k++;\n if (s1[i] !== s2[k]) transpositions++;\n k++;\n }\n\n return (matches / s1.length + matches / s2.length + (matches - transpositions / 2) / matches) / 3;\n}\n\n/**\n * Calculate Jaro-Winkler similarity\n * Gives more weight to strings that match from the beginning\n */\nexport function jaroWinklerSimilarity(s1: string, s2: string, prefixScale: number = 0.1): number {\n const jaroSim = jaroSimilarity(s1, s2);\n\n // Find common prefix (up to 4 characters)\n let prefixLength = 0;\n const maxPrefix = Math.min(4, Math.min(s1.length, s2.length));\n\n for (let i = 0; i < maxPrefix; i++) {\n if (s1[i] === s2[i]) {\n prefixLength++;\n } else {\n break;\n }\n }\n\n return jaroSim + prefixLength * prefixScale * (1 - jaroSim);\n}\n\n/**\n * Generate N-grams from a string\n */\nexport function generateNgrams(s: string, n: number): Set<string> {\n const ngrams = new Set<string>();\n\n if (s.length < n) {\n ngrams.add(s);\n return ngrams;\n }\n\n for (let i = 0; i <= s.length - n; i++) {\n ngrams.add(s.substring(i, i + n));\n }\n\n return ngrams;\n}\n\n/**\n * Calculate N-gram similarity (Jaccard coefficient)\n */\nexport function ngramSimilarity(s1: string, s2: string, n: number = 2): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const ngrams1 = generateNgrams(s1, n);\n const ngrams2 = generateNgrams(s2, n);\n\n // Calculate intersection\n let intersection = 0;\n for (const ngram of ngrams1) {\n if (ngrams2.has(ngram)) {\n intersection++;\n }\n }\n\n // Jaccard coefficient: |A ∩ B| / |A ∪ B|\n const union = ngrams1.size + ngrams2.size - intersection;\n\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Normalize a string for comparison\n */\nexport function normalizeString(s: string, config: Partial<FuzzyMatchConfig> = {}): string {\n let normalized = s;\n\n // Handle case sensitivity\n if (!config.caseSensitive) {\n normalized = normalized.toLowerCase();\n }\n\n // Handle whitespace\n if (config.ignoreWhitespace !== false) {\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n }\n\n return normalized;\n}\n\n/**\n * Main fuzzy match function\n * Combines multiple algorithms for robust matching\n */\nexport function fuzzyMatch(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): FuzzyMatchResult {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n\n // Normalize strings\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Calculate individual scores\n const levenshteinScore = levenshteinSimilarity(normalizedSource, normalizedTarget);\n const jaroWinklerScore = jaroWinklerSimilarity(normalizedSource, normalizedTarget);\n const ngramScore = ngramSimilarity(normalizedSource, normalizedTarget, finalConfig.ngramSize);\n\n // Weighted combination\n const similarity =\n levenshteinScore * finalConfig.levenshteinWeight +\n jaroWinklerScore * finalConfig.jaroWinklerWeight +\n ngramScore * finalConfig.ngramWeight;\n\n return {\n similarity,\n isMatch: similarity >= finalConfig.threshold,\n scores: {\n levenshtein: levenshteinScore,\n jaroWinkler: jaroWinklerScore,\n ngram: ngramScore,\n },\n normalizedSource,\n normalizedTarget,\n };\n}\n\n/**\n * Find the best match from a list of candidates\n */\nexport function findBestMatch(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): { match: string | null; index: number; result: FuzzyMatchResult | null } {\n if (candidates.length === 0) {\n return { match: null, index: -1, result: null };\n }\n\n let bestMatch: string | null = null;\n let bestIndex = -1;\n let bestResult: FuzzyMatchResult | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch && (!bestResult || result.similarity > bestResult.similarity)) {\n bestMatch = candidates[i];\n bestIndex = i;\n bestResult = result;\n }\n }\n\n return { match: bestMatch, index: bestIndex, result: bestResult };\n}\n\n/**\n * Find all matches above threshold\n */\nexport function findAllMatches(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): Array<{ candidate: string; index: number; result: FuzzyMatchResult }> {\n const matches: Array<{ candidate: string; index: number; result: FuzzyMatchResult }> = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch) {\n matches.push({ candidate: candidates[i], index: i, result });\n }\n }\n\n // Sort by similarity descending\n matches.sort((a, b) => b.result.similarity - a.result.similarity);\n\n return matches;\n}\n\n/**\n * Check if source contains target (fuzzy)\n */\nexport function fuzzyContains(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): boolean {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Exact contains check\n if (normalizedSource.includes(normalizedTarget)) {\n return true;\n }\n\n // Word-by-word fuzzy check\n const sourceWords = normalizedSource.split(/\\s+/);\n const targetWords = normalizedTarget.split(/\\s+/);\n\n // All target words must have a fuzzy match in source\n for (const targetWord of targetWords) {\n const hasMatch = sourceWords.some((sourceWord) => {\n const result = fuzzyMatch(sourceWord, targetWord, { ...finalConfig, threshold: 0.8 });\n return result.isMatch;\n });\n\n if (!hasMatch) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Calculate word-level similarity\n * Useful for comparing phrases\n */\nexport function wordSimilarity(\n s1: string,\n s2: string,\n config: Partial<FuzzyMatchConfig> = {}\n): number {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const words1 = normalizeString(s1, finalConfig).split(/\\s+/);\n const words2 = normalizeString(s2, finalConfig).split(/\\s+/);\n\n if (words1.length === 0 && words2.length === 0) return 1;\n if (words1.length === 0 || words2.length === 0) return 0;\n\n let totalSimilarity = 0;\n let matchCount = 0;\n\n // For each word in s1, find best match in s2\n for (const word1 of words1) {\n let bestSim = 0;\n for (const word2 of words2) {\n const result = fuzzyMatch(word1, word2, finalConfig);\n if (result.similarity > bestSim) {\n bestSim = result.similarity;\n }\n }\n totalSimilarity += bestSim;\n if (bestSim >= finalConfig.threshold) {\n matchCount++;\n }\n }\n\n // Return combination of average similarity and match ratio\n const avgSimilarity = totalSimilarity / words1.length;\n const matchRatio = matchCount / Math.max(words1.length, words2.length);\n\n return avgSimilarity * 0.5 + matchRatio * 0.5;\n}\n\n/**\n * Tokenize a string for matching\n * Handles camelCase, PascalCase, snake_case, kebab-case\n */\nexport function tokenize(s: string): string[] {\n return (\n s\n // Split camelCase and PascalCase\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case and kebab-case\n .replace(/[_-]/g, ' ')\n // Normalize whitespace\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n .split(' ')\n .filter((token) => token.length > 0)\n );\n}\n\n/**\n * Calculate token-based similarity\n * Better for matching identifiers and labels\n */\nexport function tokenSimilarity(s1: string, s2: string): number {\n const tokens1 = tokenize(s1);\n const tokens2 = tokenize(s2);\n\n if (tokens1.length === 0 && tokens2.length === 0) return 1;\n if (tokens1.length === 0 || tokens2.length === 0) return 0;\n\n const set1 = new Set(tokens1);\n const set2 = new Set(tokens2);\n\n // Calculate Jaccard similarity on tokens\n let intersection = 0;\n for (const token of set1) {\n if (set2.has(token)) {\n intersection++;\n }\n }\n\n const union = set1.size + set2.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n","/**\n * Alias Generator\n *\n * Auto-generates element aliases from visible text, aria-label, placeholders,\n * titles, and common synonyms for natural language matching.\n */\n\nimport { tokenize } from './fuzzy-matcher';\n\n/**\n * Configuration for alias generation\n */\nexport interface AliasGeneratorConfig {\n /** Include text content as alias */\n includeText: boolean;\n /** Include aria-label as alias */\n includeAriaLabel: boolean;\n /** Include placeholder text as alias */\n includePlaceholder: boolean;\n /** Include title attribute as alias */\n includeTitle: boolean;\n /** Include common synonyms */\n includeSynonyms: boolean;\n /** Maximum number of aliases to generate */\n maxAliases: number;\n /** Minimum alias length */\n minLength: number;\n /** Maximum alias length */\n maxLength: number;\n}\n\n/**\n * Default alias generator configuration\n */\nexport const DEFAULT_ALIAS_CONFIG: AliasGeneratorConfig = {\n includeText: true,\n includeAriaLabel: true,\n includePlaceholder: true,\n includeTitle: true,\n includeSynonyms: true,\n maxAliases: 20,\n minLength: 2,\n maxLength: 50,\n};\n\n/**\n * Common synonyms for UI actions and elements\n */\nconst SYNONYMS: Record<string, string[]> = {\n // Submit-related\n submit: ['send', 'go', 'confirm', 'ok', 'apply', 'save', 'done', 'finish'],\n send: ['submit', 'deliver', 'post'],\n save: ['submit', 'store', 'keep', 'apply'],\n cancel: ['close', 'dismiss', 'abort', 'back', 'exit', 'quit', 'nevermind'],\n close: ['cancel', 'dismiss', 'exit', 'x'],\n delete: ['remove', 'trash', 'erase', 'clear', 'destroy'],\n remove: ['delete', 'clear', 'discard'],\n edit: ['modify', 'change', 'update', 'alter'],\n update: ['edit', 'modify', 'save', 'refresh'],\n add: ['create', 'new', 'plus', 'insert'],\n create: ['add', 'new', 'make'],\n search: ['find', 'lookup', 'query', 'filter'],\n find: ['search', 'locate', 'lookup'],\n login: ['signin', 'sign in', 'log in', 'authenticate', 'enter'],\n logout: ['signout', 'sign out', 'log out', 'exit'],\n register: ['signup', 'sign up', 'join', 'create account'],\n next: ['continue', 'forward', 'proceed', 'advance'],\n previous: ['back', 'backward', 'return', 'prior'],\n back: ['previous', 'return', 'backward'],\n start: ['begin', 'launch', 'initiate', 'run', 'execute'],\n stop: ['end', 'halt', 'pause', 'terminate'],\n enable: ['activate', 'turn on', 'switch on'],\n disable: ['deactivate', 'turn off', 'switch off'],\n show: ['display', 'reveal', 'view', 'open'],\n hide: ['conceal', 'collapse', 'close'],\n expand: ['open', 'show', 'unfold', 'reveal'],\n collapse: ['close', 'hide', 'fold', 'minimize'],\n yes: ['ok', 'confirm', 'agree', 'accept'],\n no: ['cancel', 'decline', 'reject', 'deny'],\n help: ['support', 'assistance', 'info', 'information', 'faq'],\n settings: ['preferences', 'options', 'config', 'configuration'],\n profile: ['account', 'user', 'me'],\n download: ['export', 'save', 'get'],\n upload: ['import', 'load', 'attach'],\n refresh: ['reload', 'update', 'sync'],\n copy: ['duplicate', 'clone'],\n paste: ['insert'],\n select: ['choose', 'pick'],\n toggle: ['switch', 'flip'],\n\n // Form fields\n email: ['e-mail', 'mail'],\n password: ['pass', 'pwd', 'secret'],\n username: ['user', 'login', 'account', 'name'],\n firstname: ['first name', 'given name', 'forename'],\n lastname: ['last name', 'surname', 'family name'],\n fullname: ['full name', 'name', 'complete name'],\n phone: ['telephone', 'tel', 'mobile', 'cell'],\n address: ['location', 'street'],\n city: ['town'],\n country: ['nation'],\n zip: ['zipcode', 'postal', 'postal code', 'postcode'],\n\n // Navigation\n home: ['main', 'start', 'dashboard'],\n menu: ['navigation', 'nav'],\n sidebar: ['side bar', 'side panel', 'side menu'],\n};\n\n/**\n * Element type to action word mappings\n */\nconst ELEMENT_ACTION_WORDS: Record<string, string[]> = {\n button: ['button', 'btn', 'click'],\n input: ['input', 'field', 'textbox', 'box'],\n textarea: ['textarea', 'text area', 'text field', 'multiline'],\n select: ['select', 'dropdown', 'combo', 'picker', 'chooser'],\n checkbox: ['checkbox', 'check', 'tick'],\n radio: ['radio', 'option', 'choice'],\n link: ['link', 'anchor', 'href'],\n form: ['form'],\n menu: ['menu'],\n menuitem: ['menu item', 'option'],\n tab: ['tab'],\n dialog: ['dialog', 'modal', 'popup'],\n switch: ['switch', 'toggle'],\n slider: ['slider', 'range'],\n};\n\n/**\n * Normalize text for alias comparison\n */\nfunction normalizeAlias(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Extract words from text, handling various naming conventions\n */\nfunction extractWords(text: string): string[] {\n const tokens = tokenize(text);\n return tokens.filter((t) => t.length >= 2);\n}\n\n/**\n * Generate aliases from text content\n */\nfunction generateTextAliases(\n text: string | null | undefined,\n config: AliasGeneratorConfig\n): string[] {\n if (!text || !config.includeText) return [];\n\n const aliases: string[] = [];\n const normalized = normalizeAlias(text);\n\n // Add full normalized text\n if (normalized.length >= config.minLength && normalized.length <= config.maxLength) {\n aliases.push(normalized);\n }\n\n // Add individual words\n const words = extractWords(text);\n for (const word of words) {\n if (word.length >= config.minLength) {\n aliases.push(word);\n }\n }\n\n // Add word combinations\n if (words.length >= 2 && words.length <= 4) {\n // First two words\n const twoWords = words.slice(0, 2).join(' ');\n if (twoWords.length <= config.maxLength) {\n aliases.push(twoWords);\n }\n\n // Last two words\n if (words.length > 2) {\n const lastTwo = words.slice(-2).join(' ');\n if (lastTwo.length <= config.maxLength) {\n aliases.push(lastTwo);\n }\n }\n }\n\n return aliases;\n}\n\n/**\n * Generate synonyms for given aliases\n */\nfunction generateSynonyms(aliases: string[], config: AliasGeneratorConfig): string[] {\n if (!config.includeSynonyms) return [];\n\n const synonyms: string[] = [];\n\n for (const alias of aliases) {\n const words = alias.toLowerCase().split(/\\s+/);\n\n for (const word of words) {\n if (SYNONYMS[word]) {\n for (const synonym of SYNONYMS[word]) {\n // Replace word with synonym in the alias\n const newAlias = alias.toLowerCase().replace(word, synonym);\n if (newAlias !== alias.toLowerCase()) {\n synonyms.push(newAlias);\n }\n\n // Also add standalone synonym\n if (synonym.length >= config.minLength) {\n synonyms.push(synonym);\n }\n }\n }\n }\n }\n\n return synonyms;\n}\n\n/**\n * Generate element type aliases\n */\nfunction generateTypeAliases(elementType: string): string[] {\n const type = elementType.toLowerCase();\n return ELEMENT_ACTION_WORDS[type] || [type];\n}\n\n/**\n * Interface for element information used in alias generation\n */\nexport interface AliasGeneratorInput {\n /** Element text content */\n textContent?: string | null;\n /** ARIA label */\n ariaLabel?: string | null;\n /** ARIA labelledby resolved text */\n ariaLabelledBy?: string | null;\n /** Placeholder text */\n placeholder?: string | null;\n /** Title attribute */\n title?: string | null;\n /** Element type */\n elementType?: string;\n /** Element tag name */\n tagName?: string;\n /** Input type */\n inputType?: string;\n /** Element ID */\n id?: string | null;\n /** Element name attribute */\n name?: string | null;\n /** Associated label text */\n labelText?: string | null;\n /** Value attribute */\n value?: string | null;\n}\n\n/**\n * Generate aliases for an element\n */\nexport function generateAliases(\n input: AliasGeneratorInput,\n config: Partial<AliasGeneratorConfig> = {}\n): string[] {\n const finalConfig = { ...DEFAULT_ALIAS_CONFIG, ...config };\n const aliasSet = new Set<string>();\n\n // Helper to add alias with deduplication and length checks\n const addAlias = (alias: string) => {\n const normalized = normalizeAlias(alias);\n if (normalized.length >= finalConfig.minLength && normalized.length <= finalConfig.maxLength) {\n aliasSet.add(normalized);\n }\n };\n\n // Helper to add multiple aliases\n const addAliases = (aliases: string[]) => {\n for (const alias of aliases) {\n addAlias(alias);\n }\n };\n\n // Generate from text content\n if (finalConfig.includeText && input.textContent) {\n addAliases(generateTextAliases(input.textContent, finalConfig));\n }\n\n // Generate from ARIA label\n if (finalConfig.includeAriaLabel && input.ariaLabel) {\n addAliases(generateTextAliases(input.ariaLabel, finalConfig));\n }\n\n // Generate from ARIA labelledby\n if (finalConfig.includeAriaLabel && input.ariaLabelledBy) {\n addAliases(generateTextAliases(input.ariaLabelledBy, finalConfig));\n }\n\n // Generate from placeholder\n if (finalConfig.includePlaceholder && input.placeholder) {\n addAliases(generateTextAliases(input.placeholder, finalConfig));\n }\n\n // Generate from title\n if (finalConfig.includeTitle && input.title) {\n addAliases(generateTextAliases(input.title, finalConfig));\n }\n\n // Generate from label text\n if (input.labelText) {\n addAliases(generateTextAliases(input.labelText, finalConfig));\n }\n\n // Generate from element ID (often meaningful)\n if (input.id) {\n addAliases(extractWords(input.id));\n }\n\n // Generate from name attribute\n if (input.name) {\n addAliases(extractWords(input.name));\n }\n\n // Generate from value for buttons/submit inputs\n if (\n input.value &&\n (input.elementType === 'button' || input.inputType === 'submit' || input.inputType === 'button')\n ) {\n addAliases(generateTextAliases(input.value, finalConfig));\n }\n\n // Generate type aliases\n if (input.elementType) {\n addAliases(generateTypeAliases(input.elementType));\n }\n\n // Generate input type aliases\n if (input.inputType) {\n addAlias(input.inputType);\n\n // Common input type patterns\n if (input.inputType === 'email') {\n addAliases(['email', 'e-mail', 'email address']);\n } else if (input.inputType === 'password') {\n addAliases(['password', 'pass', 'pwd']);\n } else if (input.inputType === 'tel') {\n addAliases(['phone', 'telephone', 'mobile']);\n } else if (input.inputType === 'url') {\n addAliases(['url', 'website', 'link', 'address']);\n } else if (input.inputType === 'search') {\n addAliases(['search', 'find', 'query']);\n }\n }\n\n // Generate synonyms for all collected aliases\n if (finalConfig.includeSynonyms) {\n const currentAliases = Array.from(aliasSet);\n addAliases(generateSynonyms(currentAliases, finalConfig));\n }\n\n // Convert to array and limit\n let aliases = Array.from(aliasSet);\n\n // Sort by length (shorter = more likely to be useful)\n aliases.sort((a, b) => a.length - b.length);\n\n // Limit number of aliases\n if (aliases.length > finalConfig.maxAliases) {\n aliases = aliases.slice(0, finalConfig.maxAliases);\n }\n\n return aliases;\n}\n\n/**\n * Generate a human-readable description for an element\n */\nexport function generateDescription(input: AliasGeneratorInput): string {\n const parts: string[] = [];\n\n // Determine the best name for the element\n let name =\n input.ariaLabel ||\n input.labelText ||\n input.textContent ||\n input.placeholder ||\n input.title ||\n input.id ||\n input.name;\n\n if (name) {\n name = name.trim();\n // Truncate if too long\n if (name.length > 30) {\n name = name.substring(0, 27) + '...';\n }\n parts.push(`\"${name}\"`);\n }\n\n // Add element type\n const typeWords = ELEMENT_ACTION_WORDS[input.elementType || ''] || [\n input.elementType || 'element',\n ];\n parts.push(typeWords[0]);\n\n // Add input type for inputs\n if (input.inputType && input.inputType !== 'text') {\n parts.push(`(${input.inputType})`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Content type strings for purpose/action generation\n */\nconst CONTENT_TYPES = new Set([\n 'heading',\n 'paragraph',\n 'list-item',\n 'table-cell',\n 'table-header',\n 'label',\n 'caption',\n 'blockquote',\n 'code-block',\n 'badge',\n 'status-message',\n 'metric-value',\n 'description-text',\n 'nav-text',\n 'content-generic',\n]);\n\n/**\n * Generate a purpose statement for an element\n */\nexport function generatePurpose(input: AliasGeneratorInput): string | undefined {\n const text = (input.textContent || input.ariaLabel || input.title || '').toLowerCase();\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n\n // Content-specific purposes\n if (CONTENT_TYPES.has(type)) {\n switch (type) {\n case 'heading':\n return 'Section heading';\n case 'paragraph':\n return 'Body text content';\n case 'list-item':\n return 'List item';\n case 'table-cell':\n return 'Table data cell';\n case 'table-header':\n return 'Table column header';\n case 'label':\n return 'Field label or definition term';\n case 'caption':\n return 'Figure or table caption';\n case 'blockquote':\n return 'Quoted content';\n case 'code-block':\n return 'Code or preformatted text';\n case 'badge':\n return 'Status badge or tag';\n case 'status-message':\n return 'Dynamic status indicator';\n case 'metric-value':\n return 'Metric or statistic value';\n case 'description-text':\n return 'Description or definition';\n case 'nav-text':\n return 'Navigation label';\n case 'content-generic':\n return 'Text content';\n default:\n return 'Static content';\n }\n }\n\n // Check for common patterns\n if (type === 'button' || inputType === 'submit') {\n if (text.match(/submit|send|save|confirm|ok|done|finish|apply/)) {\n return 'Submits the form';\n }\n if (text.match(/cancel|close|dismiss|back|exit/)) {\n return 'Cancels or closes the current action';\n }\n if (text.match(/delete|remove|trash|clear/)) {\n return 'Deletes or removes an item';\n }\n if (text.match(/edit|modify|change|update/)) {\n return 'Edits or modifies an item';\n }\n if (text.match(/add|create|new|\\+/)) {\n return 'Creates or adds a new item';\n }\n if (text.match(/search|find|lookup/)) {\n return 'Performs a search';\n }\n if (text.match(/login|sign.?in/)) {\n return 'Signs the user in';\n }\n if (text.match(/logout|sign.?out/)) {\n return 'Signs the user out';\n }\n if (text.match(/register|sign.?up|join/)) {\n return 'Creates a new account';\n }\n if (text.match(/next|continue|proceed/)) {\n return 'Proceeds to the next step';\n }\n if (text.match(/previous|back|return/)) {\n return 'Returns to the previous step';\n }\n }\n\n if (type === 'input' || type === 'textarea') {\n if (inputType === 'email') return 'Accepts email address input';\n if (inputType === 'password') return 'Accepts password input';\n if (inputType === 'search') return 'Accepts search query input';\n if (inputType === 'tel') return 'Accepts phone number input';\n if (inputType === 'url') return 'Accepts URL input';\n if (inputType === 'number') return 'Accepts numeric input';\n if (inputType === 'date') return 'Accepts date input';\n if (inputType === 'file') return 'Accepts file upload';\n }\n\n if (type === 'checkbox') {\n return 'Toggles an option on or off';\n }\n\n if (type === 'radio') {\n return 'Selects one option from a group';\n }\n\n if (type === 'select') {\n return 'Selects an option from a dropdown';\n }\n\n if (type === 'link') {\n return 'Navigates to another page';\n }\n\n return undefined;\n}\n\n/**\n * Generate suggested actions for an element\n */\nexport function generateSuggestedActions(input: AliasGeneratorInput): string[] {\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n const text = (input.textContent || input.ariaLabel || '').toLowerCase();\n const actions: string[] = [];\n\n // Content elements get read-only actions\n if (CONTENT_TYPES.has(type)) {\n actions.push('read text content', 'verify text matches expected');\n return actions;\n }\n\n switch (type) {\n case 'button':\n actions.push(`click \"${text || 'this button'}\"`);\n break;\n case 'input':\n if (inputType === 'checkbox') {\n actions.push('check to enable', 'uncheck to disable');\n } else if (inputType === 'radio') {\n actions.push('select this option');\n } else {\n actions.push(`type into \"${text || 'this field'}\"`);\n actions.push('clear the field');\n }\n break;\n case 'textarea':\n actions.push(`type into \"${text || 'this text area'}\"`);\n actions.push('clear the content');\n break;\n case 'select':\n actions.push(`select an option from \"${text || 'this dropdown'}\"`);\n break;\n case 'checkbox':\n actions.push('check to enable', 'uncheck to disable');\n break;\n case 'radio':\n actions.push('select this option');\n break;\n case 'link':\n actions.push(`click to navigate to \"${text || 'the linked page'}\"`);\n break;\n case 'switch':\n actions.push('toggle on', 'toggle off');\n break;\n default:\n actions.push('click');\n }\n\n return actions;\n}\n\n/**\n * Get synonyms for a word\n */\nexport function getSynonyms(word: string): string[] {\n const normalized = word.toLowerCase().trim();\n return SYNONYMS[normalized] || [];\n}\n\n/**\n * Check if two words are synonyms\n */\nexport function areSynonyms(word1: string, word2: string): boolean {\n const w1 = word1.toLowerCase().trim();\n const w2 = word2.toLowerCase().trim();\n\n if (w1 === w2) return true;\n\n const synonyms1 = SYNONYMS[w1] || [];\n const synonyms2 = SYNONYMS[w2] || [];\n\n return synonyms1.includes(w2) || synonyms2.includes(w1);\n}\n","/**\n * Annotation Types\n *\n * Types for the semantic annotation system that allows developers\n * to attach rich human-authored context to UI elements.\n */\n\n/**\n * Annotation for a single UI element.\n *\n * All fields are optional - annotate only what's useful.\n * Annotations provide human-authored semantic context that enriches\n * the UI Bridge's understanding of elements beyond what can be\n * inferred from the DOM alone.\n *\n * @example Basic annotation for a button\n * ```ts\n * const annotation: ElementAnnotation = {\n * description: 'Primary login button',\n * purpose: 'Submits the login form and authenticates the user',\n * tags: ['auth', 'primary-action'],\n * };\n * store.set('login-btn', annotation);\n * ```\n *\n * @example Detailed annotation with relationships and metadata\n * ```ts\n * const annotation: ElementAnnotation = {\n * description: 'Email input field',\n * purpose: 'Collects the user email for authentication',\n * notes: 'Validates email format on blur. Shows inline error below the field.',\n * tags: ['auth', 'form-input', 'required'],\n * relatedElements: ['email-label', 'email-error', 'login-btn'],\n * metadata: { validationPattern: '^[^@]+@[^@]+\\\\.[^@]+$' },\n * author: 'design-team',\n * };\n * ```\n */\nexport interface ElementAnnotation {\n /** Human-readable description of what this element is */\n description?: string;\n /** Why this element exists / what it's for */\n purpose?: string;\n /** Behavioral notes, edge cases, or caveats */\n notes?: string;\n /** Searchable tags for categorization */\n tags?: string[];\n /** IDs of related elements (e.g., a label and its input) */\n relatedElements?: string[];\n /** Arbitrary key-value metadata */\n metadata?: Record<string, unknown>;\n /** Timestamp of last update (auto-set by store) */\n updatedAt?: number;\n /** Author of this annotation */\n author?: string;\n}\n\n/**\n * Annotation configuration file format.\n *\n * This is the import/export format - a JSON file with version and annotations map.\n * Use `AnnotationStore.exportConfig()` to generate this object, and\n * `AnnotationStore.importConfig()` to load it back.\n *\n * @example JSON file format (`annotations.json`)\n * ```json\n * {\n * \"version\": \"1.0.0\",\n * \"annotations\": {\n * \"login-btn\": {\n * \"description\": \"Primary login button\",\n * \"purpose\": \"Submits the login form\",\n * \"tags\": [\"auth\", \"primary-action\"]\n * },\n * \"email-input\": {\n * \"description\": \"Email address input\",\n * \"purpose\": \"Collects user email for authentication\",\n * \"relatedElements\": [\"email-label\", \"email-error\"]\n * }\n * },\n * \"metadata\": {\n * \"appName\": \"MyApp\",\n * \"description\": \"Annotations for the login page\"\n * }\n * }\n * ```\n */\nexport interface AnnotationConfig {\n /** Config format version */\n version: string;\n /** Map of element ID to annotation */\n annotations: Record<string, ElementAnnotation>;\n /** Optional file-level metadata */\n metadata?: {\n appName?: string;\n exportedAt?: number;\n description?: string;\n };\n}\n\n/**\n * Annotation coverage statistics.\n */\nexport interface AnnotationCoverage {\n /** Total elements known to the system */\n totalElements: number;\n /** Elements that have annotations */\n annotatedElements: number;\n /** Coverage as a percentage (0-100) */\n coveragePercent: number;\n /** IDs of annotated elements */\n annotatedIds: string[];\n /** IDs of unannotated elements */\n unannotatedIds: string[];\n /** When this coverage was computed */\n timestamp: number;\n}\n\n/**\n * Event types emitted by the annotation store.\n */\nexport type AnnotationEventType =\n | 'annotation:set'\n | 'annotation:deleted'\n | 'annotation:imported'\n | 'annotation:cleared';\n\n/**\n * Event payload for annotation store events.\n */\nexport interface AnnotationEvent {\n type: AnnotationEventType;\n elementId?: string;\n annotation?: ElementAnnotation;\n count?: number;\n timestamp: number;\n}\n\n/** Current annotation config version */\nexport const ANNOTATION_CONFIG_VERSION = '1.0.0';\n","/**\n * Annotation Store\n *\n * In-memory store for element annotations with CRUD operations,\n * import/export, coverage tracking, and event emission.\n */\n\nimport type {\n ElementAnnotation,\n AnnotationConfig,\n AnnotationCoverage,\n AnnotationEvent,\n} from './types';\nimport { ANNOTATION_CONFIG_VERSION } from './types';\n\n/**\n * Listener function for annotation events.\n */\nexport type AnnotationListener = (event: AnnotationEvent) => void;\n\n/**\n * Annotation Store\n *\n * Stores element annotations in memory with event-driven updates.\n * Provides CRUD operations, import/export, coverage tracking, and\n * an event system for reacting to annotation changes.\n *\n * @example Basic CRUD usage\n * ```ts\n * const store = new AnnotationStore();\n *\n * // Set an annotation\n * store.set('login-btn', {\n * description: 'Primary login button',\n * purpose: 'Submits the login form',\n * tags: ['auth', 'primary-action'],\n * });\n *\n * // Read it back\n * const annotation = store.get('login-btn');\n * console.log(annotation?.description); // 'Primary login button'\n *\n * // Check existence\n * store.has('login-btn'); // true\n *\n * // Delete it\n * store.delete('login-btn'); // true\n * ```\n *\n * @example Import/export workflow\n * ```ts\n * const store = new AnnotationStore();\n *\n * // Import from a config file\n * const config = JSON.parse(fs.readFileSync('annotations.json', 'utf-8'));\n * const count = store.importConfig(config);\n * console.log(`Imported ${count} annotations`);\n *\n * // Export current state\n * const exported = store.exportConfig({ appName: 'MyApp' });\n * fs.writeFileSync('annotations.json', JSON.stringify(exported, null, 2));\n * ```\n *\n * @example Listening for changes\n * ```ts\n * const store = new AnnotationStore();\n *\n * const unsubscribe = store.on((event) => {\n * switch (event.type) {\n * case 'annotation:set':\n * console.log(`Updated: ${event.elementId}`);\n * break;\n * case 'annotation:deleted':\n * console.log(`Deleted: ${event.elementId}`);\n * break;\n * case 'annotation:imported':\n * console.log(`Imported ${event.count} annotations`);\n * break;\n * case 'annotation:cleared':\n * console.log('All annotations cleared');\n * break;\n * }\n * });\n *\n * // Later, stop listening\n * unsubscribe();\n * ```\n */\nexport class AnnotationStore {\n private store = new Map<string, ElementAnnotation>();\n private listeners = new Set<AnnotationListener>();\n\n /**\n * Get an annotation by element ID.\n */\n get(elementId: string): ElementAnnotation | undefined {\n return this.store.get(elementId);\n }\n\n /**\n * Get all annotations as a record.\n */\n getAll(): Record<string, ElementAnnotation> {\n const result: Record<string, ElementAnnotation> = {};\n for (const [id, annotation] of this.store) {\n result[id] = annotation;\n }\n return result;\n }\n\n /**\n * Set an annotation for an element. Auto-sets `updatedAt`.\n */\n set(elementId: string, annotation: ElementAnnotation): void {\n const updated: ElementAnnotation = {\n ...annotation,\n updatedAt: Date.now(),\n };\n this.store.set(elementId, updated);\n this.emit({\n type: 'annotation:set',\n elementId,\n annotation: updated,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Delete an annotation by element ID.\n *\n * @returns true if the annotation existed and was deleted\n */\n delete(elementId: string): boolean {\n const existed = this.store.delete(elementId);\n if (existed) {\n this.emit({\n type: 'annotation:deleted',\n elementId,\n timestamp: Date.now(),\n });\n }\n return existed;\n }\n\n /**\n * Check if an annotation exists for an element.\n */\n has(elementId: string): boolean {\n return this.store.has(elementId);\n }\n\n /**\n * Get the number of stored annotations.\n */\n get count(): number {\n return this.store.size;\n }\n\n /**\n * Clear all annotations.\n */\n clear(): void {\n this.store.clear();\n this.emit({\n type: 'annotation:cleared',\n timestamp: Date.now(),\n });\n }\n\n /**\n * Import annotations from a config object.\n *\n * Merges with existing annotations (new values overwrite per element ID).\n *\n * @returns Number of annotations imported\n *\n * @example\n * ```ts\n * const config: AnnotationConfig = {\n * version: '1.0.0',\n * annotations: {\n * 'btn-1': { description: 'Submit button', tags: ['form'] },\n * 'input-1': { description: 'Name field' },\n * },\n * };\n * const count = store.importConfig(config); // 2\n * ```\n */\n importConfig(config: AnnotationConfig): number {\n let count = 0;\n for (const [id, annotation] of Object.entries(config.annotations)) {\n this.store.set(id, {\n ...annotation,\n updatedAt: annotation.updatedAt ?? Date.now(),\n });\n count++;\n }\n this.emit({\n type: 'annotation:imported',\n count,\n timestamp: Date.now(),\n });\n return count;\n }\n\n /**\n * Export all annotations as a config object.\n *\n * The returned object can be serialized to JSON and saved to a file,\n * then later re-imported with {@link importConfig}.\n *\n * @param metadata - Optional metadata to include (appName, description, etc.)\n * @returns AnnotationConfig with all current annotations\n *\n * @example\n * ```ts\n * const config = store.exportConfig({ appName: 'MyApp' });\n * // config.version === '1.0.0'\n * // config.annotations === { 'btn-1': { ... }, 'input-1': { ... } }\n * // config.metadata === { appName: 'MyApp', exportedAt: 1706900000000 }\n *\n * // Save to file\n * fs.writeFileSync('annotations.json', JSON.stringify(config, null, 2));\n * ```\n */\n exportConfig(metadata?: AnnotationConfig['metadata']): AnnotationConfig {\n return {\n version: ANNOTATION_CONFIG_VERSION,\n annotations: this.getAll(),\n metadata: {\n ...metadata,\n exportedAt: Date.now(),\n },\n };\n }\n\n /**\n * Compute annotation coverage against a set of known element IDs.\n *\n * Compares the store's annotations against the provided list of element IDs\n * to determine what percentage of elements have been annotated.\n *\n * @param allElementIds - Array of all known element IDs in the UI\n * @returns Coverage statistics including percentages and lists of annotated/unannotated IDs\n *\n * @example\n * ```ts\n * store.set('btn-1', { description: 'Submit' });\n * store.set('input-1', { description: 'Name' });\n *\n * const coverage = store.getCoverage(['btn-1', 'input-1', 'input-2', 'link-1']);\n * // coverage.totalElements === 4\n * // coverage.annotatedElements === 2\n * // coverage.coveragePercent === 50\n * // coverage.annotatedIds === ['btn-1', 'input-1']\n * // coverage.unannotatedIds === ['input-2', 'link-1']\n * ```\n */\n getCoverage(allElementIds: string[]): AnnotationCoverage {\n const annotatedIds: string[] = [];\n const unannotatedIds: string[] = [];\n\n for (const id of allElementIds) {\n if (this.store.has(id)) {\n annotatedIds.push(id);\n } else {\n unannotatedIds.push(id);\n }\n }\n\n const total = allElementIds.length;\n return {\n totalElements: total,\n annotatedElements: annotatedIds.length,\n coveragePercent: total > 0 ? (annotatedIds.length / total) * 100 : 0,\n annotatedIds,\n unannotatedIds,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Subscribe to annotation events.\n *\n * The listener is called whenever annotations are set, deleted, imported,\n * or cleared. Returns an unsubscribe function to stop listening.\n *\n * @param listener - Callback function receiving {@link AnnotationEvent} objects\n * @returns Unsubscribe function - call it to remove the listener\n *\n * @example\n * ```ts\n * const unsubscribe = store.on((event) => {\n * if (event.type === 'annotation:set') {\n * console.log(`Element ${event.elementId} annotated:`, event.annotation);\n * }\n * });\n *\n * store.set('btn-1', { description: 'Submit' });\n * // Logs: \"Element btn-1 annotated: { description: 'Submit', updatedAt: ... }\"\n *\n * unsubscribe(); // Stop listening\n * ```\n */\n on(listener: AnnotationListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Emit an event to all listeners.\n */\n private emit(event: AnnotationEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch {\n // Don't let listener errors break the store\n }\n }\n }\n}\n\n// Global singleton\nlet globalStore: AnnotationStore | null = null;\n\n/**\n * Get the global annotation store singleton.\n */\nexport function getGlobalAnnotationStore(): AnnotationStore {\n if (!globalStore) {\n globalStore = new AnnotationStore();\n }\n return globalStore;\n}\n\n/**\n * Reset the global annotation store (primarily for testing).\n */\nexport function resetGlobalAnnotationStore(): void {\n globalStore = null;\n}\n","/**\n * Search Engine\n *\n * Multi-strategy element search using text, role, accessibility,\n * spatial proximity, and fuzzy matching.\n */\n\nimport type { RegisteredElement, ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type { SearchCriteria, SearchResult, SearchResponse, AIDiscoveredElement } from './types';\nimport {\n fuzzyMatch,\n fuzzyContains,\n wordSimilarity,\n tokenSimilarity,\n DEFAULT_FUZZY_CONFIG,\n} from './fuzzy-matcher';\nimport {\n generateAliases,\n generateDescription,\n generatePurpose,\n generateSuggestedActions,\n areSynonyms,\n} from './alias-generator';\nimport { getGlobalAnnotationStore } from '../annotations';\n\n/**\n * Configuration for the search engine\n */\nexport interface SearchEngineConfig {\n /** Default fuzzy threshold */\n fuzzyThreshold: number;\n /** Weight for text matching */\n textWeight: number;\n /** Weight for accessibility matching */\n accessibilityWeight: number;\n /** Weight for role matching */\n roleWeight: number;\n /** Weight for spatial matching */\n spatialWeight: number;\n /** Weight for alias matching */\n aliasWeight: number;\n /** Maximum results to return */\n maxResults: number;\n /** Include hidden elements */\n includeHidden: boolean;\n}\n\n/**\n * Default search engine configuration\n */\nexport const DEFAULT_SEARCH_CONFIG: SearchEngineConfig = {\n fuzzyThreshold: 0.7,\n textWeight: 0.35,\n accessibilityWeight: 0.25,\n roleWeight: 0.15,\n spatialWeight: 0.1,\n aliasWeight: 0.15,\n maxResults: 20,\n includeHidden: false,\n};\n\n/**\n * Internal element representation for search\n */\ninterface SearchableElement {\n id: string;\n element: DiscoveredElement | RegisteredElement;\n state: ElementState;\n textContent?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n placeholder?: string;\n title?: string;\n role?: string;\n tagName: string;\n type: string;\n aliases: string[];\n description: string;\n rect: ElementState['rect'];\n labelText?: string;\n value?: string;\n}\n\n/**\n * Search Engine class\n */\nexport class SearchEngine {\n private config: SearchEngineConfig;\n private cachedElements: SearchableElement[] = [];\n private cacheTimestamp: number = 0;\n private readonly cacheValidityMs = 100; // Cache valid for 100ms\n\n constructor(config: Partial<SearchEngineConfig> = {}) {\n this.config = { ...DEFAULT_SEARCH_CONFIG, ...config };\n }\n\n /**\n * Update cached elements from various sources\n */\n updateElements(\n elements: Array<DiscoveredElement | RegisteredElement>,\n getState?: (el: RegisteredElement) => ElementState\n ): void {\n this.cachedElements = elements.map((el) => this.toSearchable(el, getState));\n this.cacheTimestamp = Date.now();\n }\n\n /**\n * Convert an element to searchable format\n */\n private toSearchable(\n element: DiscoveredElement | RegisteredElement,\n getState?: (el: RegisteredElement) => ElementState\n ): SearchableElement {\n // Get state depending on element type\n let state: ElementState;\n let textContent: string | undefined;\n let tagName: string;\n let role: string | undefined;\n let ariaLabel: string | undefined;\n let placeholder: string | undefined;\n let title: string | undefined;\n let labelText: string | undefined;\n let value: string | undefined;\n\n if ('getState' in element && typeof element.getState === 'function') {\n // RegisteredElement — prefer getState() data over direct DOM queries\n // to be resilient when DOM refs are stale or inaccessible\n state = getState ? getState(element) : element.getState();\n textContent = state.textContent || undefined;\n\n // Safely extract DOM attributes with fallbacks\n try {\n tagName = element.element.tagName.toLowerCase();\n } catch {\n tagName = element.type || 'unknown';\n }\n\n try {\n role = element.element.getAttribute('role') || undefined;\n ariaLabel = element.element.getAttribute('aria-label') || undefined;\n placeholder = element.element.getAttribute('placeholder') || undefined;\n title = element.element.getAttribute('title') || undefined;\n } catch {\n // DOM access failed — use fallbacks from RegisteredElement metadata\n }\n\n // Use registered label as labelText\n if (!ariaLabel && element.label) {\n ariaLabel = element.label;\n }\n\n try {\n if (element.element.id) {\n const labelEl = document.querySelector(`label[for=\"${element.element.id}\"]`);\n labelText = labelEl?.textContent?.trim() || undefined;\n }\n } catch {\n // label query failed\n }\n if (!labelText && element.label) {\n labelText = element.label;\n }\n\n // Use label as textContent fallback — ensures search can match by label\n if (!textContent && element.label) {\n textContent = element.label;\n }\n\n // Get value for inputs\n try {\n if (\n element.element instanceof HTMLInputElement ||\n element.element instanceof HTMLTextAreaElement ||\n element.element instanceof HTMLSelectElement\n ) {\n value = (element.element as HTMLInputElement).value || undefined;\n }\n } catch {\n value = state.value || undefined;\n }\n } else {\n // DiscoveredElement\n const discovered = element as DiscoveredElement;\n state = discovered.state;\n textContent = state.textContent || undefined;\n tagName = discovered.tagName;\n role = discovered.role || undefined;\n ariaLabel = discovered.accessibleName || undefined;\n // Use label property if available and no other label source\n if (!labelText && (element as { label?: string }).label) {\n labelText = (element as { label?: string }).label;\n }\n }\n\n // Generate aliases and description\n let aliases = generateAliases({\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementType: element.type,\n tagName,\n id: element.id,\n labelText,\n value,\n });\n\n // Merge pre-computed aliases from RegisteredElement if available\n if ('aliases' in element && Array.isArray(element.aliases) && element.aliases.length > 0) {\n const aliasSet = new Set([\n ...aliases,\n ...element.aliases.map((a: string) => a.toLowerCase()),\n ]);\n aliases = [...aliasSet];\n }\n\n let description = generateDescription({\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementType: element.type,\n tagName,\n id: element.id,\n labelText,\n });\n\n // Use pre-computed description from RegisteredElement if available\n if (!description && 'description' in element && element.description) {\n description = element.description as string;\n }\n\n // Merge annotation overrides into searchable data\n const annotation = getGlobalAnnotationStore().get(element.id);\n if (annotation) {\n if (annotation.description) {\n description = annotation.description;\n }\n if (annotation.tags && annotation.tags.length > 0) {\n // Merge tags into aliases\n const tagSet = new Set([...aliases, ...annotation.tags.map((t) => t.toLowerCase())]);\n aliases = [...tagSet];\n }\n if (annotation.notes) {\n // Make notes searchable by adding as an alias\n aliases.push(annotation.notes.toLowerCase());\n }\n }\n\n return {\n id: element.id,\n element,\n state,\n textContent,\n ariaLabel,\n placeholder,\n title,\n role,\n tagName,\n type: element.type,\n aliases,\n description,\n rect: state.rect,\n labelText,\n value,\n };\n }\n\n /**\n * Search for elements matching the criteria\n */\n search(\n criteria: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResponse {\n const startTime = performance.now();\n\n // Update cache if elements provided or cache expired\n if (elements) {\n this.updateElements(elements);\n }\n\n // Filter visible elements if needed\n let searchableElements = this.cachedElements;\n if (!this.config.includeHidden && !criteria.fuzzy) {\n searchableElements = searchableElements.filter((el) => el.state.visible);\n }\n\n // Score each element\n const results: SearchResult[] = [];\n\n for (const searchable of searchableElements) {\n const result = this.scoreElement(searchable, criteria);\n if (result.confidence >= (criteria.fuzzyThreshold ?? this.config.fuzzyThreshold)) {\n results.push(result);\n }\n }\n\n // Sort by confidence\n results.sort((a, b) => b.confidence - a.confidence);\n\n // Limit results\n const limitedResults = results.slice(0, this.config.maxResults);\n\n return {\n results: limitedResults,\n bestMatch: limitedResults.length > 0 ? limitedResults[0] : null,\n scannedCount: searchableElements.length,\n durationMs: performance.now() - startTime,\n criteria,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find the best matching element\n */\n findBest(\n criteria: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult | null {\n const response = this.search(criteria, elements);\n return response.bestMatch;\n }\n\n /**\n * Find elements by text content\n */\n findByText(\n text: string,\n fuzzy: boolean = true,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ text, fuzzy }, elements).results;\n }\n\n /**\n * Find elements by role\n */\n findByRole(\n role: string,\n name?: string,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n const criteria: SearchCriteria = { role };\n if (name) {\n criteria.accessibleName = name;\n }\n return this.search(criteria, elements).results;\n }\n\n /**\n * Find elements by accessible name\n */\n findByAccessibleName(\n name: string,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ accessibleName: name, fuzzy: true }, elements).results;\n }\n\n /**\n * Find elements near another element\n */\n findNear(\n referenceId: string,\n criteria?: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ ...criteria, near: referenceId }, elements).results;\n }\n\n /**\n * Find elements within a container\n */\n findWithin(\n containerId: string,\n criteria?: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ ...criteria, within: containerId }, elements).results;\n }\n\n /**\n * Score an element against search criteria\n */\n private scoreElement(searchable: SearchableElement, criteria: SearchCriteria): SearchResult {\n const scores: SearchResult['scores'] = {};\n const matchReasons: string[] = [];\n let totalWeight = 0;\n let weightedScore = 0;\n\n const fuzzyConfig = {\n ...DEFAULT_FUZZY_CONFIG,\n threshold: criteria.fuzzyThreshold ?? this.config.fuzzyThreshold,\n };\n\n // Text matching\n if (criteria.text) {\n const textScore = this.scoreTextMatch(\n searchable,\n criteria.text,\n criteria.fuzzy !== false,\n fuzzyConfig.threshold\n );\n scores.text = textScore.score;\n if (textScore.score > 0) {\n matchReasons.push(...textScore.reasons);\n }\n weightedScore += textScore.score * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // textContent uses both exact and contains matching (best score wins)\n // This is more intuitive for spec assertions where textContent checks\n // if the text is present in the element, not necessarily the entire text.\n // Supports pipe-separated alternatives: \"Connected|Disconnected\" matches either.\n if (criteria.textContent && !criteria.text) {\n // Split on pipe to support alternatives (e.g., \"Connected|Disconnected\")\n const alternatives = criteria.textContent.includes('|')\n ? criteria.textContent\n .split('|')\n .map((s) => s.trim())\n .filter(Boolean)\n : [criteria.textContent];\n\n let bestScore = 0;\n let bestReasons: string[] = [];\n\n for (const alt of alternatives) {\n const exactScore = this.scoreTextMatch(\n searchable,\n alt,\n criteria.fuzzy !== false,\n fuzzyConfig.threshold\n );\n const containsScore = this.scoreContainsMatch(searchable, alt, criteria.fuzzy !== false);\n const altBest = Math.max(exactScore.score, containsScore.score);\n if (altBest > bestScore) {\n bestScore = altBest;\n bestReasons =\n exactScore.score >= containsScore.score ? exactScore.reasons : containsScore.reasons;\n }\n }\n\n scores.text = bestScore;\n if (bestScore > 0) {\n matchReasons.push(...bestReasons);\n }\n weightedScore += bestScore * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // Partial text matching (contains)\n if (criteria.textContains) {\n const containsScore = this.scoreContainsMatch(\n searchable,\n criteria.textContains,\n criteria.fuzzy !== false\n );\n scores.text = Math.max(scores.text || 0, containsScore.score);\n if (containsScore.score > 0 && containsScore.reasons.length > 0) {\n matchReasons.push(...containsScore.reasons);\n }\n weightedScore += containsScore.score * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // Accessible name matching\n if (criteria.accessibleName) {\n const accessibilityScore = this.scoreAccessibilityMatch(\n searchable,\n criteria.accessibleName,\n criteria.fuzzy !== false,\n fuzzyConfig.threshold\n );\n scores.accessibility = accessibilityScore.score;\n if (accessibilityScore.score > 0) {\n matchReasons.push(...accessibilityScore.reasons);\n }\n weightedScore += accessibilityScore.score * this.config.accessibilityWeight;\n totalWeight += this.config.accessibilityWeight;\n }\n\n // Role matching\n if (criteria.role) {\n const roleScore = this.scoreRoleMatch(searchable, criteria.role);\n scores.role = roleScore.score;\n if (roleScore.score > 0) {\n matchReasons.push(...roleScore.reasons);\n }\n weightedScore += roleScore.score * this.config.roleWeight;\n totalWeight += this.config.roleWeight;\n }\n\n // Type matching\n if (criteria.type) {\n const typeMatch = searchable.type.toLowerCase() === criteria.type.toLowerCase();\n if (typeMatch) {\n matchReasons.push(`type: ${criteria.type}`);\n weightedScore += 1.0 * this.config.roleWeight;\n totalWeight += this.config.roleWeight;\n }\n }\n\n // Spatial matching (near)\n if (criteria.near) {\n const spatialScore = this.scoreSpatialMatch(searchable, criteria.near);\n scores.spatial = spatialScore.score;\n if (spatialScore.score > 0) {\n matchReasons.push(...spatialScore.reasons);\n }\n weightedScore += spatialScore.score * this.config.spatialWeight;\n totalWeight += this.config.spatialWeight;\n }\n\n // Placeholder matching\n if (criteria.placeholder && searchable.placeholder) {\n const placeholderResult = fuzzyMatch(\n searchable.placeholder,\n criteria.placeholder,\n fuzzyConfig\n );\n if (placeholderResult.isMatch) {\n matchReasons.push(`placeholder matches`);\n weightedScore += placeholderResult.similarity * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // Title matching\n if (criteria.title && searchable.title) {\n const titleResult = fuzzyMatch(searchable.title, criteria.title, fuzzyConfig);\n if (titleResult.isMatch) {\n matchReasons.push(`title matches`);\n weightedScore += titleResult.similarity * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // ID pattern matching\n if (criteria.idPattern) {\n const idMatch = this.matchPattern(searchable.id, criteria.idPattern);\n if (idMatch) {\n matchReasons.push(`id matches pattern`);\n weightedScore += 1.0 * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // Alias matching (always applied as a bonus)\n const aliasScore = this.scoreAliasMatch(searchable, criteria, fuzzyConfig.threshold);\n if (aliasScore.score > 0) {\n scores.fuzzy = aliasScore.score;\n matchReasons.push(...aliasScore.reasons);\n weightedScore += aliasScore.score * this.config.aliasWeight;\n totalWeight += this.config.aliasWeight;\n }\n\n // Calculate final confidence\n const confidence = totalWeight > 0 ? weightedScore / totalWeight : 0;\n\n // Convert to AIDiscoveredElement\n const aiElement = this.toAIDiscoveredElement(searchable);\n\n return {\n element: aiElement,\n confidence,\n matchReasons,\n scores,\n };\n }\n\n /**\n * Score text match\n */\n private scoreTextMatch(\n searchable: SearchableElement,\n text: string,\n fuzzy: boolean,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const textsToMatch = [searchable.textContent, searchable.labelText, searchable.value].filter(\n Boolean\n ) as string[];\n\n for (const targetText of textsToMatch) {\n // Exact match\n if (targetText.toLowerCase() === text.toLowerCase()) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push('exact text match');\n continue;\n }\n\n // Fuzzy match\n if (fuzzy) {\n const result = fuzzyMatch(targetText, text, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`text similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n\n // Word-level match\n const wordSim = wordSimilarity(targetText, text, { threshold });\n if (wordSim > maxScore && wordSim >= threshold) {\n maxScore = wordSim;\n reasons.push(`word match: ${(wordSim * 100).toFixed(0)}%`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score contains match\n */\n private scoreContainsMatch(\n searchable: SearchableElement,\n text: string,\n fuzzy: boolean\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const textsToMatch = [\n searchable.textContent,\n searchable.labelText,\n searchable.ariaLabel,\n ].filter(Boolean) as string[];\n\n for (const targetText of textsToMatch) {\n // Exact contains\n if (targetText.toLowerCase().includes(text.toLowerCase())) {\n maxScore = Math.max(maxScore, 0.9);\n reasons.push('text contains match');\n continue;\n }\n\n // Fuzzy contains\n if (fuzzy && fuzzyContains(targetText, text)) {\n maxScore = Math.max(maxScore, 0.7);\n reasons.push('fuzzy contains match');\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score accessibility match\n */\n private scoreAccessibilityMatch(\n searchable: SearchableElement,\n name: string,\n fuzzy: boolean,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const accessibleNames = [\n searchable.ariaLabel,\n searchable.ariaLabelledBy,\n searchable.labelText,\n searchable.title,\n ].filter(Boolean) as string[];\n\n for (const accessibleName of accessibleNames) {\n // Exact match\n if (accessibleName.toLowerCase() === name.toLowerCase()) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push('exact accessible name match');\n continue;\n }\n\n // Fuzzy match\n if (fuzzy) {\n const result = fuzzyMatch(accessibleName, name, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`accessible name similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score role match\n */\n private scoreRoleMatch(\n searchable: SearchableElement,\n role: string\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n const normalizedRole = role.toLowerCase();\n\n // Direct role match\n if (searchable.role?.toLowerCase() === normalizedRole) {\n return { score: 1.0, reasons: [`role: ${role}`] };\n }\n\n // Tag-based role inference\n const tagRoleMap: Record<string, string[]> = {\n button: ['button', 'input[type=button]', 'input[type=submit]'],\n textbox: ['input', 'textarea'],\n checkbox: ['input[type=checkbox]'],\n radio: ['input[type=radio]'],\n link: ['a'],\n listbox: ['select'],\n combobox: ['select', 'input[list]'],\n navigation: ['nav'],\n main: ['main'],\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n };\n\n const inferredRoles = tagRoleMap[normalizedRole] || [];\n if (\n inferredRoles.some(\n (r) => searchable.tagName === r || searchable.type.toLowerCase() === normalizedRole\n )\n ) {\n return { score: 0.8, reasons: [`inferred role: ${role}`] };\n }\n\n return { score: 0, reasons };\n }\n\n /**\n * Score spatial match (proximity to another element)\n */\n private scoreSpatialMatch(\n searchable: SearchableElement,\n nearId: string\n ): { score: number; reasons: string[] } {\n // Find the reference element\n const reference = this.cachedElements.find((el) => el.id === nearId);\n if (!reference) {\n return { score: 0, reasons: [] };\n }\n\n // Calculate distance between elements\n const distance = this.calculateDistance(searchable.rect, reference.rect);\n\n // Score based on distance (closer = higher score)\n // Assuming 200px as \"near\" threshold\n const nearThreshold = 200;\n if (distance > nearThreshold * 3) {\n return { score: 0, reasons: [] };\n }\n\n const score = Math.max(0, 1 - distance / (nearThreshold * 3));\n return {\n score,\n reasons: [`${distance.toFixed(0)}px from ${nearId}`],\n };\n }\n\n /**\n * Calculate distance between two element rectangles\n */\n private calculateDistance(rect1: ElementState['rect'], rect2: ElementState['rect']): number {\n const center1 = {\n x: rect1.x + rect1.width / 2,\n y: rect1.y + rect1.height / 2,\n };\n const center2 = {\n x: rect2.x + rect2.width / 2,\n y: rect2.y + rect2.height / 2,\n };\n\n return Math.sqrt(Math.pow(center1.x - center2.x, 2) + Math.pow(center1.y - center2.y, 2));\n }\n\n /**\n * Score alias match\n */\n private scoreAliasMatch(\n searchable: SearchableElement,\n criteria: SearchCriteria,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n // Build search terms from criteria\n const searchTerms: string[] = [];\n if (criteria.text) searchTerms.push(criteria.text);\n if (criteria.textContains) searchTerms.push(criteria.textContains);\n if (criteria.accessibleName) searchTerms.push(criteria.accessibleName);\n\n for (const searchTerm of searchTerms) {\n const termLower = searchTerm.toLowerCase();\n\n for (const alias of searchable.aliases) {\n // Exact alias match\n if (alias === termLower) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push(`alias match: \"${alias}\"`);\n continue;\n }\n\n // Synonym match\n const searchWords = termLower.split(/\\s+/);\n const aliasWords = alias.split(/\\s+/);\n\n for (const searchWord of searchWords) {\n for (const aliasWord of aliasWords) {\n if (areSynonyms(searchWord, aliasWord)) {\n maxScore = Math.max(maxScore, 0.85);\n reasons.push(`synonym match: \"${searchWord}\" ~ \"${aliasWord}\"`);\n }\n }\n }\n\n // Fuzzy alias match\n const result = fuzzyMatch(alias, termLower, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`fuzzy alias: \"${alias}\" (${(result.similarity * 100).toFixed(0)}%)`);\n }\n\n // Token similarity\n const tokenSim = tokenSimilarity(alias, termLower);\n if (tokenSim > maxScore && tokenSim >= threshold) {\n maxScore = tokenSim;\n reasons.push(`token match: \"${alias}\"`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Match a string against a pattern (supports * wildcard)\n */\n private matchPattern(str: string, pattern: string): boolean {\n const regexPattern = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\\\\\*/g, '.*');\n return new RegExp(`^${regexPattern}$`, 'i').test(str);\n }\n\n /**\n * Convert searchable element to AI discovered element\n */\n private toAIDiscoveredElement(searchable: SearchableElement): AIDiscoveredElement {\n const discoveredBase: DiscoveredElement =\n 'getState' in searchable.element\n ? {\n id: searchable.id,\n type: searchable.type,\n label: (searchable.element as RegisteredElement).label,\n tagName: searchable.tagName,\n role: searchable.role,\n accessibleName: searchable.ariaLabel,\n actions: (searchable.element as RegisteredElement).actions,\n state: searchable.state,\n registered: true,\n }\n : (searchable.element as DiscoveredElement);\n\n return {\n ...discoveredBase,\n description: searchable.description,\n aliases: searchable.aliases,\n purpose: generatePurpose({\n textContent: searchable.textContent,\n ariaLabel: searchable.ariaLabel,\n elementType: searchable.type,\n tagName: searchable.tagName,\n }),\n parentContext: undefined, // Would need DOM traversal\n suggestedActions: generateSuggestedActions({\n textContent: searchable.textContent,\n ariaLabel: searchable.ariaLabel,\n elementType: searchable.type,\n tagName: searchable.tagName,\n }),\n semanticType: this.inferSemanticType(searchable),\n labelText: searchable.labelText,\n placeholder: searchable.placeholder,\n title: searchable.title,\n };\n }\n\n /**\n * Infer a semantic type for the element\n */\n private inferSemanticType(searchable: SearchableElement): string {\n const text = (searchable.textContent || searchable.ariaLabel || '').toLowerCase();\n const type = searchable.type.toLowerCase();\n\n // Form-related\n if (type === 'input' || type === 'textarea') {\n if (searchable.placeholder?.toLowerCase().includes('email') || text.includes('email')) {\n return 'email-input';\n }\n if (searchable.placeholder?.toLowerCase().includes('password') || text.includes('password')) {\n return 'password-input';\n }\n if (searchable.placeholder?.toLowerCase().includes('search') || text.includes('search')) {\n return 'search-input';\n }\n return 'text-input';\n }\n\n // Button types\n if (type === 'button') {\n if (text.match(/submit|save|confirm|ok|done|apply/)) return 'submit-button';\n if (text.match(/cancel|close|dismiss/)) return 'cancel-button';\n if (text.match(/delete|remove|trash/)) return 'delete-button';\n if (text.match(/add|create|new|\\+/)) return 'add-button';\n if (text.match(/edit|modify/)) return 'edit-button';\n if (text.match(/next|continue/)) return 'next-button';\n if (text.match(/back|previous/)) return 'back-button';\n return 'action-button';\n }\n\n // Navigation\n if (type === 'link') {\n if (text.match(/home|dashboard/)) return 'home-link';\n if (text.match(/login|sign.?in/)) return 'login-link';\n if (text.match(/logout|sign.?out/)) return 'logout-link';\n return 'navigation-link';\n }\n\n return type;\n }\n}\n\n/**\n * Create a default search engine instance\n */\nexport function createSearchEngine(config?: Partial<SearchEngineConfig>): SearchEngine {\n return new SearchEngine(config);\n}\n","/**\n * Assertions Module\n *\n * Provides verification/assertion API for AI agents to validate\n * page state without writing Playwright tests.\n */\n\nimport type { ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SearchCriteria,\n SearchResult,\n AIDiscoveredElement,\n} from './types';\nimport { SearchEngine } from './search-engine';\n\n/**\n * Configuration for assertions\n */\nexport interface AssertionConfig {\n /** Default timeout for wait-based assertions */\n defaultTimeout: number;\n /** Polling interval for wait-based assertions */\n pollInterval: number;\n /** Default fuzzy threshold for element search */\n fuzzyThreshold: number;\n /** Include suggestions in failure messages */\n includeSuggestions: boolean;\n}\n\n/**\n * Default assertion configuration\n */\nexport const DEFAULT_ASSERTION_CONFIG: AssertionConfig = {\n defaultTimeout: 5000,\n pollInterval: 100,\n fuzzyThreshold: 0.7,\n includeSuggestions: true,\n};\n\n/**\n * Assertion executor class\n */\nexport class AssertionExecutor {\n private config: AssertionConfig;\n private searchEngine: SearchEngine;\n private elements: Array<DiscoveredElement | AIDiscoveredElement> = [];\n\n constructor(config: Partial<AssertionConfig> = {}) {\n this.config = { ...DEFAULT_ASSERTION_CONFIG, ...config };\n this.searchEngine = new SearchEngine({ fuzzyThreshold: this.config.fuzzyThreshold });\n }\n\n /**\n * Update available elements for assertions\n */\n updateElements(elements: Array<DiscoveredElement | AIDiscoveredElement>): void {\n this.elements = elements;\n this.searchEngine.updateElements(elements);\n }\n\n /**\n * Execute a single assertion\n */\n async assert(request: AssertionRequest): Promise<AssertionResult> {\n const startTime = performance.now();\n const timeout = request.timeout ?? this.config.defaultTimeout;\n\n // Find the target element with full search metadata\n const searchResult = this.findElementDetailed(request.target, request.fuzzy !== false);\n const element = searchResult?.element ?? null;\n const searchDetails = searchResult\n ? {\n confidence: searchResult.confidence,\n matchReasons: searchResult.matchReasons,\n candidateCount: this.elements.length,\n }\n : undefined;\n\n if (!element && request.type !== 'notExists') {\n const result = this.createResult(\n false,\n typeof request.target === 'string' ? request.target : JSON.stringify(request.target),\n 'element not found',\n request.type === 'exists' ? true : request.expected,\n null,\n 'Element could not be found',\n this.config.includeSuggestions\n ? 'Check if the element exists and is properly labeled'\n : undefined,\n startTime\n );\n // Attach search details even for not-found (candidateCount helps AI understand scope)\n if (searchDetails) {\n result.searchDetails = searchDetails;\n }\n return result;\n }\n\n // Execute the assertion based on type\n const result = await this.executeAssertion(request, element, timeout, startTime);\n // Attach search details to the result\n if (searchDetails) {\n result.searchDetails = searchDetails;\n }\n return result;\n }\n\n /**\n * Execute multiple assertions\n */\n async assertBatch(request: BatchAssertionRequest): Promise<BatchAssertionResult> {\n const startTime = performance.now();\n const results: AssertionResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n\n for (const assertion of request.assertions) {\n const result = await this.assert(assertion);\n results.push(result);\n\n if (result.passed) {\n passedCount++;\n } else {\n failedCount++;\n\n // Stop on first failure if configured\n if (request.stopOnFailure) {\n // Mark remaining assertions as skipped\n break;\n }\n }\n }\n\n // Determine overall pass/fail\n const passed = request.mode === 'all' ? failedCount === 0 : passedCount > 0;\n\n return {\n passed,\n results,\n passedCount,\n failedCount,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Convenience method: assert element is visible\n */\n async assertVisible(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'visible', timeout });\n }\n\n /**\n * Convenience method: assert element is hidden\n */\n async assertHidden(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'hidden', timeout });\n }\n\n /**\n * Convenience method: assert element is enabled\n */\n async assertEnabled(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'enabled', timeout });\n }\n\n /**\n * Convenience method: assert element is disabled\n */\n async assertDisabled(\n target: string | SearchCriteria,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'disabled', timeout });\n }\n\n /**\n * Convenience method: assert element has text\n */\n async assertHasText(\n target: string | SearchCriteria,\n text: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'hasText', expected: text, timeout });\n }\n\n /**\n * Convenience method: assert element contains text\n */\n async assertContainsText(\n target: string | SearchCriteria,\n text: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'containsText', expected: text, timeout });\n }\n\n /**\n * Convenience method: assert element has value\n */\n async assertHasValue(\n target: string | SearchCriteria,\n value: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'hasValue', expected: value, timeout });\n }\n\n /**\n * Convenience method: assert element exists\n */\n async assertExists(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'exists', timeout });\n }\n\n /**\n * Convenience method: assert element does not exist\n */\n async assertNotExists(\n target: string | SearchCriteria,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'notExists', timeout });\n }\n\n /**\n * Convenience method: assert checkbox is checked\n */\n async assertChecked(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'checked', timeout });\n }\n\n /**\n * Convenience method: assert checkbox is unchecked\n */\n async assertUnchecked(\n target: string | SearchCriteria,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'unchecked', timeout });\n }\n\n /**\n * Convenience method: assert element count\n */\n async assertCount(\n target: SearchCriteria,\n expectedCount: number,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'count', expected: expectedCount, timeout });\n }\n\n /**\n * Find element by target with full search metadata.\n * Returns the SearchResult (including confidence, matchReasons, scores)\n * or null if no match above the fuzzy threshold.\n */\n private findElementDetailed(\n target: string | SearchCriteria,\n fuzzy: boolean = true\n ): SearchResult | null {\n const criteria: SearchCriteria =\n typeof target === 'string' ? { text: target, fuzzy } : { ...target, fuzzy };\n\n const searchResult = this.searchEngine.findBest(criteria, this.elements);\n\n if (searchResult && searchResult.confidence >= this.config.fuzzyThreshold) {\n return searchResult;\n }\n\n return null;\n }\n\n /**\n * Find element by target (string or criteria).\n * Public for use by condition evaluation in SpecExecutor.\n */\n public async findElement(\n target: string | SearchCriteria,\n fuzzy: boolean = true\n ): Promise<AIDiscoveredElement | null> {\n const result = this.findElementDetailed(target, fuzzy);\n return result?.element ?? null;\n }\n\n /**\n * Execute the actual assertion\n */\n private async executeAssertion(\n request: AssertionRequest,\n element: AIDiscoveredElement | null,\n timeout: number,\n startTime: number\n ): Promise<AssertionResult> {\n const targetStr =\n typeof request.target === 'string' ? request.target : JSON.stringify(request.target);\n\n const elementDescription = element?.description || targetStr;\n\n switch (request.type) {\n case 'visible':\n return this.assertVisibility(\n element!,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hidden':\n return this.assertVisibility(\n element!,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'enabled':\n return this.assertEnabledState(\n element!,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'disabled':\n return this.assertEnabledState(\n element!,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'focused':\n return this.assertFocused(element!, elementDescription, request.message, startTime);\n\n case 'checked':\n return this.assertCheckedState(\n element!,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'unchecked':\n return this.assertCheckedState(\n element!,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasText':\n return this.assertTextMatch(\n element!,\n request.expected as string,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'containsText':\n return this.assertTextMatch(\n element!,\n request.expected as string,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasValue':\n return this.assertValue(\n element!,\n request.expected as string,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'exists':\n return this.createResult(\n element !== null,\n targetStr,\n elementDescription,\n true,\n element !== null,\n element === null ? 'Element does not exist' : undefined,\n undefined,\n startTime,\n element?.state\n );\n\n case 'notExists':\n return this.createResult(\n element === null,\n targetStr,\n elementDescription,\n false,\n element === null,\n element !== null ? 'Element exists but should not' : undefined,\n undefined,\n startTime,\n element?.state\n );\n\n case 'count':\n return this.assertElementCount(\n request.target as SearchCriteria,\n request.expected as number,\n targetStr,\n request.message,\n startTime\n );\n\n case 'attribute':\n return this.assertAttribute(\n element!,\n request.attributeName!,\n request.expected,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasClass':\n return this.assertHasClass(\n element!,\n request.expected as string,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'cssProperty':\n return this.assertCssProperty(\n element!,\n request.propertyName!,\n request.expected,\n elementDescription,\n request.message,\n startTime\n );\n\n default:\n return this.createResult(\n false,\n targetStr,\n elementDescription,\n undefined,\n undefined,\n `Unknown assertion type: ${request.type}`,\n undefined,\n startTime\n );\n }\n }\n\n /**\n * Assert visibility state\n */\n private assertVisibility(\n element: AIDiscoveredElement,\n expectedVisible: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isVisible = element.state.visible;\n const passed = isVisible === expectedVisible;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedVisible,\n isVisible,\n passed\n ? undefined\n : message ||\n `Element is ${isVisible ? 'visible' : 'hidden'} but expected ${expectedVisible ? 'visible' : 'hidden'}`,\n passed ? undefined : 'Check if element is covered by another element or has display:none',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert enabled state\n */\n private assertEnabledState(\n element: AIDiscoveredElement,\n expectedEnabled: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isEnabled = element.state.enabled;\n const passed = isEnabled === expectedEnabled;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedEnabled,\n isEnabled,\n passed\n ? undefined\n : message ||\n `Element is ${isEnabled ? 'enabled' : 'disabled'} but expected ${expectedEnabled ? 'enabled' : 'disabled'}`,\n passed ? undefined : 'Check if the element has a disabled attribute or aria-disabled',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert focused state\n */\n private assertFocused(\n element: AIDiscoveredElement,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isFocused = element.state.focused;\n\n return this.createResult(\n isFocused,\n element.id,\n description,\n true,\n isFocused,\n isFocused ? undefined : message || 'Element is not focused',\n isFocused ? undefined : 'Click or focus the element first',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert checked state\n */\n private assertCheckedState(\n element: AIDiscoveredElement,\n expectedChecked: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isChecked = element.state.checked ?? false;\n const passed = isChecked === expectedChecked;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedChecked,\n isChecked,\n passed\n ? undefined\n : message ||\n `Element is ${isChecked ? 'checked' : 'unchecked'} but expected ${expectedChecked ? 'checked' : 'unchecked'}`,\n passed ? undefined : 'Click the checkbox to change its state',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert text content\n */\n private assertTextMatch(\n element: AIDiscoveredElement,\n expectedText: string,\n exact: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const actualText = element.state.textContent || '';\n const passed = exact ? actualText === expectedText : actualText.includes(expectedText);\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedText,\n actualText,\n passed\n ? undefined\n : message ||\n (exact\n ? `Text \"${actualText}\" does not match expected \"${expectedText}\"`\n : `Text \"${actualText}\" does not contain \"${expectedText}\"`),\n passed ? undefined : 'Verify the element contains the expected text',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert input value\n */\n private assertValue(\n element: AIDiscoveredElement,\n expectedValue: string,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const actualValue = element.state.value || '';\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed\n ? undefined\n : message || `Value \"${actualValue}\" does not match expected \"${expectedValue}\"`,\n passed ? undefined : 'Type the expected value into the input',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert element count\n */\n private assertElementCount(\n criteria: SearchCriteria,\n expectedCount: number,\n targetStr: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const searchResponse = this.searchEngine.search(criteria);\n const actualCount = searchResponse.results.length;\n const passed = actualCount === expectedCount;\n\n return this.createResult(\n passed,\n targetStr,\n `${actualCount} elements matching criteria`,\n expectedCount,\n actualCount,\n passed ? undefined : message || `Found ${actualCount} elements but expected ${expectedCount}`,\n passed ? undefined : 'Adjust search criteria or wait for elements to load',\n startTime\n );\n }\n\n /**\n * Assert attribute value (placeholder for DOM attribute assertions)\n */\n private assertAttribute(\n element: AIDiscoveredElement,\n attributeName: string,\n expectedValue: unknown,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n // Note: Would need DOM access for actual attribute checking\n // For now, handle known attributes from state\n let actualValue: unknown;\n\n switch (attributeName.toLowerCase()) {\n case 'placeholder':\n actualValue = element.placeholder;\n break;\n case 'title':\n actualValue = element.title;\n break;\n default:\n return this.createResult(\n false,\n element.id,\n description,\n expectedValue,\n undefined,\n `Cannot check attribute \"${attributeName}\" without DOM access`,\n 'Use the server API to check element attributes',\n startTime,\n element.state\n );\n }\n\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed\n ? undefined\n : message ||\n `Attribute \"${attributeName}\" is \"${actualValue}\" but expected \"${expectedValue}\"`,\n undefined,\n startTime,\n element.state\n );\n }\n\n /**\n * Assert element has CSS class\n */\n private assertHasClass(\n element: AIDiscoveredElement,\n className: string,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n // Note: Would need DOM access for actual class checking\n return this.createResult(\n false,\n element.id,\n description,\n className,\n undefined,\n 'Cannot check CSS classes without DOM access',\n 'Use the server API to check element classes',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert CSS property value\n */\n private assertCssProperty(\n element: AIDiscoveredElement,\n propertyName: string,\n expectedValue: unknown,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const computedStyles = element.state.computedStyles;\n if (!computedStyles) {\n return this.createResult(\n false,\n element.id,\n description,\n expectedValue,\n undefined,\n 'Computed styles not available',\n 'Request element state with computed styles',\n startTime,\n element.state\n );\n }\n\n const styleKey = propertyName as keyof typeof computedStyles;\n const actualValue = computedStyles[styleKey];\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed\n ? undefined\n : message ||\n `CSS property \"${propertyName}\" is \"${actualValue}\" but expected \"${expectedValue}\"`,\n undefined,\n startTime,\n element.state\n );\n }\n\n /**\n * Create an assertion result\n */\n private createResult(\n passed: boolean,\n target: string,\n targetDescription: string,\n expected: unknown,\n actual: unknown,\n failureReason?: string,\n suggestion?: string,\n startTime: number = performance.now(),\n elementState?: ElementState\n ): AssertionResult {\n return {\n passed,\n target,\n targetDescription,\n expected,\n actual,\n failureReason,\n suggestion: this.config.includeSuggestions ? suggestion : undefined,\n elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Create a default assertion executor\n */\nexport function createAssertionExecutor(config?: Partial<AssertionConfig>): AssertionExecutor {\n return new AssertionExecutor(config);\n}\n","/**\n * Spec Executor\n *\n * Converts SpecAssertions to AssertionRequests and delegates\n * to the existing AssertionExecutor from ui-bridge/ai.\n */\n\nimport type { AssertionRequest, SearchCriteria } from '../ai/types';\nimport { AssertionExecutor, type AssertionConfig } from '../ai/assertions';\nimport type { DiscoveredElement } from '../control/types';\nimport type { AIDiscoveredElement } from '../ai/types';\nimport type {\n SpecConfig,\n SpecGroup,\n SpecAssertion,\n SpecTarget,\n SpecAssertionResult,\n SpecGroupResult,\n SpecExecutionResult,\n SpecExecutionOptions,\n AssertionCondition,\n} from './types';\nimport { SPEC_CONFIG_VERSION } from './types';\n\n// =============================================================================\n// Target Resolution\n// =============================================================================\n\n/**\n * Resolve a SpecTarget to an AssertionRequest target.\n *\n * For elementId targets, returns a SearchCriteria with idPattern for exact\n * ID matching rather than a raw string (which would be treated as a text search).\n */\nexport function resolveTarget(target: SpecTarget): string | SearchCriteria {\n switch (target.type) {\n case 'elementId':\n // Use exact ID pattern match instead of text search.\n // A raw string would become { text: \"id-value\", fuzzy: true } which fails\n // for elements with no matching text content (e.g. container elements).\n return { idPattern: target.elementId, fuzzy: false };\n case 'search':\n return target.criteria;\n }\n}\n\n// =============================================================================\n// Executor\n// =============================================================================\n\nexport class SpecExecutor {\n private assertionExecutor: AssertionExecutor;\n\n constructor(config?: Partial<AssertionConfig>) {\n this.assertionExecutor = new AssertionExecutor(config);\n }\n\n /**\n * Update the element registry (pass-through to AssertionExecutor).\n */\n updateElements(elements: Array<DiscoveredElement | AIDiscoveredElement>): void {\n this.assertionExecutor.updateElements(elements);\n }\n\n /**\n * Convert a SpecAssertion to an AssertionRequest.\n */\n toAssertionRequest(assertion: SpecAssertion): AssertionRequest {\n return {\n target: resolveTarget(assertion.target),\n type: assertion.assertionType,\n expected: assertion.expected,\n attributeName: assertion.attributeName,\n propertyName: assertion.propertyName,\n timeout: assertion.timeout,\n message: assertion.message,\n };\n }\n\n /**\n * Evaluate a condition to determine if an assertion should be executed.\n * Returns true if the condition is met (assertion should run),\n * false if condition is not met (assertion should skip/pass).\n */\n private async evaluateCondition(condition: AssertionCondition): Promise<boolean> {\n const target = resolveTarget(condition.target);\n // Use non-fuzzy search for conditions to prevent false positives\n // (e.g. \"Connected\" fuzzy-matching \"Disconnected\")\n const element = await this.assertionExecutor.findElement(target, false);\n\n switch (condition.type) {\n case 'exists':\n return element !== null;\n case 'notExists':\n return element === null;\n case 'hasText': {\n if (!element) return false;\n // Check state.textContent first (actual element text), then accessible properties\n const textContent =\n element.state?.textContent ||\n element.accessibleName ||\n element.label ||\n element.description ||\n '';\n return textContent.toLowerCase().includes(condition.text.toLowerCase());\n }\n default:\n // Unknown condition type - evaluate the assertion\n return true;\n }\n }\n\n /**\n * Execute a single SpecAssertion.\n */\n async executeAssertion(assertion: SpecAssertion): Promise<SpecAssertionResult> {\n if (!assertion.enabled) {\n return {\n assertionId: assertion.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: true,\n result: null,\n };\n }\n\n // Check condition if present - skip assertion if condition is not met\n // This implements \"A when B\" logic: only evaluate A if B is true\n if (assertion.condition) {\n const conditionMet = await this.evaluateCondition(assertion.condition);\n if (!conditionMet) {\n // Condition not met - skip this assertion (no opinion)\n return {\n assertionId: assertion.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: true,\n skipReason: 'condition_not_met',\n result: null,\n };\n }\n }\n\n const request = this.toAssertionRequest(assertion);\n const result = await this.assertionExecutor.assert(request);\n\n return {\n assertionId: assertion.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: false,\n result,\n };\n }\n\n /**\n * Execute all assertions in a SpecGroup.\n */\n async executeGroup(group: SpecGroup, options?: SpecExecutionOptions): Promise<SpecGroupResult> {\n const startTime = Date.now();\n const assertionResults: SpecAssertionResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n\n for (const assertion of group.assertions) {\n if (shouldSkip(assertion, options)) {\n assertionResults.push({\n assertionId: assertion.id,\n groupId: group.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: true,\n result: null,\n });\n skippedCount++;\n continue;\n }\n\n const result = await this.executeAssertion(assertion);\n result.groupId = group.id;\n assertionResults.push(result);\n\n if (result.skipped) {\n skippedCount++;\n } else if (result.result?.passed) {\n passedCount++;\n } else {\n failedCount++;\n if (options?.stopOnFailure) break;\n }\n }\n\n return {\n groupId: group.id,\n groupName: group.name,\n assertionResults,\n passedCount,\n failedCount,\n skippedCount,\n passed: failedCount === 0,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Execute a full SpecConfig.\n */\n async execute(config: SpecConfig, options?: SpecExecutionOptions): Promise<SpecExecutionResult> {\n const startTime = Date.now();\n\n // Execute groups\n const groupResults: SpecGroupResult[] = [];\n for (const group of config.groups) {\n if (options?.groupIds && !options.groupIds.includes(group.id)) continue;\n\n const groupResult = await this.executeGroup(group, options);\n groupResults.push(groupResult);\n\n if (options?.stopOnFailure && !groupResult.passed) break;\n }\n\n // Execute ungrouped assertions\n const ungroupedResults: SpecAssertionResult[] = [];\n if (config.assertions) {\n for (const assertion of config.assertions) {\n if (shouldSkip(assertion, options)) {\n ungroupedResults.push({\n assertionId: assertion.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: true,\n result: null,\n });\n continue;\n }\n\n const result = await this.executeAssertion(assertion);\n ungroupedResults.push(result);\n\n if (options?.stopOnFailure && !result.skipped && !result.result?.passed) break;\n }\n }\n\n // Aggregate counts\n let passedCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n\n for (const gr of groupResults) {\n passedCount += gr.passedCount;\n failedCount += gr.failedCount;\n skippedCount += gr.skippedCount;\n }\n for (const ur of ungroupedResults) {\n if (ur.skipped) skippedCount++;\n else if (ur.result?.passed) passedCount++;\n else failedCount++;\n }\n\n return {\n specVersion: config.version ?? SPEC_CONFIG_VERSION,\n groupResults,\n ungroupedResults,\n totalAssertions: passedCount + failedCount + skippedCount,\n passedCount,\n failedCount,\n skippedCount,\n passed: failedCount === 0,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n };\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction shouldSkip(assertion: SpecAssertion, options?: SpecExecutionOptions): boolean {\n if (!assertion.enabled) return true;\n if (options?.assertionIds && !options.assertionIds.includes(assertion.id)) return true;\n if (options?.categories && !options.categories.includes(assertion.category)) return true;\n if (options?.severities && !options.severities.includes(assertion.severity)) return true;\n if (options?.skipUnreviewed && !assertion.reviewed) return true;\n return false;\n}\n"]}
|