@generative-a11y/dom 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/dist/index.cjs +18 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -91,13 +91,20 @@ on that fallback path.
|
|
|
91
91
|
- `status`: `"notified"`, `"mutated"`, `"unavailable"`, or `"disposed"`.
|
|
92
92
|
- `method`: `"aria-notify"`, `"live-region"`, or `"none"`.
|
|
93
93
|
- `channel`: the selected core announcement channel.
|
|
94
|
+
- `announcementId`, `sourceType`, `at`, and any source/entity IDs from the
|
|
95
|
+
intent, so diagnostic consumers can correlate a DOM action with the runtime
|
|
96
|
+
decision that requested it. `at` is the core intent timestamp, not a DOM
|
|
97
|
+
delivery or speech timestamp.
|
|
94
98
|
- `error`, when notifier invocation failed, with serializable `name` and
|
|
95
99
|
`message` strings.
|
|
96
100
|
|
|
97
101
|
`DOMLiveRegions` contains the stable outer `polite` and `assertive` elements.
|
|
98
102
|
Live-region delivery sets or clears `lang` from the intent locale and replaces
|
|
99
103
|
the region's text content on every delivery, including repeated identical text.
|
|
100
|
-
Announcement strings are inserted as literal text, never HTML.
|
|
104
|
+
Announcement strings are inserted as literal text, never HTML. The result
|
|
105
|
+
records a browser/API action only; even a correlated successful `ariaNotify()`
|
|
106
|
+
call or live-region mutation does not establish that assistive technology spoke
|
|
107
|
+
the announcement.
|
|
101
108
|
|
|
102
109
|
## Observe attention signals
|
|
103
110
|
|
|
@@ -315,3 +322,16 @@ recreates, or disposes an active runtime. `"preset"` fields inherit the selected
|
|
|
315
322
|
core preset; granular values override only text strategy or tool-event flags,
|
|
316
323
|
leaving timing and progress thresholds inherited. The `"completion-only"`
|
|
317
324
|
preference returns that preset without granular policy overrides.
|
|
325
|
+
|
|
326
|
+
## Documentation
|
|
327
|
+
|
|
328
|
+
- [DOM API reference](https://generativea11y.com/api/dom)
|
|
329
|
+
- [ARIA live regions for generative AI](https://generativea11y.com/docs/aria-live-and-generative-ai)
|
|
330
|
+
- [GitHub repository](https://github.com/bhaveshchow20/generative-a11y)
|
|
331
|
+
|
|
332
|
+
## Related packages
|
|
333
|
+
|
|
334
|
+
- [`@generative-a11y/core`](https://www.npmjs.com/package/@generative-a11y/core)
|
|
335
|
+
prepares paced announcement intents.
|
|
336
|
+
- [`@generative-a11y/react`](https://www.npmjs.com/package/@generative-a11y/react)
|
|
337
|
+
connects core and DOM delivery to React applications.
|
package/dist/index.cjs
CHANGED
|
@@ -823,7 +823,8 @@ function createDOMAnnouncer(options = {}) {
|
|
|
823
823
|
return report({
|
|
824
824
|
status: "disposed",
|
|
825
825
|
method: "none",
|
|
826
|
-
channel: intent.channel
|
|
826
|
+
channel: intent.channel,
|
|
827
|
+
...deliveryContext(intent)
|
|
827
828
|
});
|
|
828
829
|
}
|
|
829
830
|
if (regions) {
|
|
@@ -848,7 +849,8 @@ function createDOMAnnouncer(options = {}) {
|
|
|
848
849
|
return report({
|
|
849
850
|
status: "notified",
|
|
850
851
|
method: "aria-notify",
|
|
851
|
-
channel: intent.channel
|
|
852
|
+
channel: intent.channel,
|
|
853
|
+
...deliveryContext(intent)
|
|
852
854
|
});
|
|
853
855
|
}
|
|
854
856
|
}
|
|
@@ -857,13 +859,15 @@ function createDOMAnnouncer(options = {}) {
|
|
|
857
859
|
status: "mutated",
|
|
858
860
|
method: "live-region",
|
|
859
861
|
channel: intent.channel,
|
|
862
|
+
...deliveryContext(intent),
|
|
860
863
|
...error === void 0 ? {} : { error }
|
|
861
864
|
});
|
|
862
865
|
}
|
|
863
866
|
return report({
|
|
864
867
|
status: "unavailable",
|
|
865
868
|
method: "none",
|
|
866
|
-
channel: intent.channel
|
|
869
|
+
channel: intent.channel,
|
|
870
|
+
...deliveryContext(intent)
|
|
867
871
|
});
|
|
868
872
|
},
|
|
869
873
|
getRegions() {
|
|
@@ -879,6 +883,17 @@ function createDOMAnnouncer(options = {}) {
|
|
|
879
883
|
}
|
|
880
884
|
};
|
|
881
885
|
}
|
|
886
|
+
function deliveryContext(intent) {
|
|
887
|
+
return {
|
|
888
|
+
announcementId: intent.id,
|
|
889
|
+
sourceType: intent.sourceType,
|
|
890
|
+
at: intent.at,
|
|
891
|
+
...intent.sourceEventId !== void 0 ? { sourceEventId: intent.sourceEventId } : {},
|
|
892
|
+
...intent.responseId !== void 0 ? { responseId: intent.responseId } : {},
|
|
893
|
+
...intent.toolId !== void 0 ? { toolId: intent.toolId } : {},
|
|
894
|
+
...intent.interactionId !== void 0 ? { interactionId: intent.interactionId } : {}
|
|
895
|
+
};
|
|
896
|
+
}
|
|
882
897
|
function validateSuppliedRegions(options) {
|
|
883
898
|
if (options.regions === void 0) return;
|
|
884
899
|
const { polite, assertive } = options.regions;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/composed-tree.ts","../src/attention.ts","../src/focus.ts","../src/preferences.ts"],"sourcesContent":["import type {\n AnnouncementIntent,\n GenerativeA11yRuntime,\n} from \"@generative-a11y/core\";\n\nexport {\n createAttentionStore,\n type AttentionIntersectionObserver,\n type AttentionIntersectionObserverFactory,\n type AttentionSnapshot,\n type AttentionStore,\n type AttentionStoreOptions,\n type ExternalStore,\n} from \"./attention.js\";\n\nexport {\n captureFocus,\n focusElement,\n restoreFocus,\n type FocusCapture,\n type FocusElementOptions,\n type FocusResult,\n type FocusSkippedReason,\n type RestoreFocusOptions,\n} from \"./focus.js\";\n\nexport {\n createPreferenceStore,\n defaultPreferences,\n normalizePreferences,\n preferencesToCoreConfiguration,\n type CorePreferenceConfiguration,\n type PreferenceDiagnostic,\n type PreferenceDiagnosticCode,\n type PreferenceDiagnosticSource,\n type PreferencePersistence,\n type PreferenceSchemaV1,\n type PreferenceStorage,\n type PreferenceStorageEvent,\n type PreferenceStorageEventSource,\n type PreferenceStore,\n type PreferenceStoreOptions,\n samePreferences,\n type StreamingVerbosity,\n type ToolVerbosity,\n} from \"./preferences.js\";\n\nexport type DOMAnnouncementMode = \"auto\" | \"aria-notify\" | \"live-region\";\n\nexport interface DOMLiveRegions {\n polite: HTMLElement;\n assertive: HTMLElement;\n}\n\nexport interface DOMDeliveryResult {\n status: \"notified\" | \"mutated\" | \"unavailable\" | \"disposed\";\n method: \"aria-notify\" | \"live-region\" | \"none\";\n channel: AnnouncementIntent[\"channel\"];\n error?: { name: string; message: string };\n}\n\nexport interface DOMAnnouncerOptions {\n document?: Document;\n mode?: DOMAnnouncementMode;\n regions?: DOMLiveRegions;\n onDiagnostic?: (result: DOMDeliveryResult) => void;\n}\n\nexport interface DOMAnnouncer {\n announce(intent: AnnouncementIntent): DOMDeliveryResult;\n getRegions(): DOMLiveRegions | undefined;\n dispose(): void;\n}\n\nexport interface DOMRuntimeBinding {\n announcer: DOMAnnouncer;\n dispose(): void;\n}\n\nexport function createDOMAnnouncer(\n options: DOMAnnouncerOptions = {},\n): DOMAnnouncer {\n validateSuppliedRegions(options);\n const selectedDocument =\n options.document ??\n options.regions?.polite.ownerDocument ??\n (typeof document === \"undefined\" ? undefined : document);\n const ownsRegions = options.regions === undefined;\n const regions = options.regions ?? createLiveRegions(selectedDocument);\n\n if (regions) {\n configureRegion(regions.polite, \"polite\");\n configureRegion(regions.assertive, \"assertive\");\n }\n let notifierEnabled = true;\n let disposed = false;\n\n const report = (result: DOMDeliveryResult): DOMDeliveryResult => {\n try {\n options.onDiagnostic?.(result);\n } catch {\n // Diagnostics are observational and cannot affect delivery.\n }\n return result;\n };\n\n return {\n announce(intent) {\n if (disposed) {\n return report({\n status: \"disposed\",\n method: \"none\",\n channel: intent.channel,\n });\n }\n if (regions) {\n const region = regions[intent.channel];\n applyLocale(region, intent.locale);\n let error: DOMDeliveryResult[\"error\"];\n if (notifierEnabled && options.mode !== \"live-region\") {\n let notified = false;\n try {\n const ariaNotify = (region as AriaNotifyRegion).ariaNotify;\n if (typeof ariaNotify === \"function\") {\n ariaNotify.call(region, intent.text, {\n priority: intent.channel === \"assertive\" ? \"high\" : \"normal\",\n });\n notified = true;\n }\n } catch (cause) {\n notifierEnabled = false;\n error = serializeError(cause);\n }\n if (notified) {\n return report({\n status: \"notified\",\n method: \"aria-notify\",\n channel: intent.channel,\n });\n }\n }\n region.textContent = intent.text;\n return report({\n status: \"mutated\",\n method: \"live-region\",\n channel: intent.channel,\n ...(error === undefined ? {} : { error }),\n });\n }\n return report({\n status: \"unavailable\",\n method: \"none\",\n channel: intent.channel,\n });\n },\n getRegions() {\n return regions;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (ownsRegions) {\n regions?.polite.remove();\n regions?.assertive.remove();\n }\n },\n };\n}\n\nfunction validateSuppliedRegions(options: DOMAnnouncerOptions): void {\n if (options.regions === undefined) return;\n const { polite, assertive } = options.regions;\n if (polite === assertive) {\n throw new TypeError(\n \"Polite and assertive regions must be distinct elements\",\n );\n }\n if (!polite.isConnected || !assertive.isConnected) {\n throw new TypeError(\"Supplied regions must be connected\");\n }\n if (polite.contains(assertive) || assertive.contains(polite)) {\n throw new TypeError(\n \"Polite and assertive regions must not contain one another\",\n );\n }\n if (polite.ownerDocument !== assertive.ownerDocument) {\n throw new TypeError(\n \"Polite and assertive regions must belong to the same document\",\n );\n }\n if (\n options.document !== undefined &&\n (polite.ownerDocument !== options.document ||\n assertive.ownerDocument !== options.document)\n ) {\n throw new TypeError(\n \"Supplied regions must belong to the provided document\",\n );\n }\n}\n\nfunction serializeError(\n error: unknown,\n): NonNullable<DOMDeliveryResult[\"error\"]> {\n try {\n if (error instanceof Error) {\n return {\n name: readErrorString(error, \"name\", \"Error\"),\n message: readErrorString(error, \"message\", \"Unknown error\"),\n };\n }\n } catch {\n // Hostile proxies can throw during instanceof checks.\n }\n return { name: \"Error\", message: safeString(error, \"Unknown error\") };\n}\n\nfunction readErrorString(\n error: Error,\n property: \"name\" | \"message\",\n fallback: string,\n): string {\n try {\n return safeString(error[property], fallback);\n } catch {\n return fallback;\n }\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\ninterface AriaNotifyRegion extends HTMLElement {\n ariaNotify?: (\n text: string,\n options?: { priority: \"normal\" | \"high\" },\n ) => void;\n}\n\nfunction createLiveRegions(\n selectedDocument: Document | undefined,\n): DOMLiveRegions | undefined {\n const parent = selectedDocument?.body ?? selectedDocument?.documentElement;\n if (!selectedDocument || !parent) return undefined;\n\n const regions = {\n polite: selectedDocument.createElement(\"div\"),\n assertive: selectedDocument.createElement(\"div\"),\n };\n parent.append(regions.polite, regions.assertive);\n return regions;\n}\n\nfunction configureRegion(\n region: HTMLElement,\n channel: AnnouncementIntent[\"channel\"],\n): void {\n region.removeAttribute(\"role\");\n region.removeAttribute(\"aria-busy\");\n region.removeAttribute(\"hidden\");\n region.removeAttribute(\"aria-hidden\");\n region.inert = false;\n region.removeAttribute(\"inert\");\n region.style.removeProperty(\"display\");\n region.style.removeProperty(\"visibility\");\n region.style.removeProperty(\"content-visibility\");\n region.setAttribute(\"aria-live\", channel);\n region.setAttribute(\"aria-atomic\", \"true\");\n region.setAttribute(\"aria-relevant\", \"additions text\");\n Object.assign(region.style, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n });\n}\n\nfunction applyLocale(region: HTMLElement, locale: string | undefined): void {\n if (locale === undefined) region.removeAttribute(\"lang\");\n else region.setAttribute(\"lang\", locale);\n}\n\nexport function connectRuntimeToDOM(\n runtime: GenerativeA11yRuntime,\n options: DOMAnnouncerOptions = {},\n): DOMRuntimeBinding {\n const announcer = createDOMAnnouncer(options);\n let disposed = false;\n let unsubscribe: () => void;\n try {\n unsubscribe = runtime.subscribeAnnouncements((intent) => {\n if (!disposed) announcer.announce(intent);\n });\n } catch (cause) {\n announcer.dispose();\n throw cause;\n }\n\n return {\n announcer,\n dispose() {\n if (disposed) return;\n disposed = true;\n try {\n unsubscribe();\n } finally {\n announcer.dispose();\n }\n },\n };\n}\n","export function deepActiveElement(document: Document): Element | null {\n let active = document.activeElement;\n const visited = new Set<Element>();\n while (active) {\n if (visited.has(active)) throw new Error(\"Cyclic active element\");\n visited.add(active);\n const shadow = (active as Element & { shadowRoot?: ShadowRoot | null })\n .shadowRoot;\n const nested = shadow?.activeElement;\n if (!nested) return active;\n active = nested;\n }\n return null;\n}\n\nexport function composedContains(ancestor: Element, target: Element): boolean {\n let current: Element | null = target;\n const visited = new Set<Element>();\n while (current) {\n if (current === ancestor) return true;\n if (visited.has(current)) throw new Error(\"Cyclic composed tree\");\n visited.add(current);\n current = composedParent(current);\n }\n return false;\n}\n\nexport function composedParent(element: Element): Element | null {\n const assignedSlot = (\n element as Element & { assignedSlot?: HTMLSlotElement | null }\n ).assignedSlot;\n if (assignedSlot) return assignedSlot;\n if (element.parentElement) return element.parentElement;\n const root = element.getRootNode();\n if (root && \"host\" in root) {\n const host = (root as ShadowRoot).host;\n if (host.ownerDocument === element.ownerDocument) return host;\n }\n return null;\n}\n","import { composedContains, deepActiveElement } from \"./composed-tree.js\";\n\nexport interface ExternalStore<T> {\n subscribe(listener: () => void): () => void;\n getSnapshot(): T;\n getServerSnapshot(): T;\n}\n\nexport interface AttentionSnapshot {\n readonly visibility: \"visible\" | \"hidden\" | \"unknown\";\n readonly windowFocus: \"focused\" | \"blurred\" | \"unknown\";\n readonly focusArea:\n \"composer\" | \"conversation\" | \"elsewhere\" | \"none\" | \"unknown\";\n readonly newestResponse: \"visible\" | \"outside\" | \"unobserved\" | \"unknown\";\n readonly mode:\n \"foreground\" | \"background\" | \"reading-history\" | \"away\" | \"unknown\";\n}\n\nexport interface AttentionStore extends ExternalStore<AttentionSnapshot> {\n registerComposer(element: Element): () => void;\n registerConversation(element: Element): () => void;\n registerNewestResponse(element: Element): () => void;\n dispose(): void;\n}\n\nexport interface AttentionStoreOptions {\n document?: Document;\n createIntersectionObserver?: AttentionIntersectionObserverFactory;\n intersectionObserverInit?: IntersectionObserverInit;\n}\n\nexport interface AttentionIntersectionObserver {\n observe(target: Element): void;\n unobserve(target: Element): void;\n disconnect(): void;\n}\n\nexport type AttentionIntersectionObserverFactory = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n) => AttentionIntersectionObserver;\n\nconst UNKNOWN_SNAPSHOT: AttentionSnapshot = Object.freeze({\n visibility: \"unknown\",\n windowFocus: \"unknown\",\n focusArea: \"unknown\",\n newestResponse: \"unknown\",\n mode: \"unknown\",\n});\n\nexport function createAttentionStore(\n options: AttentionStoreOptions = {},\n): AttentionStore {\n const selectedDocument =\n options.document ??\n (typeof document === \"undefined\" ? undefined : document);\n if (!selectedDocument) {\n return {\n subscribe: () => () => undefined,\n getSnapshot: () => UNKNOWN_SNAPSHOT,\n getServerSnapshot: () => UNKNOWN_SNAPSHOT,\n registerComposer: () => () => undefined,\n registerConversation: () => () => undefined,\n registerNewestResponse: () => () => undefined,\n dispose: () => undefined,\n };\n }\n\n const listeners = new Set<() => void>();\n const composers = new Map<Element, number>();\n const conversations = new Map<Element, number>();\n const selectedWindow = selectedDocument.defaultView;\n let disposed = false;\n let newestTarget: Element | undefined;\n let newestResult: AttentionSnapshot[\"newestResponse\"] = \"unobserved\";\n let newestRegistration = 0;\n let observer: AttentionIntersectionObserver | undefined;\n let snapshot = makeSnapshot(\n selectedDocument,\n composers,\n conversations,\n newestResult,\n );\n const update = () => {\n if (disposed) return;\n const next = makeSnapshot(\n selectedDocument,\n composers,\n conversations,\n newestResult,\n );\n if (sameSnapshot(snapshot, next)) return;\n snapshot = next;\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // External-store observers cannot prevent other observers from running.\n }\n }\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget === null) update();\n };\n const listenerCleanups: Array<() => void> = [];\n const installListener = (install: () => void, cleanup: () => void): void => {\n // Register cleanup first because a hostile EventTarget can install and then\n // throw from addEventListener(). Removing a listener that was not installed\n // is harmless, while omitting cleanup would leak the accepted listener.\n listenerCleanups.push(cleanup);\n install();\n };\n const cleanupListeners = (): void => {\n for (const cleanup of listenerCleanups.splice(0).reverse()) {\n try {\n cleanup();\n } catch {\n // One hostile removal cannot strand the remaining listeners.\n }\n }\n };\n try {\n installListener(\n () => selectedDocument.addEventListener(\"visibilitychange\", update),\n () => selectedDocument.removeEventListener(\"visibilitychange\", update),\n );\n if (selectedWindow) {\n installListener(\n () => selectedWindow.addEventListener(\"focus\", update),\n () => selectedWindow.removeEventListener(\"focus\", update),\n );\n installListener(\n () => selectedWindow.addEventListener(\"blur\", update),\n () => selectedWindow.removeEventListener(\"blur\", update),\n );\n }\n installListener(\n () => selectedDocument.addEventListener(\"focusin\", update),\n () => selectedDocument.removeEventListener(\"focusin\", update),\n );\n installListener(\n () => selectedDocument.addEventListener(\"focusout\", handleFocusOut),\n () => selectedDocument.removeEventListener(\"focusout\", handleFocusOut),\n );\n } catch (error) {\n cleanupListeners();\n throw error;\n }\n\n const register = (\n elements: Map<Element, number>,\n element: Element,\n ): (() => void) => {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n elements.set(element, (elements.get(element) ?? 0) + 1);\n update();\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n const remaining = (elements.get(element) ?? 1) - 1;\n if (remaining === 0) elements.delete(element);\n else elements.set(element, remaining);\n update();\n };\n };\n\n const createObserver = (\n registration: number,\n target: Element,\n ): AttentionIntersectionObserver | undefined => {\n const factory =\n options.createIntersectionObserver ??\n defaultIntersectionObserverFactory(selectedWindow);\n if (!factory) return undefined;\n let created: AttentionIntersectionObserver | undefined;\n try {\n created = factory((entries) => {\n if (\n disposed ||\n registration !== newestRegistration ||\n newestTarget !== target ||\n observer !== created\n ) {\n return;\n }\n let latest: IntersectionObserverEntry | undefined;\n for (const entry of entries) {\n if (entry.target === target) latest = entry;\n }\n if (!latest) return;\n newestResult = latest.isIntersecting ? \"visible\" : \"outside\";\n update();\n }, options.intersectionObserverInit);\n created.observe(target);\n return created;\n } catch {\n cleanupObserver(created, target);\n return undefined;\n }\n };\n\n const stopObserver = (target?: Element): void => {\n const current = observer;\n observer = undefined;\n cleanupObserver(current, target);\n };\n\n return {\n subscribe(listener) {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n getSnapshot: () => snapshot,\n getServerSnapshot: () => UNKNOWN_SNAPSHOT,\n registerComposer: (element) => register(composers, element),\n registerConversation: (element) => register(conversations, element),\n registerNewestResponse(element) {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n const registration = ++newestRegistration;\n stopObserver(newestTarget);\n newestTarget = element;\n newestResult = \"unknown\";\n observer = createObserver(registration, element);\n update();\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n if (registration !== newestRegistration || newestTarget !== element)\n return;\n stopObserver(element);\n newestTarget = undefined;\n newestResult = \"unobserved\";\n update();\n };\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n listeners.clear();\n composers.clear();\n conversations.clear();\n stopObserver(newestTarget);\n newestTarget = undefined;\n cleanupListeners();\n },\n };\n}\n\nfunction makeSnapshot(\n document: Document,\n composers: ReadonlyMap<Element, number>,\n conversations: ReadonlyMap<Element, number>,\n newestResponse: AttentionSnapshot[\"newestResponse\"],\n): AttentionSnapshot {\n const visibility = readVisibility(document);\n const windowFocus = readWindowFocus(document);\n return Object.freeze({\n visibility,\n windowFocus,\n focusArea: readFocusArea(document, composers, conversations),\n newestResponse,\n mode: deriveMode(visibility, windowFocus, newestResponse),\n });\n}\n\nfunction deriveMode(\n visibility: AttentionSnapshot[\"visibility\"],\n windowFocus: AttentionSnapshot[\"windowFocus\"],\n newestResponse: AttentionSnapshot[\"newestResponse\"],\n): AttentionSnapshot[\"mode\"] {\n if (visibility === \"hidden\") return \"background\";\n if (visibility !== \"visible\") return \"unknown\";\n if (windowFocus === \"blurred\") return \"away\";\n if (windowFocus !== \"focused\") return \"unknown\";\n if (newestResponse === \"outside\") return \"reading-history\";\n if (newestResponse === \"visible\") return \"foreground\";\n return \"unknown\";\n}\n\nfunction defaultIntersectionObserverFactory(\n window: (Window & typeof globalThis) | null,\n): AttentionIntersectionObserverFactory | undefined {\n const Constructor = window?.IntersectionObserver;\n if (typeof Constructor !== \"function\") return undefined;\n return (callback, options) => new Constructor(callback, options);\n}\n\nfunction cleanupObserver(\n observer: AttentionIntersectionObserver | undefined,\n target?: Element,\n): void {\n if (!observer) return;\n if (target) {\n try {\n observer.unobserve(target);\n } catch {\n // Intersection cleanup errors are deliberately suppressed.\n }\n }\n try {\n observer.disconnect();\n } catch {\n // Intersection cleanup errors are deliberately suppressed.\n }\n}\n\nfunction readFocusArea(\n document: Document,\n composers: ReadonlyMap<Element, number>,\n conversations: ReadonlyMap<Element, number>,\n): AttentionSnapshot[\"focusArea\"] {\n let activeElement: Element | null;\n try {\n activeElement = deepActiveElement(document);\n } catch {\n return \"unknown\";\n }\n if (\n activeElement === null ||\n activeElement === document.body ||\n activeElement === document.documentElement\n ) {\n return \"none\";\n }\n if (\n [...composers.keys()].some((element) =>\n composedContains(element, activeElement),\n )\n ) {\n return \"composer\";\n }\n if (\n [...conversations.keys()].some((element) =>\n composedContains(element, activeElement),\n )\n ) {\n return \"conversation\";\n }\n return \"elsewhere\";\n}\n\nfunction readVisibility(document: Document): AttentionSnapshot[\"visibility\"] {\n try {\n if (document.visibilityState === \"visible\") return \"visible\";\n if (document.visibilityState === \"hidden\") return \"hidden\";\n } catch {\n // Browser integrations can expose throwing accessors.\n }\n return \"unknown\";\n}\n\nfunction readWindowFocus(document: Document): AttentionSnapshot[\"windowFocus\"] {\n try {\n if (typeof document.hasFocus !== \"function\") return \"unknown\";\n return document.hasFocus() ? \"focused\" : \"blurred\";\n } catch {\n return \"unknown\";\n }\n}\n\nfunction sameSnapshot(\n left: AttentionSnapshot,\n right: AttentionSnapshot,\n): boolean {\n return (\n left.visibility === right.visibility &&\n left.windowFocus === right.windowFocus &&\n left.focusArea === right.focusArea &&\n left.newestResponse === right.newestResponse &&\n left.mode === right.mode\n );\n}\n","import {\n composedContains,\n composedParent,\n deepActiveElement,\n} from \"./composed-tree.js\";\n\nexport interface FocusCapture {\n readonly document: Document | null;\n readonly target: Element | null;\n}\n\nexport interface FocusElementOptions {\n preventScroll?: boolean;\n}\n\nexport interface RestoreFocusOptions extends FocusElementOptions {\n onlyIfFocusWithin?: Element;\n}\n\nexport type FocusSkippedReason =\n | \"unavailable\"\n | \"cross-document\"\n | \"disconnected\"\n | \"disabled\"\n | \"hidden\"\n | \"aria-hidden\"\n | \"inert\"\n | \"missing-focus\"\n | \"guard-mismatch\"\n | \"focus-error\"\n | \"focus-not-applied\";\n\nexport type FocusResult =\n | { readonly status: \"focused\"; readonly target: Element }\n | {\n readonly status: \"skipped\";\n readonly reason: FocusSkippedReason;\n readonly target: Element | null;\n };\n\nexport function captureFocus(selectedDocument?: Document): FocusCapture {\n const document =\n selectedDocument ??\n (typeof globalThis.document === \"undefined\"\n ? undefined\n : globalThis.document);\n if (!document) return Object.freeze({ document: null, target: null });\n let target: Element | null = null;\n try {\n const active = deepActiveElement(document);\n if (\n active !== null &&\n active !== document.body &&\n active !== document.documentElement &&\n active.ownerDocument === document\n ) {\n target = active;\n }\n } catch {\n // A hostile document is captured without a restorable target.\n }\n return Object.freeze({ document, target });\n}\n\nexport function focusElement(\n target: Element,\n options: FocusElementOptions = {},\n): FocusResult {\n const eligibility = focusEligibility(target);\n if (eligibility) {\n return { status: \"skipped\", reason: eligibility, target };\n }\n let focus: ((options?: FocusOptions) => void) | undefined;\n let document: Document;\n let previous: Element | null;\n try {\n document = target.ownerDocument;\n previous = deepActiveElement(document);\n focus = (target as Element & { focus?: (options?: FocusOptions) => void })\n .focus;\n } catch {\n return { status: \"skipped\", reason: \"unavailable\", target };\n }\n if (typeof focus !== \"function\") {\n return { status: \"skipped\", reason: \"missing-focus\", target };\n }\n let focusThrew = false;\n try {\n focus.call(target, { preventScroll: options.preventScroll ?? true });\n } catch {\n focusThrew = true;\n }\n if (focusThrew) {\n restorePreviousFocus(previous, target, document);\n return { status: \"skipped\", reason: \"focus-error\", target };\n }\n const postFocusEligibility = focusEligibility(target);\n let active: Element | null;\n try {\n active = deepActiveElement(document);\n } catch {\n return { status: \"skipped\", reason: \"focus-error\", target };\n }\n if (postFocusEligibility) {\n if (active === target) restorePreviousFocus(previous, target, document);\n return { status: \"skipped\", reason: postFocusEligibility, target };\n }\n if (active !== target) {\n return { status: \"skipped\", reason: \"focus-not-applied\", target };\n }\n return { status: \"focused\", target };\n}\n\nexport function restoreFocus(\n capture: FocusCapture,\n options: RestoreFocusOptions = {},\n): FocusResult {\n let document: Document | null;\n let target: Element | null;\n try {\n document = capture.document;\n target = capture.target;\n } catch {\n return { status: \"skipped\", reason: \"unavailable\", target: null };\n }\n if (!document || !target) {\n return { status: \"skipped\", reason: \"unavailable\", target: null };\n }\n try {\n if (target.ownerDocument !== document) {\n return { status: \"skipped\", reason: \"cross-document\", target };\n }\n const guard = options.onlyIfFocusWithin;\n if (guard !== undefined) {\n const active = deepActiveElement(document);\n if (\n guard.ownerDocument !== document ||\n active === null ||\n !composedContains(guard, active)\n ) {\n return { status: \"skipped\", reason: \"guard-mismatch\", target };\n }\n }\n } catch {\n return { status: \"skipped\", reason: \"guard-mismatch\", target };\n }\n return focusElement(target, options);\n}\n\nfunction focusEligibility(target: Element): FocusSkippedReason | undefined {\n let ownerDocument: Document;\n try {\n ownerDocument = target.ownerDocument;\n const ElementConstructor = ownerDocument.defaultView?.Element;\n if (\n !ownerDocument ||\n (ElementConstructor && !(target instanceof ElementConstructor))\n ) {\n return \"unavailable\";\n }\n if (target.isConnected !== true) return \"disconnected\";\n if (\n target.getAttribute(\"disabled\") !== null ||\n (target as Element & { disabled?: unknown }).disabled === true\n ) {\n return \"disabled\";\n }\n } catch {\n return \"unavailable\";\n }\n try {\n const matches = target.matches;\n if (typeof matches === \"function\" && matches.call(target, \":disabled\")) {\n return \"disabled\";\n }\n } catch {\n // Fall back to the direct disabled checks above.\n }\n\n try {\n let current: Element | null = target;\n const visited = new Set<Element>();\n while (current) {\n if (visited.has(current)) return \"unavailable\";\n visited.add(current);\n if (current.hasAttribute(\"hidden\")) return \"hidden\";\n if (current.getAttribute(\"aria-hidden\")?.trim().toLowerCase() === \"true\")\n return \"aria-hidden\";\n if (\n current.hasAttribute(\"inert\") ||\n (current as Element & { inert?: unknown }).inert === true\n ) {\n return \"inert\";\n }\n current = composedParent(current);\n }\n } catch {\n return \"unavailable\";\n }\n\n try {\n const focus = (\n target as Element & {\n focus?: (options?: FocusOptions) => void;\n }\n ).focus;\n if (typeof focus !== \"function\") return \"missing-focus\";\n } catch {\n return \"unavailable\";\n }\n return undefined;\n}\n\nfunction restorePreviousFocus(\n previous: Element | null,\n attempted: Element,\n document: Document,\n): void {\n try {\n if (\n !previous ||\n deepActiveElement(document) !== attempted ||\n focusEligibility(previous) !== undefined\n ) {\n return;\n }\n const focus = (\n previous as Element & {\n focus?: (options?: FocusOptions) => void;\n }\n ).focus;\n if (typeof focus === \"function\")\n focus.call(previous, { preventScroll: true });\n } catch {\n // Focus rollback is best-effort at hostile DOM boundaries.\n }\n}\n","import type { PolicyOverrides, PresetName } from \"@generative-a11y/core\";\n\nimport type { ExternalStore } from \"./attention.js\";\n\nexport type StreamingVerbosity =\n \"preset\" | \"off\" | \"completion\" | \"paragraph\" | \"sentence\";\n\nexport type ToolVerbosity =\n \"preset\" | \"off\" | \"failures\" | \"status\" | \"progress\";\n\nexport type PreferenceSchemaV1 =\n | Readonly<{ version: 1; preset: \"completion-only\" }>\n | Readonly<{\n version: 1;\n preset: \"minimal\" | \"balanced\" | \"verbose\";\n streaming: StreamingVerbosity;\n tools: ToolVerbosity;\n }>;\n\nexport interface PreferenceStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport interface PreferenceStorageEvent {\n readonly key: string | null;\n readonly newValue: string | null;\n readonly storageArea?: PreferenceStorage | null;\n}\n\nexport interface PreferenceStorageEventSource {\n subscribe(listener: (event: PreferenceStorageEvent) => void): () => void;\n}\n\nexport type PreferenceDiagnosticSource =\n | \"storage-read\"\n | \"storage-write\"\n | \"storage-event\"\n | \"event-subscribe\"\n | \"event-unsubscribe\";\n\nexport type PreferenceDiagnosticCode =\n | \"operation-failed\"\n | \"invalid-json\"\n | \"invalid-preference\"\n | \"unsupported-version\";\n\nexport interface PreferenceDiagnostic {\n readonly source: PreferenceDiagnosticSource;\n readonly code: PreferenceDiagnosticCode;\n readonly error?: Readonly<{ name: string; message: string }>;\n}\n\nexport interface PreferencePersistence {\n readonly key: string;\n readonly storage?: PreferenceStorage;\n readonly events?: PreferenceStorageEventSource;\n}\n\nexport interface PreferenceStoreOptions {\n readonly defaultValue?: PreferenceSchemaV1;\n readonly persistence?: PreferencePersistence;\n readonly onDiagnostic?: (diagnostic: PreferenceDiagnostic) => void;\n}\n\nexport interface PreferenceStore extends ExternalStore<PreferenceSchemaV1> {\n setPreferences(value: PreferenceSchemaV1): void;\n dispose(): void;\n}\n\nexport interface CorePreferenceConfiguration {\n readonly preset: PresetName;\n readonly policy?: PolicyOverrides;\n}\n\nexport const defaultPreferences: PreferenceSchemaV1 = Object.freeze({\n version: 1,\n preset: \"balanced\",\n streaming: \"preset\",\n tools: \"preset\",\n});\n\nexport function preferencesToCoreConfiguration(\n value: PreferenceSchemaV1,\n): CorePreferenceConfiguration {\n const preferences = normalizePreferences(value);\n if (preferences.preset === \"completion-only\") {\n return { preset: \"completion-only\" };\n }\n const policy: PolicyOverrides = {};\n const text = mapStreaming(preferences.streaming);\n const tools = mapTools(preferences.tools);\n if (text) policy.text = text;\n if (tools) policy.tools = tools;\n return Object.keys(policy).length === 0\n ? { preset: preferences.preset }\n : { preset: preferences.preset, policy };\n}\n\nexport function createPreferenceStore(\n options: PreferenceStoreOptions = {},\n): PreferenceStore {\n const configuredDefault = options.defaultValue\n ? normalizePreferences(options.defaultValue)\n : defaultPreferences;\n const persistence = resolvePersistence(options.persistence);\n const report = (\n source: PreferenceDiagnosticSource,\n code: PreferenceDiagnosticCode,\n cause?: unknown,\n ): void => {\n const diagnostic: PreferenceDiagnostic = {\n source,\n code,\n ...(cause === undefined ? {} : { error: serializeError(cause) }),\n };\n try {\n options.onDiagnostic?.(diagnostic);\n } catch {\n // Diagnostics are observational.\n }\n };\n let current = configuredDefault;\n if (persistence?.storage) {\n try {\n const stored = persistence.storage.getItem(persistence.key);\n if (stored !== null) {\n current = parsePreferences(stored, \"storage-read\", report) ?? current;\n }\n } catch (cause) {\n report(\"storage-read\", \"operation-failed\", cause);\n }\n }\n let disposed = false;\n let eventEpoch = 0;\n const listeners = new Set<() => void>();\n let unsubscribeEvents: (() => void) | undefined;\n\n const notify = (): void => {\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // External-store listeners cannot prevent other listeners.\n }\n }\n };\n const replace = (next: PreferenceSchemaV1): boolean => {\n if (samePreferences(current, next)) return false;\n current = next;\n notify();\n return true;\n };\n const handleStorageEvent = (event: PreferenceStorageEvent): void => {\n if (disposed || !persistence) return;\n const epoch = ++eventEpoch;\n let key: string | null;\n let newValue: string | null;\n let storageArea: PreferenceStorage | null | undefined;\n try {\n key = event.key;\n newValue = event.newValue;\n storageArea = event.storageArea;\n } catch (cause) {\n if (!disposed && epoch === eventEpoch) {\n report(\"storage-event\", \"operation-failed\", cause);\n }\n return;\n }\n if (disposed || epoch !== eventEpoch) return;\n try {\n if (storageArea != null && storageArea !== persistence.storage) {\n return;\n }\n if (key !== null && key !== persistence.key) return;\n if (key === null || newValue === null) {\n replace(configuredDefault);\n return;\n }\n const next = parsePreferences(newValue, \"storage-event\", report);\n if (!disposed && epoch === eventEpoch && next) replace(next);\n } catch (cause) {\n if (!disposed && epoch === eventEpoch) {\n report(\"storage-event\", \"operation-failed\", cause);\n }\n }\n };\n\n if (persistence?.events) {\n try {\n unsubscribeEvents = persistence.events.subscribe(handleStorageEvent);\n } catch (cause) {\n report(\"event-subscribe\", \"operation-failed\", cause);\n }\n }\n\n return {\n subscribe(listener) {\n if (disposed) throw new Error(\"PreferenceStore is disposed\");\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n getSnapshot: () => current,\n getServerSnapshot: () => configuredDefault,\n setPreferences(value) {\n if (disposed) throw new Error(\"PreferenceStore is disposed\");\n const next = normalizePreferences(value);\n const changed = replace(next);\n if (!disposed && persistence?.storage && samePreferences(current, next)) {\n const serialized = JSON.stringify(next);\n if (!changed) {\n const epoch = eventEpoch;\n let matchesStoredValue = false;\n try {\n matchesStoredValue =\n persistence.storage.getItem(persistence.key) === serialized;\n } catch (cause) {\n report(\"storage-read\", \"operation-failed\", cause);\n }\n if (\n matchesStoredValue ||\n disposed ||\n epoch !== eventEpoch ||\n !samePreferences(current, next)\n ) {\n return;\n }\n }\n if (disposed || !samePreferences(current, next)) return;\n try {\n persistence.storage.setItem(persistence.key, serialized);\n } catch (cause) {\n report(\"storage-write\", \"operation-failed\", cause);\n }\n }\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n eventEpoch += 1;\n listeners.clear();\n const unsubscribe = unsubscribeEvents;\n unsubscribeEvents = undefined;\n if (unsubscribe) {\n try {\n unsubscribe();\n } catch (cause) {\n report(\"event-unsubscribe\", \"operation-failed\", cause);\n }\n }\n },\n };\n}\n\ninterface ResolvedPreferencePersistence {\n readonly key: string;\n readonly storage?: PreferenceStorage;\n readonly events?: PreferenceStorageEventSource;\n}\n\nfunction resolvePersistence(\n persistence: PreferencePersistence | undefined,\n): ResolvedPreferencePersistence | undefined {\n if (!persistence) return undefined;\n if (persistence.storage) return persistence;\n const browser = getBrowserPersistence();\n return {\n key: persistence.key,\n ...(browser?.storage ? { storage: browser.storage } : {}),\n ...(persistence.events\n ? { events: persistence.events }\n : browser?.events\n ? { events: browser.events }\n : {}),\n };\n}\n\nfunction getBrowserPersistence():\n | { storage: PreferenceStorage; events: PreferenceStorageEventSource }\n | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const browserWindow = window;\n const storage = browserWindow.localStorage;\n if (!storage) return undefined;\n return {\n storage,\n events: {\n subscribe(listener) {\n const handle = (event: StorageEvent): void => listener(event);\n browserWindow.addEventListener(\"storage\", handle);\n return () => browserWindow.removeEventListener(\"storage\", handle);\n },\n },\n };\n } catch {\n return undefined;\n }\n}\n\nfunction parsePreferences(\n raw: string,\n source: \"storage-read\" | \"storage-event\",\n report: (\n source: PreferenceDiagnosticSource,\n code: PreferenceDiagnosticCode,\n cause?: unknown,\n ) => void,\n): PreferenceSchemaV1 | undefined {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (cause) {\n report(source, \"invalid-json\", cause);\n return undefined;\n }\n try {\n return normalizePreferences(value as PreferenceSchemaV1);\n } catch (cause) {\n report(\n source,\n cause instanceof UnsupportedPreferenceVersionError\n ? \"unsupported-version\"\n : \"invalid-preference\",\n cause,\n );\n return undefined;\n }\n}\n\nclass UnsupportedPreferenceVersionError extends TypeError {}\n\nexport function normalizePreferences(\n value: PreferenceSchemaV1,\n): PreferenceSchemaV1 {\n const fields = snapshotPreferenceFields(value);\n if (fields.version !== 1)\n throw new UnsupportedPreferenceVersionError(\n \"Unsupported preference version\",\n );\n if (fields.preset === \"completion-only\") {\n if (!hasExactKeys(fields, [\"version\", \"preset\"]))\n throw new TypeError(\"Invalid completion-only preferences\");\n return Object.freeze({ version: 1, preset: \"completion-only\" });\n }\n if (\n !([\"minimal\", \"balanced\", \"verbose\"] as unknown[]).includes(fields.preset)\n )\n throw new TypeError(\"Invalid preference preset\");\n if (!hasExactKeys(fields, [\"version\", \"preset\", \"streaming\", \"tools\"]))\n throw new TypeError(\"Invalid preference fields\");\n if (!STREAMING_VALUES.includes(fields.streaming as StreamingVerbosity))\n throw new TypeError(\"Invalid streaming preference\");\n if (!TOOL_VALUES.includes(fields.tools as ToolVerbosity))\n throw new TypeError(\"Invalid tool preference\");\n return Object.freeze({\n version: 1,\n preset: fields.preset as \"minimal\" | \"balanced\" | \"verbose\",\n streaming: fields.streaming as StreamingVerbosity,\n tools: fields.tools as ToolVerbosity,\n });\n}\n\nconst STREAMING_VALUES: readonly StreamingVerbosity[] = [\n \"preset\",\n \"off\",\n \"completion\",\n \"paragraph\",\n \"sentence\",\n];\nconst TOOL_VALUES: readonly ToolVerbosity[] = [\n \"preset\",\n \"off\",\n \"failures\",\n \"status\",\n \"progress\",\n];\n\nfunction snapshotPreferenceFields(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"Invalid preferences\");\n }\n try {\n const descriptors = Object.getOwnPropertyDescriptors(value);\n const fields = Object.create(null) as Record<string, unknown>;\n for (const key of Reflect.ownKeys(descriptors)) {\n if (typeof key !== \"string\")\n throw new TypeError(\"Invalid preference fields\");\n const descriptor = descriptors[key];\n if (!descriptor?.enumerable || !(\"value\" in descriptor)) {\n throw new TypeError(\n \"Preference fields must be enumerable data properties\",\n );\n }\n fields[key] = descriptor.value;\n }\n return fields;\n } catch {\n throw new TypeError(\"Invalid preferences\");\n }\n}\n\nfunction hasExactKeys(\n value: Record<string, unknown>,\n expected: readonly string[],\n): boolean {\n const keys = Object.keys(value);\n return (\n keys.length === expected.length &&\n expected.every((key) => keys.includes(key))\n );\n}\n\nexport function samePreferences(\n left: PreferenceSchemaV1,\n right: PreferenceSchemaV1,\n): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction mapStreaming(\n value: StreamingVerbosity,\n): PolicyOverrides[\"text\"] | undefined {\n if (value === \"preset\") return undefined;\n if (value === \"off\") return { strategy: \"silent\" };\n if (value === \"completion\")\n return { strategy: \"completion\", minimumCharacters: 0, maximumDelayMs: 0 };\n return { strategy: value };\n}\n\nfunction mapTools(value: ToolVerbosity): PolicyOverrides[\"tools\"] | undefined {\n if (value === \"preset\") return undefined;\n return {\n announceStart: value === \"status\" || value === \"progress\",\n announceProgress: value === \"progress\",\n announceCompletion: value === \"status\" || value === \"progress\",\n announceFailure: value !== \"off\",\n };\n}\n\nfunction serializeError(cause: unknown): Readonly<{\n name: string;\n message: string;\n}> {\n const fallback = { name: \"Error\", message: \"Unknown error\" } as const;\n try {\n if (cause instanceof Error) {\n const name = cause.name;\n const message = cause.message;\n if (typeof name !== \"string\" || typeof message !== \"string\") {\n return fallback;\n }\n return { name: name || \"Error\", message };\n }\n if (\n typeof cause === \"string\" ||\n typeof cause === \"number\" ||\n typeof cause === \"boolean\" ||\n typeof cause === \"bigint\" ||\n typeof cause === \"symbol\"\n ) {\n return { name: \"Error\", message: String(cause) };\n }\n } catch {\n return fallback;\n }\n return fallback;\n}\n"],"mappings":"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","names":["document","document","window","document","serializeError"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/composed-tree.ts","../src/attention.ts","../src/focus.ts","../src/preferences.ts"],"sourcesContent":["import type {\n AnnouncementIntent,\n GenerativeA11yRuntime,\n} from \"@generative-a11y/core\";\n\nexport {\n createAttentionStore,\n type AttentionIntersectionObserver,\n type AttentionIntersectionObserverFactory,\n type AttentionSnapshot,\n type AttentionStore,\n type AttentionStoreOptions,\n type ExternalStore,\n} from \"./attention.js\";\n\nexport {\n captureFocus,\n focusElement,\n restoreFocus,\n type FocusCapture,\n type FocusElementOptions,\n type FocusResult,\n type FocusSkippedReason,\n type RestoreFocusOptions,\n} from \"./focus.js\";\n\nexport {\n createPreferenceStore,\n defaultPreferences,\n normalizePreferences,\n preferencesToCoreConfiguration,\n type CorePreferenceConfiguration,\n type PreferenceDiagnostic,\n type PreferenceDiagnosticCode,\n type PreferenceDiagnosticSource,\n type PreferencePersistence,\n type PreferenceSchemaV1,\n type PreferenceStorage,\n type PreferenceStorageEvent,\n type PreferenceStorageEventSource,\n type PreferenceStore,\n type PreferenceStoreOptions,\n samePreferences,\n type StreamingVerbosity,\n type ToolVerbosity,\n} from \"./preferences.js\";\n\nexport type DOMAnnouncementMode = \"auto\" | \"aria-notify\" | \"live-region\";\n\nexport interface DOMLiveRegions {\n polite: HTMLElement;\n assertive: HTMLElement;\n}\n\nexport interface DOMDeliveryResult {\n status: \"notified\" | \"mutated\" | \"unavailable\" | \"disposed\";\n method: \"aria-notify\" | \"live-region\" | \"none\";\n channel: AnnouncementIntent[\"channel\"];\n announcementId: string;\n sourceType: AnnouncementIntent[\"sourceType\"];\n at: number;\n sourceEventId?: string;\n responseId?: string;\n toolId?: string;\n interactionId?: string;\n error?: { name: string; message: string };\n}\n\nexport interface DOMAnnouncerOptions {\n document?: Document;\n mode?: DOMAnnouncementMode;\n regions?: DOMLiveRegions;\n onDiagnostic?: (result: DOMDeliveryResult) => void;\n}\n\nexport interface DOMAnnouncer {\n announce(intent: AnnouncementIntent): DOMDeliveryResult;\n getRegions(): DOMLiveRegions | undefined;\n dispose(): void;\n}\n\nexport interface DOMRuntimeBinding {\n announcer: DOMAnnouncer;\n dispose(): void;\n}\n\nexport function createDOMAnnouncer(\n options: DOMAnnouncerOptions = {},\n): DOMAnnouncer {\n validateSuppliedRegions(options);\n const selectedDocument =\n options.document ??\n options.regions?.polite.ownerDocument ??\n (typeof document === \"undefined\" ? undefined : document);\n const ownsRegions = options.regions === undefined;\n const regions = options.regions ?? createLiveRegions(selectedDocument);\n\n if (regions) {\n configureRegion(regions.polite, \"polite\");\n configureRegion(regions.assertive, \"assertive\");\n }\n let notifierEnabled = true;\n let disposed = false;\n\n const report = (result: DOMDeliveryResult): DOMDeliveryResult => {\n try {\n options.onDiagnostic?.(result);\n } catch {\n // Diagnostics are observational and cannot affect delivery.\n }\n return result;\n };\n\n return {\n announce(intent) {\n if (disposed) {\n return report({\n status: \"disposed\",\n method: \"none\",\n channel: intent.channel,\n ...deliveryContext(intent),\n });\n }\n if (regions) {\n const region = regions[intent.channel];\n applyLocale(region, intent.locale);\n let error: DOMDeliveryResult[\"error\"];\n if (notifierEnabled && options.mode !== \"live-region\") {\n let notified = false;\n try {\n const ariaNotify = (region as AriaNotifyRegion).ariaNotify;\n if (typeof ariaNotify === \"function\") {\n ariaNotify.call(region, intent.text, {\n priority: intent.channel === \"assertive\" ? \"high\" : \"normal\",\n });\n notified = true;\n }\n } catch (cause) {\n notifierEnabled = false;\n error = serializeError(cause);\n }\n if (notified) {\n return report({\n status: \"notified\",\n method: \"aria-notify\",\n channel: intent.channel,\n ...deliveryContext(intent),\n });\n }\n }\n region.textContent = intent.text;\n return report({\n status: \"mutated\",\n method: \"live-region\",\n channel: intent.channel,\n ...deliveryContext(intent),\n ...(error === undefined ? {} : { error }),\n });\n }\n return report({\n status: \"unavailable\",\n method: \"none\",\n channel: intent.channel,\n ...deliveryContext(intent),\n });\n },\n getRegions() {\n return regions;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (ownsRegions) {\n regions?.polite.remove();\n regions?.assertive.remove();\n }\n },\n };\n}\n\nfunction deliveryContext(\n intent: AnnouncementIntent,\n): Pick<\n DOMDeliveryResult,\n | \"announcementId\"\n | \"sourceType\"\n | \"at\"\n | \"sourceEventId\"\n | \"responseId\"\n | \"toolId\"\n | \"interactionId\"\n> {\n return {\n announcementId: intent.id,\n sourceType: intent.sourceType,\n at: intent.at,\n ...(intent.sourceEventId !== undefined\n ? { sourceEventId: intent.sourceEventId }\n : {}),\n ...(intent.responseId !== undefined\n ? { responseId: intent.responseId }\n : {}),\n ...(intent.toolId !== undefined ? { toolId: intent.toolId } : {}),\n ...(intent.interactionId !== undefined\n ? { interactionId: intent.interactionId }\n : {}),\n };\n}\n\nfunction validateSuppliedRegions(options: DOMAnnouncerOptions): void {\n if (options.regions === undefined) return;\n const { polite, assertive } = options.regions;\n if (polite === assertive) {\n throw new TypeError(\n \"Polite and assertive regions must be distinct elements\",\n );\n }\n if (!polite.isConnected || !assertive.isConnected) {\n throw new TypeError(\"Supplied regions must be connected\");\n }\n if (polite.contains(assertive) || assertive.contains(polite)) {\n throw new TypeError(\n \"Polite and assertive regions must not contain one another\",\n );\n }\n if (polite.ownerDocument !== assertive.ownerDocument) {\n throw new TypeError(\n \"Polite and assertive regions must belong to the same document\",\n );\n }\n if (\n options.document !== undefined &&\n (polite.ownerDocument !== options.document ||\n assertive.ownerDocument !== options.document)\n ) {\n throw new TypeError(\n \"Supplied regions must belong to the provided document\",\n );\n }\n}\n\nfunction serializeError(\n error: unknown,\n): NonNullable<DOMDeliveryResult[\"error\"]> {\n try {\n if (error instanceof Error) {\n return {\n name: readErrorString(error, \"name\", \"Error\"),\n message: readErrorString(error, \"message\", \"Unknown error\"),\n };\n }\n } catch {\n // Hostile proxies can throw during instanceof checks.\n }\n return { name: \"Error\", message: safeString(error, \"Unknown error\") };\n}\n\nfunction readErrorString(\n error: Error,\n property: \"name\" | \"message\",\n fallback: string,\n): string {\n try {\n return safeString(error[property], fallback);\n } catch {\n return fallback;\n }\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\ninterface AriaNotifyRegion extends HTMLElement {\n ariaNotify?: (\n text: string,\n options?: { priority: \"normal\" | \"high\" },\n ) => void;\n}\n\nfunction createLiveRegions(\n selectedDocument: Document | undefined,\n): DOMLiveRegions | undefined {\n const parent = selectedDocument?.body ?? selectedDocument?.documentElement;\n if (!selectedDocument || !parent) return undefined;\n\n const regions = {\n polite: selectedDocument.createElement(\"div\"),\n assertive: selectedDocument.createElement(\"div\"),\n };\n parent.append(regions.polite, regions.assertive);\n return regions;\n}\n\nfunction configureRegion(\n region: HTMLElement,\n channel: AnnouncementIntent[\"channel\"],\n): void {\n region.removeAttribute(\"role\");\n region.removeAttribute(\"aria-busy\");\n region.removeAttribute(\"hidden\");\n region.removeAttribute(\"aria-hidden\");\n region.inert = false;\n region.removeAttribute(\"inert\");\n region.style.removeProperty(\"display\");\n region.style.removeProperty(\"visibility\");\n region.style.removeProperty(\"content-visibility\");\n region.setAttribute(\"aria-live\", channel);\n region.setAttribute(\"aria-atomic\", \"true\");\n region.setAttribute(\"aria-relevant\", \"additions text\");\n Object.assign(region.style, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n });\n}\n\nfunction applyLocale(region: HTMLElement, locale: string | undefined): void {\n if (locale === undefined) region.removeAttribute(\"lang\");\n else region.setAttribute(\"lang\", locale);\n}\n\nexport function connectRuntimeToDOM(\n runtime: GenerativeA11yRuntime,\n options: DOMAnnouncerOptions = {},\n): DOMRuntimeBinding {\n const announcer = createDOMAnnouncer(options);\n let disposed = false;\n let unsubscribe: () => void;\n try {\n unsubscribe = runtime.subscribeAnnouncements((intent) => {\n if (!disposed) announcer.announce(intent);\n });\n } catch (cause) {\n announcer.dispose();\n throw cause;\n }\n\n return {\n announcer,\n dispose() {\n if (disposed) return;\n disposed = true;\n try {\n unsubscribe();\n } finally {\n announcer.dispose();\n }\n },\n };\n}\n","export function deepActiveElement(document: Document): Element | null {\n let active = document.activeElement;\n const visited = new Set<Element>();\n while (active) {\n if (visited.has(active)) throw new Error(\"Cyclic active element\");\n visited.add(active);\n const shadow = (active as Element & { shadowRoot?: ShadowRoot | null })\n .shadowRoot;\n const nested = shadow?.activeElement;\n if (!nested) return active;\n active = nested;\n }\n return null;\n}\n\nexport function composedContains(ancestor: Element, target: Element): boolean {\n let current: Element | null = target;\n const visited = new Set<Element>();\n while (current) {\n if (current === ancestor) return true;\n if (visited.has(current)) throw new Error(\"Cyclic composed tree\");\n visited.add(current);\n current = composedParent(current);\n }\n return false;\n}\n\nexport function composedParent(element: Element): Element | null {\n const assignedSlot = (\n element as Element & { assignedSlot?: HTMLSlotElement | null }\n ).assignedSlot;\n if (assignedSlot) return assignedSlot;\n if (element.parentElement) return element.parentElement;\n const root = element.getRootNode();\n if (root && \"host\" in root) {\n const host = (root as ShadowRoot).host;\n if (host.ownerDocument === element.ownerDocument) return host;\n }\n return null;\n}\n","import { composedContains, deepActiveElement } from \"./composed-tree.js\";\n\nexport interface ExternalStore<T> {\n subscribe(listener: () => void): () => void;\n getSnapshot(): T;\n getServerSnapshot(): T;\n}\n\nexport interface AttentionSnapshot {\n readonly visibility: \"visible\" | \"hidden\" | \"unknown\";\n readonly windowFocus: \"focused\" | \"blurred\" | \"unknown\";\n readonly focusArea:\n \"composer\" | \"conversation\" | \"elsewhere\" | \"none\" | \"unknown\";\n readonly newestResponse: \"visible\" | \"outside\" | \"unobserved\" | \"unknown\";\n readonly mode:\n \"foreground\" | \"background\" | \"reading-history\" | \"away\" | \"unknown\";\n}\n\nexport interface AttentionStore extends ExternalStore<AttentionSnapshot> {\n registerComposer(element: Element): () => void;\n registerConversation(element: Element): () => void;\n registerNewestResponse(element: Element): () => void;\n dispose(): void;\n}\n\nexport interface AttentionStoreOptions {\n document?: Document;\n createIntersectionObserver?: AttentionIntersectionObserverFactory;\n intersectionObserverInit?: IntersectionObserverInit;\n}\n\nexport interface AttentionIntersectionObserver {\n observe(target: Element): void;\n unobserve(target: Element): void;\n disconnect(): void;\n}\n\nexport type AttentionIntersectionObserverFactory = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n) => AttentionIntersectionObserver;\n\nconst UNKNOWN_SNAPSHOT: AttentionSnapshot = Object.freeze({\n visibility: \"unknown\",\n windowFocus: \"unknown\",\n focusArea: \"unknown\",\n newestResponse: \"unknown\",\n mode: \"unknown\",\n});\n\nexport function createAttentionStore(\n options: AttentionStoreOptions = {},\n): AttentionStore {\n const selectedDocument =\n options.document ??\n (typeof document === \"undefined\" ? undefined : document);\n if (!selectedDocument) {\n return {\n subscribe: () => () => undefined,\n getSnapshot: () => UNKNOWN_SNAPSHOT,\n getServerSnapshot: () => UNKNOWN_SNAPSHOT,\n registerComposer: () => () => undefined,\n registerConversation: () => () => undefined,\n registerNewestResponse: () => () => undefined,\n dispose: () => undefined,\n };\n }\n\n const listeners = new Set<() => void>();\n const composers = new Map<Element, number>();\n const conversations = new Map<Element, number>();\n const selectedWindow = selectedDocument.defaultView;\n let disposed = false;\n let newestTarget: Element | undefined;\n let newestResult: AttentionSnapshot[\"newestResponse\"] = \"unobserved\";\n let newestRegistration = 0;\n let observer: AttentionIntersectionObserver | undefined;\n let snapshot = makeSnapshot(\n selectedDocument,\n composers,\n conversations,\n newestResult,\n );\n const update = () => {\n if (disposed) return;\n const next = makeSnapshot(\n selectedDocument,\n composers,\n conversations,\n newestResult,\n );\n if (sameSnapshot(snapshot, next)) return;\n snapshot = next;\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // External-store observers cannot prevent other observers from running.\n }\n }\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget === null) update();\n };\n const listenerCleanups: Array<() => void> = [];\n const installListener = (install: () => void, cleanup: () => void): void => {\n // Register cleanup first because a hostile EventTarget can install and then\n // throw from addEventListener(). Removing a listener that was not installed\n // is harmless, while omitting cleanup would leak the accepted listener.\n listenerCleanups.push(cleanup);\n install();\n };\n const cleanupListeners = (): void => {\n for (const cleanup of listenerCleanups.splice(0).reverse()) {\n try {\n cleanup();\n } catch {\n // One hostile removal cannot strand the remaining listeners.\n }\n }\n };\n try {\n installListener(\n () => selectedDocument.addEventListener(\"visibilitychange\", update),\n () => selectedDocument.removeEventListener(\"visibilitychange\", update),\n );\n if (selectedWindow) {\n installListener(\n () => selectedWindow.addEventListener(\"focus\", update),\n () => selectedWindow.removeEventListener(\"focus\", update),\n );\n installListener(\n () => selectedWindow.addEventListener(\"blur\", update),\n () => selectedWindow.removeEventListener(\"blur\", update),\n );\n }\n installListener(\n () => selectedDocument.addEventListener(\"focusin\", update),\n () => selectedDocument.removeEventListener(\"focusin\", update),\n );\n installListener(\n () => selectedDocument.addEventListener(\"focusout\", handleFocusOut),\n () => selectedDocument.removeEventListener(\"focusout\", handleFocusOut),\n );\n } catch (error) {\n cleanupListeners();\n throw error;\n }\n\n const register = (\n elements: Map<Element, number>,\n element: Element,\n ): (() => void) => {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n elements.set(element, (elements.get(element) ?? 0) + 1);\n update();\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n const remaining = (elements.get(element) ?? 1) - 1;\n if (remaining === 0) elements.delete(element);\n else elements.set(element, remaining);\n update();\n };\n };\n\n const createObserver = (\n registration: number,\n target: Element,\n ): AttentionIntersectionObserver | undefined => {\n const factory =\n options.createIntersectionObserver ??\n defaultIntersectionObserverFactory(selectedWindow);\n if (!factory) return undefined;\n let created: AttentionIntersectionObserver | undefined;\n try {\n created = factory((entries) => {\n if (\n disposed ||\n registration !== newestRegistration ||\n newestTarget !== target ||\n observer !== created\n ) {\n return;\n }\n let latest: IntersectionObserverEntry | undefined;\n for (const entry of entries) {\n if (entry.target === target) latest = entry;\n }\n if (!latest) return;\n newestResult = latest.isIntersecting ? \"visible\" : \"outside\";\n update();\n }, options.intersectionObserverInit);\n created.observe(target);\n return created;\n } catch {\n cleanupObserver(created, target);\n return undefined;\n }\n };\n\n const stopObserver = (target?: Element): void => {\n const current = observer;\n observer = undefined;\n cleanupObserver(current, target);\n };\n\n return {\n subscribe(listener) {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n getSnapshot: () => snapshot,\n getServerSnapshot: () => UNKNOWN_SNAPSHOT,\n registerComposer: (element) => register(composers, element),\n registerConversation: (element) => register(conversations, element),\n registerNewestResponse(element) {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n const registration = ++newestRegistration;\n stopObserver(newestTarget);\n newestTarget = element;\n newestResult = \"unknown\";\n observer = createObserver(registration, element);\n update();\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n if (registration !== newestRegistration || newestTarget !== element)\n return;\n stopObserver(element);\n newestTarget = undefined;\n newestResult = \"unobserved\";\n update();\n };\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n listeners.clear();\n composers.clear();\n conversations.clear();\n stopObserver(newestTarget);\n newestTarget = undefined;\n cleanupListeners();\n },\n };\n}\n\nfunction makeSnapshot(\n document: Document,\n composers: ReadonlyMap<Element, number>,\n conversations: ReadonlyMap<Element, number>,\n newestResponse: AttentionSnapshot[\"newestResponse\"],\n): AttentionSnapshot {\n const visibility = readVisibility(document);\n const windowFocus = readWindowFocus(document);\n return Object.freeze({\n visibility,\n windowFocus,\n focusArea: readFocusArea(document, composers, conversations),\n newestResponse,\n mode: deriveMode(visibility, windowFocus, newestResponse),\n });\n}\n\nfunction deriveMode(\n visibility: AttentionSnapshot[\"visibility\"],\n windowFocus: AttentionSnapshot[\"windowFocus\"],\n newestResponse: AttentionSnapshot[\"newestResponse\"],\n): AttentionSnapshot[\"mode\"] {\n if (visibility === \"hidden\") return \"background\";\n if (visibility !== \"visible\") return \"unknown\";\n if (windowFocus === \"blurred\") return \"away\";\n if (windowFocus !== \"focused\") return \"unknown\";\n if (newestResponse === \"outside\") return \"reading-history\";\n if (newestResponse === \"visible\") return \"foreground\";\n return \"unknown\";\n}\n\nfunction defaultIntersectionObserverFactory(\n window: (Window & typeof globalThis) | null,\n): AttentionIntersectionObserverFactory | undefined {\n const Constructor = window?.IntersectionObserver;\n if (typeof Constructor !== \"function\") return undefined;\n return (callback, options) => new Constructor(callback, options);\n}\n\nfunction cleanupObserver(\n observer: AttentionIntersectionObserver | undefined,\n target?: Element,\n): void {\n if (!observer) return;\n if (target) {\n try {\n observer.unobserve(target);\n } catch {\n // Intersection cleanup errors are deliberately suppressed.\n }\n }\n try {\n observer.disconnect();\n } catch {\n // Intersection cleanup errors are deliberately suppressed.\n }\n}\n\nfunction readFocusArea(\n document: Document,\n composers: ReadonlyMap<Element, number>,\n conversations: ReadonlyMap<Element, number>,\n): AttentionSnapshot[\"focusArea\"] {\n let activeElement: Element | null;\n try {\n activeElement = deepActiveElement(document);\n } catch {\n return \"unknown\";\n }\n if (\n activeElement === null ||\n activeElement === document.body ||\n activeElement === document.documentElement\n ) {\n return \"none\";\n }\n if (\n [...composers.keys()].some((element) =>\n composedContains(element, activeElement),\n )\n ) {\n return \"composer\";\n }\n if (\n [...conversations.keys()].some((element) =>\n composedContains(element, activeElement),\n )\n ) {\n return \"conversation\";\n }\n return \"elsewhere\";\n}\n\nfunction readVisibility(document: Document): AttentionSnapshot[\"visibility\"] {\n try {\n if (document.visibilityState === \"visible\") return \"visible\";\n if (document.visibilityState === \"hidden\") return \"hidden\";\n } catch {\n // Browser integrations can expose throwing accessors.\n }\n return \"unknown\";\n}\n\nfunction readWindowFocus(document: Document): AttentionSnapshot[\"windowFocus\"] {\n try {\n if (typeof document.hasFocus !== \"function\") return \"unknown\";\n return document.hasFocus() ? \"focused\" : \"blurred\";\n } catch {\n return \"unknown\";\n }\n}\n\nfunction sameSnapshot(\n left: AttentionSnapshot,\n right: AttentionSnapshot,\n): boolean {\n return (\n left.visibility === right.visibility &&\n left.windowFocus === right.windowFocus &&\n left.focusArea === right.focusArea &&\n left.newestResponse === right.newestResponse &&\n left.mode === right.mode\n );\n}\n","import {\n composedContains,\n composedParent,\n deepActiveElement,\n} from \"./composed-tree.js\";\n\nexport interface FocusCapture {\n readonly document: Document | null;\n readonly target: Element | null;\n}\n\nexport interface FocusElementOptions {\n preventScroll?: boolean;\n}\n\nexport interface RestoreFocusOptions extends FocusElementOptions {\n onlyIfFocusWithin?: Element;\n}\n\nexport type FocusSkippedReason =\n | \"unavailable\"\n | \"cross-document\"\n | \"disconnected\"\n | \"disabled\"\n | \"hidden\"\n | \"aria-hidden\"\n | \"inert\"\n | \"missing-focus\"\n | \"guard-mismatch\"\n | \"focus-error\"\n | \"focus-not-applied\";\n\nexport type FocusResult =\n | { readonly status: \"focused\"; readonly target: Element }\n | {\n readonly status: \"skipped\";\n readonly reason: FocusSkippedReason;\n readonly target: Element | null;\n };\n\nexport function captureFocus(selectedDocument?: Document): FocusCapture {\n const document =\n selectedDocument ??\n (typeof globalThis.document === \"undefined\"\n ? undefined\n : globalThis.document);\n if (!document) return Object.freeze({ document: null, target: null });\n let target: Element | null = null;\n try {\n const active = deepActiveElement(document);\n if (\n active !== null &&\n active !== document.body &&\n active !== document.documentElement &&\n active.ownerDocument === document\n ) {\n target = active;\n }\n } catch {\n // A hostile document is captured without a restorable target.\n }\n return Object.freeze({ document, target });\n}\n\nexport function focusElement(\n target: Element,\n options: FocusElementOptions = {},\n): FocusResult {\n const eligibility = focusEligibility(target);\n if (eligibility) {\n return { status: \"skipped\", reason: eligibility, target };\n }\n let focus: ((options?: FocusOptions) => void) | undefined;\n let document: Document;\n let previous: Element | null;\n try {\n document = target.ownerDocument;\n previous = deepActiveElement(document);\n focus = (target as Element & { focus?: (options?: FocusOptions) => void })\n .focus;\n } catch {\n return { status: \"skipped\", reason: \"unavailable\", target };\n }\n if (typeof focus !== \"function\") {\n return { status: \"skipped\", reason: \"missing-focus\", target };\n }\n let focusThrew = false;\n try {\n focus.call(target, { preventScroll: options.preventScroll ?? true });\n } catch {\n focusThrew = true;\n }\n if (focusThrew) {\n restorePreviousFocus(previous, target, document);\n return { status: \"skipped\", reason: \"focus-error\", target };\n }\n const postFocusEligibility = focusEligibility(target);\n let active: Element | null;\n try {\n active = deepActiveElement(document);\n } catch {\n return { status: \"skipped\", reason: \"focus-error\", target };\n }\n if (postFocusEligibility) {\n if (active === target) restorePreviousFocus(previous, target, document);\n return { status: \"skipped\", reason: postFocusEligibility, target };\n }\n if (active !== target) {\n return { status: \"skipped\", reason: \"focus-not-applied\", target };\n }\n return { status: \"focused\", target };\n}\n\nexport function restoreFocus(\n capture: FocusCapture,\n options: RestoreFocusOptions = {},\n): FocusResult {\n let document: Document | null;\n let target: Element | null;\n try {\n document = capture.document;\n target = capture.target;\n } catch {\n return { status: \"skipped\", reason: \"unavailable\", target: null };\n }\n if (!document || !target) {\n return { status: \"skipped\", reason: \"unavailable\", target: null };\n }\n try {\n if (target.ownerDocument !== document) {\n return { status: \"skipped\", reason: \"cross-document\", target };\n }\n const guard = options.onlyIfFocusWithin;\n if (guard !== undefined) {\n const active = deepActiveElement(document);\n if (\n guard.ownerDocument !== document ||\n active === null ||\n !composedContains(guard, active)\n ) {\n return { status: \"skipped\", reason: \"guard-mismatch\", target };\n }\n }\n } catch {\n return { status: \"skipped\", reason: \"guard-mismatch\", target };\n }\n return focusElement(target, options);\n}\n\nfunction focusEligibility(target: Element): FocusSkippedReason | undefined {\n let ownerDocument: Document;\n try {\n ownerDocument = target.ownerDocument;\n const ElementConstructor = ownerDocument.defaultView?.Element;\n if (\n !ownerDocument ||\n (ElementConstructor && !(target instanceof ElementConstructor))\n ) {\n return \"unavailable\";\n }\n if (target.isConnected !== true) return \"disconnected\";\n if (\n target.getAttribute(\"disabled\") !== null ||\n (target as Element & { disabled?: unknown }).disabled === true\n ) {\n return \"disabled\";\n }\n } catch {\n return \"unavailable\";\n }\n try {\n const matches = target.matches;\n if (typeof matches === \"function\" && matches.call(target, \":disabled\")) {\n return \"disabled\";\n }\n } catch {\n // Fall back to the direct disabled checks above.\n }\n\n try {\n let current: Element | null = target;\n const visited = new Set<Element>();\n while (current) {\n if (visited.has(current)) return \"unavailable\";\n visited.add(current);\n if (current.hasAttribute(\"hidden\")) return \"hidden\";\n if (current.getAttribute(\"aria-hidden\")?.trim().toLowerCase() === \"true\")\n return \"aria-hidden\";\n if (\n current.hasAttribute(\"inert\") ||\n (current as Element & { inert?: unknown }).inert === true\n ) {\n return \"inert\";\n }\n current = composedParent(current);\n }\n } catch {\n return \"unavailable\";\n }\n\n try {\n const focus = (\n target as Element & {\n focus?: (options?: FocusOptions) => void;\n }\n ).focus;\n if (typeof focus !== \"function\") return \"missing-focus\";\n } catch {\n return \"unavailable\";\n }\n return undefined;\n}\n\nfunction restorePreviousFocus(\n previous: Element | null,\n attempted: Element,\n document: Document,\n): void {\n try {\n if (\n !previous ||\n deepActiveElement(document) !== attempted ||\n focusEligibility(previous) !== undefined\n ) {\n return;\n }\n const focus = (\n previous as Element & {\n focus?: (options?: FocusOptions) => void;\n }\n ).focus;\n if (typeof focus === \"function\")\n focus.call(previous, { preventScroll: true });\n } catch {\n // Focus rollback is best-effort at hostile DOM boundaries.\n }\n}\n","import type { PolicyOverrides, PresetName } from \"@generative-a11y/core\";\n\nimport type { ExternalStore } from \"./attention.js\";\n\nexport type StreamingVerbosity =\n \"preset\" | \"off\" | \"completion\" | \"paragraph\" | \"sentence\";\n\nexport type ToolVerbosity =\n \"preset\" | \"off\" | \"failures\" | \"status\" | \"progress\";\n\nexport type PreferenceSchemaV1 =\n | Readonly<{ version: 1; preset: \"completion-only\" }>\n | Readonly<{\n version: 1;\n preset: \"minimal\" | \"balanced\" | \"verbose\";\n streaming: StreamingVerbosity;\n tools: ToolVerbosity;\n }>;\n\nexport interface PreferenceStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport interface PreferenceStorageEvent {\n readonly key: string | null;\n readonly newValue: string | null;\n readonly storageArea?: PreferenceStorage | null;\n}\n\nexport interface PreferenceStorageEventSource {\n subscribe(listener: (event: PreferenceStorageEvent) => void): () => void;\n}\n\nexport type PreferenceDiagnosticSource =\n | \"storage-read\"\n | \"storage-write\"\n | \"storage-event\"\n | \"event-subscribe\"\n | \"event-unsubscribe\";\n\nexport type PreferenceDiagnosticCode =\n | \"operation-failed\"\n | \"invalid-json\"\n | \"invalid-preference\"\n | \"unsupported-version\";\n\nexport interface PreferenceDiagnostic {\n readonly source: PreferenceDiagnosticSource;\n readonly code: PreferenceDiagnosticCode;\n readonly error?: Readonly<{ name: string; message: string }>;\n}\n\nexport interface PreferencePersistence {\n readonly key: string;\n readonly storage?: PreferenceStorage;\n readonly events?: PreferenceStorageEventSource;\n}\n\nexport interface PreferenceStoreOptions {\n readonly defaultValue?: PreferenceSchemaV1;\n readonly persistence?: PreferencePersistence;\n readonly onDiagnostic?: (diagnostic: PreferenceDiagnostic) => void;\n}\n\nexport interface PreferenceStore extends ExternalStore<PreferenceSchemaV1> {\n setPreferences(value: PreferenceSchemaV1): void;\n dispose(): void;\n}\n\nexport interface CorePreferenceConfiguration {\n readonly preset: PresetName;\n readonly policy?: PolicyOverrides;\n}\n\nexport const defaultPreferences: PreferenceSchemaV1 = Object.freeze({\n version: 1,\n preset: \"balanced\",\n streaming: \"preset\",\n tools: \"preset\",\n});\n\nexport function preferencesToCoreConfiguration(\n value: PreferenceSchemaV1,\n): CorePreferenceConfiguration {\n const preferences = normalizePreferences(value);\n if (preferences.preset === \"completion-only\") {\n return { preset: \"completion-only\" };\n }\n const policy: PolicyOverrides = {};\n const text = mapStreaming(preferences.streaming);\n const tools = mapTools(preferences.tools);\n if (text) policy.text = text;\n if (tools) policy.tools = tools;\n return Object.keys(policy).length === 0\n ? { preset: preferences.preset }\n : { preset: preferences.preset, policy };\n}\n\nexport function createPreferenceStore(\n options: PreferenceStoreOptions = {},\n): PreferenceStore {\n const configuredDefault = options.defaultValue\n ? normalizePreferences(options.defaultValue)\n : defaultPreferences;\n const persistence = resolvePersistence(options.persistence);\n const report = (\n source: PreferenceDiagnosticSource,\n code: PreferenceDiagnosticCode,\n cause?: unknown,\n ): void => {\n const diagnostic: PreferenceDiagnostic = {\n source,\n code,\n ...(cause === undefined ? {} : { error: serializeError(cause) }),\n };\n try {\n options.onDiagnostic?.(diagnostic);\n } catch {\n // Diagnostics are observational.\n }\n };\n let current = configuredDefault;\n if (persistence?.storage) {\n try {\n const stored = persistence.storage.getItem(persistence.key);\n if (stored !== null) {\n current = parsePreferences(stored, \"storage-read\", report) ?? current;\n }\n } catch (cause) {\n report(\"storage-read\", \"operation-failed\", cause);\n }\n }\n let disposed = false;\n let eventEpoch = 0;\n const listeners = new Set<() => void>();\n let unsubscribeEvents: (() => void) | undefined;\n\n const notify = (): void => {\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // External-store listeners cannot prevent other listeners.\n }\n }\n };\n const replace = (next: PreferenceSchemaV1): boolean => {\n if (samePreferences(current, next)) return false;\n current = next;\n notify();\n return true;\n };\n const handleStorageEvent = (event: PreferenceStorageEvent): void => {\n if (disposed || !persistence) return;\n const epoch = ++eventEpoch;\n let key: string | null;\n let newValue: string | null;\n let storageArea: PreferenceStorage | null | undefined;\n try {\n key = event.key;\n newValue = event.newValue;\n storageArea = event.storageArea;\n } catch (cause) {\n if (!disposed && epoch === eventEpoch) {\n report(\"storage-event\", \"operation-failed\", cause);\n }\n return;\n }\n if (disposed || epoch !== eventEpoch) return;\n try {\n if (storageArea != null && storageArea !== persistence.storage) {\n return;\n }\n if (key !== null && key !== persistence.key) return;\n if (key === null || newValue === null) {\n replace(configuredDefault);\n return;\n }\n const next = parsePreferences(newValue, \"storage-event\", report);\n if (!disposed && epoch === eventEpoch && next) replace(next);\n } catch (cause) {\n if (!disposed && epoch === eventEpoch) {\n report(\"storage-event\", \"operation-failed\", cause);\n }\n }\n };\n\n if (persistence?.events) {\n try {\n unsubscribeEvents = persistence.events.subscribe(handleStorageEvent);\n } catch (cause) {\n report(\"event-subscribe\", \"operation-failed\", cause);\n }\n }\n\n return {\n subscribe(listener) {\n if (disposed) throw new Error(\"PreferenceStore is disposed\");\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n getSnapshot: () => current,\n getServerSnapshot: () => configuredDefault,\n setPreferences(value) {\n if (disposed) throw new Error(\"PreferenceStore is disposed\");\n const next = normalizePreferences(value);\n const changed = replace(next);\n if (!disposed && persistence?.storage && samePreferences(current, next)) {\n const serialized = JSON.stringify(next);\n if (!changed) {\n const epoch = eventEpoch;\n let matchesStoredValue = false;\n try {\n matchesStoredValue =\n persistence.storage.getItem(persistence.key) === serialized;\n } catch (cause) {\n report(\"storage-read\", \"operation-failed\", cause);\n }\n if (\n matchesStoredValue ||\n disposed ||\n epoch !== eventEpoch ||\n !samePreferences(current, next)\n ) {\n return;\n }\n }\n if (disposed || !samePreferences(current, next)) return;\n try {\n persistence.storage.setItem(persistence.key, serialized);\n } catch (cause) {\n report(\"storage-write\", \"operation-failed\", cause);\n }\n }\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n eventEpoch += 1;\n listeners.clear();\n const unsubscribe = unsubscribeEvents;\n unsubscribeEvents = undefined;\n if (unsubscribe) {\n try {\n unsubscribe();\n } catch (cause) {\n report(\"event-unsubscribe\", \"operation-failed\", cause);\n }\n }\n },\n };\n}\n\ninterface ResolvedPreferencePersistence {\n readonly key: string;\n readonly storage?: PreferenceStorage;\n readonly events?: PreferenceStorageEventSource;\n}\n\nfunction resolvePersistence(\n persistence: PreferencePersistence | undefined,\n): ResolvedPreferencePersistence | undefined {\n if (!persistence) return undefined;\n if (persistence.storage) return persistence;\n const browser = getBrowserPersistence();\n return {\n key: persistence.key,\n ...(browser?.storage ? { storage: browser.storage } : {}),\n ...(persistence.events\n ? { events: persistence.events }\n : browser?.events\n ? { events: browser.events }\n : {}),\n };\n}\n\nfunction getBrowserPersistence():\n | { storage: PreferenceStorage; events: PreferenceStorageEventSource }\n | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const browserWindow = window;\n const storage = browserWindow.localStorage;\n if (!storage) return undefined;\n return {\n storage,\n events: {\n subscribe(listener) {\n const handle = (event: StorageEvent): void => listener(event);\n browserWindow.addEventListener(\"storage\", handle);\n return () => browserWindow.removeEventListener(\"storage\", handle);\n },\n },\n };\n } catch {\n return undefined;\n }\n}\n\nfunction parsePreferences(\n raw: string,\n source: \"storage-read\" | \"storage-event\",\n report: (\n source: PreferenceDiagnosticSource,\n code: PreferenceDiagnosticCode,\n cause?: unknown,\n ) => void,\n): PreferenceSchemaV1 | undefined {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (cause) {\n report(source, \"invalid-json\", cause);\n return undefined;\n }\n try {\n return normalizePreferences(value as PreferenceSchemaV1);\n } catch (cause) {\n report(\n source,\n cause instanceof UnsupportedPreferenceVersionError\n ? \"unsupported-version\"\n : \"invalid-preference\",\n cause,\n );\n return undefined;\n }\n}\n\nclass UnsupportedPreferenceVersionError extends TypeError {}\n\nexport function normalizePreferences(\n value: PreferenceSchemaV1,\n): PreferenceSchemaV1 {\n const fields = snapshotPreferenceFields(value);\n if (fields.version !== 1)\n throw new UnsupportedPreferenceVersionError(\n \"Unsupported preference version\",\n );\n if (fields.preset === \"completion-only\") {\n if (!hasExactKeys(fields, [\"version\", \"preset\"]))\n throw new TypeError(\"Invalid completion-only preferences\");\n return Object.freeze({ version: 1, preset: \"completion-only\" });\n }\n if (\n !([\"minimal\", \"balanced\", \"verbose\"] as unknown[]).includes(fields.preset)\n )\n throw new TypeError(\"Invalid preference preset\");\n if (!hasExactKeys(fields, [\"version\", \"preset\", \"streaming\", \"tools\"]))\n throw new TypeError(\"Invalid preference fields\");\n if (!STREAMING_VALUES.includes(fields.streaming as StreamingVerbosity))\n throw new TypeError(\"Invalid streaming preference\");\n if (!TOOL_VALUES.includes(fields.tools as ToolVerbosity))\n throw new TypeError(\"Invalid tool preference\");\n return Object.freeze({\n version: 1,\n preset: fields.preset as \"minimal\" | \"balanced\" | \"verbose\",\n streaming: fields.streaming as StreamingVerbosity,\n tools: fields.tools as ToolVerbosity,\n });\n}\n\nconst STREAMING_VALUES: readonly StreamingVerbosity[] = [\n \"preset\",\n \"off\",\n \"completion\",\n \"paragraph\",\n \"sentence\",\n];\nconst TOOL_VALUES: readonly ToolVerbosity[] = [\n \"preset\",\n \"off\",\n \"failures\",\n \"status\",\n \"progress\",\n];\n\nfunction snapshotPreferenceFields(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"Invalid preferences\");\n }\n try {\n const descriptors = Object.getOwnPropertyDescriptors(value);\n const fields = Object.create(null) as Record<string, unknown>;\n for (const key of Reflect.ownKeys(descriptors)) {\n if (typeof key !== \"string\")\n throw new TypeError(\"Invalid preference fields\");\n const descriptor = descriptors[key];\n if (!descriptor?.enumerable || !(\"value\" in descriptor)) {\n throw new TypeError(\n \"Preference fields must be enumerable data properties\",\n );\n }\n fields[key] = descriptor.value;\n }\n return fields;\n } catch {\n throw new TypeError(\"Invalid preferences\");\n }\n}\n\nfunction hasExactKeys(\n value: Record<string, unknown>,\n expected: readonly string[],\n): boolean {\n const keys = Object.keys(value);\n return (\n keys.length === expected.length &&\n expected.every((key) => keys.includes(key))\n );\n}\n\nexport function samePreferences(\n left: PreferenceSchemaV1,\n right: PreferenceSchemaV1,\n): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction mapStreaming(\n value: StreamingVerbosity,\n): PolicyOverrides[\"text\"] | undefined {\n if (value === \"preset\") return undefined;\n if (value === \"off\") return { strategy: \"silent\" };\n if (value === \"completion\")\n return { strategy: \"completion\", minimumCharacters: 0, maximumDelayMs: 0 };\n return { strategy: value };\n}\n\nfunction mapTools(value: ToolVerbosity): PolicyOverrides[\"tools\"] | undefined {\n if (value === \"preset\") return undefined;\n return {\n announceStart: value === \"status\" || value === \"progress\",\n announceProgress: value === \"progress\",\n announceCompletion: value === \"status\" || value === \"progress\",\n announceFailure: value !== \"off\",\n };\n}\n\nfunction serializeError(cause: unknown): Readonly<{\n name: string;\n message: string;\n}> {\n const fallback = { name: \"Error\", message: \"Unknown error\" } as const;\n try {\n if (cause instanceof Error) {\n const name = cause.name;\n const message = cause.message;\n if (typeof name !== \"string\" || typeof message !== \"string\") {\n return fallback;\n }\n return { name: name || \"Error\", message };\n }\n if (\n typeof cause === \"string\" ||\n typeof cause === \"number\" ||\n typeof cause === \"boolean\" ||\n typeof cause === \"bigint\" ||\n typeof cause === \"symbol\"\n ) {\n return { name: \"Error\", message: String(cause) };\n }\n } catch {\n return fallback;\n }\n return fallback;\n}\n"],"mappings":"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","names":["document","document","window","document","serializeError"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -120,6 +120,13 @@ interface DOMDeliveryResult {
|
|
|
120
120
|
status: "notified" | "mutated" | "unavailable" | "disposed";
|
|
121
121
|
method: "aria-notify" | "live-region" | "none";
|
|
122
122
|
channel: AnnouncementIntent["channel"];
|
|
123
|
+
announcementId: string;
|
|
124
|
+
sourceType: AnnouncementIntent["sourceType"];
|
|
125
|
+
at: number;
|
|
126
|
+
sourceEventId?: string;
|
|
127
|
+
responseId?: string;
|
|
128
|
+
toolId?: string;
|
|
129
|
+
interactionId?: string;
|
|
123
130
|
error?: {
|
|
124
131
|
name: string;
|
|
125
132
|
message: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -120,6 +120,13 @@ interface DOMDeliveryResult {
|
|
|
120
120
|
status: "notified" | "mutated" | "unavailable" | "disposed";
|
|
121
121
|
method: "aria-notify" | "live-region" | "none";
|
|
122
122
|
channel: AnnouncementIntent["channel"];
|
|
123
|
+
announcementId: string;
|
|
124
|
+
sourceType: AnnouncementIntent["sourceType"];
|
|
125
|
+
at: number;
|
|
126
|
+
sourceEventId?: string;
|
|
127
|
+
responseId?: string;
|
|
128
|
+
toolId?: string;
|
|
129
|
+
interactionId?: string;
|
|
123
130
|
error?: {
|
|
124
131
|
name: string;
|
|
125
132
|
message: string;
|
package/dist/index.js
CHANGED
|
@@ -787,7 +787,8 @@ function createDOMAnnouncer(options = {}) {
|
|
|
787
787
|
return report({
|
|
788
788
|
status: "disposed",
|
|
789
789
|
method: "none",
|
|
790
|
-
channel: intent.channel
|
|
790
|
+
channel: intent.channel,
|
|
791
|
+
...deliveryContext(intent)
|
|
791
792
|
});
|
|
792
793
|
}
|
|
793
794
|
if (regions) {
|
|
@@ -812,7 +813,8 @@ function createDOMAnnouncer(options = {}) {
|
|
|
812
813
|
return report({
|
|
813
814
|
status: "notified",
|
|
814
815
|
method: "aria-notify",
|
|
815
|
-
channel: intent.channel
|
|
816
|
+
channel: intent.channel,
|
|
817
|
+
...deliveryContext(intent)
|
|
816
818
|
});
|
|
817
819
|
}
|
|
818
820
|
}
|
|
@@ -821,13 +823,15 @@ function createDOMAnnouncer(options = {}) {
|
|
|
821
823
|
status: "mutated",
|
|
822
824
|
method: "live-region",
|
|
823
825
|
channel: intent.channel,
|
|
826
|
+
...deliveryContext(intent),
|
|
824
827
|
...error === void 0 ? {} : { error }
|
|
825
828
|
});
|
|
826
829
|
}
|
|
827
830
|
return report({
|
|
828
831
|
status: "unavailable",
|
|
829
832
|
method: "none",
|
|
830
|
-
channel: intent.channel
|
|
833
|
+
channel: intent.channel,
|
|
834
|
+
...deliveryContext(intent)
|
|
831
835
|
});
|
|
832
836
|
},
|
|
833
837
|
getRegions() {
|
|
@@ -843,6 +847,17 @@ function createDOMAnnouncer(options = {}) {
|
|
|
843
847
|
}
|
|
844
848
|
};
|
|
845
849
|
}
|
|
850
|
+
function deliveryContext(intent) {
|
|
851
|
+
return {
|
|
852
|
+
announcementId: intent.id,
|
|
853
|
+
sourceType: intent.sourceType,
|
|
854
|
+
at: intent.at,
|
|
855
|
+
...intent.sourceEventId !== void 0 ? { sourceEventId: intent.sourceEventId } : {},
|
|
856
|
+
...intent.responseId !== void 0 ? { responseId: intent.responseId } : {},
|
|
857
|
+
...intent.toolId !== void 0 ? { toolId: intent.toolId } : {},
|
|
858
|
+
...intent.interactionId !== void 0 ? { interactionId: intent.interactionId } : {}
|
|
859
|
+
};
|
|
860
|
+
}
|
|
846
861
|
function validateSuppliedRegions(options) {
|
|
847
862
|
if (options.regions === void 0) return;
|
|
848
863
|
const { polite, assertive } = options.regions;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/composed-tree.ts","../src/attention.ts","../src/focus.ts","../src/preferences.ts","../src/index.ts"],"sourcesContent":["export function deepActiveElement(document: Document): Element | null {\n let active = document.activeElement;\n const visited = new Set<Element>();\n while (active) {\n if (visited.has(active)) throw new Error(\"Cyclic active element\");\n visited.add(active);\n const shadow = (active as Element & { shadowRoot?: ShadowRoot | null })\n .shadowRoot;\n const nested = shadow?.activeElement;\n if (!nested) return active;\n active = nested;\n }\n return null;\n}\n\nexport function composedContains(ancestor: Element, target: Element): boolean {\n let current: Element | null = target;\n const visited = new Set<Element>();\n while (current) {\n if (current === ancestor) return true;\n if (visited.has(current)) throw new Error(\"Cyclic composed tree\");\n visited.add(current);\n current = composedParent(current);\n }\n return false;\n}\n\nexport function composedParent(element: Element): Element | null {\n const assignedSlot = (\n element as Element & { assignedSlot?: HTMLSlotElement | null }\n ).assignedSlot;\n if (assignedSlot) return assignedSlot;\n if (element.parentElement) return element.parentElement;\n const root = element.getRootNode();\n if (root && \"host\" in root) {\n const host = (root as ShadowRoot).host;\n if (host.ownerDocument === element.ownerDocument) return host;\n }\n return null;\n}\n","import { composedContains, deepActiveElement } from \"./composed-tree.js\";\n\nexport interface ExternalStore<T> {\n subscribe(listener: () => void): () => void;\n getSnapshot(): T;\n getServerSnapshot(): T;\n}\n\nexport interface AttentionSnapshot {\n readonly visibility: \"visible\" | \"hidden\" | \"unknown\";\n readonly windowFocus: \"focused\" | \"blurred\" | \"unknown\";\n readonly focusArea:\n \"composer\" | \"conversation\" | \"elsewhere\" | \"none\" | \"unknown\";\n readonly newestResponse: \"visible\" | \"outside\" | \"unobserved\" | \"unknown\";\n readonly mode:\n \"foreground\" | \"background\" | \"reading-history\" | \"away\" | \"unknown\";\n}\n\nexport interface AttentionStore extends ExternalStore<AttentionSnapshot> {\n registerComposer(element: Element): () => void;\n registerConversation(element: Element): () => void;\n registerNewestResponse(element: Element): () => void;\n dispose(): void;\n}\n\nexport interface AttentionStoreOptions {\n document?: Document;\n createIntersectionObserver?: AttentionIntersectionObserverFactory;\n intersectionObserverInit?: IntersectionObserverInit;\n}\n\nexport interface AttentionIntersectionObserver {\n observe(target: Element): void;\n unobserve(target: Element): void;\n disconnect(): void;\n}\n\nexport type AttentionIntersectionObserverFactory = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n) => AttentionIntersectionObserver;\n\nconst UNKNOWN_SNAPSHOT: AttentionSnapshot = Object.freeze({\n visibility: \"unknown\",\n windowFocus: \"unknown\",\n focusArea: \"unknown\",\n newestResponse: \"unknown\",\n mode: \"unknown\",\n});\n\nexport function createAttentionStore(\n options: AttentionStoreOptions = {},\n): AttentionStore {\n const selectedDocument =\n options.document ??\n (typeof document === \"undefined\" ? undefined : document);\n if (!selectedDocument) {\n return {\n subscribe: () => () => undefined,\n getSnapshot: () => UNKNOWN_SNAPSHOT,\n getServerSnapshot: () => UNKNOWN_SNAPSHOT,\n registerComposer: () => () => undefined,\n registerConversation: () => () => undefined,\n registerNewestResponse: () => () => undefined,\n dispose: () => undefined,\n };\n }\n\n const listeners = new Set<() => void>();\n const composers = new Map<Element, number>();\n const conversations = new Map<Element, number>();\n const selectedWindow = selectedDocument.defaultView;\n let disposed = false;\n let newestTarget: Element | undefined;\n let newestResult: AttentionSnapshot[\"newestResponse\"] = \"unobserved\";\n let newestRegistration = 0;\n let observer: AttentionIntersectionObserver | undefined;\n let snapshot = makeSnapshot(\n selectedDocument,\n composers,\n conversations,\n newestResult,\n );\n const update = () => {\n if (disposed) return;\n const next = makeSnapshot(\n selectedDocument,\n composers,\n conversations,\n newestResult,\n );\n if (sameSnapshot(snapshot, next)) return;\n snapshot = next;\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // External-store observers cannot prevent other observers from running.\n }\n }\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget === null) update();\n };\n const listenerCleanups: Array<() => void> = [];\n const installListener = (install: () => void, cleanup: () => void): void => {\n // Register cleanup first because a hostile EventTarget can install and then\n // throw from addEventListener(). Removing a listener that was not installed\n // is harmless, while omitting cleanup would leak the accepted listener.\n listenerCleanups.push(cleanup);\n install();\n };\n const cleanupListeners = (): void => {\n for (const cleanup of listenerCleanups.splice(0).reverse()) {\n try {\n cleanup();\n } catch {\n // One hostile removal cannot strand the remaining listeners.\n }\n }\n };\n try {\n installListener(\n () => selectedDocument.addEventListener(\"visibilitychange\", update),\n () => selectedDocument.removeEventListener(\"visibilitychange\", update),\n );\n if (selectedWindow) {\n installListener(\n () => selectedWindow.addEventListener(\"focus\", update),\n () => selectedWindow.removeEventListener(\"focus\", update),\n );\n installListener(\n () => selectedWindow.addEventListener(\"blur\", update),\n () => selectedWindow.removeEventListener(\"blur\", update),\n );\n }\n installListener(\n () => selectedDocument.addEventListener(\"focusin\", update),\n () => selectedDocument.removeEventListener(\"focusin\", update),\n );\n installListener(\n () => selectedDocument.addEventListener(\"focusout\", handleFocusOut),\n () => selectedDocument.removeEventListener(\"focusout\", handleFocusOut),\n );\n } catch (error) {\n cleanupListeners();\n throw error;\n }\n\n const register = (\n elements: Map<Element, number>,\n element: Element,\n ): (() => void) => {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n elements.set(element, (elements.get(element) ?? 0) + 1);\n update();\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n const remaining = (elements.get(element) ?? 1) - 1;\n if (remaining === 0) elements.delete(element);\n else elements.set(element, remaining);\n update();\n };\n };\n\n const createObserver = (\n registration: number,\n target: Element,\n ): AttentionIntersectionObserver | undefined => {\n const factory =\n options.createIntersectionObserver ??\n defaultIntersectionObserverFactory(selectedWindow);\n if (!factory) return undefined;\n let created: AttentionIntersectionObserver | undefined;\n try {\n created = factory((entries) => {\n if (\n disposed ||\n registration !== newestRegistration ||\n newestTarget !== target ||\n observer !== created\n ) {\n return;\n }\n let latest: IntersectionObserverEntry | undefined;\n for (const entry of entries) {\n if (entry.target === target) latest = entry;\n }\n if (!latest) return;\n newestResult = latest.isIntersecting ? \"visible\" : \"outside\";\n update();\n }, options.intersectionObserverInit);\n created.observe(target);\n return created;\n } catch {\n cleanupObserver(created, target);\n return undefined;\n }\n };\n\n const stopObserver = (target?: Element): void => {\n const current = observer;\n observer = undefined;\n cleanupObserver(current, target);\n };\n\n return {\n subscribe(listener) {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n getSnapshot: () => snapshot,\n getServerSnapshot: () => UNKNOWN_SNAPSHOT,\n registerComposer: (element) => register(composers, element),\n registerConversation: (element) => register(conversations, element),\n registerNewestResponse(element) {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n const registration = ++newestRegistration;\n stopObserver(newestTarget);\n newestTarget = element;\n newestResult = \"unknown\";\n observer = createObserver(registration, element);\n update();\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n if (registration !== newestRegistration || newestTarget !== element)\n return;\n stopObserver(element);\n newestTarget = undefined;\n newestResult = \"unobserved\";\n update();\n };\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n listeners.clear();\n composers.clear();\n conversations.clear();\n stopObserver(newestTarget);\n newestTarget = undefined;\n cleanupListeners();\n },\n };\n}\n\nfunction makeSnapshot(\n document: Document,\n composers: ReadonlyMap<Element, number>,\n conversations: ReadonlyMap<Element, number>,\n newestResponse: AttentionSnapshot[\"newestResponse\"],\n): AttentionSnapshot {\n const visibility = readVisibility(document);\n const windowFocus = readWindowFocus(document);\n return Object.freeze({\n visibility,\n windowFocus,\n focusArea: readFocusArea(document, composers, conversations),\n newestResponse,\n mode: deriveMode(visibility, windowFocus, newestResponse),\n });\n}\n\nfunction deriveMode(\n visibility: AttentionSnapshot[\"visibility\"],\n windowFocus: AttentionSnapshot[\"windowFocus\"],\n newestResponse: AttentionSnapshot[\"newestResponse\"],\n): AttentionSnapshot[\"mode\"] {\n if (visibility === \"hidden\") return \"background\";\n if (visibility !== \"visible\") return \"unknown\";\n if (windowFocus === \"blurred\") return \"away\";\n if (windowFocus !== \"focused\") return \"unknown\";\n if (newestResponse === \"outside\") return \"reading-history\";\n if (newestResponse === \"visible\") return \"foreground\";\n return \"unknown\";\n}\n\nfunction defaultIntersectionObserverFactory(\n window: (Window & typeof globalThis) | null,\n): AttentionIntersectionObserverFactory | undefined {\n const Constructor = window?.IntersectionObserver;\n if (typeof Constructor !== \"function\") return undefined;\n return (callback, options) => new Constructor(callback, options);\n}\n\nfunction cleanupObserver(\n observer: AttentionIntersectionObserver | undefined,\n target?: Element,\n): void {\n if (!observer) return;\n if (target) {\n try {\n observer.unobserve(target);\n } catch {\n // Intersection cleanup errors are deliberately suppressed.\n }\n }\n try {\n observer.disconnect();\n } catch {\n // Intersection cleanup errors are deliberately suppressed.\n }\n}\n\nfunction readFocusArea(\n document: Document,\n composers: ReadonlyMap<Element, number>,\n conversations: ReadonlyMap<Element, number>,\n): AttentionSnapshot[\"focusArea\"] {\n let activeElement: Element | null;\n try {\n activeElement = deepActiveElement(document);\n } catch {\n return \"unknown\";\n }\n if (\n activeElement === null ||\n activeElement === document.body ||\n activeElement === document.documentElement\n ) {\n return \"none\";\n }\n if (\n [...composers.keys()].some((element) =>\n composedContains(element, activeElement),\n )\n ) {\n return \"composer\";\n }\n if (\n [...conversations.keys()].some((element) =>\n composedContains(element, activeElement),\n )\n ) {\n return \"conversation\";\n }\n return \"elsewhere\";\n}\n\nfunction readVisibility(document: Document): AttentionSnapshot[\"visibility\"] {\n try {\n if (document.visibilityState === \"visible\") return \"visible\";\n if (document.visibilityState === \"hidden\") return \"hidden\";\n } catch {\n // Browser integrations can expose throwing accessors.\n }\n return \"unknown\";\n}\n\nfunction readWindowFocus(document: Document): AttentionSnapshot[\"windowFocus\"] {\n try {\n if (typeof document.hasFocus !== \"function\") return \"unknown\";\n return document.hasFocus() ? \"focused\" : \"blurred\";\n } catch {\n return \"unknown\";\n }\n}\n\nfunction sameSnapshot(\n left: AttentionSnapshot,\n right: AttentionSnapshot,\n): boolean {\n return (\n left.visibility === right.visibility &&\n left.windowFocus === right.windowFocus &&\n left.focusArea === right.focusArea &&\n left.newestResponse === right.newestResponse &&\n left.mode === right.mode\n );\n}\n","import {\n composedContains,\n composedParent,\n deepActiveElement,\n} from \"./composed-tree.js\";\n\nexport interface FocusCapture {\n readonly document: Document | null;\n readonly target: Element | null;\n}\n\nexport interface FocusElementOptions {\n preventScroll?: boolean;\n}\n\nexport interface RestoreFocusOptions extends FocusElementOptions {\n onlyIfFocusWithin?: Element;\n}\n\nexport type FocusSkippedReason =\n | \"unavailable\"\n | \"cross-document\"\n | \"disconnected\"\n | \"disabled\"\n | \"hidden\"\n | \"aria-hidden\"\n | \"inert\"\n | \"missing-focus\"\n | \"guard-mismatch\"\n | \"focus-error\"\n | \"focus-not-applied\";\n\nexport type FocusResult =\n | { readonly status: \"focused\"; readonly target: Element }\n | {\n readonly status: \"skipped\";\n readonly reason: FocusSkippedReason;\n readonly target: Element | null;\n };\n\nexport function captureFocus(selectedDocument?: Document): FocusCapture {\n const document =\n selectedDocument ??\n (typeof globalThis.document === \"undefined\"\n ? undefined\n : globalThis.document);\n if (!document) return Object.freeze({ document: null, target: null });\n let target: Element | null = null;\n try {\n const active = deepActiveElement(document);\n if (\n active !== null &&\n active !== document.body &&\n active !== document.documentElement &&\n active.ownerDocument === document\n ) {\n target = active;\n }\n } catch {\n // A hostile document is captured without a restorable target.\n }\n return Object.freeze({ document, target });\n}\n\nexport function focusElement(\n target: Element,\n options: FocusElementOptions = {},\n): FocusResult {\n const eligibility = focusEligibility(target);\n if (eligibility) {\n return { status: \"skipped\", reason: eligibility, target };\n }\n let focus: ((options?: FocusOptions) => void) | undefined;\n let document: Document;\n let previous: Element | null;\n try {\n document = target.ownerDocument;\n previous = deepActiveElement(document);\n focus = (target as Element & { focus?: (options?: FocusOptions) => void })\n .focus;\n } catch {\n return { status: \"skipped\", reason: \"unavailable\", target };\n }\n if (typeof focus !== \"function\") {\n return { status: \"skipped\", reason: \"missing-focus\", target };\n }\n let focusThrew = false;\n try {\n focus.call(target, { preventScroll: options.preventScroll ?? true });\n } catch {\n focusThrew = true;\n }\n if (focusThrew) {\n restorePreviousFocus(previous, target, document);\n return { status: \"skipped\", reason: \"focus-error\", target };\n }\n const postFocusEligibility = focusEligibility(target);\n let active: Element | null;\n try {\n active = deepActiveElement(document);\n } catch {\n return { status: \"skipped\", reason: \"focus-error\", target };\n }\n if (postFocusEligibility) {\n if (active === target) restorePreviousFocus(previous, target, document);\n return { status: \"skipped\", reason: postFocusEligibility, target };\n }\n if (active !== target) {\n return { status: \"skipped\", reason: \"focus-not-applied\", target };\n }\n return { status: \"focused\", target };\n}\n\nexport function restoreFocus(\n capture: FocusCapture,\n options: RestoreFocusOptions = {},\n): FocusResult {\n let document: Document | null;\n let target: Element | null;\n try {\n document = capture.document;\n target = capture.target;\n } catch {\n return { status: \"skipped\", reason: \"unavailable\", target: null };\n }\n if (!document || !target) {\n return { status: \"skipped\", reason: \"unavailable\", target: null };\n }\n try {\n if (target.ownerDocument !== document) {\n return { status: \"skipped\", reason: \"cross-document\", target };\n }\n const guard = options.onlyIfFocusWithin;\n if (guard !== undefined) {\n const active = deepActiveElement(document);\n if (\n guard.ownerDocument !== document ||\n active === null ||\n !composedContains(guard, active)\n ) {\n return { status: \"skipped\", reason: \"guard-mismatch\", target };\n }\n }\n } catch {\n return { status: \"skipped\", reason: \"guard-mismatch\", target };\n }\n return focusElement(target, options);\n}\n\nfunction focusEligibility(target: Element): FocusSkippedReason | undefined {\n let ownerDocument: Document;\n try {\n ownerDocument = target.ownerDocument;\n const ElementConstructor = ownerDocument.defaultView?.Element;\n if (\n !ownerDocument ||\n (ElementConstructor && !(target instanceof ElementConstructor))\n ) {\n return \"unavailable\";\n }\n if (target.isConnected !== true) return \"disconnected\";\n if (\n target.getAttribute(\"disabled\") !== null ||\n (target as Element & { disabled?: unknown }).disabled === true\n ) {\n return \"disabled\";\n }\n } catch {\n return \"unavailable\";\n }\n try {\n const matches = target.matches;\n if (typeof matches === \"function\" && matches.call(target, \":disabled\")) {\n return \"disabled\";\n }\n } catch {\n // Fall back to the direct disabled checks above.\n }\n\n try {\n let current: Element | null = target;\n const visited = new Set<Element>();\n while (current) {\n if (visited.has(current)) return \"unavailable\";\n visited.add(current);\n if (current.hasAttribute(\"hidden\")) return \"hidden\";\n if (current.getAttribute(\"aria-hidden\")?.trim().toLowerCase() === \"true\")\n return \"aria-hidden\";\n if (\n current.hasAttribute(\"inert\") ||\n (current as Element & { inert?: unknown }).inert === true\n ) {\n return \"inert\";\n }\n current = composedParent(current);\n }\n } catch {\n return \"unavailable\";\n }\n\n try {\n const focus = (\n target as Element & {\n focus?: (options?: FocusOptions) => void;\n }\n ).focus;\n if (typeof focus !== \"function\") return \"missing-focus\";\n } catch {\n return \"unavailable\";\n }\n return undefined;\n}\n\nfunction restorePreviousFocus(\n previous: Element | null,\n attempted: Element,\n document: Document,\n): void {\n try {\n if (\n !previous ||\n deepActiveElement(document) !== attempted ||\n focusEligibility(previous) !== undefined\n ) {\n return;\n }\n const focus = (\n previous as Element & {\n focus?: (options?: FocusOptions) => void;\n }\n ).focus;\n if (typeof focus === \"function\")\n focus.call(previous, { preventScroll: true });\n } catch {\n // Focus rollback is best-effort at hostile DOM boundaries.\n }\n}\n","import type { PolicyOverrides, PresetName } from \"@generative-a11y/core\";\n\nimport type { ExternalStore } from \"./attention.js\";\n\nexport type StreamingVerbosity =\n \"preset\" | \"off\" | \"completion\" | \"paragraph\" | \"sentence\";\n\nexport type ToolVerbosity =\n \"preset\" | \"off\" | \"failures\" | \"status\" | \"progress\";\n\nexport type PreferenceSchemaV1 =\n | Readonly<{ version: 1; preset: \"completion-only\" }>\n | Readonly<{\n version: 1;\n preset: \"minimal\" | \"balanced\" | \"verbose\";\n streaming: StreamingVerbosity;\n tools: ToolVerbosity;\n }>;\n\nexport interface PreferenceStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport interface PreferenceStorageEvent {\n readonly key: string | null;\n readonly newValue: string | null;\n readonly storageArea?: PreferenceStorage | null;\n}\n\nexport interface PreferenceStorageEventSource {\n subscribe(listener: (event: PreferenceStorageEvent) => void): () => void;\n}\n\nexport type PreferenceDiagnosticSource =\n | \"storage-read\"\n | \"storage-write\"\n | \"storage-event\"\n | \"event-subscribe\"\n | \"event-unsubscribe\";\n\nexport type PreferenceDiagnosticCode =\n | \"operation-failed\"\n | \"invalid-json\"\n | \"invalid-preference\"\n | \"unsupported-version\";\n\nexport interface PreferenceDiagnostic {\n readonly source: PreferenceDiagnosticSource;\n readonly code: PreferenceDiagnosticCode;\n readonly error?: Readonly<{ name: string; message: string }>;\n}\n\nexport interface PreferencePersistence {\n readonly key: string;\n readonly storage?: PreferenceStorage;\n readonly events?: PreferenceStorageEventSource;\n}\n\nexport interface PreferenceStoreOptions {\n readonly defaultValue?: PreferenceSchemaV1;\n readonly persistence?: PreferencePersistence;\n readonly onDiagnostic?: (diagnostic: PreferenceDiagnostic) => void;\n}\n\nexport interface PreferenceStore extends ExternalStore<PreferenceSchemaV1> {\n setPreferences(value: PreferenceSchemaV1): void;\n dispose(): void;\n}\n\nexport interface CorePreferenceConfiguration {\n readonly preset: PresetName;\n readonly policy?: PolicyOverrides;\n}\n\nexport const defaultPreferences: PreferenceSchemaV1 = Object.freeze({\n version: 1,\n preset: \"balanced\",\n streaming: \"preset\",\n tools: \"preset\",\n});\n\nexport function preferencesToCoreConfiguration(\n value: PreferenceSchemaV1,\n): CorePreferenceConfiguration {\n const preferences = normalizePreferences(value);\n if (preferences.preset === \"completion-only\") {\n return { preset: \"completion-only\" };\n }\n const policy: PolicyOverrides = {};\n const text = mapStreaming(preferences.streaming);\n const tools = mapTools(preferences.tools);\n if (text) policy.text = text;\n if (tools) policy.tools = tools;\n return Object.keys(policy).length === 0\n ? { preset: preferences.preset }\n : { preset: preferences.preset, policy };\n}\n\nexport function createPreferenceStore(\n options: PreferenceStoreOptions = {},\n): PreferenceStore {\n const configuredDefault = options.defaultValue\n ? normalizePreferences(options.defaultValue)\n : defaultPreferences;\n const persistence = resolvePersistence(options.persistence);\n const report = (\n source: PreferenceDiagnosticSource,\n code: PreferenceDiagnosticCode,\n cause?: unknown,\n ): void => {\n const diagnostic: PreferenceDiagnostic = {\n source,\n code,\n ...(cause === undefined ? {} : { error: serializeError(cause) }),\n };\n try {\n options.onDiagnostic?.(diagnostic);\n } catch {\n // Diagnostics are observational.\n }\n };\n let current = configuredDefault;\n if (persistence?.storage) {\n try {\n const stored = persistence.storage.getItem(persistence.key);\n if (stored !== null) {\n current = parsePreferences(stored, \"storage-read\", report) ?? current;\n }\n } catch (cause) {\n report(\"storage-read\", \"operation-failed\", cause);\n }\n }\n let disposed = false;\n let eventEpoch = 0;\n const listeners = new Set<() => void>();\n let unsubscribeEvents: (() => void) | undefined;\n\n const notify = (): void => {\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // External-store listeners cannot prevent other listeners.\n }\n }\n };\n const replace = (next: PreferenceSchemaV1): boolean => {\n if (samePreferences(current, next)) return false;\n current = next;\n notify();\n return true;\n };\n const handleStorageEvent = (event: PreferenceStorageEvent): void => {\n if (disposed || !persistence) return;\n const epoch = ++eventEpoch;\n let key: string | null;\n let newValue: string | null;\n let storageArea: PreferenceStorage | null | undefined;\n try {\n key = event.key;\n newValue = event.newValue;\n storageArea = event.storageArea;\n } catch (cause) {\n if (!disposed && epoch === eventEpoch) {\n report(\"storage-event\", \"operation-failed\", cause);\n }\n return;\n }\n if (disposed || epoch !== eventEpoch) return;\n try {\n if (storageArea != null && storageArea !== persistence.storage) {\n return;\n }\n if (key !== null && key !== persistence.key) return;\n if (key === null || newValue === null) {\n replace(configuredDefault);\n return;\n }\n const next = parsePreferences(newValue, \"storage-event\", report);\n if (!disposed && epoch === eventEpoch && next) replace(next);\n } catch (cause) {\n if (!disposed && epoch === eventEpoch) {\n report(\"storage-event\", \"operation-failed\", cause);\n }\n }\n };\n\n if (persistence?.events) {\n try {\n unsubscribeEvents = persistence.events.subscribe(handleStorageEvent);\n } catch (cause) {\n report(\"event-subscribe\", \"operation-failed\", cause);\n }\n }\n\n return {\n subscribe(listener) {\n if (disposed) throw new Error(\"PreferenceStore is disposed\");\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n getSnapshot: () => current,\n getServerSnapshot: () => configuredDefault,\n setPreferences(value) {\n if (disposed) throw new Error(\"PreferenceStore is disposed\");\n const next = normalizePreferences(value);\n const changed = replace(next);\n if (!disposed && persistence?.storage && samePreferences(current, next)) {\n const serialized = JSON.stringify(next);\n if (!changed) {\n const epoch = eventEpoch;\n let matchesStoredValue = false;\n try {\n matchesStoredValue =\n persistence.storage.getItem(persistence.key) === serialized;\n } catch (cause) {\n report(\"storage-read\", \"operation-failed\", cause);\n }\n if (\n matchesStoredValue ||\n disposed ||\n epoch !== eventEpoch ||\n !samePreferences(current, next)\n ) {\n return;\n }\n }\n if (disposed || !samePreferences(current, next)) return;\n try {\n persistence.storage.setItem(persistence.key, serialized);\n } catch (cause) {\n report(\"storage-write\", \"operation-failed\", cause);\n }\n }\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n eventEpoch += 1;\n listeners.clear();\n const unsubscribe = unsubscribeEvents;\n unsubscribeEvents = undefined;\n if (unsubscribe) {\n try {\n unsubscribe();\n } catch (cause) {\n report(\"event-unsubscribe\", \"operation-failed\", cause);\n }\n }\n },\n };\n}\n\ninterface ResolvedPreferencePersistence {\n readonly key: string;\n readonly storage?: PreferenceStorage;\n readonly events?: PreferenceStorageEventSource;\n}\n\nfunction resolvePersistence(\n persistence: PreferencePersistence | undefined,\n): ResolvedPreferencePersistence | undefined {\n if (!persistence) return undefined;\n if (persistence.storage) return persistence;\n const browser = getBrowserPersistence();\n return {\n key: persistence.key,\n ...(browser?.storage ? { storage: browser.storage } : {}),\n ...(persistence.events\n ? { events: persistence.events }\n : browser?.events\n ? { events: browser.events }\n : {}),\n };\n}\n\nfunction getBrowserPersistence():\n | { storage: PreferenceStorage; events: PreferenceStorageEventSource }\n | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const browserWindow = window;\n const storage = browserWindow.localStorage;\n if (!storage) return undefined;\n return {\n storage,\n events: {\n subscribe(listener) {\n const handle = (event: StorageEvent): void => listener(event);\n browserWindow.addEventListener(\"storage\", handle);\n return () => browserWindow.removeEventListener(\"storage\", handle);\n },\n },\n };\n } catch {\n return undefined;\n }\n}\n\nfunction parsePreferences(\n raw: string,\n source: \"storage-read\" | \"storage-event\",\n report: (\n source: PreferenceDiagnosticSource,\n code: PreferenceDiagnosticCode,\n cause?: unknown,\n ) => void,\n): PreferenceSchemaV1 | undefined {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (cause) {\n report(source, \"invalid-json\", cause);\n return undefined;\n }\n try {\n return normalizePreferences(value as PreferenceSchemaV1);\n } catch (cause) {\n report(\n source,\n cause instanceof UnsupportedPreferenceVersionError\n ? \"unsupported-version\"\n : \"invalid-preference\",\n cause,\n );\n return undefined;\n }\n}\n\nclass UnsupportedPreferenceVersionError extends TypeError {}\n\nexport function normalizePreferences(\n value: PreferenceSchemaV1,\n): PreferenceSchemaV1 {\n const fields = snapshotPreferenceFields(value);\n if (fields.version !== 1)\n throw new UnsupportedPreferenceVersionError(\n \"Unsupported preference version\",\n );\n if (fields.preset === \"completion-only\") {\n if (!hasExactKeys(fields, [\"version\", \"preset\"]))\n throw new TypeError(\"Invalid completion-only preferences\");\n return Object.freeze({ version: 1, preset: \"completion-only\" });\n }\n if (\n !([\"minimal\", \"balanced\", \"verbose\"] as unknown[]).includes(fields.preset)\n )\n throw new TypeError(\"Invalid preference preset\");\n if (!hasExactKeys(fields, [\"version\", \"preset\", \"streaming\", \"tools\"]))\n throw new TypeError(\"Invalid preference fields\");\n if (!STREAMING_VALUES.includes(fields.streaming as StreamingVerbosity))\n throw new TypeError(\"Invalid streaming preference\");\n if (!TOOL_VALUES.includes(fields.tools as ToolVerbosity))\n throw new TypeError(\"Invalid tool preference\");\n return Object.freeze({\n version: 1,\n preset: fields.preset as \"minimal\" | \"balanced\" | \"verbose\",\n streaming: fields.streaming as StreamingVerbosity,\n tools: fields.tools as ToolVerbosity,\n });\n}\n\nconst STREAMING_VALUES: readonly StreamingVerbosity[] = [\n \"preset\",\n \"off\",\n \"completion\",\n \"paragraph\",\n \"sentence\",\n];\nconst TOOL_VALUES: readonly ToolVerbosity[] = [\n \"preset\",\n \"off\",\n \"failures\",\n \"status\",\n \"progress\",\n];\n\nfunction snapshotPreferenceFields(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"Invalid preferences\");\n }\n try {\n const descriptors = Object.getOwnPropertyDescriptors(value);\n const fields = Object.create(null) as Record<string, unknown>;\n for (const key of Reflect.ownKeys(descriptors)) {\n if (typeof key !== \"string\")\n throw new TypeError(\"Invalid preference fields\");\n const descriptor = descriptors[key];\n if (!descriptor?.enumerable || !(\"value\" in descriptor)) {\n throw new TypeError(\n \"Preference fields must be enumerable data properties\",\n );\n }\n fields[key] = descriptor.value;\n }\n return fields;\n } catch {\n throw new TypeError(\"Invalid preferences\");\n }\n}\n\nfunction hasExactKeys(\n value: Record<string, unknown>,\n expected: readonly string[],\n): boolean {\n const keys = Object.keys(value);\n return (\n keys.length === expected.length &&\n expected.every((key) => keys.includes(key))\n );\n}\n\nexport function samePreferences(\n left: PreferenceSchemaV1,\n right: PreferenceSchemaV1,\n): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction mapStreaming(\n value: StreamingVerbosity,\n): PolicyOverrides[\"text\"] | undefined {\n if (value === \"preset\") return undefined;\n if (value === \"off\") return { strategy: \"silent\" };\n if (value === \"completion\")\n return { strategy: \"completion\", minimumCharacters: 0, maximumDelayMs: 0 };\n return { strategy: value };\n}\n\nfunction mapTools(value: ToolVerbosity): PolicyOverrides[\"tools\"] | undefined {\n if (value === \"preset\") return undefined;\n return {\n announceStart: value === \"status\" || value === \"progress\",\n announceProgress: value === \"progress\",\n announceCompletion: value === \"status\" || value === \"progress\",\n announceFailure: value !== \"off\",\n };\n}\n\nfunction serializeError(cause: unknown): Readonly<{\n name: string;\n message: string;\n}> {\n const fallback = { name: \"Error\", message: \"Unknown error\" } as const;\n try {\n if (cause instanceof Error) {\n const name = cause.name;\n const message = cause.message;\n if (typeof name !== \"string\" || typeof message !== \"string\") {\n return fallback;\n }\n return { name: name || \"Error\", message };\n }\n if (\n typeof cause === \"string\" ||\n typeof cause === \"number\" ||\n typeof cause === \"boolean\" ||\n typeof cause === \"bigint\" ||\n typeof cause === \"symbol\"\n ) {\n return { name: \"Error\", message: String(cause) };\n }\n } catch {\n return fallback;\n }\n return fallback;\n}\n","import type {\n AnnouncementIntent,\n GenerativeA11yRuntime,\n} from \"@generative-a11y/core\";\n\nexport {\n createAttentionStore,\n type AttentionIntersectionObserver,\n type AttentionIntersectionObserverFactory,\n type AttentionSnapshot,\n type AttentionStore,\n type AttentionStoreOptions,\n type ExternalStore,\n} from \"./attention.js\";\n\nexport {\n captureFocus,\n focusElement,\n restoreFocus,\n type FocusCapture,\n type FocusElementOptions,\n type FocusResult,\n type FocusSkippedReason,\n type RestoreFocusOptions,\n} from \"./focus.js\";\n\nexport {\n createPreferenceStore,\n defaultPreferences,\n normalizePreferences,\n preferencesToCoreConfiguration,\n type CorePreferenceConfiguration,\n type PreferenceDiagnostic,\n type PreferenceDiagnosticCode,\n type PreferenceDiagnosticSource,\n type PreferencePersistence,\n type PreferenceSchemaV1,\n type PreferenceStorage,\n type PreferenceStorageEvent,\n type PreferenceStorageEventSource,\n type PreferenceStore,\n type PreferenceStoreOptions,\n samePreferences,\n type StreamingVerbosity,\n type ToolVerbosity,\n} from \"./preferences.js\";\n\nexport type DOMAnnouncementMode = \"auto\" | \"aria-notify\" | \"live-region\";\n\nexport interface DOMLiveRegions {\n polite: HTMLElement;\n assertive: HTMLElement;\n}\n\nexport interface DOMDeliveryResult {\n status: \"notified\" | \"mutated\" | \"unavailable\" | \"disposed\";\n method: \"aria-notify\" | \"live-region\" | \"none\";\n channel: AnnouncementIntent[\"channel\"];\n error?: { name: string; message: string };\n}\n\nexport interface DOMAnnouncerOptions {\n document?: Document;\n mode?: DOMAnnouncementMode;\n regions?: DOMLiveRegions;\n onDiagnostic?: (result: DOMDeliveryResult) => void;\n}\n\nexport interface DOMAnnouncer {\n announce(intent: AnnouncementIntent): DOMDeliveryResult;\n getRegions(): DOMLiveRegions | undefined;\n dispose(): void;\n}\n\nexport interface DOMRuntimeBinding {\n announcer: DOMAnnouncer;\n dispose(): void;\n}\n\nexport function createDOMAnnouncer(\n options: DOMAnnouncerOptions = {},\n): DOMAnnouncer {\n validateSuppliedRegions(options);\n const selectedDocument =\n options.document ??\n options.regions?.polite.ownerDocument ??\n (typeof document === \"undefined\" ? undefined : document);\n const ownsRegions = options.regions === undefined;\n const regions = options.regions ?? createLiveRegions(selectedDocument);\n\n if (regions) {\n configureRegion(regions.polite, \"polite\");\n configureRegion(regions.assertive, \"assertive\");\n }\n let notifierEnabled = true;\n let disposed = false;\n\n const report = (result: DOMDeliveryResult): DOMDeliveryResult => {\n try {\n options.onDiagnostic?.(result);\n } catch {\n // Diagnostics are observational and cannot affect delivery.\n }\n return result;\n };\n\n return {\n announce(intent) {\n if (disposed) {\n return report({\n status: \"disposed\",\n method: \"none\",\n channel: intent.channel,\n });\n }\n if (regions) {\n const region = regions[intent.channel];\n applyLocale(region, intent.locale);\n let error: DOMDeliveryResult[\"error\"];\n if (notifierEnabled && options.mode !== \"live-region\") {\n let notified = false;\n try {\n const ariaNotify = (region as AriaNotifyRegion).ariaNotify;\n if (typeof ariaNotify === \"function\") {\n ariaNotify.call(region, intent.text, {\n priority: intent.channel === \"assertive\" ? \"high\" : \"normal\",\n });\n notified = true;\n }\n } catch (cause) {\n notifierEnabled = false;\n error = serializeError(cause);\n }\n if (notified) {\n return report({\n status: \"notified\",\n method: \"aria-notify\",\n channel: intent.channel,\n });\n }\n }\n region.textContent = intent.text;\n return report({\n status: \"mutated\",\n method: \"live-region\",\n channel: intent.channel,\n ...(error === undefined ? {} : { error }),\n });\n }\n return report({\n status: \"unavailable\",\n method: \"none\",\n channel: intent.channel,\n });\n },\n getRegions() {\n return regions;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (ownsRegions) {\n regions?.polite.remove();\n regions?.assertive.remove();\n }\n },\n };\n}\n\nfunction validateSuppliedRegions(options: DOMAnnouncerOptions): void {\n if (options.regions === undefined) return;\n const { polite, assertive } = options.regions;\n if (polite === assertive) {\n throw new TypeError(\n \"Polite and assertive regions must be distinct elements\",\n );\n }\n if (!polite.isConnected || !assertive.isConnected) {\n throw new TypeError(\"Supplied regions must be connected\");\n }\n if (polite.contains(assertive) || assertive.contains(polite)) {\n throw new TypeError(\n \"Polite and assertive regions must not contain one another\",\n );\n }\n if (polite.ownerDocument !== assertive.ownerDocument) {\n throw new TypeError(\n \"Polite and assertive regions must belong to the same document\",\n );\n }\n if (\n options.document !== undefined &&\n (polite.ownerDocument !== options.document ||\n assertive.ownerDocument !== options.document)\n ) {\n throw new TypeError(\n \"Supplied regions must belong to the provided document\",\n );\n }\n}\n\nfunction serializeError(\n error: unknown,\n): NonNullable<DOMDeliveryResult[\"error\"]> {\n try {\n if (error instanceof Error) {\n return {\n name: readErrorString(error, \"name\", \"Error\"),\n message: readErrorString(error, \"message\", \"Unknown error\"),\n };\n }\n } catch {\n // Hostile proxies can throw during instanceof checks.\n }\n return { name: \"Error\", message: safeString(error, \"Unknown error\") };\n}\n\nfunction readErrorString(\n error: Error,\n property: \"name\" | \"message\",\n fallback: string,\n): string {\n try {\n return safeString(error[property], fallback);\n } catch {\n return fallback;\n }\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\ninterface AriaNotifyRegion extends HTMLElement {\n ariaNotify?: (\n text: string,\n options?: { priority: \"normal\" | \"high\" },\n ) => void;\n}\n\nfunction createLiveRegions(\n selectedDocument: Document | undefined,\n): DOMLiveRegions | undefined {\n const parent = selectedDocument?.body ?? selectedDocument?.documentElement;\n if (!selectedDocument || !parent) return undefined;\n\n const regions = {\n polite: selectedDocument.createElement(\"div\"),\n assertive: selectedDocument.createElement(\"div\"),\n };\n parent.append(regions.polite, regions.assertive);\n return regions;\n}\n\nfunction configureRegion(\n region: HTMLElement,\n channel: AnnouncementIntent[\"channel\"],\n): void {\n region.removeAttribute(\"role\");\n region.removeAttribute(\"aria-busy\");\n region.removeAttribute(\"hidden\");\n region.removeAttribute(\"aria-hidden\");\n region.inert = false;\n region.removeAttribute(\"inert\");\n region.style.removeProperty(\"display\");\n region.style.removeProperty(\"visibility\");\n region.style.removeProperty(\"content-visibility\");\n region.setAttribute(\"aria-live\", channel);\n region.setAttribute(\"aria-atomic\", \"true\");\n region.setAttribute(\"aria-relevant\", \"additions text\");\n Object.assign(region.style, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n });\n}\n\nfunction applyLocale(region: HTMLElement, locale: string | undefined): void {\n if (locale === undefined) region.removeAttribute(\"lang\");\n else region.setAttribute(\"lang\", locale);\n}\n\nexport function connectRuntimeToDOM(\n runtime: GenerativeA11yRuntime,\n options: DOMAnnouncerOptions = {},\n): DOMRuntimeBinding {\n const announcer = createDOMAnnouncer(options);\n let disposed = false;\n let unsubscribe: () => void;\n try {\n unsubscribe = runtime.subscribeAnnouncements((intent) => {\n if (!disposed) announcer.announce(intent);\n });\n } catch (cause) {\n announcer.dispose();\n throw cause;\n }\n\n return {\n announcer,\n dispose() {\n if (disposed) return;\n disposed = true;\n try {\n unsubscribe();\n } finally {\n announcer.dispose();\n }\n },\n };\n}\n"],"mappings":"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","names":["document","document","window","document","serializeError"]}
|
|
1
|
+
{"version":3,"sources":["../src/composed-tree.ts","../src/attention.ts","../src/focus.ts","../src/preferences.ts","../src/index.ts"],"sourcesContent":["export function deepActiveElement(document: Document): Element | null {\n let active = document.activeElement;\n const visited = new Set<Element>();\n while (active) {\n if (visited.has(active)) throw new Error(\"Cyclic active element\");\n visited.add(active);\n const shadow = (active as Element & { shadowRoot?: ShadowRoot | null })\n .shadowRoot;\n const nested = shadow?.activeElement;\n if (!nested) return active;\n active = nested;\n }\n return null;\n}\n\nexport function composedContains(ancestor: Element, target: Element): boolean {\n let current: Element | null = target;\n const visited = new Set<Element>();\n while (current) {\n if (current === ancestor) return true;\n if (visited.has(current)) throw new Error(\"Cyclic composed tree\");\n visited.add(current);\n current = composedParent(current);\n }\n return false;\n}\n\nexport function composedParent(element: Element): Element | null {\n const assignedSlot = (\n element as Element & { assignedSlot?: HTMLSlotElement | null }\n ).assignedSlot;\n if (assignedSlot) return assignedSlot;\n if (element.parentElement) return element.parentElement;\n const root = element.getRootNode();\n if (root && \"host\" in root) {\n const host = (root as ShadowRoot).host;\n if (host.ownerDocument === element.ownerDocument) return host;\n }\n return null;\n}\n","import { composedContains, deepActiveElement } from \"./composed-tree.js\";\n\nexport interface ExternalStore<T> {\n subscribe(listener: () => void): () => void;\n getSnapshot(): T;\n getServerSnapshot(): T;\n}\n\nexport interface AttentionSnapshot {\n readonly visibility: \"visible\" | \"hidden\" | \"unknown\";\n readonly windowFocus: \"focused\" | \"blurred\" | \"unknown\";\n readonly focusArea:\n \"composer\" | \"conversation\" | \"elsewhere\" | \"none\" | \"unknown\";\n readonly newestResponse: \"visible\" | \"outside\" | \"unobserved\" | \"unknown\";\n readonly mode:\n \"foreground\" | \"background\" | \"reading-history\" | \"away\" | \"unknown\";\n}\n\nexport interface AttentionStore extends ExternalStore<AttentionSnapshot> {\n registerComposer(element: Element): () => void;\n registerConversation(element: Element): () => void;\n registerNewestResponse(element: Element): () => void;\n dispose(): void;\n}\n\nexport interface AttentionStoreOptions {\n document?: Document;\n createIntersectionObserver?: AttentionIntersectionObserverFactory;\n intersectionObserverInit?: IntersectionObserverInit;\n}\n\nexport interface AttentionIntersectionObserver {\n observe(target: Element): void;\n unobserve(target: Element): void;\n disconnect(): void;\n}\n\nexport type AttentionIntersectionObserverFactory = (\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n) => AttentionIntersectionObserver;\n\nconst UNKNOWN_SNAPSHOT: AttentionSnapshot = Object.freeze({\n visibility: \"unknown\",\n windowFocus: \"unknown\",\n focusArea: \"unknown\",\n newestResponse: \"unknown\",\n mode: \"unknown\",\n});\n\nexport function createAttentionStore(\n options: AttentionStoreOptions = {},\n): AttentionStore {\n const selectedDocument =\n options.document ??\n (typeof document === \"undefined\" ? undefined : document);\n if (!selectedDocument) {\n return {\n subscribe: () => () => undefined,\n getSnapshot: () => UNKNOWN_SNAPSHOT,\n getServerSnapshot: () => UNKNOWN_SNAPSHOT,\n registerComposer: () => () => undefined,\n registerConversation: () => () => undefined,\n registerNewestResponse: () => () => undefined,\n dispose: () => undefined,\n };\n }\n\n const listeners = new Set<() => void>();\n const composers = new Map<Element, number>();\n const conversations = new Map<Element, number>();\n const selectedWindow = selectedDocument.defaultView;\n let disposed = false;\n let newestTarget: Element | undefined;\n let newestResult: AttentionSnapshot[\"newestResponse\"] = \"unobserved\";\n let newestRegistration = 0;\n let observer: AttentionIntersectionObserver | undefined;\n let snapshot = makeSnapshot(\n selectedDocument,\n composers,\n conversations,\n newestResult,\n );\n const update = () => {\n if (disposed) return;\n const next = makeSnapshot(\n selectedDocument,\n composers,\n conversations,\n newestResult,\n );\n if (sameSnapshot(snapshot, next)) return;\n snapshot = next;\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // External-store observers cannot prevent other observers from running.\n }\n }\n };\n const handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget === null) update();\n };\n const listenerCleanups: Array<() => void> = [];\n const installListener = (install: () => void, cleanup: () => void): void => {\n // Register cleanup first because a hostile EventTarget can install and then\n // throw from addEventListener(). Removing a listener that was not installed\n // is harmless, while omitting cleanup would leak the accepted listener.\n listenerCleanups.push(cleanup);\n install();\n };\n const cleanupListeners = (): void => {\n for (const cleanup of listenerCleanups.splice(0).reverse()) {\n try {\n cleanup();\n } catch {\n // One hostile removal cannot strand the remaining listeners.\n }\n }\n };\n try {\n installListener(\n () => selectedDocument.addEventListener(\"visibilitychange\", update),\n () => selectedDocument.removeEventListener(\"visibilitychange\", update),\n );\n if (selectedWindow) {\n installListener(\n () => selectedWindow.addEventListener(\"focus\", update),\n () => selectedWindow.removeEventListener(\"focus\", update),\n );\n installListener(\n () => selectedWindow.addEventListener(\"blur\", update),\n () => selectedWindow.removeEventListener(\"blur\", update),\n );\n }\n installListener(\n () => selectedDocument.addEventListener(\"focusin\", update),\n () => selectedDocument.removeEventListener(\"focusin\", update),\n );\n installListener(\n () => selectedDocument.addEventListener(\"focusout\", handleFocusOut),\n () => selectedDocument.removeEventListener(\"focusout\", handleFocusOut),\n );\n } catch (error) {\n cleanupListeners();\n throw error;\n }\n\n const register = (\n elements: Map<Element, number>,\n element: Element,\n ): (() => void) => {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n elements.set(element, (elements.get(element) ?? 0) + 1);\n update();\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n const remaining = (elements.get(element) ?? 1) - 1;\n if (remaining === 0) elements.delete(element);\n else elements.set(element, remaining);\n update();\n };\n };\n\n const createObserver = (\n registration: number,\n target: Element,\n ): AttentionIntersectionObserver | undefined => {\n const factory =\n options.createIntersectionObserver ??\n defaultIntersectionObserverFactory(selectedWindow);\n if (!factory) return undefined;\n let created: AttentionIntersectionObserver | undefined;\n try {\n created = factory((entries) => {\n if (\n disposed ||\n registration !== newestRegistration ||\n newestTarget !== target ||\n observer !== created\n ) {\n return;\n }\n let latest: IntersectionObserverEntry | undefined;\n for (const entry of entries) {\n if (entry.target === target) latest = entry;\n }\n if (!latest) return;\n newestResult = latest.isIntersecting ? \"visible\" : \"outside\";\n update();\n }, options.intersectionObserverInit);\n created.observe(target);\n return created;\n } catch {\n cleanupObserver(created, target);\n return undefined;\n }\n };\n\n const stopObserver = (target?: Element): void => {\n const current = observer;\n observer = undefined;\n cleanupObserver(current, target);\n };\n\n return {\n subscribe(listener) {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n getSnapshot: () => snapshot,\n getServerSnapshot: () => UNKNOWN_SNAPSHOT,\n registerComposer: (element) => register(composers, element),\n registerConversation: (element) => register(conversations, element),\n registerNewestResponse(element) {\n if (disposed) throw new Error(\"AttentionStore is disposed\");\n const registration = ++newestRegistration;\n stopObserver(newestTarget);\n newestTarget = element;\n newestResult = \"unknown\";\n observer = createObserver(registration, element);\n update();\n let registered = true;\n return () => {\n if (!registered) return;\n registered = false;\n if (registration !== newestRegistration || newestTarget !== element)\n return;\n stopObserver(element);\n newestTarget = undefined;\n newestResult = \"unobserved\";\n update();\n };\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n listeners.clear();\n composers.clear();\n conversations.clear();\n stopObserver(newestTarget);\n newestTarget = undefined;\n cleanupListeners();\n },\n };\n}\n\nfunction makeSnapshot(\n document: Document,\n composers: ReadonlyMap<Element, number>,\n conversations: ReadonlyMap<Element, number>,\n newestResponse: AttentionSnapshot[\"newestResponse\"],\n): AttentionSnapshot {\n const visibility = readVisibility(document);\n const windowFocus = readWindowFocus(document);\n return Object.freeze({\n visibility,\n windowFocus,\n focusArea: readFocusArea(document, composers, conversations),\n newestResponse,\n mode: deriveMode(visibility, windowFocus, newestResponse),\n });\n}\n\nfunction deriveMode(\n visibility: AttentionSnapshot[\"visibility\"],\n windowFocus: AttentionSnapshot[\"windowFocus\"],\n newestResponse: AttentionSnapshot[\"newestResponse\"],\n): AttentionSnapshot[\"mode\"] {\n if (visibility === \"hidden\") return \"background\";\n if (visibility !== \"visible\") return \"unknown\";\n if (windowFocus === \"blurred\") return \"away\";\n if (windowFocus !== \"focused\") return \"unknown\";\n if (newestResponse === \"outside\") return \"reading-history\";\n if (newestResponse === \"visible\") return \"foreground\";\n return \"unknown\";\n}\n\nfunction defaultIntersectionObserverFactory(\n window: (Window & typeof globalThis) | null,\n): AttentionIntersectionObserverFactory | undefined {\n const Constructor = window?.IntersectionObserver;\n if (typeof Constructor !== \"function\") return undefined;\n return (callback, options) => new Constructor(callback, options);\n}\n\nfunction cleanupObserver(\n observer: AttentionIntersectionObserver | undefined,\n target?: Element,\n): void {\n if (!observer) return;\n if (target) {\n try {\n observer.unobserve(target);\n } catch {\n // Intersection cleanup errors are deliberately suppressed.\n }\n }\n try {\n observer.disconnect();\n } catch {\n // Intersection cleanup errors are deliberately suppressed.\n }\n}\n\nfunction readFocusArea(\n document: Document,\n composers: ReadonlyMap<Element, number>,\n conversations: ReadonlyMap<Element, number>,\n): AttentionSnapshot[\"focusArea\"] {\n let activeElement: Element | null;\n try {\n activeElement = deepActiveElement(document);\n } catch {\n return \"unknown\";\n }\n if (\n activeElement === null ||\n activeElement === document.body ||\n activeElement === document.documentElement\n ) {\n return \"none\";\n }\n if (\n [...composers.keys()].some((element) =>\n composedContains(element, activeElement),\n )\n ) {\n return \"composer\";\n }\n if (\n [...conversations.keys()].some((element) =>\n composedContains(element, activeElement),\n )\n ) {\n return \"conversation\";\n }\n return \"elsewhere\";\n}\n\nfunction readVisibility(document: Document): AttentionSnapshot[\"visibility\"] {\n try {\n if (document.visibilityState === \"visible\") return \"visible\";\n if (document.visibilityState === \"hidden\") return \"hidden\";\n } catch {\n // Browser integrations can expose throwing accessors.\n }\n return \"unknown\";\n}\n\nfunction readWindowFocus(document: Document): AttentionSnapshot[\"windowFocus\"] {\n try {\n if (typeof document.hasFocus !== \"function\") return \"unknown\";\n return document.hasFocus() ? \"focused\" : \"blurred\";\n } catch {\n return \"unknown\";\n }\n}\n\nfunction sameSnapshot(\n left: AttentionSnapshot,\n right: AttentionSnapshot,\n): boolean {\n return (\n left.visibility === right.visibility &&\n left.windowFocus === right.windowFocus &&\n left.focusArea === right.focusArea &&\n left.newestResponse === right.newestResponse &&\n left.mode === right.mode\n );\n}\n","import {\n composedContains,\n composedParent,\n deepActiveElement,\n} from \"./composed-tree.js\";\n\nexport interface FocusCapture {\n readonly document: Document | null;\n readonly target: Element | null;\n}\n\nexport interface FocusElementOptions {\n preventScroll?: boolean;\n}\n\nexport interface RestoreFocusOptions extends FocusElementOptions {\n onlyIfFocusWithin?: Element;\n}\n\nexport type FocusSkippedReason =\n | \"unavailable\"\n | \"cross-document\"\n | \"disconnected\"\n | \"disabled\"\n | \"hidden\"\n | \"aria-hidden\"\n | \"inert\"\n | \"missing-focus\"\n | \"guard-mismatch\"\n | \"focus-error\"\n | \"focus-not-applied\";\n\nexport type FocusResult =\n | { readonly status: \"focused\"; readonly target: Element }\n | {\n readonly status: \"skipped\";\n readonly reason: FocusSkippedReason;\n readonly target: Element | null;\n };\n\nexport function captureFocus(selectedDocument?: Document): FocusCapture {\n const document =\n selectedDocument ??\n (typeof globalThis.document === \"undefined\"\n ? undefined\n : globalThis.document);\n if (!document) return Object.freeze({ document: null, target: null });\n let target: Element | null = null;\n try {\n const active = deepActiveElement(document);\n if (\n active !== null &&\n active !== document.body &&\n active !== document.documentElement &&\n active.ownerDocument === document\n ) {\n target = active;\n }\n } catch {\n // A hostile document is captured without a restorable target.\n }\n return Object.freeze({ document, target });\n}\n\nexport function focusElement(\n target: Element,\n options: FocusElementOptions = {},\n): FocusResult {\n const eligibility = focusEligibility(target);\n if (eligibility) {\n return { status: \"skipped\", reason: eligibility, target };\n }\n let focus: ((options?: FocusOptions) => void) | undefined;\n let document: Document;\n let previous: Element | null;\n try {\n document = target.ownerDocument;\n previous = deepActiveElement(document);\n focus = (target as Element & { focus?: (options?: FocusOptions) => void })\n .focus;\n } catch {\n return { status: \"skipped\", reason: \"unavailable\", target };\n }\n if (typeof focus !== \"function\") {\n return { status: \"skipped\", reason: \"missing-focus\", target };\n }\n let focusThrew = false;\n try {\n focus.call(target, { preventScroll: options.preventScroll ?? true });\n } catch {\n focusThrew = true;\n }\n if (focusThrew) {\n restorePreviousFocus(previous, target, document);\n return { status: \"skipped\", reason: \"focus-error\", target };\n }\n const postFocusEligibility = focusEligibility(target);\n let active: Element | null;\n try {\n active = deepActiveElement(document);\n } catch {\n return { status: \"skipped\", reason: \"focus-error\", target };\n }\n if (postFocusEligibility) {\n if (active === target) restorePreviousFocus(previous, target, document);\n return { status: \"skipped\", reason: postFocusEligibility, target };\n }\n if (active !== target) {\n return { status: \"skipped\", reason: \"focus-not-applied\", target };\n }\n return { status: \"focused\", target };\n}\n\nexport function restoreFocus(\n capture: FocusCapture,\n options: RestoreFocusOptions = {},\n): FocusResult {\n let document: Document | null;\n let target: Element | null;\n try {\n document = capture.document;\n target = capture.target;\n } catch {\n return { status: \"skipped\", reason: \"unavailable\", target: null };\n }\n if (!document || !target) {\n return { status: \"skipped\", reason: \"unavailable\", target: null };\n }\n try {\n if (target.ownerDocument !== document) {\n return { status: \"skipped\", reason: \"cross-document\", target };\n }\n const guard = options.onlyIfFocusWithin;\n if (guard !== undefined) {\n const active = deepActiveElement(document);\n if (\n guard.ownerDocument !== document ||\n active === null ||\n !composedContains(guard, active)\n ) {\n return { status: \"skipped\", reason: \"guard-mismatch\", target };\n }\n }\n } catch {\n return { status: \"skipped\", reason: \"guard-mismatch\", target };\n }\n return focusElement(target, options);\n}\n\nfunction focusEligibility(target: Element): FocusSkippedReason | undefined {\n let ownerDocument: Document;\n try {\n ownerDocument = target.ownerDocument;\n const ElementConstructor = ownerDocument.defaultView?.Element;\n if (\n !ownerDocument ||\n (ElementConstructor && !(target instanceof ElementConstructor))\n ) {\n return \"unavailable\";\n }\n if (target.isConnected !== true) return \"disconnected\";\n if (\n target.getAttribute(\"disabled\") !== null ||\n (target as Element & { disabled?: unknown }).disabled === true\n ) {\n return \"disabled\";\n }\n } catch {\n return \"unavailable\";\n }\n try {\n const matches = target.matches;\n if (typeof matches === \"function\" && matches.call(target, \":disabled\")) {\n return \"disabled\";\n }\n } catch {\n // Fall back to the direct disabled checks above.\n }\n\n try {\n let current: Element | null = target;\n const visited = new Set<Element>();\n while (current) {\n if (visited.has(current)) return \"unavailable\";\n visited.add(current);\n if (current.hasAttribute(\"hidden\")) return \"hidden\";\n if (current.getAttribute(\"aria-hidden\")?.trim().toLowerCase() === \"true\")\n return \"aria-hidden\";\n if (\n current.hasAttribute(\"inert\") ||\n (current as Element & { inert?: unknown }).inert === true\n ) {\n return \"inert\";\n }\n current = composedParent(current);\n }\n } catch {\n return \"unavailable\";\n }\n\n try {\n const focus = (\n target as Element & {\n focus?: (options?: FocusOptions) => void;\n }\n ).focus;\n if (typeof focus !== \"function\") return \"missing-focus\";\n } catch {\n return \"unavailable\";\n }\n return undefined;\n}\n\nfunction restorePreviousFocus(\n previous: Element | null,\n attempted: Element,\n document: Document,\n): void {\n try {\n if (\n !previous ||\n deepActiveElement(document) !== attempted ||\n focusEligibility(previous) !== undefined\n ) {\n return;\n }\n const focus = (\n previous as Element & {\n focus?: (options?: FocusOptions) => void;\n }\n ).focus;\n if (typeof focus === \"function\")\n focus.call(previous, { preventScroll: true });\n } catch {\n // Focus rollback is best-effort at hostile DOM boundaries.\n }\n}\n","import type { PolicyOverrides, PresetName } from \"@generative-a11y/core\";\n\nimport type { ExternalStore } from \"./attention.js\";\n\nexport type StreamingVerbosity =\n \"preset\" | \"off\" | \"completion\" | \"paragraph\" | \"sentence\";\n\nexport type ToolVerbosity =\n \"preset\" | \"off\" | \"failures\" | \"status\" | \"progress\";\n\nexport type PreferenceSchemaV1 =\n | Readonly<{ version: 1; preset: \"completion-only\" }>\n | Readonly<{\n version: 1;\n preset: \"minimal\" | \"balanced\" | \"verbose\";\n streaming: StreamingVerbosity;\n tools: ToolVerbosity;\n }>;\n\nexport interface PreferenceStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport interface PreferenceStorageEvent {\n readonly key: string | null;\n readonly newValue: string | null;\n readonly storageArea?: PreferenceStorage | null;\n}\n\nexport interface PreferenceStorageEventSource {\n subscribe(listener: (event: PreferenceStorageEvent) => void): () => void;\n}\n\nexport type PreferenceDiagnosticSource =\n | \"storage-read\"\n | \"storage-write\"\n | \"storage-event\"\n | \"event-subscribe\"\n | \"event-unsubscribe\";\n\nexport type PreferenceDiagnosticCode =\n | \"operation-failed\"\n | \"invalid-json\"\n | \"invalid-preference\"\n | \"unsupported-version\";\n\nexport interface PreferenceDiagnostic {\n readonly source: PreferenceDiagnosticSource;\n readonly code: PreferenceDiagnosticCode;\n readonly error?: Readonly<{ name: string; message: string }>;\n}\n\nexport interface PreferencePersistence {\n readonly key: string;\n readonly storage?: PreferenceStorage;\n readonly events?: PreferenceStorageEventSource;\n}\n\nexport interface PreferenceStoreOptions {\n readonly defaultValue?: PreferenceSchemaV1;\n readonly persistence?: PreferencePersistence;\n readonly onDiagnostic?: (diagnostic: PreferenceDiagnostic) => void;\n}\n\nexport interface PreferenceStore extends ExternalStore<PreferenceSchemaV1> {\n setPreferences(value: PreferenceSchemaV1): void;\n dispose(): void;\n}\n\nexport interface CorePreferenceConfiguration {\n readonly preset: PresetName;\n readonly policy?: PolicyOverrides;\n}\n\nexport const defaultPreferences: PreferenceSchemaV1 = Object.freeze({\n version: 1,\n preset: \"balanced\",\n streaming: \"preset\",\n tools: \"preset\",\n});\n\nexport function preferencesToCoreConfiguration(\n value: PreferenceSchemaV1,\n): CorePreferenceConfiguration {\n const preferences = normalizePreferences(value);\n if (preferences.preset === \"completion-only\") {\n return { preset: \"completion-only\" };\n }\n const policy: PolicyOverrides = {};\n const text = mapStreaming(preferences.streaming);\n const tools = mapTools(preferences.tools);\n if (text) policy.text = text;\n if (tools) policy.tools = tools;\n return Object.keys(policy).length === 0\n ? { preset: preferences.preset }\n : { preset: preferences.preset, policy };\n}\n\nexport function createPreferenceStore(\n options: PreferenceStoreOptions = {},\n): PreferenceStore {\n const configuredDefault = options.defaultValue\n ? normalizePreferences(options.defaultValue)\n : defaultPreferences;\n const persistence = resolvePersistence(options.persistence);\n const report = (\n source: PreferenceDiagnosticSource,\n code: PreferenceDiagnosticCode,\n cause?: unknown,\n ): void => {\n const diagnostic: PreferenceDiagnostic = {\n source,\n code,\n ...(cause === undefined ? {} : { error: serializeError(cause) }),\n };\n try {\n options.onDiagnostic?.(diagnostic);\n } catch {\n // Diagnostics are observational.\n }\n };\n let current = configuredDefault;\n if (persistence?.storage) {\n try {\n const stored = persistence.storage.getItem(persistence.key);\n if (stored !== null) {\n current = parsePreferences(stored, \"storage-read\", report) ?? current;\n }\n } catch (cause) {\n report(\"storage-read\", \"operation-failed\", cause);\n }\n }\n let disposed = false;\n let eventEpoch = 0;\n const listeners = new Set<() => void>();\n let unsubscribeEvents: (() => void) | undefined;\n\n const notify = (): void => {\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // External-store listeners cannot prevent other listeners.\n }\n }\n };\n const replace = (next: PreferenceSchemaV1): boolean => {\n if (samePreferences(current, next)) return false;\n current = next;\n notify();\n return true;\n };\n const handleStorageEvent = (event: PreferenceStorageEvent): void => {\n if (disposed || !persistence) return;\n const epoch = ++eventEpoch;\n let key: string | null;\n let newValue: string | null;\n let storageArea: PreferenceStorage | null | undefined;\n try {\n key = event.key;\n newValue = event.newValue;\n storageArea = event.storageArea;\n } catch (cause) {\n if (!disposed && epoch === eventEpoch) {\n report(\"storage-event\", \"operation-failed\", cause);\n }\n return;\n }\n if (disposed || epoch !== eventEpoch) return;\n try {\n if (storageArea != null && storageArea !== persistence.storage) {\n return;\n }\n if (key !== null && key !== persistence.key) return;\n if (key === null || newValue === null) {\n replace(configuredDefault);\n return;\n }\n const next = parsePreferences(newValue, \"storage-event\", report);\n if (!disposed && epoch === eventEpoch && next) replace(next);\n } catch (cause) {\n if (!disposed && epoch === eventEpoch) {\n report(\"storage-event\", \"operation-failed\", cause);\n }\n }\n };\n\n if (persistence?.events) {\n try {\n unsubscribeEvents = persistence.events.subscribe(handleStorageEvent);\n } catch (cause) {\n report(\"event-subscribe\", \"operation-failed\", cause);\n }\n }\n\n return {\n subscribe(listener) {\n if (disposed) throw new Error(\"PreferenceStore is disposed\");\n listeners.add(listener);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n listeners.delete(listener);\n };\n },\n getSnapshot: () => current,\n getServerSnapshot: () => configuredDefault,\n setPreferences(value) {\n if (disposed) throw new Error(\"PreferenceStore is disposed\");\n const next = normalizePreferences(value);\n const changed = replace(next);\n if (!disposed && persistence?.storage && samePreferences(current, next)) {\n const serialized = JSON.stringify(next);\n if (!changed) {\n const epoch = eventEpoch;\n let matchesStoredValue = false;\n try {\n matchesStoredValue =\n persistence.storage.getItem(persistence.key) === serialized;\n } catch (cause) {\n report(\"storage-read\", \"operation-failed\", cause);\n }\n if (\n matchesStoredValue ||\n disposed ||\n epoch !== eventEpoch ||\n !samePreferences(current, next)\n ) {\n return;\n }\n }\n if (disposed || !samePreferences(current, next)) return;\n try {\n persistence.storage.setItem(persistence.key, serialized);\n } catch (cause) {\n report(\"storage-write\", \"operation-failed\", cause);\n }\n }\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n eventEpoch += 1;\n listeners.clear();\n const unsubscribe = unsubscribeEvents;\n unsubscribeEvents = undefined;\n if (unsubscribe) {\n try {\n unsubscribe();\n } catch (cause) {\n report(\"event-unsubscribe\", \"operation-failed\", cause);\n }\n }\n },\n };\n}\n\ninterface ResolvedPreferencePersistence {\n readonly key: string;\n readonly storage?: PreferenceStorage;\n readonly events?: PreferenceStorageEventSource;\n}\n\nfunction resolvePersistence(\n persistence: PreferencePersistence | undefined,\n): ResolvedPreferencePersistence | undefined {\n if (!persistence) return undefined;\n if (persistence.storage) return persistence;\n const browser = getBrowserPersistence();\n return {\n key: persistence.key,\n ...(browser?.storage ? { storage: browser.storage } : {}),\n ...(persistence.events\n ? { events: persistence.events }\n : browser?.events\n ? { events: browser.events }\n : {}),\n };\n}\n\nfunction getBrowserPersistence():\n | { storage: PreferenceStorage; events: PreferenceStorageEventSource }\n | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const browserWindow = window;\n const storage = browserWindow.localStorage;\n if (!storage) return undefined;\n return {\n storage,\n events: {\n subscribe(listener) {\n const handle = (event: StorageEvent): void => listener(event);\n browserWindow.addEventListener(\"storage\", handle);\n return () => browserWindow.removeEventListener(\"storage\", handle);\n },\n },\n };\n } catch {\n return undefined;\n }\n}\n\nfunction parsePreferences(\n raw: string,\n source: \"storage-read\" | \"storage-event\",\n report: (\n source: PreferenceDiagnosticSource,\n code: PreferenceDiagnosticCode,\n cause?: unknown,\n ) => void,\n): PreferenceSchemaV1 | undefined {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (cause) {\n report(source, \"invalid-json\", cause);\n return undefined;\n }\n try {\n return normalizePreferences(value as PreferenceSchemaV1);\n } catch (cause) {\n report(\n source,\n cause instanceof UnsupportedPreferenceVersionError\n ? \"unsupported-version\"\n : \"invalid-preference\",\n cause,\n );\n return undefined;\n }\n}\n\nclass UnsupportedPreferenceVersionError extends TypeError {}\n\nexport function normalizePreferences(\n value: PreferenceSchemaV1,\n): PreferenceSchemaV1 {\n const fields = snapshotPreferenceFields(value);\n if (fields.version !== 1)\n throw new UnsupportedPreferenceVersionError(\n \"Unsupported preference version\",\n );\n if (fields.preset === \"completion-only\") {\n if (!hasExactKeys(fields, [\"version\", \"preset\"]))\n throw new TypeError(\"Invalid completion-only preferences\");\n return Object.freeze({ version: 1, preset: \"completion-only\" });\n }\n if (\n !([\"minimal\", \"balanced\", \"verbose\"] as unknown[]).includes(fields.preset)\n )\n throw new TypeError(\"Invalid preference preset\");\n if (!hasExactKeys(fields, [\"version\", \"preset\", \"streaming\", \"tools\"]))\n throw new TypeError(\"Invalid preference fields\");\n if (!STREAMING_VALUES.includes(fields.streaming as StreamingVerbosity))\n throw new TypeError(\"Invalid streaming preference\");\n if (!TOOL_VALUES.includes(fields.tools as ToolVerbosity))\n throw new TypeError(\"Invalid tool preference\");\n return Object.freeze({\n version: 1,\n preset: fields.preset as \"minimal\" | \"balanced\" | \"verbose\",\n streaming: fields.streaming as StreamingVerbosity,\n tools: fields.tools as ToolVerbosity,\n });\n}\n\nconst STREAMING_VALUES: readonly StreamingVerbosity[] = [\n \"preset\",\n \"off\",\n \"completion\",\n \"paragraph\",\n \"sentence\",\n];\nconst TOOL_VALUES: readonly ToolVerbosity[] = [\n \"preset\",\n \"off\",\n \"failures\",\n \"status\",\n \"progress\",\n];\n\nfunction snapshotPreferenceFields(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"Invalid preferences\");\n }\n try {\n const descriptors = Object.getOwnPropertyDescriptors(value);\n const fields = Object.create(null) as Record<string, unknown>;\n for (const key of Reflect.ownKeys(descriptors)) {\n if (typeof key !== \"string\")\n throw new TypeError(\"Invalid preference fields\");\n const descriptor = descriptors[key];\n if (!descriptor?.enumerable || !(\"value\" in descriptor)) {\n throw new TypeError(\n \"Preference fields must be enumerable data properties\",\n );\n }\n fields[key] = descriptor.value;\n }\n return fields;\n } catch {\n throw new TypeError(\"Invalid preferences\");\n }\n}\n\nfunction hasExactKeys(\n value: Record<string, unknown>,\n expected: readonly string[],\n): boolean {\n const keys = Object.keys(value);\n return (\n keys.length === expected.length &&\n expected.every((key) => keys.includes(key))\n );\n}\n\nexport function samePreferences(\n left: PreferenceSchemaV1,\n right: PreferenceSchemaV1,\n): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction mapStreaming(\n value: StreamingVerbosity,\n): PolicyOverrides[\"text\"] | undefined {\n if (value === \"preset\") return undefined;\n if (value === \"off\") return { strategy: \"silent\" };\n if (value === \"completion\")\n return { strategy: \"completion\", minimumCharacters: 0, maximumDelayMs: 0 };\n return { strategy: value };\n}\n\nfunction mapTools(value: ToolVerbosity): PolicyOverrides[\"tools\"] | undefined {\n if (value === \"preset\") return undefined;\n return {\n announceStart: value === \"status\" || value === \"progress\",\n announceProgress: value === \"progress\",\n announceCompletion: value === \"status\" || value === \"progress\",\n announceFailure: value !== \"off\",\n };\n}\n\nfunction serializeError(cause: unknown): Readonly<{\n name: string;\n message: string;\n}> {\n const fallback = { name: \"Error\", message: \"Unknown error\" } as const;\n try {\n if (cause instanceof Error) {\n const name = cause.name;\n const message = cause.message;\n if (typeof name !== \"string\" || typeof message !== \"string\") {\n return fallback;\n }\n return { name: name || \"Error\", message };\n }\n if (\n typeof cause === \"string\" ||\n typeof cause === \"number\" ||\n typeof cause === \"boolean\" ||\n typeof cause === \"bigint\" ||\n typeof cause === \"symbol\"\n ) {\n return { name: \"Error\", message: String(cause) };\n }\n } catch {\n return fallback;\n }\n return fallback;\n}\n","import type {\n AnnouncementIntent,\n GenerativeA11yRuntime,\n} from \"@generative-a11y/core\";\n\nexport {\n createAttentionStore,\n type AttentionIntersectionObserver,\n type AttentionIntersectionObserverFactory,\n type AttentionSnapshot,\n type AttentionStore,\n type AttentionStoreOptions,\n type ExternalStore,\n} from \"./attention.js\";\n\nexport {\n captureFocus,\n focusElement,\n restoreFocus,\n type FocusCapture,\n type FocusElementOptions,\n type FocusResult,\n type FocusSkippedReason,\n type RestoreFocusOptions,\n} from \"./focus.js\";\n\nexport {\n createPreferenceStore,\n defaultPreferences,\n normalizePreferences,\n preferencesToCoreConfiguration,\n type CorePreferenceConfiguration,\n type PreferenceDiagnostic,\n type PreferenceDiagnosticCode,\n type PreferenceDiagnosticSource,\n type PreferencePersistence,\n type PreferenceSchemaV1,\n type PreferenceStorage,\n type PreferenceStorageEvent,\n type PreferenceStorageEventSource,\n type PreferenceStore,\n type PreferenceStoreOptions,\n samePreferences,\n type StreamingVerbosity,\n type ToolVerbosity,\n} from \"./preferences.js\";\n\nexport type DOMAnnouncementMode = \"auto\" | \"aria-notify\" | \"live-region\";\n\nexport interface DOMLiveRegions {\n polite: HTMLElement;\n assertive: HTMLElement;\n}\n\nexport interface DOMDeliveryResult {\n status: \"notified\" | \"mutated\" | \"unavailable\" | \"disposed\";\n method: \"aria-notify\" | \"live-region\" | \"none\";\n channel: AnnouncementIntent[\"channel\"];\n announcementId: string;\n sourceType: AnnouncementIntent[\"sourceType\"];\n at: number;\n sourceEventId?: string;\n responseId?: string;\n toolId?: string;\n interactionId?: string;\n error?: { name: string; message: string };\n}\n\nexport interface DOMAnnouncerOptions {\n document?: Document;\n mode?: DOMAnnouncementMode;\n regions?: DOMLiveRegions;\n onDiagnostic?: (result: DOMDeliveryResult) => void;\n}\n\nexport interface DOMAnnouncer {\n announce(intent: AnnouncementIntent): DOMDeliveryResult;\n getRegions(): DOMLiveRegions | undefined;\n dispose(): void;\n}\n\nexport interface DOMRuntimeBinding {\n announcer: DOMAnnouncer;\n dispose(): void;\n}\n\nexport function createDOMAnnouncer(\n options: DOMAnnouncerOptions = {},\n): DOMAnnouncer {\n validateSuppliedRegions(options);\n const selectedDocument =\n options.document ??\n options.regions?.polite.ownerDocument ??\n (typeof document === \"undefined\" ? undefined : document);\n const ownsRegions = options.regions === undefined;\n const regions = options.regions ?? createLiveRegions(selectedDocument);\n\n if (regions) {\n configureRegion(regions.polite, \"polite\");\n configureRegion(regions.assertive, \"assertive\");\n }\n let notifierEnabled = true;\n let disposed = false;\n\n const report = (result: DOMDeliveryResult): DOMDeliveryResult => {\n try {\n options.onDiagnostic?.(result);\n } catch {\n // Diagnostics are observational and cannot affect delivery.\n }\n return result;\n };\n\n return {\n announce(intent) {\n if (disposed) {\n return report({\n status: \"disposed\",\n method: \"none\",\n channel: intent.channel,\n ...deliveryContext(intent),\n });\n }\n if (regions) {\n const region = regions[intent.channel];\n applyLocale(region, intent.locale);\n let error: DOMDeliveryResult[\"error\"];\n if (notifierEnabled && options.mode !== \"live-region\") {\n let notified = false;\n try {\n const ariaNotify = (region as AriaNotifyRegion).ariaNotify;\n if (typeof ariaNotify === \"function\") {\n ariaNotify.call(region, intent.text, {\n priority: intent.channel === \"assertive\" ? \"high\" : \"normal\",\n });\n notified = true;\n }\n } catch (cause) {\n notifierEnabled = false;\n error = serializeError(cause);\n }\n if (notified) {\n return report({\n status: \"notified\",\n method: \"aria-notify\",\n channel: intent.channel,\n ...deliveryContext(intent),\n });\n }\n }\n region.textContent = intent.text;\n return report({\n status: \"mutated\",\n method: \"live-region\",\n channel: intent.channel,\n ...deliveryContext(intent),\n ...(error === undefined ? {} : { error }),\n });\n }\n return report({\n status: \"unavailable\",\n method: \"none\",\n channel: intent.channel,\n ...deliveryContext(intent),\n });\n },\n getRegions() {\n return regions;\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n if (ownsRegions) {\n regions?.polite.remove();\n regions?.assertive.remove();\n }\n },\n };\n}\n\nfunction deliveryContext(\n intent: AnnouncementIntent,\n): Pick<\n DOMDeliveryResult,\n | \"announcementId\"\n | \"sourceType\"\n | \"at\"\n | \"sourceEventId\"\n | \"responseId\"\n | \"toolId\"\n | \"interactionId\"\n> {\n return {\n announcementId: intent.id,\n sourceType: intent.sourceType,\n at: intent.at,\n ...(intent.sourceEventId !== undefined\n ? { sourceEventId: intent.sourceEventId }\n : {}),\n ...(intent.responseId !== undefined\n ? { responseId: intent.responseId }\n : {}),\n ...(intent.toolId !== undefined ? { toolId: intent.toolId } : {}),\n ...(intent.interactionId !== undefined\n ? { interactionId: intent.interactionId }\n : {}),\n };\n}\n\nfunction validateSuppliedRegions(options: DOMAnnouncerOptions): void {\n if (options.regions === undefined) return;\n const { polite, assertive } = options.regions;\n if (polite === assertive) {\n throw new TypeError(\n \"Polite and assertive regions must be distinct elements\",\n );\n }\n if (!polite.isConnected || !assertive.isConnected) {\n throw new TypeError(\"Supplied regions must be connected\");\n }\n if (polite.contains(assertive) || assertive.contains(polite)) {\n throw new TypeError(\n \"Polite and assertive regions must not contain one another\",\n );\n }\n if (polite.ownerDocument !== assertive.ownerDocument) {\n throw new TypeError(\n \"Polite and assertive regions must belong to the same document\",\n );\n }\n if (\n options.document !== undefined &&\n (polite.ownerDocument !== options.document ||\n assertive.ownerDocument !== options.document)\n ) {\n throw new TypeError(\n \"Supplied regions must belong to the provided document\",\n );\n }\n}\n\nfunction serializeError(\n error: unknown,\n): NonNullable<DOMDeliveryResult[\"error\"]> {\n try {\n if (error instanceof Error) {\n return {\n name: readErrorString(error, \"name\", \"Error\"),\n message: readErrorString(error, \"message\", \"Unknown error\"),\n };\n }\n } catch {\n // Hostile proxies can throw during instanceof checks.\n }\n return { name: \"Error\", message: safeString(error, \"Unknown error\") };\n}\n\nfunction readErrorString(\n error: Error,\n property: \"name\" | \"message\",\n fallback: string,\n): string {\n try {\n return safeString(error[property], fallback);\n } catch {\n return fallback;\n }\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\ninterface AriaNotifyRegion extends HTMLElement {\n ariaNotify?: (\n text: string,\n options?: { priority: \"normal\" | \"high\" },\n ) => void;\n}\n\nfunction createLiveRegions(\n selectedDocument: Document | undefined,\n): DOMLiveRegions | undefined {\n const parent = selectedDocument?.body ?? selectedDocument?.documentElement;\n if (!selectedDocument || !parent) return undefined;\n\n const regions = {\n polite: selectedDocument.createElement(\"div\"),\n assertive: selectedDocument.createElement(\"div\"),\n };\n parent.append(regions.polite, regions.assertive);\n return regions;\n}\n\nfunction configureRegion(\n region: HTMLElement,\n channel: AnnouncementIntent[\"channel\"],\n): void {\n region.removeAttribute(\"role\");\n region.removeAttribute(\"aria-busy\");\n region.removeAttribute(\"hidden\");\n region.removeAttribute(\"aria-hidden\");\n region.inert = false;\n region.removeAttribute(\"inert\");\n region.style.removeProperty(\"display\");\n region.style.removeProperty(\"visibility\");\n region.style.removeProperty(\"content-visibility\");\n region.setAttribute(\"aria-live\", channel);\n region.setAttribute(\"aria-atomic\", \"true\");\n region.setAttribute(\"aria-relevant\", \"additions text\");\n Object.assign(region.style, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n });\n}\n\nfunction applyLocale(region: HTMLElement, locale: string | undefined): void {\n if (locale === undefined) region.removeAttribute(\"lang\");\n else region.setAttribute(\"lang\", locale);\n}\n\nexport function connectRuntimeToDOM(\n runtime: GenerativeA11yRuntime,\n options: DOMAnnouncerOptions = {},\n): DOMRuntimeBinding {\n const announcer = createDOMAnnouncer(options);\n let disposed = false;\n let unsubscribe: () => void;\n try {\n unsubscribe = runtime.subscribeAnnouncements((intent) => {\n if (!disposed) announcer.announce(intent);\n });\n } catch (cause) {\n announcer.dispose();\n throw cause;\n }\n\n return {\n announcer,\n dispose() {\n if (disposed) return;\n disposed = true;\n try {\n unsubscribe();\n } finally {\n announcer.dispose();\n }\n },\n };\n}\n"],"mappings":"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","names":["document","document","window","document","serializeError"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@generative-a11y/dom",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "DOM
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "DOM accessibility delivery for paced screen-reader announcements in streaming AI and agent interfaces.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"accessibility",
|
|
7
7
|
"aria-live",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"type": "module",
|
|
18
18
|
"sideEffects": false,
|
|
19
|
-
"homepage": "https://
|
|
19
|
+
"homepage": "https://generativea11y.com/api/dom",
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git",
|
|
22
22
|
"url": "git+https://github.com/bhaveshchow20/generative-a11y.git",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"README.md"
|
|
46
46
|
],
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@generative-a11y/core": "0.
|
|
48
|
+
"@generative-a11y/core": "0.2.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@types/jsdom": "30.0.0",
|