@spotpatch/runtime 1.9.0 → 1.11.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/dist/{chunk-AXKYJRAM.js → chunk-7ES63LA7.js} +2 -13
- package/dist/chunk-7ES63LA7.js.map +1 -0
- package/dist/chunk-BXRMVHNT.js +14 -0
- package/dist/chunk-BXRMVHNT.js.map +1 -0
- package/dist/chunk-NII5OBAN.js +14 -0
- package/dist/chunk-NII5OBAN.js.map +1 -0
- package/dist/data-flow-panel.js +5 -3
- package/dist/data-flow-panel.js.map +1 -1
- package/dist/external-handoff-panel.cjs +1709 -0
- package/dist/external-handoff-panel.cjs.map +1 -0
- package/dist/external-handoff-panel.d.cts +44 -0
- package/dist/external-handoff-panel.d.ts +44 -0
- package/dist/external-handoff-panel.js +1685 -0
- package/dist/external-handoff-panel.js.map +1 -0
- package/dist/index.cjs +102 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +104 -7
- package/dist/index.js.map +1 -1
- package/package.json +15 -2
- package/dist/chunk-AXKYJRAM.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/controller/runtime-controller.ts","../src/annotation/create-annotation.ts","../src/api/runtime-api.ts","../src/api/agent-response-validation.ts","../src/security/content-sanitizer.ts","../src/collectors/computed-style-properties.ts","../src/collectors/css-collector.ts","../src/collectors/dom-collector.ts","../src/keyboard/shortcut.ts","../src/picker/geometry.ts","../src/ui/ui-constants.ts","../src/picker/hit-test.ts","../src/prompt/prompt-composer.ts","../src/state/runtime-state.ts","../src/state/selection-session.ts","../src/source/source-resolver.ts","../src/ui/runtime-view.ts","../src/ui/dom.ts","../src/ui/agent-panel.ts","../src/ui/brand-mark-content.ts","../src/ui/brand-mark.ts","../src/ui/data-flow-panel-contract.ts","../src/ui/dialog-placement.ts","../src/ui/localization.ts","../src/ui/selection-summary.ts","../src/controller/agent-workflow.ts","../src/controller/runtime-environment.ts","../src/controller/bootstrap.ts","../src/data-flow/data-flow-runtime.ts","../src/data-flow/report-merger.ts"],"sourcesContent":["export { bootstrapSpotPatch } from \"./controller/bootstrap.js\";\nexport type { RuntimeConfig } from \"./controller/runtime-config.js\";\nexport type { SpotPatchController } from \"./controller/runtime-controller.js\";\nexport { UI_MARKER_ATTRIBUTE } from \"./ui/ui-constants.js\";\nexport {\n createDataFlowRuntime,\n getDataFlowRuntime,\n installDataFlowPrelude,\n type DataFlowComponentRegistration,\n type DataFlowInvocationToken,\n type DataFlowRequestFrame,\n type DataFlowRequestMetadata,\n type DataFlowRuntime,\n type DataFlowTriggerMetadata,\n} from \"./data-flow/data-flow-runtime.js\";\nexport {\n mergeComponentDataFlowReport,\n mergePageDataFlowReport,\n} from \"./data-flow/report-merger.js\";\n","import { createReact18Adapter, type ReactAdapter } from \"@spotpatch/react-adapter\";\nimport {\n DATA_FLOW_SCHEMA_VERSION,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n type CodeContext,\n type ComponentDataFlowReport,\n type DataFlowComponentReportRequest,\n type ElementContext,\n type PageContext,\n type PageDataFlowReport,\n type SourceMarker,\n type SpotAnnotation,\n type SpotTargetContext,\n type StyleContext,\n} from \"@spotpatch/shared\";\n\nimport { createAnnotation } from \"../annotation/create-annotation.js\";\nimport { createRuntimeApi, type RuntimeApi } from \"../api/runtime-api.js\";\nimport { collectStyleContext } from \"../collectors/css-collector.js\";\nimport { collectElementContext } from \"../collectors/dom-collector.js\";\nimport { isTextEntryTarget, matchesShortcut } from \"../keyboard/shortcut.js\";\nimport { getElementRect, getVisibleElementRect } from \"../picker/geometry.js\";\nimport { isSpotPatchUIEventTarget, pickElementAt } from \"../picker/hit-test.js\";\nimport {\n createPromptComposer,\n type PromptComposer,\n} from \"../prompt/prompt-composer.js\";\nimport {\n INITIAL_RUNTIME_STATE,\n reduceRuntimeState,\n type RuntimeEvent,\n type RuntimeState,\n} from \"../state/runtime-state.js\";\nimport {\n createSelectionSession,\n type SelectionSession,\n type SelectionSnapshotTarget,\n} from \"../state/selection-session.js\";\nimport {\n createSourceResolver,\n sourceRefToMarker,\n type ElementSourceResolution,\n} from \"../source/source-resolver.js\";\nimport {\n createRuntimeView,\n type RuntimeView,\n type SelectionHighlightView,\n type SelectionTargetView,\n} from \"../ui/runtime-view.js\";\nimport { getDataFlowExtension } from \"../ui/data-flow-panel-contract.js\";\nimport {\n createSelectionSummary,\n type ApiConnectionStatus,\n type CollectionStatus,\n} from \"../ui/selection-summary.js\";\nimport { createAgentWorkflow } from \"./agent-workflow.js\";\nimport {\n collectPageContext,\n createBrowserAnnotationId,\n resolveClipboardWriter,\n type ClipboardWriter,\n} from \"./runtime-environment.js\";\nimport type { RuntimeConfig } from \"./runtime-config.js\";\n\nexport interface SpotPatchController {\n readonly dispose: () => void;\n readonly getState: () => RuntimeState;\n readonly mount: () => void;\n}\n\nexport interface RuntimeControllerDependencies {\n readonly api?: RuntimeApi;\n readonly clipboard?: ClipboardWriter;\n readonly createId?: () => string;\n readonly document?: Document;\n readonly mutationObserver?: typeof MutationObserver;\n readonly now?: () => string;\n readonly promptComposer?: PromptComposer;\n readonly reactAdapter?: ReactAdapter;\n readonly resizeObserver?: typeof ResizeObserver;\n readonly selectionSession?: SelectionSession;\n readonly view?: RuntimeView;\n readonly window?: Window;\n}\n\ninterface PointerPosition {\n readonly x: number;\n readonly y: number;\n}\n\ninterface SelectedTarget {\n readonly id: string;\n readonly resolution: ElementSourceResolution;\n apiStatus: ApiConnectionStatus;\n code: CodeContext | undefined;\n collectionStatus: CollectionStatus;\n dataFlowReport: ComponentDataFlowReport | undefined;\n dataFlowStatus: \"idle\" | \"loading\" | \"ready\" | \"error\";\n element: Element | undefined;\n elementContext: ElementContext | undefined;\n instruction: string;\n marker: SourceMarker | undefined;\n page: PageContext;\n styles: StyleContext | undefined;\n}\n\nconst EMPTY_STYLE_CONTEXT = Object.freeze({\n classNames: Object.freeze([]),\n matchedRules: Object.freeze([]),\n computed: Object.freeze({}),\n warnings: Object.freeze([\"CSS context collection failed.\"]),\n}) satisfies StyleContext;\n\nfunction elementLabel(element: Element): string {\n const id = element.id.length > 0 ? `#${element.id}` : \"\";\n const className = Array.from(element.classList)\n .slice(0, 2)\n .map((name) => `.${name}`)\n .join(\"\");\n return `<${element.tagName.toLowerCase()}${id}${className}>`;\n}\n\nfunction sourceLabel(target: SelectedTarget, unavailable: string): string {\n const path = target.code?.relativePath ?? target.resolution.source.relativePath;\n const line = target.resolution.source.line;\n const column = target.resolution.source.column;\n\n if (path === undefined) {\n return unavailable;\n }\n\n return `${path}${line === undefined ? \"\" : `:${String(line)}`}${column === undefined ? \"\" : `:${String(column)}`}`;\n}\n\nfunction targetStatus(target: SelectedTarget): SelectionTargetView[\"status\"] {\n if (target.apiStatus === \"failed\" || target.collectionStatus === \"failed\") {\n return \"warning\";\n }\n\n if (target.apiStatus === \"loading\" || target.collectionStatus === \"loading\") {\n return \"loading\";\n }\n\n return \"ready\";\n}\n\nfunction resolveBrowserDependencies(\n dependencies: RuntimeControllerDependencies,\n): Readonly<{\n document: Document;\n mutationObserver: typeof MutationObserver | undefined;\n resizeObserver: typeof ResizeObserver | undefined;\n window: Window;\n}> {\n const documentTarget = dependencies.document ?? globalThis.document;\n const windowTarget = dependencies.window ?? globalThis.window;\n\n return {\n document: documentTarget,\n window: windowTarget,\n mutationObserver: dependencies.mutationObserver ?? globalThis.MutationObserver,\n resizeObserver: dependencies.resizeObserver ?? globalThis.ResizeObserver,\n };\n}\n\nexport function createController(\n config: RuntimeConfig,\n dependencies: RuntimeControllerDependencies = {},\n): SpotPatchController {\n const browser = resolveBrowserDependencies(dependencies);\n const view =\n dependencies.view ??\n createRuntimeView(\n browser.document,\n config.shortcut,\n config.ai,\n config.locale,\n config.dataFlow.enabled,\n );\n const api =\n dependencies.api ??\n createRuntimeApi({\n apiBase: config.apiBase,\n dataFlowReportMaxBytes: config.dataFlow.limits.reportMaxBytes,\n fetch: browser.window.fetch.bind(browser.window),\n sessionToken: config.sessionToken,\n });\n const promptComposer =\n dependencies.promptComposer ??\n createPromptComposer({ maxCharacters: config.budget.totalCharacters });\n const clipboard =\n dependencies.clipboard ?? resolveClipboardWriter(browser.window.navigator);\n const createId =\n dependencies.createId ?? (() => createBrowserAnnotationId(browser.window));\n const now = dependencies.now ?? (() => new Date().toISOString());\n const selectionSession =\n dependencies.selectionSession ??\n createSelectionSession(browser.window, config.sessionId, config.maxTargets);\n const restoredSelection = selectionSession.load();\n const sourceResolver = createSourceResolver({\n adapter:\n dependencies.reactAdapter ??\n createReact18Adapter({\n ...(config.dataFlow.enabled\n ? {\n getComponentRegistration: (component: object) =>\n getDataFlowExtension()?.getComponentRegistration(component),\n }\n : {}),\n maxComponentDepth: config.budget.maxComponentDepth,\n }),\n onAdapterError() {\n view.announce(view.messages().announcements.adapterDisabled);\n\n if (config.debug) {\n console.warn(\n \"[spotpatch:react] Adapter failed and was disabled for this session.\",\n );\n }\n },\n });\n let state: RuntimeState = INITIAL_RUNTIME_STATE;\n let mounted = false;\n let animationFrame: number | undefined;\n let lastPointer: PointerPosition | undefined;\n let targets: SelectedTarget[] =\n restoredSelection?.targets.map((target) => {\n const marker = sourceRefToMarker(target.source);\n return {\n id: target.id,\n resolution: Object.freeze({ source: target.source, react: target.react }),\n apiStatus:\n marker === undefined\n ? \"not-required\"\n : target.code === undefined\n ? \"failed\"\n : \"connected\",\n code: target.code,\n collectionStatus: \"ready\",\n dataFlowReport: undefined,\n dataFlowStatus: \"idle\",\n element: undefined,\n elementContext: target.element,\n instruction: target.instruction,\n marker,\n page: target.page,\n styles: target.styles,\n };\n }) ?? [];\n let activeTargetId = restoredSelection?.activeTargetId;\n let targetSequence = restoredSelection?.sequence ?? 0;\n let selectionOpen = restoredSelection?.open ?? false;\n let workflowSelectionActive = false;\n let sessionRevision = 0;\n let editorRequestRevision = 0;\n let dataFlowRequestRevision = 0;\n let pageDataFlowReport: PageDataFlowReport | undefined;\n let pageDataFlowStatus: \"idle\" | \"loading\" | \"ready\" | \"error\" = \"idle\";\n let addingTarget = false;\n let previewPrompt = \"\";\n let previousFocus: HTMLElement | undefined;\n let resizeObserver: ResizeObserver | undefined;\n let mutationObserver: MutationObserver | undefined;\n let unsubscribeLocale: (() => void) | undefined;\n const collectionTimers = new Map<string, number>();\n\n function transition(event: RuntimeEvent): void {\n state = reduceRuntimeState(state, event);\n view.renderStatus(state.status);\n }\n\n function activeTarget(): SelectedTarget | undefined {\n return targets.find((target) => target.id === activeTargetId) ?? targets.at(-1);\n }\n\n function dataFlowRequest(\n target: SelectedTarget,\n ): DataFlowComponentReportRequest | undefined {\n const react = target.resolution.react;\n if (react.componentSourceId !== undefined && react.sourceVersion !== undefined) {\n return Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n componentSourceId: react.componentSourceId,\n sourceVersion: react.sourceVersion,\n });\n }\n\n const marker = target.marker;\n return marker === undefined\n ? undefined\n : Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n fileId: marker.fileId,\n line: marker.line,\n column: marker.column,\n });\n }\n\n function renderDataFlowView(): void {\n const dataFlowClient = getDataFlowExtension();\n const observations =\n dataFlowClient?.observations(browser.window.location.pathname) ?? [];\n const current = activeTarget();\n view.renderDataFlow({\n component: Object.freeze({\n status: config.dataFlow.enabled\n ? (current?.dataFlowStatus ?? \"idle\")\n : \"disabled\",\n ...(current?.dataFlowReport === undefined\n ? {}\n : {\n report:\n dataFlowClient?.mergeComponentReport(\n current.dataFlowReport,\n observations,\n ) ?? current.dataFlowReport,\n }),\n }),\n page: Object.freeze({\n status: config.dataFlow.enabled ? pageDataFlowStatus : \"disabled\",\n ...(pageDataFlowReport === undefined\n ? {}\n : {\n report:\n dataFlowClient?.mergePageReport(pageDataFlowReport, observations) ??\n pageDataFlowReport,\n }),\n }),\n observationCount: observations.length,\n });\n }\n\n async function loadDataFlowReports(): Promise<void> {\n if (!config.dataFlow.enabled) {\n renderDataFlowView();\n return;\n }\n\n const current = activeTarget();\n const currentRequest = current === undefined ? undefined : dataFlowRequest(current);\n const pageTargets = targets.flatMap((target) => {\n const request = dataFlowRequest(target);\n return request === undefined ? [] : [request];\n });\n const revision = ++dataFlowRequestRevision;\n const selectionRevision = sessionRevision;\n if (current !== undefined) current.dataFlowStatus = \"loading\";\n pageDataFlowStatus = pageTargets.length === 0 ? \"idle\" : \"loading\";\n renderDataFlowView();\n\n const [componentResult, pageResult] = await Promise.allSettled([\n currentRequest === undefined\n ? Promise.resolve(undefined)\n : api.componentDataFlowReport(currentRequest),\n pageTargets.length === 0\n ? Promise.resolve(undefined)\n : api.pageDataFlowReport({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n targets: pageTargets,\n }),\n ]);\n if (\n !mounted ||\n revision !== dataFlowRequestRevision ||\n selectionRevision !== sessionRevision\n ) {\n return;\n }\n\n if (current !== undefined && targets.includes(current)) {\n if (componentResult.status === \"fulfilled\") {\n current.dataFlowReport = componentResult.value;\n current.dataFlowStatus = componentResult.value === undefined ? \"idle\" : \"ready\";\n } else {\n current.dataFlowReport = undefined;\n current.dataFlowStatus = \"error\";\n }\n }\n if (pageResult.status === \"fulfilled\") {\n pageDataFlowReport = pageResult.value;\n pageDataFlowStatus = pageResult.value === undefined ? \"idle\" : \"ready\";\n } else {\n pageDataFlowReport = undefined;\n pageDataFlowStatus = \"error\";\n }\n renderDataFlowView();\n }\n\n function snapshotTarget(target: SelectedTarget): SelectionSnapshotTarget | undefined {\n if (target.elementContext === undefined || target.styles === undefined) {\n return undefined;\n }\n\n return {\n id: target.id,\n instruction: target.instruction,\n page: target.page,\n source: target.resolution.source,\n react: target.resolution.react,\n element: target.elementContext,\n styles: target.styles,\n ...(target.code === undefined ? {} : { code: target.code }),\n };\n }\n\n function persistSelection(): void {\n const persistedTargets = targets.flatMap((target) => {\n const snapshot = snapshotTarget(target);\n return snapshot === undefined ? [] : [snapshot];\n });\n\n if (persistedTargets.length === 0) {\n selectionSession.clear();\n return;\n }\n\n const persistedIds = new Set(persistedTargets.map(({ id }) => id));\n selectionSession.save({\n ...(activeTargetId !== undefined && persistedIds.has(activeTargetId)\n ? { activeTargetId }\n : {}),\n open: selectionOpen,\n sequence: targetSequence,\n targets: persistedTargets,\n });\n }\n\n function targetIsCurrent(target: SelectedTarget, revision: number): boolean {\n return (\n mounted &&\n revision === sessionRevision &&\n state.status !== \"idle\" &&\n targets.includes(target)\n );\n }\n\n function canPreview(): boolean {\n const instructionCharacters = targets.reduce(\n (total, target) => total + target.instruction.trim().length,\n 0,\n );\n\n return (\n targets.length > 0 &&\n instructionCharacters <= MAX_ANNOTATION_INSTRUCTION_CHARACTERS &&\n targets.every(\n (target) =>\n target.instruction.trim().length > 0 &&\n target.elementContext !== undefined &&\n target.styles !== undefined &&\n target.apiStatus !== \"loading\",\n )\n );\n }\n\n function selectionSummary(): string {\n const messages = view.messages().summary;\n\n return targets\n .map((target, index) => {\n const summary = createSelectionSummary(\n {\n resolution: target.resolution,\n ...(target.code === undefined ? {} : { code: target.code }),\n ...(target.styles === undefined ? {} : { styles: target.styles }),\n apiStatus: target.apiStatus,\n collectionStatus: target.collectionStatus,\n framework: config.framework,\n frameworkVersion: config.frameworkVersion,\n spotPatchVersion: config.spotPatchVersion,\n },\n messages,\n );\n return `${messages.target(index + 1, target.id === activeTargetId)}\\n${summary}`;\n })\n .join(\"\\n\\n\");\n }\n\n function refreshHighlights(): void {\n const highlights = targets.flatMap((target): SelectionHighlightView[] => {\n if (!target.element?.isConnected) {\n return [];\n }\n\n const rect = getVisibleElementRect(target.element, browser.window);\n\n if (rect === undefined) {\n return [];\n }\n\n return [\n {\n id: target.id,\n label: elementLabel(target.element),\n rect,\n active: target.id === activeTargetId,\n },\n ];\n });\n\n if (highlights.length === 0) {\n view.hideSelectionHighlights();\n } else {\n view.showSelectionHighlights(highlights);\n }\n }\n\n function refreshSelectionView(show = false): void {\n if (targets.length === 0) {\n return;\n }\n\n view.renderTargets(\n targets.map((target) => ({\n id: target.id,\n label:\n target.resolution.react.componentName ??\n (target.element === undefined\n ? (target.elementContext?.tagName ?? \"Element\")\n : elementLabel(target.element)),\n source: sourceLabel(target, view.messages().context.sourceUnavailable),\n canOpenEditor: target.marker !== undefined,\n status: targetStatus(target),\n active: target.id === activeTargetId,\n instruction: target.instruction,\n })),\n config.maxTargets,\n );\n refreshHighlights();\n const current = activeTarget();\n const summary = selectionSummary();\n const canOpenEditor = current?.marker !== undefined;\n\n if (show) {\n view.showSelection(summary, canOpenEditor, canPreview());\n } else {\n view.updateSelection(summary, canOpenEditor, canPreview());\n }\n }\n\n function selectedAnnotation(): SpotAnnotation | undefined {\n if (!canPreview()) {\n return undefined;\n }\n\n const annotationTargets = targets.map((target): SpotTargetContext => {\n if (target.elementContext === undefined || target.styles === undefined) {\n throw new Error(\"SpotPatch attempted to compose an incomplete target.\");\n }\n\n const warnings = [\n ...(target.apiStatus === \"failed\"\n ? [\"Source context could not be loaded.\"]\n : []),\n ...(target.collectionStatus === \"failed\"\n ? [\"Part of the browser context could not be collected.\"]\n : []),\n ];\n\n return {\n instruction: target.instruction.trim(),\n page: target.page,\n source: target.resolution.source,\n react: target.resolution.react,\n element: target.elementContext,\n styles: target.styles,\n ...(target.code === undefined ? {} : { code: target.code }),\n warnings,\n };\n });\n\n return createAnnotation({\n id: createId(),\n locale: view.locale(),\n createdAt: now(),\n page: collectPageContext(browser.document, browser.window),\n targets: annotationTargets,\n });\n }\n\n function showElementHighlight(element: Element): void {\n view.showHighlight(getElementRect(element, browser.window), elementLabel(element));\n }\n\n function restoreFocus(): void {\n if (previousFocus?.isConnected === true) {\n previousFocus.focus({ preventScroll: true });\n }\n\n previousFocus = undefined;\n }\n\n function clearCollectionTimers(): void {\n for (const timer of collectionTimers.values()) {\n browser.window.clearTimeout(timer);\n }\n\n collectionTimers.clear();\n }\n\n function releaseSelection(): void {\n sessionRevision += 1;\n api.cancelPending();\n agentWorkflow.disposeSelection();\n clearCollectionTimers();\n resizeObserver?.disconnect();\n targets = [];\n activeTargetId = undefined;\n dataFlowRequestRevision += 1;\n pageDataFlowReport = undefined;\n pageDataFlowStatus = \"idle\";\n selectionOpen = false;\n workflowSelectionActive = false;\n addingTarget = false;\n previewPrompt = \"\";\n view.hideSelection();\n view.hideSelectionHighlights();\n selectionSession.clear();\n restoreFocus();\n }\n\n function close(): void {\n if (state.status === \"inspecting\") {\n transition({ type: \"CANCEL\" });\n } else if (state.status === \"selected\") {\n transition({ type: \"CLOSE\" });\n } else if (state.status === \"previewing\") {\n transition({ type: \"BACK\" });\n transition({ type: \"CLOSE\" });\n }\n\n selectionOpen = false;\n persistSelection();\n view.hideSelection();\n view.hideSelectionHighlights();\n restoreFocus();\n view.hideHighlight();\n }\n\n function cancelAddTarget(): void {\n if (state.status !== \"inspecting\" || !addingTarget || targets.length === 0) {\n close();\n return;\n }\n\n addingTarget = false;\n transition({ type: \"SELECT\" });\n view.hideHighlight();\n refreshSelectionView(true);\n view.focusTargetInstruction(activeTargetId);\n view.announce(view.messages().announcements.addCancelled);\n }\n\n function activate(): void {\n if (state.status === \"inspecting\" && addingTarget) {\n cancelAddTarget();\n return;\n }\n\n if (state.status !== \"idle\") {\n close();\n return;\n }\n\n if (targets.length > 0) {\n selectionOpen = true;\n transition({ type: \"RESTORE\" });\n if (!workflowSelectionActive) {\n agentWorkflow.beginSelection();\n workflowSelectionActive = true;\n }\n refreshSelectionView(true);\n void loadDataFlowReports();\n view.focusTargetInstruction(activeTargetId);\n persistSelection();\n return;\n }\n\n transition({ type: \"ACTIVATE\" });\n view.hideSelection();\n view.announce(view.messages().announcements.selectionEnabled);\n }\n\n function beginReselect(message = view.messages().announcements.chooseAnother): void {\n if (state.status !== \"selected\") {\n return;\n }\n\n transition({ type: \"RESELECT\" });\n releaseSelection();\n view.hideHighlight();\n view.announce(message);\n }\n\n function beginAddTarget(): void {\n if (state.status !== \"selected\") {\n return;\n }\n\n if (targets.length >= config.maxTargets) {\n view.announce(view.messages().announcements.selectionLimit(config.maxTargets));\n return;\n }\n\n addingTarget = true;\n transition({ type: \"RESELECT\" });\n view.hideSelectionTemporarily();\n view.hideHighlight();\n view.announce(\n view.messages().announcements.chooseAdditional(targets.length, config.maxTargets),\n );\n }\n\n function detachAppliedTargets(): void {\n sessionRevision += 1;\n clearCollectionTimers();\n resizeObserver?.disconnect();\n\n for (const target of targets) {\n target.element = undefined;\n }\n\n view.hideHighlight();\n view.hideSelectionHighlights();\n refreshSelectionView();\n selectionSession.clear();\n view.announce(view.messages().announcements.appliedTargetsDetached);\n }\n\n const agentWorkflow = createAgentWorkflow({\n ai: config.ai,\n api,\n getAnnotation: selectedAnnotation,\n onApplied: detachAppliedTargets,\n onReselectRequired() {\n beginReselect(view.messages().announcements.reselectAfterChange);\n },\n view,\n });\n\n async function loadSourceContext(\n target: SelectedTarget,\n revision: number,\n ): Promise<void> {\n const marker = target.marker;\n\n if (marker === undefined) {\n return;\n }\n\n try {\n const context = await api.sourceContext({\n fileId: marker.fileId,\n line: marker.line,\n column: marker.column,\n maxLines: config.budget.maxCodeLines,\n });\n\n if (targetIsCurrent(target, revision)) {\n target.code = context;\n target.apiStatus = \"connected\";\n persistSelection();\n refreshSelectionView();\n view.announce(view.messages().announcements.sourceLoaded);\n }\n } catch (error: unknown) {\n if (targetIsCurrent(target, revision)) {\n target.code = undefined;\n target.apiStatus = \"failed\";\n persistSelection();\n refreshSelectionView();\n view.announce(view.messages().announcements.sourceFailed);\n\n if (\n config.debug &&\n !(error instanceof DOMException && error.name === \"AbortError\")\n ) {\n console.warn(\"[spotpatch:runtime] Source context request failed.\");\n }\n }\n }\n }\n\n function scheduleBrowserContextCollection(\n target: SelectedTarget,\n revision: number,\n ): void {\n const element = target.element;\n\n if (element === undefined) {\n return;\n }\n\n const timer = browser.window.setTimeout(() => {\n collectionTimers.delete(target.id);\n\n if (!targetIsCurrent(target, revision)) {\n return;\n }\n\n let failed = false;\n\n try {\n target.elementContext = collectElementContext({\n element,\n maxCharacters: config.budget.domCharacters,\n });\n } catch {\n target.elementContext = undefined;\n failed = true;\n }\n\n try {\n target.styles = collectStyleContext({\n document: browser.document,\n element,\n maxCharacters: config.budget.cssCharacters,\n });\n } catch {\n target.styles = EMPTY_STYLE_CONTEXT;\n failed = true;\n }\n\n target.collectionStatus = failed ? \"failed\" : \"ready\";\n persistSelection();\n refreshSelectionView();\n view.announce(\n failed\n ? view.messages().announcements.contextWarning\n : view.messages().announcements.contextCollected,\n );\n\n if (config.debug && target.styles.warnings.length > 0) {\n console.warn(\n `[spotpatch:runtime] CSS collection completed with ${String(target.styles.warnings.length)} warning(s).`,\n );\n }\n }, 0);\n collectionTimers.set(target.id, timer);\n }\n\n function duplicateTarget(\n element: Element,\n marker: SourceMarker | undefined,\n ): SelectedTarget | undefined {\n if (marker !== undefined) {\n return targets.find(\n (target) =>\n target.marker?.fileId === marker.fileId &&\n target.marker.line === marker.line &&\n target.marker.column === marker.column,\n );\n }\n\n return targets.find((target) => target.element === element);\n }\n\n function selectElement(element: Element): void {\n const resolution = sourceResolver.resolve(element);\n const marker = sourceRefToMarker(resolution.source);\n const duplicate = duplicateTarget(element, marker);\n\n if (duplicate !== undefined) {\n activeTargetId = duplicate.id;\n addingTarget = false;\n transition({ type: \"SELECT\" });\n view.hideHighlight();\n refreshSelectionView(true);\n void loadDataFlowReports();\n view.focusTargetInstruction(duplicate.id);\n view.announce(view.messages().announcements.duplicate);\n return;\n }\n\n if (targets.length >= config.maxTargets) {\n addingTarget = false;\n transition({ type: \"SELECT\" });\n view.hideHighlight();\n refreshSelectionView(true);\n view.announce(view.messages().announcements.selectionLimit(config.maxTargets));\n return;\n }\n\n const initialSelection = targets.length === 0;\n\n if (initialSelection) {\n previousFocus =\n browser.document.activeElement instanceof HTMLElement\n ? browser.document.activeElement\n : undefined;\n previewPrompt = \"\";\n agentWorkflow.beginSelection();\n workflowSelectionActive = true;\n }\n\n targetSequence += 1;\n const target: SelectedTarget = {\n id: `target-${String(targetSequence)}`,\n element,\n resolution,\n marker,\n page: collectPageContext(browser.document, browser.window),\n code: undefined,\n elementContext: undefined,\n styles: undefined,\n instruction: \"\",\n apiStatus: marker === undefined ? \"not-required\" : \"loading\",\n collectionStatus: \"loading\",\n dataFlowReport: undefined,\n dataFlowStatus: \"idle\",\n };\n targets.push(target);\n activeTargetId = target.id;\n addingTarget = false;\n const revision = sessionRevision;\n transition({ type: \"SELECT\" });\n view.hideHighlight();\n resizeObserver?.observe(element);\n refreshSelectionView(true);\n void loadDataFlowReports();\n selectionOpen = true;\n view.focusTargetInstruction(target.id);\n scheduleBrowserContextCollection(target, revision);\n\n if (marker !== undefined) {\n void loadSourceContext(target, revision);\n } else {\n view.announce(\n resolution.source.confidence === \"probable\"\n ? view.messages().announcements.sourceProbable\n : view.messages().announcements.sourceMissing,\n );\n }\n }\n\n function updateHoveredElement(): void {\n animationFrame = undefined;\n\n if (state.status !== \"inspecting\" || lastPointer === undefined) {\n return;\n }\n\n const candidate = pickElementAt(\n browser.document,\n browser.window,\n lastPointer.x,\n lastPointer.y,\n );\n transition({ type: \"HOVER\" });\n\n if (candidate === undefined) {\n view.hideHighlight();\n return;\n }\n\n showElementHighlight(candidate);\n }\n\n function handlePointerMove(event: PointerEvent): void {\n if (state.status !== \"inspecting\") {\n return;\n }\n\n lastPointer = { x: event.clientX, y: event.clientY };\n animationFrame ??= browser.window.requestAnimationFrame(updateHoveredElement);\n }\n\n function handleClick(event: MouseEvent): void {\n if (state.status !== \"inspecting\" || isSpotPatchUIEventTarget(event.target)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n const candidate = pickElementAt(\n browser.document,\n browser.window,\n event.clientX,\n event.clientY,\n );\n\n if (candidate === undefined) {\n view.announce(view.messages().announcements.noSelectable);\n return;\n }\n\n selectElement(candidate);\n }\n\n function handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\" && state.status !== \"idle\") {\n event.preventDefault();\n\n if (state.status === \"inspecting\" && addingTarget) {\n cancelAddTarget();\n } else if (state.status === \"inspecting\" || state.status === \"selected\") {\n close();\n } else {\n transition({ type: \"BACK\" });\n view.focusTargetInstruction(activeTargetId);\n }\n\n return;\n }\n\n if (\n isTextEntryTarget(event.target) ||\n !matchesShortcut(event, config.shortcut, browser.window.navigator.userAgent)\n ) {\n return;\n }\n\n event.preventDefault();\n activate();\n }\n\n function removeTarget(targetId: string): void {\n if (state.status !== \"selected\" && state.status !== \"inspecting\") {\n return;\n }\n\n const index = targets.findIndex((target) => target.id === targetId);\n\n if (index < 0) {\n return;\n }\n\n const [removed] = targets.splice(index, 1);\n\n if (removed === undefined) {\n return;\n }\n\n const timer = collectionTimers.get(removed.id);\n\n if (timer !== undefined) {\n browser.window.clearTimeout(timer);\n collectionTimers.delete(removed.id);\n }\n\n if (removed.element !== undefined) {\n resizeObserver?.unobserve(removed.element);\n }\n\n if (activeTargetId === removed.id) {\n activeTargetId = targets.at(-1)?.id;\n }\n\n if (targets.length === 0) {\n addingTarget = true;\n\n if (state.status === \"selected\") {\n transition({ type: \"RESELECT\" });\n }\n\n view.hideSelectionTemporarily();\n view.hideSelectionHighlights();\n pageDataFlowReport = undefined;\n pageDataFlowStatus = \"idle\";\n renderDataFlowView();\n selectionSession.clear();\n view.announce(view.messages().announcements.allTargetsRemoved);\n return;\n }\n\n refreshSelectionView();\n void loadDataFlowReports();\n persistSelection();\n view.announce(view.messages().announcements.targetRemoved);\n }\n\n function refreshSelectedGeometry(): void {\n if (state.status === \"idle\" || targets.length === 0) {\n return;\n }\n\n const disconnected = targets.filter(\n (target) => target.element !== undefined && !target.element.isConnected,\n );\n\n if (disconnected.length > 0) {\n for (const target of disconnected) {\n if (target.element !== undefined) {\n resizeObserver?.unobserve(target.element);\n target.element = undefined;\n }\n }\n refreshSelectionView();\n persistSelection();\n view.announce(view.messages().announcements.detachedTargetPreserved);\n return;\n }\n\n refreshHighlights();\n }\n\n function handleOpenEditor(targetId?: string): void {\n const current =\n targetId === undefined\n ? activeTarget()\n : targets.find((target) => target.id === targetId);\n\n if (state.status !== \"selected\" || current?.marker === undefined) {\n return;\n }\n\n if (activeTargetId !== current.id) {\n activeTargetId = current.id;\n refreshSelectionView();\n }\n\n const marker = current.marker;\n const selectionRevision = sessionRevision;\n const requestRevision = ++editorRequestRevision;\n transition({ type: \"OPEN_EDITOR\" });\n view.renderEditorStatus(\"opening\");\n\n void api\n .openEditor({\n fileId: marker.fileId,\n line: marker.line,\n column: marker.column,\n })\n .then(() => {\n if (\n mounted &&\n state.status === \"selected\" &&\n selectionRevision === sessionRevision &&\n requestRevision === editorRequestRevision &&\n activeTargetId === current.id &&\n targets.includes(current)\n ) {\n view.renderEditorStatus(\"success\");\n }\n })\n .catch(() => {\n if (\n mounted &&\n state.status === \"selected\" &&\n selectionRevision === sessionRevision &&\n requestRevision === editorRequestRevision &&\n activeTargetId === current.id &&\n targets.includes(current)\n ) {\n view.renderEditorStatus(\"error\");\n }\n });\n }\n\n function handleTargetListInput(event: Event): void {\n if (state.status !== \"selected\" || !(event.target instanceof HTMLTextAreaElement)) {\n return;\n }\n\n const targetId = event.target.dataset.targetInstructionId;\n const target = targets.find((candidate) => candidate.id === targetId);\n\n if (target === undefined) {\n return;\n }\n\n target.instruction = event.target.value;\n view.updateTargetInstruction(target.id, target.instruction);\n view.setPreviewEnabled(canPreview());\n persistSelection();\n }\n\n function handleOpenEditorButtonClick(): void {\n handleOpenEditor();\n }\n\n function handleTargetListKeydown(event: KeyboardEvent): void {\n if (\n config.ai.enabled &&\n state.status === \"selected\" &&\n event.key === \"Enter\" &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n agentWorkflow.run();\n }\n }\n\n function handlePreview(): void {\n if (state.status !== \"selected\") {\n return;\n }\n\n const annotation = selectedAnnotation();\n\n if (annotation === undefined) {\n view.announce(view.messages().announcements.completeInstructions);\n return;\n }\n\n previewPrompt = promptComposer.compose(annotation);\n transition({ type: \"PREVIEW\" });\n view.showPreview(previewPrompt);\n view.focusPrompt();\n }\n\n function handleCopy(): void {\n if (state.status !== \"previewing\" || previewPrompt.length === 0) {\n return;\n }\n\n if (clipboard === undefined) {\n transition({ type: \"COPY_FAILURE\" });\n view.focusPrompt();\n view.announce(view.messages().announcements.clipboardUnavailable);\n return;\n }\n\n const revision = sessionRevision;\n void clipboard\n .writeText(previewPrompt)\n .then(() => {\n if (mounted && revision === sessionRevision && state.status === \"previewing\") {\n transition({ type: \"COPY_SUCCESS\" });\n view.focusTargetInstruction(activeTargetId);\n view.announce(view.messages().announcements.promptCopied);\n }\n })\n .catch(() => {\n if (mounted && revision === sessionRevision && state.status === \"previewing\") {\n transition({ type: \"COPY_FAILURE\" });\n view.focusPrompt();\n view.announce(view.messages().announcements.copyFailed);\n }\n });\n }\n\n function handleBack(): void {\n if (state.status !== \"previewing\") {\n return;\n }\n\n transition({ type: \"BACK\" });\n view.focusTargetInstruction(activeTargetId);\n }\n\n function handleLocaleChange(): void {\n if (!mounted || targets.length === 0) {\n return;\n }\n\n refreshSelectionView();\n\n if (state.status === \"previewing\") {\n const annotation = selectedAnnotation();\n\n if (annotation !== undefined) {\n previewPrompt = promptComposer.compose(annotation);\n view.showPreview(previewPrompt);\n }\n }\n }\n\n function handleTargetListClick(event: MouseEvent): void {\n const eventTarget = event.target;\n\n if (!(eventTarget instanceof Element)) {\n return;\n }\n\n const removeButton = eventTarget.closest<HTMLButtonElement>(\n \"button[data-remove-target-id]\",\n );\n\n if (removeButton?.dataset.removeTargetId !== undefined) {\n removeTarget(removeButton.dataset.removeTargetId);\n return;\n }\n\n const openButton = eventTarget.closest<HTMLButtonElement>(\n \"button[data-open-target-id]\",\n );\n\n if (openButton?.dataset.openTargetId !== undefined) {\n handleOpenEditor(openButton.dataset.openTargetId);\n return;\n }\n\n const activateButton = eventTarget.closest<HTMLButtonElement>(\n \"button[data-activate-target-id]\",\n );\n const targetId = activateButton?.dataset.activateTargetId;\n\n if (\n state.status !== \"selected\" ||\n targetId === undefined ||\n !targets.some((target) => target.id === targetId)\n ) {\n return;\n }\n\n activeTargetId = targetId;\n refreshSelectionView();\n void loadDataFlowReports();\n view.focusTargetInstruction(targetId);\n }\n\n function handleReselect(): void {\n beginReselect();\n }\n\n function handleDataFlowRefresh(): void {\n void loadDataFlowReports();\n }\n\n function mount(): void {\n if (mounted) {\n return;\n }\n\n mounted = true;\n view.renderStatus(state.status);\n browser.document.addEventListener(\"pointermove\", handlePointerMove, true);\n browser.document.addEventListener(\"click\", handleClick, true);\n browser.document.addEventListener(\"keydown\", handleKeydown, true);\n browser.window.addEventListener(\"scroll\", refreshSelectedGeometry, true);\n browser.window.addEventListener(\"resize\", refreshSelectedGeometry);\n view.triggerButton.addEventListener(\"click\", activate);\n view.addTargetButton.addEventListener(\"click\", beginAddTarget);\n view.reselectButton.addEventListener(\"click\", handleReselect);\n view.targetList.addEventListener(\"click\", handleTargetListClick);\n view.targetList.addEventListener(\"input\", handleTargetListInput);\n view.targetList.addEventListener(\"keydown\", handleTargetListKeydown);\n view.openEditorButton.addEventListener(\"click\", handleOpenEditorButtonClick);\n view.dataFlowRefreshButton.addEventListener(\"click\", handleDataFlowRefresh);\n view.previewButton.addEventListener(\"click\", handlePreview);\n view.copyButton.addEventListener(\"click\", handleCopy);\n view.backButton.addEventListener(\"click\", handleBack);\n view.closeButton.addEventListener(\"click\", close);\n view.agentProviderSelect.addEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentModelSelect.addEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentModeSelect.addEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentConsentCheckbox.addEventListener(\"change\", agentWorkflow.consentChanged);\n view.agentTestButton.addEventListener(\"click\", agentWorkflow.testCapability);\n view.agentRunButton.addEventListener(\"click\", agentWorkflow.run);\n view.agentCancelButton.addEventListener(\"click\", agentWorkflow.cancel);\n view.agentApplyButton.addEventListener(\"click\", agentWorkflow.apply);\n view.agentRevertButton.addEventListener(\"click\", agentWorkflow.revert);\n view.agentResetButton.addEventListener(\"click\", agentWorkflow.reset);\n unsubscribeLocale = view.subscribeLocale(handleLocaleChange);\n\n if (browser.resizeObserver !== undefined) {\n resizeObserver = new browser.resizeObserver(refreshSelectedGeometry);\n }\n\n if (browser.mutationObserver !== undefined) {\n mutationObserver = new browser.mutationObserver(refreshSelectedGeometry);\n mutationObserver.observe(browser.document.documentElement, {\n childList: true,\n subtree: true,\n });\n }\n\n if (selectionOpen && targets.length > 0) {\n transition({ type: \"RESTORE\" });\n agentWorkflow.beginSelection();\n workflowSelectionActive = true;\n refreshSelectionView(true);\n }\n\n if (config.debug) {\n console.info(`[spotpatch:runtime] Mounted. Shortcut: ${config.shortcut}.`);\n }\n }\n\n function dispose(): void {\n if (!mounted) {\n unsubscribeLocale?.();\n unsubscribeLocale = undefined;\n view.dispose();\n api.cancelPending();\n api.dispose();\n agentWorkflow.disposeSelection();\n sourceResolver.dispose();\n return;\n }\n\n mounted = false;\n unsubscribeLocale?.();\n unsubscribeLocale = undefined;\n browser.document.removeEventListener(\"pointermove\", handlePointerMove, true);\n browser.document.removeEventListener(\"click\", handleClick, true);\n browser.document.removeEventListener(\"keydown\", handleKeydown, true);\n browser.window.removeEventListener(\"scroll\", refreshSelectedGeometry, true);\n browser.window.removeEventListener(\"resize\", refreshSelectedGeometry);\n view.triggerButton.removeEventListener(\"click\", activate);\n view.addTargetButton.removeEventListener(\"click\", beginAddTarget);\n view.reselectButton.removeEventListener(\"click\", handleReselect);\n view.targetList.removeEventListener(\"click\", handleTargetListClick);\n view.targetList.removeEventListener(\"input\", handleTargetListInput);\n view.targetList.removeEventListener(\"keydown\", handleTargetListKeydown);\n view.openEditorButton.removeEventListener(\"click\", handleOpenEditorButtonClick);\n view.dataFlowRefreshButton.removeEventListener(\"click\", handleDataFlowRefresh);\n view.previewButton.removeEventListener(\"click\", handlePreview);\n view.copyButton.removeEventListener(\"click\", handleCopy);\n view.backButton.removeEventListener(\"click\", handleBack);\n view.closeButton.removeEventListener(\"click\", close);\n view.agentProviderSelect.removeEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentModelSelect.removeEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentModeSelect.removeEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentConsentCheckbox.removeEventListener(\n \"change\",\n agentWorkflow.consentChanged,\n );\n view.agentTestButton.removeEventListener(\"click\", agentWorkflow.testCapability);\n view.agentRunButton.removeEventListener(\"click\", agentWorkflow.run);\n view.agentCancelButton.removeEventListener(\"click\", agentWorkflow.cancel);\n view.agentApplyButton.removeEventListener(\"click\", agentWorkflow.apply);\n view.agentRevertButton.removeEventListener(\"click\", agentWorkflow.revert);\n view.agentResetButton.removeEventListener(\"click\", agentWorkflow.reset);\n\n if (animationFrame !== undefined) {\n browser.window.cancelAnimationFrame(animationFrame);\n animationFrame = undefined;\n }\n\n clearCollectionTimers();\n persistSelection();\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n resizeObserver = undefined;\n mutationObserver = undefined;\n targets = [];\n activeTargetId = undefined;\n previewPrompt = \"\";\n lastPointer = undefined;\n previousFocus = undefined;\n api.cancelPending();\n api.dispose();\n agentWorkflow.disposeSelection();\n sourceResolver.dispose();\n view.dispose();\n state = INITIAL_RUNTIME_STATE;\n }\n\n return Object.freeze({ mount, dispose, getState: () => state });\n}\n","import {\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n MAX_ANNOTATION_TARGETS,\n MAX_TARGET_INSTRUCTION_CHARACTERS,\n type CodeContext,\n type ElementContext,\n type PageContext,\n type ReactContext,\n type SourceRef,\n type SpotAnnotation,\n type SpotPatchLocale,\n type SpotTargetContext,\n type StyleContext,\n} from \"@spotpatch/shared\";\n\nexport interface CreateAnnotationInput {\n readonly createdAt: string;\n readonly id: string;\n readonly locale: SpotPatchLocale;\n readonly page: PageContext;\n readonly targets: readonly SpotTargetContext[];\n}\n\nfunction freezeSource(source: SourceRef, code?: CodeContext): SourceRef {\n return Object.freeze({\n ...source,\n ...(source.relativePath === undefined && code !== undefined\n ? { relativePath: code.relativePath }\n : {}),\n });\n}\n\nfunction freezeReact(react: ReactContext): ReactContext {\n return Object.freeze({\n ...react,\n componentStack: Object.freeze([...react.componentStack]),\n ...(react.source === undefined ? {} : { source: freezeSource(react.source) }),\n });\n}\n\nfunction freezeElement(element: ElementContext): ElementContext {\n return Object.freeze({\n ...element,\n rect: Object.freeze({ ...element.rect }),\n });\n}\n\nfunction freezeStyles(styles: StyleContext): StyleContext {\n return Object.freeze({\n ...styles,\n classNames: Object.freeze([...styles.classNames]),\n matchedRules: Object.freeze(\n styles.matchedRules.map((rule) => Object.freeze({ ...rule })),\n ),\n computed: Object.freeze({ ...styles.computed }),\n warnings: Object.freeze([...styles.warnings]),\n });\n}\n\nfunction freezeTarget(target: SpotTargetContext): SpotTargetContext {\n return Object.freeze({\n instruction: target.instruction.trim(),\n ...(target.page === undefined ? {} : { page: Object.freeze({ ...target.page }) }),\n source: freezeSource(target.source, target.code),\n react: freezeReact(target.react),\n element: freezeElement(target.element),\n styles: freezeStyles(target.styles),\n ...(target.code === undefined ? {} : { code: Object.freeze({ ...target.code }) }),\n warnings: Object.freeze([...target.warnings]),\n });\n}\n\nexport function createAnnotation(input: CreateAnnotationInput): SpotAnnotation {\n if (input.targets.length < 1 || input.targets.length > MAX_ANNOTATION_TARGETS) {\n throw new RangeError(\n `SpotPatch annotations require between 1 and ${String(MAX_ANNOTATION_TARGETS)} targets.`,\n );\n }\n\n const instructions = input.targets.map((target) => target.instruction.trim());\n\n if (\n instructions.some(\n (instruction) =>\n instruction.length === 0 ||\n instruction.length > MAX_TARGET_INSTRUCTION_CHARACTERS,\n ) ||\n instructions.reduce((total, instruction) => total + instruction.length, 0) >\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS\n ) {\n throw new RangeError(\"SpotPatch target instructions exceed the allowed bounds.\");\n }\n\n return Object.freeze({\n schemaVersion: 3,\n id: input.id,\n locale: input.locale,\n page: Object.freeze({ ...input.page }),\n targets: Object.freeze(input.targets.map(freezeTarget)),\n createdAt: input.createdAt,\n });\n}\n","import {\n DATA_FLOW_SCHEMA_VERSION,\n SPOTPATCH_ENDPOINTS,\n SPOTPATCH_TOKEN_HEADER,\n getAgentJobEndpoint,\n type AgentCapabilityRequest,\n type AgentCapabilitySnapshot,\n type AgentJobCreateRequest,\n type AgentJobEvent,\n type AgentJobResultResponse,\n type AgentJobSnapshot,\n type AgentWorkspaceHealthSnapshot,\n type ApiResponse,\n type CodeContext,\n type ComponentDataFlowReport,\n type DataFlowComponentReportRequest,\n type DataFlowPageReportRequest,\n type EditorOpenResult,\n type ErrorCode,\n type OpenEditorRequest,\n type PageDataFlowReport,\n type SPOTPATCH_API_BASE,\n type SourceContextRequest,\n} from \"@spotpatch/shared\";\n\nimport {\n isAgentCapabilitySnapshot,\n isAgentErrorCode,\n isAgentJobEvent,\n isAgentJobResultResponse,\n isAgentJobSnapshot,\n isAgentWorkspaceHealthSnapshot,\n} from \"./agent-response-validation.js\";\n\nconst MAX_JSON_RESPONSE_BYTES = 2_000_000;\nconst MAX_EVENT_LINE_BYTES = 100_000;\nconst MAX_EVENT_STREAM_BYTES = 4_000_000;\n\nexport class RuntimeApiError extends Error {\n readonly code: ErrorCode | undefined;\n\n constructor(code?: ErrorCode) {\n super(\"SpotPatch local API request failed.\");\n this.name = \"RuntimeApiError\";\n this.code = code;\n }\n}\n\nexport interface RuntimeApi {\n readonly componentDataFlowReport: (\n request: DataFlowComponentReportRequest,\n ) => Promise<ComponentDataFlowReport>;\n readonly agentCapability: (\n request: AgentCapabilityRequest,\n ) => Promise<AgentCapabilitySnapshot>;\n readonly agentEvents: (\n jobId: string,\n onEvent: (event: AgentJobEvent) => void,\n ) => Promise<void>;\n readonly agentResult: (jobId: string) => Promise<AgentJobResultResponse>;\n readonly agentWorkspaceHealth: () => Promise<AgentWorkspaceHealthSnapshot>;\n readonly applyAgentJob: (jobId: string) => Promise<AgentJobSnapshot>;\n readonly cancelAgentJob: (jobId: string) => Promise<AgentJobSnapshot>;\n readonly cancelPending: () => void;\n readonly createAgentJob: (\n request: AgentJobCreateRequest,\n ) => Promise<AgentJobSnapshot>;\n readonly dispose: () => void;\n readonly openEditor: (request: OpenEditorRequest) => Promise<EditorOpenResult>;\n readonly pageDataFlowReport: (\n request: DataFlowPageReportRequest,\n ) => Promise<PageDataFlowReport>;\n readonly revertAgentJob: (jobId: string) => Promise<AgentJobSnapshot>;\n readonly sourceContext: (request: SourceContextRequest) => Promise<CodeContext>;\n}\n\nexport interface RuntimeApiOptions {\n readonly apiBase: typeof SPOTPATCH_API_BASE;\n readonly fetch: typeof globalThis.fetch;\n readonly sessionToken: string;\n readonly dataFlowReportMaxBytes?: number;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readFailureCode(value: unknown): ErrorCode | undefined {\n if (!isRecord(value) || value.ok !== false || !isRecord(value.error)) {\n return undefined;\n }\n\n return isAgentErrorCode(value.error.code) ? value.error.code : undefined;\n}\n\nfunction readSuccessData(value: unknown): unknown {\n if (!isRecord(value) || value.ok !== true || !(\"data\" in value)) {\n throw new RuntimeApiError();\n }\n\n return value.data;\n}\n\nfunction isCodeContext(value: unknown): value is CodeContext {\n return (\n isRecord(value) &&\n typeof value.relativePath === \"string\" &&\n (value.language === \"tsx\" || value.language === \"jsx\") &&\n typeof value.startLine === \"number\" &&\n typeof value.endLine === \"number\" &&\n typeof value.excerpt === \"string\" &&\n (value.boundary === \"component\" || value.boundary === \"nearby-lines\")\n );\n}\n\nfunction deepFreezeUnknown(value: unknown): void {\n if (!isRecord(value) && !Array.isArray(value)) {\n return;\n }\n\n if (Object.isFrozen(value)) {\n return;\n }\n\n for (const nested of Object.values(value)) {\n deepFreezeUnknown(nested);\n }\n\n Object.freeze(value);\n}\n\nfunction deepFreeze<T>(value: T): T {\n deepFreezeUnknown(value);\n return value;\n}\n\nasync function readBoundedText(\n response: Response,\n maximumBytes: number,\n): Promise<string> {\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (Number.isFinite(declaredLength) && declaredLength > maximumBytes) {\n throw new RuntimeApiError();\n }\n\n if (response.body === null) {\n throw new RuntimeApiError();\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let totalBytes = 0;\n let output = \"\";\n\n try {\n for (;;) {\n const chunk = await reader.read();\n\n if (chunk.done) {\n output += decoder.decode();\n return output;\n }\n\n totalBytes += chunk.value.byteLength;\n\n if (totalBytes > maximumBytes) {\n await reader.cancel();\n throw new RuntimeApiError();\n }\n\n output += decoder.decode(chunk.value, { stream: true });\n }\n } catch (error: unknown) {\n if (error instanceof RuntimeApiError) {\n throw error;\n }\n\n throw new RuntimeApiError();\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new RuntimeApiError();\n }\n}\n\nasync function readJsonEnvelope(\n response: Response,\n maximumBytes = MAX_JSON_RESPONSE_BYTES,\n): Promise<unknown> {\n const payload = parseJson(\n await readBoundedText(response, maximumBytes),\n ) as ApiResponse<unknown>;\n\n if (!response.ok) {\n throw new RuntimeApiError(readFailureCode(payload));\n }\n\n return readSuccessData(payload);\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isReportCompleteness(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.complete === \"boolean\" &&\n typeof value.visitedModules === \"number\" &&\n typeof value.visitedCallsites === \"number\" &&\n typeof value.frontierCount === \"number\"\n );\n}\n\nfunction isDataFlowCapability(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.enabled === \"boolean\" &&\n (value.staticAnalysis === \"available\" ||\n value.staticAnalysis === \"partial\" ||\n value.staticAnalysis === \"unavailable\") &&\n value.runtimeObservation === \"dispatch-only\" &&\n value.responseShape === \"consumed-fields-only\" &&\n value.aiAssistance === \"disabled\" &&\n Array.isArray(value.reasons)\n );\n}\n\nfunction isDataFlowDependency(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.kind === \"string\" &&\n typeof value.direction === \"string\" &&\n typeof value.execution === \"string\" &&\n typeof value.proof === \"string\" &&\n typeof value.association === \"string\" &&\n Array.isArray(value.parameters) &&\n isRecord(value.response) &&\n isStringArray(value.response.consumedFields) &&\n isStringArray(value.evidenceIds) &&\n isStringArray(value.observationIds)\n );\n}\n\nfunction isDataFlowReportBase(value: unknown): boolean {\n return (\n isRecord(value) &&\n value.schemaVersion === DATA_FLOW_SCHEMA_VERSION &&\n typeof value.reportId === \"string\" &&\n isRecord(value.baseline) &&\n typeof value.baseline.registryEpoch === \"string\" &&\n typeof value.baseline.analyzerVersion === \"string\" &&\n isStringArray(value.baseline.analyzedSourceVersions) &&\n isDataFlowCapability(value.capability) &&\n Array.isArray(value.dependencies) &&\n value.dependencies.every(isDataFlowDependency) &&\n Array.isArray(value.evidence) &&\n Array.isArray(value.diagnostics) &&\n isReportCompleteness(value.completeness)\n );\n}\n\nfunction isComponentDataFlowReport(value: unknown): value is ComponentDataFlowReport {\n return (\n isDataFlowReportBase(value) &&\n isRecord(value) &&\n isRecord(value.component) &&\n isRecord(value.component.source) &&\n typeof value.component.source.fileId === \"string\" &&\n typeof value.component.source.sourceVersion === \"string\"\n );\n}\n\nfunction isPageDataFlowReport(value: unknown): value is PageDataFlowReport {\n return isDataFlowReportBase(value);\n}\n\nfunction parseCapability(\n value: unknown,\n expected: AgentCapabilityRequest,\n): AgentCapabilitySnapshot {\n if (\n !isAgentCapabilitySnapshot(value) ||\n value.providerProfileId !== expected.providerProfileId ||\n value.modelProfileId !== expected.modelProfileId\n ) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(value);\n}\n\nfunction parseJobSnapshot(\n value: unknown,\n expected?: Readonly<{\n jobId?: string;\n modelProfileId?: string;\n providerProfileId?: string;\n }>,\n): AgentJobSnapshot {\n if (\n !isAgentJobSnapshot(value) ||\n (expected?.jobId !== undefined && value.jobId !== expected.jobId) ||\n (expected?.providerProfileId !== undefined &&\n value.providerProfileId !== expected.providerProfileId) ||\n (expected?.modelProfileId !== undefined &&\n value.modelProfileId !== expected.modelProfileId)\n ) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(value);\n}\n\nfunction parseJobResult(value: unknown, expectedJobId: string): AgentJobResultResponse {\n if (!isAgentJobResultResponse(value) || value.snapshot.jobId !== expectedJobId) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(value);\n}\n\nfunction parseAgentEvent(value: unknown): AgentJobEvent {\n if (!isAgentJobEvent(value)) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(value);\n}\n\nfunction omitBrowserCodeContext(request: AgentJobCreateRequest): AgentJobCreateRequest {\n return {\n ...request,\n annotation: {\n ...request.annotation,\n targets: request.annotation.targets.map((target) => ({\n instruction: target.instruction,\n source: target.source,\n react: target.react,\n element: target.element,\n styles: target.styles,\n warnings: target.warnings,\n })),\n },\n };\n}\n\nexport function runtimeApiErrorCode(error: unknown): ErrorCode | undefined {\n return error instanceof RuntimeApiError ? error.code : undefined;\n}\n\nexport function createRuntimeApi(options: RuntimeApiOptions): RuntimeApi {\n const pendingRequests = new Set<AbortController>();\n\n function cancelPending(): void {\n for (const request of pendingRequests) {\n request.abort();\n }\n\n pendingRequests.clear();\n }\n\n async function requestJson(\n endpoint: string,\n method: \"GET\" | \"POST\",\n body?: unknown,\n maximumResponseBytes = MAX_JSON_RESPONSE_BYTES,\n ): Promise<unknown> {\n const abortController = new AbortController();\n pendingRequests.add(abortController);\n\n try {\n const response = await options.fetch(endpoint, {\n method,\n headers: {\n ...(body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n [SPOTPATCH_TOKEN_HEADER]: options.sessionToken,\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n signal: abortController.signal,\n });\n return await readJsonEnvelope(response, maximumResponseBytes);\n } finally {\n pendingRequests.delete(abortController);\n }\n }\n\n async function agentEvents(\n jobId: string,\n onEvent: (event: AgentJobEvent) => void,\n ): Promise<void> {\n const abortController = new AbortController();\n pendingRequests.add(abortController);\n\n try {\n const response = await options.fetch(getAgentJobEndpoint(jobId, \"events\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n [SPOTPATCH_TOKEN_HEADER]: options.sessionToken,\n },\n body: JSON.stringify({}),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n await readJsonEnvelope(response);\n return;\n }\n\n if (response.body === null) {\n throw new RuntimeApiError();\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let buffer = \"\";\n let totalBytes = 0;\n let previousSequence = 0;\n\n const consumeLine = (line: string): void => {\n if (line.trim().length === 0) {\n return;\n }\n\n if (new TextEncoder().encode(line).byteLength > MAX_EVENT_LINE_BYTES) {\n throw new RuntimeApiError();\n }\n\n const event = parseAgentEvent(parseJson(line));\n\n if (event.jobId !== jobId || event.sequence <= previousSequence) {\n throw new RuntimeApiError();\n }\n\n previousSequence = event.sequence;\n onEvent(event);\n };\n\n try {\n for (;;) {\n const chunk = await reader.read();\n\n if (chunk.done) {\n buffer += decoder.decode();\n consumeLine(buffer);\n return;\n }\n\n totalBytes += chunk.value.byteLength;\n\n if (totalBytes > MAX_EVENT_STREAM_BYTES) {\n await reader.cancel();\n throw new RuntimeApiError();\n }\n\n buffer += decoder.decode(chunk.value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n if (new TextEncoder().encode(buffer).byteLength > MAX_EVENT_LINE_BYTES) {\n await reader.cancel();\n throw new RuntimeApiError();\n }\n\n for (const line of lines) {\n consumeLine(line);\n }\n }\n } catch (error: unknown) {\n if (\n error instanceof RuntimeApiError ||\n (error instanceof DOMException && error.name === \"AbortError\")\n ) {\n throw error;\n }\n\n throw new RuntimeApiError();\n } finally {\n reader.releaseLock();\n }\n } finally {\n pendingRequests.delete(abortController);\n }\n }\n\n const emptyAction = Object.freeze({});\n\n return Object.freeze({\n cancelPending,\n\n async sourceContext(request: SourceContextRequest): Promise<CodeContext> {\n const data = await requestJson(\n SPOTPATCH_ENDPOINTS.sourceContext,\n \"POST\",\n request,\n );\n\n if (!isCodeContext(data)) {\n throw new RuntimeApiError();\n }\n\n return Object.freeze({ ...data });\n },\n\n async componentDataFlowReport(\n request: DataFlowComponentReportRequest,\n ): Promise<ComponentDataFlowReport> {\n const data = await requestJson(\n SPOTPATCH_ENDPOINTS.dataFlowComponentReport,\n \"POST\",\n request,\n options.dataFlowReportMaxBytes,\n );\n if (!isComponentDataFlowReport(data)) {\n throw new RuntimeApiError();\n }\n return deepFreeze(data);\n },\n\n async pageDataFlowReport(\n request: DataFlowPageReportRequest,\n ): Promise<PageDataFlowReport> {\n const data = await requestJson(\n SPOTPATCH_ENDPOINTS.dataFlowPageReport,\n \"POST\",\n request,\n options.dataFlowReportMaxBytes,\n );\n if (!isPageDataFlowReport(data)) {\n throw new RuntimeApiError();\n }\n return deepFreeze(data);\n },\n\n async openEditor(request: OpenEditorRequest): Promise<EditorOpenResult> {\n const data = await requestJson(SPOTPATCH_ENDPOINTS.openEditor, \"POST\", request);\n\n if (\n !isRecord(data) ||\n (data.editor !== \"auto\" && data.editor !== \"vscode\" && data.editor !== \"cursor\")\n ) {\n throw new RuntimeApiError();\n }\n\n return Object.freeze({ editor: data.editor });\n },\n\n async agentCapability(\n request: AgentCapabilityRequest,\n ): Promise<AgentCapabilitySnapshot> {\n return parseCapability(\n await requestJson(SPOTPATCH_ENDPOINTS.agentCapability, \"POST\", request),\n request,\n );\n },\n\n async agentWorkspaceHealth(): Promise<AgentWorkspaceHealthSnapshot> {\n const data = await requestJson(\n SPOTPATCH_ENDPOINTS.agentWorkspaceHealth,\n \"POST\",\n emptyAction,\n );\n\n if (!isAgentWorkspaceHealthSnapshot(data)) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(data);\n },\n\n async createAgentJob(request: AgentJobCreateRequest): Promise<AgentJobSnapshot> {\n const serverRequest = omitBrowserCodeContext(request);\n return parseJobSnapshot(\n await requestJson(SPOTPATCH_ENDPOINTS.agentJobs, \"POST\", serverRequest),\n request,\n );\n },\n\n agentEvents,\n\n async agentResult(jobId: string): Promise<AgentJobResultResponse> {\n return parseJobResult(\n await requestJson(getAgentJobEndpoint(jobId, \"result\"), \"POST\", emptyAction),\n jobId,\n );\n },\n\n async cancelAgentJob(jobId: string): Promise<AgentJobSnapshot> {\n return parseJobSnapshot(\n await requestJson(getAgentJobEndpoint(jobId, \"cancel\"), \"POST\", emptyAction),\n { jobId },\n );\n },\n\n async applyAgentJob(jobId: string): Promise<AgentJobSnapshot> {\n return parseJobSnapshot(\n await requestJson(getAgentJobEndpoint(jobId, \"apply\"), \"POST\", emptyAction),\n { jobId },\n );\n },\n\n async revertAgentJob(jobId: string): Promise<AgentJobSnapshot> {\n return parseJobSnapshot(\n await requestJson(getAgentJobEndpoint(jobId, \"revert\"), \"POST\", emptyAction),\n { jobId },\n );\n },\n\n dispose(): void {\n cancelPending();\n },\n });\n}\n","import {\n AGENT_CAPABILITY_STATES,\n AGENT_CHECK_STATUSES,\n AGENT_FILE_CHANGE_KINDS,\n AGENT_JOB_STATUSES,\n ERROR_CODES,\n type AgentCapabilitySnapshot,\n type AgentJobEvent,\n type AgentJobResultResponse,\n type AgentJobSnapshot,\n type AgentWorkspaceHealthSnapshot,\n type ErrorCode,\n} from \"@spotpatch/shared\";\n\n// Keep this browser-safe mirror aligned with the shared Zod schemas. Importing Zod\n// here would violate the runtime bundle boundary; the parity test covers both paths.\n\nconst ERROR_CODE_VALUES = new Set<string>(Object.values(ERROR_CODES));\nconst CAPABILITY_STATE_VALUES = new Set<string>(AGENT_CAPABILITY_STATES);\nconst CHECK_STATUS_VALUES = new Set<string>(AGENT_CHECK_STATUSES);\nconst FILE_CHANGE_KIND_VALUES = new Set<string>(AGENT_FILE_CHANGE_KINDS);\nconst JOB_STATUS_VALUES = new Set<string>(AGENT_JOB_STATUSES);\nconst PROFILE_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst JOB_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst ISO_TIMESTAMP_PATTERN = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?Z$/;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOnlyKeys(\n value: Readonly<Record<string, unknown>>,\n allowed: readonly string[],\n): boolean {\n return Object.keys(value).every((key) => allowed.includes(key));\n}\n\nfunction isBoundedString(value: unknown, maximum: number, minimum = 0): boolean {\n return (\n typeof value === \"string\" && value.length >= minimum && value.length <= maximum\n );\n}\n\nfunction isProfileId(value: unknown): boolean {\n return (\n isBoundedString(value, 64, 1) &&\n typeof value === \"string\" &&\n PROFILE_ID_PATTERN.test(value)\n );\n}\n\nfunction isJobId(value: unknown): value is string {\n return (\n isBoundedString(value, 128, 22) &&\n typeof value === \"string\" &&\n JOB_ID_PATTERN.test(value)\n );\n}\n\nfunction isIsoTimestamp(value: unknown): boolean {\n return (\n typeof value === \"string\" &&\n ISO_TIMESTAMP_PATTERN.test(value) &&\n Number.isFinite(Date.parse(value))\n );\n}\n\nfunction isNonnegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isPositiveInteger(value: unknown): boolean {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction isOptionalBoundedString(value: unknown, maximum: number): boolean {\n return value === undefined || isBoundedString(value, maximum);\n}\n\nexport function isAgentErrorCode(value: unknown): value is ErrorCode {\n return typeof value === \"string\" && ERROR_CODE_VALUES.has(value);\n}\n\nexport function isAgentCapabilitySnapshot(\n value: unknown,\n): value is AgentCapabilitySnapshot {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n \"providerProfileId\",\n \"providerLabel\",\n \"modelProfileId\",\n \"modelLabel\",\n \"protocol\",\n \"state\",\n \"authenticated\",\n \"modelAvailable\",\n \"toolCalling\",\n \"toolResultContinuation\",\n \"streaming\",\n \"checkedAt\",\n \"errorCode\",\n ])\n ) {\n return false;\n }\n\n return (\n isProfileId(value.providerProfileId) &&\n isBoundedString(value.providerLabel, 100) &&\n isProfileId(value.modelProfileId) &&\n isBoundedString(value.modelLabel, 100) &&\n (value.protocol === \"responses\" || value.protocol === \"chat-completions\") &&\n typeof value.state === \"string\" &&\n CAPABILITY_STATE_VALUES.has(value.state) &&\n typeof value.authenticated === \"boolean\" &&\n typeof value.modelAvailable === \"boolean\" &&\n typeof value.toolCalling === \"boolean\" &&\n typeof value.toolResultContinuation === \"boolean\" &&\n typeof value.streaming === \"boolean\" &&\n (value.checkedAt === undefined || isIsoTimestamp(value.checkedAt)) &&\n (value.errorCode === undefined || isAgentErrorCode(value.errorCode))\n );\n}\n\nexport function isAgentWorkspaceHealthSnapshot(\n value: unknown,\n): value is AgentWorkspaceHealthSnapshot {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n \"state\",\n \"checkedAt\",\n \"changes\",\n \"canIncludeLocalChanges\",\n \"errorCode\",\n ]) ||\n (value.state !== \"ready\" &&\n value.state !== \"consent-required\" &&\n value.state !== \"blocked\") ||\n !isIsoTimestamp(value.checkedAt) ||\n typeof value.canIncludeLocalChanges !== \"boolean\" ||\n (value.errorCode !== undefined && !isAgentErrorCode(value.errorCode)) ||\n !isRecord(value.changes) ||\n !hasOnlyKeys(value.changes, [\n \"staged\",\n \"unstaged\",\n \"untracked\",\n \"conflicted\",\n \"total\",\n ])\n ) {\n return false;\n }\n\n const changes = value.changes;\n const { staged, unstaged, untracked, conflicted, total } = changes;\n\n if (\n !isNonnegativeInteger(staged) ||\n !isNonnegativeInteger(unstaged) ||\n !isNonnegativeInteger(untracked) ||\n !isNonnegativeInteger(conflicted) ||\n !isNonnegativeInteger(total) ||\n total < staged ||\n total < unstaged ||\n total < untracked ||\n total < conflicted ||\n total > staged + unstaged + untracked\n ) {\n return false;\n }\n\n if (value.state === \"ready\") {\n return (\n total === 0 && !value.canIncludeLocalChanges && value.errorCode === undefined\n );\n }\n\n if (value.state === \"consent-required\") {\n return (\n total > 0 &&\n conflicted === 0 &&\n value.canIncludeLocalChanges &&\n value.errorCode === undefined\n );\n }\n\n return !value.canIncludeLocalChanges && value.errorCode !== undefined;\n}\n\nexport function isAgentJobSnapshot(value: unknown): value is AgentJobSnapshot {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n \"jobId\",\n \"status\",\n \"providerProfileId\",\n \"providerLabel\",\n \"modelProfileId\",\n \"modelLabel\",\n \"phaseMessage\",\n \"createdAt\",\n \"updatedAt\",\n \"canCancel\",\n \"canApply\",\n \"canRevert\",\n \"errorCode\",\n ])\n ) {\n return false;\n }\n\n return (\n isJobId(value.jobId) &&\n typeof value.status === \"string\" &&\n JOB_STATUS_VALUES.has(value.status) &&\n isProfileId(value.providerProfileId) &&\n isBoundedString(value.providerLabel, 100) &&\n isProfileId(value.modelProfileId) &&\n isBoundedString(value.modelLabel, 100) &&\n isBoundedString(value.phaseMessage, 1_024) &&\n isIsoTimestamp(value.createdAt) &&\n isIsoTimestamp(value.updatedAt) &&\n typeof value.canCancel === \"boolean\" &&\n typeof value.canApply === \"boolean\" &&\n typeof value.canRevert === \"boolean\" &&\n (value.errorCode === undefined || isAgentErrorCode(value.errorCode))\n );\n}\n\nfunction isAgentChangedFile(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\"relativePath\", \"kind\", \"additions\", \"deletions\"]) &&\n isBoundedString(value.relativePath, 1_024) &&\n typeof value.kind === \"string\" &&\n FILE_CHANGE_KIND_VALUES.has(value.kind) &&\n isNonnegativeInteger(value.additions) &&\n isNonnegativeInteger(value.deletions)\n );\n}\n\nfunction isAgentCheckResult(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\"checkId\", \"label\", \"status\", \"durationMs\", \"output\"]) &&\n isProfileId(value.checkId) &&\n isBoundedString(value.label, 100) &&\n typeof value.status === \"string\" &&\n CHECK_STATUS_VALUES.has(value.status) &&\n isNonnegativeInteger(value.durationMs) &&\n isBoundedString(value.output, 80_000)\n );\n}\n\nfunction isAgentJobResult(\n value: unknown,\n): value is NonNullable<AgentJobResultResponse[\"result\"]> {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\"jobId\", \"summary\", \"diff\", \"files\", \"checks\"]) &&\n isJobId(value.jobId) &&\n isBoundedString(value.summary, 80_000) &&\n isBoundedString(value.diff, 1_000_000) &&\n Array.isArray(value.files) &&\n value.files.length <= 100 &&\n value.files.every(isAgentChangedFile) &&\n Array.isArray(value.checks) &&\n value.checks.length <= 100 &&\n value.checks.every(isAgentCheckResult)\n );\n}\n\nexport function isAgentJobResultResponse(\n value: unknown,\n): value is AgentJobResultResponse {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\"snapshot\", \"result\"]) &&\n isAgentJobSnapshot(value.snapshot) &&\n (value.result === undefined ||\n (isAgentJobResult(value.result) && value.result.jobId === value.snapshot.jobId))\n );\n}\n\nfunction isAgentEventBase(value: unknown): value is Readonly<{\n data: Readonly<Record<string, unknown>>;\n jobId: string;\n schemaVersion: 2;\n sequence: number;\n status: AgentJobSnapshot[\"status\"];\n timestamp: string;\n type: string;\n}> {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\n \"schemaVersion\",\n \"sequence\",\n \"jobId\",\n \"status\",\n \"timestamp\",\n \"type\",\n \"data\",\n ]) &&\n value.schemaVersion === 2 &&\n isPositiveInteger(value.sequence) &&\n isJobId(value.jobId) &&\n typeof value.status === \"string\" &&\n JOB_STATUS_VALUES.has(value.status) &&\n isIsoTimestamp(value.timestamp) &&\n typeof value.type === \"string\" &&\n isRecord(value.data)\n );\n}\n\nexport function isAgentJobEvent(value: unknown): value is AgentJobEvent {\n if (!isAgentEventBase(value)) {\n return false;\n }\n\n const data = value.data;\n\n switch (value.type) {\n case \"snapshot\":\n return (\n hasOnlyKeys(data, [\"snapshot\"]) &&\n isAgentJobSnapshot(data.snapshot) &&\n data.snapshot.jobId === value.jobId &&\n data.snapshot.status === value.status\n );\n case \"phase\":\n return hasOnlyKeys(data, [\"message\"]) && isBoundedString(data.message, 1_024);\n case \"tool\":\n return (\n hasOnlyKeys(data, [\n \"turn\",\n \"toolCallId\",\n \"toolName\",\n \"state\",\n \"relativePath\",\n \"checkLabel\",\n ]) &&\n isPositiveInteger(data.turn) &&\n isBoundedString(data.toolCallId, 256) &&\n isBoundedString(data.toolName, 100) &&\n (data.state === \"started\" ||\n data.state === \"succeeded\" ||\n data.state === \"failed\") &&\n isOptionalBoundedString(data.relativePath, 1_024) &&\n isOptionalBoundedString(data.checkLabel, 100)\n );\n case \"check\":\n return hasOnlyKeys(data, [\"result\"]) && isAgentCheckResult(data.result);\n case \"result-ready\":\n return hasOnlyKeys(data, [\"hasResult\"]) && data.hasResult === true;\n case \"error\":\n return (\n hasOnlyKeys(data, [\"code\", \"message\"]) &&\n isAgentErrorCode(data.code) &&\n isBoundedString(data.message, 1_024)\n );\n default:\n return false;\n }\n}\n","import { isSensitiveName, redactSensitiveText, sanitizeUrl } from \"@spotpatch/shared\";\n\nconst MAX_ATTRIBUTE_CHARACTERS = 500;\nconst MAX_SVG_PATH_CHARACTERS = 256;\n\nfunction truncate(value: string, maxCharacters: number): string {\n return value.length <= maxCharacters\n ? value\n : `${value.slice(0, Math.max(0, maxCharacters - 1))}…`;\n}\n\nexport function isSensitiveAttributeName(name: string): boolean {\n return isSensitiveName(name);\n}\n\nexport { redactSensitiveText, sanitizeUrl };\n\nexport function sanitizeAttributeValue(\n name: string,\n value: string,\n baseUrl: string,\n): string | undefined {\n if (isSensitiveAttributeName(name)) {\n return undefined;\n }\n\n if (name === \"href\" || name === \"src\") {\n return sanitizeUrl(value, baseUrl);\n }\n\n if (name === \"d\" && value.length > MAX_SVG_PATH_CHARACTERS) {\n return `${value.slice(0, MAX_SVG_PATH_CHARACTERS)}…`;\n }\n\n return truncate(redactSensitiveText(value), MAX_ATTRIBUTE_CHARACTERS);\n}\n\nexport function sanitizeCssText(value: string): string {\n return redactSensitiveText(value);\n}\n","export const COMPUTED_STYLE_PROPERTIES = Object.freeze([\n \"display\",\n \"position\",\n \"inset\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"width\",\n \"height\",\n \"min-width\",\n \"min-height\",\n \"max-width\",\n \"max-height\",\n \"margin\",\n \"padding\",\n \"box-sizing\",\n \"overflow\",\n \"overflow-x\",\n \"overflow-y\",\n \"flex\",\n \"flex-direction\",\n \"flex-wrap\",\n \"align-items\",\n \"align-content\",\n \"justify-content\",\n \"gap\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"font-family\",\n \"font-size\",\n \"font-weight\",\n \"line-height\",\n \"text-align\",\n \"white-space\",\n \"color\",\n \"background-color\",\n \"border\",\n \"border-radius\",\n \"opacity\",\n \"visibility\",\n \"z-index\",\n \"transform\",\n] as const);\n","import type { MatchedStyleRule, StyleContext } from \"@spotpatch/shared\";\n\nimport { sanitizeCssText, sanitizeUrl } from \"../security/content-sanitizer.js\";\nimport { COMPUTED_STYLE_PROPERTIES } from \"./computed-style-properties.js\";\n\nexport const CSS_COLLECTION_WARNINGS = Object.freeze({\n cascade: \"CSS shorthand and longhand cascade resolution is not available in v1.\",\n cssInJs:\n \"Runtime CSS-in-JS rules may not include original TypeScript source locations.\",\n inaccessibleStylesheet:\n \"A stylesheet could not be inspected because browser security denied access.\",\n selector: \"A stylesheet selector could not be evaluated and was skipped.\",\n state:\n \"Dynamic pseudo-class and pseudo-element rules may be unavailable in the current state.\",\n});\n\ninterface StyleRuleLike extends CSSRule {\n readonly selectorText: string;\n readonly style: CSSStyleDeclaration;\n}\n\ninterface GroupingRuleLike extends CSSRule {\n readonly conditionText?: string;\n readonly cssRules: CSSRuleList;\n}\n\nexport interface CollectStyleContextOptions {\n readonly document: Document;\n readonly element: Element;\n readonly getComputedStyle?: (element: Element) => CSSStyleDeclaration;\n readonly maxCharacters: number;\n readonly readCssRules?: (sheet: CSSStyleSheet) => CSSRuleList;\n}\n\nfunction isStyleRule(rule: CSSRule): rule is StyleRuleLike {\n return \"selectorText\" in rule && \"style\" in rule;\n}\n\nfunction isGroupingRule(rule: CSSRule): rule is GroupingRuleLike {\n return \"cssRules\" in rule;\n}\n\nfunction groupingCondition(rule: GroupingRuleLike): string | undefined {\n if (typeof rule.conditionText === \"string\" && rule.conditionText.length > 0) {\n return rule.conditionText;\n }\n\n const openingBrace = rule.cssText.indexOf(\"{\");\n const prefix = openingBrace < 0 ? \"\" : rule.cssText.slice(0, openingBrace).trim();\n return prefix.length === 0 ? undefined : prefix;\n}\n\nfunction contextCharacterCount(\n classNames: readonly string[],\n inlineStyle: string | undefined,\n rules: readonly MatchedStyleRule[],\n computed: Readonly<Record<string, string>>,\n warnings: readonly string[],\n): number {\n return (\n classNames.join(\" \").length +\n (inlineStyle?.length ?? 0) +\n rules.reduce(\n (total, rule) =>\n total +\n rule.selector.length +\n rule.declarations.length +\n (rule.source?.length ?? 0) +\n (rule.media?.length ?? 0),\n 0,\n ) +\n Object.entries(computed).reduce(\n (total, [name, value]) => total + name.length + value.length,\n 0,\n ) +\n warnings.join(\"\\n\").length\n );\n}\n\nfunction stylesheetSource(sheet: CSSStyleSheet, baseUrl: string): string | undefined {\n return sheet.href === null ? undefined : sanitizeUrl(sheet.href, baseUrl);\n}\n\nfunction collectMatchedRules(\n element: Element,\n rules: CSSRuleList,\n source: string | undefined,\n inheritedConditions: readonly string[],\n output: MatchedStyleRule[],\n warnings: Set<string>,\n): void {\n for (const rule of rules) {\n if (isStyleRule(rule)) {\n let matches = false;\n\n try {\n matches = element.matches(rule.selectorText);\n } catch {\n warnings.add(CSS_COLLECTION_WARNINGS.selector);\n continue;\n }\n\n if (matches) {\n output.push(\n Object.freeze({\n selector: sanitizeCssText(rule.selectorText),\n declarations: sanitizeCssText(rule.style.cssText),\n ...(source === undefined ? {} : { source }),\n ...(inheritedConditions.length === 0\n ? {}\n : { media: inheritedConditions.join(\" and \") }),\n }),\n );\n }\n\n continue;\n }\n\n if (isGroupingRule(rule)) {\n const condition = groupingCondition(rule);\n collectMatchedRules(\n element,\n rule.cssRules,\n source,\n condition === undefined\n ? inheritedConditions\n : [...inheritedConditions, condition],\n output,\n warnings,\n );\n }\n }\n}\n\nfunction collectComputedStyle(\n element: Element,\n getComputedStyle: ((element: Element) => CSSStyleDeclaration) | undefined,\n): Record<string, string> {\n if (getComputedStyle === undefined) {\n return {};\n }\n\n const declaration = getComputedStyle(element);\n const computed: Record<string, string> = {};\n\n for (const property of COMPUTED_STYLE_PROPERTIES) {\n const value = sanitizeCssText(declaration.getPropertyValue(property).trim());\n\n if (value.length > 0) {\n computed[property] = value;\n }\n }\n\n return computed;\n}\n\nexport function collectStyleContext(options: CollectStyleContextOptions): StyleContext {\n const warnings = new Set<string>([\n CSS_COLLECTION_WARNINGS.state,\n CSS_COLLECTION_WARNINGS.cssInJs,\n CSS_COLLECTION_WARNINGS.cascade,\n ]);\n const matchedRules: MatchedStyleRule[] = [];\n const readCssRules =\n options.readCssRules ?? ((sheet: CSSStyleSheet) => sheet.cssRules);\n\n for (const sheet of options.document.styleSheets) {\n let rules: CSSRuleList;\n\n try {\n rules = readCssRules(sheet);\n } catch {\n warnings.add(CSS_COLLECTION_WARNINGS.inaccessibleStylesheet);\n continue;\n }\n\n collectMatchedRules(\n options.element,\n rules,\n stylesheetSource(sheet, options.document.baseURI),\n [],\n matchedRules,\n warnings,\n );\n }\n\n const classNames = Array.from(options.element.classList);\n const inlineValue = options.element.getAttribute(\"style\");\n const inlineStyle = inlineValue === null ? undefined : sanitizeCssText(inlineValue);\n const getComputedStyle =\n options.getComputedStyle ??\n options.document.defaultView?.getComputedStyle.bind(options.document.defaultView);\n const computedEntries = Object.entries(\n collectComputedStyle(options.element, getComputedStyle),\n );\n const warningList = Array.from(warnings);\n\n while (\n contextCharacterCount(\n classNames,\n inlineStyle,\n matchedRules,\n Object.fromEntries(computedEntries),\n warningList,\n ) > options.maxCharacters\n ) {\n if (computedEntries.length > 0) {\n computedEntries.pop();\n continue;\n }\n\n if (matchedRules.length > 1) {\n matchedRules.shift();\n continue;\n }\n\n break;\n }\n\n return Object.freeze({\n classNames: Object.freeze(classNames),\n ...(inlineStyle === undefined ? {} : { inlineStyle }),\n matchedRules: Object.freeze(matchedRules),\n computed: Object.freeze(Object.fromEntries(computedEntries)),\n warnings: Object.freeze(warningList),\n });\n}\n","import type { ElementContext } from \"@spotpatch/shared\";\n\nimport {\n redactSensitiveText,\n sanitizeAttributeValue,\n} from \"../security/content-sanitizer.js\";\n\nexport const DOM_COLLECTION_LIMITS = Object.freeze({\n maxDepth: 3,\n maxNodes: 30,\n maxParentDepth: 2,\n maxTextCharacters: 200,\n});\n\nconst SAFE_ATTRIBUTE_NAMES = new Set([\n \"alt\",\n \"autocomplete\",\n \"checked\",\n \"class\",\n \"colspan\",\n \"contenteditable\",\n \"d\",\n \"disabled\",\n \"download\",\n \"draggable\",\n \"for\",\n \"height\",\n \"hidden\",\n \"href\",\n \"id\",\n \"max\",\n \"maxlength\",\n \"min\",\n \"minlength\",\n \"multiple\",\n \"name\",\n \"open\",\n \"pattern\",\n \"placeholder\",\n \"readonly\",\n \"rel\",\n \"required\",\n \"role\",\n \"rowspan\",\n \"selected\",\n \"src\",\n \"step\",\n \"style\",\n \"tabindex\",\n \"target\",\n \"title\",\n \"type\",\n \"width\",\n]);\n\nconst VOID_ELEMENT_NAMES = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\ninterface SerializationState {\n nodeCount: number;\n truncated: boolean;\n}\n\nexport interface CollectElementContextOptions {\n readonly element: Element;\n readonly maxCharacters: number;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction isPreservedAttribute(name: string): boolean {\n return (\n SAFE_ATTRIBUTE_NAMES.has(name) || name.startsWith(\"aria-\") || name === \"data-testid\"\n );\n}\n\nfunction openingTag(element: Element): string {\n const tagName = element.tagName.toLowerCase();\n const attributes: string[] = [];\n const baseUrl = element.ownerDocument.baseURI;\n\n for (const attribute of element.attributes) {\n const name = attribute.name.toLowerCase();\n\n if (!isPreservedAttribute(name)) {\n continue;\n }\n\n const sanitized = sanitizeAttributeValue(name, attribute.value, baseUrl);\n\n if (sanitized !== undefined) {\n attributes.push(`${name}=\"${escapeHtml(sanitized)}\"`);\n }\n }\n\n return `<${tagName}${attributes.length === 0 ? \"\" : ` ${attributes.join(\" \")}`}>`;\n}\n\nfunction normalizedText(value: string): string {\n return redactSensitiveText(value).replaceAll(/\\s+/gu, \" \").trim();\n}\n\nfunction serializeElement(\n element: Element,\n depth: number,\n state: SerializationState,\n lines: string[],\n): void {\n if (state.nodeCount >= DOM_COLLECTION_LIMITS.maxNodes) {\n state.truncated = true;\n return;\n }\n\n state.nodeCount += 1;\n const indent = \" \".repeat(depth);\n const tagName = element.tagName.toLowerCase();\n lines.push(`${indent}${openingTag(element)}`);\n\n if (VOID_ELEMENT_NAMES.has(tagName)) {\n return;\n }\n\n for (const child of element.childNodes) {\n if (state.nodeCount >= DOM_COLLECTION_LIMITS.maxNodes) {\n state.truncated = true;\n break;\n }\n\n if (child.nodeType === 3) {\n const text = normalizedText(child.textContent ?? \"\");\n\n if (text.length > 0) {\n state.nodeCount += 1;\n const truncated =\n text.length <= DOM_COLLECTION_LIMITS.maxTextCharacters\n ? text\n : `${text.slice(0, DOM_COLLECTION_LIMITS.maxTextCharacters)}…`;\n lines.push(`${\" \".repeat(depth + 1)}${escapeHtml(truncated)}`);\n }\n\n continue;\n }\n\n if (child.nodeType !== 1) {\n continue;\n }\n\n if (depth >= DOM_COLLECTION_LIMITS.maxDepth) {\n state.truncated = true;\n continue;\n }\n\n serializeElement(child as Element, depth + 1, state, lines);\n }\n\n if (state.truncated && depth === 0) {\n lines.push(\" …\");\n }\n\n lines.push(`${indent}</${tagName}>`);\n}\n\nfunction parentContext(element: Element): readonly string[] {\n const parents: string[] = [];\n let parent = element.parentElement;\n\n while (parent !== null && parents.length < DOM_COLLECTION_LIMITS.maxParentDepth) {\n parents.push(openingTag(parent));\n parent = parent.parentElement;\n }\n\n return parents;\n}\n\nfunction truncateContext(value: string, maxCharacters: number): string {\n if (value.length <= maxCharacters) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxCharacters - 1)).trimEnd()}…`;\n}\n\nfunction escapeCssIdentifier(value: string): string {\n return Array.from(value)\n .map((character) =>\n /[a-z\\d_-]/iu.test(character)\n ? character\n : `\\\\${character.charCodeAt(0).toString(16)} `,\n )\n .join(\"\");\n}\n\nfunction escapeCssAttribute(value: string): string {\n return value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n}\n\nfunction selectorSegment(element: Element): string {\n const tagName = element.tagName.toLowerCase();\n\n if (element.id.length > 0) {\n return `${tagName}#${escapeCssIdentifier(element.id)}`;\n }\n\n const testId = element.getAttribute(\"data-testid\");\n\n if (testId !== null && testId.length > 0) {\n return `${tagName}[data-testid=\"${escapeCssAttribute(testId)}\"]`;\n }\n\n const classes = Array.from(element.classList)\n .slice(0, 2)\n .map((name) => `.${escapeCssIdentifier(name)}`)\n .join(\"\");\n const sameTagSiblings =\n element.parentElement === null\n ? []\n : Array.from(element.parentElement.children).filter(\n (sibling) => sibling.tagName === element.tagName,\n );\n const position = sameTagSiblings.indexOf(element);\n const nth =\n sameTagSiblings.length > 1 && position >= 0\n ? `:nth-of-type(${String(position + 1)})`\n : \"\";\n\n return `${tagName}${classes}${nth}`;\n}\n\nfunction createSelector(element: Element): string {\n const segments: string[] = [];\n let current: Element | null = element;\n\n while (current !== null && segments.length < 5) {\n const segment = selectorSegment(current);\n segments.unshift(segment);\n\n if (current.id.length > 0 || current.hasAttribute(\"data-testid\")) {\n break;\n }\n\n current = current.parentElement;\n }\n\n return segments.join(\" > \");\n}\n\nexport function collectElementContext(\n options: CollectElementContextOptions,\n): ElementContext {\n const lines = [\"<!-- Selected element -->\"];\n const state: SerializationState = { nodeCount: 0, truncated: false };\n serializeElement(options.element, 0, state, lines);\n const parents = parentContext(options.element);\n\n if (parents.length > 0) {\n lines.push(\"<!-- Parent context: nearest first -->\", ...parents);\n }\n\n const text = normalizedText(options.element.textContent);\n const rect = options.element.getBoundingClientRect();\n const role = options.element.getAttribute(\"role\");\n\n return Object.freeze({\n tagName: options.element.tagName.toLowerCase(),\n selector: createSelector(options.element),\n sanitizedHtml: truncateContext(lines.join(\"\\n\"), options.maxCharacters),\n ...(text.length === 0\n ? {}\n : {\n textPreview:\n text.length <= DOM_COLLECTION_LIMITS.maxTextCharacters\n ? text\n : `${text.slice(0, DOM_COLLECTION_LIMITS.maxTextCharacters)}…`,\n }),\n ...(role === null ? {} : { role }),\n rect: Object.freeze({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n }),\n });\n}\n","function isApplePlatform(platform: string): boolean {\n return /Mac|iPhone|iPad|iPod/i.test(platform);\n}\n\nfunction normalizedKey(key: string): string {\n return key.toLowerCase();\n}\n\nexport function isTextEntryTarget(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) {\n return false;\n }\n\n return (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n target.closest(\"[contenteditable]:not([contenteditable='false'])\") !== null\n );\n}\n\nexport function matchesShortcut(\n event: KeyboardEvent,\n shortcut: string,\n platform: string,\n): boolean {\n const tokens = shortcut\n .split(\"+\")\n .map((token) => token.trim().toLowerCase())\n .filter((token) => token.length > 0);\n const keyToken = tokens.find(\n (token) =>\n token !== \"mod\" &&\n token !== \"meta\" &&\n token !== \"ctrl\" &&\n token !== \"control\" &&\n token !== \"alt\" &&\n token !== \"option\" &&\n token !== \"shift\",\n );\n\n if (keyToken === undefined || normalizedKey(event.key) !== keyToken) {\n return false;\n }\n\n const requiresMod = tokens.includes(\"mod\");\n const requiresMeta =\n tokens.includes(\"meta\") || (requiresMod && isApplePlatform(platform));\n const requiresControl =\n tokens.includes(\"ctrl\") ||\n tokens.includes(\"control\") ||\n (requiresMod && !isApplePlatform(platform));\n const requiresAlt = tokens.includes(\"alt\") || tokens.includes(\"option\");\n const requiresShift = tokens.includes(\"shift\");\n\n return (\n event.metaKey === requiresMeta &&\n event.ctrlKey === requiresControl &&\n event.altKey === requiresAlt &&\n event.shiftKey === requiresShift\n );\n}\n","export interface ElementRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\nfunction toElementRect(rect: DOMRect): ElementRect {\n return Object.freeze({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n });\n}\n\nfunction unionRects(rects: readonly DOMRect[]): ElementRect | undefined {\n const visibleRects = rects.filter((rect) => rect.width > 0 && rect.height > 0);\n const first = visibleRects[0];\n\n if (first === undefined) {\n return undefined;\n }\n\n let left = first.left;\n let top = first.top;\n let right = first.right;\n let bottom = first.bottom;\n\n for (const rect of visibleRects.slice(1)) {\n left = Math.min(left, rect.left);\n top = Math.min(top, rect.top);\n right = Math.max(right, rect.right);\n bottom = Math.max(bottom, rect.bottom);\n }\n\n return Object.freeze({\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n });\n}\n\nfunction measureElementRect(element: Element, display: string): ElementRect {\n if (display.startsWith(\"inline\")) {\n const lineBoxRect = unionRects(Array.from(element.getClientRects()));\n\n if (lineBoxRect !== undefined) {\n return lineBoxRect;\n }\n }\n\n return toElementRect(element.getBoundingClientRect());\n}\n\nexport function getElementRect(element: Element, view: Window): ElementRect {\n return measureElementRect(element, view.getComputedStyle(element).display);\n}\n\nexport function getVisibleElementRect(\n element: Element,\n view: Window,\n): ElementRect | undefined {\n const style = view.getComputedStyle(element);\n\n if (style.display === \"none\" || style.visibility === \"hidden\") {\n return undefined;\n }\n\n const rect = measureElementRect(element, style.display);\n return rect.width > 0 && rect.height > 0 ? rect : undefined;\n}\n","export const UI_MARKER_ATTRIBUTE = \"data-spotpatch-ui\" as const;\n\nexport const UI_Z_INDEX = Object.freeze({\n highlight: 2_147_483_646,\n controls: 2_147_483_647,\n});\n","import { UI_MARKER_ATTRIBUTE } from \"../ui/ui-constants.js\";\nimport { getVisibleElementRect } from \"./geometry.js\";\n\nfunction isInsideSpotPatchUI(element: Element): boolean {\n if (element.closest(`[${UI_MARKER_ATTRIBUTE}]`) !== null) {\n return true;\n }\n\n const root = element.getRootNode();\n return root instanceof ShadowRoot && root.host.hasAttribute(UI_MARKER_ATTRIBUTE);\n}\n\nfunction hasVisibleArea(element: Element, view: Window): boolean {\n return getVisibleElementRect(element, view) !== undefined;\n}\n\nfunction isDocumentRoot(element: Element): boolean {\n return element.tagName === \"HTML\" || element.tagName === \"BODY\";\n}\n\nexport function pickElementAt(\n document: Document,\n view: Window,\n clientX: number,\n clientY: number,\n): Element | undefined {\n const visibleCandidates = document\n .elementsFromPoint(clientX, clientY)\n .filter(\n (element) => !isInsideSpotPatchUI(element) && hasVisibleArea(element, view),\n );\n\n return (\n visibleCandidates.find((element) => !isDocumentRoot(element)) ??\n visibleCandidates[0]\n );\n}\n\nexport function isSpotPatchUIEventTarget(target: EventTarget | null): boolean {\n return target instanceof Element && isInsideSpotPatchUI(target);\n}\n","import type {\n MatchedStyleRule,\n SpotAnnotation,\n SpotPatchLocale,\n SpotTargetContext,\n} from \"@spotpatch/shared\";\n\nimport {\n redactSensitiveText,\n sanitizeCssText,\n sanitizeUrl,\n} from \"../security/content-sanitizer.js\";\n\ninterface PromptMessages {\n readonly adapter: string;\n readonly boundary: string;\n readonly code: string;\n readonly component: string;\n readonly computedStyles: string;\n readonly confidence: string;\n readonly devicePixelRatio: string;\n readonly element: string;\n readonly file: string;\n readonly modificationConstraint: string;\n readonly modificationRequirements: string;\n readonly origin: string;\n readonly pageEnvironment: string;\n readonly pathname: string;\n readonly reactContext: string;\n readonly reactVersion: string;\n readonly requestedChange: string;\n readonly selectedTargets: (count: number) => string;\n readonly source: string;\n readonly stack: string;\n readonly styles: string;\n readonly supported: string;\n readonly target: (index: number) => string;\n readonly title: string;\n readonly unavailable: string;\n readonly unsupported: string;\n readonly url: string;\n readonly viewport: string;\n readonly warnings: string;\n readonly none: string;\n}\n\nconst PROMPT_MESSAGES = Object.freeze({\n \"en-US\": Object.freeze({\n adapter: \"Adapter\",\n boundary: \"Boundary\",\n code: \"Nearby code\",\n component: \"Component\",\n computedStyles: \"Key computed styles\",\n confidence: \"Confidence\",\n devicePixelRatio: \"Device pixel ratio\",\n element: \"Selected element\",\n file: \"File\",\n modificationConstraint:\n \"Determine the root cause first, then implement every target instruction as one consistent, minimum-scope change. Do not modify unrelated components. If context is insufficient, state exactly what additional information is required.\",\n modificationRequirements: \"Change requirements\",\n origin: \"Origin\",\n pageEnvironment: \"Page environment\",\n pathname: \"Pathname\",\n reactContext: \"React context\",\n reactVersion: \"React\",\n requestedChange: \"Requested change\",\n selectedTargets: (count: number) => `Selected targets (${String(count)})`,\n source: \"Source\",\n stack: \"Stack\",\n styles: \"Relevant styles\",\n supported: \"supported\",\n target: (index: number) => `Target ${String(index)}`,\n title: \"Title\",\n unavailable: \"Unavailable\",\n unsupported: \"unsupported\",\n url: \"URL\",\n viewport: \"Viewport\",\n warnings: \"Collection warnings\",\n none: \"None\",\n }),\n \"zh-CN\": Object.freeze({\n adapter: \"适配器\",\n boundary: \"代码边界\",\n code: \"附近代码\",\n component: \"组件\",\n computedStyles: \"关键计算样式\",\n confidence: \"置信度\",\n devicePixelRatio: \"设备像素比\",\n element: \"选中元素\",\n file: \"文件\",\n modificationConstraint:\n \"请先判断根因,再把每个目标各自的修改说明作为一个原子任务,完成一致且最小范围的修改。不要合并、忽略或扩大目标说明,不要改动无关组件;如果上下文不足,请明确说明需要哪些信息。\",\n modificationRequirements: \"修改要求\",\n origin: \"定位来源\",\n pageEnvironment: \"页面环境\",\n pathname: \"路径\",\n reactContext: \"React 上下文\",\n reactVersion: \"React\",\n requestedChange: \"修改说明\",\n selectedTargets: (count: number) => `已选目标(${String(count)})`,\n source: \"源码定位\",\n stack: \"组件栈\",\n styles: \"相关样式\",\n supported: \"支持\",\n target: (index: number) => `目标 ${String(index)}`,\n title: \"标题\",\n unavailable: \"不可用\",\n unsupported: \"不支持\",\n url: \"URL\",\n viewport: \"视口\",\n warnings: \"采集警告\",\n none: \"无\",\n }),\n} satisfies Readonly<Record<SpotPatchLocale, PromptMessages>>);\n\ninterface TargetDraft {\n codeLines: string[];\n computedEntries: [string, string][];\n dom: string;\n instruction: string;\n matchedRules: MatchedStyleRule[];\n reactStack: string[];\n warnings: string[];\n}\n\ninterface PromptDraft {\n pageTitle: string;\n targets: TargetDraft[];\n}\n\nexport interface PromptComposer {\n readonly compose: (annotation: SpotAnnotation) => string;\n}\n\nexport interface CreatePromptComposerOptions {\n readonly maxCharacters: number;\n}\n\nfunction longestBacktickRun(value: string): number {\n return Math.max(0, ...Array.from(value.matchAll(/`+/gu), (match) => match[0].length));\n}\n\nfunction fenced(language: string, value: string): string {\n const fence = \"`\".repeat(Math.max(3, longestBacktickRun(value) + 1));\n return `${fence}${language}\\n${value}\\n${fence}`;\n}\n\nfunction sourceLocation(target: SpotTargetContext, messages: PromptMessages): string {\n const path = target.code?.relativePath ?? target.source.relativePath;\n const line = target.source.line;\n const column = target.source.column;\n\n if (path === undefined) {\n return messages.unavailable;\n }\n\n return `${redactSensitiveText(path)}${line === undefined ? \"\" : `:${String(line)}`}${column === undefined ? \"\" : `:${String(column)}`}`;\n}\n\nfunction openingTag(sanitizedHtml: string, unavailable: string): string {\n return (\n sanitizedHtml\n .split(\"\\n\")\n .find((line) => /^\\s*<[a-z][^>]*>/iu.test(line))\n ?.trim() ?? unavailable\n );\n}\n\nfunction renderRule(rule: MatchedStyleRule): string {\n const metadata = [\n rule.source === undefined\n ? undefined\n : `/* source: ${sanitizeCssText(rule.source)} */`,\n rule.media === undefined\n ? undefined\n : `/* condition: ${sanitizeCssText(rule.media)} */`,\n ].filter((line): line is string => line !== undefined);\n const body = `${sanitizeCssText(rule.selector)} {\\n ${sanitizeCssText(rule.declarations)}\\n}`;\n return [...metadata, body].join(\"\\n\");\n}\n\nfunction renderStyles(\n target: SpotTargetContext,\n rules: readonly MatchedStyleRule[],\n messages: PromptMessages,\n): string {\n const metadata = [\n target.styles.classNames.length === 0\n ? undefined\n : `/* classes: ${target.styles.classNames.map(sanitizeCssText).join(\" \")} */`,\n target.styles.inlineStyle === undefined\n ? undefined\n : `/* inline: ${sanitizeCssText(target.styles.inlineStyle)} */`,\n ].filter((line): line is string => line !== undefined);\n const blocks = [...metadata, ...rules.map(renderRule)];\n return blocks.length === 0\n ? messages.unavailable\n : fenced(\"css\", blocks.join(\"\\n\\n\"));\n}\n\nfunction renderComputed(\n entries: readonly [string, string][],\n messages: PromptMessages,\n): string {\n return entries.length === 0\n ? messages.unavailable\n : fenced(\n \"css\",\n entries\n .map(\n ([name, value]) => `${sanitizeCssText(name)}: ${sanitizeCssText(value)};`,\n )\n .join(\"\\n\"),\n );\n}\n\nfunction renderTarget(\n target: SpotTargetContext,\n draft: TargetDraft,\n index: number,\n messages: PromptMessages,\n): string {\n const reactLines = [\n `- ${messages.adapter}: ${target.react.supported ? messages.supported : messages.unsupported}`,\n ...(target.react.version === undefined\n ? []\n : [`- ${messages.reactVersion}: ${redactSensitiveText(target.react.version)}`]),\n ...(target.react.componentName === undefined\n ? []\n : [\n `- ${messages.component}: ${redactSensitiveText(target.react.componentName)}`,\n ]),\n ...(draft.reactStack.length === 0\n ? []\n : [\n `- ${messages.stack}: ${draft.reactStack.map(redactSensitiveText).join(\" > \")}`,\n ]),\n ];\n const code =\n target.code === undefined || draft.codeLines.length === 0\n ? messages.unavailable\n : `- ${messages.boundary}: ${target.code.boundary}\\n\\n${fenced(\n target.code.language,\n redactSensitiveText(draft.codeLines.join(\"\\n\")),\n )}`;\n\n return [\n `### ${messages.target(index + 1)}`,\n `#### ${messages.requestedChange}`,\n draft.instruction,\n ...(target.page === undefined\n ? []\n : [\n `#### ${messages.pageEnvironment}`,\n `- ${messages.url}: <${sanitizeUrl(target.page.url, target.page.url)}>\\n- ${messages.pathname}: ${redactSensitiveText(target.page.pathname)}\\n- ${messages.title}: ${redactSensitiveText(target.page.title) || messages.unavailable}`,\n ]),\n `#### ${messages.reactContext}`,\n reactLines.join(\"\\n\"),\n `#### ${messages.source}`,\n `- ${messages.file}: ${sourceLocation(target, messages)}\\n- ${messages.origin}: ${target.source.origin}\\n- ${messages.confidence}: ${target.source.confidence}`,\n `#### ${messages.element}`,\n fenced(\"html\", redactSensitiveText(draft.dom)),\n `#### ${messages.styles}`,\n renderStyles(target, draft.matchedRules, messages),\n `#### ${messages.computedStyles}`,\n renderComputed(draft.computedEntries, messages),\n `#### ${messages.code}`,\n code,\n `#### ${messages.warnings}`,\n draft.warnings.length === 0\n ? `- ${messages.none}`\n : draft.warnings.map((warning) => `- ${redactSensitiveText(warning)}`).join(\"\\n\"),\n ].join(\"\\n\\n\");\n}\n\nfunction renderPrompt(annotation: SpotAnnotation, draft: PromptDraft): string {\n const pageUrl = sanitizeUrl(annotation.page.url, annotation.page.url);\n const messages = PROMPT_MESSAGES[annotation.locale];\n\n return [\n `## ${messages.pageEnvironment}`,\n `- ${messages.url}: <${pageUrl}>\\n- ${messages.pathname}: ${redactSensitiveText(annotation.page.pathname)}\\n- ${messages.title}: ${draft.pageTitle.length === 0 ? messages.unavailable : draft.pageTitle}\\n- ${messages.viewport}: ${String(annotation.page.viewportWidth)} × ${String(annotation.page.viewportHeight)}\\n- ${messages.devicePixelRatio}: ${String(annotation.page.devicePixelRatio)}`,\n `## ${messages.selectedTargets(annotation.targets.length)}`,\n annotation.targets\n .map((target, index) => {\n const targetDraft = draft.targets[index];\n\n if (targetDraft === undefined) {\n throw new RangeError(\"Prompt target draft is missing.\");\n }\n\n return renderTarget(target, targetDraft, index, messages);\n })\n .join(\"\\n\\n\"),\n `## ${messages.modificationRequirements}`,\n messages.modificationConstraint,\n ].join(\"\\n\\n\");\n}\n\nfunction shrinkCode(target: SpotTargetContext, draft: TargetDraft): boolean {\n if (draft.codeLines.length === 0 || target.code === undefined) {\n return false;\n }\n\n if (draft.codeLines.length === 1) {\n const line = draft.codeLines[0] ?? \"\";\n\n if (line.length <= 120) {\n draft.codeLines = [];\n } else {\n draft.codeLines = [`${line.slice(0, 119)}…`];\n }\n\n return true;\n }\n\n const selectedLine = target.source.line ?? target.code.startLine;\n const firstDistance = Math.abs(target.code.startLine - selectedLine);\n const lastLine = target.code.startLine + draft.codeLines.length - 1;\n const lastDistance = Math.abs(lastLine - selectedLine);\n\n if (lastDistance >= firstDistance) {\n draft.codeLines.pop();\n } else {\n draft.codeLines.shift();\n }\n\n return true;\n}\n\nfunction createTargetDraft(target: SpotTargetContext): TargetDraft {\n return {\n instruction: redactSensitiveText(target.instruction.trim()),\n reactStack: [...target.react.componentStack],\n dom: target.element.sanitizedHtml,\n matchedRules: [...target.styles.matchedRules],\n computedEntries: Object.entries(target.styles.computed),\n codeLines: target.code?.excerpt.split(/\\r?\\n/u) ?? [],\n warnings: Array.from(new Set([...target.styles.warnings, ...target.warnings])),\n };\n}\n\nfunction createDraft(annotation: SpotAnnotation): PromptDraft {\n return {\n pageTitle: redactSensitiveText(annotation.page.title),\n targets: annotation.targets.map(createTargetDraft),\n };\n}\n\nfunction shrinkTargetsFairly(\n annotation: SpotAnnotation,\n draft: PromptDraft,\n cursor: number,\n): number | undefined {\n const messages = PROMPT_MESSAGES[annotation.locale];\n const operations: readonly ((\n target: SpotTargetContext,\n value: TargetDraft,\n ) => boolean)[] = [\n (_target, value) => value.computedEntries.pop() !== undefined,\n (_target, value) => value.reactStack.pop() !== undefined,\n (_target, value) => {\n const selectedOpeningTag = openingTag(value.dom, messages.unavailable);\n\n if (value.dom === selectedOpeningTag) {\n return false;\n }\n\n value.dom = selectedOpeningTag;\n return true;\n },\n (_target, value) => value.matchedRules.shift() !== undefined,\n shrinkCode,\n (_target, value) => value.warnings.pop() !== undefined,\n ];\n\n for (const operation of operations) {\n for (let offset = 0; offset < annotation.targets.length; offset += 1) {\n const index = (cursor + offset) % annotation.targets.length;\n const target = annotation.targets[index];\n const targetDraft = draft.targets[index];\n\n if (\n target !== undefined &&\n targetDraft !== undefined &&\n operation(target, targetDraft)\n ) {\n return (index + 1) % annotation.targets.length;\n }\n }\n }\n\n return undefined;\n}\n\nfunction renderCompactPrompt(annotation: SpotAnnotation, draft: PromptDraft): string {\n const messages = PROMPT_MESSAGES[annotation.locale];\n const targets = annotation.targets.map((target, index) => {\n const targetDraft = draft.targets[index];\n const component = target.react.componentName;\n return [\n `### ${messages.target(index + 1)}`,\n `- ${messages.requestedChange}: ${targetDraft?.instruction ?? redactSensitiveText(target.instruction)}`,\n `- ${messages.file}: ${sourceLocation(target, messages)}`,\n ...(component === undefined\n ? []\n : [`- ${messages.component}: ${redactSensitiveText(component)}`]),\n `- ${messages.element}: ${redactSensitiveText(openingTag(targetDraft?.dom ?? target.element.sanitizedHtml, messages.unavailable))}`,\n ].join(\"\\n\");\n });\n\n return [\n `## ${messages.selectedTargets(annotation.targets.length)}`,\n targets.join(\"\\n\\n\"),\n `## ${messages.modificationRequirements}`,\n messages.modificationConstraint,\n ].join(\"\\n\\n\");\n}\n\nfunction composeBounded(annotation: SpotAnnotation, maxCharacters: number): string {\n const draft = createDraft(annotation);\n let prompt = renderPrompt(annotation, draft);\n let cursor = 0;\n\n while (prompt.length > maxCharacters) {\n const nextCursor = shrinkTargetsFairly(annotation, draft, cursor);\n\n if (nextCursor === undefined) {\n if (draft.pageTitle.length > 0) {\n draft.pageTitle = \"\";\n } else {\n break;\n }\n } else {\n cursor = nextCursor;\n }\n\n prompt = renderPrompt(annotation, draft);\n }\n\n if (prompt.length <= maxCharacters) {\n return prompt;\n }\n\n const compact = renderCompactPrompt(annotation, draft);\n\n if (compact.length > maxCharacters) {\n throw new RangeError(\n \"Prompt budget cannot preserve every target instruction and source location.\",\n );\n }\n\n return compact;\n}\n\nexport function createPromptComposer(\n options: CreatePromptComposerOptions,\n): PromptComposer {\n if (!Number.isSafeInteger(options.maxCharacters) || options.maxCharacters <= 0) {\n throw new RangeError(\"Prompt character budget must be a positive integer.\");\n }\n\n return Object.freeze({\n compose(annotation: SpotAnnotation): string {\n return composeBounded(annotation, options.maxCharacters);\n },\n });\n}\n","export type RuntimeStatus = \"idle\" | \"inspecting\" | \"selected\" | \"previewing\";\n\nexport interface RuntimeState {\n readonly status: RuntimeStatus;\n}\n\nexport type RuntimeEvent =\n | Readonly<{ type: \"ACTIVATE\" }>\n | Readonly<{ type: \"RESTORE\" }>\n | Readonly<{ type: \"HOVER\" }>\n | Readonly<{ type: \"SELECT\" }>\n | Readonly<{ type: \"CANCEL\" }>\n | Readonly<{ type: \"RESELECT\" }>\n | Readonly<{ type: \"CLOSE\" }>\n | Readonly<{ type: \"PREVIEW\" }>\n | Readonly<{ type: \"OPEN_EDITOR\" }>\n | Readonly<{ type: \"COPY_SUCCESS\" }>\n | Readonly<{ type: \"COPY_FAILURE\" }>\n | Readonly<{ type: \"BACK\" }>;\n\nconst STATES = Object.freeze({\n idle: Object.freeze({ status: \"idle\" }),\n inspecting: Object.freeze({ status: \"inspecting\" }),\n selected: Object.freeze({ status: \"selected\" }),\n previewing: Object.freeze({ status: \"previewing\" }),\n} satisfies Record<RuntimeStatus, RuntimeState>);\n\nexport const INITIAL_RUNTIME_STATE: RuntimeState = STATES.idle;\n\nfunction reduceIdle(event: RuntimeEvent): RuntimeState {\n if (event.type === \"ACTIVATE\") {\n return STATES.inspecting;\n }\n\n return event.type === \"RESTORE\" ? STATES.selected : STATES.idle;\n}\n\nfunction reduceInspecting(event: RuntimeEvent): RuntimeState {\n switch (event.type) {\n case \"HOVER\":\n return STATES.inspecting;\n case \"SELECT\":\n return STATES.selected;\n case \"CANCEL\":\n return STATES.idle;\n default:\n return STATES.inspecting;\n }\n}\n\nfunction reduceSelected(event: RuntimeEvent): RuntimeState {\n switch (event.type) {\n case \"RESELECT\":\n return STATES.inspecting;\n case \"CLOSE\":\n return STATES.idle;\n case \"PREVIEW\":\n return STATES.previewing;\n case \"OPEN_EDITOR\":\n return STATES.selected;\n default:\n return STATES.selected;\n }\n}\n\nfunction reducePreviewing(event: RuntimeEvent): RuntimeState {\n switch (event.type) {\n case \"COPY_SUCCESS\":\n case \"BACK\":\n return STATES.selected;\n case \"COPY_FAILURE\":\n return STATES.previewing;\n default:\n return STATES.previewing;\n }\n}\n\nexport function reduceRuntimeState(\n state: RuntimeState,\n event: RuntimeEvent,\n): RuntimeState {\n switch (state.status) {\n case \"idle\":\n return reduceIdle(event);\n case \"inspecting\":\n return reduceInspecting(event);\n case \"selected\":\n return reduceSelected(event);\n case \"previewing\":\n return reducePreviewing(event);\n }\n}\n","import type {\n CodeContext,\n ElementContext,\n PageContext,\n ReactContext,\n SourceRef,\n SpotTargetContext,\n StyleContext,\n} from \"@spotpatch/shared\";\n\nconst STORAGE_PREFIX = \"spotpatch:selection:\";\nconst SNAPSHOT_VERSION = 1;\nconst MAX_SNAPSHOT_CHARACTERS = 1_000_000;\n\nexport interface SelectionSnapshotTarget extends Omit<\n SpotTargetContext,\n \"page\" | \"warnings\"\n> {\n readonly id: string;\n readonly page: PageContext;\n}\n\nexport interface SelectionSnapshot {\n readonly activeTargetId?: string;\n readonly open: boolean;\n readonly sequence: number;\n readonly targets: readonly SelectionSnapshotTarget[];\n}\n\nexport interface SelectionSession {\n readonly clear: () => void;\n readonly load: () => SelectionSnapshot | undefined;\n readonly save: (snapshot: SelectionSnapshot) => void;\n}\n\ntype UnknownRecord = Readonly<Record<string, unknown>>;\n\nfunction record(value: unknown): UnknownRecord | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as UnknownRecord)\n : undefined;\n}\n\nfunction text(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nfunction optionalText(value: unknown): value is string | undefined {\n return value === undefined || text(value);\n}\n\nfunction strings(value: unknown): value is string[] {\n return Array.isArray(value) && value.length <= 256 && value.every(text);\n}\n\nfunction finiteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction optionalNumber(value: unknown): value is number | undefined {\n return value === undefined || finiteNumber(value);\n}\n\nfunction source(value: unknown): value is SourceRef {\n const item = record(value);\n return (\n item !== undefined &&\n text(item.origin) &&\n text(item.confidence) &&\n optionalText(item.fileId) &&\n optionalText(item.relativePath) &&\n optionalNumber(item.line) &&\n optionalNumber(item.column)\n );\n}\n\nfunction react(value: unknown): value is ReactContext {\n const item = record(value);\n return (\n item !== undefined &&\n typeof item.supported === \"boolean\" &&\n optionalText(item.version) &&\n optionalText(item.componentName) &&\n strings(item.componentStack) &&\n (item.source === undefined || source(item.source))\n );\n}\n\nfunction page(value: unknown): value is PageContext {\n const item = record(value);\n return (\n item !== undefined &&\n text(item.url) &&\n text(item.pathname) &&\n text(item.title) &&\n finiteNumber(item.viewportWidth) &&\n finiteNumber(item.viewportHeight) &&\n finiteNumber(item.devicePixelRatio)\n );\n}\n\nfunction element(value: unknown): value is ElementContext {\n const item = record(value);\n const rect = record(item?.rect);\n return (\n item !== undefined &&\n text(item.tagName) &&\n text(item.selector) &&\n text(item.sanitizedHtml) &&\n optionalText(item.textPreview) &&\n optionalText(item.role) &&\n rect !== undefined &&\n finiteNumber(rect.x) &&\n finiteNumber(rect.y) &&\n finiteNumber(rect.width) &&\n finiteNumber(rect.height)\n );\n}\n\nfunction styles(value: unknown): value is StyleContext {\n const item = record(value);\n const computed = record(item?.computed);\n return (\n item !== undefined &&\n strings(item.classNames) &&\n optionalText(item.inlineStyle) &&\n Array.isArray(item.matchedRules) &&\n item.matchedRules.length <= 256 &&\n item.matchedRules.every((value) => {\n const rule = record(value);\n return (\n rule !== undefined &&\n text(rule.selector) &&\n text(rule.declarations) &&\n optionalText(rule.source) &&\n optionalText(rule.media)\n );\n }) &&\n computed !== undefined &&\n Object.values(computed).every(text) &&\n strings(item.warnings)\n );\n}\n\nfunction code(value: unknown): value is CodeContext {\n const item = record(value);\n return (\n item !== undefined &&\n text(item.relativePath) &&\n text(item.language) &&\n finiteNumber(item.startLine) &&\n finiteNumber(item.endLine) &&\n text(item.excerpt) &&\n text(item.boundary)\n );\n}\n\nfunction target(value: unknown): value is SelectionSnapshotTarget {\n const item = record(value);\n return (\n item !== undefined &&\n text(item.id) &&\n text(item.instruction) &&\n page(item.page) &&\n source(item.source) &&\n react(item.react) &&\n element(item.element) &&\n styles(item.styles) &&\n (item.code === undefined || code(item.code))\n );\n}\n\nfunction parseSnapshot(\n value: unknown,\n maximumTargets: number,\n): SelectionSnapshot | undefined {\n const item = record(value);\n if (\n item?.version !== SNAPSHOT_VERSION ||\n typeof item.open !== \"boolean\" ||\n !Number.isSafeInteger(item.sequence) ||\n Number(item.sequence) < 0 ||\n (item.activeTargetId !== undefined && typeof item.activeTargetId !== \"string\") ||\n !Array.isArray(item.targets) ||\n item.targets.length === 0 ||\n item.targets.length > maximumTargets ||\n !item.targets.every(target)\n ) {\n return undefined;\n }\n\n const targets = item.targets;\n const ids = targets.map(({ id }) => id);\n if (\n new Set(ids).size !== ids.length ||\n (item.activeTargetId !== undefined && !ids.includes(item.activeTargetId))\n ) {\n return undefined;\n }\n\n return {\n ...(item.activeTargetId === undefined\n ? {}\n : { activeTargetId: item.activeTargetId }),\n open: item.open,\n sequence: Number(item.sequence),\n targets,\n };\n}\n\nexport function createSelectionSession(\n window: Window,\n sessionId: string,\n maximumTargets: number,\n): SelectionSession {\n const key = `${STORAGE_PREFIX}${sessionId}`;\n let storage: Storage | undefined;\n try {\n storage = window.sessionStorage;\n } catch {\n storage = undefined;\n }\n\n return Object.freeze({\n clear(): void {\n try {\n storage?.removeItem(key);\n } catch {\n // Storage can be unavailable or full without disabling the picker.\n }\n },\n load(): SelectionSnapshot | undefined {\n let serialized: string | null;\n try {\n serialized = storage?.getItem(key) ?? null;\n } catch {\n return undefined;\n }\n\n if (serialized === null || serialized.length > MAX_SNAPSHOT_CHARACTERS) {\n return undefined;\n }\n\n try {\n return parseSnapshot(JSON.parse(serialized) as unknown, maximumTargets);\n } catch {\n return undefined;\n }\n },\n save(snapshot: SelectionSnapshot): void {\n try {\n storage?.setItem(\n key,\n JSON.stringify({ version: SNAPSHOT_VERSION, ...snapshot }),\n );\n } catch {\n // Persistence is best-effort; the active in-memory selection stays valid.\n }\n },\n });\n}\n","import type { ReactAdapter } from \"@spotpatch/react-adapter\";\nimport {\n parseSourceMarker,\n SOURCE_MARKER_ATTRIBUTE,\n type ReactContext,\n type SourceMarker,\n type SourceRef,\n} from \"@spotpatch/shared\";\n\nconst EMPTY_REACT_CONTEXT = Object.freeze({\n supported: false,\n componentStack: Object.freeze([]),\n}) satisfies ReactContext;\n\nexport interface ElementSourceResolution {\n readonly react: ReactContext;\n readonly source: SourceRef;\n}\n\nexport interface SourceResolver {\n readonly dispose: () => void;\n readonly resolve: (element: Element) => ElementSourceResolution;\n}\n\nexport interface CreateSourceResolverOptions {\n readonly adapter: ReactAdapter;\n readonly onAdapterError?: () => void;\n}\n\nfunction directMarker(element: Element): SourceMarker | undefined {\n return parseSourceMarker(element.getAttribute(SOURCE_MARKER_ATTRIBUTE));\n}\n\nfunction ancestorMarker(element: Element): SourceMarker | undefined {\n let ancestor = element.parentElement;\n\n while (ancestor !== null) {\n const marker = directMarker(ancestor);\n\n if (marker !== undefined) {\n return marker;\n }\n\n ancestor = ancestor.parentElement;\n }\n\n return undefined;\n}\n\nfunction markerSource(\n marker: SourceMarker,\n origin: \"jsx-host\" | \"dom-ancestor\",\n confidence: \"exact\" | \"approximate\",\n): SourceRef {\n return Object.freeze({\n fileId: marker.fileId,\n line: marker.line,\n column: marker.column,\n origin,\n confidence,\n });\n}\n\nfunction unknownSource(): SourceRef {\n return Object.freeze({ origin: \"none\", confidence: \"unknown\" });\n}\n\nexport function sourceRefToMarker(source: SourceRef): SourceMarker | undefined {\n return source.fileId === undefined ||\n source.line === undefined ||\n source.column === undefined\n ? undefined\n : Object.freeze({\n fileId: source.fileId,\n line: source.line,\n column: source.column,\n });\n}\n\nexport function createSourceResolver(\n options: CreateSourceResolverOptions,\n): SourceResolver {\n let adapterEnabled = true;\n\n function inspectReact(element: Element): ReactContext {\n if (!adapterEnabled) {\n return EMPTY_REACT_CONTEXT;\n }\n\n try {\n return options.adapter.inspect(element);\n } catch {\n adapterEnabled = false;\n options.onAdapterError?.();\n return EMPTY_REACT_CONTEXT;\n }\n }\n\n return Object.freeze({\n resolve(element: Element): ElementSourceResolution {\n const marker = directMarker(element);\n const react = inspectReact(element);\n\n if (marker !== undefined) {\n return Object.freeze({\n react,\n source: markerSource(marker, \"jsx-host\", \"exact\"),\n });\n }\n\n if (react.source !== undefined) {\n return Object.freeze({ react, source: react.source });\n }\n\n const nearestAncestor = ancestorMarker(element);\n\n if (nearestAncestor !== undefined) {\n return Object.freeze({\n react,\n source: markerSource(nearestAncestor, \"dom-ancestor\", \"approximate\"),\n });\n }\n\n return Object.freeze({ react, source: unknownSource() });\n },\n\n dispose(): void {\n adapterEnabled = false;\n options.adapter.dispose();\n },\n });\n}\n","import type {\n AgentCapabilitySnapshot,\n AgentJobResult,\n AgentJobSnapshot,\n AgentWorkspaceHealthSnapshot,\n ErrorCode,\n RuntimeAiConfig,\n SpotPatchLocale,\n SpotPatchLocalePreference,\n} from \"@spotpatch/shared\";\nimport {\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n MAX_TARGET_INSTRUCTION_CHARACTERS,\n SPOTPATCH_REPOSITORY_URL,\n} from \"@spotpatch/shared\";\n\nimport type { ElementRect } from \"../picker/geometry.js\";\nimport type { RuntimeStatus } from \"../state/runtime-state.js\";\nimport {\n AGENT_PANEL_STYLES,\n createAgentPanel,\n type AgentActivityItem,\n type AgentSelectionValue,\n} from \"./agent-panel.js\";\nimport { createBrandMark } from \"./brand-mark.js\";\nimport {\n getDataFlowExtension,\n type DataFlowPanel,\n type DataFlowViewState,\n} from \"./data-flow-panel-contract.js\";\nimport { calculateDialogPlacement } from \"./dialog-placement.js\";\nimport { createButton, createMarkedElement } from \"./dom.js\";\nimport {\n createUiLocalizer,\n type UiLocalizer,\n type UiMessages,\n} from \"./localization.js\";\nimport { UI_MARKER_ATTRIBUTE, UI_Z_INDEX } from \"./ui-constants.js\";\n\nexport interface SelectionTargetView {\n readonly active: boolean;\n readonly canOpenEditor: boolean;\n readonly id: string;\n readonly instruction: string;\n readonly label: string;\n readonly source: string;\n readonly status: \"loading\" | \"ready\" | \"warning\";\n}\n\nexport interface SelectionHighlightView {\n readonly active: boolean;\n readonly id: string;\n readonly label: string;\n readonly rect: ElementRect;\n}\n\nexport interface RuntimeView {\n readonly addTargetButton: HTMLButtonElement;\n readonly agentApplyButton: HTMLButtonElement;\n readonly agentCancelButton: HTMLButtonElement;\n readonly agentConsentCheckbox: HTMLInputElement;\n readonly agentModelSelect: HTMLSelectElement;\n readonly agentModeSelect: HTMLSelectElement;\n readonly agentProviderSelect: HTMLSelectElement;\n readonly agentResetButton: HTMLButtonElement;\n readonly agentRevertButton: HTMLButtonElement;\n readonly agentRunButton: HTMLButtonElement;\n readonly agentTestButton: HTMLButtonElement;\n readonly agentWorkspaceConsentCheckbox: HTMLInputElement;\n readonly backButton: HTMLButtonElement;\n readonly closeButton: HTMLButtonElement;\n readonly copyButton: HTMLButtonElement;\n readonly dataFlowRefreshButton: HTMLButtonElement;\n readonly host: HTMLElement;\n readonly openEditorButton: HTMLButtonElement;\n readonly repositoryLink: HTMLAnchorElement;\n readonly previewButton: HTMLButtonElement;\n readonly reselectButton: HTMLButtonElement;\n readonly triggerButton: HTMLButtonElement;\n readonly targetList: HTMLElement;\n readonly announce: (message: string) => void;\n readonly dispose: () => void;\n readonly focusTargetInstruction: (targetId?: string) => void;\n readonly focusPrompt: () => void;\n readonly hideHighlight: () => void;\n readonly hideSelectionHighlights: () => void;\n readonly hideSelection: () => void;\n readonly hideSelectionTemporarily: () => void;\n readonly agentConsentGranted: () => boolean;\n readonly agentWorkspaceConsentGranted: () => boolean;\n readonly readAgentSelection: () => AgentSelectionValue | undefined;\n readonly locale: () => SpotPatchLocale;\n readonly messages: () => UiMessages;\n readonly subscribeLocale: (listener: () => void) => () => void;\n readonly renderAgentCapability: (\n state: \"idle\" | \"probing\" | \"ready\" | \"error\",\n message: string,\n capability?: AgentCapabilitySnapshot,\n errorCode?: ErrorCode,\n ) => void;\n readonly renderAgentJob: (\n snapshot: AgentJobSnapshot,\n result: AgentJobResult | undefined,\n activities: readonly AgentActivityItem[],\n errorCode?: ErrorCode,\n ) => void;\n readonly renderAgentWorkspaceHealth: (\n state: \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\",\n snapshot?: AgentWorkspaceHealthSnapshot,\n errorCode?: ErrorCode,\n ) => void;\n readonly renderStatus: (status: RuntimeStatus) => void;\n readonly renderEditorStatus: (\n state: \"idle\" | \"opening\" | \"success\" | \"error\",\n ) => void;\n readonly renderDataFlow: (state: DataFlowViewState) => void;\n readonly resetAgentJob: () => void;\n readonly setAgentEditingEnabled: (enabled: boolean) => void;\n readonly setAgentProviderConsent: (granted: boolean) => void;\n readonly setPreviewEnabled: (enabled: boolean) => void;\n readonly updateTargetInstruction: (targetId: string, instruction: string) => void;\n readonly renderTargets: (\n targets: readonly SelectionTargetView[],\n maximum: number,\n ) => void;\n readonly showHighlight: (rect: ElementRect, label: string) => void;\n readonly showSelectionHighlights: (\n targets: readonly SelectionHighlightView[],\n ) => void;\n readonly showPreview: (prompt: string) => void;\n readonly showSelection: (\n summary: string,\n canOpenEditor: boolean,\n canPreview: boolean,\n ) => void;\n readonly updateSelection: (\n summary: string,\n canOpenEditor: boolean,\n canPreview: boolean,\n ) => void;\n}\n\nconst DIALOG_MAX_WIDTH = 460;\nconst DIALOG_MAX_HEIGHT = 620;\nconst DIALOG_FALLBACK_HEIGHT = Object.freeze({\n previewing: 560,\n selected: DIALOG_MAX_HEIGHT,\n}) satisfies Readonly<Record<\"previewing\" | \"selected\", number>>;\n\nfunction createStyles(document: Document): HTMLStyleElement {\n const style = document.createElement(\"style\");\n style.textContent = `\n :host {\n all: initial;\n --spotpatch-bg: #0e0e12;\n --spotpatch-bg-raised: #17171c;\n --spotpatch-bg-active: #1c1c22;\n --spotpatch-bg-input: #0b0b0f;\n --spotpatch-border: #2a2a32;\n --spotpatch-border-subtle: #232329;\n --spotpatch-text: #f2f2f5;\n --spotpatch-text-secondary: #96969f;\n --spotpatch-text-muted: #686872;\n --spotpatch-accent: #8b7bff;\n --spotpatch-accent-strong: #6a5ce8;\n --spotpatch-accent-cyan: #52a8ff;\n --spotpatch-danger: #fb7185;\n --spotpatch-success: #34d399;\n --spotpatch-warning: #f59e0b;\n --spotpatch-text-on-accent: #0b0b12;\n --spotpatch-radius-panel: 16px;\n --spotpatch-radius-card: 10px;\n --spotpatch-shadow-panel: 0 30px 60px -20px rgb(0 0 0 / 70%);\n color-scheme: dark;\n color: var(--spotpatch-text);\n font-family: Inter, \"SF Pro Display\", \"SF Pro Text\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n }\n [hidden] { display: none !important; }\n button, textarea, select { font: inherit; }\n button { -webkit-tap-highlight-color: transparent; }\n .spotpatch-trigger {\n position: fixed;\n right: 24px;\n bottom: 24px;\n z-index: ${String(UI_Z_INDEX.controls)};\n display: inline-flex;\n align-items: center;\n gap: 10px;\n min-height: 44px;\n border: 1px solid rgb(255 255 255 / 12%);\n border-radius: 999px;\n padding: 10px 17px;\n color: #f8fafc;\n background: #171b23;\n box-shadow: 0 12px 34px rgb(0 0 0 / 25%), inset 0 1px rgb(255 255 255 / 5%);\n cursor: pointer;\n font-size: 14px;\n font-weight: 650;\n transition: border-color 160ms ease, box-shadow 160ms ease, transform 160ms ease;\n }\n .spotpatch-trigger::before {\n width: 9px;\n height: 9px;\n border-radius: 999px;\n background: var(--spotpatch-accent);\n box-shadow: 0 0 0 4px rgb(99 102 241 / 10%);\n content: \"\";\n }\n .spotpatch-trigger:hover { transform: translateY(-1px); border-color: rgb(129 140 248 / 52%); }\n .spotpatch-trigger[aria-pressed=\"true\"] {\n border-color: rgb(124 58 237 / 55%);\n background: #24203b;\n box-shadow: 0 14px 42px rgb(76 29 149 / 24%), inset 0 1px rgb(255 255 255 / 10%);\n }\n .spotpatch-highlight {\n position: fixed;\n top: 0;\n left: 0;\n z-index: ${String(UI_Z_INDEX.highlight)};\n box-sizing: border-box;\n border: 2px solid var(--spotpatch-accent);\n border-radius: 6px;\n background: rgb(109 93 246 / 8%);\n box-shadow: inset 0 0 0 1px rgb(255 255 255 / 22%), 0 0 0 1px rgb(109 93 246 / 10%);\n pointer-events: none;\n }\n .spotpatch-highlight-label {\n position: absolute;\n top: -30px;\n left: -2px;\n max-width: min(380px, 80vw);\n overflow: hidden;\n border: 1px solid rgb(255 255 255 / 14%);\n border-radius: 8px 8px 8px 3px;\n padding: 6px 10px;\n color: #fff;\n background: #5546dc;\n box-shadow: 0 8px 20px rgb(49 46 129 / 22%);\n font: 650 12px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-selection-highlights {\n position: fixed;\n inset: 0;\n z-index: ${String(UI_Z_INDEX.highlight)};\n pointer-events: none;\n }\n .spotpatch-selection-highlight {\n position: fixed;\n top: 0;\n left: 0;\n box-sizing: border-box;\n border: 2px solid var(--spotpatch-accent-cyan);\n border-radius: 6px;\n background: rgb(8 182 214 / 5%);\n box-shadow: inset 0 0 0 1px rgb(255 255 255 / 16%);\n }\n .spotpatch-selection-highlight[data-active=\"true\"] {\n border-color: #7768f7;\n background: rgb(109 93 246 / 8%);\n box-shadow: inset 0 0 0 1px rgb(255 255 255 / 20%);\n }\n .spotpatch-selection-highlight > span {\n position: absolute;\n top: -24px;\n left: -2px;\n max-width: min(300px, 70vw);\n overflow: hidden;\n border-radius: 7px 7px 7px 2px;\n padding: 4px 8px;\n color: #ecfeff;\n background: rgb(14 67 82 / 96%);\n font: 650 11px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-selection-highlight[data-active=\"true\"] > span {\n background: #5546dc;\n }\n .spotpatch-dialog {\n --spotpatch-anchor-x: 50%;\n --spotpatch-anchor-y: 50%;\n position: fixed;\n top: 16px;\n left: 16px;\n z-index: ${String(UI_Z_INDEX.controls)};\n box-sizing: border-box;\n width: min(${String(DIALOG_MAX_WIDTH)}px, calc(100vw - 32px));\n color: #edf0f7;\n outline: none;\n filter: drop-shadow(var(--spotpatch-shadow-panel));\n }\n .spotpatch-anchor {\n position: absolute;\n z-index: 0;\n width: 14px;\n height: 14px;\n border: 1px solid rgb(255 255 255 / 12%);\n background: var(--spotpatch-bg);\n transform: rotate(45deg);\n }\n .spotpatch-dialog[data-placement=\"above\"] .spotpatch-anchor {\n bottom: -6px;\n left: calc(var(--spotpatch-anchor-x) - 7px);\n border-top: 0;\n border-left: 0;\n }\n .spotpatch-dialog[data-placement=\"below\"] .spotpatch-anchor {\n top: -6px;\n left: calc(var(--spotpatch-anchor-x) - 7px);\n border-right: 0;\n border-bottom: 0;\n }\n .spotpatch-dialog[data-placement=\"left\"] .spotpatch-anchor {\n top: calc(var(--spotpatch-anchor-y) - 7px);\n right: -6px;\n border-bottom: 0;\n border-left: 0;\n }\n .spotpatch-dialog[data-placement=\"right\"] .spotpatch-anchor {\n top: calc(var(--spotpatch-anchor-y) - 7px);\n left: -6px;\n border-top: 0;\n border-right: 0;\n }\n .spotpatch-dialog[data-placement=\"center\"] .spotpatch-anchor,\n .spotpatch-dialog[data-placement=\"viewport\"] .spotpatch-anchor { display: none; }\n .spotpatch-shell {\n position: relative;\n z-index: 1;\n display: flex;\n box-sizing: border-box;\n max-height: min(${String(DIALOG_MAX_HEIGHT)}px, calc(100vh - 32px));\n overflow: hidden;\n flex-direction: column;\n border: 1px solid var(--spotpatch-border);\n border-radius: var(--spotpatch-radius-panel);\n background: var(--spotpatch-bg);\n box-shadow: inset 0 1px rgb(255 255 255 / 5%), 0 0 60px -32px rgb(139 123 255 / 20%);\n }\n .spotpatch-shell::before {\n position: absolute;\n z-index: 2;\n top: 0;\n right: 20%;\n left: 20%;\n height: 1px;\n background: linear-gradient(90deg, transparent, var(--spotpatch-accent), var(--spotpatch-accent-cyan), transparent);\n content: \"\";\n opacity: .65;\n pointer-events: none;\n }\n .spotpatch-header {\n position: relative;\n padding: 0 18px 14px;\n }\n .spotpatch-brand-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin: 0 -18px 18px;\n padding: 14px 18px 13px;\n border-bottom: 1px solid var(--spotpatch-border-subtle);\n }\n .spotpatch-brand {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n color: #f8fafc;\n }\n .spotpatch-brand-mark {\n width: 30px;\n height: 30px;\n flex: none;\n filter: drop-shadow(0 6px 12px rgb(76 29 149 / 22%));\n }\n .spotpatch-brand-copy { display: grid; min-width: 0; gap: 1px; }\n .spotpatch-brand-name {\n color: #fff;\n font-size: 13.5px;\n font-weight: 680;\n letter-spacing: -.01em;\n }\n .spotpatch-brand-context {\n color: #8e98aa;\n font-size: 10.5px;\n font-weight: 560;\n letter-spacing: .02em;\n }\n .spotpatch-header-controls {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex: none;\n }\n .spotpatch-repository,\n .spotpatch-locale,\n .spotpatch-close {\n height: 27px;\n border: 1px solid rgb(255 255 255 / 11%);\n border-radius: 7px;\n background: transparent;\n }\n .spotpatch-repository {\n display: inline-flex;\n align-items: center;\n padding: 0 9px;\n color: var(--spotpatch-text-secondary);\n font-size: 11px;\n font-weight: 680;\n text-decoration: none;\n }\n .spotpatch-locale {\n min-width: 34px;\n padding: 0 8px;\n color: #c5cad5;\n cursor: pointer;\n font-size: 12px;\n font-weight: 650;\n }\n .spotpatch-close {\n display: inline-grid;\n width: 27px;\n padding: 0;\n place-items: center;\n color: #9da5b4;\n cursor: pointer;\n font-size: 15px;\n line-height: 1;\n transition: border-color 150ms ease, color 150ms ease, background 150ms ease;\n }\n .spotpatch-close:hover,\n .spotpatch-locale:hover,\n .spotpatch-repository:hover { border-color: rgb(129 112 247 / 45%); color: #fff; background: rgb(109 93 246 / 10%); }\n .spotpatch-title {\n margin: 0;\n color: #fff;\n font-size: 18px;\n font-weight: 680;\n letter-spacing: -.015em;\n }\n .spotpatch-subtitle {\n max-width: 390px;\n margin: 4px 0 0;\n color: var(--spotpatch-text-secondary);\n font-size: 12.5px;\n line-height: 1.5;\n }\n .spotpatch-target-row {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n margin-top: 14px;\n }\n .spotpatch-target-label {\n min-width: 0;\n overflow: hidden;\n border: 1px solid rgb(129 112 247 / 24%);\n border-radius: 999px;\n padding: 4px 10px;\n color: #cdd2ff;\n background: rgb(109 93 246 / 10%);\n font: 600 11px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-context-state {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex: none;\n color: #a5adba;\n font-size: 11px;\n white-space: nowrap;\n }\n .spotpatch-context-state::before {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: #f59e0b;\n content: \"\";\n }\n .spotpatch-context-state[data-state=\"ready\"],\n .spotpatch-editor-feedback[data-state=\"success\"] { color: #9fe3c4; }\n .spotpatch-context-state[data-state=\"ready\"]::before,\n .spotpatch-editor-feedback[data-state=\"success\"]::before { background: #34d399; }\n .spotpatch-context-state[data-state=\"warning\"],\n .spotpatch-editor-feedback[data-state=\"error\"] { color: #fecaca; }\n .spotpatch-context-state[data-state=\"warning\"]::before,\n .spotpatch-editor-feedback[data-state=\"error\"]::before { background: #fb7185; }\n .spotpatch-body {\n min-height: 0;\n overflow: auto;\n padding: 0 18px 14px;\n scrollbar-color: rgb(100 116 139 / 50%) transparent;\n scrollbar-width: thin;\n }\n .spotpatch-targets {\n margin: 0;\n }\n .spotpatch-targets-heading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n margin-bottom: 8px;\n color: var(--spotpatch-text-secondary);\n font-size: 11px;\n font-weight: 650;\n letter-spacing: .04em;\n text-transform: uppercase;\n }\n .spotpatch-targets-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n letter-spacing: 0;\n text-transform: none;\n }\n .spotpatch-target-complete { color: var(--spotpatch-text-muted); font-size: 11px; font-weight: 560; }\n .spotpatch-target-budget {\n color: var(--spotpatch-text-muted);\n font: 550 10.5px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n .spotpatch-target-budget[data-state=\"ready\"] { display: none; }\n .spotpatch-target-budget[data-state=\"over\"] { color: #fda4af; }\n .spotpatch-target-count {\n margin-left: auto;\n border-radius: 999px;\n padding: 3px 8px;\n color: var(--spotpatch-text-muted);\n font: 600 10.5px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n .spotpatch-target-progress {\n height: 3px;\n margin-bottom: 13px;\n overflow: hidden;\n border-radius: 999px;\n background: var(--spotpatch-border-subtle);\n }\n .spotpatch-target-progress-fill {\n width: 0;\n height: 100%;\n border-radius: inherit;\n background: linear-gradient(90deg, var(--spotpatch-accent), var(--spotpatch-accent-cyan));\n transition: width 180ms ease;\n }\n .spotpatch-target-list {\n display: grid;\n gap: 8px;\n max-height: min(340px, 48vh);\n overflow: auto;\n padding-right: 2px;\n }\n .spotpatch-target-item {\n overflow: hidden;\n border: 1px solid var(--spotpatch-border-subtle);\n border-radius: var(--spotpatch-radius-card);\n background: var(--spotpatch-bg-raised);\n transition: border-color 150ms ease, background 150ms ease;\n }\n .spotpatch-target-item[data-active=\"true\"] {\n border-color: rgb(139 123 255 / 34%);\n background: var(--spotpatch-bg-active);\n box-shadow: 0 0 0 3px rgb(139 123 255 / 10%);\n }\n .spotpatch-target-summary {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 28px 28px;\n align-items: stretch;\n gap: 2px;\n padding: 4px;\n }\n .spotpatch-target-select {\n display: grid;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n gap: 9px;\n min-width: 0;\n border: 0;\n border-radius: 8px;\n padding: 8px;\n color: inherit;\n background: transparent;\n cursor: pointer;\n text-align: left;\n }\n .spotpatch-target-select:hover { background: rgb(255 255 255 / 3.5%); }\n .spotpatch-target-index {\n display: inline-grid;\n width: 22px;\n height: 22px;\n place-items: center;\n border: 1px solid rgb(68 202 224 / 25%);\n border-radius: 6px;\n color: var(--spotpatch-text-secondary);\n background: var(--spotpatch-bg);\n font: 650 11px/1 ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n .spotpatch-target-copy { min-width: 0; }\n .spotpatch-target-name,\n .spotpatch-target-source {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-target-name { color: #f2f2f5; font-size: 13px; font-weight: 650; }\n .spotpatch-target-source { margin-top: 1px; color: var(--spotpatch-text-muted); font: 500 10.5px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; }\n .spotpatch-target-state {\n border-radius: 999px;\n padding: 3px 8px;\n color: #a7f3d0;\n background: rgb(16 185 129 / 9%);\n font-size: 10.5px;\n font-weight: 650;\n white-space: nowrap;\n }\n .spotpatch-target-state[data-complete=\"false\"] { color: #f5c97a; background: rgb(245 158 11 / 9%); }\n .spotpatch-target-open,\n .spotpatch-target-remove {\n display: inline-grid;\n width: 28px;\n height: 100%;\n min-height: 34px;\n padding: 0;\n place-items: center;\n border: 1px solid transparent;\n border-radius: 7px;\n color: #7f899a;\n background: transparent;\n cursor: pointer;\n }\n .spotpatch-target-open { color: #79d9e7; }\n .spotpatch-target-open:hover:not(:disabled) { border-color: rgb(68 202 224 / 30%); color: #c8f7ff; background: rgb(8 145 178 / 11%); }\n .spotpatch-target-remove:hover:not(:disabled) { border-color: rgb(251 113 133 / 24%); color: #fda4af; background: rgb(127 29 29 / 12%); }\n .spotpatch-target-editor {\n padding: 0 12px 12px;\n }\n .spotpatch-target-editor-head {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 6px;\n }\n .spotpatch-target-editor-label { color: var(--spotpatch-text-secondary); font-size: 11px; font-weight: 650; }\n .spotpatch-target-editor-count { color: var(--spotpatch-text-muted); font: 500 10.5px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace; }\n .spotpatch-target-editor textarea {\n box-sizing: border-box;\n width: 100%;\n min-height: 74px;\n resize: vertical;\n border: 1px solid var(--spotpatch-border);\n border-radius: 7px;\n padding: 9px 10px;\n color: #f8fafc;\n caret-color: #8b7cf7;\n background: var(--spotpatch-bg-input);\n font-size: 12.5px;\n line-height: 1.55;\n outline: none;\n transition: border-color 150ms ease, box-shadow 150ms ease, background 150ms ease;\n }\n .spotpatch-target-editor textarea::placeholder { color: #687284; }\n .spotpatch-target-editor textarea:hover { border-color: rgb(139 124 247 / 34%); }\n .spotpatch-target-editor textarea:focus {\n border-color: rgb(139 124 247 / 68%);\n background: rgb(3 7 18 / 65%);\n box-shadow: 0 0 0 2px rgb(109 93 246 / 10%);\n }\n .spotpatch-diagnostics {\n margin-top: 10px;\n overflow: hidden;\n border: 1px solid rgb(255 255 255 / 8%);\n border-radius: 9px;\n background: rgb(255 255 255 / 2.5%);\n }\n .spotpatch-diagnostics > summary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 11px;\n color: #bfc5d0;\n cursor: pointer;\n font-size: 11px;\n font-weight: 650;\n list-style: none;\n user-select: none;\n }\n .spotpatch-diagnostics > summary::-webkit-details-marker { display: none; }\n .spotpatch-diagnostics > summary::before {\n color: #778193;\n content: \"›\";\n font-size: 16px;\n line-height: 1;\n transform: rotate(0deg);\n transition: transform 150ms ease;\n }\n .spotpatch-diagnostics[open] > summary::before { transform: rotate(90deg); }\n .spotpatch-source-peek {\n min-width: 0;\n overflow: hidden;\n margin-left: auto;\n color: #64748b;\n font: 500 10.5px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-summary {\n max-height: 170px;\n margin: 0;\n overflow: auto;\n border-top: 1px solid rgb(255 255 255 / 7%);\n padding: 10px 11px 11px;\n color: #9ca5b5;\n font: 10.5px/1.55 ui-monospace, SFMono-Regular, Menlo, monospace;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n user-select: text;\n }\n .spotpatch-prompt {\n max-height: min(500px, 60vh);\n margin: 0;\n overflow: auto;\n border: 1px solid rgb(255 255 255 / 9%);\n border-radius: 9px;\n padding: 11px;\n color: #d8ddeb;\n background: rgb(3 7 18 / 55%);\n font: 11px/1.6 ui-monospace, SFMono-Regular, Menlo, monospace;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n user-select: text;\n }\n .spotpatch-actions {\n display: grid;\n gap: 8px;\n padding: 10px 18px 14px;\n border-top: 1px solid rgb(255 255 255 / 8%);\n background: rgb(8 8 12 / 86%);\n }\n .spotpatch-editor-feedback {\n white-space: normal;\n }\n .spotpatch-secondary-actions,\n .spotpatch-primary-actions {\n display: flex;\n align-items: center;\n gap: 7px;\n }\n .spotpatch-secondary-actions { min-height: 30px; }\n .spotpatch-actions button {\n display: inline-flex;\n min-height: 34px;\n align-items: center;\n justify-content: center;\n border: 1px solid rgb(255 255 255 / 10%);\n border-radius: 9px;\n padding: 7px 11px;\n color: var(--spotpatch-text-secondary);\n background: rgb(255 255 255 / 4%);\n cursor: pointer;\n font-size: 12px;\n font-weight: 650;\n transition: border-color 150ms ease, box-shadow 150ms ease, color 150ms ease, transform 150ms ease;\n }\n .spotpatch-actions button:hover:not(:disabled) {\n border-color: rgb(139 124 247 / 45%);\n color: #fff;\n transform: translateY(-1px);\n }\n .spotpatch-actions .spotpatch-primary {\n min-width: 138px;\n flex: 1;\n border-color: transparent;\n color: var(--spotpatch-text-on-accent);\n background: linear-gradient(135deg, var(--spotpatch-accent), var(--spotpatch-accent-strong));\n box-shadow: 0 8px 20px -8px rgb(139 123 255 / 55%);\n }\n .spotpatch-actions .spotpatch-primary:hover:not(:disabled) { color: var(--spotpatch-text-on-accent); filter: brightness(1.08); }\n .spotpatch-actions .spotpatch-primary::after { margin-left: 8px; content: \"↗\"; font-size: 12px; }\n .spotpatch-actions .spotpatch-secondary-action {\n min-height: 30px;\n border-style: dashed;\n padding: 5px 10px;\n color: var(--spotpatch-text-muted);\n background: transparent;\n font-size: 11px;\n }\n .spotpatch-actions .spotpatch-icon-action {\n width: 34px;\n min-width: 34px;\n padding: 0;\n font-size: 0;\n }\n .spotpatch-actions .spotpatch-icon-action::before {\n color: var(--spotpatch-text-secondary);\n content: attr(data-compact-icon);\n font-size: 18px;\n font-weight: 400;\n line-height: 1;\n }\n .spotpatch-actions button:disabled { cursor: not-allowed; opacity: .4; transform: none; }\n .spotpatch-actions button:focus-visible,\n .spotpatch-repository:focus-visible,\n .spotpatch-target-open:focus-visible,\n .spotpatch-target-remove:focus-visible,\n .spotpatch-close:focus-visible,\n .spotpatch-trigger:focus-visible,\n .spotpatch-target-select:focus-visible,\n .spotpatch-target-editor textarea:focus-visible,\n .spotpatch-locale:focus-visible,\n .spotpatch-prompt:focus-visible,\n .spotpatch-diagnostics > summary:focus-visible {\n outline: 2px solid #8b7cf7;\n outline-offset: 2px;\n }\n .spotpatch-live {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n }\n @media (prefers-reduced-motion: reduce) {\n .spotpatch-trigger,\n .spotpatch-actions button,\n .spotpatch-diagnostics > summary::before { transition: none; }\n }\n @media (max-width: 520px) {\n .spotpatch-dialog { top: 8px; left: 8px; width: calc(100vw - 16px); }\n .spotpatch-shell { max-height: calc(100vh - 16px); border-radius: 14px; }\n .spotpatch-header, .spotpatch-body { padding-left: 14px; padding-right: 14px; }\n .spotpatch-brand-row { margin-right: -14px; margin-left: -14px; padding-right: 14px; padding-left: 14px; }\n .spotpatch-actions { padding-right: 14px; padding-left: 14px; }\n .spotpatch-target-select { grid-template-columns: 24px minmax(0, 1fr); }\n .spotpatch-target-state { display: none; }\n .spotpatch-repository { display: none; }\n }\n ${AGENT_PANEL_STYLES}\n `;\n return style;\n}\n\nfunction summaryLine(summary: string, prefix: string): string | undefined {\n const line = summary\n .split(\"\\n\")\n .find((candidate) => candidate.startsWith(`${prefix}: `));\n return line?.slice(prefix.length + 2).trim();\n}\n\nfunction createUnavailableDataFlowPanel(\n document: Document,\n changesRoot: HTMLElement,\n diagnosticsRoot: HTMLElement,\n): DataFlowPanel {\n changesRoot.append(diagnosticsRoot);\n\n return Object.freeze({\n root: changesRoot,\n refreshButton: createButton(document, \"\"),\n styles: document.createElement(\"style\"),\n dispose: () => undefined,\n render: () => undefined,\n resetView: () => undefined,\n });\n}\n\nexport function createRuntimeView(\n document: Document,\n shortcut: string,\n ai: RuntimeAiConfig = Object.freeze({ enabled: false }),\n localePreference: SpotPatchLocalePreference = \"auto\",\n dataFlowEnabled = false,\n): RuntimeView {\n const localizer: UiLocalizer = createUiLocalizer(document, localePreference);\n let messages = localizer.messages();\n const host = document.createElement(\"spotpatch-root\");\n host.setAttribute(UI_MARKER_ATTRIBUTE, \"\");\n const shadowRoot = host.attachShadow({ mode: \"open\" });\n const triggerButton = createButton(\n document,\n messages.trigger.select,\n \"spotpatch-trigger\",\n );\n triggerButton.title = messages.trigger.title(shortcut);\n triggerButton.setAttribute(\"aria-pressed\", \"false\");\n\n const highlight = createMarkedElement(document, \"div\");\n highlight.className = \"spotpatch-highlight\";\n highlight.hidden = true;\n const highlightLabel = createMarkedElement(document, \"span\");\n highlightLabel.className = \"spotpatch-highlight-label\";\n highlight.append(highlightLabel);\n const selectionHighlights = createMarkedElement(document, \"div\");\n selectionHighlights.className = \"spotpatch-selection-highlights\";\n selectionHighlights.setAttribute(\"aria-hidden\", \"true\");\n\n const dialog = createMarkedElement(document, \"section\");\n dialog.className = \"spotpatch-dialog\";\n dialog.hidden = true;\n dialog.tabIndex = -1;\n dialog.dataset.placement = \"viewport\";\n dialog.setAttribute(\"role\", \"dialog\");\n dialog.setAttribute(\"aria-labelledby\", \"spotpatch-selection-title\");\n const anchor = createMarkedElement(document, \"span\");\n anchor.className = \"spotpatch-anchor\";\n anchor.setAttribute(\"aria-hidden\", \"true\");\n const shell = createMarkedElement(document, \"div\");\n shell.className = \"spotpatch-shell\";\n\n const header = createMarkedElement(document, \"header\");\n header.className = \"spotpatch-header\";\n const brandRow = createMarkedElement(document, \"div\");\n brandRow.className = \"spotpatch-brand-row\";\n const brand = createMarkedElement(document, \"div\");\n brand.className = \"spotpatch-brand\";\n const brandCopy = createMarkedElement(document, \"span\");\n brandCopy.className = \"spotpatch-brand-copy\";\n const brandName = createMarkedElement(document, \"span\");\n brandName.className = \"spotpatch-brand-name\";\n const brandContext = createMarkedElement(document, \"span\");\n brandContext.className = \"spotpatch-brand-context\";\n brandCopy.append(brandName, brandContext);\n brand.append(createBrandMark(document), brandCopy);\n const headerControls = createMarkedElement(document, \"span\");\n headerControls.className = \"spotpatch-header-controls\";\n const repositoryLink = createMarkedElement(document, \"a\");\n repositoryLink.className = \"spotpatch-repository\";\n repositoryLink.href = SPOTPATCH_REPOSITORY_URL;\n repositoryLink.target = \"_blank\";\n repositoryLink.rel = \"noopener noreferrer\";\n const localeButton = createButton(document, \"\", \"spotpatch-locale\");\n const closeButton = createButton(document, \"×\", \"spotpatch-close\");\n headerControls.append(repositoryLink, localeButton, closeButton);\n brandRow.append(brand, headerControls);\n const title = createMarkedElement(document, \"h2\");\n title.id = \"spotpatch-selection-title\";\n title.className = \"spotpatch-title\";\n const subtitle = createMarkedElement(document, \"p\");\n subtitle.className = \"spotpatch-subtitle\";\n const targetRow = createMarkedElement(document, \"div\");\n targetRow.className = \"spotpatch-target-row\";\n const targetLabel = createMarkedElement(document, \"span\");\n targetLabel.className = \"spotpatch-target-label\";\n const contextState = createMarkedElement(document, \"span\");\n contextState.className = \"spotpatch-context-state\";\n contextState.dataset.state = \"loading\";\n contextState.textContent = messages.context.collecting;\n targetRow.append(targetLabel, contextState);\n header.append(brandRow, title, subtitle, targetRow);\n\n const body = createMarkedElement(document, \"div\");\n body.className = \"spotpatch-body\";\n const selectionPanel = createMarkedElement(document, \"div\");\n selectionPanel.className = \"spotpatch-selection-panel\";\n const targetsPanel = createMarkedElement(document, \"section\");\n targetsPanel.className = \"spotpatch-targets\";\n const targetsHeading = createMarkedElement(document, \"div\");\n targetsHeading.className = \"spotpatch-targets-heading\";\n const targetsTitle = createMarkedElement(document, \"span\");\n const targetsMeta = createMarkedElement(document, \"span\");\n targetsMeta.className = \"spotpatch-targets-meta\";\n const targetComplete = createMarkedElement(document, \"span\");\n targetComplete.className = \"spotpatch-target-complete\";\n const targetBudget = createMarkedElement(document, \"span\");\n targetBudget.className = \"spotpatch-target-budget\";\n targetBudget.setAttribute(\"aria-live\", \"polite\");\n const targetCount = createMarkedElement(document, \"span\");\n targetCount.className = \"spotpatch-target-count\";\n targetsMeta.append(targetComplete, targetBudget);\n targetRow.append(targetCount);\n targetsHeading.append(targetsTitle, targetsMeta);\n const targetProgress = createMarkedElement(document, \"div\");\n targetProgress.className = \"spotpatch-target-progress\";\n targetProgress.setAttribute(\"aria-hidden\", \"true\");\n const targetProgressFill = createMarkedElement(document, \"div\");\n targetProgressFill.className = \"spotpatch-target-progress-fill\";\n targetProgress.append(targetProgressFill);\n const targetList = createMarkedElement(document, \"div\");\n targetList.className = \"spotpatch-target-list\";\n targetsPanel.append(targetsHeading, targetProgress, targetList);\n const diagnostics = createMarkedElement(document, \"details\");\n diagnostics.className = \"spotpatch-diagnostics\";\n const diagnosticsLabel = createMarkedElement(document, \"summary\");\n const diagnosticsTitle = createMarkedElement(document, \"span\");\n const sourcePeek = createMarkedElement(document, \"span\");\n sourcePeek.className = \"spotpatch-source-peek\";\n sourcePeek.textContent = messages.diagnostics.resolving;\n diagnosticsLabel.append(diagnosticsTitle, sourcePeek);\n const summary = createMarkedElement(document, \"pre\");\n summary.className = \"spotpatch-summary\";\n diagnostics.append(diagnosticsLabel, summary);\n const agentPanel = createAgentPanel(document, ai, localizer);\n const changesPanel = createMarkedElement(document, \"div\");\n changesPanel.append(targetsPanel, agentPanel.root);\n const dataFlowPanel =\n getDataFlowExtension()?.createPanel(\n document,\n dataFlowEnabled,\n localizer.locale,\n changesPanel,\n diagnostics,\n placeDialog,\n ) ?? createUnavailableDataFlowPanel(document, changesPanel, diagnostics);\n selectionPanel.append(dataFlowPanel.root);\n\n const previewPanel = createMarkedElement(document, \"div\");\n previewPanel.className = \"spotpatch-preview-panel\";\n previewPanel.hidden = true;\n const promptOutput = createMarkedElement(document, \"pre\");\n promptOutput.className = \"spotpatch-prompt\";\n promptOutput.tabIndex = 0;\n promptOutput.setAttribute(\"aria-label\", messages.diagnostics.promptAriaLabel);\n previewPanel.append(promptOutput);\n body.append(selectionPanel, previewPanel);\n\n const actions = createMarkedElement(document, \"footer\");\n actions.className = \"spotpatch-actions\";\n const editorFeedback = createMarkedElement(document, \"div\");\n editorFeedback.className = \"spotpatch-context-state spotpatch-editor-feedback\";\n editorFeedback.dataset.state = \"idle\";\n editorFeedback.setAttribute(\"role\", \"status\");\n editorFeedback.setAttribute(\"aria-live\", \"polite\");\n editorFeedback.hidden = true;\n const addTargetButton = createButton(document, messages.actions.addElement);\n const reselectButton = createButton(document, messages.actions.reselect);\n const openEditorButton = createButton(document, messages.actions.openEditor);\n const previewButton = createButton(\n document,\n messages.actions.preview,\n \"spotpatch-primary\",\n );\n const copyButton = createButton(document, messages.actions.copy, \"spotpatch-primary\");\n const backButton = createButton(document, messages.actions.back);\n const secondaryActions = createMarkedElement(document, \"div\");\n secondaryActions.className = \"spotpatch-secondary-actions\";\n const primaryActions = createMarkedElement(document, \"div\");\n primaryActions.className = \"spotpatch-primary-actions\";\n addTargetButton.classList.add(\"spotpatch-icon-action\");\n addTargetButton.dataset.compactIcon = \"+\";\n agentPanel.testButton.classList.add(\"spotpatch-icon-action\");\n agentPanel.testButton.dataset.compactIcon = \"✓\";\n openEditorButton.classList.add(\"spotpatch-secondary-action\");\n reselectButton.classList.add(\"spotpatch-secondary-action\");\n secondaryActions.append(openEditorButton, reselectButton);\n primaryActions.append(\n agentPanel.testButton,\n addTargetButton,\n agentPanel.runButton,\n previewButton,\n agentPanel.cancelButton,\n agentPanel.applyButton,\n agentPanel.revertButton,\n agentPanel.resetButton,\n copyButton,\n backButton,\n );\n actions.append(editorFeedback, secondaryActions, primaryActions);\n shell.append(header, body, actions);\n dialog.append(anchor, shell);\n\n const liveRegion = createMarkedElement(document, \"div\");\n liveRegion.className = \"spotpatch-live\";\n liveRegion.setAttribute(\"aria-live\", \"polite\");\n liveRegion.setAttribute(\"aria-atomic\", \"true\");\n\n shadowRoot.append(\n createStyles(document),\n dataFlowPanel.styles,\n selectionHighlights,\n highlight,\n dialog,\n triggerButton,\n liveRegion,\n );\n document.documentElement.append(host);\n\n let currentRect: ElementRect | undefined;\n let activeSelectionRect: ElementRect | undefined;\n let currentStatus: RuntimeStatus = \"idle\";\n let currentCanOpenEditor = false;\n let currentCanPreview = false;\n let currentSummaryText = \"\";\n let editingEnabled = true;\n let currentTargets: readonly SelectionTargetView[] = [];\n let currentMaximum = 0;\n let currentEditorFeedbackState: \"idle\" | \"opening\" | \"success\" | \"error\" = \"idle\";\n let currentDataFlowState: DataFlowViewState = Object.freeze({\n component: Object.freeze({\n status: dataFlowEnabled ? \"idle\" : \"disabled\",\n }),\n page: Object.freeze({ status: dataFlowEnabled ? \"idle\" : \"disabled\" }),\n observationCount: 0,\n });\n\n function renderEditorStatus(state: \"idle\" | \"opening\" | \"success\" | \"error\"): void {\n currentEditorFeedbackState = state;\n editorFeedback.dataset.state = state;\n editorFeedback.hidden = state === \"idle\";\n editorFeedback.textContent =\n state === \"opening\"\n ? messages.announcements.editorOpening\n : state === \"success\"\n ? messages.announcements.editorOpened\n : state === \"error\"\n ? messages.announcements.editorFailed\n : \"\";\n placeDialog();\n }\n\n function statusText(target: SelectionTargetView): string {\n if (target.status === \"ready\") {\n return messages.targets.statusReady;\n }\n\n return target.status === \"warning\"\n ? messages.targets.statusPartial\n : messages.targets.statusCollecting;\n }\n\n function renderTargetProgress(complete: number, total: number): void {\n const ratio = total === 0 ? 0 : complete / total;\n targetProgressFill.style.width = `${String(ratio * 100)}%`;\n }\n\n function instructionInput(targetId?: string): HTMLTextAreaElement | undefined {\n const inputs = targetList.querySelectorAll<HTMLTextAreaElement>(\n \"textarea[data-target-instruction-id]\",\n );\n return Array.from(inputs).find(\n (input) =>\n targetId === undefined || input.dataset.targetInstructionId === targetId,\n );\n }\n\n function renderTargets(\n targets: readonly SelectionTargetView[],\n maximum: number,\n ): void {\n const focusedInstruction = shadowRoot.activeElement?.closest<HTMLTextAreaElement>(\n \"textarea[data-target-instruction-id]\",\n );\n const focusedTargetId = focusedInstruction?.dataset.targetInstructionId;\n const selectionStart = focusedInstruction?.selectionStart;\n const selectionEnd = focusedInstruction?.selectionEnd;\n currentTargets = targets.map((target) => Object.freeze({ ...target }));\n currentMaximum = maximum;\n targetList.replaceChildren();\n const completeCount = targets.filter(\n (target) => target.instruction.trim().length > 0,\n ).length;\n const instructionCharacters = targets.reduce(\n (total, target) => total + target.instruction.trim().length,\n 0,\n );\n renderTargetProgress(completeCount, targets.length);\n targetCount.textContent = messages.targets.count(targets.length, maximum);\n targetComplete.textContent = messages.targets.complete(\n completeCount,\n targets.length,\n );\n const instructionLimitExceeded =\n instructionCharacters > MAX_ANNOTATION_INSTRUCTION_CHARACTERS;\n targetBudget.dataset.state = instructionLimitExceeded ? \"over\" : \"ready\";\n targetBudget.textContent = instructionLimitExceeded\n ? messages.targets.instructionBudgetExceeded(\n instructionCharacters,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n )\n : messages.targets.instructionBudget(\n instructionCharacters,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n );\n addTargetButton.disabled = !editingEnabled || targets.length >= maximum;\n addTargetButton.title =\n targets.length >= maximum\n ? messages.targets.limitTitle(maximum)\n : messages.targets.addTitle;\n targetLabel.textContent =\n targets.length === 1\n ? (targets[0]?.label ?? messages.context.selectedElement)\n : messages.context.selectedCount(targets.length);\n\n for (const [index, target] of targets.entries()) {\n const item = createMarkedElement(document, \"div\");\n item.className = \"spotpatch-target-item\";\n item.dataset.active = String(target.active);\n item.dataset.status = target.status;\n item.dataset.targetId = target.id;\n const targetSummary = createMarkedElement(document, \"div\");\n targetSummary.className = \"spotpatch-target-summary\";\n const select = createButton(document, \"\", \"spotpatch-target-select\");\n select.dataset.activateTargetId = target.id;\n select.setAttribute(\"aria-label\", messages.targets.activate(index + 1));\n select.setAttribute(\"aria-expanded\", String(target.active));\n const number = createMarkedElement(document, \"span\");\n number.className = \"spotpatch-target-index\";\n number.textContent = String(index + 1);\n const copy = createMarkedElement(document, \"span\");\n copy.className = \"spotpatch-target-copy\";\n const name = createMarkedElement(document, \"span\");\n name.className = \"spotpatch-target-name\";\n name.textContent = target.label;\n const source = createMarkedElement(document, \"span\");\n source.className = \"spotpatch-target-source\";\n source.textContent = `${statusText(target)} · ${target.source}`;\n copy.append(name, source);\n const instructionComplete = target.instruction.trim().length > 0;\n const state = createMarkedElement(document, \"span\");\n state.className = \"spotpatch-target-state\";\n state.dataset.complete = String(instructionComplete);\n state.textContent = instructionComplete\n ? messages.targets.instructionReady\n : messages.targets.instructionMissing;\n select.append(number, copy, state);\n const open = createButton(document, \"↗\", \"spotpatch-target-open\");\n open.dataset.openTargetId = target.id;\n open.disabled = !target.canOpenEditor;\n open.setAttribute(\"aria-label\", messages.actions.openTarget(index + 1));\n open.title = messages.actions.openTarget(index + 1);\n const remove = createButton(document, \"×\", \"spotpatch-target-remove\");\n remove.dataset.removeTargetId = target.id;\n remove.disabled = !editingEnabled;\n remove.setAttribute(\"aria-label\", messages.targets.remove(index + 1));\n remove.title = messages.targets.removeTitle;\n targetSummary.append(select, open, remove);\n item.append(targetSummary);\n\n if (target.active) {\n const editor = createMarkedElement(document, \"label\");\n editor.className = \"spotpatch-target-editor\";\n const editorHead = createMarkedElement(document, \"span\");\n editorHead.className = \"spotpatch-target-editor-head\";\n const editorLabel = createMarkedElement(document, \"span\");\n editorLabel.className = \"spotpatch-target-editor-label\";\n editorLabel.textContent = messages.targets.instructionLabel(target.label);\n const characterCount = createMarkedElement(document, \"span\");\n characterCount.className = \"spotpatch-target-editor-count\";\n characterCount.textContent = messages.targets.instructionCount(\n target.instruction.length,\n MAX_TARGET_INSTRUCTION_CHARACTERS,\n );\n editorHead.append(editorLabel, characterCount);\n const input = createMarkedElement(document, \"textarea\");\n input.rows = 4;\n input.maxLength = MAX_TARGET_INSTRUCTION_CHARACTERS;\n input.value = target.instruction;\n input.placeholder = messages.targets.instructionPlaceholder;\n input.disabled = !editingEnabled;\n input.dataset.targetInstructionId = target.id;\n input.setAttribute(\n \"aria-label\",\n messages.targets.instructionLabel(target.label),\n );\n editor.append(editorHead, input);\n item.append(editor);\n }\n\n targetList.append(item);\n }\n\n if (focusedTargetId !== undefined) {\n const replacement = instructionInput(focusedTargetId);\n replacement?.focus({ preventScroll: true });\n\n if (selectionStart !== undefined && selectionEnd !== undefined) {\n replacement?.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n }\n\n function updateTargetInstruction(targetId: string, instruction: string): void {\n currentTargets = currentTargets.map((target) =>\n target.id === targetId ? Object.freeze({ ...target, instruction }) : target,\n );\n const item = Array.from(\n targetList.querySelectorAll<HTMLElement>(\".spotpatch-target-item\"),\n ).find((candidate) => candidate.dataset.targetId === targetId);\n\n if (item === undefined) {\n return;\n }\n\n const complete = instruction.trim().length > 0;\n const state = item.querySelector<HTMLElement>(\".spotpatch-target-state\");\n const count = item.querySelector<HTMLElement>(\".spotpatch-target-editor-count\");\n\n if (state !== null) {\n state.dataset.complete = String(complete);\n state.textContent = complete\n ? messages.targets.instructionReady\n : messages.targets.instructionMissing;\n }\n\n if (count !== null) {\n count.textContent = messages.targets.instructionCount(\n instruction.length,\n MAX_TARGET_INSTRUCTION_CHARACTERS,\n );\n }\n\n const completeCount = currentTargets.filter(\n (target) => target.instruction.trim().length > 0,\n ).length;\n targetComplete.textContent = messages.targets.complete(\n completeCount,\n currentTargets.length,\n );\n renderTargetProgress(completeCount, currentTargets.length);\n const instructionCharacters = currentTargets.reduce(\n (total, target) => total + target.instruction.trim().length,\n 0,\n );\n const instructionLimitExceeded =\n instructionCharacters > MAX_ANNOTATION_INSTRUCTION_CHARACTERS;\n targetBudget.dataset.state = instructionLimitExceeded ? \"over\" : \"ready\";\n targetBudget.textContent = instructionLimitExceeded\n ? messages.targets.instructionBudgetExceeded(\n instructionCharacters,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n )\n : messages.targets.instructionBudget(\n instructionCharacters,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n );\n }\n\n function showSelectionHighlights(targets: readonly SelectionHighlightView[]): void {\n selectionHighlights.replaceChildren();\n activeSelectionRect = targets.find((target) => target.active)?.rect;\n currentRect = activeSelectionRect;\n\n for (const [index, target] of targets.entries()) {\n const box = createMarkedElement(document, \"div\");\n box.className = \"spotpatch-selection-highlight\";\n box.dataset.targetId = target.id;\n box.dataset.active = String(target.active);\n box.style.transform = `translate(${String(target.rect.x)}px, ${String(target.rect.y)}px)`;\n box.style.width = `${String(target.rect.width)}px`;\n box.style.height = `${String(target.rect.height)}px`;\n const label = createMarkedElement(document, \"span\");\n label.textContent = `${String(index + 1)} · ${target.label}`;\n box.append(label);\n selectionHighlights.append(box);\n }\n\n placeDialog();\n }\n\n function placeDialog(): void {\n if (dialog.hidden) {\n return;\n }\n\n const view = document.defaultView;\n const viewportWidth = view?.innerWidth ?? document.documentElement.clientWidth;\n const viewportHeight = view?.innerHeight ?? document.documentElement.clientHeight;\n const measured = dialog.getBoundingClientRect();\n const status = currentStatus === \"previewing\" ? \"previewing\" : \"selected\";\n const dialogWidth =\n measured.width > 0\n ? measured.width\n : Math.min(DIALOG_MAX_WIDTH, viewportWidth - 32);\n const dialogHeight =\n measured.height > 0\n ? measured.height\n : Math.min(DIALOG_FALLBACK_HEIGHT[status], viewportHeight - 32);\n const placement = calculateDialogPlacement({\n dialogWidth,\n dialogHeight,\n viewportWidth,\n viewportHeight,\n ...(currentRect === undefined ? {} : { target: currentRect }),\n });\n\n dialog.style.left = `${String(placement.left)}px`;\n dialog.style.top = `${String(placement.top)}px`;\n dialog.style.setProperty(\"--spotpatch-anchor-x\", `${String(placement.anchorX)}px`);\n dialog.style.setProperty(\"--spotpatch-anchor-y\", `${String(placement.anchorY)}px`);\n dialog.dataset.placement = placement.mode;\n }\n\n function updateContextOverview(summaryText: string): void {\n const summaryMessages = messages.summary;\n const source = summaryLine(summaryText, summaryMessages.source);\n sourcePeek.textContent = source ?? messages.diagnostics.noExactSource;\n const browserReady = `${summaryMessages.browserContext}: ${summaryMessages.collectionStatuses.ready}`;\n const browserLoading = `${summaryMessages.browserContext}: ${summaryMessages.collectionStatuses.loading}`;\n const browserFailed = `${summaryMessages.browserContext}: ${summaryMessages.collectionStatuses.failed}`;\n const apiLoading = `${summaryMessages.api}: ${summaryMessages.apiStatuses.loading}`;\n const apiFailed = `${summaryMessages.api}: ${summaryMessages.apiStatuses.failed}`;\n\n if (\n summaryText.includes(browserReady) &&\n !summaryText.includes(browserLoading) &&\n !summaryText.includes(apiLoading) &&\n !summaryText.includes(browserFailed) &&\n !summaryText.includes(apiFailed)\n ) {\n contextState.dataset.state = \"ready\";\n contextState.textContent = messages.context.ready;\n } else if (summaryText.includes(browserFailed) || summaryText.includes(apiFailed)) {\n contextState.dataset.state = \"warning\";\n contextState.textContent = messages.context.partial;\n } else {\n contextState.dataset.state = \"loading\";\n contextState.textContent = messages.context.collecting;\n }\n }\n\n function updateSelection(\n summaryText: string,\n canOpenEditor: boolean,\n canPreview: boolean,\n ): void {\n currentCanOpenEditor = canOpenEditor;\n currentCanPreview = canPreview;\n currentSummaryText = summaryText;\n summary.textContent = summaryText;\n openEditorButton.disabled = !canOpenEditor;\n previewButton.disabled = !canPreview;\n agentPanel.setContextReady(canPreview);\n updateContextOverview(summaryText);\n placeDialog();\n }\n\n function renderPanelStatus(status: RuntimeStatus): void {\n currentStatus = status;\n const selected = status === \"selected\";\n const previewing = status === \"previewing\";\n triggerButton.hidden = selected || previewing;\n selectionPanel.hidden = !selected;\n previewPanel.hidden = !previewing;\n reselectButton.hidden = !selected;\n addTargetButton.hidden = !selected;\n openEditorButton.hidden = !selected;\n previewButton.hidden = !selected;\n secondaryActions.hidden = !selected;\n agentPanel.setSelectionVisible(selected);\n copyButton.hidden = !previewing;\n backButton.hidden = !previewing;\n title.textContent = previewing\n ? messages.dialog.previewTitle\n : messages.dialog.editTitle;\n subtitle.textContent = previewing\n ? messages.dialog.previewSubtitle\n : messages.dialog.editSubtitle;\n placeDialog();\n }\n\n function applyMessages(): void {\n messages = localizer.messages();\n brandName.textContent = messages.brand.name;\n brandContext.textContent = messages.brand.context;\n repositoryLink.textContent = messages.brand.repository;\n repositoryLink.title = messages.brand.repositoryTitle;\n repositoryLink.setAttribute(\"aria-label\", messages.brand.repositoryTitle);\n localeButton.textContent = messages.alternateLocaleName;\n localeButton.title = messages.switchLocale;\n localeButton.setAttribute(\"aria-label\", messages.switchLocale);\n closeButton.setAttribute(\"aria-label\", messages.dialog.close);\n closeButton.title = messages.dialog.close;\n targetsPanel.setAttribute(\"aria-label\", messages.targets.ariaLabel);\n targetsTitle.textContent = messages.targets.title;\n diagnosticsTitle.textContent = messages.diagnostics.title;\n promptOutput.setAttribute(\"aria-label\", messages.diagnostics.promptAriaLabel);\n addTargetButton.textContent = messages.actions.addElement;\n reselectButton.textContent = messages.actions.reselect;\n openEditorButton.textContent = messages.actions.openEditor;\n previewButton.textContent = messages.actions.preview;\n copyButton.textContent = messages.actions.copy;\n backButton.textContent = messages.actions.back;\n dataFlowPanel.render(currentDataFlowState);\n triggerButton.title = messages.trigger.title(shortcut);\n triggerButton.textContent =\n currentStatus === \"inspecting\" ? messages.trigger.stop : messages.trigger.select;\n renderPanelStatus(currentStatus);\n renderEditorStatus(currentEditorFeedbackState);\n\n if (currentTargets.length > 0) {\n renderTargets(currentTargets, currentMaximum);\n } else {\n targetCount.textContent = messages.targets.count(0, currentMaximum);\n targetComplete.textContent = messages.targets.complete(0, 0);\n renderTargetProgress(0, 0);\n targetBudget.dataset.state = \"ready\";\n targetBudget.textContent = messages.targets.instructionBudget(\n 0,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n );\n targetLabel.textContent = messages.context.selectedElement;\n }\n\n if (currentSummaryText.length > 0) {\n updateContextOverview(currentSummaryText);\n } else {\n sourcePeek.textContent = messages.diagnostics.resolving;\n contextState.textContent = messages.context.collecting;\n }\n }\n\n diagnostics.addEventListener(\"toggle\", placeDialog);\n localeButton.addEventListener(\"click\", localizer.toggle);\n const unsubscribeLocale = localizer.subscribe(applyMessages);\n applyMessages();\n\n return Object.freeze({\n host,\n triggerButton,\n addTargetButton,\n targetList,\n reselectButton,\n openEditorButton,\n repositoryLink,\n previewButton,\n copyButton,\n dataFlowRefreshButton: dataFlowPanel.refreshButton,\n backButton,\n closeButton,\n agentProviderSelect: agentPanel.providerSelect,\n agentModelSelect: agentPanel.modelSelect,\n agentModeSelect: agentPanel.modeSelect,\n agentConsentCheckbox: agentPanel.consentCheckbox,\n agentWorkspaceConsentCheckbox: agentPanel.workspaceConsentCheckbox,\n agentTestButton: agentPanel.testButton,\n agentRunButton: agentPanel.runButton,\n agentCancelButton: agentPanel.cancelButton,\n agentApplyButton: agentPanel.applyButton,\n agentRevertButton: agentPanel.revertButton,\n agentResetButton: agentPanel.resetButton,\n\n renderStatus(status: RuntimeStatus): void {\n const inspecting = status === \"inspecting\";\n triggerButton.setAttribute(\"aria-pressed\", String(inspecting));\n triggerButton.textContent = inspecting\n ? messages.trigger.stop\n : messages.trigger.select;\n renderPanelStatus(status);\n },\n\n renderEditorStatus,\n\n renderDataFlow(state: DataFlowViewState): void {\n currentDataFlowState = state;\n dataFlowPanel.render(state);\n placeDialog();\n },\n\n showHighlight(rect: ElementRect, label: string): void {\n currentRect = rect;\n highlight.hidden = false;\n highlight.style.transform = `translate(${String(rect.x)}px, ${String(rect.y)}px)`;\n highlight.style.width = `${String(rect.width)}px`;\n highlight.style.height = `${String(rect.height)}px`;\n highlightLabel.textContent = label;\n targetLabel.textContent = label;\n placeDialog();\n },\n\n hideHighlight(): void {\n currentRect = activeSelectionRect;\n highlight.hidden = true;\n highlightLabel.textContent = \"\";\n placeDialog();\n },\n\n showSelectionHighlights,\n\n hideSelectionHighlights(): void {\n selectionHighlights.replaceChildren();\n activeSelectionRect = undefined;\n currentRect = undefined;\n placeDialog();\n },\n\n showSelection(\n summaryText: string,\n canOpenEditor: boolean,\n canPreview: boolean,\n ): void {\n updateSelection(summaryText, canOpenEditor, canPreview);\n triggerButton.hidden = true;\n dialog.hidden = false;\n placeDialog();\n },\n\n updateSelection,\n\n renderTargets,\n\n updateTargetInstruction,\n\n setPreviewEnabled(enabled: boolean): void {\n currentCanPreview = enabled;\n previewButton.disabled = !enabled;\n agentPanel.setContextReady(enabled);\n },\n\n hideSelection(): void {\n dialog.hidden = true;\n triggerButton.hidden = false;\n targetList.replaceChildren();\n currentTargets = [];\n currentMaximum = 0;\n currentSummaryText = \"\";\n renderEditorStatus(\"idle\");\n targetCount.textContent = messages.targets.count(0, 0);\n targetComplete.textContent = messages.targets.complete(0, 0);\n renderTargetProgress(0, 0);\n targetLabel.textContent = messages.context.selectedElement;\n summary.textContent = \"\";\n promptOutput.textContent = \"\";\n sourcePeek.textContent = messages.diagnostics.resolving;\n contextState.dataset.state = \"loading\";\n contextState.textContent = messages.context.collecting;\n openEditorButton.disabled = true;\n previewButton.disabled = true;\n currentCanOpenEditor = false;\n currentCanPreview = false;\n agentPanel.setContextReady(false);\n agentPanel.setSelectionVisible(false);\n agentPanel.setEditingEnabled(true);\n agentPanel.resetJob();\n dataFlowPanel.resetView();\n },\n\n hideSelectionTemporarily(): void {\n dialog.hidden = true;\n triggerButton.hidden = false;\n },\n\n showPreview(prompt: string): void {\n promptOutput.textContent = prompt;\n placeDialog();\n },\n\n readAgentSelection(): AgentSelectionValue | undefined {\n return agentPanel.readSelection();\n },\n\n agentConsentGranted(): boolean {\n return agentPanel.consentGranted();\n },\n\n setAgentProviderConsent(granted: boolean): void {\n agentPanel.setProviderConsent(granted);\n },\n\n setAgentEditingEnabled(enabled: boolean): void {\n editingEnabled = enabled;\n addTargetButton.disabled = !enabled;\n reselectButton.disabled = !enabled;\n targetList\n .querySelectorAll<HTMLButtonElement | HTMLTextAreaElement>(\n \".spotpatch-target-remove, .spotpatch-target-select, textarea[data-target-instruction-id]\",\n )\n .forEach((control) => {\n control.disabled = !enabled;\n });\n openEditorButton.disabled = !currentCanOpenEditor;\n previewButton.disabled = !enabled || !currentCanPreview;\n agentPanel.setEditingEnabled(enabled);\n placeDialog();\n },\n\n renderAgentCapability(\n state: \"idle\" | \"probing\" | \"ready\" | \"error\",\n message: string,\n capabilitySnapshot?: AgentCapabilitySnapshot,\n errorCode?: ErrorCode,\n ): void {\n agentPanel.renderCapability(state, message, capabilitySnapshot, errorCode);\n const agentReady =\n state === \"ready\" && capabilitySnapshot?.state === \"agent-ready\";\n previewButton.classList.toggle(\"spotpatch-primary\", !agentReady);\n placeDialog();\n },\n\n renderAgentWorkspaceHealth(\n state: \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\",\n snapshot?: AgentWorkspaceHealthSnapshot,\n errorCode?: ErrorCode,\n ): void {\n agentPanel.renderWorkspaceHealth(state, snapshot, errorCode);\n placeDialog();\n },\n\n renderAgentJob(\n snapshot: AgentJobSnapshot,\n result: AgentJobResult | undefined,\n activities: readonly AgentActivityItem[],\n errorCode?: ErrorCode,\n ): void {\n agentPanel.renderJob(snapshot, result, activities, errorCode);\n placeDialog();\n },\n\n resetAgentJob(): void {\n agentPanel.resetJob();\n placeDialog();\n },\n\n focusTargetInstruction(targetId?: string): void {\n instructionInput(targetId)?.focus({ preventScroll: true });\n },\n\n focusPrompt(): void {\n promptOutput.focus({ preventScroll: true });\n },\n\n announce(message: string): void {\n liveRegion.textContent = \"\";\n liveRegion.textContent = message;\n },\n\n locale: localizer.locale,\n\n messages: localizer.messages,\n\n agentWorkspaceConsentGranted: agentPanel.workspaceConsentGranted,\n\n subscribeLocale: localizer.subscribe,\n\n dispose(): void {\n diagnostics.removeEventListener(\"toggle\", placeDialog);\n localeButton.removeEventListener(\"click\", localizer.toggle);\n unsubscribeLocale();\n dataFlowPanel.dispose();\n agentPanel.dispose();\n host.remove();\n },\n });\n}\n","import { UI_MARKER_ATTRIBUTE } from \"./ui-constants.js\";\n\nexport function createMarkedElement<K extends keyof HTMLElementTagNameMap>(\n document: Document,\n tagName: K,\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName);\n element.setAttribute(UI_MARKER_ATTRIBUTE, \"\");\n return element;\n}\n\nexport function createButton(\n document: Document,\n label: string,\n className = \"\",\n): HTMLButtonElement {\n const button = createMarkedElement(document, \"button\");\n button.type = \"button\";\n button.className = className;\n button.textContent = label;\n return button;\n}\n","import type {\n AgentCapabilitySnapshot,\n AgentJobResult,\n AgentJobSnapshot,\n AgentWorkspaceHealthSnapshot,\n AgentApplyMode,\n ErrorCode,\n RuntimeAiConfig,\n RuntimeAiProviderProfile,\n} from \"@spotpatch/shared\";\n\nimport { createButton, createMarkedElement } from \"./dom.js\";\nimport type { UiLocalizer, UiMessages } from \"./localization.js\";\n\nexport interface AgentSelectionValue {\n readonly applyMode: AgentApplyMode;\n readonly modelProfileId: string;\n readonly providerProfileId: string;\n}\n\nexport interface AgentActivityItem {\n readonly key: string;\n readonly label: string;\n readonly state: \"active\" | \"success\" | \"failure\" | \"info\";\n}\n\nexport interface AgentPanel {\n readonly applyButton: HTMLButtonElement;\n readonly cancelButton: HTMLButtonElement;\n readonly consentCheckbox: HTMLInputElement;\n readonly workspaceConsentCheckbox: HTMLInputElement;\n readonly modelSelect: HTMLSelectElement;\n readonly modeSelect: HTMLSelectElement;\n readonly providerSelect: HTMLSelectElement;\n readonly resetButton: HTMLButtonElement;\n readonly revertButton: HTMLButtonElement;\n readonly root: HTMLElement;\n readonly runButton: HTMLButtonElement;\n readonly testButton: HTMLButtonElement;\n readonly consentGranted: () => boolean;\n readonly workspaceConsentGranted: () => boolean;\n readonly dispose: () => void;\n readonly readSelection: () => AgentSelectionValue | undefined;\n readonly renderCapability: (\n state: \"idle\" | \"probing\" | \"ready\" | \"error\",\n message: string,\n capability?: AgentCapabilitySnapshot,\n errorCode?: ErrorCode,\n ) => void;\n readonly renderJob: (\n snapshot: AgentJobSnapshot,\n result: AgentJobResult | undefined,\n activities: readonly AgentActivityItem[],\n errorCode?: ErrorCode,\n ) => void;\n readonly renderWorkspaceHealth: (\n state: \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\",\n snapshot?: AgentWorkspaceHealthSnapshot,\n errorCode?: ErrorCode,\n ) => void;\n readonly resetJob: () => void;\n readonly setContextReady: (ready: boolean) => void;\n readonly setEditingEnabled: (enabled: boolean) => void;\n readonly setProviderConsent: (granted: boolean) => void;\n readonly setSelectionVisible: (visible: boolean) => void;\n}\n\nexport const AGENT_PANEL_STYLES = `\n .spotpatch-agent {\n margin-top: 10px;\n overflow: hidden;\n border: 1px solid var(--spotpatch-border-subtle);\n border-radius: var(--spotpatch-radius-card);\n background: rgb(255 255 255 / 2.5%);\n }\n .spotpatch-agent-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 10px 12px;\n border-bottom: 1px solid rgb(255 255 255 / 7%);\n }\n .spotpatch-agent-title { color: #eef0f5; font-size: 13px; font-weight: 650; }\n .spotpatch-agent-badge {\n border: 1px solid rgb(129 112 247 / 24%);\n border-radius: 999px;\n padding: 3px 7px;\n color: #c5cafa;\n background: rgb(109 93 246 / 9%);\n font-size: 10px;\n font-weight: 650;\n }\n .spotpatch-agent-setup { padding: 12px; }\n .spotpatch-agent-selectors { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }\n .spotpatch-agent-mode { grid-column: 1 / -1; }\n .spotpatch-agent-selectors label { min-width: 0; color: var(--spotpatch-text-secondary); font-size: 11.5px; font-weight: 580; }\n .spotpatch-agent select {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n min-height: 34px;\n margin-top: 4px;\n border: 1px solid var(--spotpatch-border);\n border-radius: 8px;\n padding: 7px 32px 7px 9px;\n color: #e8ebf2;\n color-scheme: dark;\n background: linear-gradient(180deg, rgb(255 255 255 / 4%), rgb(255 255 255 / 2%));\n font-size: 12px;\n font-weight: 560;\n line-height: 1.35;\n outline: none;\n transition: 160ms ease;\n }\n .spotpatch-agent select:hover { border-color: rgb(148 163 184 / 38%); background-color: rgb(255 255 255 / 5%); }\n .spotpatch-agent select:focus-visible { border-color: rgb(139 124 247 / 76%); box-shadow: 0 0 0 3px rgb(109 93 246 / 18%); }\n .spotpatch-agent select option { min-height: 42px; color: #e8ebf2; background: #10151e; }\n @supports (appearance: base-select) {\n .spotpatch-agent select,\n ::picker(select) { appearance: base-select; }\n .spotpatch-agent select { padding: 7px 9px; }\n .spotpatch-agent select::picker-icon {\n color: #9da6b5;\n transition: rotate 180ms cubic-bezier(.2, .8, .2, 1);\n }\n .spotpatch-agent select:open::picker-icon { rotate: 180deg; color: #c4b5fd; }\n .spotpatch-agent select::picker(select) {\n top: calc(anchor(bottom) + 7px);\n left: anchor(left);\n width: anchor-size(width);\n max-height: min(280px, 40vh);\n margin: 0;\n overflow: auto;\n border: 1px solid rgb(139 124 247 / 28%);\n border-radius: 12px;\n padding: 6px;\n background: #10151e;\n box-shadow: 0 18px 50px rgb(0 0 0 / 38%);\n opacity: 1;\n transform: translateY(0) scale(1);\n transition: opacity 150ms ease, transform 180ms cubic-bezier(.2, .8, .2, 1), overlay 180ms allow-discrete, display 180ms allow-discrete;\n }\n @starting-style {\n .spotpatch-agent select::picker(select):popover-open {\n opacity: 0;\n transform: translateY(-5px) scale(.985);\n }\n }\n .spotpatch-agent select option {\n min-height: 42px;\n border-radius: 8px;\n padding: 10px 12px;\n color: #dfe4ee;\n background: transparent;\n cursor: pointer;\n }\n .spotpatch-agent select option:hover,\n .spotpatch-agent select option:focus { color: #fff; background: rgb(109 93 246 / 16%); }\n .spotpatch-agent select option:checked { color: #fff; background: rgb(109 93 246 / 24%); }\n .spotpatch-agent select option::checkmark { color: #8b7cf7; }\n }\n .spotpatch-agent select:focus-visible,\n .spotpatch-consent input:focus-visible {\n outline: 2px solid #8b7cf7;\n outline-offset: 2px;\n }\n .spotpatch-consent {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-top: 10px;\n color: var(--spotpatch-text-secondary);\n cursor: pointer;\n font-size: 11.5px;\n line-height: 1.5;\n }\n .spotpatch-consent input { width: 14px; height: 14px; flex: none; margin: 2px 0 0; accent-color: var(--spotpatch-accent); }\n .spotpatch-trusted-consent {\n border: 1px solid rgb(251 191 36 / 20%);\n border-radius: 10px;\n padding: 9px 10px;\n color: #e5e7eb;\n background: rgb(120 53 15 / 10%);\n }\n .spotpatch-workspace-consent {\n margin-top: 9px;\n border: 1px solid rgb(251 191 36 / 18%);\n border-radius: 10px;\n padding: 9px 10px;\n background: rgb(120 53 15 / 9%);\n }\n .spotpatch-workspace-consent strong { display: block; color: #fde68a; font-size: 11.5px; font-weight: 620; }\n .spotpatch-workspace-consent small { display: block; margin-top: 2px; color: #aeb6c4; font-size: 10.5px; line-height: 1.45; }\n .spotpatch-agent-health-list { display: grid; gap: 6px; margin-top: 10px; }\n .spotpatch-agent-workspace,\n .spotpatch-agent-capability {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n color: #929bab;\n font-size: 11px;\n }\n .spotpatch-agent-capability::before {\n width: 6px;\n height: 6px;\n flex: none;\n border-radius: 999px;\n background: #64748b;\n content: \"\";\n }\n .spotpatch-agent-capability[data-state=\"probing\"]::before { background: var(--spotpatch-warning); }\n .spotpatch-agent-capability[data-state=\"ready\"] { color: #a7f3d0; }\n .spotpatch-agent-capability[data-state=\"ready\"]::before { background: var(--spotpatch-success); }\n .spotpatch-agent-capability[data-state=\"error\"] { color: #fecaca; }\n .spotpatch-agent-capability[data-state=\"error\"]::before { background: var(--spotpatch-danger); }\n .spotpatch-agent-workspace::before {\n width: 6px;\n height: 6px;\n flex: none;\n border-radius: 999px;\n background: #64748b;\n content: \"\";\n }\n .spotpatch-agent-workspace[data-state=\"checking\"]::before { background: var(--spotpatch-warning); }\n .spotpatch-agent-workspace[data-state=\"ready\"] { color: #a7f3d0; }\n .spotpatch-agent-workspace[data-state=\"ready\"]::before { background: var(--spotpatch-success); }\n .spotpatch-agent-workspace[data-state=\"consent-required\"] { color: #fde68a; }\n .spotpatch-agent-workspace[data-state=\"consent-required\"]::before { background: #fbbf24; }\n .spotpatch-agent-workspace[data-state=\"blocked\"] { color: #fecaca; }\n .spotpatch-agent-workspace[data-state=\"blocked\"]::before { background: var(--spotpatch-danger); }\n .spotpatch-agent-job { padding: 12px; }\n .spotpatch-agent-job-meta { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n .spotpatch-agent-model { min-width: 0; overflow: hidden; color: #d6dafe; font-size: 13px; text-overflow: ellipsis; white-space: nowrap; }\n .spotpatch-agent-status {\n flex: none;\n border-radius: 999px;\n padding: 3px 7px;\n color: #bae6fd;\n background: rgb(14 116 144 / 20%);\n font-size: 11px;\n font-weight: 650;\n }\n .spotpatch-agent-phase { margin: 12px 0 0; color: #e2e5ec; font-size: 13px; line-height: 1.55; }\n .spotpatch-agent-error {\n margin: 9px 0 0;\n border: 1px solid rgb(251 113 133 / 22%);\n border-radius: 9px;\n padding: 9px 10px;\n color: #fecaca;\n background: rgb(127 29 29 / 14%);\n font-size: 12px;\n }\n .spotpatch-agent-activity { display: grid; gap: 5px; margin: 9px 0 0; padding: 0; list-style: none; }\n .spotpatch-agent-activity li { display: flex; gap: 8px; color: #929bab; font: 11.5px/1.55 ui-monospace, SFMono-Regular, Menlo, monospace; }\n .spotpatch-agent-activity li::before { color: #64748b; content: \"•\"; }\n .spotpatch-agent-activity li[data-state=\"active\"]::before { color: #fbbf24; }\n .spotpatch-agent-activity li[data-state=\"success\"]::before { color: #34d399; }\n .spotpatch-agent-activity li[data-state=\"failure\"]::before { color: #fb7185; }\n .spotpatch-agent-result { margin-top: 11px; border-top: 1px solid rgb(148 163 184 / 10%); padding-top: 10px; }\n .spotpatch-agent-summary { margin: 0; color: #dce1eb; font-size: 13px; line-height: 1.6; white-space: pre-wrap; }\n .spotpatch-agent-files { display: grid; gap: 4px; margin: 9px 0 0; padding: 0; list-style: none; }\n .spotpatch-agent-files li { color: #bbc2f7; font: 11.5px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; overflow-wrap: anywhere; }\n .spotpatch-agent-checks { display: grid; gap: 5px; margin-top: 9px; }\n .spotpatch-agent-checks details { border: 1px solid rgb(148 163 184 / 12%); border-radius: 8px; background: rgb(2 6 23 / 30%); }\n .spotpatch-agent-checks summary { padding: 9px 10px; color: #cbd0db; cursor: pointer; font-size: 11.5px; }\n .spotpatch-agent-checks pre { max-height: 140px; margin: 0; overflow: auto; border-top: 1px solid rgb(255 255 255 / 7%); padding: 10px; color: #929bab; font: 11px/1.55 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; }\n .spotpatch-agent-diff {\n max-height: 300px;\n margin: 9px 0 0;\n overflow: auto;\n border: 1px solid rgb(129 140 248 / 18%);\n border-radius: 9px;\n padding: 8px;\n color: #cbd5e1;\n background: rgb(2 6 23 / 66%);\n font: 11.5px/1.6 ui-monospace, SFMono-Regular, Menlo, monospace;\n overflow-wrap: normal;\n white-space: pre;\n user-select: text;\n }\n @media (max-width: 520px) {\n .spotpatch-agent-selectors { grid-template-columns: 1fr; }\n .spotpatch-agent-mode { grid-column: auto; }\n }\n`;\n\nfunction addOption(\n document: Document,\n select: HTMLSelectElement,\n value: string,\n label: string,\n): HTMLOptionElement {\n const option = document.createElement(\"option\");\n option.value = value;\n option.textContent = label;\n select.append(option);\n return option;\n}\n\nexport function createAgentPanel(\n document: Document,\n ai: RuntimeAiConfig,\n localizer: UiLocalizer,\n): AgentPanel {\n let messages: UiMessages = localizer.messages();\n const root = createMarkedElement(document, \"section\");\n root.className = \"spotpatch-agent\";\n root.hidden = !ai.enabled;\n const header = createMarkedElement(document, \"div\");\n header.className = \"spotpatch-agent-head\";\n const title = createMarkedElement(document, \"span\");\n title.className = \"spotpatch-agent-title\";\n const badge = createMarkedElement(document, \"span\");\n badge.className = \"spotpatch-agent-badge\";\n header.append(title, badge);\n\n const setup = createMarkedElement(document, \"div\");\n setup.className = \"spotpatch-agent-setup\";\n const selectors = createMarkedElement(document, \"div\");\n selectors.className = \"spotpatch-agent-selectors\";\n const modeLabel = createMarkedElement(document, \"label\");\n modeLabel.className = \"spotpatch-agent-mode\";\n const modeText = createMarkedElement(document, \"span\");\n const modeSelect = createMarkedElement(document, \"select\");\n modeLabel.append(modeText, modeSelect);\n const providerLabel = createMarkedElement(document, \"label\");\n const providerText = createMarkedElement(document, \"span\");\n const providerSelect = createMarkedElement(document, \"select\");\n providerLabel.append(providerText, providerSelect);\n const modelLabel = createMarkedElement(document, \"label\");\n const modelText = createMarkedElement(document, \"span\");\n const modelSelect = createMarkedElement(document, \"select\");\n modelLabel.append(modelText, modelSelect);\n selectors.append(modeLabel, providerLabel, modelLabel);\n const consent = createMarkedElement(document, \"label\");\n consent.className = \"spotpatch-consent\";\n const consentCheckbox = createMarkedElement(document, \"input\");\n consentCheckbox.type = \"checkbox\";\n const consentText = createMarkedElement(document, \"span\");\n consent.append(consentCheckbox, consentText);\n const workspaceConsent = createMarkedElement(document, \"label\");\n workspaceConsent.className = \"spotpatch-consent spotpatch-workspace-consent\";\n workspaceConsent.hidden = true;\n const workspaceConsentCheckbox = createMarkedElement(document, \"input\");\n workspaceConsentCheckbox.type = \"checkbox\";\n const workspaceConsentContent = createMarkedElement(document, \"span\");\n const workspaceConsentTitle = createMarkedElement(document, \"strong\");\n const workspaceConsentHelp = createMarkedElement(document, \"small\");\n workspaceConsentContent.append(workspaceConsentTitle, workspaceConsentHelp);\n workspaceConsent.append(workspaceConsentCheckbox, workspaceConsentContent);\n const healthList = createMarkedElement(document, \"div\");\n healthList.className = \"spotpatch-agent-health-list\";\n const workspace = createMarkedElement(document, \"p\");\n workspace.className = \"spotpatch-agent-workspace\";\n workspace.dataset.state = \"idle\";\n const capability = createMarkedElement(document, \"p\");\n capability.className = \"spotpatch-agent-capability\";\n capability.dataset.state = \"idle\";\n healthList.append(workspace, capability);\n setup.append(selectors, consent, workspaceConsent, healthList);\n\n const job = createMarkedElement(document, \"div\");\n job.className = \"spotpatch-agent-job\";\n job.hidden = true;\n const jobMeta = createMarkedElement(document, \"div\");\n jobMeta.className = \"spotpatch-agent-job-meta\";\n const jobModel = createMarkedElement(document, \"span\");\n jobModel.className = \"spotpatch-agent-model\";\n const jobStatus = createMarkedElement(document, \"span\");\n jobStatus.className = \"spotpatch-agent-status\";\n jobMeta.append(jobModel, jobStatus);\n const phase = createMarkedElement(document, \"p\");\n phase.className = \"spotpatch-agent-phase\";\n const error = createMarkedElement(document, \"p\");\n error.className = \"spotpatch-agent-error\";\n error.hidden = true;\n const activity = createMarkedElement(document, \"ul\");\n activity.className = \"spotpatch-agent-activity\";\n const resultPanel = createMarkedElement(document, \"div\");\n resultPanel.className = \"spotpatch-agent-result\";\n resultPanel.hidden = true;\n const resultSummary = createMarkedElement(document, \"p\");\n resultSummary.className = \"spotpatch-agent-summary\";\n const files = createMarkedElement(document, \"ul\");\n files.className = \"spotpatch-agent-files\";\n const checks = createMarkedElement(document, \"div\");\n checks.className = \"spotpatch-agent-checks\";\n const diff = createMarkedElement(document, \"pre\");\n diff.className = \"spotpatch-agent-diff\";\n diff.tabIndex = 0;\n diff.setAttribute(\"aria-label\", messages.agent.diffAriaLabel);\n resultPanel.append(resultSummary, files, checks, diff);\n job.append(jobMeta, phase, error, activity, resultPanel);\n root.append(header, setup, job);\n\n const testButton = createButton(document, messages.agent.testConnection);\n const runButton = createButton(document, messages.agent.run, \"spotpatch-run\");\n const cancelButton = createButton(document, messages.agent.cancel);\n const applyButton = createButton(document, messages.agent.apply, \"spotpatch-primary\");\n const revertButton = createButton(document, messages.agent.revert);\n const resetButton = createButton(document, messages.agent.revise);\n\n const providers = ai.enabled ? ai.providers : [];\n const trustedFastModeAvailable = ai.enabled && ai.applyMode === \"trusted-auto\";\n const configuredApplyMode = ai.enabled ? ai.applyMode : \"review\";\n const providerById = new Map(providers.map((provider) => [provider.id, provider]));\n let contextReady = false;\n let editingEnabled = true;\n let selectionVisible = false;\n let jobPresented = false;\n let capabilityProbing = false;\n let capabilityReady = false;\n let latestSnapshot: AgentJobSnapshot | undefined;\n let latestResult: AgentJobResult | undefined;\n let latestActivities: readonly AgentActivityItem[] = [];\n let latestErrorCode: ErrorCode | undefined;\n let latestCapabilityState: \"idle\" | \"probing\" | \"ready\" | \"error\" = \"idle\";\n let latestCapabilityMessage = messages.agent.connectionNotTested;\n let latestCapabilityErrorCode: ErrorCode | undefined;\n let latestWorkspaceState:\n \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\" = \"idle\";\n let latestWorkspaceSnapshot: AgentWorkspaceHealthSnapshot | undefined;\n let latestWorkspaceErrorCode: ErrorCode | undefined;\n\n for (const provider of providers) {\n addOption(document, providerSelect, provider.id, provider.label);\n }\n\n if (ai.enabled) {\n providerSelect.value = ai.defaultProvider;\n }\n\n let reviewOption: HTMLOptionElement | undefined;\n let trustedOption: HTMLOptionElement | undefined;\n let autoOption: HTMLOptionElement | undefined;\n\n if (configuredApplyMode === \"auto\") {\n autoOption = addOption(document, modeSelect, \"auto\", messages.agent.autoGated);\n } else {\n reviewOption = addOption(document, modeSelect, \"review\", messages.agent.review);\n\n if (trustedFastModeAvailable) {\n trustedOption = addOption(\n document,\n modeSelect,\n \"trusted-auto\",\n messages.agent.trustedFast,\n );\n }\n }\n\n const defaultApplyMode = trustedFastModeAvailable ? \"review\" : configuredApplyMode;\n modeSelect.value = defaultApplyMode;\n modeLabel.hidden = !trustedFastModeAvailable;\n\n const selectedApplyMode = (): AgentApplyMode =>\n modeSelect.value === \"trusted-auto\" ? \"trusted-auto\" : defaultApplyMode;\n const trustedFastMode = (): boolean => selectedApplyMode() === \"trusted-auto\";\n\n const selectedProvider = (): RuntimeAiProviderProfile | undefined =>\n providerById.get(providerSelect.value);\n\n const consentMessage = (provider: RuntimeAiProviderProfile | undefined): string => {\n if (provider === undefined) {\n return messages.agent.providerUnavailable;\n }\n\n return trustedFastMode()\n ? messages.agent.trustedFastConsent(provider.label)\n : messages.agent.consent(provider.label);\n };\n\n const localChangesConsentGranted = (): boolean =>\n trustedFastMode() ? consentCheckbox.checked : workspaceConsentCheckbox.checked;\n\n const renderMode = (): void => {\n const trusted = trustedFastMode();\n consent.classList.toggle(\"spotpatch-trusted-consent\", trusted);\n badge.textContent = trusted\n ? messages.agent.trustedFast\n : configuredApplyMode === \"auto\"\n ? messages.agent.autoGated\n : messages.agent.review;\n consentText.textContent = consentMessage(selectedProvider());\n workspaceConsent.hidden = trusted || latestWorkspaceState !== \"consent-required\";\n };\n\n const populateModels = (): void => {\n const provider = selectedProvider();\n modelSelect.replaceChildren();\n\n if (provider === undefined) {\n consentText.textContent = consentMessage(provider);\n return;\n }\n\n for (const model of provider.models) {\n addOption(document, modelSelect, model.id, model.label);\n }\n\n modelSelect.value = provider.defaultModel;\n consentText.textContent = consentMessage(provider);\n };\n\n const refreshActions = (): void => {\n const setupVisible = ai.enabled && selectionVisible && !jobPresented;\n runButton.textContent = capabilityProbing\n ? messages.agent.verifying\n : messages.agent.run;\n runButton.classList.toggle(\"spotpatch-primary\", capabilityReady);\n testButton.hidden = !setupVisible;\n runButton.hidden = !setupVisible;\n testButton.disabled =\n !editingEnabled || capabilityProbing || selectedProvider() === undefined;\n runButton.disabled =\n !editingEnabled ||\n capabilityProbing ||\n !contextReady ||\n !consentCheckbox.checked ||\n latestWorkspaceState === \"idle\" ||\n latestWorkspaceState === \"checking\" ||\n latestWorkspaceState === \"blocked\" ||\n (latestWorkspaceState === \"consent-required\" && !localChangesConsentGranted()) ||\n selectedProvider() === undefined ||\n modelSelect.value.length === 0;\n\n if (!jobPresented || !selectionVisible) {\n cancelButton.hidden = true;\n applyButton.hidden = true;\n revertButton.hidden = true;\n resetButton.hidden = true;\n }\n };\n\n const renderWorkspaceMessage = (): void => {\n if (latestWorkspaceState === \"idle\") {\n workspace.textContent = messages.agent.workspaceNotChecked;\n } else if (latestWorkspaceState === \"checking\") {\n workspace.textContent = messages.agent.checkingWorkspace;\n } else if (latestWorkspaceState === \"ready\") {\n workspace.textContent = messages.agent.workspaceReady;\n } else if (latestWorkspaceState === \"consent-required\") {\n const changes = latestWorkspaceSnapshot?.changes;\n workspace.textContent = messages.agent.workspaceDirty(\n changes?.staged ?? 0,\n changes?.unstaged ?? 0,\n changes?.untracked ?? 0,\n );\n } else {\n workspace.textContent =\n latestWorkspaceErrorCode === undefined\n ? messages.errors.INTERNAL_ERROR\n : messages.errors[latestWorkspaceErrorCode];\n }\n };\n\n function handleProviderChange(): void {\n populateModels();\n consentCheckbox.checked = false;\n capability.dataset.state = \"idle\";\n capability.textContent = messages.agent.connectionNotTested;\n latestCapabilityState = \"idle\";\n latestCapabilityMessage = messages.agent.connectionNotTested;\n latestCapabilityErrorCode = undefined;\n capabilityReady = false;\n refreshActions();\n }\n function handleModelChange(): void {\n capability.dataset.state = \"idle\";\n capability.textContent = messages.agent.connectionNotTested;\n latestCapabilityState = \"idle\";\n latestCapabilityMessage = messages.agent.connectionNotTested;\n latestCapabilityErrorCode = undefined;\n capabilityReady = false;\n refreshActions();\n }\n function handleModeChange(): void {\n consentCheckbox.checked = false;\n workspaceConsentCheckbox.checked = false;\n renderMode();\n refreshActions();\n }\n populateModels();\n modeSelect.addEventListener(\"change\", handleModeChange);\n providerSelect.addEventListener(\"change\", handleProviderChange);\n modelSelect.addEventListener(\"change\", handleModelChange);\n consentCheckbox.addEventListener(\"change\", refreshActions);\n workspaceConsentCheckbox.addEventListener(\"change\", refreshActions);\n function renderCurrentJob(): void {\n if (latestSnapshot === undefined) {\n return;\n }\n\n const snapshot = latestSnapshot;\n const result = latestResult;\n jobModel.textContent = `${snapshot.providerLabel} · ${snapshot.modelLabel}`;\n jobStatus.textContent = messages.agent.status(snapshot.status);\n phase.textContent = snapshot.phaseMessage;\n const jobErrorCode = latestErrorCode ?? snapshot.errorCode;\n error.hidden = jobErrorCode === undefined;\n error.textContent = jobErrorCode === undefined ? \"\" : messages.errors[jobErrorCode];\n activity.replaceChildren();\n\n for (const item of latestActivities.slice(-8)) {\n const row = createMarkedElement(document, \"li\");\n row.dataset.state = item.state;\n row.textContent = item.label;\n activity.append(row);\n }\n\n resultPanel.hidden = result === undefined;\n resultSummary.textContent = result?.summary ?? \"\";\n files.replaceChildren();\n checks.replaceChildren();\n diff.textContent = result?.diff ?? \"\";\n\n for (const file of result?.files ?? []) {\n const row = createMarkedElement(document, \"li\");\n row.textContent = `${file.kind} ${file.relativePath} (+${String(file.additions)} / -${String(file.deletions)})`;\n files.append(row);\n }\n\n for (const check of result?.checks ?? []) {\n const details = createMarkedElement(document, \"details\");\n const checkTitle = createMarkedElement(document, \"summary\");\n checkTitle.textContent = `${check.label}: ${check.status} · ${String(check.durationMs)} ms`;\n const output = createMarkedElement(document, \"pre\");\n output.textContent =\n check.output.length === 0 ? messages.agent.noOutput : check.output;\n details.append(checkTitle, output);\n checks.append(details);\n }\n\n testButton.hidden = true;\n runButton.hidden = true;\n cancelButton.hidden = !selectionVisible || !snapshot.canCancel;\n cancelButton.textContent =\n snapshot.status === \"awaiting-review\"\n ? messages.agent.discard\n : messages.agent.cancel;\n applyButton.hidden = !selectionVisible || !snapshot.canApply;\n revertButton.hidden = !selectionVisible || !snapshot.canRevert;\n resetButton.hidden =\n !selectionVisible ||\n ![\"completed\", \"cancelled\", \"reverted\", \"failed\"].includes(snapshot.status);\n }\n\n function applyMessages(): void {\n messages = localizer.messages();\n title.textContent = messages.agent.title;\n modeText.textContent = messages.agent.mode;\n\n if (reviewOption !== undefined) reviewOption.textContent = messages.agent.review;\n if (trustedOption !== undefined)\n trustedOption.textContent = messages.agent.trustedFast;\n if (autoOption !== undefined) autoOption.textContent = messages.agent.autoGated;\n providerText.textContent = messages.agent.provider;\n modelText.textContent = messages.agent.model;\n providerSelect.setAttribute(\"aria-label\", messages.agent.providerAriaLabel);\n modelSelect.setAttribute(\"aria-label\", messages.agent.modelAriaLabel);\n workspaceConsentTitle.textContent = messages.agent.includeLocalChanges;\n workspaceConsentHelp.textContent = messages.agent.includeLocalChangesHelp;\n diff.setAttribute(\"aria-label\", messages.agent.diffAriaLabel);\n testButton.textContent = messages.agent.testConnection;\n applyButton.textContent = messages.agent.apply;\n revertButton.textContent = messages.agent.revert;\n resetButton.textContent = messages.agent.revise;\n renderMode();\n\n if (latestCapabilityState === \"idle\") {\n capability.textContent = messages.agent.connectionNotTested;\n } else if (latestCapabilityState === \"probing\") {\n capability.textContent = messages.agent.testingCapability;\n } else if (latestCapabilityState === \"ready\") {\n capability.textContent = `${messages.agent.capabilityVerified} · ${messages.agent.toolsReady}`;\n } else if (latestCapabilityErrorCode !== undefined) {\n capability.textContent = messages.errors[latestCapabilityErrorCode];\n } else if (selectedProvider() === undefined) {\n capability.textContent = messages.agent.providerUnavailable;\n } else {\n capability.textContent = latestCapabilityMessage;\n }\n\n renderWorkspaceMessage();\n refreshActions();\n renderCurrentJob();\n }\n\n const unsubscribeLocale = localizer.subscribe(applyMessages);\n applyMessages();\n\n return Object.freeze({\n root,\n modeSelect,\n providerSelect,\n modelSelect,\n consentCheckbox,\n workspaceConsentCheckbox,\n testButton,\n runButton,\n cancelButton,\n applyButton,\n revertButton,\n resetButton,\n\n consentGranted(): boolean {\n return consentCheckbox.checked;\n },\n\n workspaceConsentGranted(): boolean {\n return localChangesConsentGranted();\n },\n\n readSelection(): AgentSelectionValue | undefined {\n const provider = selectedProvider();\n const model = provider?.models.find(\n (candidate) => candidate.id === modelSelect.value,\n );\n\n return provider === undefined || model === undefined\n ? undefined\n : Object.freeze({\n applyMode: selectedApplyMode(),\n providerProfileId: provider.id,\n modelProfileId: model.id,\n });\n },\n\n renderCapability(\n state: \"idle\" | \"probing\" | \"ready\" | \"error\",\n message: string,\n capabilitySnapshot?: AgentCapabilitySnapshot,\n errorCode?: ErrorCode,\n ) {\n latestCapabilityState = state;\n latestCapabilityMessage = message;\n latestCapabilityErrorCode = errorCode;\n capabilityProbing = state === \"probing\";\n capabilityReady =\n state === \"ready\" && capabilitySnapshot?.state === \"agent-ready\";\n capability.dataset.state = state;\n capability.textContent =\n capabilitySnapshot?.state === \"agent-ready\"\n ? `${message} · ${messages.agent.toolsReady}`\n : message;\n refreshActions();\n },\n\n renderWorkspaceHealth(\n state: \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\",\n snapshot?: AgentWorkspaceHealthSnapshot,\n errorCode?: ErrorCode,\n ) {\n latestWorkspaceState = state;\n latestWorkspaceSnapshot = snapshot;\n latestWorkspaceErrorCode = errorCode ?? snapshot?.errorCode;\n workspace.dataset.state = state;\n if (state !== \"checking\") {\n workspaceConsent.hidden = trustedFastMode() || state !== \"consent-required\";\n }\n\n if (state === \"idle\" || state === \"ready\" || state === \"blocked\") {\n workspaceConsentCheckbox.checked = false;\n }\n\n renderWorkspaceMessage();\n refreshActions();\n },\n\n renderJob(\n snapshot: AgentJobSnapshot,\n result: AgentJobResult | undefined,\n activities: readonly AgentActivityItem[],\n errorCode?: ErrorCode,\n ) {\n jobPresented = true;\n setup.hidden = true;\n job.hidden = false;\n providerSelect.disabled = true;\n modelSelect.disabled = true;\n modeSelect.disabled = true;\n consentCheckbox.disabled = true;\n workspaceConsentCheckbox.disabled = true;\n latestSnapshot = snapshot;\n latestResult = result;\n latestActivities = activities;\n latestErrorCode = errorCode;\n renderCurrentJob();\n },\n\n resetJob() {\n jobPresented = false;\n latestSnapshot = undefined;\n latestResult = undefined;\n latestActivities = [];\n latestErrorCode = undefined;\n setup.hidden = false;\n job.hidden = true;\n providerSelect.disabled = false;\n modelSelect.disabled = false;\n modeSelect.disabled = false;\n consentCheckbox.disabled = false;\n workspaceConsentCheckbox.disabled = false;\n activity.replaceChildren();\n files.replaceChildren();\n checks.replaceChildren();\n diff.textContent = \"\";\n error.textContent = \"\";\n error.hidden = true;\n refreshActions();\n },\n\n setContextReady(ready: boolean) {\n contextReady = ready;\n refreshActions();\n },\n\n setEditingEnabled(enabled: boolean) {\n editingEnabled = enabled;\n providerSelect.disabled = !enabled || jobPresented;\n modelSelect.disabled = !enabled || jobPresented;\n modeSelect.disabled = !enabled || jobPresented;\n consentCheckbox.disabled = !enabled || jobPresented;\n workspaceConsentCheckbox.disabled = !enabled || jobPresented;\n refreshActions();\n },\n\n setProviderConsent(granted: boolean) {\n consentCheckbox.checked = granted;\n refreshActions();\n },\n\n setSelectionVisible(visible: boolean) {\n selectionVisible = visible;\n refreshActions();\n\n if (!visible) {\n cancelButton.hidden = true;\n applyButton.hidden = true;\n revertButton.hidden = true;\n resetButton.hidden = true;\n }\n },\n\n dispose() {\n unsubscribeLocale();\n providerSelect.removeEventListener(\"change\", handleProviderChange);\n modelSelect.removeEventListener(\"change\", handleModelChange);\n modeSelect.removeEventListener(\"change\", handleModeChange);\n consentCheckbox.removeEventListener(\"change\", refreshActions);\n workspaceConsentCheckbox.removeEventListener(\"change\", refreshActions);\n },\n });\n}\n","/**\n * Canonical SpotPatch mark from docs/assets/spotpatch-logo-mark.svg.\n *\n * The Vite development injector consumes this trusted asset separately from\n * the core browser bundle so the Runtime gzip budget remains enforceable.\n */\nexport const BRAND_MARK_CONTENT = `\n <defs>\n <linearGradient id=\"locator-gradient\" x1=\"76\" y1=\"92\" x2=\"436\" y2=\"374\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stop-color=\"#B61CFF\" />\n <stop offset=\"0.38\" stop-color=\"#6D35FF\" />\n <stop offset=\"0.72\" stop-color=\"#168EFF\" />\n <stop offset=\"1\" stop-color=\"#00D9E9\" />\n </linearGradient>\n <linearGradient id=\"left-code-gradient\" x1=\"165\" y1=\"166\" x2=\"236\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A51EFF\" />\n <stop offset=\"1\" stop-color=\"#653BFF\" />\n </linearGradient>\n <linearGradient id=\"right-code-gradient\" x1=\"276\" y1=\"166\" x2=\"347\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#158DFF\" />\n <stop offset=\"1\" stop-color=\"#00D8E9\" />\n </linearGradient>\n <linearGradient id=\"bolt-gradient\" x1=\"270\" y1=\"111\" x2=\"252\" y2=\"365\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6840FF\" />\n <stop offset=\"0.48\" stop-color=\"#257BFF\" />\n <stop offset=\"1\" stop-color=\"#00CBEF\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#locator-gradient)\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M256 52C345.47 52 418 124.53 418 214C418 267.55 391.98 316.24 354.04 348.02L256 468L157.96 348.02C120.02 316.24 94 267.55 94 214C94 124.53 166.53 52 256 52ZM256 88C186.41 88 130 144.41 130 214C130 258.2 152.76 297.08 187.2 319.57L256 403.8L324.8 319.57C359.24 297.08 382 258.2 382 214C382 144.41 325.59 88 256 88Z\"\n />\n <rect x=\"238\" y=\"20\" width=\"36\" height=\"84\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"62\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"366\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <path\n d=\"M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z\"\n fill=\"url(#left-code-gradient)\"\n />\n <path\n d=\"M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z\"\n fill=\"url(#right-code-gradient)\"\n />\n <path\n d=\"M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z\"\n fill=\"url(#bolt-gradient)\"\n />\n`;\n","import { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\ndeclare const __SPOTPATCH_INLINE_BRAND_MARK__: boolean;\ndeclare const __SPOTPATCH_BRAND_MARK_CONTENT__: string | undefined;\n\n/**\n * Deliberately empty fail-closed fallback for an invalid Vite injection.\n *\n * The browser bundle must not carry a second logo implementation: normal\n * Vite development injects BRAND_MARK_CONTENT lexically, while standalone\n * Runtime builds inline the canonical asset at compile time. Keeping this\n * branch empty preserves the bundle budget and prevents stale branding if a\n * host violates either build contract.\n */\nconst FALLBACK_BRAND_MARK_CONTENT = \"\";\n\nfunction resolveBrandMarkContent(override?: string): Readonly<{\n readonly content: string;\n readonly viewBox: string;\n}> {\n if (override !== undefined) {\n return { content: override, viewBox: \"0 0 512 512\" };\n }\n\n const injected =\n typeof __SPOTPATCH_BRAND_MARK_CONTENT__ === \"string\"\n ? __SPOTPATCH_BRAND_MARK_CONTENT__\n : undefined;\n if (typeof injected === \"string\") {\n return { content: injected, viewBox: \"0 0 512 512\" };\n }\n\n return __SPOTPATCH_INLINE_BRAND_MARK__\n ? { content: BRAND_MARK_CONTENT, viewBox: \"0 0 512 512\" }\n : { content: FALLBACK_BRAND_MARK_CONTENT, viewBox: \"0 0 1 1\" };\n}\n\nfunction svgElement<K extends keyof SVGElementTagNameMap>(\n document: Document,\n tagName: K,\n attributes: Readonly<Record<string, string>>,\n): SVGElementTagNameMap[K] {\n const element = document.createElementNS(SVG_NAMESPACE, tagName);\n\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, value);\n }\n\n return element;\n}\n\n/** Vector form of docs/assets/spotpatch-logo-mark.svg; safe to inline in Shadow DOM. */\nexport function createBrandMark(document: Document, content?: string): SVGSVGElement {\n const resolved = resolveBrandMarkContent(content);\n const svg = svgElement(document, \"svg\", {\n xmlns: SVG_NAMESPACE,\n class: \"spotpatch-brand-mark\",\n viewBox: resolved.viewBox,\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n });\n svg.innerHTML = resolved.content;\n return svg;\n}\n","import type {\n ComponentDataFlowReport,\n NetworkObservation,\n PageDataFlowReport,\n SpotPatchLocale,\n} from \"@spotpatch/shared\";\n\nimport type { DataFlowComponentRegistration } from \"../data-flow/data-flow-runtime.js\";\n\nexport type DataFlowPanelStatus = \"disabled\" | \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport interface DataFlowPanelSnapshot {\n readonly status: DataFlowPanelStatus;\n readonly report?: ComponentDataFlowReport | PageDataFlowReport;\n readonly message?: string;\n}\n\nexport interface DataFlowViewState {\n readonly component: DataFlowPanelSnapshot;\n readonly page: DataFlowPanelSnapshot;\n readonly observationCount: number;\n}\n\nexport interface DataFlowPanel {\n readonly root: HTMLElement;\n readonly refreshButton: HTMLButtonElement;\n readonly styles: HTMLStyleElement;\n readonly dispose: () => void;\n readonly render: (state: DataFlowViewState) => void;\n readonly resetView: () => void;\n}\n\nexport type DataFlowPanelFactory = (\n document: Document,\n enabled: boolean,\n locale: () => SpotPatchLocale,\n changesRoot: HTMLElement,\n diagnosticsRoot: HTMLElement,\n onViewChange: () => void,\n) => DataFlowPanel;\n\nexport interface DataFlowExtension {\n readonly createPanel: DataFlowPanelFactory;\n readonly getComponentRegistration: (\n component: object,\n ) => DataFlowComponentRegistration | undefined;\n readonly observations: (routeKey: string) => readonly NetworkObservation[];\n readonly mergeComponentReport: (\n report: ComponentDataFlowReport,\n observations: readonly NetworkObservation[],\n ) => ComponentDataFlowReport;\n readonly mergePageReport: (\n report: PageDataFlowReport,\n observations: readonly NetworkObservation[],\n ) => PageDataFlowReport;\n}\n\nconst DATA_FLOW_EXTENSION_KEY = Symbol.for(\"spotpatch.data-flow.extension.v1\");\ntype ExtensionStore = Partial<Record<symbol, DataFlowExtension>>;\n\nexport function registerDataFlowExtension(\n extension: DataFlowExtension,\n target: ExtensionStore = globalThis,\n): void {\n target[DATA_FLOW_EXTENSION_KEY] = extension;\n}\n\nexport function getDataFlowExtension(\n target: ExtensionStore = globalThis,\n): DataFlowExtension | undefined {\n return target[DATA_FLOW_EXTENSION_KEY];\n}\n","import type { ElementRect } from \"../picker/geometry.js\";\n\nexport type DialogPlacementMode =\n \"above\" | \"below\" | \"center\" | \"left\" | \"right\" | \"viewport\";\n\nexport interface DialogPlacement {\n readonly anchorX: number;\n readonly anchorY: number;\n readonly left: number;\n readonly mode: DialogPlacementMode;\n readonly top: number;\n}\n\nexport interface DialogPlacementInput {\n readonly dialogHeight: number;\n readonly dialogWidth: number;\n readonly target?: ElementRect;\n readonly viewportHeight: number;\n readonly viewportWidth: number;\n}\n\nconst VIEWPORT_MARGIN = 16;\nconst TARGET_GAP = 14;\nconst TARGET_INSET = 24;\nconst ANCHOR_INSET = 22;\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(Math.max(value, minimum), Math.max(minimum, maximum));\n}\n\nexport function calculateDialogPlacement({\n dialogHeight,\n dialogWidth,\n target,\n viewportHeight,\n viewportWidth,\n}: DialogPlacementInput): DialogPlacement {\n const maxLeft = viewportWidth - dialogWidth - VIEWPORT_MARGIN;\n const maxTop = viewportHeight - dialogHeight - VIEWPORT_MARGIN;\n const viewportLeft = clamp(\n (viewportWidth - dialogWidth) / 2,\n VIEWPORT_MARGIN,\n maxLeft,\n );\n const viewportTop = clamp(\n (viewportHeight - dialogHeight) / 2,\n VIEWPORT_MARGIN,\n maxTop,\n );\n\n if (target === undefined) {\n return Object.freeze({\n anchorX: clamp(dialogWidth / 2, ANCHOR_INSET, dialogWidth - ANCHOR_INSET),\n anchorY: clamp(dialogHeight / 2, ANCHOR_INSET, dialogHeight - ANCHOR_INSET),\n left: viewportLeft,\n mode: \"viewport\",\n top: viewportTop,\n });\n }\n\n const targetCenterX = target.x + target.width / 2;\n const targetCenterY = target.y + target.height / 2;\n const centeredLeft = clamp(targetCenterX - dialogWidth / 2, VIEWPORT_MARGIN, maxLeft);\n const centeredTop = clamp(targetCenterY - dialogHeight / 2, VIEWPORT_MARGIN, maxTop);\n let left = centeredLeft;\n let top = centeredTop;\n let mode: DialogPlacementMode = \"viewport\";\n\n if (\n target.width >= dialogWidth + TARGET_INSET * 2 &&\n target.height >= dialogHeight + TARGET_INSET * 2\n ) {\n mode = \"center\";\n } else if (target.y - dialogHeight - TARGET_GAP >= VIEWPORT_MARGIN) {\n top = target.y - dialogHeight - TARGET_GAP;\n mode = \"above\";\n } else if (\n target.y + target.height + TARGET_GAP + dialogHeight <=\n viewportHeight - VIEWPORT_MARGIN\n ) {\n top = target.y + target.height + TARGET_GAP;\n mode = \"below\";\n } else if (\n target.x + target.width + TARGET_GAP + dialogWidth <=\n viewportWidth - VIEWPORT_MARGIN\n ) {\n left = target.x + target.width + TARGET_GAP;\n mode = \"right\";\n } else if (target.x - dialogWidth - TARGET_GAP >= VIEWPORT_MARGIN) {\n left = target.x - dialogWidth - TARGET_GAP;\n mode = \"left\";\n }\n\n return Object.freeze({\n anchorX: clamp(targetCenterX - left, ANCHOR_INSET, dialogWidth - ANCHOR_INSET),\n anchorY: clamp(targetCenterY - top, ANCHOR_INSET, dialogHeight - ANCHOR_INSET),\n left,\n mode,\n top,\n });\n}\n","import {\n ERROR_CODES,\n type AgentJobStatus,\n type ErrorCode,\n type SpotPatchLocale,\n type SpotPatchLocalePreference,\n} from \"@spotpatch/shared\";\n\nimport type { SelectionSummaryMessages } from \"./selection-summary.js\";\n\nexport interface UiMessages {\n readonly localeName: string;\n readonly alternateLocaleName: string;\n readonly switchLocale: string;\n readonly brand: Readonly<{\n name: string;\n context: string;\n repository: string;\n repositoryTitle: string;\n }>;\n readonly trigger: Readonly<{\n select: string;\n stop: string;\n title: (shortcut: string) => string;\n }>;\n readonly dialog: Readonly<{\n close: string;\n editTitle: string;\n editSubtitle: string;\n previewTitle: string;\n previewSubtitle: string;\n }>;\n readonly context: Readonly<{\n collecting: string;\n ready: string;\n partial: string;\n sourceUnavailable: string;\n selectedElement: string;\n selectedCount: (count: number) => string;\n }>;\n readonly targets: Readonly<{\n title: string;\n ariaLabel: string;\n count: (selected: number, maximum: number) => string;\n complete: (complete: number, total: number) => string;\n instructionBudget: (used: number, maximum: number) => string;\n instructionBudgetExceeded: (used: number, maximum: number) => string;\n statusReady: string;\n statusPartial: string;\n statusCollecting: string;\n instructionReady: string;\n instructionMissing: string;\n instructionLabel: (name: string) => string;\n instructionPlaceholder: string;\n instructionCount: (used: number, maximum: number) => string;\n activate: (index: number) => string;\n remove: (index: number) => string;\n removeTitle: string;\n addTitle: string;\n limitTitle: (maximum: number) => string;\n }>;\n readonly diagnostics: Readonly<{\n title: string;\n resolving: string;\n noExactSource: string;\n promptAriaLabel: string;\n }>;\n readonly summary: SelectionSummaryMessages;\n readonly actions: Readonly<{\n addElement: string;\n reselect: string;\n openEditor: string;\n openTarget: (index: number) => string;\n preview: string;\n copy: string;\n back: string;\n }>;\n readonly agent: Readonly<{\n title: string;\n mode: string;\n review: string;\n autoGated: string;\n trustedFast: string;\n provider: string;\n model: string;\n providerAriaLabel: string;\n modelAriaLabel: string;\n providerUnavailable: string;\n consent: (provider: string) => string;\n trustedFastConsent: (provider: string) => string;\n connectionNotTested: string;\n workspaceNotChecked: string;\n checkingWorkspace: string;\n workspaceReady: string;\n workspaceDirty: (staged: number, unstaged: number, untracked: number) => string;\n includeLocalChanges: string;\n includeLocalChangesHelp: string;\n localChangesConsentRequired: string;\n capabilityVerified: string;\n capabilityVerifiedAnnouncement: string;\n testingCapability: string;\n applying: string;\n cancelling: string;\n reverting: string;\n consentRequired: string;\n toolsReady: string;\n testConnection: string;\n verifying: string;\n run: string;\n cancel: string;\n discard: string;\n apply: string;\n revert: string;\n revise: string;\n diffAriaLabel: string;\n noOutput: string;\n status: (status: AgentJobStatus) => string;\n }>;\n readonly announcements: Readonly<{\n adapterDisabled: string;\n selectionEnabled: string;\n chooseAnother: string;\n reselectAfterChange: string;\n sourceLoaded: string;\n sourceFailed: string;\n addCancelled: string;\n selectionLimit: (maximum: number) => string;\n chooseAdditional: (selected: number, maximum: number) => string;\n duplicate: string;\n sourceProbable: string;\n sourceMissing: string;\n noSelectable: string;\n allTargetsRemoved: string;\n targetRemoved: string;\n detachedTargetPreserved: string;\n contextWarning: string;\n contextCollected: string;\n editorOpening: string;\n editorOpened: string;\n editorFailed: string;\n completeInstructions: string;\n promptCopied: string;\n clipboardUnavailable: string;\n copyFailed: string;\n appliedTargetsDetached: string;\n }>;\n readonly errors: Readonly<Record<ErrorCode, string>>;\n}\n\nconst STATUS_EN: Readonly<Record<AgentJobStatus, string>> = Object.freeze({\n queued: \"Queued\",\n preparing: \"Preparing\",\n running: \"Running\",\n validating: \"Validating\",\n \"awaiting-review\": \"Awaiting review\",\n applying: \"Applying\",\n applied: \"Applied\",\n completed: \"Completed\",\n cancelling: \"Cancelling\",\n cancelled: \"Cancelled\",\n reverting: \"Reverting\",\n reverted: \"Reverted\",\n failed: \"Failed\",\n});\n\nconst STATUS_ZH: Readonly<Record<AgentJobStatus, string>> = Object.freeze({\n queued: \"已排队\",\n preparing: \"准备中\",\n running: \"执行中\",\n validating: \"验证中\",\n \"awaiting-review\": \"等待审阅\",\n applying: \"应用中\",\n applied: \"已应用\",\n completed: \"已完成\",\n cancelling: \"取消中\",\n cancelled: \"已取消\",\n reverting: \"撤销中\",\n reverted: \"已撤销\",\n failed: \"失败\",\n});\n\nconst ERROR_MESSAGES_EN = Object.freeze({\n [ERROR_CODES.INVALID_REQUEST]: \"The Agent request was rejected as invalid.\",\n [ERROR_CODES.INVALID_TOKEN]: \"The local SpotPatch session expired.\",\n [ERROR_CODES.ORIGIN_NOT_ALLOWED]: \"The current page origin is not authorized.\",\n [ERROR_CODES.SOURCE_NOT_FOUND]: \"The selected source is no longer available.\",\n [ERROR_CODES.SOURCE_OUTSIDE_ROOT]: \"The selected source is outside the project.\",\n [ERROR_CODES.SOURCE_TOO_LARGE]: \"The selected source exceeds the safety limit.\",\n [ERROR_CODES.EDITOR_OPEN_FAILED]: \"The editor request failed.\",\n [ERROR_CODES.DATA_FLOW_DISABLED]: \"Component data-flow analysis is disabled.\",\n [ERROR_CODES.DATA_FLOW_SOURCE_STALE]:\n \"The selected source changed. Select the component again.\",\n [ERROR_CODES.DATA_FLOW_ANALYSIS_CANCELLED]:\n \"Component data-flow analysis was cancelled.\",\n [ERROR_CODES.AI_DISABLED]: \"AI execution is disabled in Vite configuration.\",\n [ERROR_CODES.PROVIDER_NOT_CONFIGURED]:\n \"The provider Key environment variable is missing on the Vite process.\",\n [ERROR_CODES.PROVIDER_AUTH_FAILED]:\n \"The provider rejected authentication. Check the server-side Key.\",\n [ERROR_CODES.PROVIDER_PROTOCOL_UNSUPPORTED]:\n \"The relay does not match the configured OpenAI-compatible protocol.\",\n [ERROR_CODES.MODEL_NOT_ALLOWED]: \"The selected model profile is not allowed.\",\n [ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED]:\n \"The selected model did not start or continue the required tool call.\",\n [ERROR_CODES.PROVIDER_RATE_LIMITED]:\n \"The provider is rate limited. Wait and try again.\",\n [ERROR_CODES.AGENT_BUSY]: \"Another write Agent job is still active.\",\n [ERROR_CODES.AGENT_LIMIT_EXCEEDED]:\n \"The Agent stopped at a configured time, turn, output, or size limit.\",\n [ERROR_CODES.AGENT_CANCELLED]: \"The Agent job was cancelled.\",\n [ERROR_CODES.WORKTREE_DIRTY]: \"Confirm inclusion of local changes before running AI.\",\n [ERROR_CODES.WORKTREE_NOT_REPOSITORY]:\n \"Vite root must be an initialized Git repository root.\",\n [ERROR_CODES.WORKTREE_OPERATION_IN_PROGRESS]:\n \"Finish the active merge, rebase, cherry-pick, or revert.\",\n [ERROR_CODES.WORKTREE_CONFLICTED]: \"Resolve all Git conflicts before running AI.\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_TOO_LARGE]:\n \"Reduce untracked files below the safe count and size limits.\",\n [ERROR_CODES.WORKTREE_UNTRACKED_UNSUPPORTED]:\n \"An untracked path is missing, linked, or not a regular file.\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_UNSUPPORTED]:\n \"Local changes cannot be isolated safely.\",\n [ERROR_CODES.TOOL_DENIED]: \"A tool request violated local safety policy.\",\n [ERROR_CODES.TOOL_INPUT_INVALID]: \"Invalid tool request.\",\n [ERROR_CODES.TOOL_ARGUMENTS_INVALID]: \"Tool arguments are invalid.\",\n [ERROR_CODES.TOOL_CALL_ID_CONFLICT]: \"Tool ID conflicts in this turn.\",\n [ERROR_CODES.TOOL_PATH_DENIED]: \"The model requested a protected or external path.\",\n [ERROR_CODES.PATCH_REJECTED]: \"The patch violated local policy.\",\n [ERROR_CODES.VALIDATION_FAILED]: \"Required checks failed; changes cannot be applied.\",\n [ERROR_CODES.APPLY_CONFLICT]: \"Agent-touched files changed; nothing was overwritten.\",\n [ERROR_CODES.INTERNAL_ERROR]: \"The Agent failed without exposing private details.\",\n} satisfies Record<ErrorCode, string>);\n\nconst ERROR_MESSAGES_ZH = Object.freeze({\n [ERROR_CODES.INVALID_REQUEST]: \"Agent 请求无效,已被拒绝。\",\n [ERROR_CODES.INVALID_TOKEN]: \"本地 SpotPatch 会话已失效。\",\n [ERROR_CODES.ORIGIN_NOT_ALLOWED]: \"当前页面来源未获授权。\",\n [ERROR_CODES.SOURCE_NOT_FOUND]: \"选中目标对应的源码已不可用。\",\n [ERROR_CODES.SOURCE_OUTSIDE_ROOT]: \"选中源码位于项目根目录之外。\",\n [ERROR_CODES.SOURCE_TOO_LARGE]: \"选中源码超过安全大小限制。\",\n [ERROR_CODES.EDITOR_OPEN_FAILED]: \"编辑器打开请求失败。\",\n [ERROR_CODES.DATA_FLOW_DISABLED]: \"组件数据链路分析未启用。\",\n [ERROR_CODES.DATA_FLOW_SOURCE_STALE]: \"选中源码已经变化,请重新选择组件。\",\n [ERROR_CODES.DATA_FLOW_ANALYSIS_CANCELLED]: \"组件数据链路分析已取消。\",\n [ERROR_CODES.AI_DISABLED]: \"Vite 配置未启用 AI 执行。\",\n [ERROR_CODES.PROVIDER_NOT_CONFIGURED]:\n \"启动 Vite 的进程中缺少模型服务 Key 环境变量。\",\n [ERROR_CODES.PROVIDER_AUTH_FAILED]: \"模型服务鉴权失败,请检查服务端 Key。\",\n [ERROR_CODES.PROVIDER_PROTOCOL_UNSUPPORTED]:\n \"中转服务与配置的 OpenAI 兼容协议不一致。\",\n [ERROR_CODES.MODEL_NOT_ALLOWED]: \"当前模型配置未获授权。\",\n [ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED]: \"当前模型未完成必要的工具调用或结果续接。\",\n [ERROR_CODES.PROVIDER_RATE_LIMITED]: \"模型服务正在限流,请稍后重试。\",\n [ERROR_CODES.AGENT_BUSY]: \"当前项目已有一个写入任务正在运行。\",\n [ERROR_CODES.AGENT_LIMIT_EXCEEDED]: \"Agent 达到时间、轮次、输出或变更规模限制。\",\n [ERROR_CODES.AGENT_CANCELLED]: \"Agent 任务已取消。\",\n [ERROR_CODES.WORKTREE_DIRTY]: \"运行 AI 前,请明确同意将当前本地修改纳入隔离基线。\",\n [ERROR_CODES.WORKTREE_NOT_REPOSITORY]: \"Vite 根目录不是已初始化 Git 仓库的顶层目录。\",\n [ERROR_CODES.WORKTREE_OPERATION_IN_PROGRESS]:\n \"请先完成当前 merge、rebase、cherry-pick 或 revert,再运行 AI。\",\n [ERROR_CODES.WORKTREE_CONFLICTED]: \"请先解决全部 Git 冲突,再运行 AI。\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_TOO_LARGE]:\n \"未跟踪文件超过安全数量或体积上限,请先精简。\",\n [ERROR_CODES.WORKTREE_UNTRACKED_UNSUPPORTED]:\n \"未跟踪项已丢失、是符号链接或不是普通文件。\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_UNSUPPORTED]: \"当前本地修改无法安全隔离。\",\n [ERROR_CODES.TOOL_DENIED]: \"工具请求违反本地安全策略。\",\n [ERROR_CODES.TOOL_INPUT_INVALID]: \"工具请求无效。\",\n [ERROR_CODES.TOOL_ARGUMENTS_INVALID]: \"工具参数无效。\",\n [ERROR_CODES.TOOL_CALL_ID_CONFLICT]: \"本轮工具 ID 冲突。\",\n [ERROR_CODES.TOOL_PATH_DENIED]: \"模型请求了受保护或项目外路径。\",\n [ERROR_CODES.PATCH_REJECTED]: \"补丁违反本地策略。\",\n [ERROR_CODES.VALIDATION_FAILED]: \"必需检查失败,无法应用变更。\",\n [ERROR_CODES.APPLY_CONFLICT]: \"Agent 触及文件已变化,未覆盖。\",\n [ERROR_CODES.INTERNAL_ERROR]: \"Agent 失败,未暴露私有细节。\",\n} satisfies Record<ErrorCode, string>);\n\nconst SUMMARY_MESSAGES_EN = Object.freeze({\n adapter: \"React adapter\",\n api: \"API\",\n apiStatuses: Object.freeze({\n connected: \"connected\",\n failed: \"failed\",\n loading: \"loading\",\n \"not-required\": \"not required\",\n }),\n available: \"available\",\n boundary: \"Boundary\",\n boundaries: Object.freeze({\n component: \"component\",\n \"nearby-lines\": \"nearby lines\",\n }),\n browserContext: \"Browser context\",\n collectionStatuses: Object.freeze({\n failed: \"failed\",\n loading: \"loading\",\n ready: \"ready\",\n }),\n component: \"Component\",\n confidence: \"Confidence\",\n confidenceLabels: Object.freeze({\n exact: \"exact element source\",\n probable: \"probable owning component\",\n approximate: \"nearest business container\",\n unknown: \"source not found\",\n }),\n cssWarnings: \"CSS warnings\",\n lineLocation: (line: number, column?: number) =>\n `line ${String(line)}${column === undefined ? \"\" : `, column ${String(column)}`}`,\n origin: \"Origin\",\n source: \"Source\",\n sourceContext: \"Source context\",\n stack: \"Stack\",\n target: (index: number, active: boolean) =>\n `Target ${String(index)}${active ? \" (active)\" : \"\"}`,\n unavailable: \"unavailable\",\n unsupported: \"unsupported\",\n warning: \"Warning\",\n} satisfies SelectionSummaryMessages);\n\nconst SUMMARY_MESSAGES_ZH = Object.freeze({\n adapter: \"React 适配器\",\n api: \"API\",\n apiStatuses: Object.freeze({\n connected: \"已连接\",\n failed: \"失败\",\n loading: \"加载中\",\n \"not-required\": \"无需请求\",\n }),\n available: \"可用\",\n boundary: \"代码边界\",\n boundaries: Object.freeze({\n component: \"完整组件\",\n \"nearby-lines\": \"附近代码\",\n }),\n browserContext: \"浏览器上下文\",\n collectionStatuses: Object.freeze({\n failed: \"失败\",\n loading: \"采集中\",\n ready: \"已就绪\",\n }),\n component: \"组件\",\n confidence: \"置信度\",\n confidenceLabels: Object.freeze({\n exact: \"精确元素源码\",\n probable: \"可能的所属组件\",\n approximate: \"最近业务容器\",\n unknown: \"未找到源码\",\n }),\n cssWarnings: \"CSS 警告\",\n lineLocation: (line: number, column?: number) =>\n `第 ${String(line)} 行${column === undefined ? \"\" : `,第 ${String(column)} 列`}`,\n origin: \"定位来源\",\n source: \"源码\",\n sourceContext: \"源码上下文\",\n stack: \"组件栈\",\n target: (index: number, active: boolean) =>\n `目标 ${String(index)}${active ? \"(当前)\" : \"\"}`,\n unavailable: \"不可用\",\n unsupported: \"不支持\",\n warning: \"警告\",\n} satisfies SelectionSummaryMessages);\n\nexport const UI_MESSAGES = Object.freeze({\n \"en-US\": Object.freeze({\n localeName: \"EN\",\n alternateLocaleName: \"中\",\n switchLocale: \"Switch interface language to Chinese\",\n brand: Object.freeze({\n name: \"SpotPatch\",\n context: \"Live context\",\n repository: \"GitHub ↗\",\n repositoryTitle: \"Star SpotPatch on GitHub\",\n }),\n trigger: Object.freeze({\n select: \"Select element\",\n stop: \"Stop selecting\",\n title: (shortcut: string) => `Toggle SpotPatch (${shortcut})`,\n }),\n dialog: Object.freeze({\n close: \"Close SpotPatch\",\n editTitle: \"Plan the change\",\n editSubtitle: \"Give each selected target its own precise instruction.\",\n previewTitle: \"Review the request\",\n previewSubtitle: \"Verify the complete context before it leaves the browser.\",\n }),\n context: Object.freeze({\n collecting: \"Collecting context\",\n ready: \"Context ready\",\n partial: \"Partial context\",\n sourceUnavailable: \"Source unavailable\",\n selectedElement: \"Selected element\",\n selectedCount: (count: number) => `${String(count)} elements selected`,\n }),\n targets: Object.freeze({\n title: \"Selected targets\",\n ariaLabel: \"Selected targets and change instructions\",\n count: (selected: number, maximum: number) =>\n `${String(selected)} of ${String(maximum)}`,\n complete: (complete: number, total: number) =>\n `${String(complete)} of ${String(total)} described`,\n instructionBudget: (used: number, maximum: number) =>\n `${String(used)} / ${String(maximum)} characters`,\n instructionBudgetExceeded: (used: number, maximum: number) =>\n `${String(used)} / ${String(maximum)} characters — reduce the request`,\n statusReady: \"Ready\",\n statusPartial: \"Partial\",\n statusCollecting: \"Collecting\",\n instructionReady: \"Instruction added\",\n instructionMissing: \"Needs instruction\",\n instructionLabel: (name: string) => `Change for ${name}`,\n instructionPlaceholder:\n \"Describe the desired result for this target, including constraints…\",\n instructionCount: (used: number, maximum: number) =>\n `${String(used)} / ${String(maximum)}`,\n activate: (index: number) => `Edit target ${String(index)}`,\n remove: (index: number) => `Remove target ${String(index)}`,\n removeTitle: \"Remove target\",\n addTitle: \"Add another element to this request\",\n limitTitle: (maximum: number) => `Selection limit reached (${String(maximum)})`,\n }),\n diagnostics: Object.freeze({\n title: \"Captured context\",\n resolving: \"Resolving source…\",\n noExactSource: \"No exact source marker\",\n promptAriaLabel: \"Generated prompt\",\n }),\n summary: SUMMARY_MESSAGES_EN,\n actions: Object.freeze({\n addElement: \"Add element\",\n reselect: \"Start over\",\n openEditor: \"Open source\",\n openTarget: (index: number) => `Open source for target ${String(index)}`,\n preview: \"Preview prompt\",\n copy: \"Copy prompt\",\n back: \"Back to edit\",\n }),\n agent: Object.freeze({\n title: \"AI code agent\",\n mode: \"Execution mode\",\n review: \"Review\",\n autoGated: \"Auto gated\",\n trustedFast: \"Trusted direct\",\n provider: \"Provider\",\n model: \"Model\",\n providerAriaLabel: \"AI provider\",\n modelAriaLabel: \"AI model\",\n providerUnavailable: \"Provider configuration is unavailable.\",\n consent: (provider: string) =>\n `I understand selected context and allowed source may be sent to ${provider}; its data policy is my responsibility.`,\n trustedFastConsent: (provider: string) =>\n `Enable trusted direct mode for ${provider}: send allowed project context, include current local changes, skip project validation checks, and immediately apply AI changes, including file deletions and configuration changes.`,\n connectionNotTested: \"Optional connection check not run\",\n workspaceNotChecked: \"Local workspace not checked\",\n checkingWorkspace: \"Checking Git workspace and isolated execution…\",\n workspaceReady: \"Local workspace is ready for isolated execution\",\n workspaceDirty: (staged: number, unstaged: number, untracked: number) =>\n `Local changes found · ${String(staged)} staged · ${String(unstaged)} unstaged · ${String(untracked)} untracked`,\n includeLocalChanges: \"Allow the Agent to continue from my current local changes\",\n includeLocalChangesHelp:\n \"The Agent may edit these files. SpotPatch preserves the baseline and applies or reverts only the Agent delta.\",\n localChangesConsentRequired:\n \"Confirm inclusion of current local changes before running AI.\",\n capabilityVerified: \"Agent capability verified\",\n capabilityVerifiedAnnouncement: \"AI provider capability verified.\",\n testingCapability: \"Testing authentication, tools, continuation, and streaming…\",\n applying: \"Applying changes to the project.\",\n cancelling: \"Cancelling Agent job.\",\n reverting: \"Reverting the applied Agent change.\",\n consentRequired: \"Confirm remote provider data transmission before running AI.\",\n toolsReady: \"tools and streaming ready\",\n testConnection: \"Check environment\",\n verifying: \"Verifying…\",\n run: \"Run AI\",\n cancel: \"Cancel agent\",\n discard: \"Discard changes\",\n apply: \"Apply changes\",\n revert: \"Revert changes\",\n revise: \"Revise request\",\n diffAriaLabel: \"Proposed source diff\",\n noOutput: \"No output.\",\n status: (status: AgentJobStatus) => STATUS_EN[status],\n }),\n announcements: Object.freeze({\n adapterDisabled: \"React inspection was disabled after an adapter failure.\",\n selectionEnabled: \"Element selection enabled.\",\n chooseAnother: \"Choose another element.\",\n reselectAfterChange: \"Choose the current elements again after the file change.\",\n sourceLoaded: \"Source context loaded.\",\n sourceFailed: \"Source context could not be loaded.\",\n addCancelled: \"Additional selection cancelled.\",\n selectionLimit: (maximum: number) =>\n `The selection limit of ${String(maximum)} elements has been reached.`,\n chooseAdditional: (selected: number, maximum: number) =>\n `Choose another element. ${String(selected)} of ${String(maximum)} selected.`,\n duplicate: \"That source target is already selected.\",\n sourceProbable:\n \"A probable React component was found without an authorized file token.\",\n sourceMissing: \"No authorized source marker was found for the selected element.\",\n noSelectable: \"No selectable element was found.\",\n allTargetsRemoved: \"All targets were removed. Choose an element to continue.\",\n targetRemoved: \"Selected target removed.\",\n detachedTargetPreserved:\n \"The page element was unloaded; its collected context remains selected.\",\n contextWarning: \"Browser context collection completed with a warning.\",\n contextCollected: \"Browser context collected.\",\n editorOpening: \"Opening source…\",\n editorOpened: \"Source opened in the editor.\",\n editorFailed: \"Could not open the editor. Start it or configure editor.\",\n completeInstructions:\n \"Add an instruction for every target and wait for context collection to finish.\",\n promptCopied: \"Prompt copied to the clipboard.\",\n clipboardUnavailable:\n \"Clipboard access is unavailable. Select the prompt manually.\",\n copyFailed: \"Copy failed. Select the prompt manually.\",\n appliedTargetsDetached:\n \"Changes applied. Reselect page elements after HMR before creating another request.\",\n }),\n errors: ERROR_MESSAGES_EN,\n }),\n \"zh-CN\": Object.freeze({\n localeName: \"中\",\n alternateLocaleName: \"EN\",\n switchLocale: \"将界面语言切换为英文\",\n brand: Object.freeze({\n name: \"SpotPatch\",\n context: \"实时上下文\",\n repository: \"GitHub ↗\",\n repositoryTitle: \"在 GitHub 上 Star SpotPatch\",\n }),\n trigger: Object.freeze({\n select: \"选择元素\",\n stop: \"停止选择\",\n title: (shortcut: string) => `切换 SpotPatch(${shortcut})`,\n }),\n dialog: Object.freeze({\n close: \"关闭 SpotPatch\",\n editTitle: \"规划本次修改\",\n editSubtitle: \"为每个选中目标分别写清楚修改要求。\",\n previewTitle: \"审阅修改请求\",\n previewSubtitle: \"发送给 AI 前,请核对完整上下文与每项目标说明。\",\n }),\n context: Object.freeze({\n collecting: \"正在采集上下文\",\n ready: \"上下文已就绪\",\n partial: \"部分上下文可用\",\n sourceUnavailable: \"源码位置不可用\",\n selectedElement: \"已选元素\",\n selectedCount: (count: number) => `已选择 ${String(count)} 个元素`,\n }),\n targets: Object.freeze({\n title: \"修改目标\",\n ariaLabel: \"已选目标与逐项目标说明\",\n count: (selected: number, maximum: number) =>\n `${String(selected)} / ${String(maximum)}`,\n complete: (complete: number, total: number) =>\n `已描述 ${String(complete)} / ${String(total)}`,\n instructionBudget: (used: number, maximum: number) =>\n `说明字符 ${String(used)} / ${String(maximum)}`,\n instructionBudgetExceeded: (used: number, maximum: number) =>\n `说明字符 ${String(used)} / ${String(maximum)},请精简后继续`,\n statusReady: \"已就绪\",\n statusPartial: \"部分可用\",\n statusCollecting: \"采集中\",\n instructionReady: \"已填写修改说明\",\n instructionMissing: \"待填写修改说明\",\n instructionLabel: (name: string) => `${name} 的修改说明`,\n instructionPlaceholder: \"描述这个目标期望达到的结果,以及不能破坏的约束……\",\n instructionCount: (used: number, maximum: number) =>\n `${String(used)} / ${String(maximum)}`,\n activate: (index: number) => `编辑目标 ${String(index)}`,\n remove: (index: number) => `移除目标 ${String(index)}`,\n removeTitle: \"移除目标\",\n addTitle: \"继续为本次请求选择元素\",\n limitTitle: (maximum: number) => `已达到 ${String(maximum)} 个目标的上限`,\n }),\n diagnostics: Object.freeze({\n title: \"已采集上下文\",\n resolving: \"正在解析源码……\",\n noExactSource: \"没有精确源码标记\",\n promptAriaLabel: \"生成的 Prompt\",\n }),\n summary: SUMMARY_MESSAGES_ZH,\n actions: Object.freeze({\n addElement: \"添加元素\",\n reselect: \"重新开始\",\n openEditor: \"打开源码\",\n openTarget: (index: number) => `打开目标 ${String(index)} 的源码`,\n preview: \"预览 Prompt\",\n copy: \"复制 Prompt\",\n back: \"返回编辑\",\n }),\n agent: Object.freeze({\n title: \"AI 代码 Agent\",\n mode: \"执行方式\",\n review: \"审阅模式\",\n autoGated: \"受控自动模式\",\n trustedFast: \"可信极速模式\",\n provider: \"模型服务\",\n model: \"模型\",\n providerAriaLabel: \"AI 模型服务\",\n modelAriaLabel: \"AI 模型\",\n providerUnavailable: \"模型服务配置不可用。\",\n consent: (provider: string) =>\n `我了解选中上下文与获准源码可能发送到 ${provider},并自行负责其数据策略。`,\n trustedFastConsent: (provider: string) =>\n `为 ${provider} 启用可信极速模式:发送获准的项目上下文、纳入当前本地修改、跳过项目验证检查,并立即应用 AI 变更,包括删除文件与配置变更。`,\n connectionNotTested: \"尚未执行可选连接检查\",\n workspaceNotChecked: \"尚未检查本地工作区\",\n checkingWorkspace: \"正在检查 Git 工作区与隔离执行环境……\",\n workspaceReady: \"本地工作区已满足隔离执行条件\",\n workspaceDirty: (staged: number, unstaged: number, untracked: number) =>\n `发现本地修改 · 暂存 ${String(staged)} · 未暂存 ${String(unstaged)} · 未跟踪 ${String(untracked)}`,\n includeLocalChanges: \"允许 Agent 基于我当前的本地修改继续\",\n includeLocalChangesHelp:\n \"Agent 可能继续修改这些文件;SpotPatch 会保留原基线,仅应用或撤销 Agent 自己的增量。\",\n localChangesConsentRequired: \"运行 AI 前,请确认允许纳入当前本地修改。\",\n capabilityVerified: \"Agent 能力验证通过\",\n capabilityVerifiedAnnouncement: \"AI 模型服务能力验证通过。\",\n testingCapability: \"正在验证鉴权、工具调用、连续调用与流式响应……\",\n applying: \"正在将变更应用到项目。\",\n cancelling: \"正在取消 Agent 任务。\",\n reverting: \"正在撤销已应用的 Agent 变更。\",\n consentRequired: \"运行 AI 前,请先确认允许向远程模型服务传输数据。\",\n toolsReady: \"工具调用与流式响应已就绪\",\n testConnection: \"检查运行环境\",\n verifying: \"验证中……\",\n run: \"运行 AI\",\n cancel: \"取消 Agent\",\n discard: \"放弃变更\",\n apply: \"应用变更\",\n revert: \"撤销变更\",\n revise: \"修改请求\",\n diffAriaLabel: \"建议的源码差异\",\n noOutput: \"没有输出。\",\n status: (status: AgentJobStatus) => STATUS_ZH[status],\n }),\n announcements: Object.freeze({\n adapterDisabled: \"React 适配器异常,本次会话已停用 React 检查。\",\n selectionEnabled: \"元素选择已启用。\",\n chooseAnother: \"请选择另一个元素。\",\n reselectAfterChange: \"文件变更后,请重新选择当前页面元素。\",\n sourceLoaded: \"源码上下文已加载。\",\n sourceFailed: \"源码上下文加载失败。\",\n addCancelled: \"已取消追加选择。\",\n selectionLimit: (maximum: number) =>\n `已达到 ${String(maximum)} 个元素的选择上限。`,\n chooseAdditional: (selected: number, maximum: number) =>\n `请选择另一个元素,当前已选 ${String(selected)} / ${String(maximum)}。`,\n duplicate: \"该源码目标已经在当前选择中。\",\n sourceProbable: \"找到可能的 React 组件,但没有获授权的源码标记。\",\n sourceMissing: \"选中元素没有获授权的源码标记。\",\n noSelectable: \"当前位置没有可选择的元素。\",\n allTargetsRemoved: \"已移除全部目标,请重新选择元素。\",\n targetRemoved: \"已移除选中目标。\",\n detachedTargetPreserved: \"页面元素已卸载,已采集的上下文仍保留在选择中。\",\n contextWarning: \"浏览器上下文采集完成,但存在警告。\",\n contextCollected: \"浏览器上下文采集完成。\",\n editorOpening: \"正在打开源码……\",\n editorOpened: \"源码已在编辑器中打开。\",\n editorFailed: \"无法打开编辑器。请先启动编辑器或检查 editor 配置。\",\n completeInstructions: \"请为每个目标填写修改说明,并等待上下文采集完成。\",\n promptCopied: \"Prompt 已复制到剪贴板。\",\n clipboardUnavailable: \"无法访问剪贴板,请手动选择并复制 Prompt。\",\n copyFailed: \"复制失败,请手动选择并复制 Prompt。\",\n appliedTargetsDetached: \"变更已应用;HMR 后请重新选择页面元素再发起新请求。\",\n }),\n errors: ERROR_MESSAGES_ZH,\n }),\n} satisfies Readonly<Record<SpotPatchLocale, UiMessages>>);\n\nexport interface UiLocalizer {\n readonly locale: () => SpotPatchLocale;\n readonly messages: () => UiMessages;\n readonly subscribe: (listener: () => void) => () => void;\n readonly toggle: () => void;\n}\n\nfunction localeFromLanguage(value: string | undefined): SpotPatchLocale | undefined {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"zh\" || normalized.startsWith(\"zh-\")) {\n return \"zh-CN\";\n }\n\n return normalized === \"en\" || normalized.startsWith(\"en-\") ? \"en-US\" : undefined;\n}\n\nexport function resolveUiLocale(\n preference: SpotPatchLocalePreference,\n document: Document,\n): SpotPatchLocale {\n if (preference !== \"auto\") {\n return preference;\n }\n\n const documentLocale = localeFromLanguage(document.documentElement.lang);\n\n if (documentLocale !== undefined) {\n return documentLocale;\n }\n\n const navigatorLocale = document.defaultView?.navigator.languages\n .map(localeFromLanguage)\n .find((candidate): candidate is SpotPatchLocale => candidate !== undefined);\n return navigatorLocale ?? \"en-US\";\n}\n\nexport function createUiLocalizer(\n document: Document,\n preference: SpotPatchLocalePreference = \"auto\",\n): UiLocalizer {\n let currentLocale = resolveUiLocale(preference, document);\n const listeners = new Set<() => void>();\n\n return Object.freeze({\n locale: () => currentLocale,\n messages: () => UI_MESSAGES[currentLocale],\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n toggle(): void {\n currentLocale = currentLocale === \"en-US\" ? \"zh-CN\" : \"en-US\";\n\n for (const listener of listeners) {\n listener();\n }\n },\n });\n}\n","import type { CodeContext, SourceConfidence, StyleContext } from \"@spotpatch/shared\";\n\nimport type { ElementSourceResolution } from \"../source/source-resolver.js\";\n\nexport type ApiConnectionStatus = \"connected\" | \"failed\" | \"loading\" | \"not-required\";\nexport type CollectionStatus = \"failed\" | \"loading\" | \"ready\";\n\nexport interface SelectionSummaryInput {\n readonly apiStatus: ApiConnectionStatus;\n readonly code?: CodeContext;\n readonly collectionStatus: CollectionStatus;\n readonly framework: \"next\" | \"vite\";\n readonly frameworkVersion: string;\n readonly resolution: ElementSourceResolution;\n readonly spotPatchVersion: string;\n readonly styles?: StyleContext;\n}\n\nexport interface SelectionSummaryMessages {\n readonly available: string;\n readonly adapter: string;\n readonly api: string;\n readonly apiStatuses: Readonly<Record<ApiConnectionStatus, string>>;\n readonly boundary: string;\n readonly boundaries: Readonly<Record<CodeContext[\"boundary\"], string>>;\n readonly browserContext: string;\n readonly collectionStatuses: Readonly<Record<CollectionStatus, string>>;\n readonly component: string;\n readonly confidence: string;\n readonly confidenceLabels: Readonly<Record<SourceConfidence, string>>;\n readonly cssWarnings: string;\n readonly origin: string;\n readonly source: string;\n readonly sourceContext: string;\n readonly stack: string;\n readonly target: (index: number, active: boolean) => string;\n readonly unavailable: string;\n readonly unsupported: string;\n readonly warning: string;\n readonly lineLocation: (line: number, column?: number) => string;\n}\n\nfunction sourceLocation(\n resolution: ElementSourceResolution,\n context: CodeContext | undefined,\n messages: SelectionSummaryMessages,\n): string {\n const path = context?.relativePath ?? resolution.source.relativePath;\n const line = resolution.source.line;\n const column = resolution.source.column;\n\n if (path !== undefined && line !== undefined) {\n return `${path}:${String(line)}${column === undefined ? \"\" : `:${String(column)}`}`;\n }\n\n if (path !== undefined) {\n return path;\n }\n\n if (line !== undefined) {\n return messages.lineLocation(line, column);\n }\n\n return messages.unavailable;\n}\n\nexport function createSelectionSummary(\n input: SelectionSummaryInput,\n messages: SelectionSummaryMessages,\n): string {\n const lines = [\n `SpotPatch: ${input.spotPatchVersion}`,\n `${input.framework === \"next\" ? \"Next.js\" : \"Vite\"}: ${input.frameworkVersion}`,\n `${messages.source}: ${sourceLocation(input.resolution, input.code, messages)}`,\n `${messages.confidence}: ${input.resolution.source.confidence} (${messages.confidenceLabels[input.resolution.source.confidence]})`,\n `${messages.origin}: ${input.resolution.source.origin}`,\n ];\n\n if (input.resolution.react.componentName !== undefined) {\n lines.push(`${messages.component}: ${input.resolution.react.componentName}`);\n }\n\n if (input.resolution.react.componentStack.length > 0) {\n lines.push(\n `${messages.stack}: ${input.resolution.react.componentStack.join(\" > \")}`,\n );\n }\n\n if (\n !input.resolution.react.supported &&\n input.resolution.react.version !== undefined\n ) {\n lines.push(`React ${input.resolution.react.version}: ${messages.unsupported}`);\n }\n\n lines.push(\n `${messages.adapter}: ${input.resolution.react.supported ? messages.available : messages.unavailable}`,\n `${messages.api}: ${messages.apiStatuses[input.apiStatus]}`,\n `${messages.browserContext}: ${messages.collectionStatuses[input.collectionStatus]}`,\n );\n\n if (input.code !== undefined) {\n lines.push(`${messages.boundary}: ${messages.boundaries[input.code.boundary]}`);\n } else if (input.apiStatus === \"loading\") {\n lines.push(`${messages.sourceContext}: ${messages.apiStatuses.loading}`);\n } else if (input.apiStatus === \"failed\") {\n lines.push(`${messages.sourceContext}: ${messages.unavailable}`);\n }\n\n if (input.styles !== undefined) {\n lines.push(`${messages.cssWarnings}: ${String(input.styles.warnings.length)}`);\n lines.push(\n ...input.styles.warnings.map((warning) => `${messages.warning}: ${warning}`),\n );\n }\n\n return lines.join(\"\\n\");\n}\n","import {\n ERROR_CODES,\n type AgentCapabilitySnapshot,\n type AgentJobEvent,\n type AgentJobResult,\n type AgentJobSnapshot,\n type AgentWorkspaceHealthSnapshot,\n type RuntimeAiConfig,\n type SpotAnnotation,\n} from \"@spotpatch/shared\";\n\nimport {\n RuntimeApiError,\n runtimeApiErrorCode,\n type RuntimeApi,\n} from \"../api/runtime-api.js\";\nimport type { AgentActivityItem } from \"../ui/agent-panel.js\";\nimport type { RuntimeView } from \"../ui/runtime-view.js\";\n\nexport interface AgentWorkflow {\n readonly apply: () => void;\n readonly beginSelection: () => void;\n readonly cancel: () => void;\n readonly consentChanged: () => void;\n readonly disposeSelection: () => void;\n readonly providerOrModelChanged: () => void;\n readonly reset: () => void;\n readonly revert: () => void;\n readonly run: () => void;\n readonly testCapability: () => void;\n}\n\nexport interface CreateAgentWorkflowOptions {\n readonly ai: RuntimeAiConfig;\n readonly api: RuntimeApi;\n readonly getAnnotation: () => SpotAnnotation | undefined;\n readonly onApplied: () => void;\n readonly onReselectRequired: () => void;\n readonly view: RuntimeView;\n}\n\nfunction capabilityKey(providerProfileId: string, modelProfileId: string): string {\n return `${providerProfileId}:${modelProfileId}`;\n}\n\nfunction activityFromEvent(event: AgentJobEvent): AgentActivityItem | undefined {\n if (event.type === \"tool\") {\n return Object.freeze({\n key: `tool:${String(event.data.turn)}:${event.data.toolCallId}`,\n label: `${event.data.toolName} · ${event.data.state}`,\n state:\n event.data.state === \"started\"\n ? \"active\"\n : event.data.state === \"succeeded\"\n ? \"success\"\n : \"failure\",\n });\n }\n\n if (event.type === \"check\") {\n return Object.freeze({\n key: `check:${event.data.result.checkId}:${String(event.sequence)}`,\n label: `${event.data.result.label} · ${event.data.result.status}`,\n state:\n event.data.result.status === \"passed\"\n ? \"success\"\n : event.data.result.status === \"failed\" ||\n event.data.result.status === \"timed-out\"\n ? \"failure\"\n : \"info\",\n });\n }\n\n return undefined;\n}\n\nexport function createAgentWorkflow(\n options: CreateAgentWorkflowOptions,\n): AgentWorkflow {\n const errorCode = (error: unknown) =>\n runtimeApiErrorCode(error) ?? ERROR_CODES.INTERNAL_ERROR;\n const errorMessage = (error: unknown): string =>\n options.view.messages().errors[errorCode(error)];\n const capabilities = new Map<string, AgentCapabilitySnapshot>();\n const providerConsents = new Set<string>();\n const activities = new Map<string, AgentActivityItem>();\n let revision = 0;\n let snapshot: AgentJobSnapshot | undefined;\n let result: AgentJobResult | undefined;\n let appliedDuringCurrentJob = false;\n let actionPending = false;\n\n const selectedProfiles = () => options.view.readAgentSelection();\n const consentKey = (selection: NonNullable<ReturnType<typeof selectedProfiles>>) =>\n `${selection.providerProfileId}:${selection.applyMode}`;\n\n const refreshWorkspaceHealth = async (\n workflowRevision: number,\n ): Promise<AgentWorkspaceHealthSnapshot> => {\n options.view.renderAgentWorkspaceHealth(\"checking\");\n\n try {\n const health = await options.api.agentWorkspaceHealth();\n\n if (workflowRevision !== revision) {\n return health;\n }\n\n options.view.renderAgentWorkspaceHealth(health.state, health, health.errorCode);\n return health;\n } catch (error: unknown) {\n if (workflowRevision === revision) {\n options.view.renderAgentWorkspaceHealth(\"blocked\", undefined, errorCode(error));\n }\n\n throw error;\n }\n };\n\n const renderJob = (explicitErrorCode?: ReturnType<typeof errorCode>): void => {\n if (snapshot === undefined) {\n return;\n }\n\n options.view.renderAgentJob(\n snapshot,\n result,\n Object.freeze([...activities.values()]),\n explicitErrorCode ?? snapshot.errorCode,\n );\n };\n\n const restoreProviderState = (): void => {\n const selection = selectedProfiles();\n\n if (selection === undefined) {\n options.view.setAgentProviderConsent(false);\n options.view.renderAgentCapability(\n \"error\",\n options.view.messages().agent.providerUnavailable,\n );\n return;\n }\n\n options.view.setAgentProviderConsent(providerConsents.has(consentKey(selection)));\n const cached = capabilities.get(\n capabilityKey(selection.providerProfileId, selection.modelProfileId),\n );\n\n if (cached === undefined) {\n options.view.renderAgentCapability(\n \"idle\",\n options.view.messages().agent.connectionNotTested,\n );\n } else {\n options.view.renderAgentCapability(\n \"ready\",\n options.view.messages().agent.capabilityVerified,\n cached,\n );\n }\n };\n\n const probe = async (workflowRevision: number): Promise<AgentCapabilitySnapshot> => {\n const selection = selectedProfiles();\n\n if (selection === undefined) {\n throw new Error(\"Agent provider selection is unavailable.\");\n }\n\n const key = capabilityKey(selection.providerProfileId, selection.modelProfileId);\n const cached = capabilities.get(key);\n\n if (cached !== undefined) {\n return cached;\n }\n\n options.view.renderAgentCapability(\n \"probing\",\n options.view.messages().agent.testingCapability,\n );\n const capability = await options.api.agentCapability(selection);\n\n if (workflowRevision !== revision) {\n return capability;\n }\n\n if (capability.state !== \"agent-ready\") {\n throw new RuntimeApiError(\n capability.errorCode ?? ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED,\n );\n }\n\n capabilities.set(key, capability);\n options.view.renderAgentCapability(\n \"ready\",\n options.view.messages().agent.capabilityVerified,\n capability,\n );\n options.view.announce(options.view.messages().agent.capabilityVerifiedAnnouncement);\n return capability;\n };\n\n const refreshResult = async (\n jobId: string,\n workflowRevision: number,\n ): Promise<void> => {\n try {\n const response = await options.api.agentResult(jobId);\n\n if (workflowRevision !== revision || response.snapshot.jobId !== jobId) {\n return;\n }\n\n snapshot = response.snapshot;\n result = response.result;\n renderJob();\n } catch (error: unknown) {\n if (workflowRevision === revision) {\n renderJob(errorCode(error));\n }\n }\n };\n\n const observeJob = async (jobId: string, workflowRevision: number): Promise<void> => {\n try {\n await options.api.agentEvents(jobId, (event) => {\n if (workflowRevision !== revision || event.jobId !== jobId) {\n return;\n }\n\n if (event.type === \"snapshot\") {\n snapshot = event.data.snapshot;\n\n if (snapshot.status === \"applied\" && !appliedDuringCurrentJob) {\n appliedDuringCurrentJob = true;\n options.onApplied();\n }\n }\n\n const activity = activityFromEvent(event);\n\n if (activity !== undefined) {\n activities.set(activity.key, activity);\n }\n\n renderJob();\n });\n\n if (workflowRevision === revision) {\n await refreshResult(jobId, workflowRevision);\n }\n } catch (error: unknown) {\n if (\n workflowRevision === revision &&\n !(error instanceof DOMException && error.name === \"AbortError\")\n ) {\n renderJob(errorCode(error));\n }\n }\n };\n\n const runAction = async (action: \"apply\" | \"cancel\" | \"revert\"): Promise<void> => {\n const current = snapshot;\n\n if (current === undefined || actionPending) {\n return;\n }\n\n actionPending = true;\n const workflowRevision = revision;\n snapshot = Object.freeze({\n ...current,\n status:\n action === \"apply\"\n ? \"applying\"\n : action === \"cancel\"\n ? \"cancelling\"\n : \"reverting\",\n phaseMessage:\n action === \"apply\"\n ? options.view.messages().agent.applying\n : action === \"cancel\"\n ? options.view.messages().agent.cancelling\n : options.view.messages().agent.reverting,\n canCancel: false,\n canApply: false,\n canRevert: false,\n });\n renderJob();\n\n try {\n const updated =\n action === \"apply\"\n ? await options.api.applyAgentJob(current.jobId)\n : action === \"cancel\"\n ? await options.api.cancelAgentJob(current.jobId)\n : await options.api.revertAgentJob(current.jobId);\n\n if (workflowRevision !== revision) {\n return;\n }\n\n snapshot = updated;\n\n if (updated.status === \"applied\" && !appliedDuringCurrentJob) {\n appliedDuringCurrentJob = true;\n options.onApplied();\n }\n\n await refreshResult(updated.jobId, workflowRevision);\n } catch (error: unknown) {\n if (workflowRevision !== revision) {\n return;\n }\n\n snapshot = current;\n await refreshResult(current.jobId, workflowRevision);\n renderJob(errorCode(error));\n options.view.announce(errorMessage(error));\n } finally {\n if (workflowRevision === revision) {\n actionPending = false;\n }\n }\n };\n\n const resetState = (): void => {\n revision += 1;\n snapshot = undefined;\n result = undefined;\n activities.clear();\n appliedDuringCurrentJob = false;\n actionPending = false;\n options.view.resetAgentJob();\n options.view.setAgentEditingEnabled(true);\n restoreProviderState();\n };\n\n return Object.freeze({\n apply(): void {\n if (snapshot?.canApply === true) {\n void runAction(\"apply\");\n }\n },\n\n beginSelection(): void {\n resetState();\n const workflowRevision = revision;\n\n if (options.ai.enabled) {\n void refreshWorkspaceHealth(workflowRevision).catch(() => undefined);\n }\n },\n\n cancel(): void {\n if (snapshot?.canCancel === true) {\n void runAction(\"cancel\");\n }\n },\n\n consentChanged(): void {\n const selection = selectedProfiles();\n\n if (selection === undefined) {\n return;\n }\n\n if (options.view.agentConsentGranted()) {\n providerConsents.add(consentKey(selection));\n } else {\n providerConsents.delete(consentKey(selection));\n }\n },\n\n disposeSelection(): void {\n const cancellableJobId =\n snapshot?.canCancel === true || snapshot?.status === \"cancelling\"\n ? snapshot.jobId\n : undefined;\n revision += 1;\n snapshot = undefined;\n result = undefined;\n activities.clear();\n appliedDuringCurrentJob = false;\n actionPending = false;\n\n if (cancellableJobId !== undefined) {\n void options.api.cancelAgentJob(cancellableJobId).catch(() => undefined);\n }\n },\n\n providerOrModelChanged(): void {\n revision += 1;\n restoreProviderState();\n const workflowRevision = revision;\n void refreshWorkspaceHealth(workflowRevision).catch(() => undefined);\n },\n\n reset(): void {\n const mustReselect = appliedDuringCurrentJob;\n resetState();\n\n if (mustReselect) {\n options.onReselectRequired();\n } else if (options.ai.enabled) {\n const workflowRevision = revision;\n void refreshWorkspaceHealth(workflowRevision).catch(() => undefined);\n }\n },\n\n revert(): void {\n if (snapshot?.canRevert === true) {\n void runAction(\"revert\");\n }\n },\n\n run(): void {\n if (!options.ai.enabled || snapshot !== undefined) {\n return;\n }\n\n const selection = selectedProfiles();\n const annotation = options.getAnnotation();\n\n if (selection === undefined || annotation === undefined) {\n options.view.announce(\n options.view.messages().announcements.completeInstructions,\n );\n return;\n }\n\n if (!options.view.agentConsentGranted()) {\n options.view.announce(options.view.messages().agent.consentRequired);\n return;\n }\n\n providerConsents.add(consentKey(selection));\n const workflowRevision = ++revision;\n options.view.setAgentEditingEnabled(false);\n\n void refreshWorkspaceHealth(workflowRevision)\n .then(async (health) => {\n if (workflowRevision !== revision) {\n return;\n }\n\n if (health.state === \"blocked\") {\n throw new RuntimeApiError(\n health.errorCode ?? ERROR_CODES.WORKTREE_LOCAL_CHANGES_UNSUPPORTED,\n );\n }\n\n if (\n health.state === \"consent-required\" &&\n !options.view.agentWorkspaceConsentGranted()\n ) {\n throw new RuntimeApiError(ERROR_CODES.WORKTREE_DIRTY);\n }\n\n const created = await options.api.createAgentJob({\n annotation,\n applyMode: selection.applyMode,\n providerProfileId: selection.providerProfileId,\n modelProfileId: selection.modelProfileId,\n providerDataConsent: true,\n ...(selection.applyMode === \"trusted-auto\"\n ? { trustedFastModeConsent: true as const }\n : {}),\n workingTreeMode:\n health.state === \"consent-required\"\n ? \"include-local-changes\"\n : \"require-clean\",\n });\n\n if (workflowRevision !== revision) {\n return;\n }\n\n snapshot = created;\n result = undefined;\n activities.clear();\n renderJob();\n void observeJob(created.jobId, workflowRevision);\n })\n .catch((error: unknown) => {\n if (workflowRevision !== revision) {\n return;\n }\n\n options.view.setAgentEditingEnabled(true);\n options.view.renderAgentCapability(\n \"error\",\n errorMessage(error),\n undefined,\n errorCode(error),\n );\n options.view.announce(errorMessage(error));\n });\n },\n\n testCapability(): void {\n if (!options.ai.enabled || snapshot !== undefined) {\n return;\n }\n\n const workflowRevision = ++revision;\n void Promise.all([\n probe(workflowRevision),\n refreshWorkspaceHealth(workflowRevision),\n ]).catch((error: unknown) => {\n if (workflowRevision === revision) {\n options.view.renderAgentCapability(\n \"error\",\n errorMessage(error),\n undefined,\n errorCode(error),\n );\n options.view.announce(errorMessage(error));\n }\n });\n },\n });\n}\n","import type { PageContext } from \"@spotpatch/shared\";\n\nexport type ClipboardWriter = Readonly<{\n writeText(value: string): Promise<void>;\n}>;\n\nexport function createBrowserAnnotationId(window: Window): string {\n if (typeof window.crypto.randomUUID === \"function\") {\n return window.crypto.randomUUID();\n }\n\n const bytes = window.crypto.getRandomValues(new Uint8Array(16));\n return Array.from(bytes, (value) => value.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function collectPageContext(document: Document, window: Window): PageContext {\n return Object.freeze({\n url: window.location.href,\n pathname: window.location.pathname,\n title: document.title,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n devicePixelRatio: window.devicePixelRatio,\n });\n}\n\nexport function resolveClipboardWriter(\n navigator: Navigator,\n): ClipboardWriter | undefined {\n const candidate: unknown = Reflect.get(navigator, \"clipboard\");\n\n return typeof candidate === \"object\" &&\n candidate !== null &&\n \"writeText\" in candidate &&\n typeof candidate.writeText === \"function\"\n ? (candidate as ClipboardWriter)\n : undefined;\n}\n","import { createController, type SpotPatchController } from \"./runtime-controller.js\";\nimport type { RuntimeConfig } from \"./runtime-config.js\";\n\nexport const RUNTIME_INSTANCE_KEY = \"__spotpatchRuntime__\" as const;\n\ntype GlobalWithSpotPatch = typeof globalThis & {\n [RUNTIME_INSTANCE_KEY]?: SpotPatchController;\n};\n\nexport function bootstrapSpotPatch(config: RuntimeConfig): void {\n const target = globalThis as GlobalWithSpotPatch;\n target[RUNTIME_INSTANCE_KEY]?.dispose();\n const controller = createController(config);\n target[RUNTIME_INSTANCE_KEY] = controller;\n controller.mount();\n}\n","import {\n DATA_FLOW_SCHEMA_VERSION,\n DATA_FLOW_URL_QUERY_KEY_LIMIT,\n SPOTPATCH_API_BASE,\n type NetworkObservation,\n type RuntimeDataFlowConfig,\n type RuntimeDataFlowLimits,\n type SanitizedObservedUrl,\n} from \"@spotpatch/shared/data-flow-runtime\";\n\nexport interface DataFlowComponentRegistration {\n readonly componentSourceId: string;\n readonly sourceVersion: string;\n}\n\nexport interface DataFlowInvocationToken {\n readonly invocationId: string;\n readonly componentSourceId: string;\n readonly triggerCallsiteId: string;\n readonly sourceVersion: string;\n}\n\nexport interface DataFlowRequestFrame {\n readonly requestCallsiteId: string;\n readonly sourceVersion: string;\n readonly invocationToken?: DataFlowInvocationToken;\n}\n\nexport interface DataFlowTriggerMetadata {\n readonly componentSourceId: string;\n readonly triggerCallsiteId: string;\n readonly sourceVersion: string;\n}\n\nexport interface DataFlowRequestMetadata {\n readonly requestCallsiteId: string;\n readonly sourceVersion: string;\n}\n\nexport interface DataFlowRuntime {\n readonly beginInvocation: (\n metadata: DataFlowTriggerMetadata,\n ) => DataFlowInvocationToken;\n readonly bindInvocation: <Arguments extends readonly unknown[], Result>(\n token: DataFlowInvocationToken | undefined,\n callback: (...args: Arguments) => Result,\n ) => (...args: Arguments) => Result;\n readonly bindTrigger: <Callback>(\n metadata: DataFlowTriggerMetadata,\n callback: Callback,\n ) => Callback;\n readonly captureInvocation: () => DataFlowInvocationToken | undefined;\n readonly clear: () => void;\n readonly createTrpcLink: () => DataFlowTrpcLink;\n readonly dispose: () => void;\n readonly getComponentRegistration: (\n component: object,\n ) => DataFlowComponentRegistration | undefined;\n readonly getCurrentRequestFrame: () => DataFlowRequestFrame | undefined;\n readonly observations: () => readonly NetworkObservation[];\n readonly updateRoute: (routeKey: string) => void;\n readonly registerComponent: (\n component: object,\n componentSourceId: string,\n sourceVersion: string,\n ) => void;\n readonly withInvocation: <Result>(\n token: DataFlowInvocationToken | undefined,\n callback: () => Result,\n ) => Result;\n readonly withRequestFrame: <Result>(\n token: DataFlowInvocationToken | undefined,\n metadata: DataFlowRequestMetadata,\n callback: () => Result,\n ) => Result;\n}\n\nexport interface DataFlowTrpcOperation {\n readonly path: unknown;\n readonly type: unknown;\n}\n\nexport interface DataFlowTrpcLinkOptions<\n Operation extends DataFlowTrpcOperation,\n Result,\n> {\n readonly next: (operation: Operation) => Result;\n readonly op: Operation;\n}\n\nexport type DataFlowTrpcLink = (\n runtime: unknown,\n) => <Operation extends DataFlowTrpcOperation, Result>(\n options: DataFlowTrpcLinkOptions<Operation, Result>,\n) => Result;\n\ninterface DataFlowGlobal {\n readonly fetch?: typeof globalThis.fetch;\n readonly location?: Location;\n readonly performance?: Performance;\n readonly XMLHttpRequest?: typeof globalThis.XMLHttpRequest;\n}\n\ninterface MutableDataFlowGlobal extends DataFlowGlobal {\n fetch?: typeof globalThis.fetch;\n}\n\ninterface XhrMetadata {\n readonly method: string;\n readonly url: string;\n}\n\ninterface RingEntry {\n readonly bytes: number;\n readonly observation: NetworkObservation;\n readonly recordedAt: number;\n}\n\nconst RUNTIME_KEY: unique symbol = Symbol.for(\n \"spotpatch.data-flow.runtime.v1\",\n) as never;\nconst REACT_MEMO_TYPE = Symbol.for(\"react.memo\");\nconst REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\");\n\ntype DataFlowRuntimeStore = Partial<Record<symbol, DataFlowRuntime>>;\ntype GlobalWithDataFlow = MutableDataFlowGlobal & DataFlowRuntimeStore;\n\nfunction positiveNow(target: DataFlowGlobal): number {\n return target.performance?.now() ?? Date.now();\n}\n\nfunction createOpaqueSequence(prefix: string): () => string {\n let sequence = 0;\n const randomPrefix = (() => {\n try {\n const bytes = new Uint8Array(8);\n globalThis.crypto.getRandomValues(bytes);\n return Array.from(bytes, (value) => value.toString(36).padStart(2, \"0\")).join(\"\");\n } catch {\n return \"local\";\n }\n })();\n\n return () => {\n sequence += 1;\n return `${prefix}_${randomPrefix}_${sequence.toString(36)}`;\n };\n}\n\nfunction freezeUrl(value: string, baseUrl: string): SanitizedObservedUrl {\n try {\n const url = new URL(value, baseUrl);\n return Object.freeze({\n origin: url.origin,\n pathname: url.pathname,\n queryKeys: Object.freeze(\n [...new Set(url.searchParams.keys())]\n .sort()\n .slice(0, DATA_FLOW_URL_QUERY_KEY_LIMIT),\n ),\n });\n } catch {\n return Object.freeze({\n pathname: value.split(/[?#]/u, 1)[0] ?? \"{invalid}\",\n queryKeys: Object.freeze([]),\n });\n }\n}\n\nfunction readFetchUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.toString();\n return input.url;\n}\n\nfunction readFetchMethod(input: RequestInfo | URL, init?: RequestInit): string {\n if (init?.method !== undefined) return init.method.toUpperCase();\n return typeof Request !== \"undefined\" && input instanceof Request\n ? input.method.toUpperCase()\n : \"GET\";\n}\n\nfunction isSpotPatchInternalUrl(value: string, baseUrl: string): boolean {\n try {\n const pathname = new URL(value, baseUrl).pathname;\n return (\n pathname === SPOTPATCH_API_BASE || pathname.startsWith(`${SPOTPATCH_API_BASE}/`)\n );\n } catch {\n return false;\n }\n}\n\nfunction approximateBytes(value: unknown): number {\n return new TextEncoder().encode(JSON.stringify(value)).byteLength;\n}\n\nfunction createRingStore(\n limits: RuntimeDataFlowLimits,\n target: DataFlowGlobal,\n): Readonly<{\n add: (observation: NetworkObservation) => void;\n clear: () => void;\n values: () => readonly NetworkObservation[];\n}> {\n const entries: RingEntry[] = [];\n let totalBytes = 0;\n\n function removeExpired(now: number): void {\n while (\n entries[0] !== undefined &&\n now - entries[0].recordedAt > limits.observationTtlMs\n ) {\n const removed = entries.shift();\n if (removed !== undefined) totalBytes -= removed.bytes;\n }\n }\n\n return Object.freeze({\n add(observation): void {\n const now = positiveNow(target);\n removeExpired(now);\n const bytes = approximateBytes(observation);\n if (bytes > limits.observationMaxBytes) return;\n entries.push(Object.freeze({ bytes, observation, recordedAt: now }));\n totalBytes += bytes;\n\n while (\n entries.length > limits.observationMaxEntries ||\n totalBytes > limits.observationMaxBytes\n ) {\n const removed = entries.shift();\n if (removed !== undefined) totalBytes -= removed.bytes;\n }\n },\n clear(): void {\n entries.length = 0;\n totalBytes = 0;\n },\n values(): readonly NetworkObservation[] {\n removeExpired(positiveNow(target));\n return Object.freeze(entries.map(({ observation }) => observation));\n },\n });\n}\n\nfunction ownPropertyDescriptor(\n target: object,\n key: PropertyKey,\n): PropertyDescriptor | undefined {\n try {\n return Object.getOwnPropertyDescriptor(target, key);\n } catch {\n return undefined;\n }\n}\n\nfunction nestedReactWrapperComponent(candidate: object): object | undefined {\n const marker: unknown = ownPropertyDescriptor(candidate, \"$$typeof\")?.value;\n const key =\n marker === REACT_MEMO_TYPE\n ? \"type\"\n : marker === REACT_FORWARD_REF_TYPE\n ? \"render\"\n : undefined;\n if (key === undefined) return undefined;\n const nested: unknown = ownPropertyDescriptor(candidate, key)?.value;\n return (typeof nested === \"object\" && nested !== null) || typeof nested === \"function\"\n ? nested\n : undefined;\n}\n\nfunction installWritableDataProperty(\n target: object,\n key: PropertyKey,\n replacement: object,\n original: PropertyDescriptor | undefined = ownPropertyDescriptor(target, key),\n): (() => void) | undefined {\n if (original === undefined || !(\"value\" in original) || !original.writable) {\n return undefined;\n }\n\n try {\n Object.defineProperty(target, key, { ...original, value: replacement });\n } catch {\n return undefined;\n }\n\n return (): void => {\n try {\n if (ownPropertyDescriptor(target, key)?.value === replacement) {\n Object.defineProperty(target, key, original);\n }\n } catch {\n // A host or later wrapper can make the property non-configurable.\n }\n };\n}\n\nfunction recordWithoutAffectingHost(record: () => void): void {\n try {\n record();\n } catch {\n // Observation is optional; the host transport result is authoritative.\n }\n}\n\nexport function createDataFlowRuntime(\n config: RuntimeDataFlowConfig,\n target: MutableDataFlowGlobal = globalThis,\n): DataFlowRuntime {\n const componentRegistry = new WeakMap<object, DataFlowComponentRegistration>();\n const xhrMetadata = new WeakMap<object, XhrMetadata>();\n const store = createRingStore(config.limits, target);\n const nextInvocationId = createOpaqueSequence(\"invocation\");\n const nextObservationId = createOpaqueSequence(\"observation\");\n const pageEpoch = createOpaqueSequence(\"page\")();\n const nextRouteEpoch = createOpaqueSequence(\"route\");\n let routeEpoch = nextRouteEpoch();\n let routeKey: string | undefined;\n let currentInvocation: DataFlowInvocationToken | undefined;\n let currentRequestFrame: DataFlowRequestFrame | undefined;\n let disposed = false;\n\n const originalFetch = (() => {\n try {\n return target.fetch;\n } catch {\n return undefined;\n }\n })();\n function spotPatchFetch(\n this: typeof globalThis,\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n if (originalFetch === undefined) {\n throw new TypeError(\"Fetch is unavailable.\");\n }\n const result = Reflect.apply(originalFetch, this, [input, init]);\n recordWithoutAffectingHost(() => {\n const frame = currentRequestFrame;\n const token = frame?.invocationToken;\n const rawUrl = readFetchUrl(input);\n if (\n isSpotPatchInternalUrl(\n rawUrl,\n target.location?.href ?? \"http://spotpatch.invalid/\",\n )\n ) {\n return;\n }\n store.add(\n Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n id: nextObservationId(),\n pageEpoch,\n routeEpoch,\n ...(frame === undefined\n ? {}\n : {\n requestCallsiteId: frame.requestCallsiteId,\n sourceVersion: frame.sourceVersion,\n }),\n ...(token === undefined\n ? {}\n : {\n invocationId: token.invocationId,\n componentSourceId: token.componentSourceId,\n triggerCallsiteId: token.triggerCallsiteId,\n }),\n transport: \"fetch\",\n method: readFetchMethod(input, init),\n url: freezeUrl(rawUrl, target.location?.href ?? \"http://spotpatch.invalid/\"),\n outcome: \"dispatched\",\n freshness: \"current\",\n diagnosticIds: Object.freeze([]),\n }),\n );\n });\n return result;\n }\n\n const restoreFetch =\n originalFetch === undefined\n ? undefined\n : installWritableDataProperty(target, \"fetch\", spotPatchFetch);\n\n const xhrPrototype = (() => {\n try {\n return target.XMLHttpRequest?.prototype;\n } catch {\n return undefined;\n }\n })();\n const originalOpenDescriptor =\n xhrPrototype === undefined\n ? undefined\n : ownPropertyDescriptor(xhrPrototype, \"open\");\n const originalSendDescriptor =\n xhrPrototype === undefined\n ? undefined\n : ownPropertyDescriptor(xhrPrototype, \"send\");\n\n function spotPatchOpen(\n this: XMLHttpRequest,\n method: string,\n url: string | URL,\n ...rest: readonly unknown[]\n ): void {\n const original: unknown = originalOpenDescriptor?.value;\n if (typeof original === \"function\") {\n Reflect.apply(original, this, [method, url, ...rest]);\n }\n recordWithoutAffectingHost(() => {\n xhrMetadata.set(this, Object.freeze({ method, url: String(url) }));\n });\n }\n\n function spotPatchSend(\n this: XMLHttpRequest,\n body?: Document | XMLHttpRequestBodyInit | null,\n ): void {\n const original: unknown = originalSendDescriptor?.value;\n if (typeof original === \"function\") Reflect.apply(original, this, [body]);\n recordWithoutAffectingHost(() => {\n const metadata = xhrMetadata.get(this);\n if (\n metadata === undefined ||\n isSpotPatchInternalUrl(\n metadata.url,\n target.location?.href ?? \"http://spotpatch.invalid/\",\n )\n ) {\n return;\n }\n const frame = currentRequestFrame;\n const token = frame?.invocationToken;\n store.add(\n Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n id: nextObservationId(),\n pageEpoch,\n routeEpoch,\n ...(frame === undefined\n ? {}\n : {\n requestCallsiteId: frame.requestCallsiteId,\n sourceVersion: frame.sourceVersion,\n }),\n ...(token === undefined\n ? {}\n : {\n invocationId: token.invocationId,\n componentSourceId: token.componentSourceId,\n triggerCallsiteId: token.triggerCallsiteId,\n }),\n transport: \"xhr\",\n method: metadata.method.toUpperCase(),\n url: freezeUrl(\n metadata.url,\n target.location?.href ?? \"http://spotpatch.invalid/\",\n ),\n outcome: \"dispatched\",\n freshness: \"current\",\n diagnosticIds: Object.freeze([]),\n }),\n );\n });\n }\n\n const restoreXhrOpen =\n xhrPrototype === undefined || typeof originalOpenDescriptor?.value !== \"function\"\n ? undefined\n : installWritableDataProperty(\n xhrPrototype,\n \"open\",\n spotPatchOpen,\n originalOpenDescriptor,\n );\n const restoreXhrSend =\n xhrPrototype === undefined || typeof originalSendDescriptor?.value !== \"function\"\n ? undefined\n : installWritableDataProperty(\n xhrPrototype,\n \"send\",\n spotPatchSend,\n originalSendDescriptor,\n );\n\n const runtime: DataFlowRuntime = Object.freeze({\n beginInvocation(metadata: DataFlowTriggerMetadata): DataFlowInvocationToken {\n return Object.freeze({\n invocationId: nextInvocationId(),\n componentSourceId: metadata.componentSourceId,\n triggerCallsiteId: metadata.triggerCallsiteId,\n sourceVersion: metadata.sourceVersion,\n });\n },\n bindInvocation<Arguments extends readonly unknown[], Result>(\n token: DataFlowInvocationToken | undefined,\n callback: (...args: Arguments) => Result,\n ): (...args: Arguments) => Result {\n return function boundInvocation(this: unknown, ...args: Arguments): Result {\n return runtime.withInvocation(token, () => Reflect.apply(callback, this, args));\n };\n },\n bindTrigger<Callback>(\n metadata: DataFlowTriggerMetadata,\n callback: Callback,\n ): Callback {\n if (typeof callback !== \"function\") return callback;\n const callable = callback as (...args: readonly unknown[]) => unknown;\n return function boundTrigger(this: unknown, ...args: readonly unknown[]) {\n const token = runtime.beginInvocation(metadata);\n return runtime.withInvocation(token, () => Reflect.apply(callable, this, args));\n } as Callback;\n },\n captureInvocation: () => currentInvocation,\n clear: store.clear,\n createTrpcLink(): DataFlowTrpcLink {\n return () =>\n <Operation extends DataFlowTrpcOperation, Result>(\n options: DataFlowTrpcLinkOptions<Operation, Result>,\n ): Result => {\n recordWithoutAffectingHost(() => {\n const operation = options.op.path;\n const operationType = options.op.type;\n if (\n typeof operation !== \"string\" ||\n operation.length === 0 ||\n operation.length > 512 ||\n (operationType !== \"query\" &&\n operationType !== \"mutation\" &&\n operationType !== \"subscription\")\n ) {\n return;\n }\n const frame = currentRequestFrame;\n const token = frame?.invocationToken;\n store.add(\n Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n id: nextObservationId(),\n pageEpoch,\n routeEpoch,\n ...(frame === undefined\n ? {}\n : {\n requestCallsiteId: frame.requestCallsiteId,\n sourceVersion: frame.sourceVersion,\n }),\n ...(token === undefined\n ? {}\n : {\n invocationId: token.invocationId,\n componentSourceId: token.componentSourceId,\n triggerCallsiteId: token.triggerCallsiteId,\n }),\n transport: \"trpc\",\n method: operationType.toUpperCase(),\n operation,\n url: Object.freeze({\n pathname: operation,\n queryKeys: Object.freeze([]),\n }),\n outcome: \"dispatched\",\n freshness: \"current\",\n diagnosticIds: Object.freeze([]),\n }),\n );\n });\n return options.next(options.op);\n };\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n store.clear();\n restoreFetch?.();\n restoreXhrOpen?.();\n restoreXhrSend?.();\n },\n getComponentRegistration: (component: object) => componentRegistry.get(component),\n getCurrentRequestFrame: () => currentRequestFrame,\n observations: () =>\n Object.freeze(\n store\n .values()\n .map((observation) =>\n observation.routeEpoch === routeEpoch\n ? observation\n : Object.freeze({ ...observation, freshness: \"stale-route\" as const }),\n ),\n ),\n registerComponent(\n component: object,\n componentSourceId: string,\n registeredSourceVersion: string,\n ): void {\n const registration = Object.freeze({\n componentSourceId,\n sourceVersion: registeredSourceVersion,\n });\n const pending = [component];\n const registered = new Set<object>();\n while (pending.length > 0) {\n const candidate = pending.pop();\n if (candidate === undefined || registered.has(candidate)) continue;\n registered.add(candidate);\n componentRegistry.set(candidate, registration);\n\n const nested = nestedReactWrapperComponent(candidate);\n if (nested !== undefined) pending.push(nested);\n }\n },\n updateRoute(nextRouteKey: string): void {\n if (routeKey === undefined) {\n routeKey = nextRouteKey;\n } else if (routeKey !== nextRouteKey) {\n routeKey = nextRouteKey;\n routeEpoch = nextRouteEpoch();\n }\n },\n withInvocation<Result>(\n token: DataFlowInvocationToken | undefined,\n callback: () => Result,\n ): Result {\n const parent = currentInvocation;\n currentInvocation = token;\n try {\n return callback();\n } finally {\n currentInvocation = parent;\n }\n },\n withRequestFrame<Result>(\n token: DataFlowInvocationToken | undefined,\n metadata: DataFlowRequestMetadata,\n callback: () => Result,\n ): Result {\n const parent = currentRequestFrame;\n currentRequestFrame = Object.freeze({\n requestCallsiteId: metadata.requestCallsiteId,\n sourceVersion: metadata.sourceVersion,\n ...(token === undefined ? {} : { invocationToken: token }),\n });\n try {\n return callback();\n } finally {\n currentRequestFrame = parent;\n }\n },\n });\n\n return runtime;\n}\n\nexport function installDataFlowPrelude(\n config: RuntimeDataFlowConfig,\n target: GlobalWithDataFlow = globalThis,\n): DataFlowRuntime | undefined {\n if (!config.enabled) return undefined;\n const runtime = target[RUNTIME_KEY] ?? createDataFlowRuntime(config, target);\n target[RUNTIME_KEY] = runtime;\n return runtime;\n}\n\nexport function getDataFlowRuntime(\n target: GlobalWithDataFlow = globalThis,\n): DataFlowRuntime | undefined {\n return target[RUNTIME_KEY];\n}\n","import {\n isSensitiveName,\n limitDataFlowReportCollections,\n type ComponentDataFlowReport,\n type DataDependency,\n type EvidenceRef,\n type NetworkObservation,\n type PageDataFlowReport,\n} from \"@spotpatch/shared\";\n\nfunction observationMatchesDependency(\n observation: NetworkObservation,\n dependency: DataDependency,\n): boolean {\n const origin = dependency.origin;\n const transportMatches =\n dependency.kind === \"rpc\"\n ? observation.transport === \"trpc\" &&\n dependency.operation !== undefined &&\n observation.operation === dependency.operation\n : dependency.kind === \"http\"\n ? observation.transport === \"fetch\" || observation.transport === \"xhr\"\n : false;\n if (\n !transportMatches ||\n observation.freshness !== \"current\" ||\n origin === undefined ||\n observation.requestCallsiteId !== origin.requestCallsiteId ||\n observation.sourceVersion !== origin.sourceVersion ||\n (dependency.method !== undefined &&\n observation.method.toUpperCase() !== dependency.method.toUpperCase()) ||\n (dependency.url !== undefined &&\n observation.url.pathname !== dependency.url.pathname) ||\n (dependency.url?.origin !== undefined &&\n observation.url.origin !== dependency.url.origin) ||\n (origin.componentSourceId !== undefined &&\n observation.componentSourceId !== undefined &&\n observation.componentSourceId !== origin.componentSourceId) ||\n (origin.triggerCallsiteId !== undefined &&\n observation.triggerCallsiteId !== undefined &&\n observation.triggerCallsiteId !== origin.triggerCallsiteId)\n ) {\n return false;\n }\n\n return (\n dependency.association !== \"transitive\" ||\n (observation.componentSourceId === origin.componentSourceId &&\n observation.triggerCallsiteId === origin.triggerCallsiteId)\n );\n}\n\nfunction runtimeEvidence(observation: NetworkObservation): EvidenceRef {\n return Object.freeze({\n id: observation.id,\n kind: \"runtime-observation\",\n summaryKey: \"dataFlow.evidence.runtimeDispatch\",\n });\n}\n\nfunction mergeDependencies(\n dependencies: readonly DataDependency[],\n observations: readonly NetworkObservation[],\n): Readonly<{\n dependencies: readonly DataDependency[];\n matchedObservationIds: ReadonlySet<string>;\n}> {\n const matchedObservationIds = new Set<string>();\n const merged = dependencies.map((dependency) => {\n const matches = observations.filter((observation) =>\n observationMatchesDependency(observation, dependency),\n );\n for (const observation of matches) matchedObservationIds.add(observation.id);\n if (matches.length === 0) return dependency;\n const observedOrigins = [\n ...new Set(\n matches.flatMap(({ url }) => (url.origin === undefined ? [] : [url.origin])),\n ),\n ];\n const observedOrigin =\n observedOrigins.length === 1 ? observedOrigins[0] : undefined;\n return Object.freeze({\n ...dependency,\n ...(dependency.url === undefined ||\n dependency.url.origin !== undefined ||\n observedOrigin === undefined\n ? {}\n : {\n url: Object.freeze({\n ...dependency.url,\n origin: observedOrigin,\n }),\n }),\n execution: \"observed\" as const,\n observationIds: Object.freeze([\n ...new Set([...dependency.observationIds, ...matches.map(({ id }) => id)]),\n ]),\n evidenceIds: Object.freeze([\n ...new Set([...dependency.evidenceIds, ...matches.map(({ id }) => id)]),\n ]),\n });\n });\n return Object.freeze({\n dependencies: Object.freeze(merged),\n matchedObservationIds,\n });\n}\n\nfunction appendRuntimeEvidence(\n evidence: readonly EvidenceRef[],\n observations: readonly NetworkObservation[],\n matchedIds: ReadonlySet<string>,\n): readonly EvidenceRef[] {\n const existing = new Set(evidence.map(({ id }) => id));\n return Object.freeze([\n ...evidence,\n ...observations.flatMap((observation) =>\n matchedIds.has(observation.id) && !existing.has(observation.id)\n ? [runtimeEvidence(observation)]\n : [],\n ),\n ]);\n}\n\nexport function mergeComponentDataFlowReport(\n report: ComponentDataFlowReport,\n observations: readonly NetworkObservation[],\n): ComponentDataFlowReport {\n const componentObservations = observations.filter(\n (observation) =>\n observation.componentSourceId === undefined ||\n observation.componentSourceId === report.component.componentSourceId,\n );\n const merged = mergeDependencies(report.dependencies, componentObservations);\n return limitDataFlowReportCollections(\n Object.freeze({\n ...report,\n dependencies: merged.dependencies,\n evidence: appendRuntimeEvidence(\n report.evidence,\n componentObservations,\n merged.matchedObservationIds,\n ),\n }),\n { mode: \"observation\" },\n );\n}\n\nfunction unassignedDependency(observation: NetworkObservation): DataDependency {\n const isRpc = observation.transport === \"trpc\";\n return Object.freeze({\n id: observation.id,\n kind: isRpc ? \"rpc\" : \"http\",\n direction:\n observation.method === \"GET\" ||\n observation.method === \"HEAD\" ||\n observation.method === \"QUERY\" ||\n observation.method === \"SUBSCRIPTION\"\n ? \"read\"\n : \"write\",\n execution: \"observed\",\n proof: \"unavailable\",\n association: \"unassigned\",\n method: observation.method,\n ...(isRpc\n ? observation.operation === undefined\n ? {}\n : { operation: observation.operation }\n : { url: observation.url }),\n parameters: Object.freeze(\n (isRpc ? [] : observation.url.queryKeys).map((path) =>\n Object.freeze({\n path,\n position: \"query\" as const,\n sensitive: isSensitiveName(path),\n valueState: \"not-collected\" as const,\n evidenceIds: Object.freeze([observation.id]),\n }),\n ),\n ),\n response: Object.freeze({\n consumedFields: Object.freeze([]),\n }),\n suppliedBindings: Object.freeze([]),\n locationIds: Object.freeze([]),\n evidenceIds: Object.freeze([observation.id]),\n observationIds: Object.freeze([observation.id]),\n });\n}\n\nexport function mergePageDataFlowReport(\n report: PageDataFlowReport,\n observations: readonly NetworkObservation[],\n): PageDataFlowReport {\n const currentObservations = observations.filter(\n ({ freshness }) => freshness === \"current\",\n );\n const merged = mergeDependencies(report.dependencies, currentObservations);\n const unassigned = currentObservations\n .filter(({ id }) => !merged.matchedObservationIds.has(id))\n .map(unassignedDependency);\n const allObservationIds = new Set(currentObservations.map(({ id }) => id));\n return limitDataFlowReportCollections(\n Object.freeze({\n ...report,\n dependencies: Object.freeze([...merged.dependencies, ...unassigned]),\n evidence: appendRuntimeEvidence(\n report.evidence,\n currentObservations,\n allObservationIds,\n ),\n }),\n { mode: \"observation\" },\n );\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["import_shared","source","code","react","element","styles","target","import_shared","import_shared","code","isRecord","text","target","import_shared","element","source","element","text","target","element","element","target","target","openingTag","code","value","import_shared","element","source","react","import_shared","element","element","target","target","import_shared","target","source","sourceLocation","import_shared","element","target","react","target","target","record","import_shared"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/controller/runtime-controller.ts","../src/annotation/create-annotation.ts","../src/api/runtime-api.ts","../src/api/agent-response-validation.ts","../src/security/content-sanitizer.ts","../src/collectors/computed-style-properties.ts","../src/collectors/css-collector.ts","../src/collectors/dom-collector.ts","../src/keyboard/shortcut.ts","../src/picker/geometry.ts","../src/ui/ui-constants.ts","../src/picker/hit-test.ts","../src/prompt/prompt-composer.ts","../src/state/runtime-state.ts","../src/state/selection-session.ts","../src/source/source-resolver.ts","../src/ui/runtime-view.ts","../src/ui/dom.ts","../src/ui/agent-panel.ts","../src/ui/brand-mark-content.ts","../src/ui/brand-mark.ts","../src/ui/data-flow-panel-contract.ts","../src/ui/dialog-placement.ts","../src/ui/external-handoff-contract.ts","../src/ui/localization.ts","../src/ui/selection-summary.ts","../src/controller/agent-workflow.ts","../src/controller/runtime-environment.ts","../src/controller/bootstrap.ts","../src/data-flow/data-flow-runtime.ts","../src/data-flow/report-merger.ts"],"sourcesContent":["export { bootstrapSpotPatch } from \"./controller/bootstrap.js\";\nexport type { RuntimeConfig } from \"./controller/runtime-config.js\";\nexport type { SpotPatchController } from \"./controller/runtime-controller.js\";\nexport { UI_MARKER_ATTRIBUTE } from \"./ui/ui-constants.js\";\nexport {\n createDataFlowRuntime,\n getDataFlowRuntime,\n installDataFlowPrelude,\n type DataFlowComponentRegistration,\n type DataFlowInvocationToken,\n type DataFlowRequestFrame,\n type DataFlowRequestMetadata,\n type DataFlowRuntime,\n type DataFlowTriggerMetadata,\n} from \"./data-flow/data-flow-runtime.js\";\nexport {\n mergeComponentDataFlowReport,\n mergePageDataFlowReport,\n} from \"./data-flow/report-merger.js\";\n","import { createReact18Adapter, type ReactAdapter } from \"@spotpatch/react-adapter\";\nimport {\n DATA_FLOW_SCHEMA_VERSION,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n type CodeContext,\n type ComponentDataFlowReport,\n type DataFlowComponentReportRequest,\n type ElementContext,\n type PageContext,\n type PageDataFlowReport,\n type SourceMarker,\n type SpotAnnotation,\n type SpotTargetContext,\n type StyleContext,\n} from \"@spotpatch/shared\";\n\nimport { createAnnotation } from \"../annotation/create-annotation.js\";\nimport { createRuntimeApi, type RuntimeApi } from \"../api/runtime-api.js\";\nimport { collectStyleContext } from \"../collectors/css-collector.js\";\nimport { collectElementContext } from \"../collectors/dom-collector.js\";\nimport { isTextEntryTarget, matchesShortcut } from \"../keyboard/shortcut.js\";\nimport { getElementRect, getVisibleElementRect } from \"../picker/geometry.js\";\nimport { isSpotPatchUIEventTarget, pickElementAt } from \"../picker/hit-test.js\";\nimport {\n createPromptComposer,\n type PromptComposer,\n} from \"../prompt/prompt-composer.js\";\nimport {\n INITIAL_RUNTIME_STATE,\n reduceRuntimeState,\n type RuntimeEvent,\n type RuntimeState,\n} from \"../state/runtime-state.js\";\nimport {\n createSelectionSession,\n type SelectionSession,\n type SelectionSnapshotTarget,\n} from \"../state/selection-session.js\";\nimport {\n createSourceResolver,\n sourceRefToMarker,\n type ElementSourceResolution,\n} from \"../source/source-resolver.js\";\nimport {\n createRuntimeView,\n type RuntimeView,\n type SelectionHighlightView,\n type SelectionTargetView,\n} from \"../ui/runtime-view.js\";\nimport { getDataFlowExtension } from \"../ui/data-flow-panel-contract.js\";\nimport { getExternalHandoffExtension } from \"../ui/external-handoff-contract.js\";\nimport {\n createSelectionSummary,\n type ApiConnectionStatus,\n type CollectionStatus,\n} from \"../ui/selection-summary.js\";\nimport { createAgentWorkflow } from \"./agent-workflow.js\";\nimport {\n collectPageContext,\n createBrowserAnnotationId,\n resolveClipboardWriter,\n type ClipboardWriter,\n} from \"./runtime-environment.js\";\nimport type { RuntimeConfig } from \"./runtime-config.js\";\n\nexport interface SpotPatchController {\n readonly dispose: () => void;\n readonly getState: () => RuntimeState;\n readonly mount: () => void;\n}\n\nexport interface RuntimeControllerDependencies {\n readonly api?: RuntimeApi;\n readonly clipboard?: ClipboardWriter;\n readonly createId?: () => string;\n readonly document?: Document;\n readonly mutationObserver?: typeof MutationObserver;\n readonly now?: () => string;\n readonly promptComposer?: PromptComposer;\n readonly reactAdapter?: ReactAdapter;\n readonly resizeObserver?: typeof ResizeObserver;\n readonly selectionSession?: SelectionSession;\n readonly view?: RuntimeView;\n readonly window?: Window;\n}\n\ninterface PointerPosition {\n readonly x: number;\n readonly y: number;\n}\n\ninterface SelectedTarget {\n readonly id: string;\n readonly resolution: ElementSourceResolution;\n apiStatus: ApiConnectionStatus;\n code: CodeContext | undefined;\n collectionStatus: CollectionStatus;\n dataFlowReport: ComponentDataFlowReport | undefined;\n dataFlowStatus: \"idle\" | \"loading\" | \"ready\" | \"error\";\n element: Element | undefined;\n elementContext: ElementContext | undefined;\n instruction: string;\n marker: SourceMarker | undefined;\n page: PageContext;\n styles: StyleContext | undefined;\n}\n\nconst EMPTY_STYLE_CONTEXT = Object.freeze({\n classNames: Object.freeze([]),\n matchedRules: Object.freeze([]),\n computed: Object.freeze({}),\n warnings: Object.freeze([\"CSS context collection failed.\"]),\n}) satisfies StyleContext;\n\nfunction elementLabel(element: Element): string {\n const id = element.id.length > 0 ? `#${element.id}` : \"\";\n const className = Array.from(element.classList)\n .slice(0, 2)\n .map((name) => `.${name}`)\n .join(\"\");\n return `<${element.tagName.toLowerCase()}${id}${className}>`;\n}\n\nfunction sourceLabel(target: SelectedTarget, unavailable: string): string {\n const path = target.code?.relativePath ?? target.resolution.source.relativePath;\n const line = target.resolution.source.line;\n const column = target.resolution.source.column;\n\n if (path === undefined) {\n return unavailable;\n }\n\n return `${path}${line === undefined ? \"\" : `:${String(line)}`}${column === undefined ? \"\" : `:${String(column)}`}`;\n}\n\nfunction targetStatus(target: SelectedTarget): SelectionTargetView[\"status\"] {\n if (target.apiStatus === \"failed\" || target.collectionStatus === \"failed\") {\n return \"warning\";\n }\n\n if (target.apiStatus === \"loading\" || target.collectionStatus === \"loading\") {\n return \"loading\";\n }\n\n return \"ready\";\n}\n\nfunction resolveBrowserDependencies(\n dependencies: RuntimeControllerDependencies,\n): Readonly<{\n document: Document;\n mutationObserver: typeof MutationObserver | undefined;\n resizeObserver: typeof ResizeObserver | undefined;\n window: Window;\n}> {\n const documentTarget = dependencies.document ?? globalThis.document;\n const windowTarget = dependencies.window ?? globalThis.window;\n\n return {\n document: documentTarget,\n window: windowTarget,\n mutationObserver: dependencies.mutationObserver ?? globalThis.MutationObserver,\n resizeObserver: dependencies.resizeObserver ?? globalThis.ResizeObserver,\n };\n}\n\nexport function createController(\n config: RuntimeConfig,\n dependencies: RuntimeControllerDependencies = {},\n): SpotPatchController {\n const browser = resolveBrowserDependencies(dependencies);\n const view =\n dependencies.view ??\n createRuntimeView(\n browser.document,\n config.shortcut,\n config.ai,\n config.locale,\n config.dataFlow.enabled,\n config.externalAgent.enabled,\n config.framework,\n config.sessionId,\n );\n const api =\n dependencies.api ??\n createRuntimeApi({\n apiBase: config.apiBase,\n dataFlowReportMaxBytes: config.dataFlow.limits.reportMaxBytes,\n fetch: browser.window.fetch.bind(browser.window),\n sessionToken: config.sessionToken,\n });\n const promptComposer =\n dependencies.promptComposer ??\n createPromptComposer({ maxCharacters: config.budget.totalCharacters });\n const clipboard =\n dependencies.clipboard ?? resolveClipboardWriter(browser.window.navigator);\n const createId =\n dependencies.createId ?? (() => createBrowserAnnotationId(browser.window));\n const now = dependencies.now ?? (() => new Date().toISOString());\n const selectionSession =\n dependencies.selectionSession ??\n createSelectionSession(browser.window, config.sessionId, config.maxTargets);\n const restoredSelection = selectionSession.load();\n const sourceResolver = createSourceResolver({\n adapter:\n dependencies.reactAdapter ??\n createReact18Adapter({\n ...(config.dataFlow.enabled\n ? {\n getComponentRegistration: (component: object) =>\n getDataFlowExtension()?.getComponentRegistration(component),\n }\n : {}),\n maxComponentDepth: config.budget.maxComponentDepth,\n }),\n onAdapterError() {\n view.announce(view.messages().announcements.adapterDisabled);\n\n if (config.debug) {\n console.warn(\n \"[spotpatch:react] Adapter failed and was disabled for this session.\",\n );\n }\n },\n });\n let state: RuntimeState = INITIAL_RUNTIME_STATE;\n let mounted = false;\n let animationFrame: number | undefined;\n let lastPointer: PointerPosition | undefined;\n let targets: SelectedTarget[] =\n restoredSelection?.targets.map((target) => {\n const marker = sourceRefToMarker(target.source);\n return {\n id: target.id,\n resolution: Object.freeze({ source: target.source, react: target.react }),\n apiStatus:\n marker === undefined\n ? \"not-required\"\n : target.code === undefined\n ? \"failed\"\n : \"connected\",\n code: target.code,\n collectionStatus: \"ready\",\n dataFlowReport: undefined,\n dataFlowStatus: \"idle\",\n element: undefined,\n elementContext: target.element,\n instruction: target.instruction,\n marker,\n page: target.page,\n styles: target.styles,\n };\n }) ?? [];\n let activeTargetId = restoredSelection?.activeTargetId;\n let targetSequence = restoredSelection?.sequence ?? 0;\n let selectionOpen = restoredSelection?.open ?? false;\n let workflowSelectionActive = false;\n let sessionRevision = 0;\n let editorRequestRevision = 0;\n let dataFlowRequestRevision = 0;\n let pageDataFlowReport: PageDataFlowReport | undefined;\n let pageDataFlowStatus: \"idle\" | \"loading\" | \"ready\" | \"error\" = \"idle\";\n let addingTarget = false;\n let previewPrompt = \"\";\n let previousFocus: HTMLElement | undefined;\n let resizeObserver: ResizeObserver | undefined;\n let mutationObserver: MutationObserver | undefined;\n let unsubscribeLocale: (() => void) | undefined;\n const collectionTimers = new Map<string, number>();\n\n function transition(event: RuntimeEvent): void {\n state = reduceRuntimeState(state, event);\n view.renderStatus(state.status);\n }\n\n function activeTarget(): SelectedTarget | undefined {\n return targets.find((target) => target.id === activeTargetId) ?? targets.at(-1);\n }\n\n function dataFlowRequest(\n target: SelectedTarget,\n ): DataFlowComponentReportRequest | undefined {\n const react = target.resolution.react;\n if (react.componentSourceId !== undefined && react.sourceVersion !== undefined) {\n return Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n componentSourceId: react.componentSourceId,\n sourceVersion: react.sourceVersion,\n });\n }\n\n const marker = target.marker;\n return marker === undefined\n ? undefined\n : Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n fileId: marker.fileId,\n line: marker.line,\n column: marker.column,\n });\n }\n\n function renderDataFlowView(): void {\n const dataFlowClient = getDataFlowExtension();\n const observations =\n dataFlowClient?.observations(browser.window.location.pathname) ?? [];\n const current = activeTarget();\n view.renderDataFlow({\n component: Object.freeze({\n status: config.dataFlow.enabled\n ? (current?.dataFlowStatus ?? \"idle\")\n : \"disabled\",\n ...(current?.dataFlowReport === undefined\n ? {}\n : {\n report:\n dataFlowClient?.mergeComponentReport(\n current.dataFlowReport,\n observations,\n ) ?? current.dataFlowReport,\n }),\n }),\n page: Object.freeze({\n status: config.dataFlow.enabled ? pageDataFlowStatus : \"disabled\",\n ...(pageDataFlowReport === undefined\n ? {}\n : {\n report:\n dataFlowClient?.mergePageReport(pageDataFlowReport, observations) ??\n pageDataFlowReport,\n }),\n }),\n observationCount: observations.length,\n });\n }\n\n async function loadDataFlowReports(): Promise<void> {\n if (!config.dataFlow.enabled) {\n renderDataFlowView();\n return;\n }\n\n const current = activeTarget();\n const currentRequest = current === undefined ? undefined : dataFlowRequest(current);\n const pageTargets = targets.flatMap((target) => {\n const request = dataFlowRequest(target);\n return request === undefined ? [] : [request];\n });\n const revision = ++dataFlowRequestRevision;\n const selectionRevision = sessionRevision;\n if (current !== undefined) current.dataFlowStatus = \"loading\";\n pageDataFlowStatus = pageTargets.length === 0 ? \"idle\" : \"loading\";\n renderDataFlowView();\n\n const [componentResult, pageResult] = await Promise.allSettled([\n currentRequest === undefined\n ? Promise.resolve(undefined)\n : api.componentDataFlowReport(currentRequest),\n pageTargets.length === 0\n ? Promise.resolve(undefined)\n : api.pageDataFlowReport({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n targets: pageTargets,\n }),\n ]);\n if (\n !mounted ||\n revision !== dataFlowRequestRevision ||\n selectionRevision !== sessionRevision\n ) {\n return;\n }\n\n if (current !== undefined && targets.includes(current)) {\n if (componentResult.status === \"fulfilled\") {\n current.dataFlowReport = componentResult.value;\n current.dataFlowStatus = componentResult.value === undefined ? \"idle\" : \"ready\";\n } else {\n current.dataFlowReport = undefined;\n current.dataFlowStatus = \"error\";\n }\n }\n if (pageResult.status === \"fulfilled\") {\n pageDataFlowReport = pageResult.value;\n pageDataFlowStatus = pageResult.value === undefined ? \"idle\" : \"ready\";\n } else {\n pageDataFlowReport = undefined;\n pageDataFlowStatus = \"error\";\n }\n renderDataFlowView();\n }\n\n function snapshotTarget(target: SelectedTarget): SelectionSnapshotTarget | undefined {\n if (target.elementContext === undefined || target.styles === undefined) {\n return undefined;\n }\n\n return {\n id: target.id,\n instruction: target.instruction,\n page: target.page,\n source: target.resolution.source,\n react: target.resolution.react,\n element: target.elementContext,\n styles: target.styles,\n ...(target.code === undefined ? {} : { code: target.code }),\n };\n }\n\n function persistSelection(): void {\n const persistedTargets = targets.flatMap((target) => {\n const snapshot = snapshotTarget(target);\n return snapshot === undefined ? [] : [snapshot];\n });\n\n if (persistedTargets.length === 0) {\n selectionSession.clear();\n return;\n }\n\n const persistedIds = new Set(persistedTargets.map(({ id }) => id));\n selectionSession.save({\n ...(activeTargetId !== undefined && persistedIds.has(activeTargetId)\n ? { activeTargetId }\n : {}),\n open: selectionOpen,\n sequence: targetSequence,\n targets: persistedTargets,\n });\n }\n\n function targetIsCurrent(target: SelectedTarget, revision: number): boolean {\n return (\n mounted &&\n revision === sessionRevision &&\n state.status !== \"idle\" &&\n targets.includes(target)\n );\n }\n\n function canPreview(): boolean {\n const instructionCharacters = targets.reduce(\n (total, target) => total + target.instruction.trim().length,\n 0,\n );\n\n return (\n targets.length > 0 &&\n instructionCharacters <= MAX_ANNOTATION_INSTRUCTION_CHARACTERS &&\n targets.every(\n (target) =>\n target.instruction.trim().length > 0 &&\n target.elementContext !== undefined &&\n target.styles !== undefined &&\n target.apiStatus !== \"loading\",\n )\n );\n }\n\n function selectionSummary(): string {\n const messages = view.messages().summary;\n\n return targets\n .map((target, index) => {\n const summary = createSelectionSummary(\n {\n resolution: target.resolution,\n ...(target.code === undefined ? {} : { code: target.code }),\n ...(target.styles === undefined ? {} : { styles: target.styles }),\n apiStatus: target.apiStatus,\n collectionStatus: target.collectionStatus,\n framework: config.framework,\n frameworkVersion: config.frameworkVersion,\n spotPatchVersion: config.spotPatchVersion,\n },\n messages,\n );\n return `${messages.target(index + 1, target.id === activeTargetId)}\\n${summary}`;\n })\n .join(\"\\n\\n\");\n }\n\n function refreshHighlights(): void {\n const highlights = targets.flatMap((target): SelectionHighlightView[] => {\n if (!target.element?.isConnected) {\n return [];\n }\n\n const rect = getVisibleElementRect(target.element, browser.window);\n\n if (rect === undefined) {\n return [];\n }\n\n return [\n {\n id: target.id,\n label: elementLabel(target.element),\n rect,\n active: target.id === activeTargetId,\n },\n ];\n });\n\n if (highlights.length === 0) {\n view.hideSelectionHighlights();\n } else {\n view.showSelectionHighlights(highlights);\n }\n }\n\n function refreshSelectionView(show = false): void {\n if (targets.length === 0) {\n return;\n }\n\n view.renderTargets(\n targets.map((target) => ({\n id: target.id,\n label:\n target.resolution.react.componentName ??\n (target.element === undefined\n ? (target.elementContext?.tagName ?? \"Element\")\n : elementLabel(target.element)),\n source: sourceLabel(target, view.messages().context.sourceUnavailable),\n canOpenEditor: target.marker !== undefined,\n status: targetStatus(target),\n active: target.id === activeTargetId,\n instruction: target.instruction,\n })),\n config.maxTargets,\n );\n refreshHighlights();\n const current = activeTarget();\n const summary = selectionSummary();\n const canOpenEditor = current?.marker !== undefined;\n\n if (show) {\n view.showSelection(summary, canOpenEditor, canPreview());\n } else {\n view.updateSelection(summary, canOpenEditor, canPreview());\n }\n }\n\n function selectedAnnotation(): SpotAnnotation | undefined {\n if (!canPreview()) {\n return undefined;\n }\n\n const annotationTargets = targets.map((target): SpotTargetContext => {\n if (target.elementContext === undefined || target.styles === undefined) {\n throw new Error(\"SpotPatch attempted to compose an incomplete target.\");\n }\n\n const warnings = [\n ...(target.apiStatus === \"failed\"\n ? [\"Source context could not be loaded.\"]\n : []),\n ...(target.collectionStatus === \"failed\"\n ? [\"Part of the browser context could not be collected.\"]\n : []),\n ];\n\n return {\n instruction: target.instruction.trim(),\n page: target.page,\n source: target.resolution.source,\n react: target.resolution.react,\n element: target.elementContext,\n styles: target.styles,\n ...(target.code === undefined ? {} : { code: target.code }),\n warnings,\n };\n });\n\n return createAnnotation({\n id: createId(),\n locale: view.locale(),\n createdAt: now(),\n page: collectPageContext(browser.document, browser.window),\n targets: annotationTargets,\n });\n }\n\n function showElementHighlight(element: Element): void {\n view.showHighlight(getElementRect(element, browser.window), elementLabel(element));\n }\n\n function restoreFocus(): void {\n if (previousFocus?.isConnected === true) {\n previousFocus.focus({ preventScroll: true });\n }\n\n previousFocus = undefined;\n }\n\n function clearCollectionTimers(): void {\n for (const timer of collectionTimers.values()) {\n browser.window.clearTimeout(timer);\n }\n\n collectionTimers.clear();\n }\n\n function releaseSelection(): void {\n sessionRevision += 1;\n api.cancelPending();\n agentWorkflow.disposeSelection();\n externalHandoffWorkflow?.cancelPending();\n clearCollectionTimers();\n resizeObserver?.disconnect();\n targets = [];\n activeTargetId = undefined;\n dataFlowRequestRevision += 1;\n pageDataFlowReport = undefined;\n pageDataFlowStatus = \"idle\";\n selectionOpen = false;\n workflowSelectionActive = false;\n addingTarget = false;\n previewPrompt = \"\";\n view.hideSelection();\n view.hideSelectionHighlights();\n selectionSession.clear();\n restoreFocus();\n }\n\n function close(): void {\n if (state.status === \"inspecting\") {\n transition({ type: \"CANCEL\" });\n } else if (state.status === \"selected\") {\n transition({ type: \"CLOSE\" });\n } else if (state.status === \"previewing\") {\n transition({ type: \"BACK\" });\n transition({ type: \"CLOSE\" });\n }\n\n selectionOpen = false;\n persistSelection();\n view.hideSelection();\n view.hideSelectionHighlights();\n restoreFocus();\n view.hideHighlight();\n }\n\n function cancelAddTarget(): void {\n if (state.status !== \"inspecting\" || !addingTarget || targets.length === 0) {\n close();\n return;\n }\n\n addingTarget = false;\n transition({ type: \"SELECT\" });\n view.hideHighlight();\n refreshSelectionView(true);\n view.focusTargetInstruction(activeTargetId);\n view.announce(view.messages().announcements.addCancelled);\n }\n\n function activate(): void {\n if (state.status === \"inspecting\" && addingTarget) {\n cancelAddTarget();\n return;\n }\n\n if (state.status !== \"idle\") {\n close();\n return;\n }\n\n if (targets.length > 0) {\n selectionOpen = true;\n transition({ type: \"RESTORE\" });\n if (!workflowSelectionActive) {\n agentWorkflow.beginSelection();\n workflowSelectionActive = true;\n }\n refreshSelectionView(true);\n void loadDataFlowReports();\n view.focusTargetInstruction(activeTargetId);\n persistSelection();\n return;\n }\n\n transition({ type: \"ACTIVATE\" });\n view.hideSelection();\n view.announce(view.messages().announcements.selectionEnabled);\n }\n\n function beginReselect(message = view.messages().announcements.chooseAnother): void {\n if (state.status !== \"selected\") {\n return;\n }\n\n transition({ type: \"RESELECT\" });\n releaseSelection();\n view.hideHighlight();\n view.announce(message);\n }\n\n function beginAddTarget(): void {\n if (state.status !== \"selected\") {\n return;\n }\n\n if (targets.length >= config.maxTargets) {\n view.announce(view.messages().announcements.selectionLimit(config.maxTargets));\n return;\n }\n\n addingTarget = true;\n transition({ type: \"RESELECT\" });\n view.hideSelectionTemporarily();\n view.hideHighlight();\n view.announce(\n view.messages().announcements.chooseAdditional(targets.length, config.maxTargets),\n );\n }\n\n function detachAppliedTargets(): void {\n sessionRevision += 1;\n clearCollectionTimers();\n resizeObserver?.disconnect();\n\n for (const target of targets) {\n target.element = undefined;\n }\n\n view.hideHighlight();\n view.hideSelectionHighlights();\n refreshSelectionView();\n selectionSession.clear();\n view.announce(view.messages().announcements.appliedTargetsDetached);\n }\n\n const agentWorkflow = createAgentWorkflow({\n ai: config.ai,\n api,\n getAnnotation: selectedAnnotation,\n onApplied: detachAppliedTargets,\n onReselectRequired() {\n beginReselect(view.messages().announcements.reselectAfterChange);\n },\n view,\n });\n const externalHandoffWorkflow =\n config.externalAgent.enabled && view.externalHandoffPanel !== undefined\n ? getExternalHandoffExtension()?.createWorkflow(\n browser.window.fetch.bind(browser.window),\n view.externalHandoffPanel,\n selectedAnnotation,\n config.sessionToken,\n browser.window,\n )\n : undefined;\n\n async function loadSourceContext(\n target: SelectedTarget,\n revision: number,\n ): Promise<void> {\n const marker = target.marker;\n\n if (marker === undefined) {\n return;\n }\n\n try {\n const context = await api.sourceContext({\n fileId: marker.fileId,\n line: marker.line,\n column: marker.column,\n maxLines: config.budget.maxCodeLines,\n });\n\n if (targetIsCurrent(target, revision)) {\n target.code = context;\n target.apiStatus = \"connected\";\n persistSelection();\n refreshSelectionView();\n view.announce(view.messages().announcements.sourceLoaded);\n }\n } catch (error: unknown) {\n if (targetIsCurrent(target, revision)) {\n target.code = undefined;\n target.apiStatus = \"failed\";\n persistSelection();\n refreshSelectionView();\n view.announce(view.messages().announcements.sourceFailed);\n\n if (\n config.debug &&\n !(error instanceof DOMException && error.name === \"AbortError\")\n ) {\n console.warn(\"[spotpatch:runtime] Source context request failed.\");\n }\n }\n }\n }\n\n function scheduleBrowserContextCollection(\n target: SelectedTarget,\n revision: number,\n ): void {\n const element = target.element;\n\n if (element === undefined) {\n return;\n }\n\n const timer = browser.window.setTimeout(() => {\n collectionTimers.delete(target.id);\n\n if (!targetIsCurrent(target, revision)) {\n return;\n }\n\n let failed = false;\n\n try {\n target.elementContext = collectElementContext({\n element,\n maxCharacters: config.budget.domCharacters,\n });\n } catch {\n target.elementContext = undefined;\n failed = true;\n }\n\n try {\n target.styles = collectStyleContext({\n document: browser.document,\n element,\n maxCharacters: config.budget.cssCharacters,\n });\n } catch {\n target.styles = EMPTY_STYLE_CONTEXT;\n failed = true;\n }\n\n target.collectionStatus = failed ? \"failed\" : \"ready\";\n persistSelection();\n refreshSelectionView();\n view.announce(\n failed\n ? view.messages().announcements.contextWarning\n : view.messages().announcements.contextCollected,\n );\n\n if (config.debug && target.styles.warnings.length > 0) {\n console.warn(\n `[spotpatch:runtime] CSS collection completed with ${String(target.styles.warnings.length)} warning(s).`,\n );\n }\n }, 0);\n collectionTimers.set(target.id, timer);\n }\n\n function duplicateTarget(\n element: Element,\n marker: SourceMarker | undefined,\n ): SelectedTarget | undefined {\n if (marker !== undefined) {\n return targets.find(\n (target) =>\n target.marker?.fileId === marker.fileId &&\n target.marker.line === marker.line &&\n target.marker.column === marker.column,\n );\n }\n\n return targets.find((target) => target.element === element);\n }\n\n function selectElement(element: Element): void {\n const resolution = sourceResolver.resolve(element);\n const marker = sourceRefToMarker(resolution.source);\n const duplicate = duplicateTarget(element, marker);\n\n if (duplicate !== undefined) {\n activeTargetId = duplicate.id;\n addingTarget = false;\n transition({ type: \"SELECT\" });\n view.hideHighlight();\n refreshSelectionView(true);\n void loadDataFlowReports();\n view.focusTargetInstruction(duplicate.id);\n view.announce(view.messages().announcements.duplicate);\n return;\n }\n\n if (targets.length >= config.maxTargets) {\n addingTarget = false;\n transition({ type: \"SELECT\" });\n view.hideHighlight();\n refreshSelectionView(true);\n view.announce(view.messages().announcements.selectionLimit(config.maxTargets));\n return;\n }\n\n const initialSelection = targets.length === 0;\n\n if (initialSelection) {\n previousFocus =\n browser.document.activeElement instanceof HTMLElement\n ? browser.document.activeElement\n : undefined;\n previewPrompt = \"\";\n agentWorkflow.beginSelection();\n workflowSelectionActive = true;\n }\n\n targetSequence += 1;\n const target: SelectedTarget = {\n id: `target-${String(targetSequence)}`,\n element,\n resolution,\n marker,\n page: collectPageContext(browser.document, browser.window),\n code: undefined,\n elementContext: undefined,\n styles: undefined,\n instruction: \"\",\n apiStatus: marker === undefined ? \"not-required\" : \"loading\",\n collectionStatus: \"loading\",\n dataFlowReport: undefined,\n dataFlowStatus: \"idle\",\n };\n targets.push(target);\n activeTargetId = target.id;\n addingTarget = false;\n const revision = sessionRevision;\n transition({ type: \"SELECT\" });\n view.hideHighlight();\n resizeObserver?.observe(element);\n refreshSelectionView(true);\n void loadDataFlowReports();\n selectionOpen = true;\n view.focusTargetInstruction(target.id);\n scheduleBrowserContextCollection(target, revision);\n\n if (marker !== undefined) {\n void loadSourceContext(target, revision);\n } else {\n view.announce(\n resolution.source.confidence === \"probable\"\n ? view.messages().announcements.sourceProbable\n : view.messages().announcements.sourceMissing,\n );\n }\n }\n\n function updateHoveredElement(): void {\n animationFrame = undefined;\n\n if (state.status !== \"inspecting\" || lastPointer === undefined) {\n return;\n }\n\n const candidate = pickElementAt(\n browser.document,\n browser.window,\n lastPointer.x,\n lastPointer.y,\n );\n transition({ type: \"HOVER\" });\n\n if (candidate === undefined) {\n view.hideHighlight();\n return;\n }\n\n showElementHighlight(candidate);\n }\n\n function handlePointerMove(event: PointerEvent): void {\n if (state.status !== \"inspecting\") {\n return;\n }\n\n lastPointer = { x: event.clientX, y: event.clientY };\n animationFrame ??= browser.window.requestAnimationFrame(updateHoveredElement);\n }\n\n function handleClick(event: MouseEvent): void {\n if (state.status !== \"inspecting\" || isSpotPatchUIEventTarget(event.target)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n const candidate = pickElementAt(\n browser.document,\n browser.window,\n event.clientX,\n event.clientY,\n );\n\n if (candidate === undefined) {\n view.announce(view.messages().announcements.noSelectable);\n return;\n }\n\n selectElement(candidate);\n }\n\n function handleKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\" && state.status !== \"idle\") {\n event.preventDefault();\n\n if (state.status === \"inspecting\" && addingTarget) {\n cancelAddTarget();\n } else if (state.status === \"inspecting\" || state.status === \"selected\") {\n close();\n } else {\n transition({ type: \"BACK\" });\n view.focusTargetInstruction(activeTargetId);\n }\n\n return;\n }\n\n if (\n isTextEntryTarget(event.target) ||\n !matchesShortcut(event, config.shortcut, browser.window.navigator.userAgent)\n ) {\n return;\n }\n\n event.preventDefault();\n activate();\n }\n\n function removeTarget(targetId: string): void {\n if (state.status !== \"selected\" && state.status !== \"inspecting\") {\n return;\n }\n\n const index = targets.findIndex((target) => target.id === targetId);\n\n if (index < 0) {\n return;\n }\n\n const [removed] = targets.splice(index, 1);\n\n if (removed === undefined) {\n return;\n }\n\n const timer = collectionTimers.get(removed.id);\n\n if (timer !== undefined) {\n browser.window.clearTimeout(timer);\n collectionTimers.delete(removed.id);\n }\n\n if (removed.element !== undefined) {\n resizeObserver?.unobserve(removed.element);\n }\n\n if (activeTargetId === removed.id) {\n activeTargetId = targets.at(-1)?.id;\n }\n\n if (targets.length === 0) {\n addingTarget = true;\n\n if (state.status === \"selected\") {\n transition({ type: \"RESELECT\" });\n }\n\n view.hideSelectionTemporarily();\n view.hideSelectionHighlights();\n pageDataFlowReport = undefined;\n pageDataFlowStatus = \"idle\";\n renderDataFlowView();\n selectionSession.clear();\n view.announce(view.messages().announcements.allTargetsRemoved);\n return;\n }\n\n refreshSelectionView();\n void loadDataFlowReports();\n persistSelection();\n view.announce(view.messages().announcements.targetRemoved);\n }\n\n function refreshSelectedGeometry(): void {\n if (state.status === \"idle\" || targets.length === 0) {\n return;\n }\n\n const disconnected = targets.filter(\n (target) => target.element !== undefined && !target.element.isConnected,\n );\n\n if (disconnected.length > 0) {\n for (const target of disconnected) {\n if (target.element !== undefined) {\n resizeObserver?.unobserve(target.element);\n target.element = undefined;\n }\n }\n refreshSelectionView();\n persistSelection();\n view.announce(view.messages().announcements.detachedTargetPreserved);\n return;\n }\n\n refreshHighlights();\n }\n\n function handleOpenEditor(targetId?: string): void {\n const current =\n targetId === undefined\n ? activeTarget()\n : targets.find((target) => target.id === targetId);\n\n if (state.status !== \"selected\" || current?.marker === undefined) {\n return;\n }\n\n if (activeTargetId !== current.id) {\n activeTargetId = current.id;\n refreshSelectionView();\n }\n\n const marker = current.marker;\n const selectionRevision = sessionRevision;\n const requestRevision = ++editorRequestRevision;\n transition({ type: \"OPEN_EDITOR\" });\n view.renderEditorStatus(\"opening\");\n\n void api\n .openEditor({\n fileId: marker.fileId,\n line: marker.line,\n column: marker.column,\n })\n .then(() => {\n if (\n mounted &&\n state.status === \"selected\" &&\n selectionRevision === sessionRevision &&\n requestRevision === editorRequestRevision &&\n activeTargetId === current.id &&\n targets.includes(current)\n ) {\n view.renderEditorStatus(\"success\");\n }\n })\n .catch(() => {\n if (\n mounted &&\n state.status === \"selected\" &&\n selectionRevision === sessionRevision &&\n requestRevision === editorRequestRevision &&\n activeTargetId === current.id &&\n targets.includes(current)\n ) {\n view.renderEditorStatus(\"error\");\n }\n });\n }\n\n function handleTargetListInput(event: Event): void {\n if (state.status !== \"selected\" || !(event.target instanceof HTMLTextAreaElement)) {\n return;\n }\n\n const targetId = event.target.dataset.targetInstructionId;\n const target = targets.find((candidate) => candidate.id === targetId);\n\n if (target === undefined) {\n return;\n }\n\n target.instruction = event.target.value;\n view.updateTargetInstruction(target.id, target.instruction);\n view.setPreviewEnabled(canPreview());\n persistSelection();\n }\n\n function handleOpenEditorButtonClick(): void {\n handleOpenEditor();\n }\n\n function handleTargetListKeydown(event: KeyboardEvent): void {\n if (\n config.ai.enabled &&\n state.status === \"selected\" &&\n event.key === \"Enter\" &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault();\n agentWorkflow.run();\n }\n }\n\n function handlePreview(): void {\n if (state.status !== \"selected\") {\n return;\n }\n\n const annotation = selectedAnnotation();\n\n if (annotation === undefined) {\n view.announce(view.messages().announcements.completeInstructions);\n return;\n }\n\n previewPrompt = promptComposer.compose(annotation);\n transition({ type: \"PREVIEW\" });\n view.showPreview(previewPrompt);\n view.focusPrompt();\n }\n\n function handleCopy(): void {\n if (state.status !== \"previewing\" || previewPrompt.length === 0) {\n return;\n }\n\n if (clipboard === undefined) {\n transition({ type: \"COPY_FAILURE\" });\n view.focusPrompt();\n view.announce(view.messages().announcements.clipboardUnavailable);\n return;\n }\n\n const revision = sessionRevision;\n void clipboard\n .writeText(previewPrompt)\n .then(() => {\n if (mounted && revision === sessionRevision && state.status === \"previewing\") {\n transition({ type: \"COPY_SUCCESS\" });\n view.focusTargetInstruction(activeTargetId);\n view.announce(view.messages().announcements.promptCopied);\n }\n })\n .catch(() => {\n if (mounted && revision === sessionRevision && state.status === \"previewing\") {\n transition({ type: \"COPY_FAILURE\" });\n view.focusPrompt();\n view.announce(view.messages().announcements.copyFailed);\n }\n });\n }\n\n function handleBack(): void {\n if (state.status !== \"previewing\") {\n return;\n }\n\n transition({ type: \"BACK\" });\n view.focusTargetInstruction(activeTargetId);\n }\n\n function handleLocaleChange(): void {\n if (!mounted || targets.length === 0) {\n return;\n }\n\n refreshSelectionView();\n\n if (state.status === \"previewing\") {\n const annotation = selectedAnnotation();\n\n if (annotation !== undefined) {\n previewPrompt = promptComposer.compose(annotation);\n view.showPreview(previewPrompt);\n }\n }\n }\n\n function handleTargetListClick(event: MouseEvent): void {\n const eventTarget = event.target;\n\n if (!(eventTarget instanceof Element)) {\n return;\n }\n\n const removeButton = eventTarget.closest<HTMLButtonElement>(\n \"button[data-remove-target-id]\",\n );\n\n if (removeButton?.dataset.removeTargetId !== undefined) {\n removeTarget(removeButton.dataset.removeTargetId);\n return;\n }\n\n const openButton = eventTarget.closest<HTMLButtonElement>(\n \"button[data-open-target-id]\",\n );\n\n if (openButton?.dataset.openTargetId !== undefined) {\n handleOpenEditor(openButton.dataset.openTargetId);\n return;\n }\n\n const activateButton = eventTarget.closest<HTMLButtonElement>(\n \"button[data-activate-target-id]\",\n );\n const targetId = activateButton?.dataset.activateTargetId;\n\n if (\n state.status !== \"selected\" ||\n targetId === undefined ||\n !targets.some((target) => target.id === targetId)\n ) {\n return;\n }\n\n activeTargetId = targetId;\n refreshSelectionView();\n void loadDataFlowReports();\n view.focusTargetInstruction(targetId);\n }\n\n function handleReselect(): void {\n beginReselect();\n }\n\n function handleDataFlowRefresh(): void {\n void loadDataFlowReports();\n }\n\n function mount(): void {\n if (mounted) {\n return;\n }\n\n mounted = true;\n externalHandoffWorkflow?.mount();\n view.renderStatus(state.status);\n browser.document.addEventListener(\"pointermove\", handlePointerMove, true);\n browser.document.addEventListener(\"click\", handleClick, true);\n browser.document.addEventListener(\"keydown\", handleKeydown, true);\n browser.window.addEventListener(\"scroll\", refreshSelectedGeometry, true);\n browser.window.addEventListener(\"resize\", refreshSelectedGeometry);\n view.triggerButton.addEventListener(\"click\", activate);\n view.addTargetButton.addEventListener(\"click\", beginAddTarget);\n view.reselectButton.addEventListener(\"click\", handleReselect);\n view.targetList.addEventListener(\"click\", handleTargetListClick);\n view.targetList.addEventListener(\"input\", handleTargetListInput);\n view.targetList.addEventListener(\"keydown\", handleTargetListKeydown);\n view.openEditorButton.addEventListener(\"click\", handleOpenEditorButtonClick);\n view.dataFlowRefreshButton.addEventListener(\"click\", handleDataFlowRefresh);\n view.previewButton.addEventListener(\"click\", handlePreview);\n view.copyButton.addEventListener(\"click\", handleCopy);\n view.backButton.addEventListener(\"click\", handleBack);\n view.closeButton.addEventListener(\"click\", close);\n view.agentProviderSelect.addEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentModelSelect.addEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentModeSelect.addEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentConsentCheckbox.addEventListener(\"change\", agentWorkflow.consentChanged);\n view.agentTestButton.addEventListener(\"click\", agentWorkflow.testCapability);\n view.agentRunButton.addEventListener(\"click\", agentWorkflow.run);\n view.agentCancelButton.addEventListener(\"click\", agentWorkflow.cancel);\n view.agentApplyButton.addEventListener(\"click\", agentWorkflow.apply);\n view.agentRevertButton.addEventListener(\"click\", agentWorkflow.revert);\n view.agentResetButton.addEventListener(\"click\", agentWorkflow.reset);\n unsubscribeLocale = view.subscribeLocale(handleLocaleChange);\n\n if (browser.resizeObserver !== undefined) {\n resizeObserver = new browser.resizeObserver(refreshSelectedGeometry);\n }\n\n if (browser.mutationObserver !== undefined) {\n mutationObserver = new browser.mutationObserver(refreshSelectedGeometry);\n mutationObserver.observe(browser.document.documentElement, {\n childList: true,\n subtree: true,\n });\n }\n\n if (selectionOpen && targets.length > 0) {\n transition({ type: \"RESTORE\" });\n agentWorkflow.beginSelection();\n workflowSelectionActive = true;\n refreshSelectionView(true);\n }\n\n if (config.debug) {\n console.info(`[spotpatch:runtime] Mounted. Shortcut: ${config.shortcut}.`);\n }\n }\n\n function dispose(): void {\n if (!mounted) {\n unsubscribeLocale?.();\n unsubscribeLocale = undefined;\n view.dispose();\n api.cancelPending();\n api.dispose();\n agentWorkflow.disposeSelection();\n externalHandoffWorkflow?.dispose();\n sourceResolver.dispose();\n return;\n }\n\n mounted = false;\n unsubscribeLocale?.();\n unsubscribeLocale = undefined;\n browser.document.removeEventListener(\"pointermove\", handlePointerMove, true);\n browser.document.removeEventListener(\"click\", handleClick, true);\n browser.document.removeEventListener(\"keydown\", handleKeydown, true);\n browser.window.removeEventListener(\"scroll\", refreshSelectedGeometry, true);\n browser.window.removeEventListener(\"resize\", refreshSelectedGeometry);\n view.triggerButton.removeEventListener(\"click\", activate);\n view.addTargetButton.removeEventListener(\"click\", beginAddTarget);\n view.reselectButton.removeEventListener(\"click\", handleReselect);\n view.targetList.removeEventListener(\"click\", handleTargetListClick);\n view.targetList.removeEventListener(\"input\", handleTargetListInput);\n view.targetList.removeEventListener(\"keydown\", handleTargetListKeydown);\n view.openEditorButton.removeEventListener(\"click\", handleOpenEditorButtonClick);\n view.dataFlowRefreshButton.removeEventListener(\"click\", handleDataFlowRefresh);\n view.previewButton.removeEventListener(\"click\", handlePreview);\n view.copyButton.removeEventListener(\"click\", handleCopy);\n view.backButton.removeEventListener(\"click\", handleBack);\n view.closeButton.removeEventListener(\"click\", close);\n view.agentProviderSelect.removeEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentModelSelect.removeEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentModeSelect.removeEventListener(\n \"change\",\n agentWorkflow.providerOrModelChanged,\n );\n view.agentConsentCheckbox.removeEventListener(\n \"change\",\n agentWorkflow.consentChanged,\n );\n view.agentTestButton.removeEventListener(\"click\", agentWorkflow.testCapability);\n view.agentRunButton.removeEventListener(\"click\", agentWorkflow.run);\n view.agentCancelButton.removeEventListener(\"click\", agentWorkflow.cancel);\n view.agentApplyButton.removeEventListener(\"click\", agentWorkflow.apply);\n view.agentRevertButton.removeEventListener(\"click\", agentWorkflow.revert);\n view.agentResetButton.removeEventListener(\"click\", agentWorkflow.reset);\n\n if (animationFrame !== undefined) {\n browser.window.cancelAnimationFrame(animationFrame);\n animationFrame = undefined;\n }\n\n clearCollectionTimers();\n persistSelection();\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n resizeObserver = undefined;\n mutationObserver = undefined;\n targets = [];\n activeTargetId = undefined;\n previewPrompt = \"\";\n lastPointer = undefined;\n previousFocus = undefined;\n api.cancelPending();\n api.dispose();\n agentWorkflow.disposeSelection();\n externalHandoffWorkflow?.dispose();\n sourceResolver.dispose();\n view.dispose();\n state = INITIAL_RUNTIME_STATE;\n }\n\n return Object.freeze({ mount, dispose, getState: () => state });\n}\n","import {\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n MAX_ANNOTATION_TARGETS,\n MAX_TARGET_INSTRUCTION_CHARACTERS,\n type CodeContext,\n type ElementContext,\n type PageContext,\n type ReactContext,\n type SourceRef,\n type SpotAnnotation,\n type SpotPatchLocale,\n type SpotTargetContext,\n type StyleContext,\n} from \"@spotpatch/shared\";\n\nexport interface CreateAnnotationInput {\n readonly createdAt: string;\n readonly id: string;\n readonly locale: SpotPatchLocale;\n readonly page: PageContext;\n readonly targets: readonly SpotTargetContext[];\n}\n\nfunction freezeSource(source: SourceRef, code?: CodeContext): SourceRef {\n return Object.freeze({\n ...source,\n ...(source.relativePath === undefined && code !== undefined\n ? { relativePath: code.relativePath }\n : {}),\n });\n}\n\nfunction freezeReact(react: ReactContext): ReactContext {\n return Object.freeze({\n ...react,\n componentStack: Object.freeze([...react.componentStack]),\n ...(react.source === undefined ? {} : { source: freezeSource(react.source) }),\n });\n}\n\nfunction freezeElement(element: ElementContext): ElementContext {\n return Object.freeze({\n ...element,\n rect: Object.freeze({ ...element.rect }),\n });\n}\n\nfunction freezeStyles(styles: StyleContext): StyleContext {\n return Object.freeze({\n ...styles,\n classNames: Object.freeze([...styles.classNames]),\n matchedRules: Object.freeze(\n styles.matchedRules.map((rule) => Object.freeze({ ...rule })),\n ),\n computed: Object.freeze({ ...styles.computed }),\n warnings: Object.freeze([...styles.warnings]),\n });\n}\n\nfunction freezeTarget(target: SpotTargetContext): SpotTargetContext {\n return Object.freeze({\n instruction: target.instruction.trim(),\n ...(target.page === undefined ? {} : { page: Object.freeze({ ...target.page }) }),\n source: freezeSource(target.source, target.code),\n react: freezeReact(target.react),\n element: freezeElement(target.element),\n styles: freezeStyles(target.styles),\n ...(target.code === undefined ? {} : { code: Object.freeze({ ...target.code }) }),\n warnings: Object.freeze([...target.warnings]),\n });\n}\n\nexport function createAnnotation(input: CreateAnnotationInput): SpotAnnotation {\n if (input.targets.length < 1 || input.targets.length > MAX_ANNOTATION_TARGETS) {\n throw new RangeError(\n `SpotPatch annotations require between 1 and ${String(MAX_ANNOTATION_TARGETS)} targets.`,\n );\n }\n\n const instructions = input.targets.map((target) => target.instruction.trim());\n\n if (\n instructions.some(\n (instruction) =>\n instruction.length === 0 ||\n instruction.length > MAX_TARGET_INSTRUCTION_CHARACTERS,\n ) ||\n instructions.reduce((total, instruction) => total + instruction.length, 0) >\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS\n ) {\n throw new RangeError(\"SpotPatch target instructions exceed the allowed bounds.\");\n }\n\n return Object.freeze({\n schemaVersion: 3,\n id: input.id,\n locale: input.locale,\n page: Object.freeze({ ...input.page }),\n targets: Object.freeze(input.targets.map(freezeTarget)),\n createdAt: input.createdAt,\n });\n}\n","import {\n DATA_FLOW_SCHEMA_VERSION,\n SPOTPATCH_ENDPOINTS,\n SPOTPATCH_TOKEN_HEADER,\n getAgentJobEndpoint,\n type AgentCapabilityRequest,\n type AgentCapabilitySnapshot,\n type AgentJobCreateRequest,\n type AgentJobEvent,\n type AgentJobResultResponse,\n type AgentJobSnapshot,\n type AgentWorkspaceHealthSnapshot,\n type ApiResponse,\n type CodeContext,\n type ComponentDataFlowReport,\n type DataFlowComponentReportRequest,\n type DataFlowPageReportRequest,\n type EditorOpenResult,\n type ErrorCode,\n type OpenEditorRequest,\n type PageDataFlowReport,\n type SPOTPATCH_API_BASE,\n type SourceContextRequest,\n} from \"@spotpatch/shared\";\n\nimport {\n isAgentCapabilitySnapshot,\n isAgentErrorCode,\n isAgentJobEvent,\n isAgentJobResultResponse,\n isAgentJobSnapshot,\n isAgentWorkspaceHealthSnapshot,\n} from \"./agent-response-validation.js\";\n\nconst MAX_JSON_RESPONSE_BYTES = 2_000_000;\nconst MAX_EVENT_LINE_BYTES = 100_000;\nconst MAX_EVENT_STREAM_BYTES = 4_000_000;\n\nexport class RuntimeApiError extends Error {\n readonly code: ErrorCode | undefined;\n\n constructor(code?: ErrorCode) {\n super(\"SpotPatch local API request failed.\");\n this.name = \"RuntimeApiError\";\n this.code = code;\n }\n}\n\nexport interface RuntimeApi {\n readonly componentDataFlowReport: (\n request: DataFlowComponentReportRequest,\n ) => Promise<ComponentDataFlowReport>;\n readonly agentCapability: (\n request: AgentCapabilityRequest,\n ) => Promise<AgentCapabilitySnapshot>;\n readonly agentEvents: (\n jobId: string,\n onEvent: (event: AgentJobEvent) => void,\n ) => Promise<void>;\n readonly agentResult: (jobId: string) => Promise<AgentJobResultResponse>;\n readonly agentWorkspaceHealth: () => Promise<AgentWorkspaceHealthSnapshot>;\n readonly applyAgentJob: (jobId: string) => Promise<AgentJobSnapshot>;\n readonly cancelAgentJob: (jobId: string) => Promise<AgentJobSnapshot>;\n readonly cancelPending: () => void;\n readonly createAgentJob: (\n request: AgentJobCreateRequest,\n ) => Promise<AgentJobSnapshot>;\n readonly dispose: () => void;\n readonly openEditor: (request: OpenEditorRequest) => Promise<EditorOpenResult>;\n readonly pageDataFlowReport: (\n request: DataFlowPageReportRequest,\n ) => Promise<PageDataFlowReport>;\n readonly revertAgentJob: (jobId: string) => Promise<AgentJobSnapshot>;\n readonly sourceContext: (request: SourceContextRequest) => Promise<CodeContext>;\n}\n\nexport interface RuntimeApiOptions {\n readonly apiBase: typeof SPOTPATCH_API_BASE;\n readonly fetch: typeof globalThis.fetch;\n readonly sessionToken: string;\n readonly dataFlowReportMaxBytes?: number;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readFailureCode(value: unknown): ErrorCode | undefined {\n if (!isRecord(value) || value.ok !== false || !isRecord(value.error)) {\n return undefined;\n }\n\n return isAgentErrorCode(value.error.code) ? value.error.code : undefined;\n}\n\nfunction readSuccessData(value: unknown): unknown {\n if (!isRecord(value) || value.ok !== true || !(\"data\" in value)) {\n throw new RuntimeApiError();\n }\n\n return value.data;\n}\n\nfunction isCodeContext(value: unknown): value is CodeContext {\n return (\n isRecord(value) &&\n typeof value.relativePath === \"string\" &&\n (value.language === \"tsx\" || value.language === \"jsx\") &&\n typeof value.startLine === \"number\" &&\n typeof value.endLine === \"number\" &&\n typeof value.excerpt === \"string\" &&\n (value.boundary === \"component\" || value.boundary === \"nearby-lines\")\n );\n}\n\nfunction deepFreezeUnknown(value: unknown): void {\n if (!isRecord(value) && !Array.isArray(value)) {\n return;\n }\n\n if (Object.isFrozen(value)) {\n return;\n }\n\n for (const nested of Object.values(value)) {\n deepFreezeUnknown(nested);\n }\n\n Object.freeze(value);\n}\n\nfunction deepFreeze<T>(value: T): T {\n deepFreezeUnknown(value);\n return value;\n}\n\nasync function readBoundedText(\n response: Response,\n maximumBytes: number,\n): Promise<string> {\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (Number.isFinite(declaredLength) && declaredLength > maximumBytes) {\n throw new RuntimeApiError();\n }\n\n if (response.body === null) {\n throw new RuntimeApiError();\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let totalBytes = 0;\n let output = \"\";\n\n try {\n for (;;) {\n const chunk = await reader.read();\n\n if (chunk.done) {\n output += decoder.decode();\n return output;\n }\n\n totalBytes += chunk.value.byteLength;\n\n if (totalBytes > maximumBytes) {\n await reader.cancel();\n throw new RuntimeApiError();\n }\n\n output += decoder.decode(chunk.value, { stream: true });\n }\n } catch (error: unknown) {\n if (error instanceof RuntimeApiError) {\n throw error;\n }\n\n throw new RuntimeApiError();\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new RuntimeApiError();\n }\n}\n\nasync function readJsonEnvelope(\n response: Response,\n maximumBytes = MAX_JSON_RESPONSE_BYTES,\n): Promise<unknown> {\n const payload = parseJson(\n await readBoundedText(response, maximumBytes),\n ) as ApiResponse<unknown>;\n\n if (!response.ok) {\n throw new RuntimeApiError(readFailureCode(payload));\n }\n\n return readSuccessData(payload);\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isReportCompleteness(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.complete === \"boolean\" &&\n typeof value.visitedModules === \"number\" &&\n typeof value.visitedCallsites === \"number\" &&\n typeof value.frontierCount === \"number\"\n );\n}\n\nfunction isDataFlowCapability(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.enabled === \"boolean\" &&\n (value.staticAnalysis === \"available\" ||\n value.staticAnalysis === \"partial\" ||\n value.staticAnalysis === \"unavailable\") &&\n value.runtimeObservation === \"dispatch-only\" &&\n value.responseShape === \"consumed-fields-only\" &&\n value.aiAssistance === \"disabled\" &&\n Array.isArray(value.reasons)\n );\n}\n\nfunction isDataFlowDependency(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.kind === \"string\" &&\n typeof value.direction === \"string\" &&\n typeof value.execution === \"string\" &&\n typeof value.proof === \"string\" &&\n typeof value.association === \"string\" &&\n Array.isArray(value.parameters) &&\n isRecord(value.response) &&\n isStringArray(value.response.consumedFields) &&\n isStringArray(value.evidenceIds) &&\n isStringArray(value.observationIds)\n );\n}\n\nfunction isDataFlowReportBase(value: unknown): boolean {\n return (\n isRecord(value) &&\n value.schemaVersion === DATA_FLOW_SCHEMA_VERSION &&\n typeof value.reportId === \"string\" &&\n isRecord(value.baseline) &&\n typeof value.baseline.registryEpoch === \"string\" &&\n typeof value.baseline.analyzerVersion === \"string\" &&\n isStringArray(value.baseline.analyzedSourceVersions) &&\n isDataFlowCapability(value.capability) &&\n Array.isArray(value.dependencies) &&\n value.dependencies.every(isDataFlowDependency) &&\n Array.isArray(value.evidence) &&\n Array.isArray(value.diagnostics) &&\n isReportCompleteness(value.completeness)\n );\n}\n\nfunction isComponentDataFlowReport(value: unknown): value is ComponentDataFlowReport {\n return (\n isDataFlowReportBase(value) &&\n isRecord(value) &&\n isRecord(value.component) &&\n isRecord(value.component.source) &&\n typeof value.component.source.fileId === \"string\" &&\n typeof value.component.source.sourceVersion === \"string\"\n );\n}\n\nfunction isPageDataFlowReport(value: unknown): value is PageDataFlowReport {\n return isDataFlowReportBase(value);\n}\n\nfunction parseCapability(\n value: unknown,\n expected: AgentCapabilityRequest,\n): AgentCapabilitySnapshot {\n if (\n !isAgentCapabilitySnapshot(value) ||\n value.providerProfileId !== expected.providerProfileId ||\n value.modelProfileId !== expected.modelProfileId\n ) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(value);\n}\n\nfunction parseJobSnapshot(\n value: unknown,\n expected?: Readonly<{\n jobId?: string;\n modelProfileId?: string;\n providerProfileId?: string;\n }>,\n): AgentJobSnapshot {\n if (\n !isAgentJobSnapshot(value) ||\n (expected?.jobId !== undefined && value.jobId !== expected.jobId) ||\n (expected?.providerProfileId !== undefined &&\n value.providerProfileId !== expected.providerProfileId) ||\n (expected?.modelProfileId !== undefined &&\n value.modelProfileId !== expected.modelProfileId)\n ) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(value);\n}\n\nfunction parseJobResult(value: unknown, expectedJobId: string): AgentJobResultResponse {\n if (!isAgentJobResultResponse(value) || value.snapshot.jobId !== expectedJobId) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(value);\n}\n\nfunction parseAgentEvent(value: unknown): AgentJobEvent {\n if (!isAgentJobEvent(value)) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(value);\n}\n\nfunction omitBrowserCodeContext(request: AgentJobCreateRequest): AgentJobCreateRequest {\n return {\n ...request,\n annotation: {\n ...request.annotation,\n targets: request.annotation.targets.map((target) => ({\n instruction: target.instruction,\n source: target.source,\n react: target.react,\n element: target.element,\n styles: target.styles,\n warnings: target.warnings,\n })),\n },\n };\n}\n\nexport function runtimeApiErrorCode(error: unknown): ErrorCode | undefined {\n return error instanceof RuntimeApiError ? error.code : undefined;\n}\n\nexport function createRuntimeApi(options: RuntimeApiOptions): RuntimeApi {\n const pendingRequests = new Set<AbortController>();\n\n function cancelPending(): void {\n for (const request of pendingRequests) {\n request.abort();\n }\n\n pendingRequests.clear();\n }\n\n async function requestJson(\n endpoint: string,\n method: \"GET\" | \"POST\",\n body?: unknown,\n maximumResponseBytes = MAX_JSON_RESPONSE_BYTES,\n ): Promise<unknown> {\n const abortController = new AbortController();\n pendingRequests.add(abortController);\n\n try {\n const response = await options.fetch(endpoint, {\n method,\n headers: {\n ...(body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n [SPOTPATCH_TOKEN_HEADER]: options.sessionToken,\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n signal: abortController.signal,\n });\n return await readJsonEnvelope(response, maximumResponseBytes);\n } finally {\n pendingRequests.delete(abortController);\n }\n }\n\n async function agentEvents(\n jobId: string,\n onEvent: (event: AgentJobEvent) => void,\n ): Promise<void> {\n const abortController = new AbortController();\n pendingRequests.add(abortController);\n\n try {\n const response = await options.fetch(getAgentJobEndpoint(jobId, \"events\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n [SPOTPATCH_TOKEN_HEADER]: options.sessionToken,\n },\n body: JSON.stringify({}),\n signal: abortController.signal,\n });\n\n if (!response.ok) {\n await readJsonEnvelope(response);\n return;\n }\n\n if (response.body === null) {\n throw new RuntimeApiError();\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let buffer = \"\";\n let totalBytes = 0;\n let previousSequence = 0;\n\n const consumeLine = (line: string): void => {\n if (line.trim().length === 0) {\n return;\n }\n\n if (new TextEncoder().encode(line).byteLength > MAX_EVENT_LINE_BYTES) {\n throw new RuntimeApiError();\n }\n\n const event = parseAgentEvent(parseJson(line));\n\n if (event.jobId !== jobId || event.sequence <= previousSequence) {\n throw new RuntimeApiError();\n }\n\n previousSequence = event.sequence;\n onEvent(event);\n };\n\n try {\n for (;;) {\n const chunk = await reader.read();\n\n if (chunk.done) {\n buffer += decoder.decode();\n consumeLine(buffer);\n return;\n }\n\n totalBytes += chunk.value.byteLength;\n\n if (totalBytes > MAX_EVENT_STREAM_BYTES) {\n await reader.cancel();\n throw new RuntimeApiError();\n }\n\n buffer += decoder.decode(chunk.value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n if (new TextEncoder().encode(buffer).byteLength > MAX_EVENT_LINE_BYTES) {\n await reader.cancel();\n throw new RuntimeApiError();\n }\n\n for (const line of lines) {\n consumeLine(line);\n }\n }\n } catch (error: unknown) {\n if (\n error instanceof RuntimeApiError ||\n (error instanceof DOMException && error.name === \"AbortError\")\n ) {\n throw error;\n }\n\n throw new RuntimeApiError();\n } finally {\n reader.releaseLock();\n }\n } finally {\n pendingRequests.delete(abortController);\n }\n }\n\n const emptyAction = Object.freeze({});\n\n return Object.freeze({\n cancelPending,\n\n async sourceContext(request: SourceContextRequest): Promise<CodeContext> {\n const data = await requestJson(\n SPOTPATCH_ENDPOINTS.sourceContext,\n \"POST\",\n request,\n );\n\n if (!isCodeContext(data)) {\n throw new RuntimeApiError();\n }\n\n return Object.freeze({ ...data });\n },\n\n async componentDataFlowReport(\n request: DataFlowComponentReportRequest,\n ): Promise<ComponentDataFlowReport> {\n const data = await requestJson(\n SPOTPATCH_ENDPOINTS.dataFlowComponentReport,\n \"POST\",\n request,\n options.dataFlowReportMaxBytes,\n );\n if (!isComponentDataFlowReport(data)) {\n throw new RuntimeApiError();\n }\n return deepFreeze(data);\n },\n\n async pageDataFlowReport(\n request: DataFlowPageReportRequest,\n ): Promise<PageDataFlowReport> {\n const data = await requestJson(\n SPOTPATCH_ENDPOINTS.dataFlowPageReport,\n \"POST\",\n request,\n options.dataFlowReportMaxBytes,\n );\n if (!isPageDataFlowReport(data)) {\n throw new RuntimeApiError();\n }\n return deepFreeze(data);\n },\n\n async openEditor(request: OpenEditorRequest): Promise<EditorOpenResult> {\n const data = await requestJson(SPOTPATCH_ENDPOINTS.openEditor, \"POST\", request);\n\n if (\n !isRecord(data) ||\n (data.editor !== \"auto\" && data.editor !== \"vscode\" && data.editor !== \"cursor\")\n ) {\n throw new RuntimeApiError();\n }\n\n return Object.freeze({ editor: data.editor });\n },\n\n async agentCapability(\n request: AgentCapabilityRequest,\n ): Promise<AgentCapabilitySnapshot> {\n return parseCapability(\n await requestJson(SPOTPATCH_ENDPOINTS.agentCapability, \"POST\", request),\n request,\n );\n },\n\n async agentWorkspaceHealth(): Promise<AgentWorkspaceHealthSnapshot> {\n const data = await requestJson(\n SPOTPATCH_ENDPOINTS.agentWorkspaceHealth,\n \"POST\",\n emptyAction,\n );\n\n if (!isAgentWorkspaceHealthSnapshot(data)) {\n throw new RuntimeApiError();\n }\n\n return deepFreeze(data);\n },\n\n async createAgentJob(request: AgentJobCreateRequest): Promise<AgentJobSnapshot> {\n const serverRequest = omitBrowserCodeContext(request);\n return parseJobSnapshot(\n await requestJson(SPOTPATCH_ENDPOINTS.agentJobs, \"POST\", serverRequest),\n request,\n );\n },\n\n agentEvents,\n\n async agentResult(jobId: string): Promise<AgentJobResultResponse> {\n return parseJobResult(\n await requestJson(getAgentJobEndpoint(jobId, \"result\"), \"POST\", emptyAction),\n jobId,\n );\n },\n\n async cancelAgentJob(jobId: string): Promise<AgentJobSnapshot> {\n return parseJobSnapshot(\n await requestJson(getAgentJobEndpoint(jobId, \"cancel\"), \"POST\", emptyAction),\n { jobId },\n );\n },\n\n async applyAgentJob(jobId: string): Promise<AgentJobSnapshot> {\n return parseJobSnapshot(\n await requestJson(getAgentJobEndpoint(jobId, \"apply\"), \"POST\", emptyAction),\n { jobId },\n );\n },\n\n async revertAgentJob(jobId: string): Promise<AgentJobSnapshot> {\n return parseJobSnapshot(\n await requestJson(getAgentJobEndpoint(jobId, \"revert\"), \"POST\", emptyAction),\n { jobId },\n );\n },\n\n dispose(): void {\n cancelPending();\n },\n });\n}\n","import {\n AGENT_CAPABILITY_STATES,\n AGENT_CHECK_STATUSES,\n AGENT_FILE_CHANGE_KINDS,\n AGENT_JOB_STATUSES,\n ERROR_CODES,\n type AgentCapabilitySnapshot,\n type AgentJobEvent,\n type AgentJobResultResponse,\n type AgentJobSnapshot,\n type AgentWorkspaceHealthSnapshot,\n type ErrorCode,\n} from \"@spotpatch/shared\";\n\n// Keep this browser-safe mirror aligned with the shared Zod schemas. Importing Zod\n// here would violate the runtime bundle boundary; the parity test covers both paths.\n\nconst ERROR_CODE_VALUES = new Set<string>(Object.values(ERROR_CODES));\nconst CAPABILITY_STATE_VALUES = new Set<string>(AGENT_CAPABILITY_STATES);\nconst CHECK_STATUS_VALUES = new Set<string>(AGENT_CHECK_STATUSES);\nconst FILE_CHANGE_KIND_VALUES = new Set<string>(AGENT_FILE_CHANGE_KINDS);\nconst JOB_STATUS_VALUES = new Set<string>(AGENT_JOB_STATUSES);\nconst PROFILE_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst JOB_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst ISO_TIMESTAMP_PATTERN = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?Z$/;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOnlyKeys(\n value: Readonly<Record<string, unknown>>,\n allowed: readonly string[],\n): boolean {\n return Object.keys(value).every((key) => allowed.includes(key));\n}\n\nfunction isBoundedString(value: unknown, maximum: number, minimum = 0): boolean {\n return (\n typeof value === \"string\" && value.length >= minimum && value.length <= maximum\n );\n}\n\nfunction isProfileId(value: unknown): boolean {\n return (\n isBoundedString(value, 64, 1) &&\n typeof value === \"string\" &&\n PROFILE_ID_PATTERN.test(value)\n );\n}\n\nfunction isJobId(value: unknown): value is string {\n return (\n isBoundedString(value, 128, 22) &&\n typeof value === \"string\" &&\n JOB_ID_PATTERN.test(value)\n );\n}\n\nfunction isIsoTimestamp(value: unknown): boolean {\n return (\n typeof value === \"string\" &&\n ISO_TIMESTAMP_PATTERN.test(value) &&\n Number.isFinite(Date.parse(value))\n );\n}\n\nfunction isNonnegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isPositiveInteger(value: unknown): boolean {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction isOptionalBoundedString(value: unknown, maximum: number): boolean {\n return value === undefined || isBoundedString(value, maximum);\n}\n\nexport function isAgentErrorCode(value: unknown): value is ErrorCode {\n return typeof value === \"string\" && ERROR_CODE_VALUES.has(value);\n}\n\nexport function isAgentCapabilitySnapshot(\n value: unknown,\n): value is AgentCapabilitySnapshot {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n \"providerProfileId\",\n \"providerLabel\",\n \"modelProfileId\",\n \"modelLabel\",\n \"protocol\",\n \"state\",\n \"authenticated\",\n \"modelAvailable\",\n \"toolCalling\",\n \"toolResultContinuation\",\n \"streaming\",\n \"checkedAt\",\n \"errorCode\",\n ])\n ) {\n return false;\n }\n\n return (\n isProfileId(value.providerProfileId) &&\n isBoundedString(value.providerLabel, 100) &&\n isProfileId(value.modelProfileId) &&\n isBoundedString(value.modelLabel, 100) &&\n (value.protocol === \"responses\" || value.protocol === \"chat-completions\") &&\n typeof value.state === \"string\" &&\n CAPABILITY_STATE_VALUES.has(value.state) &&\n typeof value.authenticated === \"boolean\" &&\n typeof value.modelAvailable === \"boolean\" &&\n typeof value.toolCalling === \"boolean\" &&\n typeof value.toolResultContinuation === \"boolean\" &&\n typeof value.streaming === \"boolean\" &&\n (value.checkedAt === undefined || isIsoTimestamp(value.checkedAt)) &&\n (value.errorCode === undefined || isAgentErrorCode(value.errorCode))\n );\n}\n\nexport function isAgentWorkspaceHealthSnapshot(\n value: unknown,\n): value is AgentWorkspaceHealthSnapshot {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n \"state\",\n \"checkedAt\",\n \"changes\",\n \"canIncludeLocalChanges\",\n \"errorCode\",\n ]) ||\n (value.state !== \"ready\" &&\n value.state !== \"consent-required\" &&\n value.state !== \"blocked\") ||\n !isIsoTimestamp(value.checkedAt) ||\n typeof value.canIncludeLocalChanges !== \"boolean\" ||\n (value.errorCode !== undefined && !isAgentErrorCode(value.errorCode)) ||\n !isRecord(value.changes) ||\n !hasOnlyKeys(value.changes, [\n \"staged\",\n \"unstaged\",\n \"untracked\",\n \"conflicted\",\n \"total\",\n ])\n ) {\n return false;\n }\n\n const changes = value.changes;\n const { staged, unstaged, untracked, conflicted, total } = changes;\n\n if (\n !isNonnegativeInteger(staged) ||\n !isNonnegativeInteger(unstaged) ||\n !isNonnegativeInteger(untracked) ||\n !isNonnegativeInteger(conflicted) ||\n !isNonnegativeInteger(total) ||\n total < staged ||\n total < unstaged ||\n total < untracked ||\n total < conflicted ||\n total > staged + unstaged + untracked\n ) {\n return false;\n }\n\n if (value.state === \"ready\") {\n return (\n total === 0 && !value.canIncludeLocalChanges && value.errorCode === undefined\n );\n }\n\n if (value.state === \"consent-required\") {\n return (\n total > 0 &&\n conflicted === 0 &&\n value.canIncludeLocalChanges &&\n value.errorCode === undefined\n );\n }\n\n return !value.canIncludeLocalChanges && value.errorCode !== undefined;\n}\n\nexport function isAgentJobSnapshot(value: unknown): value is AgentJobSnapshot {\n if (\n !isRecord(value) ||\n !hasOnlyKeys(value, [\n \"jobId\",\n \"status\",\n \"providerProfileId\",\n \"providerLabel\",\n \"modelProfileId\",\n \"modelLabel\",\n \"phaseMessage\",\n \"createdAt\",\n \"updatedAt\",\n \"canCancel\",\n \"canApply\",\n \"canRevert\",\n \"errorCode\",\n ])\n ) {\n return false;\n }\n\n return (\n isJobId(value.jobId) &&\n typeof value.status === \"string\" &&\n JOB_STATUS_VALUES.has(value.status) &&\n isProfileId(value.providerProfileId) &&\n isBoundedString(value.providerLabel, 100) &&\n isProfileId(value.modelProfileId) &&\n isBoundedString(value.modelLabel, 100) &&\n isBoundedString(value.phaseMessage, 1_024) &&\n isIsoTimestamp(value.createdAt) &&\n isIsoTimestamp(value.updatedAt) &&\n typeof value.canCancel === \"boolean\" &&\n typeof value.canApply === \"boolean\" &&\n typeof value.canRevert === \"boolean\" &&\n (value.errorCode === undefined || isAgentErrorCode(value.errorCode))\n );\n}\n\nfunction isAgentChangedFile(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\"relativePath\", \"kind\", \"additions\", \"deletions\"]) &&\n isBoundedString(value.relativePath, 1_024) &&\n typeof value.kind === \"string\" &&\n FILE_CHANGE_KIND_VALUES.has(value.kind) &&\n isNonnegativeInteger(value.additions) &&\n isNonnegativeInteger(value.deletions)\n );\n}\n\nfunction isAgentCheckResult(value: unknown): boolean {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\"checkId\", \"label\", \"status\", \"durationMs\", \"output\"]) &&\n isProfileId(value.checkId) &&\n isBoundedString(value.label, 100) &&\n typeof value.status === \"string\" &&\n CHECK_STATUS_VALUES.has(value.status) &&\n isNonnegativeInteger(value.durationMs) &&\n isBoundedString(value.output, 80_000)\n );\n}\n\nfunction isAgentJobResult(\n value: unknown,\n): value is NonNullable<AgentJobResultResponse[\"result\"]> {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\"jobId\", \"summary\", \"diff\", \"files\", \"checks\"]) &&\n isJobId(value.jobId) &&\n isBoundedString(value.summary, 80_000) &&\n isBoundedString(value.diff, 1_000_000) &&\n Array.isArray(value.files) &&\n value.files.length <= 100 &&\n value.files.every(isAgentChangedFile) &&\n Array.isArray(value.checks) &&\n value.checks.length <= 100 &&\n value.checks.every(isAgentCheckResult)\n );\n}\n\nexport function isAgentJobResultResponse(\n value: unknown,\n): value is AgentJobResultResponse {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\"snapshot\", \"result\"]) &&\n isAgentJobSnapshot(value.snapshot) &&\n (value.result === undefined ||\n (isAgentJobResult(value.result) && value.result.jobId === value.snapshot.jobId))\n );\n}\n\nfunction isAgentEventBase(value: unknown): value is Readonly<{\n data: Readonly<Record<string, unknown>>;\n jobId: string;\n schemaVersion: 2;\n sequence: number;\n status: AgentJobSnapshot[\"status\"];\n timestamp: string;\n type: string;\n}> {\n return (\n isRecord(value) &&\n hasOnlyKeys(value, [\n \"schemaVersion\",\n \"sequence\",\n \"jobId\",\n \"status\",\n \"timestamp\",\n \"type\",\n \"data\",\n ]) &&\n value.schemaVersion === 2 &&\n isPositiveInteger(value.sequence) &&\n isJobId(value.jobId) &&\n typeof value.status === \"string\" &&\n JOB_STATUS_VALUES.has(value.status) &&\n isIsoTimestamp(value.timestamp) &&\n typeof value.type === \"string\" &&\n isRecord(value.data)\n );\n}\n\nexport function isAgentJobEvent(value: unknown): value is AgentJobEvent {\n if (!isAgentEventBase(value)) {\n return false;\n }\n\n const data = value.data;\n\n switch (value.type) {\n case \"snapshot\":\n return (\n hasOnlyKeys(data, [\"snapshot\"]) &&\n isAgentJobSnapshot(data.snapshot) &&\n data.snapshot.jobId === value.jobId &&\n data.snapshot.status === value.status\n );\n case \"phase\":\n return hasOnlyKeys(data, [\"message\"]) && isBoundedString(data.message, 1_024);\n case \"tool\":\n return (\n hasOnlyKeys(data, [\n \"turn\",\n \"toolCallId\",\n \"toolName\",\n \"state\",\n \"relativePath\",\n \"checkLabel\",\n ]) &&\n isPositiveInteger(data.turn) &&\n isBoundedString(data.toolCallId, 256) &&\n isBoundedString(data.toolName, 100) &&\n (data.state === \"started\" ||\n data.state === \"succeeded\" ||\n data.state === \"failed\") &&\n isOptionalBoundedString(data.relativePath, 1_024) &&\n isOptionalBoundedString(data.checkLabel, 100)\n );\n case \"check\":\n return hasOnlyKeys(data, [\"result\"]) && isAgentCheckResult(data.result);\n case \"result-ready\":\n return hasOnlyKeys(data, [\"hasResult\"]) && data.hasResult === true;\n case \"error\":\n return (\n hasOnlyKeys(data, [\"code\", \"message\"]) &&\n isAgentErrorCode(data.code) &&\n isBoundedString(data.message, 1_024)\n );\n default:\n return false;\n }\n}\n","import { isSensitiveName, redactSensitiveText, sanitizeUrl } from \"@spotpatch/shared\";\n\nconst MAX_ATTRIBUTE_CHARACTERS = 500;\nconst MAX_SVG_PATH_CHARACTERS = 256;\n\nfunction truncate(value: string, maxCharacters: number): string {\n return value.length <= maxCharacters\n ? value\n : `${value.slice(0, Math.max(0, maxCharacters - 1))}…`;\n}\n\nexport function isSensitiveAttributeName(name: string): boolean {\n return isSensitiveName(name);\n}\n\nexport { redactSensitiveText, sanitizeUrl };\n\nexport function sanitizeAttributeValue(\n name: string,\n value: string,\n baseUrl: string,\n): string | undefined {\n if (isSensitiveAttributeName(name)) {\n return undefined;\n }\n\n if (name === \"href\" || name === \"src\") {\n return sanitizeUrl(value, baseUrl);\n }\n\n if (name === \"d\" && value.length > MAX_SVG_PATH_CHARACTERS) {\n return `${value.slice(0, MAX_SVG_PATH_CHARACTERS)}…`;\n }\n\n return truncate(redactSensitiveText(value), MAX_ATTRIBUTE_CHARACTERS);\n}\n\nexport function sanitizeCssText(value: string): string {\n return redactSensitiveText(value);\n}\n","export const COMPUTED_STYLE_PROPERTIES = Object.freeze([\n \"display\",\n \"position\",\n \"inset\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"width\",\n \"height\",\n \"min-width\",\n \"min-height\",\n \"max-width\",\n \"max-height\",\n \"margin\",\n \"padding\",\n \"box-sizing\",\n \"overflow\",\n \"overflow-x\",\n \"overflow-y\",\n \"flex\",\n \"flex-direction\",\n \"flex-wrap\",\n \"align-items\",\n \"align-content\",\n \"justify-content\",\n \"gap\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"font-family\",\n \"font-size\",\n \"font-weight\",\n \"line-height\",\n \"text-align\",\n \"white-space\",\n \"color\",\n \"background-color\",\n \"border\",\n \"border-radius\",\n \"opacity\",\n \"visibility\",\n \"z-index\",\n \"transform\",\n] as const);\n","import type { MatchedStyleRule, StyleContext } from \"@spotpatch/shared\";\n\nimport { sanitizeCssText, sanitizeUrl } from \"../security/content-sanitizer.js\";\nimport { COMPUTED_STYLE_PROPERTIES } from \"./computed-style-properties.js\";\n\nexport const CSS_COLLECTION_WARNINGS = Object.freeze({\n cascade: \"CSS shorthand and longhand cascade resolution is not available in v1.\",\n cssInJs:\n \"Runtime CSS-in-JS rules may not include original TypeScript source locations.\",\n inaccessibleStylesheet:\n \"A stylesheet could not be inspected because browser security denied access.\",\n selector: \"A stylesheet selector could not be evaluated and was skipped.\",\n state:\n \"Dynamic pseudo-class and pseudo-element rules may be unavailable in the current state.\",\n});\n\ninterface StyleRuleLike extends CSSRule {\n readonly selectorText: string;\n readonly style: CSSStyleDeclaration;\n}\n\ninterface GroupingRuleLike extends CSSRule {\n readonly conditionText?: string;\n readonly cssRules: CSSRuleList;\n}\n\nexport interface CollectStyleContextOptions {\n readonly document: Document;\n readonly element: Element;\n readonly getComputedStyle?: (element: Element) => CSSStyleDeclaration;\n readonly maxCharacters: number;\n readonly readCssRules?: (sheet: CSSStyleSheet) => CSSRuleList;\n}\n\nfunction isStyleRule(rule: CSSRule): rule is StyleRuleLike {\n return \"selectorText\" in rule && \"style\" in rule;\n}\n\nfunction isGroupingRule(rule: CSSRule): rule is GroupingRuleLike {\n return \"cssRules\" in rule;\n}\n\nfunction groupingCondition(rule: GroupingRuleLike): string | undefined {\n if (typeof rule.conditionText === \"string\" && rule.conditionText.length > 0) {\n return rule.conditionText;\n }\n\n const openingBrace = rule.cssText.indexOf(\"{\");\n const prefix = openingBrace < 0 ? \"\" : rule.cssText.slice(0, openingBrace).trim();\n return prefix.length === 0 ? undefined : prefix;\n}\n\nfunction contextCharacterCount(\n classNames: readonly string[],\n inlineStyle: string | undefined,\n rules: readonly MatchedStyleRule[],\n computed: Readonly<Record<string, string>>,\n warnings: readonly string[],\n): number {\n return (\n classNames.join(\" \").length +\n (inlineStyle?.length ?? 0) +\n rules.reduce(\n (total, rule) =>\n total +\n rule.selector.length +\n rule.declarations.length +\n (rule.source?.length ?? 0) +\n (rule.media?.length ?? 0),\n 0,\n ) +\n Object.entries(computed).reduce(\n (total, [name, value]) => total + name.length + value.length,\n 0,\n ) +\n warnings.join(\"\\n\").length\n );\n}\n\nfunction stylesheetSource(sheet: CSSStyleSheet, baseUrl: string): string | undefined {\n return sheet.href === null ? undefined : sanitizeUrl(sheet.href, baseUrl);\n}\n\nfunction collectMatchedRules(\n element: Element,\n rules: CSSRuleList,\n source: string | undefined,\n inheritedConditions: readonly string[],\n output: MatchedStyleRule[],\n warnings: Set<string>,\n): void {\n for (const rule of rules) {\n if (isStyleRule(rule)) {\n let matches = false;\n\n try {\n matches = element.matches(rule.selectorText);\n } catch {\n warnings.add(CSS_COLLECTION_WARNINGS.selector);\n continue;\n }\n\n if (matches) {\n output.push(\n Object.freeze({\n selector: sanitizeCssText(rule.selectorText),\n declarations: sanitizeCssText(rule.style.cssText),\n ...(source === undefined ? {} : { source }),\n ...(inheritedConditions.length === 0\n ? {}\n : { media: inheritedConditions.join(\" and \") }),\n }),\n );\n }\n\n continue;\n }\n\n if (isGroupingRule(rule)) {\n const condition = groupingCondition(rule);\n collectMatchedRules(\n element,\n rule.cssRules,\n source,\n condition === undefined\n ? inheritedConditions\n : [...inheritedConditions, condition],\n output,\n warnings,\n );\n }\n }\n}\n\nfunction collectComputedStyle(\n element: Element,\n getComputedStyle: ((element: Element) => CSSStyleDeclaration) | undefined,\n): Record<string, string> {\n if (getComputedStyle === undefined) {\n return {};\n }\n\n const declaration = getComputedStyle(element);\n const computed: Record<string, string> = {};\n\n for (const property of COMPUTED_STYLE_PROPERTIES) {\n const value = sanitizeCssText(declaration.getPropertyValue(property).trim());\n\n if (value.length > 0) {\n computed[property] = value;\n }\n }\n\n return computed;\n}\n\nexport function collectStyleContext(options: CollectStyleContextOptions): StyleContext {\n const warnings = new Set<string>([\n CSS_COLLECTION_WARNINGS.state,\n CSS_COLLECTION_WARNINGS.cssInJs,\n CSS_COLLECTION_WARNINGS.cascade,\n ]);\n const matchedRules: MatchedStyleRule[] = [];\n const readCssRules =\n options.readCssRules ?? ((sheet: CSSStyleSheet) => sheet.cssRules);\n\n for (const sheet of options.document.styleSheets) {\n let rules: CSSRuleList;\n\n try {\n rules = readCssRules(sheet);\n } catch {\n warnings.add(CSS_COLLECTION_WARNINGS.inaccessibleStylesheet);\n continue;\n }\n\n collectMatchedRules(\n options.element,\n rules,\n stylesheetSource(sheet, options.document.baseURI),\n [],\n matchedRules,\n warnings,\n );\n }\n\n const classNames = Array.from(options.element.classList);\n const inlineValue = options.element.getAttribute(\"style\");\n const inlineStyle = inlineValue === null ? undefined : sanitizeCssText(inlineValue);\n const getComputedStyle =\n options.getComputedStyle ??\n options.document.defaultView?.getComputedStyle.bind(options.document.defaultView);\n const computedEntries = Object.entries(\n collectComputedStyle(options.element, getComputedStyle),\n );\n const warningList = Array.from(warnings);\n\n while (\n contextCharacterCount(\n classNames,\n inlineStyle,\n matchedRules,\n Object.fromEntries(computedEntries),\n warningList,\n ) > options.maxCharacters\n ) {\n if (computedEntries.length > 0) {\n computedEntries.pop();\n continue;\n }\n\n if (matchedRules.length > 1) {\n matchedRules.shift();\n continue;\n }\n\n break;\n }\n\n return Object.freeze({\n classNames: Object.freeze(classNames),\n ...(inlineStyle === undefined ? {} : { inlineStyle }),\n matchedRules: Object.freeze(matchedRules),\n computed: Object.freeze(Object.fromEntries(computedEntries)),\n warnings: Object.freeze(warningList),\n });\n}\n","import type { ElementContext } from \"@spotpatch/shared\";\n\nimport {\n redactSensitiveText,\n sanitizeAttributeValue,\n} from \"../security/content-sanitizer.js\";\n\nexport const DOM_COLLECTION_LIMITS = Object.freeze({\n maxDepth: 3,\n maxNodes: 30,\n maxParentDepth: 2,\n maxTextCharacters: 200,\n});\n\nconst SAFE_ATTRIBUTE_NAMES = new Set([\n \"alt\",\n \"autocomplete\",\n \"checked\",\n \"class\",\n \"colspan\",\n \"contenteditable\",\n \"d\",\n \"disabled\",\n \"download\",\n \"draggable\",\n \"for\",\n \"height\",\n \"hidden\",\n \"href\",\n \"id\",\n \"max\",\n \"maxlength\",\n \"min\",\n \"minlength\",\n \"multiple\",\n \"name\",\n \"open\",\n \"pattern\",\n \"placeholder\",\n \"readonly\",\n \"rel\",\n \"required\",\n \"role\",\n \"rowspan\",\n \"selected\",\n \"src\",\n \"step\",\n \"style\",\n \"tabindex\",\n \"target\",\n \"title\",\n \"type\",\n \"width\",\n]);\n\nconst VOID_ELEMENT_NAMES = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\ninterface SerializationState {\n nodeCount: number;\n truncated: boolean;\n}\n\nexport interface CollectElementContextOptions {\n readonly element: Element;\n readonly maxCharacters: number;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll('\"', \""\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction isPreservedAttribute(name: string): boolean {\n return (\n SAFE_ATTRIBUTE_NAMES.has(name) || name.startsWith(\"aria-\") || name === \"data-testid\"\n );\n}\n\nfunction openingTag(element: Element): string {\n const tagName = element.tagName.toLowerCase();\n const attributes: string[] = [];\n const baseUrl = element.ownerDocument.baseURI;\n\n for (const attribute of element.attributes) {\n const name = attribute.name.toLowerCase();\n\n if (!isPreservedAttribute(name)) {\n continue;\n }\n\n const sanitized = sanitizeAttributeValue(name, attribute.value, baseUrl);\n\n if (sanitized !== undefined) {\n attributes.push(`${name}=\"${escapeHtml(sanitized)}\"`);\n }\n }\n\n return `<${tagName}${attributes.length === 0 ? \"\" : ` ${attributes.join(\" \")}`}>`;\n}\n\nfunction normalizedText(value: string): string {\n return redactSensitiveText(value).replaceAll(/\\s+/gu, \" \").trim();\n}\n\nfunction serializeElement(\n element: Element,\n depth: number,\n state: SerializationState,\n lines: string[],\n): void {\n if (state.nodeCount >= DOM_COLLECTION_LIMITS.maxNodes) {\n state.truncated = true;\n return;\n }\n\n state.nodeCount += 1;\n const indent = \" \".repeat(depth);\n const tagName = element.tagName.toLowerCase();\n lines.push(`${indent}${openingTag(element)}`);\n\n if (VOID_ELEMENT_NAMES.has(tagName)) {\n return;\n }\n\n for (const child of element.childNodes) {\n if (state.nodeCount >= DOM_COLLECTION_LIMITS.maxNodes) {\n state.truncated = true;\n break;\n }\n\n if (child.nodeType === 3) {\n const text = normalizedText(child.textContent ?? \"\");\n\n if (text.length > 0) {\n state.nodeCount += 1;\n const truncated =\n text.length <= DOM_COLLECTION_LIMITS.maxTextCharacters\n ? text\n : `${text.slice(0, DOM_COLLECTION_LIMITS.maxTextCharacters)}…`;\n lines.push(`${\" \".repeat(depth + 1)}${escapeHtml(truncated)}`);\n }\n\n continue;\n }\n\n if (child.nodeType !== 1) {\n continue;\n }\n\n if (depth >= DOM_COLLECTION_LIMITS.maxDepth) {\n state.truncated = true;\n continue;\n }\n\n serializeElement(child as Element, depth + 1, state, lines);\n }\n\n if (state.truncated && depth === 0) {\n lines.push(\" …\");\n }\n\n lines.push(`${indent}</${tagName}>`);\n}\n\nfunction parentContext(element: Element): readonly string[] {\n const parents: string[] = [];\n let parent = element.parentElement;\n\n while (parent !== null && parents.length < DOM_COLLECTION_LIMITS.maxParentDepth) {\n parents.push(openingTag(parent));\n parent = parent.parentElement;\n }\n\n return parents;\n}\n\nfunction truncateContext(value: string, maxCharacters: number): string {\n if (value.length <= maxCharacters) {\n return value;\n }\n\n return `${value.slice(0, Math.max(0, maxCharacters - 1)).trimEnd()}…`;\n}\n\nfunction escapeCssIdentifier(value: string): string {\n return Array.from(value)\n .map((character) =>\n /[a-z\\d_-]/iu.test(character)\n ? character\n : `\\\\${character.charCodeAt(0).toString(16)} `,\n )\n .join(\"\");\n}\n\nfunction escapeCssAttribute(value: string): string {\n return value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"');\n}\n\nfunction selectorSegment(element: Element): string {\n const tagName = element.tagName.toLowerCase();\n\n if (element.id.length > 0) {\n return `${tagName}#${escapeCssIdentifier(element.id)}`;\n }\n\n const testId = element.getAttribute(\"data-testid\");\n\n if (testId !== null && testId.length > 0) {\n return `${tagName}[data-testid=\"${escapeCssAttribute(testId)}\"]`;\n }\n\n const classes = Array.from(element.classList)\n .slice(0, 2)\n .map((name) => `.${escapeCssIdentifier(name)}`)\n .join(\"\");\n const sameTagSiblings =\n element.parentElement === null\n ? []\n : Array.from(element.parentElement.children).filter(\n (sibling) => sibling.tagName === element.tagName,\n );\n const position = sameTagSiblings.indexOf(element);\n const nth =\n sameTagSiblings.length > 1 && position >= 0\n ? `:nth-of-type(${String(position + 1)})`\n : \"\";\n\n return `${tagName}${classes}${nth}`;\n}\n\nfunction createSelector(element: Element): string {\n const segments: string[] = [];\n let current: Element | null = element;\n\n while (current !== null && segments.length < 5) {\n const segment = selectorSegment(current);\n segments.unshift(segment);\n\n if (current.id.length > 0 || current.hasAttribute(\"data-testid\")) {\n break;\n }\n\n current = current.parentElement;\n }\n\n return segments.join(\" > \");\n}\n\nexport function collectElementContext(\n options: CollectElementContextOptions,\n): ElementContext {\n const lines = [\"<!-- Selected element -->\"];\n const state: SerializationState = { nodeCount: 0, truncated: false };\n serializeElement(options.element, 0, state, lines);\n const parents = parentContext(options.element);\n\n if (parents.length > 0) {\n lines.push(\"<!-- Parent context: nearest first -->\", ...parents);\n }\n\n const text = normalizedText(options.element.textContent);\n const rect = options.element.getBoundingClientRect();\n const role = options.element.getAttribute(\"role\");\n\n return Object.freeze({\n tagName: options.element.tagName.toLowerCase(),\n selector: createSelector(options.element),\n sanitizedHtml: truncateContext(lines.join(\"\\n\"), options.maxCharacters),\n ...(text.length === 0\n ? {}\n : {\n textPreview:\n text.length <= DOM_COLLECTION_LIMITS.maxTextCharacters\n ? text\n : `${text.slice(0, DOM_COLLECTION_LIMITS.maxTextCharacters)}…`,\n }),\n ...(role === null ? {} : { role }),\n rect: Object.freeze({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n }),\n });\n}\n","function isApplePlatform(platform: string): boolean {\n return /Mac|iPhone|iPad|iPod/i.test(platform);\n}\n\nfunction normalizedKey(key: string): string {\n return key.toLowerCase();\n}\n\nexport function isTextEntryTarget(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) {\n return false;\n }\n\n return (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n target.closest(\"[contenteditable]:not([contenteditable='false'])\") !== null\n );\n}\n\nexport function matchesShortcut(\n event: KeyboardEvent,\n shortcut: string,\n platform: string,\n): boolean {\n const tokens = shortcut\n .split(\"+\")\n .map((token) => token.trim().toLowerCase())\n .filter((token) => token.length > 0);\n const keyToken = tokens.find(\n (token) =>\n token !== \"mod\" &&\n token !== \"meta\" &&\n token !== \"ctrl\" &&\n token !== \"control\" &&\n token !== \"alt\" &&\n token !== \"option\" &&\n token !== \"shift\",\n );\n\n if (keyToken === undefined || normalizedKey(event.key) !== keyToken) {\n return false;\n }\n\n const requiresMod = tokens.includes(\"mod\");\n const requiresMeta =\n tokens.includes(\"meta\") || (requiresMod && isApplePlatform(platform));\n const requiresControl =\n tokens.includes(\"ctrl\") ||\n tokens.includes(\"control\") ||\n (requiresMod && !isApplePlatform(platform));\n const requiresAlt = tokens.includes(\"alt\") || tokens.includes(\"option\");\n const requiresShift = tokens.includes(\"shift\");\n\n return (\n event.metaKey === requiresMeta &&\n event.ctrlKey === requiresControl &&\n event.altKey === requiresAlt &&\n event.shiftKey === requiresShift\n );\n}\n","export interface ElementRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\nfunction toElementRect(rect: DOMRect): ElementRect {\n return Object.freeze({\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n });\n}\n\nfunction unionRects(rects: readonly DOMRect[]): ElementRect | undefined {\n const visibleRects = rects.filter((rect) => rect.width > 0 && rect.height > 0);\n const first = visibleRects[0];\n\n if (first === undefined) {\n return undefined;\n }\n\n let left = first.left;\n let top = first.top;\n let right = first.right;\n let bottom = first.bottom;\n\n for (const rect of visibleRects.slice(1)) {\n left = Math.min(left, rect.left);\n top = Math.min(top, rect.top);\n right = Math.max(right, rect.right);\n bottom = Math.max(bottom, rect.bottom);\n }\n\n return Object.freeze({\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n });\n}\n\nfunction measureElementRect(element: Element, display: string): ElementRect {\n if (display.startsWith(\"inline\")) {\n const lineBoxRect = unionRects(Array.from(element.getClientRects()));\n\n if (lineBoxRect !== undefined) {\n return lineBoxRect;\n }\n }\n\n return toElementRect(element.getBoundingClientRect());\n}\n\nexport function getElementRect(element: Element, view: Window): ElementRect {\n return measureElementRect(element, view.getComputedStyle(element).display);\n}\n\nexport function getVisibleElementRect(\n element: Element,\n view: Window,\n): ElementRect | undefined {\n const style = view.getComputedStyle(element);\n\n if (style.display === \"none\" || style.visibility === \"hidden\") {\n return undefined;\n }\n\n const rect = measureElementRect(element, style.display);\n return rect.width > 0 && rect.height > 0 ? rect : undefined;\n}\n","export const UI_MARKER_ATTRIBUTE = \"data-spotpatch-ui\" as const;\n\nexport const UI_Z_INDEX = Object.freeze({\n highlight: 2_147_483_646,\n controls: 2_147_483_647,\n});\n","import { UI_MARKER_ATTRIBUTE } from \"../ui/ui-constants.js\";\nimport { getVisibleElementRect } from \"./geometry.js\";\n\nfunction isInsideSpotPatchUI(element: Element): boolean {\n if (element.closest(`[${UI_MARKER_ATTRIBUTE}]`) !== null) {\n return true;\n }\n\n const root = element.getRootNode();\n return root instanceof ShadowRoot && root.host.hasAttribute(UI_MARKER_ATTRIBUTE);\n}\n\nfunction hasVisibleArea(element: Element, view: Window): boolean {\n return getVisibleElementRect(element, view) !== undefined;\n}\n\nfunction isDocumentRoot(element: Element): boolean {\n return element.tagName === \"HTML\" || element.tagName === \"BODY\";\n}\n\nexport function pickElementAt(\n document: Document,\n view: Window,\n clientX: number,\n clientY: number,\n): Element | undefined {\n const visibleCandidates = document\n .elementsFromPoint(clientX, clientY)\n .filter(\n (element) => !isInsideSpotPatchUI(element) && hasVisibleArea(element, view),\n );\n\n return (\n visibleCandidates.find((element) => !isDocumentRoot(element)) ??\n visibleCandidates[0]\n );\n}\n\nexport function isSpotPatchUIEventTarget(target: EventTarget | null): boolean {\n return target instanceof Element && isInsideSpotPatchUI(target);\n}\n","import type {\n MatchedStyleRule,\n SpotAnnotation,\n SpotPatchLocale,\n SpotTargetContext,\n} from \"@spotpatch/shared\";\n\nimport {\n redactSensitiveText,\n sanitizeCssText,\n sanitizeUrl,\n} from \"../security/content-sanitizer.js\";\n\ninterface PromptMessages {\n readonly adapter: string;\n readonly boundary: string;\n readonly code: string;\n readonly component: string;\n readonly computedStyles: string;\n readonly confidence: string;\n readonly devicePixelRatio: string;\n readonly element: string;\n readonly file: string;\n readonly modificationConstraint: string;\n readonly modificationRequirements: string;\n readonly origin: string;\n readonly pageEnvironment: string;\n readonly pathname: string;\n readonly reactContext: string;\n readonly reactVersion: string;\n readonly requestedChange: string;\n readonly selectedTargets: (count: number) => string;\n readonly source: string;\n readonly stack: string;\n readonly styles: string;\n readonly supported: string;\n readonly target: (index: number) => string;\n readonly title: string;\n readonly unavailable: string;\n readonly unsupported: string;\n readonly url: string;\n readonly viewport: string;\n readonly warnings: string;\n readonly none: string;\n}\n\nconst PROMPT_MESSAGES = Object.freeze({\n \"en-US\": Object.freeze({\n adapter: \"Adapter\",\n boundary: \"Boundary\",\n code: \"Nearby code\",\n component: \"Component\",\n computedStyles: \"Key computed styles\",\n confidence: \"Confidence\",\n devicePixelRatio: \"Device pixel ratio\",\n element: \"Selected element\",\n file: \"File\",\n modificationConstraint:\n \"Determine the root cause first, then implement every target instruction as one consistent, minimum-scope change. Do not modify unrelated components. If context is insufficient, state exactly what additional information is required.\",\n modificationRequirements: \"Change requirements\",\n origin: \"Origin\",\n pageEnvironment: \"Page environment\",\n pathname: \"Pathname\",\n reactContext: \"React context\",\n reactVersion: \"React\",\n requestedChange: \"Requested change\",\n selectedTargets: (count: number) => `Selected targets (${String(count)})`,\n source: \"Source\",\n stack: \"Stack\",\n styles: \"Relevant styles\",\n supported: \"supported\",\n target: (index: number) => `Target ${String(index)}`,\n title: \"Title\",\n unavailable: \"Unavailable\",\n unsupported: \"unsupported\",\n url: \"URL\",\n viewport: \"Viewport\",\n warnings: \"Collection warnings\",\n none: \"None\",\n }),\n \"zh-CN\": Object.freeze({\n adapter: \"适配器\",\n boundary: \"代码边界\",\n code: \"附近代码\",\n component: \"组件\",\n computedStyles: \"关键计算样式\",\n confidence: \"置信度\",\n devicePixelRatio: \"设备像素比\",\n element: \"选中元素\",\n file: \"文件\",\n modificationConstraint:\n \"请先判断根因,再把每个目标各自的修改说明作为一个原子任务,完成一致且最小范围的修改。不要合并、忽略或扩大目标说明,不要改动无关组件;如果上下文不足,请明确说明需要哪些信息。\",\n modificationRequirements: \"修改要求\",\n origin: \"定位来源\",\n pageEnvironment: \"页面环境\",\n pathname: \"路径\",\n reactContext: \"React 上下文\",\n reactVersion: \"React\",\n requestedChange: \"修改说明\",\n selectedTargets: (count: number) => `已选目标(${String(count)})`,\n source: \"源码定位\",\n stack: \"组件栈\",\n styles: \"相关样式\",\n supported: \"支持\",\n target: (index: number) => `目标 ${String(index)}`,\n title: \"标题\",\n unavailable: \"不可用\",\n unsupported: \"不支持\",\n url: \"URL\",\n viewport: \"视口\",\n warnings: \"采集警告\",\n none: \"无\",\n }),\n} satisfies Readonly<Record<SpotPatchLocale, PromptMessages>>);\n\ninterface TargetDraft {\n codeLines: string[];\n computedEntries: [string, string][];\n dom: string;\n instruction: string;\n matchedRules: MatchedStyleRule[];\n reactStack: string[];\n warnings: string[];\n}\n\ninterface PromptDraft {\n pageTitle: string;\n targets: TargetDraft[];\n}\n\nexport interface PromptComposer {\n readonly compose: (annotation: SpotAnnotation) => string;\n}\n\nexport interface CreatePromptComposerOptions {\n readonly maxCharacters: number;\n}\n\nfunction longestBacktickRun(value: string): number {\n return Math.max(0, ...Array.from(value.matchAll(/`+/gu), (match) => match[0].length));\n}\n\nfunction fenced(language: string, value: string): string {\n const fence = \"`\".repeat(Math.max(3, longestBacktickRun(value) + 1));\n return `${fence}${language}\\n${value}\\n${fence}`;\n}\n\nfunction sourceLocation(target: SpotTargetContext, messages: PromptMessages): string {\n const path = target.code?.relativePath ?? target.source.relativePath;\n const line = target.source.line;\n const column = target.source.column;\n\n if (path === undefined) {\n return messages.unavailable;\n }\n\n return `${redactSensitiveText(path)}${line === undefined ? \"\" : `:${String(line)}`}${column === undefined ? \"\" : `:${String(column)}`}`;\n}\n\nfunction openingTag(sanitizedHtml: string, unavailable: string): string {\n return (\n sanitizedHtml\n .split(\"\\n\")\n .find((line) => /^\\s*<[a-z][^>]*>/iu.test(line))\n ?.trim() ?? unavailable\n );\n}\n\nfunction renderRule(rule: MatchedStyleRule): string {\n const metadata = [\n rule.source === undefined\n ? undefined\n : `/* source: ${sanitizeCssText(rule.source)} */`,\n rule.media === undefined\n ? undefined\n : `/* condition: ${sanitizeCssText(rule.media)} */`,\n ].filter((line): line is string => line !== undefined);\n const body = `${sanitizeCssText(rule.selector)} {\\n ${sanitizeCssText(rule.declarations)}\\n}`;\n return [...metadata, body].join(\"\\n\");\n}\n\nfunction renderStyles(\n target: SpotTargetContext,\n rules: readonly MatchedStyleRule[],\n messages: PromptMessages,\n): string {\n const metadata = [\n target.styles.classNames.length === 0\n ? undefined\n : `/* classes: ${target.styles.classNames.map(sanitizeCssText).join(\" \")} */`,\n target.styles.inlineStyle === undefined\n ? undefined\n : `/* inline: ${sanitizeCssText(target.styles.inlineStyle)} */`,\n ].filter((line): line is string => line !== undefined);\n const blocks = [...metadata, ...rules.map(renderRule)];\n return blocks.length === 0\n ? messages.unavailable\n : fenced(\"css\", blocks.join(\"\\n\\n\"));\n}\n\nfunction renderComputed(\n entries: readonly [string, string][],\n messages: PromptMessages,\n): string {\n return entries.length === 0\n ? messages.unavailable\n : fenced(\n \"css\",\n entries\n .map(\n ([name, value]) => `${sanitizeCssText(name)}: ${sanitizeCssText(value)};`,\n )\n .join(\"\\n\"),\n );\n}\n\nfunction renderTarget(\n target: SpotTargetContext,\n draft: TargetDraft,\n index: number,\n messages: PromptMessages,\n): string {\n const reactLines = [\n `- ${messages.adapter}: ${target.react.supported ? messages.supported : messages.unsupported}`,\n ...(target.react.version === undefined\n ? []\n : [`- ${messages.reactVersion}: ${redactSensitiveText(target.react.version)}`]),\n ...(target.react.componentName === undefined\n ? []\n : [\n `- ${messages.component}: ${redactSensitiveText(target.react.componentName)}`,\n ]),\n ...(draft.reactStack.length === 0\n ? []\n : [\n `- ${messages.stack}: ${draft.reactStack.map(redactSensitiveText).join(\" > \")}`,\n ]),\n ];\n const code =\n target.code === undefined || draft.codeLines.length === 0\n ? messages.unavailable\n : `- ${messages.boundary}: ${target.code.boundary}\\n\\n${fenced(\n target.code.language,\n redactSensitiveText(draft.codeLines.join(\"\\n\")),\n )}`;\n\n return [\n `### ${messages.target(index + 1)}`,\n `#### ${messages.requestedChange}`,\n draft.instruction,\n ...(target.page === undefined\n ? []\n : [\n `#### ${messages.pageEnvironment}`,\n `- ${messages.url}: <${sanitizeUrl(target.page.url, target.page.url)}>\\n- ${messages.pathname}: ${redactSensitiveText(target.page.pathname)}\\n- ${messages.title}: ${redactSensitiveText(target.page.title) || messages.unavailable}`,\n ]),\n `#### ${messages.reactContext}`,\n reactLines.join(\"\\n\"),\n `#### ${messages.source}`,\n `- ${messages.file}: ${sourceLocation(target, messages)}\\n- ${messages.origin}: ${target.source.origin}\\n- ${messages.confidence}: ${target.source.confidence}`,\n `#### ${messages.element}`,\n fenced(\"html\", redactSensitiveText(draft.dom)),\n `#### ${messages.styles}`,\n renderStyles(target, draft.matchedRules, messages),\n `#### ${messages.computedStyles}`,\n renderComputed(draft.computedEntries, messages),\n `#### ${messages.code}`,\n code,\n `#### ${messages.warnings}`,\n draft.warnings.length === 0\n ? `- ${messages.none}`\n : draft.warnings.map((warning) => `- ${redactSensitiveText(warning)}`).join(\"\\n\"),\n ].join(\"\\n\\n\");\n}\n\nfunction renderPrompt(annotation: SpotAnnotation, draft: PromptDraft): string {\n const pageUrl = sanitizeUrl(annotation.page.url, annotation.page.url);\n const messages = PROMPT_MESSAGES[annotation.locale];\n\n return [\n `## ${messages.pageEnvironment}`,\n `- ${messages.url}: <${pageUrl}>\\n- ${messages.pathname}: ${redactSensitiveText(annotation.page.pathname)}\\n- ${messages.title}: ${draft.pageTitle.length === 0 ? messages.unavailable : draft.pageTitle}\\n- ${messages.viewport}: ${String(annotation.page.viewportWidth)} × ${String(annotation.page.viewportHeight)}\\n- ${messages.devicePixelRatio}: ${String(annotation.page.devicePixelRatio)}`,\n `## ${messages.selectedTargets(annotation.targets.length)}`,\n annotation.targets\n .map((target, index) => {\n const targetDraft = draft.targets[index];\n\n if (targetDraft === undefined) {\n throw new RangeError(\"Prompt target draft is missing.\");\n }\n\n return renderTarget(target, targetDraft, index, messages);\n })\n .join(\"\\n\\n\"),\n `## ${messages.modificationRequirements}`,\n messages.modificationConstraint,\n ].join(\"\\n\\n\");\n}\n\nfunction shrinkCode(target: SpotTargetContext, draft: TargetDraft): boolean {\n if (draft.codeLines.length === 0 || target.code === undefined) {\n return false;\n }\n\n if (draft.codeLines.length === 1) {\n const line = draft.codeLines[0] ?? \"\";\n\n if (line.length <= 120) {\n draft.codeLines = [];\n } else {\n draft.codeLines = [`${line.slice(0, 119)}…`];\n }\n\n return true;\n }\n\n const selectedLine = target.source.line ?? target.code.startLine;\n const firstDistance = Math.abs(target.code.startLine - selectedLine);\n const lastLine = target.code.startLine + draft.codeLines.length - 1;\n const lastDistance = Math.abs(lastLine - selectedLine);\n\n if (lastDistance >= firstDistance) {\n draft.codeLines.pop();\n } else {\n draft.codeLines.shift();\n }\n\n return true;\n}\n\nfunction createTargetDraft(target: SpotTargetContext): TargetDraft {\n return {\n instruction: redactSensitiveText(target.instruction.trim()),\n reactStack: [...target.react.componentStack],\n dom: target.element.sanitizedHtml,\n matchedRules: [...target.styles.matchedRules],\n computedEntries: Object.entries(target.styles.computed),\n codeLines: target.code?.excerpt.split(/\\r?\\n/u) ?? [],\n warnings: Array.from(new Set([...target.styles.warnings, ...target.warnings])),\n };\n}\n\nfunction createDraft(annotation: SpotAnnotation): PromptDraft {\n return {\n pageTitle: redactSensitiveText(annotation.page.title),\n targets: annotation.targets.map(createTargetDraft),\n };\n}\n\nfunction shrinkTargetsFairly(\n annotation: SpotAnnotation,\n draft: PromptDraft,\n cursor: number,\n): number | undefined {\n const messages = PROMPT_MESSAGES[annotation.locale];\n const operations: readonly ((\n target: SpotTargetContext,\n value: TargetDraft,\n ) => boolean)[] = [\n (_target, value) => value.computedEntries.pop() !== undefined,\n (_target, value) => value.reactStack.pop() !== undefined,\n (_target, value) => {\n const selectedOpeningTag = openingTag(value.dom, messages.unavailable);\n\n if (value.dom === selectedOpeningTag) {\n return false;\n }\n\n value.dom = selectedOpeningTag;\n return true;\n },\n (_target, value) => value.matchedRules.shift() !== undefined,\n shrinkCode,\n (_target, value) => value.warnings.pop() !== undefined,\n ];\n\n for (const operation of operations) {\n for (let offset = 0; offset < annotation.targets.length; offset += 1) {\n const index = (cursor + offset) % annotation.targets.length;\n const target = annotation.targets[index];\n const targetDraft = draft.targets[index];\n\n if (\n target !== undefined &&\n targetDraft !== undefined &&\n operation(target, targetDraft)\n ) {\n return (index + 1) % annotation.targets.length;\n }\n }\n }\n\n return undefined;\n}\n\nfunction renderCompactPrompt(annotation: SpotAnnotation, draft: PromptDraft): string {\n const messages = PROMPT_MESSAGES[annotation.locale];\n const targets = annotation.targets.map((target, index) => {\n const targetDraft = draft.targets[index];\n const component = target.react.componentName;\n return [\n `### ${messages.target(index + 1)}`,\n `- ${messages.requestedChange}: ${targetDraft?.instruction ?? redactSensitiveText(target.instruction)}`,\n `- ${messages.file}: ${sourceLocation(target, messages)}`,\n ...(component === undefined\n ? []\n : [`- ${messages.component}: ${redactSensitiveText(component)}`]),\n `- ${messages.element}: ${redactSensitiveText(openingTag(targetDraft?.dom ?? target.element.sanitizedHtml, messages.unavailable))}`,\n ].join(\"\\n\");\n });\n\n return [\n `## ${messages.selectedTargets(annotation.targets.length)}`,\n targets.join(\"\\n\\n\"),\n `## ${messages.modificationRequirements}`,\n messages.modificationConstraint,\n ].join(\"\\n\\n\");\n}\n\nfunction composeBounded(annotation: SpotAnnotation, maxCharacters: number): string {\n const draft = createDraft(annotation);\n let prompt = renderPrompt(annotation, draft);\n let cursor = 0;\n\n while (prompt.length > maxCharacters) {\n const nextCursor = shrinkTargetsFairly(annotation, draft, cursor);\n\n if (nextCursor === undefined) {\n if (draft.pageTitle.length > 0) {\n draft.pageTitle = \"\";\n } else {\n break;\n }\n } else {\n cursor = nextCursor;\n }\n\n prompt = renderPrompt(annotation, draft);\n }\n\n if (prompt.length <= maxCharacters) {\n return prompt;\n }\n\n const compact = renderCompactPrompt(annotation, draft);\n\n if (compact.length > maxCharacters) {\n throw new RangeError(\n \"Prompt budget cannot preserve every target instruction and source location.\",\n );\n }\n\n return compact;\n}\n\nexport function createPromptComposer(\n options: CreatePromptComposerOptions,\n): PromptComposer {\n if (!Number.isSafeInteger(options.maxCharacters) || options.maxCharacters <= 0) {\n throw new RangeError(\"Prompt character budget must be a positive integer.\");\n }\n\n return Object.freeze({\n compose(annotation: SpotAnnotation): string {\n return composeBounded(annotation, options.maxCharacters);\n },\n });\n}\n","export type RuntimeStatus = \"idle\" | \"inspecting\" | \"selected\" | \"previewing\";\n\nexport interface RuntimeState {\n readonly status: RuntimeStatus;\n}\n\nexport type RuntimeEvent =\n | Readonly<{ type: \"ACTIVATE\" }>\n | Readonly<{ type: \"RESTORE\" }>\n | Readonly<{ type: \"HOVER\" }>\n | Readonly<{ type: \"SELECT\" }>\n | Readonly<{ type: \"CANCEL\" }>\n | Readonly<{ type: \"RESELECT\" }>\n | Readonly<{ type: \"CLOSE\" }>\n | Readonly<{ type: \"PREVIEW\" }>\n | Readonly<{ type: \"OPEN_EDITOR\" }>\n | Readonly<{ type: \"COPY_SUCCESS\" }>\n | Readonly<{ type: \"COPY_FAILURE\" }>\n | Readonly<{ type: \"BACK\" }>;\n\nconst STATES = Object.freeze({\n idle: Object.freeze({ status: \"idle\" }),\n inspecting: Object.freeze({ status: \"inspecting\" }),\n selected: Object.freeze({ status: \"selected\" }),\n previewing: Object.freeze({ status: \"previewing\" }),\n} satisfies Record<RuntimeStatus, RuntimeState>);\n\nexport const INITIAL_RUNTIME_STATE: RuntimeState = STATES.idle;\n\nfunction reduceIdle(event: RuntimeEvent): RuntimeState {\n if (event.type === \"ACTIVATE\") {\n return STATES.inspecting;\n }\n\n return event.type === \"RESTORE\" ? STATES.selected : STATES.idle;\n}\n\nfunction reduceInspecting(event: RuntimeEvent): RuntimeState {\n switch (event.type) {\n case \"HOVER\":\n return STATES.inspecting;\n case \"SELECT\":\n return STATES.selected;\n case \"CANCEL\":\n return STATES.idle;\n default:\n return STATES.inspecting;\n }\n}\n\nfunction reduceSelected(event: RuntimeEvent): RuntimeState {\n switch (event.type) {\n case \"RESELECT\":\n return STATES.inspecting;\n case \"CLOSE\":\n return STATES.idle;\n case \"PREVIEW\":\n return STATES.previewing;\n case \"OPEN_EDITOR\":\n return STATES.selected;\n default:\n return STATES.selected;\n }\n}\n\nfunction reducePreviewing(event: RuntimeEvent): RuntimeState {\n switch (event.type) {\n case \"COPY_SUCCESS\":\n case \"BACK\":\n return STATES.selected;\n case \"COPY_FAILURE\":\n return STATES.previewing;\n default:\n return STATES.previewing;\n }\n}\n\nexport function reduceRuntimeState(\n state: RuntimeState,\n event: RuntimeEvent,\n): RuntimeState {\n switch (state.status) {\n case \"idle\":\n return reduceIdle(event);\n case \"inspecting\":\n return reduceInspecting(event);\n case \"selected\":\n return reduceSelected(event);\n case \"previewing\":\n return reducePreviewing(event);\n }\n}\n","import type {\n CodeContext,\n ElementContext,\n PageContext,\n ReactContext,\n SourceRef,\n SpotTargetContext,\n StyleContext,\n} from \"@spotpatch/shared\";\n\nconst STORAGE_PREFIX = \"spotpatch:selection:\";\nconst SNAPSHOT_VERSION = 1;\nconst MAX_SNAPSHOT_CHARACTERS = 1_000_000;\n\nexport interface SelectionSnapshotTarget extends Omit<\n SpotTargetContext,\n \"page\" | \"warnings\"\n> {\n readonly id: string;\n readonly page: PageContext;\n}\n\nexport interface SelectionSnapshot {\n readonly activeTargetId?: string;\n readonly open: boolean;\n readonly sequence: number;\n readonly targets: readonly SelectionSnapshotTarget[];\n}\n\nexport interface SelectionSession {\n readonly clear: () => void;\n readonly load: () => SelectionSnapshot | undefined;\n readonly save: (snapshot: SelectionSnapshot) => void;\n}\n\ntype UnknownRecord = Readonly<Record<string, unknown>>;\n\nfunction record(value: unknown): UnknownRecord | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as UnknownRecord)\n : undefined;\n}\n\nfunction text(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\nfunction optionalText(value: unknown): value is string | undefined {\n return value === undefined || text(value);\n}\n\nfunction strings(value: unknown): value is string[] {\n return Array.isArray(value) && value.length <= 256 && value.every(text);\n}\n\nfunction finiteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction optionalNumber(value: unknown): value is number | undefined {\n return value === undefined || finiteNumber(value);\n}\n\nfunction source(value: unknown): value is SourceRef {\n const item = record(value);\n return (\n item !== undefined &&\n text(item.origin) &&\n text(item.confidence) &&\n optionalText(item.fileId) &&\n optionalText(item.relativePath) &&\n optionalNumber(item.line) &&\n optionalNumber(item.column)\n );\n}\n\nfunction react(value: unknown): value is ReactContext {\n const item = record(value);\n return (\n item !== undefined &&\n typeof item.supported === \"boolean\" &&\n optionalText(item.version) &&\n optionalText(item.componentName) &&\n strings(item.componentStack) &&\n (item.source === undefined || source(item.source))\n );\n}\n\nfunction page(value: unknown): value is PageContext {\n const item = record(value);\n return (\n item !== undefined &&\n text(item.url) &&\n text(item.pathname) &&\n text(item.title) &&\n finiteNumber(item.viewportWidth) &&\n finiteNumber(item.viewportHeight) &&\n finiteNumber(item.devicePixelRatio)\n );\n}\n\nfunction element(value: unknown): value is ElementContext {\n const item = record(value);\n const rect = record(item?.rect);\n return (\n item !== undefined &&\n text(item.tagName) &&\n text(item.selector) &&\n text(item.sanitizedHtml) &&\n optionalText(item.textPreview) &&\n optionalText(item.role) &&\n rect !== undefined &&\n finiteNumber(rect.x) &&\n finiteNumber(rect.y) &&\n finiteNumber(rect.width) &&\n finiteNumber(rect.height)\n );\n}\n\nfunction styles(value: unknown): value is StyleContext {\n const item = record(value);\n const computed = record(item?.computed);\n return (\n item !== undefined &&\n strings(item.classNames) &&\n optionalText(item.inlineStyle) &&\n Array.isArray(item.matchedRules) &&\n item.matchedRules.length <= 256 &&\n item.matchedRules.every((value) => {\n const rule = record(value);\n return (\n rule !== undefined &&\n text(rule.selector) &&\n text(rule.declarations) &&\n optionalText(rule.source) &&\n optionalText(rule.media)\n );\n }) &&\n computed !== undefined &&\n Object.values(computed).every(text) &&\n strings(item.warnings)\n );\n}\n\nfunction code(value: unknown): value is CodeContext {\n const item = record(value);\n return (\n item !== undefined &&\n text(item.relativePath) &&\n text(item.language) &&\n finiteNumber(item.startLine) &&\n finiteNumber(item.endLine) &&\n text(item.excerpt) &&\n text(item.boundary)\n );\n}\n\nfunction target(value: unknown): value is SelectionSnapshotTarget {\n const item = record(value);\n return (\n item !== undefined &&\n text(item.id) &&\n text(item.instruction) &&\n page(item.page) &&\n source(item.source) &&\n react(item.react) &&\n element(item.element) &&\n styles(item.styles) &&\n (item.code === undefined || code(item.code))\n );\n}\n\nfunction parseSnapshot(\n value: unknown,\n maximumTargets: number,\n): SelectionSnapshot | undefined {\n const item = record(value);\n if (\n item?.version !== SNAPSHOT_VERSION ||\n typeof item.open !== \"boolean\" ||\n !Number.isSafeInteger(item.sequence) ||\n Number(item.sequence) < 0 ||\n (item.activeTargetId !== undefined && typeof item.activeTargetId !== \"string\") ||\n !Array.isArray(item.targets) ||\n item.targets.length === 0 ||\n item.targets.length > maximumTargets ||\n !item.targets.every(target)\n ) {\n return undefined;\n }\n\n const targets = item.targets;\n const ids = targets.map(({ id }) => id);\n if (\n new Set(ids).size !== ids.length ||\n (item.activeTargetId !== undefined && !ids.includes(item.activeTargetId))\n ) {\n return undefined;\n }\n\n return {\n ...(item.activeTargetId === undefined\n ? {}\n : { activeTargetId: item.activeTargetId }),\n open: item.open,\n sequence: Number(item.sequence),\n targets,\n };\n}\n\nexport function createSelectionSession(\n window: Window,\n sessionId: string,\n maximumTargets: number,\n): SelectionSession {\n const key = `${STORAGE_PREFIX}${sessionId}`;\n let storage: Storage | undefined;\n try {\n storage = window.sessionStorage;\n } catch {\n storage = undefined;\n }\n\n return Object.freeze({\n clear(): void {\n try {\n storage?.removeItem(key);\n } catch {\n // Storage can be unavailable or full without disabling the picker.\n }\n },\n load(): SelectionSnapshot | undefined {\n let serialized: string | null;\n try {\n serialized = storage?.getItem(key) ?? null;\n } catch {\n return undefined;\n }\n\n if (serialized === null || serialized.length > MAX_SNAPSHOT_CHARACTERS) {\n return undefined;\n }\n\n try {\n return parseSnapshot(JSON.parse(serialized) as unknown, maximumTargets);\n } catch {\n return undefined;\n }\n },\n save(snapshot: SelectionSnapshot): void {\n try {\n storage?.setItem(\n key,\n JSON.stringify({ version: SNAPSHOT_VERSION, ...snapshot }),\n );\n } catch {\n // Persistence is best-effort; the active in-memory selection stays valid.\n }\n },\n });\n}\n","import type { ReactAdapter } from \"@spotpatch/react-adapter\";\nimport {\n parseSourceMarker,\n SOURCE_MARKER_ATTRIBUTE,\n type ReactContext,\n type SourceMarker,\n type SourceRef,\n} from \"@spotpatch/shared\";\n\nconst EMPTY_REACT_CONTEXT = Object.freeze({\n supported: false,\n componentStack: Object.freeze([]),\n}) satisfies ReactContext;\n\nexport interface ElementSourceResolution {\n readonly react: ReactContext;\n readonly source: SourceRef;\n}\n\nexport interface SourceResolver {\n readonly dispose: () => void;\n readonly resolve: (element: Element) => ElementSourceResolution;\n}\n\nexport interface CreateSourceResolverOptions {\n readonly adapter: ReactAdapter;\n readonly onAdapterError?: () => void;\n}\n\nfunction directMarker(element: Element): SourceMarker | undefined {\n return parseSourceMarker(element.getAttribute(SOURCE_MARKER_ATTRIBUTE));\n}\n\nfunction ancestorMarker(element: Element): SourceMarker | undefined {\n let ancestor = element.parentElement;\n\n while (ancestor !== null) {\n const marker = directMarker(ancestor);\n\n if (marker !== undefined) {\n return marker;\n }\n\n ancestor = ancestor.parentElement;\n }\n\n return undefined;\n}\n\nfunction markerSource(\n marker: SourceMarker,\n origin: \"jsx-host\" | \"dom-ancestor\",\n confidence: \"exact\" | \"approximate\",\n): SourceRef {\n return Object.freeze({\n fileId: marker.fileId,\n line: marker.line,\n column: marker.column,\n origin,\n confidence,\n });\n}\n\nfunction unknownSource(): SourceRef {\n return Object.freeze({ origin: \"none\", confidence: \"unknown\" });\n}\n\nexport function sourceRefToMarker(source: SourceRef): SourceMarker | undefined {\n return source.fileId === undefined ||\n source.line === undefined ||\n source.column === undefined\n ? undefined\n : Object.freeze({\n fileId: source.fileId,\n line: source.line,\n column: source.column,\n });\n}\n\nexport function createSourceResolver(\n options: CreateSourceResolverOptions,\n): SourceResolver {\n let adapterEnabled = true;\n\n function inspectReact(element: Element): ReactContext {\n if (!adapterEnabled) {\n return EMPTY_REACT_CONTEXT;\n }\n\n try {\n return options.adapter.inspect(element);\n } catch {\n adapterEnabled = false;\n options.onAdapterError?.();\n return EMPTY_REACT_CONTEXT;\n }\n }\n\n return Object.freeze({\n resolve(element: Element): ElementSourceResolution {\n const marker = directMarker(element);\n const react = inspectReact(element);\n\n if (marker !== undefined) {\n return Object.freeze({\n react,\n source: markerSource(marker, \"jsx-host\", \"exact\"),\n });\n }\n\n if (react.source !== undefined) {\n return Object.freeze({ react, source: react.source });\n }\n\n const nearestAncestor = ancestorMarker(element);\n\n if (nearestAncestor !== undefined) {\n return Object.freeze({\n react,\n source: markerSource(nearestAncestor, \"dom-ancestor\", \"approximate\"),\n });\n }\n\n return Object.freeze({ react, source: unknownSource() });\n },\n\n dispose(): void {\n adapterEnabled = false;\n options.adapter.dispose();\n },\n });\n}\n","import type {\n AgentCapabilitySnapshot,\n AgentJobResult,\n AgentJobSnapshot,\n AgentWorkspaceHealthSnapshot,\n ErrorCode,\n RuntimeAiConfig,\n SpotPatchLocale,\n SpotPatchLocalePreference,\n} from \"@spotpatch/shared\";\nimport {\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n MAX_TARGET_INSTRUCTION_CHARACTERS,\n SPOTPATCH_REPOSITORY_URL,\n} from \"@spotpatch/shared\";\n\nimport type { ElementRect } from \"../picker/geometry.js\";\nimport type { RuntimeStatus } from \"../state/runtime-state.js\";\nimport {\n AGENT_PANEL_STYLES,\n createAgentPanel,\n type AgentActivityItem,\n type AgentSelectionValue,\n} from \"./agent-panel.js\";\nimport { createBrandMark } from \"./brand-mark.js\";\nimport {\n getDataFlowExtension,\n type DataFlowPanel,\n type DataFlowViewState,\n} from \"./data-flow-panel-contract.js\";\nimport { calculateDialogPlacement } from \"./dialog-placement.js\";\nimport { createButton, createMarkedElement } from \"./dom.js\";\nimport {\n getExternalHandoffExtension,\n type ExternalHandoffPanel,\n} from \"./external-handoff-contract.js\";\nimport {\n createUiLocalizer,\n type UiLocalizer,\n type UiMessages,\n} from \"./localization.js\";\nimport { UI_MARKER_ATTRIBUTE, UI_Z_INDEX } from \"./ui-constants.js\";\n\nexport interface SelectionTargetView {\n readonly active: boolean;\n readonly canOpenEditor: boolean;\n readonly id: string;\n readonly instruction: string;\n readonly label: string;\n readonly source: string;\n readonly status: \"loading\" | \"ready\" | \"warning\";\n}\n\nexport interface SelectionHighlightView {\n readonly active: boolean;\n readonly id: string;\n readonly label: string;\n readonly rect: ElementRect;\n}\n\nexport interface RuntimeView {\n readonly addTargetButton: HTMLButtonElement;\n readonly agentApplyButton: HTMLButtonElement;\n readonly agentCancelButton: HTMLButtonElement;\n readonly agentConsentCheckbox: HTMLInputElement;\n readonly agentModelSelect: HTMLSelectElement;\n readonly agentModeSelect: HTMLSelectElement;\n readonly agentProviderSelect: HTMLSelectElement;\n readonly agentResetButton: HTMLButtonElement;\n readonly agentRevertButton: HTMLButtonElement;\n readonly agentRunButton: HTMLButtonElement;\n readonly agentTestButton: HTMLButtonElement;\n readonly agentWorkspaceConsentCheckbox: HTMLInputElement;\n readonly backButton: HTMLButtonElement;\n readonly closeButton: HTMLButtonElement;\n readonly copyButton: HTMLButtonElement;\n readonly dataFlowRefreshButton: HTMLButtonElement;\n readonly externalHandoffPanel?: ExternalHandoffPanel;\n readonly host: HTMLElement;\n readonly openEditorButton: HTMLButtonElement;\n readonly repositoryLink: HTMLAnchorElement;\n readonly previewButton: HTMLButtonElement;\n readonly reselectButton: HTMLButtonElement;\n readonly triggerButton: HTMLButtonElement;\n readonly targetList: HTMLElement;\n readonly announce: (message: string) => void;\n readonly dispose: () => void;\n readonly focusTargetInstruction: (targetId?: string) => void;\n readonly focusPrompt: () => void;\n readonly hideHighlight: () => void;\n readonly hideSelectionHighlights: () => void;\n readonly hideSelection: () => void;\n readonly hideSelectionTemporarily: () => void;\n readonly agentConsentGranted: () => boolean;\n readonly agentWorkspaceConsentGranted: () => boolean;\n readonly readAgentSelection: () => AgentSelectionValue | undefined;\n readonly locale: () => SpotPatchLocale;\n readonly messages: () => UiMessages;\n readonly subscribeLocale: (listener: () => void) => () => void;\n readonly renderAgentCapability: (\n state: \"idle\" | \"probing\" | \"ready\" | \"error\",\n message: string,\n capability?: AgentCapabilitySnapshot,\n errorCode?: ErrorCode,\n ) => void;\n readonly renderAgentJob: (\n snapshot: AgentJobSnapshot,\n result: AgentJobResult | undefined,\n activities: readonly AgentActivityItem[],\n errorCode?: ErrorCode,\n ) => void;\n readonly renderAgentWorkspaceHealth: (\n state: \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\",\n snapshot?: AgentWorkspaceHealthSnapshot,\n errorCode?: ErrorCode,\n ) => void;\n readonly renderStatus: (status: RuntimeStatus) => void;\n readonly renderEditorStatus: (\n state: \"idle\" | \"opening\" | \"success\" | \"error\",\n ) => void;\n readonly renderDataFlow: (state: DataFlowViewState) => void;\n readonly resetAgentJob: () => void;\n readonly setAgentEditingEnabled: (enabled: boolean) => void;\n readonly setAgentProviderConsent: (granted: boolean) => void;\n readonly setPreviewEnabled: (enabled: boolean) => void;\n readonly updateTargetInstruction: (targetId: string, instruction: string) => void;\n readonly renderTargets: (\n targets: readonly SelectionTargetView[],\n maximum: number,\n ) => void;\n readonly showHighlight: (rect: ElementRect, label: string) => void;\n readonly showSelectionHighlights: (\n targets: readonly SelectionHighlightView[],\n ) => void;\n readonly showPreview: (prompt: string) => void;\n readonly showSelection: (\n summary: string,\n canOpenEditor: boolean,\n canPreview: boolean,\n ) => void;\n readonly updateSelection: (\n summary: string,\n canOpenEditor: boolean,\n canPreview: boolean,\n ) => void;\n}\n\nconst DIALOG_MAX_WIDTH = 460;\nconst DIALOG_MAX_HEIGHT = 620;\nconst DIALOG_FALLBACK_HEIGHT = Object.freeze({\n previewing: 560,\n selected: DIALOG_MAX_HEIGHT,\n}) satisfies Readonly<Record<\"previewing\" | \"selected\", number>>;\n\nfunction resolveStyleNonce(document: Document): string | undefined {\n const nonces = new Set(\n [...document.querySelectorAll<HTMLScriptElement>(\"script[nonce]\")]\n .map((script) => script.nonce?.trim() ?? \"\")\n .filter(Boolean),\n );\n\n if (nonces.size !== 1) {\n return undefined;\n }\n\n return nonces.values().next().value;\n}\n\nfunction createStyles(document: Document): HTMLStyleElement {\n const style = document.createElement(\"style\");\n style.textContent = `\n :host {\n all: initial;\n --spotpatch-bg: #0e0e12;\n --spotpatch-bg-raised: #17171c;\n --spotpatch-bg-active: #1c1c22;\n --spotpatch-bg-input: #0b0b0f;\n --spotpatch-border: #2a2a32;\n --spotpatch-border-subtle: #232329;\n --spotpatch-text: #f2f2f5;\n --spotpatch-text-secondary: #96969f;\n --spotpatch-text-muted: #686872;\n --spotpatch-accent: #8b7bff;\n --spotpatch-accent-strong: #6a5ce8;\n --spotpatch-accent-cyan: #52a8ff;\n --spotpatch-danger: #fb7185;\n --spotpatch-success: #34d399;\n --spotpatch-warning: #f59e0b;\n --spotpatch-text-on-accent: #0b0b12;\n --spotpatch-radius-panel: 16px;\n --spotpatch-radius-card: 10px;\n --spotpatch-shadow-panel: 0 30px 60px -20px rgb(0 0 0 / 70%);\n color-scheme: dark;\n color: var(--spotpatch-text);\n font-family: Inter, \"SF Pro Display\", \"SF Pro Text\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n }\n [hidden] { display: none !important; }\n button, textarea, select { font: inherit; }\n button { -webkit-tap-highlight-color: transparent; }\n .spotpatch-trigger {\n position: fixed;\n right: 24px;\n bottom: 24px;\n z-index: ${String(UI_Z_INDEX.controls)};\n display: inline-flex;\n align-items: center;\n gap: 10px;\n min-height: 44px;\n border: 1px solid rgb(255 255 255 / 12%);\n border-radius: 999px;\n padding: 10px 17px;\n color: #f8fafc;\n background: #171b23;\n box-shadow: 0 12px 34px rgb(0 0 0 / 25%), inset 0 1px rgb(255 255 255 / 5%);\n cursor: pointer;\n font-size: 14px;\n font-weight: 650;\n transition: border-color 160ms ease, box-shadow 160ms ease, transform 160ms ease;\n }\n .spotpatch-trigger::before {\n width: 9px;\n height: 9px;\n border-radius: 999px;\n background: var(--spotpatch-accent);\n box-shadow: 0 0 0 4px rgb(99 102 241 / 10%);\n content: \"\";\n }\n .spotpatch-trigger:hover { transform: translateY(-1px); border-color: rgb(129 140 248 / 52%); }\n .spotpatch-trigger[aria-pressed=\"true\"] {\n border-color: rgb(124 58 237 / 55%);\n background: #24203b;\n box-shadow: 0 14px 42px rgb(76 29 149 / 24%), inset 0 1px rgb(255 255 255 / 10%);\n }\n .spotpatch-highlight {\n position: fixed;\n top: 0;\n left: 0;\n z-index: ${String(UI_Z_INDEX.highlight)};\n box-sizing: border-box;\n border: 2px solid var(--spotpatch-accent);\n border-radius: 6px;\n background: rgb(109 93 246 / 8%);\n box-shadow: inset 0 0 0 1px rgb(255 255 255 / 22%), 0 0 0 1px rgb(109 93 246 / 10%);\n pointer-events: none;\n }\n .spotpatch-highlight-label {\n position: absolute;\n top: -30px;\n left: -2px;\n max-width: min(380px, 80vw);\n overflow: hidden;\n border: 1px solid rgb(255 255 255 / 14%);\n border-radius: 8px 8px 8px 3px;\n padding: 6px 10px;\n color: #fff;\n background: #5546dc;\n box-shadow: 0 8px 20px rgb(49 46 129 / 22%);\n font: 650 12px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-selection-highlights {\n position: fixed;\n inset: 0;\n z-index: ${String(UI_Z_INDEX.highlight)};\n pointer-events: none;\n }\n .spotpatch-selection-highlight {\n position: fixed;\n top: 0;\n left: 0;\n box-sizing: border-box;\n border: 2px solid var(--spotpatch-accent-cyan);\n border-radius: 6px;\n background: rgb(8 182 214 / 5%);\n box-shadow: inset 0 0 0 1px rgb(255 255 255 / 16%);\n }\n .spotpatch-selection-highlight[data-active=\"true\"] {\n border-color: #7768f7;\n background: rgb(109 93 246 / 8%);\n box-shadow: inset 0 0 0 1px rgb(255 255 255 / 20%);\n }\n .spotpatch-selection-highlight > span {\n position: absolute;\n top: -24px;\n left: -2px;\n max-width: min(300px, 70vw);\n overflow: hidden;\n border-radius: 7px 7px 7px 2px;\n padding: 4px 8px;\n color: #ecfeff;\n background: rgb(14 67 82 / 96%);\n font: 650 11px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-selection-highlight[data-active=\"true\"] > span {\n background: #5546dc;\n }\n .spotpatch-dialog {\n --spotpatch-anchor-x: 50%;\n --spotpatch-anchor-y: 50%;\n position: fixed;\n top: 16px;\n left: 16px;\n z-index: ${String(UI_Z_INDEX.controls)};\n box-sizing: border-box;\n width: min(${String(DIALOG_MAX_WIDTH)}px, calc(100vw - 32px));\n color: #edf0f7;\n outline: none;\n filter: drop-shadow(var(--spotpatch-shadow-panel));\n }\n .spotpatch-anchor {\n position: absolute;\n z-index: 0;\n width: 14px;\n height: 14px;\n border: 1px solid rgb(255 255 255 / 12%);\n background: var(--spotpatch-bg);\n transform: rotate(45deg);\n }\n .spotpatch-dialog[data-placement=\"above\"] .spotpatch-anchor {\n bottom: -6px;\n left: calc(var(--spotpatch-anchor-x) - 7px);\n border-top: 0;\n border-left: 0;\n }\n .spotpatch-dialog[data-placement=\"below\"] .spotpatch-anchor {\n top: -6px;\n left: calc(var(--spotpatch-anchor-x) - 7px);\n border-right: 0;\n border-bottom: 0;\n }\n .spotpatch-dialog[data-placement=\"left\"] .spotpatch-anchor {\n top: calc(var(--spotpatch-anchor-y) - 7px);\n right: -6px;\n border-bottom: 0;\n border-left: 0;\n }\n .spotpatch-dialog[data-placement=\"right\"] .spotpatch-anchor {\n top: calc(var(--spotpatch-anchor-y) - 7px);\n left: -6px;\n border-top: 0;\n border-right: 0;\n }\n .spotpatch-dialog[data-placement=\"center\"] .spotpatch-anchor,\n .spotpatch-dialog[data-placement=\"viewport\"] .spotpatch-anchor { display: none; }\n .spotpatch-shell {\n position: relative;\n z-index: 1;\n display: flex;\n box-sizing: border-box;\n max-height: min(${String(DIALOG_MAX_HEIGHT)}px, calc(100vh - 32px));\n overflow: hidden;\n flex-direction: column;\n border: 1px solid var(--spotpatch-border);\n border-radius: var(--spotpatch-radius-panel);\n background: var(--spotpatch-bg);\n box-shadow: inset 0 1px rgb(255 255 255 / 5%), 0 0 60px -32px rgb(139 123 255 / 20%);\n }\n .spotpatch-shell::before {\n position: absolute;\n z-index: 2;\n top: 0;\n right: 20%;\n left: 20%;\n height: 1px;\n background: linear-gradient(90deg, transparent, var(--spotpatch-accent), var(--spotpatch-accent-cyan), transparent);\n content: \"\";\n opacity: .65;\n pointer-events: none;\n }\n .spotpatch-header {\n position: relative;\n padding: 0 18px 14px;\n }\n .spotpatch-brand-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin: 0 -18px 18px;\n padding: 14px 18px 13px;\n border-bottom: 1px solid var(--spotpatch-border-subtle);\n }\n .spotpatch-brand {\n display: inline-flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n color: #f8fafc;\n }\n .spotpatch-brand-mark {\n width: 30px;\n height: 30px;\n flex: none;\n filter: drop-shadow(0 6px 12px rgb(76 29 149 / 22%));\n }\n .spotpatch-brand-copy { display: grid; min-width: 0; gap: 1px; }\n .spotpatch-brand-name {\n color: #fff;\n font-size: 13.5px;\n font-weight: 680;\n letter-spacing: -.01em;\n }\n .spotpatch-brand-context {\n color: #8e98aa;\n font-size: 10.5px;\n font-weight: 560;\n letter-spacing: .02em;\n }\n .spotpatch-header-controls {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex: none;\n }\n .spotpatch-repository,\n .spotpatch-locale,\n .spotpatch-close {\n height: 27px;\n border: 1px solid rgb(255 255 255 / 11%);\n border-radius: 7px;\n background: transparent;\n }\n .spotpatch-repository {\n display: inline-flex;\n align-items: center;\n padding: 0 9px;\n color: var(--spotpatch-text-secondary);\n font-size: 11px;\n font-weight: 680;\n text-decoration: none;\n }\n .spotpatch-locale {\n min-width: 34px;\n padding: 0 8px;\n color: #c5cad5;\n cursor: pointer;\n font-size: 12px;\n font-weight: 650;\n }\n .spotpatch-close {\n display: inline-grid;\n width: 27px;\n padding: 0;\n place-items: center;\n color: #9da5b4;\n cursor: pointer;\n font-size: 15px;\n line-height: 1;\n transition: border-color 150ms ease, color 150ms ease, background 150ms ease;\n }\n .spotpatch-close:hover,\n .spotpatch-locale:hover,\n .spotpatch-repository:hover { border-color: rgb(129 112 247 / 45%); color: #fff; background: rgb(109 93 246 / 10%); }\n .spotpatch-title {\n margin: 0;\n color: #fff;\n font-size: 18px;\n font-weight: 680;\n letter-spacing: -.015em;\n }\n .spotpatch-subtitle {\n max-width: 390px;\n margin: 4px 0 0;\n color: var(--spotpatch-text-secondary);\n font-size: 12.5px;\n line-height: 1.5;\n }\n .spotpatch-target-row {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n margin-top: 14px;\n }\n .spotpatch-target-label {\n min-width: 0;\n overflow: hidden;\n border: 1px solid rgb(129 112 247 / 24%);\n border-radius: 999px;\n padding: 4px 10px;\n color: #cdd2ff;\n background: rgb(109 93 246 / 10%);\n font: 600 11px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-context-state {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex: none;\n color: #a5adba;\n font-size: 11px;\n white-space: nowrap;\n }\n .spotpatch-context-state::before {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: #f59e0b;\n content: \"\";\n }\n .spotpatch-context-state[data-state=\"ready\"],\n .spotpatch-editor-feedback[data-state=\"success\"] { color: #9fe3c4; }\n .spotpatch-context-state[data-state=\"ready\"]::before,\n .spotpatch-editor-feedback[data-state=\"success\"]::before { background: #34d399; }\n .spotpatch-context-state[data-state=\"warning\"],\n .spotpatch-editor-feedback[data-state=\"error\"] { color: #fecaca; }\n .spotpatch-context-state[data-state=\"warning\"]::before,\n .spotpatch-editor-feedback[data-state=\"error\"]::before { background: #fb7185; }\n .spotpatch-body {\n min-height: 0;\n overflow: auto;\n padding: 0 18px 14px;\n scrollbar-color: rgb(100 116 139 / 50%) transparent;\n scrollbar-width: thin;\n }\n .spotpatch-targets {\n margin: 0;\n }\n .spotpatch-targets-heading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n margin-bottom: 8px;\n color: var(--spotpatch-text-secondary);\n font-size: 11px;\n font-weight: 650;\n letter-spacing: .04em;\n text-transform: uppercase;\n }\n .spotpatch-targets-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n letter-spacing: 0;\n text-transform: none;\n }\n .spotpatch-target-complete { color: var(--spotpatch-text-muted); font-size: 11px; font-weight: 560; }\n .spotpatch-target-budget {\n color: var(--spotpatch-text-muted);\n font: 550 10.5px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n .spotpatch-target-budget[data-state=\"ready\"] { display: none; }\n .spotpatch-target-budget[data-state=\"over\"] { color: #fda4af; }\n .spotpatch-target-count {\n margin-left: auto;\n border-radius: 999px;\n padding: 3px 8px;\n color: var(--spotpatch-text-muted);\n font: 600 10.5px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n .spotpatch-target-progress {\n height: 3px;\n margin-bottom: 13px;\n overflow: hidden;\n border-radius: 999px;\n background: var(--spotpatch-border-subtle);\n }\n .spotpatch-target-progress-fill {\n width: 0;\n height: 100%;\n border-radius: inherit;\n background: linear-gradient(90deg, var(--spotpatch-accent), var(--spotpatch-accent-cyan));\n transition: width 180ms ease;\n }\n .spotpatch-target-list {\n display: grid;\n gap: 8px;\n max-height: min(340px, 48vh);\n overflow: auto;\n padding-right: 2px;\n }\n .spotpatch-target-item {\n overflow: hidden;\n border: 1px solid var(--spotpatch-border-subtle);\n border-radius: var(--spotpatch-radius-card);\n background: var(--spotpatch-bg-raised);\n transition: border-color 150ms ease, background 150ms ease;\n }\n .spotpatch-target-item[data-active=\"true\"] {\n border-color: rgb(139 123 255 / 34%);\n background: var(--spotpatch-bg-active);\n box-shadow: 0 0 0 3px rgb(139 123 255 / 10%);\n }\n .spotpatch-target-summary {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 28px 28px;\n align-items: stretch;\n gap: 2px;\n padding: 4px;\n }\n .spotpatch-target-select {\n display: grid;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n gap: 9px;\n min-width: 0;\n border: 0;\n border-radius: 8px;\n padding: 8px;\n color: inherit;\n background: transparent;\n cursor: pointer;\n text-align: left;\n }\n .spotpatch-target-select:hover { background: rgb(255 255 255 / 3.5%); }\n .spotpatch-target-index {\n display: inline-grid;\n width: 22px;\n height: 22px;\n place-items: center;\n border: 1px solid rgb(68 202 224 / 25%);\n border-radius: 6px;\n color: var(--spotpatch-text-secondary);\n background: var(--spotpatch-bg);\n font: 650 11px/1 ui-monospace, SFMono-Regular, Menlo, monospace;\n }\n .spotpatch-target-copy { min-width: 0; }\n .spotpatch-target-name,\n .spotpatch-target-source {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-target-name { color: #f2f2f5; font-size: 13px; font-weight: 650; }\n .spotpatch-target-source { margin-top: 1px; color: var(--spotpatch-text-muted); font: 500 10.5px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; }\n .spotpatch-target-state {\n border-radius: 999px;\n padding: 3px 8px;\n color: #a7f3d0;\n background: rgb(16 185 129 / 9%);\n font-size: 10.5px;\n font-weight: 650;\n white-space: nowrap;\n }\n .spotpatch-target-state[data-complete=\"false\"] { color: #f5c97a; background: rgb(245 158 11 / 9%); }\n .spotpatch-target-open,\n .spotpatch-target-remove {\n display: inline-grid;\n width: 28px;\n height: 100%;\n min-height: 34px;\n padding: 0;\n place-items: center;\n border: 1px solid transparent;\n border-radius: 7px;\n color: #7f899a;\n background: transparent;\n cursor: pointer;\n }\n .spotpatch-target-open { color: #79d9e7; }\n .spotpatch-target-open:hover:not(:disabled) { border-color: rgb(68 202 224 / 30%); color: #c8f7ff; background: rgb(8 145 178 / 11%); }\n .spotpatch-target-remove:hover:not(:disabled) { border-color: rgb(251 113 133 / 24%); color: #fda4af; background: rgb(127 29 29 / 12%); }\n .spotpatch-target-editor {\n padding: 0 12px 12px;\n }\n .spotpatch-target-editor-head {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 6px;\n }\n .spotpatch-target-editor-label { color: var(--spotpatch-text-secondary); font-size: 11px; font-weight: 650; }\n .spotpatch-target-editor-count { color: var(--spotpatch-text-muted); font: 500 10.5px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace; }\n .spotpatch-target-editor textarea {\n box-sizing: border-box;\n width: 100%;\n min-height: 74px;\n resize: vertical;\n border: 1px solid var(--spotpatch-border);\n border-radius: 7px;\n padding: 9px 10px;\n color: #f8fafc;\n caret-color: #8b7cf7;\n background: var(--spotpatch-bg-input);\n font-size: 12.5px;\n line-height: 1.55;\n outline: none;\n transition: border-color 150ms ease, box-shadow 150ms ease, background 150ms ease;\n }\n .spotpatch-target-editor textarea::placeholder { color: #687284; }\n .spotpatch-target-editor textarea:hover { border-color: rgb(139 124 247 / 34%); }\n .spotpatch-target-editor textarea:focus {\n border-color: rgb(139 124 247 / 68%);\n background: rgb(3 7 18 / 65%);\n box-shadow: 0 0 0 2px rgb(109 93 246 / 10%);\n }\n .spotpatch-diagnostics {\n margin-top: 10px;\n overflow: hidden;\n border: 1px solid rgb(255 255 255 / 8%);\n border-radius: 9px;\n background: rgb(255 255 255 / 2.5%);\n }\n .spotpatch-diagnostics > summary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 11px;\n color: #bfc5d0;\n cursor: pointer;\n font-size: 11px;\n font-weight: 650;\n list-style: none;\n user-select: none;\n }\n .spotpatch-diagnostics > summary::-webkit-details-marker { display: none; }\n .spotpatch-diagnostics > summary::before {\n color: #778193;\n content: \"›\";\n font-size: 16px;\n line-height: 1;\n transform: rotate(0deg);\n transition: transform 150ms ease;\n }\n .spotpatch-diagnostics[open] > summary::before { transform: rotate(90deg); }\n .spotpatch-source-peek {\n min-width: 0;\n overflow: hidden;\n margin-left: auto;\n color: #64748b;\n font: 500 10.5px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .spotpatch-summary {\n max-height: 170px;\n margin: 0;\n overflow: auto;\n border-top: 1px solid rgb(255 255 255 / 7%);\n padding: 10px 11px 11px;\n color: #9ca5b5;\n font: 10.5px/1.55 ui-monospace, SFMono-Regular, Menlo, monospace;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n user-select: text;\n }\n .spotpatch-prompt {\n max-height: min(500px, 60vh);\n margin: 0;\n overflow: auto;\n border: 1px solid rgb(255 255 255 / 9%);\n border-radius: 9px;\n padding: 11px;\n color: #d8ddeb;\n background: rgb(3 7 18 / 55%);\n font: 11px/1.6 ui-monospace, SFMono-Regular, Menlo, monospace;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n user-select: text;\n }\n .spotpatch-actions {\n display: grid;\n gap: 8px;\n padding: 10px 18px 14px;\n border-top: 1px solid rgb(255 255 255 / 8%);\n background: rgb(8 8 12 / 86%);\n }\n .spotpatch-editor-feedback {\n white-space: normal;\n }\n .spotpatch-secondary-actions,\n .spotpatch-primary-actions {\n display: flex;\n align-items: center;\n gap: 7px;\n }\n .spotpatch-secondary-actions { min-height: 30px; }\n .spotpatch-actions button {\n display: inline-flex;\n min-height: 34px;\n align-items: center;\n justify-content: center;\n border: 1px solid rgb(255 255 255 / 10%);\n border-radius: 9px;\n padding: 7px 11px;\n color: var(--spotpatch-text-secondary);\n background: rgb(255 255 255 / 4%);\n cursor: pointer;\n font-size: 12px;\n font-weight: 650;\n transition: border-color 150ms ease, box-shadow 150ms ease, color 150ms ease, transform 150ms ease;\n }\n .spotpatch-actions button:hover:not(:disabled) {\n border-color: rgb(139 124 247 / 45%);\n color: #fff;\n transform: translateY(-1px);\n }\n .spotpatch-actions .spotpatch-primary {\n min-width: 138px;\n flex: 1;\n border-color: transparent;\n color: var(--spotpatch-text-on-accent);\n background: linear-gradient(135deg, var(--spotpatch-accent), var(--spotpatch-accent-strong));\n box-shadow: 0 8px 20px -8px rgb(139 123 255 / 55%);\n }\n .spotpatch-actions .spotpatch-primary:hover:not(:disabled) { color: var(--spotpatch-text-on-accent); filter: brightness(1.08); }\n .spotpatch-actions .spotpatch-primary::after { margin-left: 8px; content: \"↗\"; font-size: 12px; }\n .spotpatch-actions .spotpatch-secondary-action {\n min-height: 30px;\n border-style: dashed;\n padding: 5px 10px;\n color: var(--spotpatch-text-muted);\n background: transparent;\n font-size: 11px;\n }\n .spotpatch-actions .spotpatch-icon-action {\n width: 34px;\n min-width: 34px;\n padding: 0;\n font-size: 0;\n }\n .spotpatch-actions .spotpatch-icon-action::before {\n color: var(--spotpatch-text-secondary);\n content: attr(data-compact-icon);\n font-size: 18px;\n font-weight: 400;\n line-height: 1;\n }\n .spotpatch-actions button:disabled { cursor: not-allowed; opacity: .4; transform: none; }\n .spotpatch-actions button:focus-visible,\n .spotpatch-repository:focus-visible,\n .spotpatch-target-open:focus-visible,\n .spotpatch-target-remove:focus-visible,\n .spotpatch-close:focus-visible,\n .spotpatch-trigger:focus-visible,\n .spotpatch-target-select:focus-visible,\n .spotpatch-target-editor textarea:focus-visible,\n .spotpatch-locale:focus-visible,\n .spotpatch-prompt:focus-visible,\n .spotpatch-diagnostics > summary:focus-visible {\n outline: 2px solid #8b7cf7;\n outline-offset: 2px;\n }\n .spotpatch-live {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n }\n @media (prefers-reduced-motion: reduce) {\n .spotpatch-trigger,\n .spotpatch-actions button,\n .spotpatch-diagnostics > summary::before { transition: none; }\n }\n @media (max-width: 520px) {\n .spotpatch-dialog { top: 8px; left: 8px; width: calc(100vw - 16px); }\n .spotpatch-shell { max-height: calc(100vh - 16px); border-radius: 14px; }\n .spotpatch-header, .spotpatch-body { padding-left: 14px; padding-right: 14px; }\n .spotpatch-brand-row { margin-right: -14px; margin-left: -14px; padding-right: 14px; padding-left: 14px; }\n .spotpatch-actions { padding-right: 14px; padding-left: 14px; }\n .spotpatch-target-select { grid-template-columns: 24px minmax(0, 1fr); }\n .spotpatch-target-state { display: none; }\n .spotpatch-repository { display: none; }\n }\n ${AGENT_PANEL_STYLES}\n `;\n return style;\n}\n\nfunction summaryLine(summary: string, prefix: string): string | undefined {\n const line = summary\n .split(\"\\n\")\n .find((candidate) => candidate.startsWith(`${prefix}: `));\n return line?.slice(prefix.length + 2).trim();\n}\n\nfunction createUnavailableDataFlowPanel(\n document: Document,\n changesRoot: HTMLElement,\n diagnosticsRoot: HTMLElement,\n): DataFlowPanel {\n changesRoot.append(diagnosticsRoot);\n\n return Object.freeze({\n root: changesRoot,\n refreshButton: createButton(document, \"\"),\n styles: document.createElement(\"style\"),\n dispose: () => undefined,\n render: () => undefined,\n resetView: () => undefined,\n });\n}\n\nexport function createRuntimeView(\n document: Document,\n shortcut: string,\n ai: RuntimeAiConfig = Object.freeze({ enabled: false }),\n localePreference: SpotPatchLocalePreference = \"auto\",\n dataFlowEnabled = false,\n externalAgentEnabled = false,\n framework: \"vite\" | \"next\" = \"vite\",\n sessionId = \"\",\n): RuntimeView {\n const localizer: UiLocalizer = createUiLocalizer(document, localePreference);\n let messages = localizer.messages();\n const host = document.createElement(\"spotpatch-root\");\n host.setAttribute(UI_MARKER_ATTRIBUTE, \"\");\n const shadowRoot = host.attachShadow({ mode: \"open\" });\n const triggerButton = createButton(\n document,\n messages.trigger.select,\n \"spotpatch-trigger\",\n );\n triggerButton.title = messages.trigger.title(shortcut);\n triggerButton.setAttribute(\"aria-pressed\", \"false\");\n\n const highlight = createMarkedElement(document, \"div\");\n highlight.className = \"spotpatch-highlight\";\n highlight.hidden = true;\n const highlightLabel = createMarkedElement(document, \"span\");\n highlightLabel.className = \"spotpatch-highlight-label\";\n highlight.append(highlightLabel);\n const selectionHighlights = createMarkedElement(document, \"div\");\n selectionHighlights.className = \"spotpatch-selection-highlights\";\n selectionHighlights.setAttribute(\"aria-hidden\", \"true\");\n\n const dialog = createMarkedElement(document, \"section\");\n dialog.className = \"spotpatch-dialog\";\n dialog.hidden = true;\n dialog.tabIndex = -1;\n dialog.dataset.placement = \"viewport\";\n dialog.setAttribute(\"role\", \"dialog\");\n dialog.setAttribute(\"aria-labelledby\", \"spotpatch-selection-title\");\n const anchor = createMarkedElement(document, \"span\");\n anchor.className = \"spotpatch-anchor\";\n anchor.setAttribute(\"aria-hidden\", \"true\");\n const shell = createMarkedElement(document, \"div\");\n shell.className = \"spotpatch-shell\";\n\n const header = createMarkedElement(document, \"header\");\n header.className = \"spotpatch-header\";\n const brandRow = createMarkedElement(document, \"div\");\n brandRow.className = \"spotpatch-brand-row\";\n const brand = createMarkedElement(document, \"div\");\n brand.className = \"spotpatch-brand\";\n const brandCopy = createMarkedElement(document, \"span\");\n brandCopy.className = \"spotpatch-brand-copy\";\n const brandName = createMarkedElement(document, \"span\");\n brandName.className = \"spotpatch-brand-name\";\n const brandContext = createMarkedElement(document, \"span\");\n brandContext.className = \"spotpatch-brand-context\";\n brandCopy.append(brandName, brandContext);\n brand.append(createBrandMark(document), brandCopy);\n const headerControls = createMarkedElement(document, \"span\");\n headerControls.className = \"spotpatch-header-controls\";\n const repositoryLink = createMarkedElement(document, \"a\");\n repositoryLink.className = \"spotpatch-repository\";\n repositoryLink.href = SPOTPATCH_REPOSITORY_URL;\n repositoryLink.target = \"_blank\";\n repositoryLink.rel = \"noopener noreferrer\";\n const localeButton = createButton(document, \"\", \"spotpatch-locale\");\n const closeButton = createButton(document, \"×\", \"spotpatch-close\");\n headerControls.append(repositoryLink, localeButton, closeButton);\n brandRow.append(brand, headerControls);\n const title = createMarkedElement(document, \"h2\");\n title.id = \"spotpatch-selection-title\";\n title.className = \"spotpatch-title\";\n const subtitle = createMarkedElement(document, \"p\");\n subtitle.className = \"spotpatch-subtitle\";\n const targetRow = createMarkedElement(document, \"div\");\n targetRow.className = \"spotpatch-target-row\";\n const targetLabel = createMarkedElement(document, \"span\");\n targetLabel.className = \"spotpatch-target-label\";\n const contextState = createMarkedElement(document, \"span\");\n contextState.className = \"spotpatch-context-state\";\n contextState.dataset.state = \"loading\";\n contextState.textContent = messages.context.collecting;\n targetRow.append(targetLabel, contextState);\n header.append(brandRow, title, subtitle, targetRow);\n\n const body = createMarkedElement(document, \"div\");\n body.className = \"spotpatch-body\";\n const selectionPanel = createMarkedElement(document, \"div\");\n selectionPanel.className = \"spotpatch-selection-panel\";\n const targetsPanel = createMarkedElement(document, \"section\");\n targetsPanel.className = \"spotpatch-targets\";\n const targetsHeading = createMarkedElement(document, \"div\");\n targetsHeading.className = \"spotpatch-targets-heading\";\n const targetsTitle = createMarkedElement(document, \"span\");\n const targetsMeta = createMarkedElement(document, \"span\");\n targetsMeta.className = \"spotpatch-targets-meta\";\n const targetComplete = createMarkedElement(document, \"span\");\n targetComplete.className = \"spotpatch-target-complete\";\n const targetBudget = createMarkedElement(document, \"span\");\n targetBudget.className = \"spotpatch-target-budget\";\n targetBudget.setAttribute(\"aria-live\", \"polite\");\n const targetCount = createMarkedElement(document, \"span\");\n targetCount.className = \"spotpatch-target-count\";\n targetsMeta.append(targetComplete, targetBudget);\n targetRow.append(targetCount);\n targetsHeading.append(targetsTitle, targetsMeta);\n const targetProgress = createMarkedElement(document, \"div\");\n targetProgress.className = \"spotpatch-target-progress\";\n targetProgress.setAttribute(\"aria-hidden\", \"true\");\n const targetProgressFill = createMarkedElement(document, \"div\");\n targetProgressFill.className = \"spotpatch-target-progress-fill\";\n targetProgress.append(targetProgressFill);\n const targetList = createMarkedElement(document, \"div\");\n targetList.className = \"spotpatch-target-list\";\n targetsPanel.append(targetsHeading, targetProgress, targetList);\n const diagnostics = createMarkedElement(document, \"details\");\n diagnostics.className = \"spotpatch-diagnostics\";\n const diagnosticsLabel = createMarkedElement(document, \"summary\");\n const diagnosticsTitle = createMarkedElement(document, \"span\");\n const sourcePeek = createMarkedElement(document, \"span\");\n sourcePeek.className = \"spotpatch-source-peek\";\n sourcePeek.textContent = messages.diagnostics.resolving;\n diagnosticsLabel.append(diagnosticsTitle, sourcePeek);\n const summary = createMarkedElement(document, \"pre\");\n summary.className = \"spotpatch-summary\";\n diagnostics.append(diagnosticsLabel, summary);\n const agentPanel = createAgentPanel(document, ai, localizer);\n const changesPanel = createMarkedElement(document, \"div\");\n const externalHandoffPanel = externalAgentEnabled\n ? getExternalHandoffExtension()?.createPanel(\n document,\n framework,\n localizer.locale,\n sessionId,\n localizer.subscribe,\n placeDialog,\n )\n : undefined;\n changesPanel.append(\n targetsPanel,\n agentPanel.root,\n ...(externalHandoffPanel === undefined ? [] : [externalHandoffPanel.root]),\n );\n const dataFlowPanel =\n getDataFlowExtension()?.createPanel(\n document,\n dataFlowEnabled,\n localizer.locale,\n changesPanel,\n diagnostics,\n placeDialog,\n ) ?? createUnavailableDataFlowPanel(document, changesPanel, diagnostics);\n selectionPanel.append(dataFlowPanel.root);\n\n const previewPanel = createMarkedElement(document, \"div\");\n previewPanel.className = \"spotpatch-preview-panel\";\n previewPanel.hidden = true;\n const promptOutput = createMarkedElement(document, \"pre\");\n promptOutput.className = \"spotpatch-prompt\";\n promptOutput.tabIndex = 0;\n promptOutput.setAttribute(\"aria-label\", messages.diagnostics.promptAriaLabel);\n previewPanel.append(promptOutput);\n body.append(selectionPanel, previewPanel);\n\n const actions = createMarkedElement(document, \"footer\");\n actions.className = \"spotpatch-actions\";\n const editorFeedback = createMarkedElement(document, \"div\");\n editorFeedback.className = \"spotpatch-context-state spotpatch-editor-feedback\";\n editorFeedback.dataset.state = \"idle\";\n editorFeedback.setAttribute(\"role\", \"status\");\n editorFeedback.setAttribute(\"aria-live\", \"polite\");\n editorFeedback.hidden = true;\n const addTargetButton = createButton(document, messages.actions.addElement);\n const reselectButton = createButton(document, messages.actions.reselect);\n const openEditorButton = createButton(document, messages.actions.openEditor);\n const previewButton = createButton(\n document,\n messages.actions.preview,\n \"spotpatch-primary\",\n );\n const copyButton = createButton(document, messages.actions.copy, \"spotpatch-primary\");\n const backButton = createButton(document, messages.actions.back);\n const secondaryActions = createMarkedElement(document, \"div\");\n secondaryActions.className = \"spotpatch-secondary-actions\";\n const primaryActions = createMarkedElement(document, \"div\");\n primaryActions.className = \"spotpatch-primary-actions\";\n addTargetButton.classList.add(\"spotpatch-icon-action\");\n addTargetButton.dataset.compactIcon = \"+\";\n agentPanel.testButton.classList.add(\"spotpatch-icon-action\");\n agentPanel.testButton.dataset.compactIcon = \"✓\";\n openEditorButton.classList.add(\"spotpatch-secondary-action\");\n reselectButton.classList.add(\"spotpatch-secondary-action\");\n secondaryActions.append(openEditorButton, reselectButton);\n primaryActions.append(\n agentPanel.testButton,\n addTargetButton,\n agentPanel.runButton,\n ...(externalHandoffPanel === undefined ? [] : [externalHandoffPanel.sendButton]),\n previewButton,\n agentPanel.cancelButton,\n agentPanel.applyButton,\n agentPanel.revertButton,\n agentPanel.resetButton,\n copyButton,\n backButton,\n );\n actions.append(editorFeedback, secondaryActions, primaryActions);\n shell.append(header, body, actions);\n dialog.append(anchor, shell);\n\n const liveRegion = createMarkedElement(document, \"div\");\n liveRegion.className = \"spotpatch-live\";\n liveRegion.setAttribute(\"aria-live\", \"polite\");\n liveRegion.setAttribute(\"aria-atomic\", \"true\");\n\n const styles = [\n createStyles(document),\n dataFlowPanel.styles,\n ...(externalHandoffPanel === undefined ? [] : [externalHandoffPanel.styles]),\n ];\n const styleNonce = resolveStyleNonce(document);\n\n if (styleNonce !== undefined) {\n for (const style of styles) {\n style.nonce = styleNonce;\n }\n }\n\n shadowRoot.append(\n ...styles,\n selectionHighlights,\n highlight,\n dialog,\n triggerButton,\n liveRegion,\n );\n document.documentElement.append(host);\n\n let currentRect: ElementRect | undefined;\n let activeSelectionRect: ElementRect | undefined;\n let currentStatus: RuntimeStatus = \"idle\";\n let currentCanOpenEditor = false;\n let currentCanPreview = false;\n let currentSummaryText = \"\";\n let editingEnabled = true;\n let currentTargets: readonly SelectionTargetView[] = [];\n let currentMaximum = 0;\n let currentEditorFeedbackState: \"idle\" | \"opening\" | \"success\" | \"error\" = \"idle\";\n let currentDataFlowState: DataFlowViewState = Object.freeze({\n component: Object.freeze({\n status: dataFlowEnabled ? \"idle\" : \"disabled\",\n }),\n page: Object.freeze({ status: dataFlowEnabled ? \"idle\" : \"disabled\" }),\n observationCount: 0,\n });\n\n function renderEditorStatus(state: \"idle\" | \"opening\" | \"success\" | \"error\"): void {\n currentEditorFeedbackState = state;\n editorFeedback.dataset.state = state;\n editorFeedback.hidden = state === \"idle\";\n editorFeedback.textContent =\n state === \"opening\"\n ? messages.announcements.editorOpening\n : state === \"success\"\n ? messages.announcements.editorOpened\n : state === \"error\"\n ? messages.announcements.editorFailed\n : \"\";\n placeDialog();\n }\n\n function statusText(target: SelectionTargetView): string {\n if (target.status === \"ready\") {\n return messages.targets.statusReady;\n }\n\n return target.status === \"warning\"\n ? messages.targets.statusPartial\n : messages.targets.statusCollecting;\n }\n\n function renderTargetProgress(complete: number, total: number): void {\n const ratio = total === 0 ? 0 : complete / total;\n targetProgressFill.style.width = `${String(ratio * 100)}%`;\n }\n\n function instructionInput(targetId?: string): HTMLTextAreaElement | undefined {\n const inputs = targetList.querySelectorAll<HTMLTextAreaElement>(\n \"textarea[data-target-instruction-id]\",\n );\n return Array.from(inputs).find(\n (input) =>\n targetId === undefined || input.dataset.targetInstructionId === targetId,\n );\n }\n\n function renderTargets(\n targets: readonly SelectionTargetView[],\n maximum: number,\n ): void {\n const focusedInstruction = shadowRoot.activeElement?.closest<HTMLTextAreaElement>(\n \"textarea[data-target-instruction-id]\",\n );\n const focusedTargetId = focusedInstruction?.dataset.targetInstructionId;\n const selectionStart = focusedInstruction?.selectionStart;\n const selectionEnd = focusedInstruction?.selectionEnd;\n currentTargets = targets.map((target) => Object.freeze({ ...target }));\n currentMaximum = maximum;\n targetList.replaceChildren();\n const completeCount = targets.filter(\n (target) => target.instruction.trim().length > 0,\n ).length;\n const instructionCharacters = targets.reduce(\n (total, target) => total + target.instruction.trim().length,\n 0,\n );\n renderTargetProgress(completeCount, targets.length);\n targetCount.textContent = messages.targets.count(targets.length, maximum);\n targetComplete.textContent = messages.targets.complete(\n completeCount,\n targets.length,\n );\n const instructionLimitExceeded =\n instructionCharacters > MAX_ANNOTATION_INSTRUCTION_CHARACTERS;\n targetBudget.dataset.state = instructionLimitExceeded ? \"over\" : \"ready\";\n targetBudget.textContent = instructionLimitExceeded\n ? messages.targets.instructionBudgetExceeded(\n instructionCharacters,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n )\n : messages.targets.instructionBudget(\n instructionCharacters,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n );\n addTargetButton.disabled = !editingEnabled || targets.length >= maximum;\n addTargetButton.title =\n targets.length >= maximum\n ? messages.targets.limitTitle(maximum)\n : messages.targets.addTitle;\n targetLabel.textContent =\n targets.length === 1\n ? (targets[0]?.label ?? messages.context.selectedElement)\n : messages.context.selectedCount(targets.length);\n\n for (const [index, target] of targets.entries()) {\n const item = createMarkedElement(document, \"div\");\n item.className = \"spotpatch-target-item\";\n item.dataset.active = String(target.active);\n item.dataset.status = target.status;\n item.dataset.targetId = target.id;\n const targetSummary = createMarkedElement(document, \"div\");\n targetSummary.className = \"spotpatch-target-summary\";\n const select = createButton(document, \"\", \"spotpatch-target-select\");\n select.dataset.activateTargetId = target.id;\n select.setAttribute(\"aria-label\", messages.targets.activate(index + 1));\n select.setAttribute(\"aria-expanded\", String(target.active));\n const number = createMarkedElement(document, \"span\");\n number.className = \"spotpatch-target-index\";\n number.textContent = String(index + 1);\n const copy = createMarkedElement(document, \"span\");\n copy.className = \"spotpatch-target-copy\";\n const name = createMarkedElement(document, \"span\");\n name.className = \"spotpatch-target-name\";\n name.textContent = target.label;\n const source = createMarkedElement(document, \"span\");\n source.className = \"spotpatch-target-source\";\n source.textContent = `${statusText(target)} · ${target.source}`;\n copy.append(name, source);\n const instructionComplete = target.instruction.trim().length > 0;\n const state = createMarkedElement(document, \"span\");\n state.className = \"spotpatch-target-state\";\n state.dataset.complete = String(instructionComplete);\n state.textContent = instructionComplete\n ? messages.targets.instructionReady\n : messages.targets.instructionMissing;\n select.append(number, copy, state);\n const open = createButton(document, \"↗\", \"spotpatch-target-open\");\n open.dataset.openTargetId = target.id;\n open.disabled = !target.canOpenEditor;\n open.setAttribute(\"aria-label\", messages.actions.openTarget(index + 1));\n open.title = messages.actions.openTarget(index + 1);\n const remove = createButton(document, \"×\", \"spotpatch-target-remove\");\n remove.dataset.removeTargetId = target.id;\n remove.disabled = !editingEnabled;\n remove.setAttribute(\"aria-label\", messages.targets.remove(index + 1));\n remove.title = messages.targets.removeTitle;\n targetSummary.append(select, open, remove);\n item.append(targetSummary);\n\n if (target.active) {\n const editor = createMarkedElement(document, \"label\");\n editor.className = \"spotpatch-target-editor\";\n const editorHead = createMarkedElement(document, \"span\");\n editorHead.className = \"spotpatch-target-editor-head\";\n const editorLabel = createMarkedElement(document, \"span\");\n editorLabel.className = \"spotpatch-target-editor-label\";\n editorLabel.textContent = messages.targets.instructionLabel(target.label);\n const characterCount = createMarkedElement(document, \"span\");\n characterCount.className = \"spotpatch-target-editor-count\";\n characterCount.textContent = messages.targets.instructionCount(\n target.instruction.length,\n MAX_TARGET_INSTRUCTION_CHARACTERS,\n );\n editorHead.append(editorLabel, characterCount);\n const input = createMarkedElement(document, \"textarea\");\n input.rows = 4;\n input.maxLength = MAX_TARGET_INSTRUCTION_CHARACTERS;\n input.value = target.instruction;\n input.placeholder = messages.targets.instructionPlaceholder;\n input.disabled = !editingEnabled;\n input.dataset.targetInstructionId = target.id;\n input.setAttribute(\n \"aria-label\",\n messages.targets.instructionLabel(target.label),\n );\n editor.append(editorHead, input);\n item.append(editor);\n }\n\n targetList.append(item);\n }\n\n if (focusedTargetId !== undefined) {\n const replacement = instructionInput(focusedTargetId);\n replacement?.focus({ preventScroll: true });\n\n if (selectionStart !== undefined && selectionEnd !== undefined) {\n replacement?.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n }\n\n function updateTargetInstruction(targetId: string, instruction: string): void {\n currentTargets = currentTargets.map((target) =>\n target.id === targetId ? Object.freeze({ ...target, instruction }) : target,\n );\n const item = Array.from(\n targetList.querySelectorAll<HTMLElement>(\".spotpatch-target-item\"),\n ).find((candidate) => candidate.dataset.targetId === targetId);\n\n if (item === undefined) {\n return;\n }\n\n const complete = instruction.trim().length > 0;\n const state = item.querySelector<HTMLElement>(\".spotpatch-target-state\");\n const count = item.querySelector<HTMLElement>(\".spotpatch-target-editor-count\");\n\n if (state !== null) {\n state.dataset.complete = String(complete);\n state.textContent = complete\n ? messages.targets.instructionReady\n : messages.targets.instructionMissing;\n }\n\n if (count !== null) {\n count.textContent = messages.targets.instructionCount(\n instruction.length,\n MAX_TARGET_INSTRUCTION_CHARACTERS,\n );\n }\n\n const completeCount = currentTargets.filter(\n (target) => target.instruction.trim().length > 0,\n ).length;\n targetComplete.textContent = messages.targets.complete(\n completeCount,\n currentTargets.length,\n );\n renderTargetProgress(completeCount, currentTargets.length);\n const instructionCharacters = currentTargets.reduce(\n (total, target) => total + target.instruction.trim().length,\n 0,\n );\n const instructionLimitExceeded =\n instructionCharacters > MAX_ANNOTATION_INSTRUCTION_CHARACTERS;\n targetBudget.dataset.state = instructionLimitExceeded ? \"over\" : \"ready\";\n targetBudget.textContent = instructionLimitExceeded\n ? messages.targets.instructionBudgetExceeded(\n instructionCharacters,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n )\n : messages.targets.instructionBudget(\n instructionCharacters,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n );\n }\n\n function showSelectionHighlights(targets: readonly SelectionHighlightView[]): void {\n selectionHighlights.replaceChildren();\n activeSelectionRect = targets.find((target) => target.active)?.rect;\n currentRect = activeSelectionRect;\n\n for (const [index, target] of targets.entries()) {\n const box = createMarkedElement(document, \"div\");\n box.className = \"spotpatch-selection-highlight\";\n box.dataset.targetId = target.id;\n box.dataset.active = String(target.active);\n box.style.transform = `translate(${String(target.rect.x)}px, ${String(target.rect.y)}px)`;\n box.style.width = `${String(target.rect.width)}px`;\n box.style.height = `${String(target.rect.height)}px`;\n const label = createMarkedElement(document, \"span\");\n label.textContent = `${String(index + 1)} · ${target.label}`;\n box.append(label);\n selectionHighlights.append(box);\n }\n\n placeDialog();\n }\n\n function placeDialog(): void {\n if (dialog.hidden) {\n return;\n }\n\n const view = document.defaultView;\n const viewportWidth = view?.innerWidth ?? document.documentElement.clientWidth;\n const viewportHeight = view?.innerHeight ?? document.documentElement.clientHeight;\n const measured = dialog.getBoundingClientRect();\n const status = currentStatus === \"previewing\" ? \"previewing\" : \"selected\";\n const dialogWidth =\n measured.width > 0\n ? measured.width\n : Math.min(DIALOG_MAX_WIDTH, viewportWidth - 32);\n const dialogHeight =\n measured.height > 0\n ? measured.height\n : Math.min(DIALOG_FALLBACK_HEIGHT[status], viewportHeight - 32);\n const placement = calculateDialogPlacement({\n dialogWidth,\n dialogHeight,\n viewportWidth,\n viewportHeight,\n ...(currentRect === undefined ? {} : { target: currentRect }),\n });\n\n dialog.style.left = `${String(placement.left)}px`;\n dialog.style.top = `${String(placement.top)}px`;\n dialog.style.setProperty(\"--spotpatch-anchor-x\", `${String(placement.anchorX)}px`);\n dialog.style.setProperty(\"--spotpatch-anchor-y\", `${String(placement.anchorY)}px`);\n dialog.dataset.placement = placement.mode;\n }\n\n function updateContextOverview(summaryText: string): void {\n const summaryMessages = messages.summary;\n const source = summaryLine(summaryText, summaryMessages.source);\n sourcePeek.textContent = source ?? messages.diagnostics.noExactSource;\n const browserReady = `${summaryMessages.browserContext}: ${summaryMessages.collectionStatuses.ready}`;\n const browserLoading = `${summaryMessages.browserContext}: ${summaryMessages.collectionStatuses.loading}`;\n const browserFailed = `${summaryMessages.browserContext}: ${summaryMessages.collectionStatuses.failed}`;\n const apiLoading = `${summaryMessages.api}: ${summaryMessages.apiStatuses.loading}`;\n const apiFailed = `${summaryMessages.api}: ${summaryMessages.apiStatuses.failed}`;\n\n if (\n summaryText.includes(browserReady) &&\n !summaryText.includes(browserLoading) &&\n !summaryText.includes(apiLoading) &&\n !summaryText.includes(browserFailed) &&\n !summaryText.includes(apiFailed)\n ) {\n contextState.dataset.state = \"ready\";\n contextState.textContent = messages.context.ready;\n } else if (summaryText.includes(browserFailed) || summaryText.includes(apiFailed)) {\n contextState.dataset.state = \"warning\";\n contextState.textContent = messages.context.partial;\n } else {\n contextState.dataset.state = \"loading\";\n contextState.textContent = messages.context.collecting;\n }\n }\n\n function updateSelection(\n summaryText: string,\n canOpenEditor: boolean,\n canPreview: boolean,\n ): void {\n currentCanOpenEditor = canOpenEditor;\n currentCanPreview = canPreview;\n currentSummaryText = summaryText;\n summary.textContent = summaryText;\n openEditorButton.disabled = !canOpenEditor;\n previewButton.disabled = !canPreview;\n agentPanel.setContextReady(canPreview);\n externalHandoffPanel?.setContextReady(canPreview);\n updateContextOverview(summaryText);\n placeDialog();\n }\n\n function renderPanelStatus(status: RuntimeStatus): void {\n currentStatus = status;\n const selected = status === \"selected\";\n const previewing = status === \"previewing\";\n triggerButton.hidden = selected || previewing;\n selectionPanel.hidden = !selected;\n previewPanel.hidden = !previewing;\n reselectButton.hidden = !selected;\n addTargetButton.hidden = !selected;\n openEditorButton.hidden = !selected;\n previewButton.hidden = !selected;\n secondaryActions.hidden = !selected;\n agentPanel.setSelectionVisible(selected);\n externalHandoffPanel?.setSelectionVisible(selected);\n copyButton.hidden = !previewing;\n backButton.hidden = !previewing;\n title.textContent = previewing\n ? messages.dialog.previewTitle\n : messages.dialog.editTitle;\n subtitle.textContent = previewing\n ? messages.dialog.previewSubtitle\n : messages.dialog.editSubtitle;\n placeDialog();\n }\n\n function applyMessages(): void {\n messages = localizer.messages();\n brandName.textContent = messages.brand.name;\n brandContext.textContent = messages.brand.context;\n repositoryLink.textContent = messages.brand.repository;\n repositoryLink.title = messages.brand.repositoryTitle;\n repositoryLink.setAttribute(\"aria-label\", messages.brand.repositoryTitle);\n localeButton.textContent = messages.alternateLocaleName;\n localeButton.title = messages.switchLocale;\n localeButton.setAttribute(\"aria-label\", messages.switchLocale);\n closeButton.setAttribute(\"aria-label\", messages.dialog.close);\n closeButton.title = messages.dialog.close;\n targetsPanel.setAttribute(\"aria-label\", messages.targets.ariaLabel);\n targetsTitle.textContent = messages.targets.title;\n diagnosticsTitle.textContent = messages.diagnostics.title;\n promptOutput.setAttribute(\"aria-label\", messages.diagnostics.promptAriaLabel);\n addTargetButton.textContent = messages.actions.addElement;\n reselectButton.textContent = messages.actions.reselect;\n openEditorButton.textContent = messages.actions.openEditor;\n previewButton.textContent = messages.actions.preview;\n copyButton.textContent = messages.actions.copy;\n backButton.textContent = messages.actions.back;\n dataFlowPanel.render(currentDataFlowState);\n triggerButton.title = messages.trigger.title(shortcut);\n triggerButton.textContent =\n currentStatus === \"inspecting\" ? messages.trigger.stop : messages.trigger.select;\n renderPanelStatus(currentStatus);\n renderEditorStatus(currentEditorFeedbackState);\n\n if (currentTargets.length > 0) {\n renderTargets(currentTargets, currentMaximum);\n } else {\n targetCount.textContent = messages.targets.count(0, currentMaximum);\n targetComplete.textContent = messages.targets.complete(0, 0);\n renderTargetProgress(0, 0);\n targetBudget.dataset.state = \"ready\";\n targetBudget.textContent = messages.targets.instructionBudget(\n 0,\n MAX_ANNOTATION_INSTRUCTION_CHARACTERS,\n );\n targetLabel.textContent = messages.context.selectedElement;\n }\n\n if (currentSummaryText.length > 0) {\n updateContextOverview(currentSummaryText);\n } else {\n sourcePeek.textContent = messages.diagnostics.resolving;\n contextState.textContent = messages.context.collecting;\n }\n }\n\n diagnostics.addEventListener(\"toggle\", placeDialog);\n localeButton.addEventListener(\"click\", localizer.toggle);\n const unsubscribeLocale = localizer.subscribe(applyMessages);\n applyMessages();\n\n return Object.freeze({\n host,\n triggerButton,\n addTargetButton,\n targetList,\n reselectButton,\n openEditorButton,\n repositoryLink,\n previewButton,\n copyButton,\n dataFlowRefreshButton: dataFlowPanel.refreshButton,\n backButton,\n closeButton,\n agentProviderSelect: agentPanel.providerSelect,\n agentModelSelect: agentPanel.modelSelect,\n agentModeSelect: agentPanel.modeSelect,\n agentConsentCheckbox: agentPanel.consentCheckbox,\n agentWorkspaceConsentCheckbox: agentPanel.workspaceConsentCheckbox,\n agentTestButton: agentPanel.testButton,\n agentRunButton: agentPanel.runButton,\n agentCancelButton: agentPanel.cancelButton,\n agentApplyButton: agentPanel.applyButton,\n agentRevertButton: agentPanel.revertButton,\n agentResetButton: agentPanel.resetButton,\n ...(externalHandoffPanel === undefined ? {} : { externalHandoffPanel }),\n\n renderStatus(status: RuntimeStatus): void {\n const inspecting = status === \"inspecting\";\n triggerButton.setAttribute(\"aria-pressed\", String(inspecting));\n triggerButton.textContent = inspecting\n ? messages.trigger.stop\n : messages.trigger.select;\n renderPanelStatus(status);\n },\n\n renderEditorStatus,\n\n renderDataFlow(state: DataFlowViewState): void {\n currentDataFlowState = state;\n dataFlowPanel.render(state);\n placeDialog();\n },\n\n showHighlight(rect: ElementRect, label: string): void {\n currentRect = rect;\n highlight.hidden = false;\n highlight.style.transform = `translate(${String(rect.x)}px, ${String(rect.y)}px)`;\n highlight.style.width = `${String(rect.width)}px`;\n highlight.style.height = `${String(rect.height)}px`;\n highlightLabel.textContent = label;\n targetLabel.textContent = label;\n placeDialog();\n },\n\n hideHighlight(): void {\n currentRect = activeSelectionRect;\n highlight.hidden = true;\n highlightLabel.textContent = \"\";\n placeDialog();\n },\n\n showSelectionHighlights,\n\n hideSelectionHighlights(): void {\n selectionHighlights.replaceChildren();\n activeSelectionRect = undefined;\n currentRect = undefined;\n placeDialog();\n },\n\n showSelection(\n summaryText: string,\n canOpenEditor: boolean,\n canPreview: boolean,\n ): void {\n updateSelection(summaryText, canOpenEditor, canPreview);\n triggerButton.hidden = true;\n dialog.hidden = false;\n placeDialog();\n },\n\n updateSelection,\n\n renderTargets,\n\n updateTargetInstruction,\n\n setPreviewEnabled(enabled: boolean): void {\n currentCanPreview = enabled;\n previewButton.disabled = !enabled;\n agentPanel.setContextReady(enabled);\n externalHandoffPanel?.setContextReady(enabled);\n },\n\n hideSelection(): void {\n dialog.hidden = true;\n triggerButton.hidden = false;\n targetList.replaceChildren();\n currentTargets = [];\n currentMaximum = 0;\n currentSummaryText = \"\";\n renderEditorStatus(\"idle\");\n targetCount.textContent = messages.targets.count(0, 0);\n targetComplete.textContent = messages.targets.complete(0, 0);\n renderTargetProgress(0, 0);\n targetLabel.textContent = messages.context.selectedElement;\n summary.textContent = \"\";\n promptOutput.textContent = \"\";\n sourcePeek.textContent = messages.diagnostics.resolving;\n contextState.dataset.state = \"loading\";\n contextState.textContent = messages.context.collecting;\n openEditorButton.disabled = true;\n previewButton.disabled = true;\n currentCanOpenEditor = false;\n currentCanPreview = false;\n agentPanel.setContextReady(false);\n agentPanel.setSelectionVisible(false);\n externalHandoffPanel?.setContextReady(false);\n externalHandoffPanel?.setSelectionVisible(false);\n agentPanel.setEditingEnabled(true);\n agentPanel.resetJob();\n dataFlowPanel.resetView();\n },\n\n hideSelectionTemporarily(): void {\n dialog.hidden = true;\n triggerButton.hidden = false;\n },\n\n showPreview(prompt: string): void {\n promptOutput.textContent = prompt;\n placeDialog();\n },\n\n readAgentSelection(): AgentSelectionValue | undefined {\n return agentPanel.readSelection();\n },\n\n agentConsentGranted(): boolean {\n return agentPanel.consentGranted();\n },\n\n setAgentProviderConsent(granted: boolean): void {\n agentPanel.setProviderConsent(granted);\n },\n\n setAgentEditingEnabled(enabled: boolean): void {\n editingEnabled = enabled;\n addTargetButton.disabled = !enabled;\n reselectButton.disabled = !enabled;\n targetList\n .querySelectorAll<HTMLButtonElement | HTMLTextAreaElement>(\n \".spotpatch-target-remove, .spotpatch-target-select, textarea[data-target-instruction-id]\",\n )\n .forEach((control) => {\n control.disabled = !enabled;\n });\n openEditorButton.disabled = !currentCanOpenEditor;\n previewButton.disabled = !enabled || !currentCanPreview;\n externalHandoffPanel?.setContextReady(enabled && currentCanPreview);\n agentPanel.setEditingEnabled(enabled);\n placeDialog();\n },\n\n renderAgentCapability(\n state: \"idle\" | \"probing\" | \"ready\" | \"error\",\n message: string,\n capabilitySnapshot?: AgentCapabilitySnapshot,\n errorCode?: ErrorCode,\n ): void {\n agentPanel.renderCapability(state, message, capabilitySnapshot, errorCode);\n const agentReady =\n state === \"ready\" && capabilitySnapshot?.state === \"agent-ready\";\n previewButton.classList.toggle(\"spotpatch-primary\", !agentReady);\n placeDialog();\n },\n\n renderAgentWorkspaceHealth(\n state: \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\",\n snapshot?: AgentWorkspaceHealthSnapshot,\n errorCode?: ErrorCode,\n ): void {\n agentPanel.renderWorkspaceHealth(state, snapshot, errorCode);\n placeDialog();\n },\n\n renderAgentJob(\n snapshot: AgentJobSnapshot,\n result: AgentJobResult | undefined,\n activities: readonly AgentActivityItem[],\n errorCode?: ErrorCode,\n ): void {\n agentPanel.renderJob(snapshot, result, activities, errorCode);\n placeDialog();\n },\n\n resetAgentJob(): void {\n agentPanel.resetJob();\n placeDialog();\n },\n\n focusTargetInstruction(targetId?: string): void {\n instructionInput(targetId)?.focus({ preventScroll: true });\n },\n\n focusPrompt(): void {\n promptOutput.focus({ preventScroll: true });\n },\n\n announce(message: string): void {\n liveRegion.textContent = \"\";\n liveRegion.textContent = message;\n },\n\n locale: localizer.locale,\n\n messages: localizer.messages,\n\n agentWorkspaceConsentGranted: agentPanel.workspaceConsentGranted,\n\n subscribeLocale: localizer.subscribe,\n\n dispose(): void {\n diagnostics.removeEventListener(\"toggle\", placeDialog);\n localeButton.removeEventListener(\"click\", localizer.toggle);\n unsubscribeLocale();\n dataFlowPanel.dispose();\n externalHandoffPanel?.dispose();\n agentPanel.dispose();\n host.remove();\n },\n });\n}\n","import { UI_MARKER_ATTRIBUTE } from \"./ui-constants.js\";\n\nexport function createMarkedElement<K extends keyof HTMLElementTagNameMap>(\n document: Document,\n tagName: K,\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName);\n element.setAttribute(UI_MARKER_ATTRIBUTE, \"\");\n return element;\n}\n\nexport function createButton(\n document: Document,\n label: string,\n className = \"\",\n): HTMLButtonElement {\n const button = createMarkedElement(document, \"button\");\n button.type = \"button\";\n button.className = className;\n button.textContent = label;\n return button;\n}\n","import type {\n AgentCapabilitySnapshot,\n AgentJobResult,\n AgentJobSnapshot,\n AgentWorkspaceHealthSnapshot,\n AgentApplyMode,\n ErrorCode,\n RuntimeAiConfig,\n RuntimeAiProviderProfile,\n} from \"@spotpatch/shared\";\n\nimport { createButton, createMarkedElement } from \"./dom.js\";\nimport type { UiLocalizer, UiMessages } from \"./localization.js\";\n\nexport interface AgentSelectionValue {\n readonly applyMode: AgentApplyMode;\n readonly modelProfileId: string;\n readonly providerProfileId: string;\n}\n\nexport interface AgentActivityItem {\n readonly key: string;\n readonly label: string;\n readonly state: \"active\" | \"success\" | \"failure\" | \"info\";\n}\n\nexport interface AgentPanel {\n readonly applyButton: HTMLButtonElement;\n readonly cancelButton: HTMLButtonElement;\n readonly consentCheckbox: HTMLInputElement;\n readonly workspaceConsentCheckbox: HTMLInputElement;\n readonly modelSelect: HTMLSelectElement;\n readonly modeSelect: HTMLSelectElement;\n readonly providerSelect: HTMLSelectElement;\n readonly resetButton: HTMLButtonElement;\n readonly revertButton: HTMLButtonElement;\n readonly root: HTMLElement;\n readonly runButton: HTMLButtonElement;\n readonly testButton: HTMLButtonElement;\n readonly consentGranted: () => boolean;\n readonly workspaceConsentGranted: () => boolean;\n readonly dispose: () => void;\n readonly readSelection: () => AgentSelectionValue | undefined;\n readonly renderCapability: (\n state: \"idle\" | \"probing\" | \"ready\" | \"error\",\n message: string,\n capability?: AgentCapabilitySnapshot,\n errorCode?: ErrorCode,\n ) => void;\n readonly renderJob: (\n snapshot: AgentJobSnapshot,\n result: AgentJobResult | undefined,\n activities: readonly AgentActivityItem[],\n errorCode?: ErrorCode,\n ) => void;\n readonly renderWorkspaceHealth: (\n state: \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\",\n snapshot?: AgentWorkspaceHealthSnapshot,\n errorCode?: ErrorCode,\n ) => void;\n readonly resetJob: () => void;\n readonly setContextReady: (ready: boolean) => void;\n readonly setEditingEnabled: (enabled: boolean) => void;\n readonly setProviderConsent: (granted: boolean) => void;\n readonly setSelectionVisible: (visible: boolean) => void;\n}\n\nexport const AGENT_PANEL_STYLES = `\n .spotpatch-agent {\n margin-top: 10px;\n overflow: hidden;\n border: 1px solid var(--spotpatch-border-subtle);\n border-radius: var(--spotpatch-radius-card);\n background: rgb(255 255 255 / 2.5%);\n }\n .spotpatch-agent-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 10px 12px;\n border-bottom: 1px solid rgb(255 255 255 / 7%);\n }\n .spotpatch-agent-title { color: #eef0f5; font-size: 13px; font-weight: 650; }\n .spotpatch-agent-badge {\n border: 1px solid rgb(129 112 247 / 24%);\n border-radius: 999px;\n padding: 3px 7px;\n color: #c5cafa;\n background: rgb(109 93 246 / 9%);\n font-size: 10px;\n font-weight: 650;\n }\n .spotpatch-agent-setup { padding: 12px; }\n .spotpatch-agent-selectors { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }\n .spotpatch-agent-mode { grid-column: 1 / -1; }\n .spotpatch-agent-selectors label { min-width: 0; color: var(--spotpatch-text-secondary); font-size: 11.5px; font-weight: 580; }\n .spotpatch-agent select {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n min-height: 34px;\n margin-top: 4px;\n border: 1px solid var(--spotpatch-border);\n border-radius: 8px;\n padding: 7px 32px 7px 9px;\n color: #e8ebf2;\n color-scheme: dark;\n background: linear-gradient(180deg, rgb(255 255 255 / 4%), rgb(255 255 255 / 2%));\n font-size: 12px;\n font-weight: 560;\n line-height: 1.35;\n outline: none;\n transition: 160ms ease;\n }\n .spotpatch-agent select:hover { border-color: rgb(148 163 184 / 38%); background-color: rgb(255 255 255 / 5%); }\n .spotpatch-agent select:focus-visible { border-color: rgb(139 124 247 / 76%); box-shadow: 0 0 0 3px rgb(109 93 246 / 18%); }\n .spotpatch-agent select option { min-height: 42px; color: #e8ebf2; background: #10151e; }\n @supports (appearance: base-select) {\n .spotpatch-agent select,\n ::picker(select) { appearance: base-select; }\n .spotpatch-agent select { padding: 7px 9px; }\n .spotpatch-agent select::picker-icon {\n color: #9da6b5;\n transition: rotate 180ms cubic-bezier(.2, .8, .2, 1);\n }\n .spotpatch-agent select:open::picker-icon { rotate: 180deg; color: #c4b5fd; }\n .spotpatch-agent select::picker(select) {\n top: calc(anchor(bottom) + 7px);\n left: anchor(left);\n width: anchor-size(width);\n max-height: min(280px, 40vh);\n margin: 0;\n overflow: auto;\n border: 1px solid rgb(139 124 247 / 28%);\n border-radius: 12px;\n padding: 6px;\n background: #10151e;\n box-shadow: 0 18px 50px rgb(0 0 0 / 38%);\n opacity: 1;\n transform: translateY(0) scale(1);\n transition: opacity 150ms ease, transform 180ms cubic-bezier(.2, .8, .2, 1), overlay 180ms allow-discrete, display 180ms allow-discrete;\n }\n @starting-style {\n .spotpatch-agent select::picker(select):popover-open {\n opacity: 0;\n transform: translateY(-5px) scale(.985);\n }\n }\n .spotpatch-agent select option {\n min-height: 42px;\n border-radius: 8px;\n padding: 10px 12px;\n color: #dfe4ee;\n background: transparent;\n cursor: pointer;\n }\n .spotpatch-agent select option:hover,\n .spotpatch-agent select option:focus { color: #fff; background: rgb(109 93 246 / 16%); }\n .spotpatch-agent select option:checked { color: #fff; background: rgb(109 93 246 / 24%); }\n .spotpatch-agent select option::checkmark { color: #8b7cf7; }\n }\n .spotpatch-agent select:focus-visible,\n .spotpatch-consent input:focus-visible {\n outline: 2px solid #8b7cf7;\n outline-offset: 2px;\n }\n .spotpatch-consent {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-top: 10px;\n color: var(--spotpatch-text-secondary);\n cursor: pointer;\n font-size: 11.5px;\n line-height: 1.5;\n }\n .spotpatch-consent input { width: 14px; height: 14px; flex: none; margin: 2px 0 0; accent-color: var(--spotpatch-accent); }\n .spotpatch-trusted-consent {\n border: 1px solid rgb(251 191 36 / 20%);\n border-radius: 10px;\n padding: 9px 10px;\n color: #e5e7eb;\n background: rgb(120 53 15 / 10%);\n }\n .spotpatch-workspace-consent {\n margin-top: 9px;\n border: 1px solid rgb(251 191 36 / 18%);\n border-radius: 10px;\n padding: 9px 10px;\n background: rgb(120 53 15 / 9%);\n }\n .spotpatch-workspace-consent strong { display: block; color: #fde68a; font-size: 11.5px; font-weight: 620; }\n .spotpatch-workspace-consent small { display: block; margin-top: 2px; color: #aeb6c4; font-size: 10.5px; line-height: 1.45; }\n .spotpatch-agent-health-list { display: grid; gap: 6px; margin-top: 10px; }\n .spotpatch-agent-workspace,\n .spotpatch-agent-capability {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n color: #929bab;\n font-size: 11px;\n }\n .spotpatch-agent-capability::before {\n width: 6px;\n height: 6px;\n flex: none;\n border-radius: 999px;\n background: #64748b;\n content: \"\";\n }\n .spotpatch-agent-capability[data-state=\"probing\"]::before { background: var(--spotpatch-warning); }\n .spotpatch-agent-capability[data-state=\"ready\"] { color: #a7f3d0; }\n .spotpatch-agent-capability[data-state=\"ready\"]::before { background: var(--spotpatch-success); }\n .spotpatch-agent-capability[data-state=\"error\"] { color: #fecaca; }\n .spotpatch-agent-capability[data-state=\"error\"]::before { background: var(--spotpatch-danger); }\n .spotpatch-agent-workspace::before {\n width: 6px;\n height: 6px;\n flex: none;\n border-radius: 999px;\n background: #64748b;\n content: \"\";\n }\n .spotpatch-agent-workspace[data-state=\"checking\"]::before { background: var(--spotpatch-warning); }\n .spotpatch-agent-workspace[data-state=\"ready\"] { color: #a7f3d0; }\n .spotpatch-agent-workspace[data-state=\"ready\"]::before { background: var(--spotpatch-success); }\n .spotpatch-agent-workspace[data-state=\"consent-required\"] { color: #fde68a; }\n .spotpatch-agent-workspace[data-state=\"consent-required\"]::before { background: #fbbf24; }\n .spotpatch-agent-workspace[data-state=\"blocked\"] { color: #fecaca; }\n .spotpatch-agent-workspace[data-state=\"blocked\"]::before { background: var(--spotpatch-danger); }\n .spotpatch-agent-job { padding: 12px; }\n .spotpatch-agent-job-meta { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n .spotpatch-agent-model { min-width: 0; overflow: hidden; color: #d6dafe; font-size: 13px; text-overflow: ellipsis; white-space: nowrap; }\n .spotpatch-agent-status {\n flex: none;\n border-radius: 999px;\n padding: 3px 7px;\n color: #bae6fd;\n background: rgb(14 116 144 / 20%);\n font-size: 11px;\n font-weight: 650;\n }\n .spotpatch-agent-phase { margin: 12px 0 0; color: #e2e5ec; font-size: 13px; line-height: 1.55; }\n .spotpatch-agent-error {\n margin: 9px 0 0;\n border: 1px solid rgb(251 113 133 / 22%);\n border-radius: 9px;\n padding: 9px 10px;\n color: #fecaca;\n background: rgb(127 29 29 / 14%);\n font-size: 12px;\n }\n .spotpatch-agent-activity { display: grid; gap: 5px; margin: 9px 0 0; padding: 0; list-style: none; }\n .spotpatch-agent-activity li { display: flex; gap: 8px; color: #929bab; font: 11.5px/1.55 ui-monospace, SFMono-Regular, Menlo, monospace; }\n .spotpatch-agent-activity li::before { color: #64748b; content: \"•\"; }\n .spotpatch-agent-activity li[data-state=\"active\"]::before { color: #fbbf24; }\n .spotpatch-agent-activity li[data-state=\"success\"]::before { color: #34d399; }\n .spotpatch-agent-activity li[data-state=\"failure\"]::before { color: #fb7185; }\n .spotpatch-agent-result { margin-top: 11px; border-top: 1px solid rgb(148 163 184 / 10%); padding-top: 10px; }\n .spotpatch-agent-summary { margin: 0; color: #dce1eb; font-size: 13px; line-height: 1.6; white-space: pre-wrap; }\n .spotpatch-agent-files { display: grid; gap: 4px; margin: 9px 0 0; padding: 0; list-style: none; }\n .spotpatch-agent-files li { color: #bbc2f7; font: 11.5px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; overflow-wrap: anywhere; }\n .spotpatch-agent-checks { display: grid; gap: 5px; margin-top: 9px; }\n .spotpatch-agent-checks details { border: 1px solid rgb(148 163 184 / 12%); border-radius: 8px; background: rgb(2 6 23 / 30%); }\n .spotpatch-agent-checks summary { padding: 9px 10px; color: #cbd0db; cursor: pointer; font-size: 11.5px; }\n .spotpatch-agent-checks pre { max-height: 140px; margin: 0; overflow: auto; border-top: 1px solid rgb(255 255 255 / 7%); padding: 10px; color: #929bab; font: 11px/1.55 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; }\n .spotpatch-agent-diff {\n max-height: 300px;\n margin: 9px 0 0;\n overflow: auto;\n border: 1px solid rgb(129 140 248 / 18%);\n border-radius: 9px;\n padding: 8px;\n color: #cbd5e1;\n background: rgb(2 6 23 / 66%);\n font: 11.5px/1.6 ui-monospace, SFMono-Regular, Menlo, monospace;\n overflow-wrap: normal;\n white-space: pre;\n user-select: text;\n }\n @media (max-width: 520px) {\n .spotpatch-agent-selectors { grid-template-columns: 1fr; }\n .spotpatch-agent-mode { grid-column: auto; }\n }\n`;\n\nfunction addOption(\n document: Document,\n select: HTMLSelectElement,\n value: string,\n label: string,\n): HTMLOptionElement {\n const option = document.createElement(\"option\");\n option.value = value;\n option.textContent = label;\n select.append(option);\n return option;\n}\n\nexport function createAgentPanel(\n document: Document,\n ai: RuntimeAiConfig,\n localizer: UiLocalizer,\n): AgentPanel {\n let messages: UiMessages = localizer.messages();\n const root = createMarkedElement(document, \"section\");\n root.className = \"spotpatch-agent\";\n root.hidden = !ai.enabled;\n const header = createMarkedElement(document, \"div\");\n header.className = \"spotpatch-agent-head\";\n const title = createMarkedElement(document, \"span\");\n title.className = \"spotpatch-agent-title\";\n const badge = createMarkedElement(document, \"span\");\n badge.className = \"spotpatch-agent-badge\";\n header.append(title, badge);\n\n const setup = createMarkedElement(document, \"div\");\n setup.className = \"spotpatch-agent-setup\";\n const selectors = createMarkedElement(document, \"div\");\n selectors.className = \"spotpatch-agent-selectors\";\n const modeLabel = createMarkedElement(document, \"label\");\n modeLabel.className = \"spotpatch-agent-mode\";\n const modeText = createMarkedElement(document, \"span\");\n const modeSelect = createMarkedElement(document, \"select\");\n modeLabel.append(modeText, modeSelect);\n const providerLabel = createMarkedElement(document, \"label\");\n const providerText = createMarkedElement(document, \"span\");\n const providerSelect = createMarkedElement(document, \"select\");\n providerLabel.append(providerText, providerSelect);\n const modelLabel = createMarkedElement(document, \"label\");\n const modelText = createMarkedElement(document, \"span\");\n const modelSelect = createMarkedElement(document, \"select\");\n modelLabel.append(modelText, modelSelect);\n selectors.append(modeLabel, providerLabel, modelLabel);\n const consent = createMarkedElement(document, \"label\");\n consent.className = \"spotpatch-consent\";\n const consentCheckbox = createMarkedElement(document, \"input\");\n consentCheckbox.type = \"checkbox\";\n const consentText = createMarkedElement(document, \"span\");\n consent.append(consentCheckbox, consentText);\n const workspaceConsent = createMarkedElement(document, \"label\");\n workspaceConsent.className = \"spotpatch-consent spotpatch-workspace-consent\";\n workspaceConsent.hidden = true;\n const workspaceConsentCheckbox = createMarkedElement(document, \"input\");\n workspaceConsentCheckbox.type = \"checkbox\";\n const workspaceConsentContent = createMarkedElement(document, \"span\");\n const workspaceConsentTitle = createMarkedElement(document, \"strong\");\n const workspaceConsentHelp = createMarkedElement(document, \"small\");\n workspaceConsentContent.append(workspaceConsentTitle, workspaceConsentHelp);\n workspaceConsent.append(workspaceConsentCheckbox, workspaceConsentContent);\n const healthList = createMarkedElement(document, \"div\");\n healthList.className = \"spotpatch-agent-health-list\";\n const workspace = createMarkedElement(document, \"p\");\n workspace.className = \"spotpatch-agent-workspace\";\n workspace.dataset.state = \"idle\";\n const capability = createMarkedElement(document, \"p\");\n capability.className = \"spotpatch-agent-capability\";\n capability.dataset.state = \"idle\";\n healthList.append(workspace, capability);\n setup.append(selectors, consent, workspaceConsent, healthList);\n\n const job = createMarkedElement(document, \"div\");\n job.className = \"spotpatch-agent-job\";\n job.hidden = true;\n const jobMeta = createMarkedElement(document, \"div\");\n jobMeta.className = \"spotpatch-agent-job-meta\";\n const jobModel = createMarkedElement(document, \"span\");\n jobModel.className = \"spotpatch-agent-model\";\n const jobStatus = createMarkedElement(document, \"span\");\n jobStatus.className = \"spotpatch-agent-status\";\n jobMeta.append(jobModel, jobStatus);\n const phase = createMarkedElement(document, \"p\");\n phase.className = \"spotpatch-agent-phase\";\n const error = createMarkedElement(document, \"p\");\n error.className = \"spotpatch-agent-error\";\n error.hidden = true;\n const activity = createMarkedElement(document, \"ul\");\n activity.className = \"spotpatch-agent-activity\";\n const resultPanel = createMarkedElement(document, \"div\");\n resultPanel.className = \"spotpatch-agent-result\";\n resultPanel.hidden = true;\n const resultSummary = createMarkedElement(document, \"p\");\n resultSummary.className = \"spotpatch-agent-summary\";\n const files = createMarkedElement(document, \"ul\");\n files.className = \"spotpatch-agent-files\";\n const checks = createMarkedElement(document, \"div\");\n checks.className = \"spotpatch-agent-checks\";\n const diff = createMarkedElement(document, \"pre\");\n diff.className = \"spotpatch-agent-diff\";\n diff.tabIndex = 0;\n diff.setAttribute(\"aria-label\", messages.agent.diffAriaLabel);\n resultPanel.append(resultSummary, files, checks, diff);\n job.append(jobMeta, phase, error, activity, resultPanel);\n root.append(header, setup, job);\n\n const testButton = createButton(document, messages.agent.testConnection);\n const runButton = createButton(document, messages.agent.run, \"spotpatch-run\");\n const cancelButton = createButton(document, messages.agent.cancel);\n const applyButton = createButton(document, messages.agent.apply, \"spotpatch-primary\");\n const revertButton = createButton(document, messages.agent.revert);\n const resetButton = createButton(document, messages.agent.revise);\n\n const providers = ai.enabled ? ai.providers : [];\n const trustedFastModeAvailable = ai.enabled && ai.applyMode === \"trusted-auto\";\n const configuredApplyMode = ai.enabled ? ai.applyMode : \"review\";\n const providerById = new Map(providers.map((provider) => [provider.id, provider]));\n let contextReady = false;\n let editingEnabled = true;\n let selectionVisible = false;\n let jobPresented = false;\n let capabilityProbing = false;\n let capabilityReady = false;\n let latestSnapshot: AgentJobSnapshot | undefined;\n let latestResult: AgentJobResult | undefined;\n let latestActivities: readonly AgentActivityItem[] = [];\n let latestErrorCode: ErrorCode | undefined;\n let latestCapabilityState: \"idle\" | \"probing\" | \"ready\" | \"error\" = \"idle\";\n let latestCapabilityMessage = messages.agent.connectionNotTested;\n let latestCapabilityErrorCode: ErrorCode | undefined;\n let latestWorkspaceState:\n \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\" = \"idle\";\n let latestWorkspaceSnapshot: AgentWorkspaceHealthSnapshot | undefined;\n let latestWorkspaceErrorCode: ErrorCode | undefined;\n\n for (const provider of providers) {\n addOption(document, providerSelect, provider.id, provider.label);\n }\n\n if (ai.enabled) {\n providerSelect.value = ai.defaultProvider;\n }\n\n let reviewOption: HTMLOptionElement | undefined;\n let trustedOption: HTMLOptionElement | undefined;\n let autoOption: HTMLOptionElement | undefined;\n\n if (configuredApplyMode === \"auto\") {\n autoOption = addOption(document, modeSelect, \"auto\", messages.agent.autoGated);\n } else {\n reviewOption = addOption(document, modeSelect, \"review\", messages.agent.review);\n\n if (trustedFastModeAvailable) {\n trustedOption = addOption(\n document,\n modeSelect,\n \"trusted-auto\",\n messages.agent.trustedFast,\n );\n }\n }\n\n const defaultApplyMode = trustedFastModeAvailable ? \"review\" : configuredApplyMode;\n modeSelect.value = defaultApplyMode;\n modeLabel.hidden = !trustedFastModeAvailable;\n\n const selectedApplyMode = (): AgentApplyMode =>\n modeSelect.value === \"trusted-auto\" ? \"trusted-auto\" : defaultApplyMode;\n const trustedFastMode = (): boolean => selectedApplyMode() === \"trusted-auto\";\n\n const selectedProvider = (): RuntimeAiProviderProfile | undefined =>\n providerById.get(providerSelect.value);\n\n const consentMessage = (provider: RuntimeAiProviderProfile | undefined): string => {\n if (provider === undefined) {\n return messages.agent.providerUnavailable;\n }\n\n return trustedFastMode()\n ? messages.agent.trustedFastConsent(provider.label)\n : messages.agent.consent(provider.label);\n };\n\n const localChangesConsentGranted = (): boolean =>\n trustedFastMode() ? consentCheckbox.checked : workspaceConsentCheckbox.checked;\n\n const renderMode = (): void => {\n const trusted = trustedFastMode();\n consent.classList.toggle(\"spotpatch-trusted-consent\", trusted);\n badge.textContent = trusted\n ? messages.agent.trustedFast\n : configuredApplyMode === \"auto\"\n ? messages.agent.autoGated\n : messages.agent.review;\n consentText.textContent = consentMessage(selectedProvider());\n workspaceConsent.hidden = trusted || latestWorkspaceState !== \"consent-required\";\n };\n\n const populateModels = (): void => {\n const provider = selectedProvider();\n modelSelect.replaceChildren();\n\n if (provider === undefined) {\n consentText.textContent = consentMessage(provider);\n return;\n }\n\n for (const model of provider.models) {\n addOption(document, modelSelect, model.id, model.label);\n }\n\n modelSelect.value = provider.defaultModel;\n consentText.textContent = consentMessage(provider);\n };\n\n const refreshActions = (): void => {\n const setupVisible = ai.enabled && selectionVisible && !jobPresented;\n runButton.textContent = capabilityProbing\n ? messages.agent.verifying\n : messages.agent.run;\n runButton.classList.toggle(\"spotpatch-primary\", capabilityReady);\n testButton.hidden = !setupVisible;\n runButton.hidden = !setupVisible;\n testButton.disabled =\n !editingEnabled || capabilityProbing || selectedProvider() === undefined;\n runButton.disabled =\n !editingEnabled ||\n capabilityProbing ||\n !contextReady ||\n !consentCheckbox.checked ||\n latestWorkspaceState === \"idle\" ||\n latestWorkspaceState === \"checking\" ||\n latestWorkspaceState === \"blocked\" ||\n (latestWorkspaceState === \"consent-required\" && !localChangesConsentGranted()) ||\n selectedProvider() === undefined ||\n modelSelect.value.length === 0;\n\n if (!jobPresented || !selectionVisible) {\n cancelButton.hidden = true;\n applyButton.hidden = true;\n revertButton.hidden = true;\n resetButton.hidden = true;\n }\n };\n\n const renderWorkspaceMessage = (): void => {\n if (latestWorkspaceState === \"idle\") {\n workspace.textContent = messages.agent.workspaceNotChecked;\n } else if (latestWorkspaceState === \"checking\") {\n workspace.textContent = messages.agent.checkingWorkspace;\n } else if (latestWorkspaceState === \"ready\") {\n workspace.textContent = messages.agent.workspaceReady;\n } else if (latestWorkspaceState === \"consent-required\") {\n const changes = latestWorkspaceSnapshot?.changes;\n workspace.textContent = messages.agent.workspaceDirty(\n changes?.staged ?? 0,\n changes?.unstaged ?? 0,\n changes?.untracked ?? 0,\n );\n } else {\n workspace.textContent =\n latestWorkspaceErrorCode === undefined\n ? messages.errors.INTERNAL_ERROR\n : messages.errors[latestWorkspaceErrorCode];\n }\n };\n\n function handleProviderChange(): void {\n populateModels();\n consentCheckbox.checked = false;\n capability.dataset.state = \"idle\";\n capability.textContent = messages.agent.connectionNotTested;\n latestCapabilityState = \"idle\";\n latestCapabilityMessage = messages.agent.connectionNotTested;\n latestCapabilityErrorCode = undefined;\n capabilityReady = false;\n refreshActions();\n }\n function handleModelChange(): void {\n capability.dataset.state = \"idle\";\n capability.textContent = messages.agent.connectionNotTested;\n latestCapabilityState = \"idle\";\n latestCapabilityMessage = messages.agent.connectionNotTested;\n latestCapabilityErrorCode = undefined;\n capabilityReady = false;\n refreshActions();\n }\n function handleModeChange(): void {\n consentCheckbox.checked = false;\n workspaceConsentCheckbox.checked = false;\n renderMode();\n refreshActions();\n }\n populateModels();\n modeSelect.addEventListener(\"change\", handleModeChange);\n providerSelect.addEventListener(\"change\", handleProviderChange);\n modelSelect.addEventListener(\"change\", handleModelChange);\n consentCheckbox.addEventListener(\"change\", refreshActions);\n workspaceConsentCheckbox.addEventListener(\"change\", refreshActions);\n function renderCurrentJob(): void {\n if (latestSnapshot === undefined) {\n return;\n }\n\n const snapshot = latestSnapshot;\n const result = latestResult;\n jobModel.textContent = `${snapshot.providerLabel} · ${snapshot.modelLabel}`;\n jobStatus.textContent = messages.agent.status(snapshot.status);\n phase.textContent = snapshot.phaseMessage;\n const jobErrorCode = latestErrorCode ?? snapshot.errorCode;\n error.hidden = jobErrorCode === undefined;\n error.textContent = jobErrorCode === undefined ? \"\" : messages.errors[jobErrorCode];\n activity.replaceChildren();\n\n for (const item of latestActivities.slice(-8)) {\n const row = createMarkedElement(document, \"li\");\n row.dataset.state = item.state;\n row.textContent = item.label;\n activity.append(row);\n }\n\n resultPanel.hidden = result === undefined;\n resultSummary.textContent = result?.summary ?? \"\";\n files.replaceChildren();\n checks.replaceChildren();\n diff.textContent = result?.diff ?? \"\";\n\n for (const file of result?.files ?? []) {\n const row = createMarkedElement(document, \"li\");\n row.textContent = `${file.kind} ${file.relativePath} (+${String(file.additions)} / -${String(file.deletions)})`;\n files.append(row);\n }\n\n for (const check of result?.checks ?? []) {\n const details = createMarkedElement(document, \"details\");\n const checkTitle = createMarkedElement(document, \"summary\");\n checkTitle.textContent = `${check.label}: ${check.status} · ${String(check.durationMs)} ms`;\n const output = createMarkedElement(document, \"pre\");\n output.textContent =\n check.output.length === 0 ? messages.agent.noOutput : check.output;\n details.append(checkTitle, output);\n checks.append(details);\n }\n\n testButton.hidden = true;\n runButton.hidden = true;\n cancelButton.hidden = !selectionVisible || !snapshot.canCancel;\n cancelButton.textContent =\n snapshot.status === \"awaiting-review\"\n ? messages.agent.discard\n : messages.agent.cancel;\n applyButton.hidden = !selectionVisible || !snapshot.canApply;\n revertButton.hidden = !selectionVisible || !snapshot.canRevert;\n resetButton.hidden =\n !selectionVisible ||\n ![\"completed\", \"cancelled\", \"reverted\", \"failed\"].includes(snapshot.status);\n }\n\n function applyMessages(): void {\n messages = localizer.messages();\n title.textContent = messages.agent.title;\n modeText.textContent = messages.agent.mode;\n\n if (reviewOption !== undefined) reviewOption.textContent = messages.agent.review;\n if (trustedOption !== undefined)\n trustedOption.textContent = messages.agent.trustedFast;\n if (autoOption !== undefined) autoOption.textContent = messages.agent.autoGated;\n providerText.textContent = messages.agent.provider;\n modelText.textContent = messages.agent.model;\n providerSelect.setAttribute(\"aria-label\", messages.agent.providerAriaLabel);\n modelSelect.setAttribute(\"aria-label\", messages.agent.modelAriaLabel);\n workspaceConsentTitle.textContent = messages.agent.includeLocalChanges;\n workspaceConsentHelp.textContent = messages.agent.includeLocalChangesHelp;\n diff.setAttribute(\"aria-label\", messages.agent.diffAriaLabel);\n testButton.textContent = messages.agent.testConnection;\n applyButton.textContent = messages.agent.apply;\n revertButton.textContent = messages.agent.revert;\n resetButton.textContent = messages.agent.revise;\n renderMode();\n\n if (latestCapabilityState === \"idle\") {\n capability.textContent = messages.agent.connectionNotTested;\n } else if (latestCapabilityState === \"probing\") {\n capability.textContent = messages.agent.testingCapability;\n } else if (latestCapabilityState === \"ready\") {\n capability.textContent = `${messages.agent.capabilityVerified} · ${messages.agent.toolsReady}`;\n } else if (latestCapabilityErrorCode !== undefined) {\n capability.textContent = messages.errors[latestCapabilityErrorCode];\n } else if (selectedProvider() === undefined) {\n capability.textContent = messages.agent.providerUnavailable;\n } else {\n capability.textContent = latestCapabilityMessage;\n }\n\n renderWorkspaceMessage();\n refreshActions();\n renderCurrentJob();\n }\n\n const unsubscribeLocale = localizer.subscribe(applyMessages);\n applyMessages();\n\n return Object.freeze({\n root,\n modeSelect,\n providerSelect,\n modelSelect,\n consentCheckbox,\n workspaceConsentCheckbox,\n testButton,\n runButton,\n cancelButton,\n applyButton,\n revertButton,\n resetButton,\n\n consentGranted(): boolean {\n return consentCheckbox.checked;\n },\n\n workspaceConsentGranted(): boolean {\n return localChangesConsentGranted();\n },\n\n readSelection(): AgentSelectionValue | undefined {\n const provider = selectedProvider();\n const model = provider?.models.find(\n (candidate) => candidate.id === modelSelect.value,\n );\n\n return provider === undefined || model === undefined\n ? undefined\n : Object.freeze({\n applyMode: selectedApplyMode(),\n providerProfileId: provider.id,\n modelProfileId: model.id,\n });\n },\n\n renderCapability(\n state: \"idle\" | \"probing\" | \"ready\" | \"error\",\n message: string,\n capabilitySnapshot?: AgentCapabilitySnapshot,\n errorCode?: ErrorCode,\n ) {\n latestCapabilityState = state;\n latestCapabilityMessage = message;\n latestCapabilityErrorCode = errorCode;\n capabilityProbing = state === \"probing\";\n capabilityReady =\n state === \"ready\" && capabilitySnapshot?.state === \"agent-ready\";\n capability.dataset.state = state;\n capability.textContent =\n capabilitySnapshot?.state === \"agent-ready\"\n ? `${message} · ${messages.agent.toolsReady}`\n : message;\n refreshActions();\n },\n\n renderWorkspaceHealth(\n state: \"idle\" | \"checking\" | \"ready\" | \"consent-required\" | \"blocked\",\n snapshot?: AgentWorkspaceHealthSnapshot,\n errorCode?: ErrorCode,\n ) {\n latestWorkspaceState = state;\n latestWorkspaceSnapshot = snapshot;\n latestWorkspaceErrorCode = errorCode ?? snapshot?.errorCode;\n workspace.dataset.state = state;\n if (state !== \"checking\") {\n workspaceConsent.hidden = trustedFastMode() || state !== \"consent-required\";\n }\n\n if (state === \"idle\" || state === \"ready\" || state === \"blocked\") {\n workspaceConsentCheckbox.checked = false;\n }\n\n renderWorkspaceMessage();\n refreshActions();\n },\n\n renderJob(\n snapshot: AgentJobSnapshot,\n result: AgentJobResult | undefined,\n activities: readonly AgentActivityItem[],\n errorCode?: ErrorCode,\n ) {\n jobPresented = true;\n setup.hidden = true;\n job.hidden = false;\n providerSelect.disabled = true;\n modelSelect.disabled = true;\n modeSelect.disabled = true;\n consentCheckbox.disabled = true;\n workspaceConsentCheckbox.disabled = true;\n latestSnapshot = snapshot;\n latestResult = result;\n latestActivities = activities;\n latestErrorCode = errorCode;\n renderCurrentJob();\n },\n\n resetJob() {\n jobPresented = false;\n latestSnapshot = undefined;\n latestResult = undefined;\n latestActivities = [];\n latestErrorCode = undefined;\n setup.hidden = false;\n job.hidden = true;\n providerSelect.disabled = false;\n modelSelect.disabled = false;\n modeSelect.disabled = false;\n consentCheckbox.disabled = false;\n workspaceConsentCheckbox.disabled = false;\n activity.replaceChildren();\n files.replaceChildren();\n checks.replaceChildren();\n diff.textContent = \"\";\n error.textContent = \"\";\n error.hidden = true;\n refreshActions();\n },\n\n setContextReady(ready: boolean) {\n contextReady = ready;\n refreshActions();\n },\n\n setEditingEnabled(enabled: boolean) {\n editingEnabled = enabled;\n providerSelect.disabled = !enabled || jobPresented;\n modelSelect.disabled = !enabled || jobPresented;\n modeSelect.disabled = !enabled || jobPresented;\n consentCheckbox.disabled = !enabled || jobPresented;\n workspaceConsentCheckbox.disabled = !enabled || jobPresented;\n refreshActions();\n },\n\n setProviderConsent(granted: boolean) {\n consentCheckbox.checked = granted;\n refreshActions();\n },\n\n setSelectionVisible(visible: boolean) {\n selectionVisible = visible;\n refreshActions();\n\n if (!visible) {\n cancelButton.hidden = true;\n applyButton.hidden = true;\n revertButton.hidden = true;\n resetButton.hidden = true;\n }\n },\n\n dispose() {\n unsubscribeLocale();\n providerSelect.removeEventListener(\"change\", handleProviderChange);\n modelSelect.removeEventListener(\"change\", handleModelChange);\n modeSelect.removeEventListener(\"change\", handleModeChange);\n consentCheckbox.removeEventListener(\"change\", refreshActions);\n workspaceConsentCheckbox.removeEventListener(\"change\", refreshActions);\n },\n });\n}\n","/**\n * Canonical SpotPatch mark from docs/assets/spotpatch-logo-mark.svg.\n *\n * The Vite development injector consumes this trusted asset separately from\n * the core browser bundle so the Runtime gzip budget remains enforceable.\n */\nexport const BRAND_MARK_CONTENT = `\n <defs>\n <linearGradient id=\"locator-gradient\" x1=\"76\" y1=\"92\" x2=\"436\" y2=\"374\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stop-color=\"#B61CFF\" />\n <stop offset=\"0.38\" stop-color=\"#6D35FF\" />\n <stop offset=\"0.72\" stop-color=\"#168EFF\" />\n <stop offset=\"1\" stop-color=\"#00D9E9\" />\n </linearGradient>\n <linearGradient id=\"left-code-gradient\" x1=\"165\" y1=\"166\" x2=\"236\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#A51EFF\" />\n <stop offset=\"1\" stop-color=\"#653BFF\" />\n </linearGradient>\n <linearGradient id=\"right-code-gradient\" x1=\"276\" y1=\"166\" x2=\"347\" y2=\"258\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#158DFF\" />\n <stop offset=\"1\" stop-color=\"#00D8E9\" />\n </linearGradient>\n <linearGradient id=\"bolt-gradient\" x1=\"270\" y1=\"111\" x2=\"252\" y2=\"365\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#6840FF\" />\n <stop offset=\"0.48\" stop-color=\"#257BFF\" />\n <stop offset=\"1\" stop-color=\"#00CBEF\" />\n </linearGradient>\n </defs>\n <path\n fill=\"url(#locator-gradient)\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M256 52C345.47 52 418 124.53 418 214C418 267.55 391.98 316.24 354.04 348.02L256 468L157.96 348.02C120.02 316.24 94 267.55 94 214C94 124.53 166.53 52 256 52ZM256 88C186.41 88 130 144.41 130 214C130 258.2 152.76 297.08 187.2 319.57L256 403.8L324.8 319.57C359.24 297.08 382 258.2 382 214C382 144.41 325.59 88 256 88Z\"\n />\n <rect x=\"238\" y=\"20\" width=\"36\" height=\"84\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"62\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <rect x=\"366\" y=\"196\" width=\"84\" height=\"36\" rx=\"4\" fill=\"url(#locator-gradient)\" />\n <path\n d=\"M213.5 160L158 211.5L213.5 263L238 236.5L211 211.5L238 186.5L213.5 160Z\"\n fill=\"url(#left-code-gradient)\"\n />\n <path\n d=\"M298.5 160L354 211.5L298.5 263L274 236.5L301 211.5L274 186.5L298.5 160Z\"\n fill=\"url(#right-code-gradient)\"\n />\n <path\n d=\"M283 108L232 212L266 253L238 369L302 237L267 198L283 108Z\"\n fill=\"url(#bolt-gradient)\"\n />\n`;\n","import { BRAND_MARK_CONTENT } from \"./brand-mark-content.js\";\n\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\ndeclare const __SPOTPATCH_INLINE_BRAND_MARK__: boolean;\ndeclare const __SPOTPATCH_BRAND_MARK_CONTENT__: string | undefined;\n\n/**\n * Deliberately empty fail-closed fallback for an invalid Vite injection.\n *\n * The browser bundle must not carry a second logo implementation: normal\n * Vite development injects BRAND_MARK_CONTENT lexically, while standalone\n * Runtime builds inline the canonical asset at compile time. Keeping this\n * branch empty preserves the bundle budget and prevents stale branding if a\n * host violates either build contract.\n */\nconst FALLBACK_BRAND_MARK_CONTENT = \"\";\n\nfunction resolveBrandMarkContent(override?: string): Readonly<{\n readonly content: string;\n readonly viewBox: string;\n}> {\n if (override !== undefined) {\n return { content: override, viewBox: \"0 0 512 512\" };\n }\n\n const injected =\n typeof __SPOTPATCH_BRAND_MARK_CONTENT__ === \"string\"\n ? __SPOTPATCH_BRAND_MARK_CONTENT__\n : undefined;\n if (typeof injected === \"string\") {\n return { content: injected, viewBox: \"0 0 512 512\" };\n }\n\n return __SPOTPATCH_INLINE_BRAND_MARK__\n ? { content: BRAND_MARK_CONTENT, viewBox: \"0 0 512 512\" }\n : { content: FALLBACK_BRAND_MARK_CONTENT, viewBox: \"0 0 1 1\" };\n}\n\nfunction svgElement<K extends keyof SVGElementTagNameMap>(\n document: Document,\n tagName: K,\n attributes: Readonly<Record<string, string>>,\n): SVGElementTagNameMap[K] {\n const element = document.createElementNS(SVG_NAMESPACE, tagName);\n\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, value);\n }\n\n return element;\n}\n\n/** Vector form of docs/assets/spotpatch-logo-mark.svg; safe to inline in Shadow DOM. */\nexport function createBrandMark(document: Document, content?: string): SVGSVGElement {\n const resolved = resolveBrandMarkContent(content);\n const svg = svgElement(document, \"svg\", {\n xmlns: SVG_NAMESPACE,\n class: \"spotpatch-brand-mark\",\n viewBox: resolved.viewBox,\n \"aria-hidden\": \"true\",\n focusable: \"false\",\n });\n svg.innerHTML = resolved.content;\n return svg;\n}\n","import type {\n ComponentDataFlowReport,\n NetworkObservation,\n PageDataFlowReport,\n SpotPatchLocale,\n} from \"@spotpatch/shared\";\n\nimport type { DataFlowComponentRegistration } from \"../data-flow/data-flow-runtime.js\";\n\nexport type DataFlowPanelStatus = \"disabled\" | \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport interface DataFlowPanelSnapshot {\n readonly status: DataFlowPanelStatus;\n readonly report?: ComponentDataFlowReport | PageDataFlowReport;\n readonly message?: string;\n}\n\nexport interface DataFlowViewState {\n readonly component: DataFlowPanelSnapshot;\n readonly page: DataFlowPanelSnapshot;\n readonly observationCount: number;\n}\n\nexport interface DataFlowPanel {\n readonly root: HTMLElement;\n readonly refreshButton: HTMLButtonElement;\n readonly styles: HTMLStyleElement;\n readonly dispose: () => void;\n readonly render: (state: DataFlowViewState) => void;\n readonly resetView: () => void;\n}\n\nexport type DataFlowPanelFactory = (\n document: Document,\n enabled: boolean,\n locale: () => SpotPatchLocale,\n changesRoot: HTMLElement,\n diagnosticsRoot: HTMLElement,\n onViewChange: () => void,\n) => DataFlowPanel;\n\nexport interface DataFlowExtension {\n readonly createPanel: DataFlowPanelFactory;\n readonly getComponentRegistration: (\n component: object,\n ) => DataFlowComponentRegistration | undefined;\n readonly observations: (routeKey: string) => readonly NetworkObservation[];\n readonly mergeComponentReport: (\n report: ComponentDataFlowReport,\n observations: readonly NetworkObservation[],\n ) => ComponentDataFlowReport;\n readonly mergePageReport: (\n report: PageDataFlowReport,\n observations: readonly NetworkObservation[],\n ) => PageDataFlowReport;\n}\n\nconst DATA_FLOW_EXTENSION_KEY = Symbol.for(\"spotpatch.data-flow.extension.v1\");\ntype ExtensionStore = Partial<Record<symbol, DataFlowExtension>>;\n\nexport function registerDataFlowExtension(\n extension: DataFlowExtension,\n target: ExtensionStore = globalThis,\n): void {\n target[DATA_FLOW_EXTENSION_KEY] = extension;\n}\n\nexport function getDataFlowExtension(\n target: ExtensionStore = globalThis,\n): DataFlowExtension | undefined {\n return target[DATA_FLOW_EXTENSION_KEY];\n}\n","import type { ElementRect } from \"../picker/geometry.js\";\n\nexport type DialogPlacementMode =\n \"above\" | \"below\" | \"center\" | \"left\" | \"right\" | \"viewport\";\n\nexport interface DialogPlacement {\n readonly anchorX: number;\n readonly anchorY: number;\n readonly left: number;\n readonly mode: DialogPlacementMode;\n readonly top: number;\n}\n\nexport interface DialogPlacementInput {\n readonly dialogHeight: number;\n readonly dialogWidth: number;\n readonly target?: ElementRect;\n readonly viewportHeight: number;\n readonly viewportWidth: number;\n}\n\nconst VIEWPORT_MARGIN = 16;\nconst TARGET_GAP = 14;\nconst TARGET_INSET = 24;\nconst ANCHOR_INSET = 22;\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(Math.max(value, minimum), Math.max(minimum, maximum));\n}\n\nexport function calculateDialogPlacement({\n dialogHeight,\n dialogWidth,\n target,\n viewportHeight,\n viewportWidth,\n}: DialogPlacementInput): DialogPlacement {\n const maxLeft = viewportWidth - dialogWidth - VIEWPORT_MARGIN;\n const maxTop = viewportHeight - dialogHeight - VIEWPORT_MARGIN;\n const viewportLeft = clamp(\n (viewportWidth - dialogWidth) / 2,\n VIEWPORT_MARGIN,\n maxLeft,\n );\n const viewportTop = clamp(\n (viewportHeight - dialogHeight) / 2,\n VIEWPORT_MARGIN,\n maxTop,\n );\n\n if (target === undefined) {\n return Object.freeze({\n anchorX: clamp(dialogWidth / 2, ANCHOR_INSET, dialogWidth - ANCHOR_INSET),\n anchorY: clamp(dialogHeight / 2, ANCHOR_INSET, dialogHeight - ANCHOR_INSET),\n left: viewportLeft,\n mode: \"viewport\",\n top: viewportTop,\n });\n }\n\n const targetCenterX = target.x + target.width / 2;\n const targetCenterY = target.y + target.height / 2;\n const centeredLeft = clamp(targetCenterX - dialogWidth / 2, VIEWPORT_MARGIN, maxLeft);\n const centeredTop = clamp(targetCenterY - dialogHeight / 2, VIEWPORT_MARGIN, maxTop);\n let left = centeredLeft;\n let top = centeredTop;\n let mode: DialogPlacementMode = \"viewport\";\n\n if (\n target.width >= dialogWidth + TARGET_INSET * 2 &&\n target.height >= dialogHeight + TARGET_INSET * 2\n ) {\n mode = \"center\";\n } else if (target.y - dialogHeight - TARGET_GAP >= VIEWPORT_MARGIN) {\n top = target.y - dialogHeight - TARGET_GAP;\n mode = \"above\";\n } else if (\n target.y + target.height + TARGET_GAP + dialogHeight <=\n viewportHeight - VIEWPORT_MARGIN\n ) {\n top = target.y + target.height + TARGET_GAP;\n mode = \"below\";\n } else if (\n target.x + target.width + TARGET_GAP + dialogWidth <=\n viewportWidth - VIEWPORT_MARGIN\n ) {\n left = target.x + target.width + TARGET_GAP;\n mode = \"right\";\n } else if (target.x - dialogWidth - TARGET_GAP >= VIEWPORT_MARGIN) {\n left = target.x - dialogWidth - TARGET_GAP;\n mode = \"left\";\n }\n\n return Object.freeze({\n anchorX: clamp(targetCenterX - left, ANCHOR_INSET, dialogWidth - ANCHOR_INSET),\n anchorY: clamp(targetCenterY - top, ANCHOR_INSET, dialogHeight - ANCHOR_INSET),\n left,\n mode,\n top,\n });\n}\n","import type {\n ErrorCode,\n ExternalAgentControlStatus,\n ExternalAgentManagedResult,\n ExternalHandoffCapability,\n ExternalHandoffPublishResult,\n ExternalHandoffStatusResult,\n ExternalHandoffFramework,\n SpotAnnotation,\n SpotPatchLocale,\n} from \"@spotpatch/shared/external-handoff-browser\";\n\nexport interface ExternalHandoffPanel {\n readonly cancelManagedButton: HTMLButtonElement;\n readonly connectButton: HTMLButtonElement;\n readonly disconnectButton: HTMLButtonElement;\n readonly refreshButton: HTMLButtonElement;\n readonly root: HTMLElement;\n readonly sendButton: HTMLButtonElement;\n readonly styles: HTMLStyleElement;\n readonly confirmDisclosure: (annotation: SpotAnnotation) => Promise<boolean>;\n readonly dispose: () => void;\n readonly renderCapability: (capability: ExternalHandoffCapability) => void;\n readonly renderControlUnavailable: () => void;\n readonly renderControlStatus: (status: ExternalAgentControlStatus) => void;\n readonly renderError: (code?: ErrorCode, retryable?: boolean) => void;\n readonly renderPublishResult: (result: ExternalHandoffPublishResult) => void;\n readonly renderPublishing: () => void;\n readonly renderManagedResult: (result: ExternalAgentManagedResult) => void;\n readonly renderStatus: (result: ExternalHandoffStatusResult) => void;\n readonly resolveButton: HTMLButtonElement;\n readonly revokeButton: HTMLButtonElement;\n readonly setBusy: (busy: boolean) => void;\n readonly setControlBusy: (busy: boolean) => void;\n readonly setContextReady: (ready: boolean) => void;\n readonly setSelectionVisible: (visible: boolean) => void;\n}\n\nexport interface ExternalHandoffWorkflow {\n readonly cancelPending: () => void;\n readonly dispose: () => void;\n readonly mount: () => void;\n}\n\nexport interface ExternalHandoffExtension {\n readonly createPanel: (\n document: Document,\n framework: ExternalHandoffFramework,\n locale: () => SpotPatchLocale,\n sessionId: string,\n subscribeLocale: (listener: () => void) => () => void,\n onViewChange: () => void,\n ) => ExternalHandoffPanel;\n readonly createWorkflow: (\n fetch: typeof globalThis.fetch,\n panel: ExternalHandoffPanel,\n selectedAnnotation: () => SpotAnnotation | undefined,\n sessionToken: string,\n window: Window,\n ) => ExternalHandoffWorkflow;\n}\n\nconst EXTERNAL_HANDOFF_EXTENSION_KEY = Symbol.for(\"spotpatch.external-handoff.v1\");\ntype ExtensionStore = Partial<Record<symbol, ExternalHandoffExtension>>;\n\nexport function registerExternalHandoffExtension(\n extension: ExternalHandoffExtension,\n): void {\n (globalThis as ExtensionStore)[EXTERNAL_HANDOFF_EXTENSION_KEY] = extension;\n}\n\nexport function getExternalHandoffExtension(): ExternalHandoffExtension | undefined {\n return (globalThis as ExtensionStore)[EXTERNAL_HANDOFF_EXTENSION_KEY];\n}\n","import {\n ERROR_CODES,\n type AgentJobStatus,\n type ErrorCode,\n type SpotPatchLocale,\n type SpotPatchLocalePreference,\n} from \"@spotpatch/shared\";\n\nimport type { SelectionSummaryMessages } from \"./selection-summary.js\";\n\nexport interface UiMessages {\n readonly localeName: string;\n readonly alternateLocaleName: string;\n readonly switchLocale: string;\n readonly brand: Readonly<{\n name: string;\n context: string;\n repository: string;\n repositoryTitle: string;\n }>;\n readonly trigger: Readonly<{\n select: string;\n stop: string;\n title: (shortcut: string) => string;\n }>;\n readonly dialog: Readonly<{\n close: string;\n editTitle: string;\n editSubtitle: string;\n previewTitle: string;\n previewSubtitle: string;\n }>;\n readonly context: Readonly<{\n collecting: string;\n ready: string;\n partial: string;\n sourceUnavailable: string;\n selectedElement: string;\n selectedCount: (count: number) => string;\n }>;\n readonly targets: Readonly<{\n title: string;\n ariaLabel: string;\n count: (selected: number, maximum: number) => string;\n complete: (complete: number, total: number) => string;\n instructionBudget: (used: number, maximum: number) => string;\n instructionBudgetExceeded: (used: number, maximum: number) => string;\n statusReady: string;\n statusPartial: string;\n statusCollecting: string;\n instructionReady: string;\n instructionMissing: string;\n instructionLabel: (name: string) => string;\n instructionPlaceholder: string;\n instructionCount: (used: number, maximum: number) => string;\n activate: (index: number) => string;\n remove: (index: number) => string;\n removeTitle: string;\n addTitle: string;\n limitTitle: (maximum: number) => string;\n }>;\n readonly diagnostics: Readonly<{\n title: string;\n resolving: string;\n noExactSource: string;\n promptAriaLabel: string;\n }>;\n readonly summary: SelectionSummaryMessages;\n readonly actions: Readonly<{\n addElement: string;\n reselect: string;\n openEditor: string;\n openTarget: (index: number) => string;\n preview: string;\n copy: string;\n back: string;\n }>;\n readonly agent: Readonly<{\n title: string;\n mode: string;\n review: string;\n autoGated: string;\n trustedFast: string;\n provider: string;\n model: string;\n providerAriaLabel: string;\n modelAriaLabel: string;\n providerUnavailable: string;\n consent: (provider: string) => string;\n trustedFastConsent: (provider: string) => string;\n connectionNotTested: string;\n workspaceNotChecked: string;\n checkingWorkspace: string;\n workspaceReady: string;\n workspaceDirty: (staged: number, unstaged: number, untracked: number) => string;\n includeLocalChanges: string;\n includeLocalChangesHelp: string;\n localChangesConsentRequired: string;\n capabilityVerified: string;\n capabilityVerifiedAnnouncement: string;\n testingCapability: string;\n applying: string;\n cancelling: string;\n reverting: string;\n consentRequired: string;\n toolsReady: string;\n testConnection: string;\n verifying: string;\n run: string;\n cancel: string;\n discard: string;\n apply: string;\n revert: string;\n revise: string;\n diffAriaLabel: string;\n noOutput: string;\n status: (status: AgentJobStatus) => string;\n }>;\n readonly announcements: Readonly<{\n adapterDisabled: string;\n selectionEnabled: string;\n chooseAnother: string;\n reselectAfterChange: string;\n sourceLoaded: string;\n sourceFailed: string;\n addCancelled: string;\n selectionLimit: (maximum: number) => string;\n chooseAdditional: (selected: number, maximum: number) => string;\n duplicate: string;\n sourceProbable: string;\n sourceMissing: string;\n noSelectable: string;\n allTargetsRemoved: string;\n targetRemoved: string;\n detachedTargetPreserved: string;\n contextWarning: string;\n contextCollected: string;\n editorOpening: string;\n editorOpened: string;\n editorFailed: string;\n completeInstructions: string;\n promptCopied: string;\n clipboardUnavailable: string;\n copyFailed: string;\n appliedTargetsDetached: string;\n }>;\n readonly errors: Readonly<Record<ErrorCode, string>>;\n}\n\nconst STATUS_EN: Readonly<Record<AgentJobStatus, string>> = Object.freeze({\n queued: \"Queued\",\n preparing: \"Preparing\",\n running: \"Running\",\n validating: \"Validating\",\n \"awaiting-review\": \"Awaiting review\",\n applying: \"Applying\",\n applied: \"Applied\",\n completed: \"Completed\",\n cancelling: \"Cancelling\",\n cancelled: \"Cancelled\",\n reverting: \"Reverting\",\n reverted: \"Reverted\",\n failed: \"Failed\",\n});\n\nconst STATUS_ZH: Readonly<Record<AgentJobStatus, string>> = Object.freeze({\n queued: \"已排队\",\n preparing: \"准备中\",\n running: \"执行中\",\n validating: \"验证中\",\n \"awaiting-review\": \"等待审阅\",\n applying: \"应用中\",\n applied: \"已应用\",\n completed: \"已完成\",\n cancelling: \"取消中\",\n cancelled: \"已取消\",\n reverting: \"撤销中\",\n reverted: \"已撤销\",\n failed: \"失败\",\n});\n\nconst EXTERNAL_HANDOFF_ERROR_EN = \"The external Agent handoff request failed.\";\nconst EXTERNAL_HANDOFF_ERROR_ZH = \"外部 Agent 交接请求失败。\";\n\nconst ERROR_MESSAGES_EN = Object.freeze({\n [ERROR_CODES.INVALID_REQUEST]: \"The Agent request was rejected as invalid.\",\n [ERROR_CODES.INVALID_TOKEN]: \"The local SpotPatch session expired.\",\n [ERROR_CODES.ORIGIN_NOT_ALLOWED]: \"The current page origin is not authorized.\",\n [ERROR_CODES.SOURCE_NOT_FOUND]: \"The selected source is no longer available.\",\n [ERROR_CODES.SOURCE_OUTSIDE_ROOT]: \"The selected source is outside the project.\",\n [ERROR_CODES.SOURCE_TOO_LARGE]: \"The selected source exceeds the safety limit.\",\n [ERROR_CODES.EDITOR_OPEN_FAILED]: \"The editor request failed.\",\n [ERROR_CODES.DATA_FLOW_DISABLED]: \"Component data-flow analysis is disabled.\",\n [ERROR_CODES.DATA_FLOW_SOURCE_STALE]:\n \"The selected source changed. Select the component again.\",\n [ERROR_CODES.DATA_FLOW_ANALYSIS_CANCELLED]:\n \"Component data-flow analysis was cancelled.\",\n [ERROR_CODES.AI_DISABLED]: \"AI execution is disabled in Vite configuration.\",\n [ERROR_CODES.PROVIDER_NOT_CONFIGURED]:\n \"The provider Key environment variable is missing on the Vite process.\",\n [ERROR_CODES.PROVIDER_AUTH_FAILED]:\n \"The provider rejected authentication. Check the server-side Key.\",\n [ERROR_CODES.PROVIDER_PROTOCOL_UNSUPPORTED]:\n \"The relay does not match the configured OpenAI-compatible protocol.\",\n [ERROR_CODES.MODEL_NOT_ALLOWED]: \"The selected model profile is not allowed.\",\n [ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED]:\n \"The selected model did not start or continue the required tool call.\",\n [ERROR_CODES.PROVIDER_RATE_LIMITED]:\n \"The provider is rate limited. Wait and try again.\",\n [ERROR_CODES.AGENT_BUSY]: \"Another write Agent job is still active.\",\n [ERROR_CODES.AGENT_LIMIT_EXCEEDED]:\n \"The Agent stopped at a configured time, turn, output, or size limit.\",\n [ERROR_CODES.AGENT_CANCELLED]: \"The Agent job was cancelled.\",\n [ERROR_CODES.EXTERNAL_HANDOFF_DISABLED]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.HANDOFF_VALIDATION_FAILED]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.HANDOFF_SOURCE_STALE]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.HANDOFF_NOT_FOUND]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.HANDOFF_EXPIRED]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.HANDOFF_CURSOR_INVALID]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.BRIDGE_UNAUTHORIZED]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.BRIDGE_BUSY]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.EXTERNAL_AGENT_BUSY]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.ACTIVE_ADAPTER_CONFLICT]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.ACTIVE_DISPATCH_INVALID]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.SESSION_NOT_FOUND]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.SESSION_AMBIGUOUS]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.SESSION_CLOSED]: EXTERNAL_HANDOFF_ERROR_EN,\n [ERROR_CODES.WORKTREE_DIRTY]: \"Confirm inclusion of local changes before running AI.\",\n [ERROR_CODES.WORKTREE_NOT_REPOSITORY]:\n \"Vite root must be an initialized Git repository root.\",\n [ERROR_CODES.WORKTREE_OPERATION_IN_PROGRESS]:\n \"Finish the active merge, rebase, cherry-pick, or revert.\",\n [ERROR_CODES.WORKTREE_CONFLICTED]: \"Resolve all Git conflicts before running AI.\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_TOO_LARGE]:\n \"Reduce untracked files below the safe count and size limits.\",\n [ERROR_CODES.WORKTREE_UNTRACKED_UNSUPPORTED]:\n \"An untracked path is missing, linked, or not a regular file.\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_UNSUPPORTED]:\n \"Local changes cannot be isolated safely.\",\n [ERROR_CODES.TOOL_DENIED]: \"A tool request violated local safety policy.\",\n [ERROR_CODES.TOOL_INPUT_INVALID]: \"Invalid tool request.\",\n [ERROR_CODES.TOOL_ARGUMENTS_INVALID]: \"Tool arguments are invalid.\",\n [ERROR_CODES.TOOL_CALL_ID_CONFLICT]: \"Tool ID conflicts in this turn.\",\n [ERROR_CODES.TOOL_PATH_DENIED]: \"The model requested a protected or external path.\",\n [ERROR_CODES.PATCH_REJECTED]: \"The patch violated local policy.\",\n [ERROR_CODES.VALIDATION_FAILED]: \"Required checks failed; changes cannot be applied.\",\n [ERROR_CODES.APPLY_CONFLICT]: \"Agent-touched files changed; nothing was overwritten.\",\n [ERROR_CODES.INTERNAL_ERROR]: \"The Agent failed without exposing private details.\",\n} satisfies Record<ErrorCode, string>);\n\nconst ERROR_MESSAGES_ZH = Object.freeze({\n [ERROR_CODES.INVALID_REQUEST]: \"Agent 请求无效,已被拒绝。\",\n [ERROR_CODES.INVALID_TOKEN]: \"本地 SpotPatch 会话已失效。\",\n [ERROR_CODES.ORIGIN_NOT_ALLOWED]: \"当前页面来源未获授权。\",\n [ERROR_CODES.SOURCE_NOT_FOUND]: \"选中目标对应的源码已不可用。\",\n [ERROR_CODES.SOURCE_OUTSIDE_ROOT]: \"选中源码位于项目根目录之外。\",\n [ERROR_CODES.SOURCE_TOO_LARGE]: \"选中源码超过安全大小限制。\",\n [ERROR_CODES.EDITOR_OPEN_FAILED]: \"编辑器打开请求失败。\",\n [ERROR_CODES.DATA_FLOW_DISABLED]: \"组件数据链路分析未启用。\",\n [ERROR_CODES.DATA_FLOW_SOURCE_STALE]: \"选中源码已经变化,请重新选择组件。\",\n [ERROR_CODES.DATA_FLOW_ANALYSIS_CANCELLED]: \"组件数据链路分析已取消。\",\n [ERROR_CODES.AI_DISABLED]: \"Vite 配置未启用 AI 执行。\",\n [ERROR_CODES.PROVIDER_NOT_CONFIGURED]:\n \"启动 Vite 的进程中缺少模型服务 Key 环境变量。\",\n [ERROR_CODES.PROVIDER_AUTH_FAILED]: \"模型服务鉴权失败,请检查服务端 Key。\",\n [ERROR_CODES.PROVIDER_PROTOCOL_UNSUPPORTED]:\n \"中转服务与配置的 OpenAI 兼容协议不一致。\",\n [ERROR_CODES.MODEL_NOT_ALLOWED]: \"当前模型配置未获授权。\",\n [ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED]: \"当前模型未完成必要的工具调用或结果续接。\",\n [ERROR_CODES.PROVIDER_RATE_LIMITED]: \"模型服务正在限流,请稍后重试。\",\n [ERROR_CODES.AGENT_BUSY]: \"当前项目已有一个写入任务正在运行。\",\n [ERROR_CODES.AGENT_LIMIT_EXCEEDED]: \"Agent 达到时间、轮次、输出或变更规模限制。\",\n [ERROR_CODES.AGENT_CANCELLED]: \"Agent 任务已取消。\",\n [ERROR_CODES.EXTERNAL_HANDOFF_DISABLED]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.HANDOFF_VALIDATION_FAILED]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.HANDOFF_SOURCE_STALE]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.HANDOFF_NOT_FOUND]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.HANDOFF_EXPIRED]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.HANDOFF_CURSOR_INVALID]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.BRIDGE_UNAUTHORIZED]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.BRIDGE_BUSY]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.EXTERNAL_AGENT_BUSY]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.ACTIVE_ADAPTER_CONFLICT]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.ACTIVE_DISPATCH_INVALID]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.SESSION_NOT_FOUND]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.SESSION_AMBIGUOUS]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.SESSION_CLOSED]: EXTERNAL_HANDOFF_ERROR_ZH,\n [ERROR_CODES.WORKTREE_DIRTY]: \"运行 AI 前,请明确同意将当前本地修改纳入隔离基线。\",\n [ERROR_CODES.WORKTREE_NOT_REPOSITORY]: \"Vite 根目录不是已初始化 Git 仓库的顶层目录。\",\n [ERROR_CODES.WORKTREE_OPERATION_IN_PROGRESS]:\n \"请先完成当前 merge、rebase、cherry-pick 或 revert,再运行 AI。\",\n [ERROR_CODES.WORKTREE_CONFLICTED]: \"请先解决全部 Git 冲突,再运行 AI。\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_TOO_LARGE]:\n \"未跟踪文件超过安全数量或体积上限,请先精简。\",\n [ERROR_CODES.WORKTREE_UNTRACKED_UNSUPPORTED]:\n \"未跟踪项已丢失、是符号链接或不是普通文件。\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_UNSUPPORTED]: \"当前本地修改无法安全隔离。\",\n [ERROR_CODES.TOOL_DENIED]: \"工具请求违反本地安全策略。\",\n [ERROR_CODES.TOOL_INPUT_INVALID]: \"工具请求无效。\",\n [ERROR_CODES.TOOL_ARGUMENTS_INVALID]: \"工具参数无效。\",\n [ERROR_CODES.TOOL_CALL_ID_CONFLICT]: \"本轮工具 ID 冲突。\",\n [ERROR_CODES.TOOL_PATH_DENIED]: \"模型请求了受保护或项目外路径。\",\n [ERROR_CODES.PATCH_REJECTED]: \"补丁违反本地策略。\",\n [ERROR_CODES.VALIDATION_FAILED]: \"必需检查失败,无法应用变更。\",\n [ERROR_CODES.APPLY_CONFLICT]: \"Agent 触及文件已变化,未覆盖。\",\n [ERROR_CODES.INTERNAL_ERROR]: \"Agent 失败,未暴露私有细节。\",\n} satisfies Record<ErrorCode, string>);\n\nconst SUMMARY_MESSAGES_EN = Object.freeze({\n adapter: \"React adapter\",\n api: \"API\",\n apiStatuses: Object.freeze({\n connected: \"connected\",\n failed: \"failed\",\n loading: \"loading\",\n \"not-required\": \"not required\",\n }),\n available: \"available\",\n boundary: \"Boundary\",\n boundaries: Object.freeze({\n component: \"component\",\n \"nearby-lines\": \"nearby lines\",\n }),\n browserContext: \"Browser context\",\n collectionStatuses: Object.freeze({\n failed: \"failed\",\n loading: \"loading\",\n ready: \"ready\",\n }),\n component: \"Component\",\n confidence: \"Confidence\",\n confidenceLabels: Object.freeze({\n exact: \"exact element source\",\n probable: \"probable owning component\",\n approximate: \"nearest business container\",\n unknown: \"source not found\",\n }),\n cssWarnings: \"CSS warnings\",\n lineLocation: (line: number, column?: number) =>\n `line ${String(line)}${column === undefined ? \"\" : `, column ${String(column)}`}`,\n origin: \"Origin\",\n source: \"Source\",\n sourceContext: \"Source context\",\n stack: \"Stack\",\n target: (index: number, active: boolean) =>\n `Target ${String(index)}${active ? \" (active)\" : \"\"}`,\n unavailable: \"unavailable\",\n unsupported: \"unsupported\",\n warning: \"Warning\",\n} satisfies SelectionSummaryMessages);\n\nconst SUMMARY_MESSAGES_ZH = Object.freeze({\n adapter: \"React 适配器\",\n api: \"API\",\n apiStatuses: Object.freeze({\n connected: \"已连接\",\n failed: \"失败\",\n loading: \"加载中\",\n \"not-required\": \"无需请求\",\n }),\n available: \"可用\",\n boundary: \"代码边界\",\n boundaries: Object.freeze({\n component: \"完整组件\",\n \"nearby-lines\": \"附近代码\",\n }),\n browserContext: \"浏览器上下文\",\n collectionStatuses: Object.freeze({\n failed: \"失败\",\n loading: \"采集中\",\n ready: \"已就绪\",\n }),\n component: \"组件\",\n confidence: \"置信度\",\n confidenceLabels: Object.freeze({\n exact: \"精确元素源码\",\n probable: \"可能的所属组件\",\n approximate: \"最近业务容器\",\n unknown: \"未找到源码\",\n }),\n cssWarnings: \"CSS 警告\",\n lineLocation: (line: number, column?: number) =>\n `第 ${String(line)} 行${column === undefined ? \"\" : `,第 ${String(column)} 列`}`,\n origin: \"定位来源\",\n source: \"源码\",\n sourceContext: \"源码上下文\",\n stack: \"组件栈\",\n target: (index: number, active: boolean) =>\n `目标 ${String(index)}${active ? \"(当前)\" : \"\"}`,\n unavailable: \"不可用\",\n unsupported: \"不支持\",\n warning: \"警告\",\n} satisfies SelectionSummaryMessages);\n\nexport const UI_MESSAGES = Object.freeze({\n \"en-US\": Object.freeze({\n localeName: \"EN\",\n alternateLocaleName: \"中\",\n switchLocale: \"Switch interface language to Chinese\",\n brand: Object.freeze({\n name: \"SpotPatch\",\n context: \"Live context\",\n repository: \"GitHub ↗\",\n repositoryTitle: \"Star SpotPatch on GitHub\",\n }),\n trigger: Object.freeze({\n select: \"Select element\",\n stop: \"Stop selecting\",\n title: (shortcut: string) => `Toggle SpotPatch (${shortcut})`,\n }),\n dialog: Object.freeze({\n close: \"Close SpotPatch\",\n editTitle: \"Plan the change\",\n editSubtitle: \"Give each selected target its own precise instruction.\",\n previewTitle: \"Review the request\",\n previewSubtitle: \"Verify the complete context before it leaves the browser.\",\n }),\n context: Object.freeze({\n collecting: \"Collecting context\",\n ready: \"Context ready\",\n partial: \"Partial context\",\n sourceUnavailable: \"Source unavailable\",\n selectedElement: \"Selected element\",\n selectedCount: (count: number) => `${String(count)} elements selected`,\n }),\n targets: Object.freeze({\n title: \"Selected targets\",\n ariaLabel: \"Selected targets and change instructions\",\n count: (selected: number, maximum: number) =>\n `${String(selected)} of ${String(maximum)}`,\n complete: (complete: number, total: number) =>\n `${String(complete)} of ${String(total)} described`,\n instructionBudget: (used: number, maximum: number) =>\n `${String(used)} / ${String(maximum)} characters`,\n instructionBudgetExceeded: (used: number, maximum: number) =>\n `${String(used)} / ${String(maximum)} characters — reduce the request`,\n statusReady: \"Ready\",\n statusPartial: \"Partial\",\n statusCollecting: \"Collecting\",\n instructionReady: \"Instruction added\",\n instructionMissing: \"Needs instruction\",\n instructionLabel: (name: string) => `Change for ${name}`,\n instructionPlaceholder:\n \"Describe the desired result for this target, including constraints…\",\n instructionCount: (used: number, maximum: number) =>\n `${String(used)} / ${String(maximum)}`,\n activate: (index: number) => `Edit target ${String(index)}`,\n remove: (index: number) => `Remove target ${String(index)}`,\n removeTitle: \"Remove target\",\n addTitle: \"Add another element to this request\",\n limitTitle: (maximum: number) => `Selection limit reached (${String(maximum)})`,\n }),\n diagnostics: Object.freeze({\n title: \"Captured context\",\n resolving: \"Resolving source…\",\n noExactSource: \"No exact source marker\",\n promptAriaLabel: \"Generated prompt\",\n }),\n summary: SUMMARY_MESSAGES_EN,\n actions: Object.freeze({\n addElement: \"Add element\",\n reselect: \"Start over\",\n openEditor: \"Open source\",\n openTarget: (index: number) => `Open source for target ${String(index)}`,\n preview: \"Preview prompt\",\n copy: \"Copy prompt\",\n back: \"Back to edit\",\n }),\n agent: Object.freeze({\n title: \"AI code agent\",\n mode: \"Execution mode\",\n review: \"Review\",\n autoGated: \"Auto gated\",\n trustedFast: \"Trusted direct\",\n provider: \"Provider\",\n model: \"Model\",\n providerAriaLabel: \"AI provider\",\n modelAriaLabel: \"AI model\",\n providerUnavailable: \"Provider configuration is unavailable.\",\n consent: (provider: string) =>\n `I understand selected context and allowed source may be sent to ${provider}; its data policy is my responsibility.`,\n trustedFastConsent: (provider: string) =>\n `Enable trusted direct mode for ${provider}: send allowed project context, include current local changes, skip project validation checks, and immediately apply AI changes, including file deletions and configuration changes.`,\n connectionNotTested: \"Optional connection check not run\",\n workspaceNotChecked: \"Local workspace not checked\",\n checkingWorkspace: \"Checking Git workspace and isolated execution…\",\n workspaceReady: \"Local workspace is ready for isolated execution\",\n workspaceDirty: (staged: number, unstaged: number, untracked: number) =>\n `Local changes found · ${String(staged)} staged · ${String(unstaged)} unstaged · ${String(untracked)} untracked`,\n includeLocalChanges: \"Allow the Agent to continue from my current local changes\",\n includeLocalChangesHelp:\n \"The Agent may edit these files. SpotPatch preserves the baseline and applies or reverts only the Agent delta.\",\n localChangesConsentRequired:\n \"Confirm inclusion of current local changes before running AI.\",\n capabilityVerified: \"Agent capability verified\",\n capabilityVerifiedAnnouncement: \"AI provider capability verified.\",\n testingCapability: \"Testing authentication, tools, continuation, and streaming…\",\n applying: \"Applying changes to the project.\",\n cancelling: \"Cancelling Agent job.\",\n reverting: \"Reverting the applied Agent change.\",\n consentRequired: \"Confirm remote provider data transmission before running AI.\",\n toolsReady: \"tools and streaming ready\",\n testConnection: \"Check environment\",\n verifying: \"Verifying…\",\n run: \"Run AI\",\n cancel: \"Cancel agent\",\n discard: \"Discard changes\",\n apply: \"Apply changes\",\n revert: \"Revert changes\",\n revise: \"Revise request\",\n diffAriaLabel: \"Proposed source diff\",\n noOutput: \"No output.\",\n status: (status: AgentJobStatus) => STATUS_EN[status],\n }),\n announcements: Object.freeze({\n adapterDisabled: \"React inspection was disabled after an adapter failure.\",\n selectionEnabled: \"Element selection enabled.\",\n chooseAnother: \"Choose another element.\",\n reselectAfterChange: \"Choose the current elements again after the file change.\",\n sourceLoaded: \"Source context loaded.\",\n sourceFailed: \"Source context could not be loaded.\",\n addCancelled: \"Additional selection cancelled.\",\n selectionLimit: (maximum: number) =>\n `The selection limit of ${String(maximum)} elements has been reached.`,\n chooseAdditional: (selected: number, maximum: number) =>\n `Choose another element. ${String(selected)} of ${String(maximum)} selected.`,\n duplicate: \"That source target is already selected.\",\n sourceProbable:\n \"A probable React component was found without an authorized file token.\",\n sourceMissing: \"No authorized source marker was found for the selected element.\",\n noSelectable: \"No selectable element was found.\",\n allTargetsRemoved: \"All targets were removed. Choose an element to continue.\",\n targetRemoved: \"Selected target removed.\",\n detachedTargetPreserved:\n \"The page element was unloaded; its collected context remains selected.\",\n contextWarning: \"Browser context collection completed with a warning.\",\n contextCollected: \"Browser context collected.\",\n editorOpening: \"Opening source…\",\n editorOpened: \"Source opened in the editor.\",\n editorFailed: \"Could not open the editor. Start it or configure editor.\",\n completeInstructions:\n \"Add an instruction for every target and wait for context collection to finish.\",\n promptCopied: \"Prompt copied to the clipboard.\",\n clipboardUnavailable:\n \"Clipboard access is unavailable. Select the prompt manually.\",\n copyFailed: \"Copy failed. Select the prompt manually.\",\n appliedTargetsDetached:\n \"Changes applied. Reselect page elements after HMR before creating another request.\",\n }),\n errors: ERROR_MESSAGES_EN,\n }),\n \"zh-CN\": Object.freeze({\n localeName: \"中\",\n alternateLocaleName: \"EN\",\n switchLocale: \"将界面语言切换为英文\",\n brand: Object.freeze({\n name: \"SpotPatch\",\n context: \"实时上下文\",\n repository: \"GitHub ↗\",\n repositoryTitle: \"在 GitHub 上 Star SpotPatch\",\n }),\n trigger: Object.freeze({\n select: \"选择元素\",\n stop: \"停止选择\",\n title: (shortcut: string) => `切换 SpotPatch(${shortcut})`,\n }),\n dialog: Object.freeze({\n close: \"关闭 SpotPatch\",\n editTitle: \"规划本次修改\",\n editSubtitle: \"为每个选中目标分别写清楚修改要求。\",\n previewTitle: \"审阅修改请求\",\n previewSubtitle: \"发送给 AI 前,请核对完整上下文与每项目标说明。\",\n }),\n context: Object.freeze({\n collecting: \"正在采集上下文\",\n ready: \"上下文已就绪\",\n partial: \"部分上下文可用\",\n sourceUnavailable: \"源码位置不可用\",\n selectedElement: \"已选元素\",\n selectedCount: (count: number) => `已选择 ${String(count)} 个元素`,\n }),\n targets: Object.freeze({\n title: \"修改目标\",\n ariaLabel: \"已选目标与逐项目标说明\",\n count: (selected: number, maximum: number) =>\n `${String(selected)} / ${String(maximum)}`,\n complete: (complete: number, total: number) =>\n `已描述 ${String(complete)} / ${String(total)}`,\n instructionBudget: (used: number, maximum: number) =>\n `说明字符 ${String(used)} / ${String(maximum)}`,\n instructionBudgetExceeded: (used: number, maximum: number) =>\n `说明字符 ${String(used)} / ${String(maximum)},请精简后继续`,\n statusReady: \"已就绪\",\n statusPartial: \"部分可用\",\n statusCollecting: \"采集中\",\n instructionReady: \"已填写修改说明\",\n instructionMissing: \"待填写修改说明\",\n instructionLabel: (name: string) => `${name} 的修改说明`,\n instructionPlaceholder: \"描述这个目标期望达到的结果,以及不能破坏的约束……\",\n instructionCount: (used: number, maximum: number) =>\n `${String(used)} / ${String(maximum)}`,\n activate: (index: number) => `编辑目标 ${String(index)}`,\n remove: (index: number) => `移除目标 ${String(index)}`,\n removeTitle: \"移除目标\",\n addTitle: \"继续为本次请求选择元素\",\n limitTitle: (maximum: number) => `已达到 ${String(maximum)} 个目标的上限`,\n }),\n diagnostics: Object.freeze({\n title: \"已采集上下文\",\n resolving: \"正在解析源码……\",\n noExactSource: \"没有精确源码标记\",\n promptAriaLabel: \"生成的 Prompt\",\n }),\n summary: SUMMARY_MESSAGES_ZH,\n actions: Object.freeze({\n addElement: \"添加元素\",\n reselect: \"重新开始\",\n openEditor: \"打开源码\",\n openTarget: (index: number) => `打开目标 ${String(index)} 的源码`,\n preview: \"预览 Prompt\",\n copy: \"复制 Prompt\",\n back: \"返回编辑\",\n }),\n agent: Object.freeze({\n title: \"AI 代码 Agent\",\n mode: \"执行方式\",\n review: \"审阅模式\",\n autoGated: \"受控自动模式\",\n trustedFast: \"可信极速模式\",\n provider: \"模型服务\",\n model: \"模型\",\n providerAriaLabel: \"AI 模型服务\",\n modelAriaLabel: \"AI 模型\",\n providerUnavailable: \"模型服务配置不可用。\",\n consent: (provider: string) =>\n `我了解选中上下文与获准源码可能发送到 ${provider},并自行负责其数据策略。`,\n trustedFastConsent: (provider: string) =>\n `为 ${provider} 启用可信极速模式:发送获准的项目上下文、纳入当前本地修改、跳过项目验证检查,并立即应用 AI 变更,包括删除文件与配置变更。`,\n connectionNotTested: \"尚未执行可选连接检查\",\n workspaceNotChecked: \"尚未检查本地工作区\",\n checkingWorkspace: \"正在检查 Git 工作区与隔离执行环境……\",\n workspaceReady: \"本地工作区已满足隔离执行条件\",\n workspaceDirty: (staged: number, unstaged: number, untracked: number) =>\n `发现本地修改 · 暂存 ${String(staged)} · 未暂存 ${String(unstaged)} · 未跟踪 ${String(untracked)}`,\n includeLocalChanges: \"允许 Agent 基于我当前的本地修改继续\",\n includeLocalChangesHelp:\n \"Agent 可能继续修改这些文件;SpotPatch 会保留原基线,仅应用或撤销 Agent 自己的增量。\",\n localChangesConsentRequired: \"运行 AI 前,请确认允许纳入当前本地修改。\",\n capabilityVerified: \"Agent 能力验证通过\",\n capabilityVerifiedAnnouncement: \"AI 模型服务能力验证通过。\",\n testingCapability: \"正在验证鉴权、工具调用、连续调用与流式响应……\",\n applying: \"正在将变更应用到项目。\",\n cancelling: \"正在取消 Agent 任务。\",\n reverting: \"正在撤销已应用的 Agent 变更。\",\n consentRequired: \"运行 AI 前,请先确认允许向远程模型服务传输数据。\",\n toolsReady: \"工具调用与流式响应已就绪\",\n testConnection: \"检查运行环境\",\n verifying: \"验证中……\",\n run: \"运行 AI\",\n cancel: \"取消 Agent\",\n discard: \"放弃变更\",\n apply: \"应用变更\",\n revert: \"撤销变更\",\n revise: \"修改请求\",\n diffAriaLabel: \"建议的源码差异\",\n noOutput: \"没有输出。\",\n status: (status: AgentJobStatus) => STATUS_ZH[status],\n }),\n announcements: Object.freeze({\n adapterDisabled: \"React 适配器异常,本次会话已停用 React 检查。\",\n selectionEnabled: \"元素选择已启用。\",\n chooseAnother: \"请选择另一个元素。\",\n reselectAfterChange: \"文件变更后,请重新选择当前页面元素。\",\n sourceLoaded: \"源码上下文已加载。\",\n sourceFailed: \"源码上下文加载失败。\",\n addCancelled: \"已取消追加选择。\",\n selectionLimit: (maximum: number) =>\n `已达到 ${String(maximum)} 个元素的选择上限。`,\n chooseAdditional: (selected: number, maximum: number) =>\n `请选择另一个元素,当前已选 ${String(selected)} / ${String(maximum)}。`,\n duplicate: \"该源码目标已经在当前选择中。\",\n sourceProbable: \"找到可能的 React 组件,但没有获授权的源码标记。\",\n sourceMissing: \"选中元素没有获授权的源码标记。\",\n noSelectable: \"当前位置没有可选择的元素。\",\n allTargetsRemoved: \"已移除全部目标,请重新选择元素。\",\n targetRemoved: \"已移除选中目标。\",\n detachedTargetPreserved: \"页面元素已卸载,已采集的上下文仍保留在选择中。\",\n contextWarning: \"浏览器上下文采集完成,但存在警告。\",\n contextCollected: \"浏览器上下文采集完成。\",\n editorOpening: \"正在打开源码……\",\n editorOpened: \"源码已在编辑器中打开。\",\n editorFailed: \"无法打开编辑器。请先启动编辑器或检查 editor 配置。\",\n completeInstructions: \"请为每个目标填写修改说明,并等待上下文采集完成。\",\n promptCopied: \"Prompt 已复制到剪贴板。\",\n clipboardUnavailable: \"无法访问剪贴板,请手动选择并复制 Prompt。\",\n copyFailed: \"复制失败,请手动选择并复制 Prompt。\",\n appliedTargetsDetached: \"变更已应用;HMR 后请重新选择页面元素再发起新请求。\",\n }),\n errors: ERROR_MESSAGES_ZH,\n }),\n} satisfies Readonly<Record<SpotPatchLocale, UiMessages>>);\n\nexport interface UiLocalizer {\n readonly locale: () => SpotPatchLocale;\n readonly messages: () => UiMessages;\n readonly subscribe: (listener: () => void) => () => void;\n readonly toggle: () => void;\n}\n\nfunction localeFromLanguage(value: string | undefined): SpotPatchLocale | undefined {\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"zh\" || normalized.startsWith(\"zh-\")) {\n return \"zh-CN\";\n }\n\n return normalized === \"en\" || normalized.startsWith(\"en-\") ? \"en-US\" : undefined;\n}\n\nexport function resolveUiLocale(\n preference: SpotPatchLocalePreference,\n document: Document,\n): SpotPatchLocale {\n if (preference !== \"auto\") {\n return preference;\n }\n\n const documentLocale = localeFromLanguage(document.documentElement.lang);\n\n if (documentLocale !== undefined) {\n return documentLocale;\n }\n\n const navigatorLocale = document.defaultView?.navigator.languages\n .map(localeFromLanguage)\n .find((candidate): candidate is SpotPatchLocale => candidate !== undefined);\n return navigatorLocale ?? \"en-US\";\n}\n\nexport function createUiLocalizer(\n document: Document,\n preference: SpotPatchLocalePreference = \"auto\",\n): UiLocalizer {\n let currentLocale = resolveUiLocale(preference, document);\n const listeners = new Set<() => void>();\n\n return Object.freeze({\n locale: () => currentLocale,\n messages: () => UI_MESSAGES[currentLocale],\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n toggle(): void {\n currentLocale = currentLocale === \"en-US\" ? \"zh-CN\" : \"en-US\";\n\n for (const listener of listeners) {\n listener();\n }\n },\n });\n}\n","import type { CodeContext, SourceConfidence, StyleContext } from \"@spotpatch/shared\";\n\nimport type { ElementSourceResolution } from \"../source/source-resolver.js\";\n\nexport type ApiConnectionStatus = \"connected\" | \"failed\" | \"loading\" | \"not-required\";\nexport type CollectionStatus = \"failed\" | \"loading\" | \"ready\";\n\nexport interface SelectionSummaryInput {\n readonly apiStatus: ApiConnectionStatus;\n readonly code?: CodeContext;\n readonly collectionStatus: CollectionStatus;\n readonly framework: \"next\" | \"vite\";\n readonly frameworkVersion: string;\n readonly resolution: ElementSourceResolution;\n readonly spotPatchVersion: string;\n readonly styles?: StyleContext;\n}\n\nexport interface SelectionSummaryMessages {\n readonly available: string;\n readonly adapter: string;\n readonly api: string;\n readonly apiStatuses: Readonly<Record<ApiConnectionStatus, string>>;\n readonly boundary: string;\n readonly boundaries: Readonly<Record<CodeContext[\"boundary\"], string>>;\n readonly browserContext: string;\n readonly collectionStatuses: Readonly<Record<CollectionStatus, string>>;\n readonly component: string;\n readonly confidence: string;\n readonly confidenceLabels: Readonly<Record<SourceConfidence, string>>;\n readonly cssWarnings: string;\n readonly origin: string;\n readonly source: string;\n readonly sourceContext: string;\n readonly stack: string;\n readonly target: (index: number, active: boolean) => string;\n readonly unavailable: string;\n readonly unsupported: string;\n readonly warning: string;\n readonly lineLocation: (line: number, column?: number) => string;\n}\n\nfunction sourceLocation(\n resolution: ElementSourceResolution,\n context: CodeContext | undefined,\n messages: SelectionSummaryMessages,\n): string {\n const path = context?.relativePath ?? resolution.source.relativePath;\n const line = resolution.source.line;\n const column = resolution.source.column;\n\n if (path !== undefined && line !== undefined) {\n return `${path}:${String(line)}${column === undefined ? \"\" : `:${String(column)}`}`;\n }\n\n if (path !== undefined) {\n return path;\n }\n\n if (line !== undefined) {\n return messages.lineLocation(line, column);\n }\n\n return messages.unavailable;\n}\n\nexport function createSelectionSummary(\n input: SelectionSummaryInput,\n messages: SelectionSummaryMessages,\n): string {\n const lines = [\n `SpotPatch: ${input.spotPatchVersion}`,\n `${input.framework === \"next\" ? \"Next.js\" : \"Vite\"}: ${input.frameworkVersion}`,\n `${messages.source}: ${sourceLocation(input.resolution, input.code, messages)}`,\n `${messages.confidence}: ${input.resolution.source.confidence} (${messages.confidenceLabels[input.resolution.source.confidence]})`,\n `${messages.origin}: ${input.resolution.source.origin}`,\n ];\n\n if (input.resolution.react.componentName !== undefined) {\n lines.push(`${messages.component}: ${input.resolution.react.componentName}`);\n }\n\n if (input.resolution.react.componentStack.length > 0) {\n lines.push(\n `${messages.stack}: ${input.resolution.react.componentStack.join(\" > \")}`,\n );\n }\n\n if (\n !input.resolution.react.supported &&\n input.resolution.react.version !== undefined\n ) {\n lines.push(`React ${input.resolution.react.version}: ${messages.unsupported}`);\n }\n\n lines.push(\n `${messages.adapter}: ${input.resolution.react.supported ? messages.available : messages.unavailable}`,\n `${messages.api}: ${messages.apiStatuses[input.apiStatus]}`,\n `${messages.browserContext}: ${messages.collectionStatuses[input.collectionStatus]}`,\n );\n\n if (input.code !== undefined) {\n lines.push(`${messages.boundary}: ${messages.boundaries[input.code.boundary]}`);\n } else if (input.apiStatus === \"loading\") {\n lines.push(`${messages.sourceContext}: ${messages.apiStatuses.loading}`);\n } else if (input.apiStatus === \"failed\") {\n lines.push(`${messages.sourceContext}: ${messages.unavailable}`);\n }\n\n if (input.styles !== undefined) {\n lines.push(`${messages.cssWarnings}: ${String(input.styles.warnings.length)}`);\n lines.push(\n ...input.styles.warnings.map((warning) => `${messages.warning}: ${warning}`),\n );\n }\n\n return lines.join(\"\\n\");\n}\n","import {\n ERROR_CODES,\n type AgentCapabilitySnapshot,\n type AgentJobEvent,\n type AgentJobResult,\n type AgentJobSnapshot,\n type AgentWorkspaceHealthSnapshot,\n type RuntimeAiConfig,\n type SpotAnnotation,\n} from \"@spotpatch/shared\";\n\nimport {\n RuntimeApiError,\n runtimeApiErrorCode,\n type RuntimeApi,\n} from \"../api/runtime-api.js\";\nimport type { AgentActivityItem } from \"../ui/agent-panel.js\";\nimport type { RuntimeView } from \"../ui/runtime-view.js\";\n\nexport interface AgentWorkflow {\n readonly apply: () => void;\n readonly beginSelection: () => void;\n readonly cancel: () => void;\n readonly consentChanged: () => void;\n readonly disposeSelection: () => void;\n readonly providerOrModelChanged: () => void;\n readonly reset: () => void;\n readonly revert: () => void;\n readonly run: () => void;\n readonly testCapability: () => void;\n}\n\nexport interface CreateAgentWorkflowOptions {\n readonly ai: RuntimeAiConfig;\n readonly api: RuntimeApi;\n readonly getAnnotation: () => SpotAnnotation | undefined;\n readonly onApplied: () => void;\n readonly onReselectRequired: () => void;\n readonly view: RuntimeView;\n}\n\nfunction capabilityKey(providerProfileId: string, modelProfileId: string): string {\n return `${providerProfileId}:${modelProfileId}`;\n}\n\nfunction activityFromEvent(event: AgentJobEvent): AgentActivityItem | undefined {\n if (event.type === \"tool\") {\n return Object.freeze({\n key: `tool:${String(event.data.turn)}:${event.data.toolCallId}`,\n label: `${event.data.toolName} · ${event.data.state}`,\n state:\n event.data.state === \"started\"\n ? \"active\"\n : event.data.state === \"succeeded\"\n ? \"success\"\n : \"failure\",\n });\n }\n\n if (event.type === \"check\") {\n return Object.freeze({\n key: `check:${event.data.result.checkId}:${String(event.sequence)}`,\n label: `${event.data.result.label} · ${event.data.result.status}`,\n state:\n event.data.result.status === \"passed\"\n ? \"success\"\n : event.data.result.status === \"failed\" ||\n event.data.result.status === \"timed-out\"\n ? \"failure\"\n : \"info\",\n });\n }\n\n return undefined;\n}\n\nexport function createAgentWorkflow(\n options: CreateAgentWorkflowOptions,\n): AgentWorkflow {\n const errorCode = (error: unknown) =>\n runtimeApiErrorCode(error) ?? ERROR_CODES.INTERNAL_ERROR;\n const errorMessage = (error: unknown): string =>\n options.view.messages().errors[errorCode(error)];\n const capabilities = new Map<string, AgentCapabilitySnapshot>();\n const providerConsents = new Set<string>();\n const activities = new Map<string, AgentActivityItem>();\n let revision = 0;\n let snapshot: AgentJobSnapshot | undefined;\n let result: AgentJobResult | undefined;\n let appliedDuringCurrentJob = false;\n let actionPending = false;\n\n const selectedProfiles = () => options.view.readAgentSelection();\n const consentKey = (selection: NonNullable<ReturnType<typeof selectedProfiles>>) =>\n `${selection.providerProfileId}:${selection.applyMode}`;\n\n const refreshWorkspaceHealth = async (\n workflowRevision: number,\n ): Promise<AgentWorkspaceHealthSnapshot> => {\n options.view.renderAgentWorkspaceHealth(\"checking\");\n\n try {\n const health = await options.api.agentWorkspaceHealth();\n\n if (workflowRevision !== revision) {\n return health;\n }\n\n options.view.renderAgentWorkspaceHealth(health.state, health, health.errorCode);\n return health;\n } catch (error: unknown) {\n if (workflowRevision === revision) {\n options.view.renderAgentWorkspaceHealth(\"blocked\", undefined, errorCode(error));\n }\n\n throw error;\n }\n };\n\n const renderJob = (explicitErrorCode?: ReturnType<typeof errorCode>): void => {\n if (snapshot === undefined) {\n return;\n }\n\n options.view.renderAgentJob(\n snapshot,\n result,\n Object.freeze([...activities.values()]),\n explicitErrorCode ?? snapshot.errorCode,\n );\n };\n\n const restoreProviderState = (): void => {\n const selection = selectedProfiles();\n\n if (selection === undefined) {\n options.view.setAgentProviderConsent(false);\n options.view.renderAgentCapability(\n \"error\",\n options.view.messages().agent.providerUnavailable,\n );\n return;\n }\n\n options.view.setAgentProviderConsent(providerConsents.has(consentKey(selection)));\n const cached = capabilities.get(\n capabilityKey(selection.providerProfileId, selection.modelProfileId),\n );\n\n if (cached === undefined) {\n options.view.renderAgentCapability(\n \"idle\",\n options.view.messages().agent.connectionNotTested,\n );\n } else {\n options.view.renderAgentCapability(\n \"ready\",\n options.view.messages().agent.capabilityVerified,\n cached,\n );\n }\n };\n\n const probe = async (workflowRevision: number): Promise<AgentCapabilitySnapshot> => {\n const selection = selectedProfiles();\n\n if (selection === undefined) {\n throw new Error(\"Agent provider selection is unavailable.\");\n }\n\n const key = capabilityKey(selection.providerProfileId, selection.modelProfileId);\n const cached = capabilities.get(key);\n\n if (cached !== undefined) {\n return cached;\n }\n\n options.view.renderAgentCapability(\n \"probing\",\n options.view.messages().agent.testingCapability,\n );\n const capability = await options.api.agentCapability(selection);\n\n if (workflowRevision !== revision) {\n return capability;\n }\n\n if (capability.state !== \"agent-ready\") {\n throw new RuntimeApiError(\n capability.errorCode ?? ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED,\n );\n }\n\n capabilities.set(key, capability);\n options.view.renderAgentCapability(\n \"ready\",\n options.view.messages().agent.capabilityVerified,\n capability,\n );\n options.view.announce(options.view.messages().agent.capabilityVerifiedAnnouncement);\n return capability;\n };\n\n const refreshResult = async (\n jobId: string,\n workflowRevision: number,\n ): Promise<void> => {\n try {\n const response = await options.api.agentResult(jobId);\n\n if (workflowRevision !== revision || response.snapshot.jobId !== jobId) {\n return;\n }\n\n snapshot = response.snapshot;\n result = response.result;\n renderJob();\n } catch (error: unknown) {\n if (workflowRevision === revision) {\n renderJob(errorCode(error));\n }\n }\n };\n\n const observeJob = async (jobId: string, workflowRevision: number): Promise<void> => {\n try {\n await options.api.agentEvents(jobId, (event) => {\n if (workflowRevision !== revision || event.jobId !== jobId) {\n return;\n }\n\n if (event.type === \"snapshot\") {\n snapshot = event.data.snapshot;\n\n if (snapshot.status === \"applied\" && !appliedDuringCurrentJob) {\n appliedDuringCurrentJob = true;\n options.onApplied();\n }\n }\n\n const activity = activityFromEvent(event);\n\n if (activity !== undefined) {\n activities.set(activity.key, activity);\n }\n\n renderJob();\n });\n\n if (workflowRevision === revision) {\n await refreshResult(jobId, workflowRevision);\n }\n } catch (error: unknown) {\n if (\n workflowRevision === revision &&\n !(error instanceof DOMException && error.name === \"AbortError\")\n ) {\n renderJob(errorCode(error));\n }\n }\n };\n\n const runAction = async (action: \"apply\" | \"cancel\" | \"revert\"): Promise<void> => {\n const current = snapshot;\n\n if (current === undefined || actionPending) {\n return;\n }\n\n actionPending = true;\n const workflowRevision = revision;\n snapshot = Object.freeze({\n ...current,\n status:\n action === \"apply\"\n ? \"applying\"\n : action === \"cancel\"\n ? \"cancelling\"\n : \"reverting\",\n phaseMessage:\n action === \"apply\"\n ? options.view.messages().agent.applying\n : action === \"cancel\"\n ? options.view.messages().agent.cancelling\n : options.view.messages().agent.reverting,\n canCancel: false,\n canApply: false,\n canRevert: false,\n });\n renderJob();\n\n try {\n const updated =\n action === \"apply\"\n ? await options.api.applyAgentJob(current.jobId)\n : action === \"cancel\"\n ? await options.api.cancelAgentJob(current.jobId)\n : await options.api.revertAgentJob(current.jobId);\n\n if (workflowRevision !== revision) {\n return;\n }\n\n snapshot = updated;\n\n if (updated.status === \"applied\" && !appliedDuringCurrentJob) {\n appliedDuringCurrentJob = true;\n options.onApplied();\n }\n\n await refreshResult(updated.jobId, workflowRevision);\n } catch (error: unknown) {\n if (workflowRevision !== revision) {\n return;\n }\n\n snapshot = current;\n await refreshResult(current.jobId, workflowRevision);\n renderJob(errorCode(error));\n options.view.announce(errorMessage(error));\n } finally {\n if (workflowRevision === revision) {\n actionPending = false;\n }\n }\n };\n\n const resetState = (): void => {\n revision += 1;\n snapshot = undefined;\n result = undefined;\n activities.clear();\n appliedDuringCurrentJob = false;\n actionPending = false;\n options.view.resetAgentJob();\n options.view.setAgentEditingEnabled(true);\n restoreProviderState();\n };\n\n return Object.freeze({\n apply(): void {\n if (snapshot?.canApply === true) {\n void runAction(\"apply\");\n }\n },\n\n beginSelection(): void {\n resetState();\n const workflowRevision = revision;\n\n if (options.ai.enabled) {\n void refreshWorkspaceHealth(workflowRevision).catch(() => undefined);\n }\n },\n\n cancel(): void {\n if (snapshot?.canCancel === true) {\n void runAction(\"cancel\");\n }\n },\n\n consentChanged(): void {\n const selection = selectedProfiles();\n\n if (selection === undefined) {\n return;\n }\n\n if (options.view.agentConsentGranted()) {\n providerConsents.add(consentKey(selection));\n } else {\n providerConsents.delete(consentKey(selection));\n }\n },\n\n disposeSelection(): void {\n const cancellableJobId =\n snapshot?.canCancel === true || snapshot?.status === \"cancelling\"\n ? snapshot.jobId\n : undefined;\n revision += 1;\n snapshot = undefined;\n result = undefined;\n activities.clear();\n appliedDuringCurrentJob = false;\n actionPending = false;\n\n if (cancellableJobId !== undefined) {\n void options.api.cancelAgentJob(cancellableJobId).catch(() => undefined);\n }\n },\n\n providerOrModelChanged(): void {\n revision += 1;\n restoreProviderState();\n const workflowRevision = revision;\n void refreshWorkspaceHealth(workflowRevision).catch(() => undefined);\n },\n\n reset(): void {\n const mustReselect = appliedDuringCurrentJob;\n resetState();\n\n if (mustReselect) {\n options.onReselectRequired();\n } else if (options.ai.enabled) {\n const workflowRevision = revision;\n void refreshWorkspaceHealth(workflowRevision).catch(() => undefined);\n }\n },\n\n revert(): void {\n if (snapshot?.canRevert === true) {\n void runAction(\"revert\");\n }\n },\n\n run(): void {\n if (!options.ai.enabled || snapshot !== undefined) {\n return;\n }\n\n const selection = selectedProfiles();\n const annotation = options.getAnnotation();\n\n if (selection === undefined || annotation === undefined) {\n options.view.announce(\n options.view.messages().announcements.completeInstructions,\n );\n return;\n }\n\n if (!options.view.agentConsentGranted()) {\n options.view.announce(options.view.messages().agent.consentRequired);\n return;\n }\n\n providerConsents.add(consentKey(selection));\n const workflowRevision = ++revision;\n options.view.setAgentEditingEnabled(false);\n\n void refreshWorkspaceHealth(workflowRevision)\n .then(async (health) => {\n if (workflowRevision !== revision) {\n return;\n }\n\n if (health.state === \"blocked\") {\n throw new RuntimeApiError(\n health.errorCode ?? ERROR_CODES.WORKTREE_LOCAL_CHANGES_UNSUPPORTED,\n );\n }\n\n if (\n health.state === \"consent-required\" &&\n !options.view.agentWorkspaceConsentGranted()\n ) {\n throw new RuntimeApiError(ERROR_CODES.WORKTREE_DIRTY);\n }\n\n const created = await options.api.createAgentJob({\n annotation,\n applyMode: selection.applyMode,\n providerProfileId: selection.providerProfileId,\n modelProfileId: selection.modelProfileId,\n providerDataConsent: true,\n ...(selection.applyMode === \"trusted-auto\"\n ? { trustedFastModeConsent: true as const }\n : {}),\n workingTreeMode:\n health.state === \"consent-required\"\n ? \"include-local-changes\"\n : \"require-clean\",\n });\n\n if (workflowRevision !== revision) {\n return;\n }\n\n snapshot = created;\n result = undefined;\n activities.clear();\n renderJob();\n void observeJob(created.jobId, workflowRevision);\n })\n .catch((error: unknown) => {\n if (workflowRevision !== revision) {\n return;\n }\n\n options.view.setAgentEditingEnabled(true);\n options.view.renderAgentCapability(\n \"error\",\n errorMessage(error),\n undefined,\n errorCode(error),\n );\n options.view.announce(errorMessage(error));\n });\n },\n\n testCapability(): void {\n if (!options.ai.enabled || snapshot !== undefined) {\n return;\n }\n\n const workflowRevision = ++revision;\n void Promise.all([\n probe(workflowRevision),\n refreshWorkspaceHealth(workflowRevision),\n ]).catch((error: unknown) => {\n if (workflowRevision === revision) {\n options.view.renderAgentCapability(\n \"error\",\n errorMessage(error),\n undefined,\n errorCode(error),\n );\n options.view.announce(errorMessage(error));\n }\n });\n },\n });\n}\n","import type { PageContext } from \"@spotpatch/shared\";\n\nexport type ClipboardWriter = Readonly<{\n writeText(value: string): Promise<void>;\n}>;\n\nexport function createBrowserAnnotationId(window: Window): string {\n if (typeof window.crypto.randomUUID === \"function\") {\n return window.crypto.randomUUID();\n }\n\n const bytes = window.crypto.getRandomValues(new Uint8Array(16));\n return Array.from(bytes, (value) => value.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function collectPageContext(document: Document, window: Window): PageContext {\n return Object.freeze({\n url: window.location.href,\n pathname: window.location.pathname,\n title: document.title,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n devicePixelRatio: window.devicePixelRatio,\n });\n}\n\nexport function resolveClipboardWriter(\n navigator: Navigator,\n): ClipboardWriter | undefined {\n const candidate: unknown = Reflect.get(navigator, \"clipboard\");\n\n return typeof candidate === \"object\" &&\n candidate !== null &&\n \"writeText\" in candidate &&\n typeof candidate.writeText === \"function\"\n ? (candidate as ClipboardWriter)\n : undefined;\n}\n","import { createController, type SpotPatchController } from \"./runtime-controller.js\";\nimport type { RuntimeConfig } from \"./runtime-config.js\";\n\nexport const RUNTIME_INSTANCE_KEY = \"__spotpatchRuntime__\" as const;\n\ntype GlobalWithSpotPatch = typeof globalThis & {\n [RUNTIME_INSTANCE_KEY]?: SpotPatchController;\n};\n\nexport function bootstrapSpotPatch(config: RuntimeConfig): void {\n const target = globalThis as GlobalWithSpotPatch;\n target[RUNTIME_INSTANCE_KEY]?.dispose();\n const controller = createController(config);\n target[RUNTIME_INSTANCE_KEY] = controller;\n controller.mount();\n}\n","import {\n DATA_FLOW_SCHEMA_VERSION,\n DATA_FLOW_URL_QUERY_KEY_LIMIT,\n SPOTPATCH_API_BASE,\n type NetworkObservation,\n type RuntimeDataFlowConfig,\n type RuntimeDataFlowLimits,\n type SanitizedObservedUrl,\n} from \"@spotpatch/shared/data-flow-runtime\";\n\nexport interface DataFlowComponentRegistration {\n readonly componentSourceId: string;\n readonly sourceVersion: string;\n}\n\nexport interface DataFlowInvocationToken {\n readonly invocationId: string;\n readonly componentSourceId: string;\n readonly triggerCallsiteId: string;\n readonly sourceVersion: string;\n}\n\nexport interface DataFlowRequestFrame {\n readonly requestCallsiteId: string;\n readonly sourceVersion: string;\n readonly invocationToken?: DataFlowInvocationToken;\n}\n\nexport interface DataFlowTriggerMetadata {\n readonly componentSourceId: string;\n readonly triggerCallsiteId: string;\n readonly sourceVersion: string;\n}\n\nexport interface DataFlowRequestMetadata {\n readonly requestCallsiteId: string;\n readonly sourceVersion: string;\n}\n\nexport interface DataFlowRuntime {\n readonly beginInvocation: (\n metadata: DataFlowTriggerMetadata,\n ) => DataFlowInvocationToken;\n readonly bindInvocation: <Arguments extends readonly unknown[], Result>(\n token: DataFlowInvocationToken | undefined,\n callback: (...args: Arguments) => Result,\n ) => (...args: Arguments) => Result;\n readonly bindTrigger: <Callback>(\n metadata: DataFlowTriggerMetadata,\n callback: Callback,\n ) => Callback;\n readonly captureInvocation: () => DataFlowInvocationToken | undefined;\n readonly clear: () => void;\n readonly createTrpcLink: () => DataFlowTrpcLink;\n readonly dispose: () => void;\n readonly getComponentRegistration: (\n component: object,\n ) => DataFlowComponentRegistration | undefined;\n readonly getCurrentRequestFrame: () => DataFlowRequestFrame | undefined;\n readonly observations: () => readonly NetworkObservation[];\n readonly updateRoute: (routeKey: string) => void;\n readonly registerComponent: (\n component: object,\n componentSourceId: string,\n sourceVersion: string,\n ) => void;\n readonly withInvocation: <Result>(\n token: DataFlowInvocationToken | undefined,\n callback: () => Result,\n ) => Result;\n readonly withRequestFrame: <Result>(\n token: DataFlowInvocationToken | undefined,\n metadata: DataFlowRequestMetadata,\n callback: () => Result,\n ) => Result;\n}\n\nexport interface DataFlowTrpcOperation {\n readonly path: unknown;\n readonly type: unknown;\n}\n\nexport interface DataFlowTrpcLinkOptions<\n Operation extends DataFlowTrpcOperation,\n Result,\n> {\n readonly next: (operation: Operation) => Result;\n readonly op: Operation;\n}\n\nexport type DataFlowTrpcLink = (\n runtime: unknown,\n) => <Operation extends DataFlowTrpcOperation, Result>(\n options: DataFlowTrpcLinkOptions<Operation, Result>,\n) => Result;\n\ninterface DataFlowGlobal {\n readonly fetch?: typeof globalThis.fetch;\n readonly location?: Location;\n readonly performance?: Performance;\n readonly XMLHttpRequest?: typeof globalThis.XMLHttpRequest;\n}\n\ninterface MutableDataFlowGlobal extends DataFlowGlobal {\n fetch?: typeof globalThis.fetch;\n}\n\ninterface XhrMetadata {\n readonly method: string;\n readonly url: string;\n}\n\ninterface RingEntry {\n readonly bytes: number;\n readonly observation: NetworkObservation;\n readonly recordedAt: number;\n}\n\nconst RUNTIME_KEY: unique symbol = Symbol.for(\n \"spotpatch.data-flow.runtime.v1\",\n) as never;\nconst REACT_MEMO_TYPE = Symbol.for(\"react.memo\");\nconst REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\");\n\ntype DataFlowRuntimeStore = Partial<Record<symbol, DataFlowRuntime>>;\ntype GlobalWithDataFlow = MutableDataFlowGlobal & DataFlowRuntimeStore;\n\nfunction positiveNow(target: DataFlowGlobal): number {\n return target.performance?.now() ?? Date.now();\n}\n\nfunction createOpaqueSequence(prefix: string): () => string {\n let sequence = 0;\n const randomPrefix = (() => {\n try {\n const bytes = new Uint8Array(8);\n globalThis.crypto.getRandomValues(bytes);\n return Array.from(bytes, (value) => value.toString(36).padStart(2, \"0\")).join(\"\");\n } catch {\n return \"local\";\n }\n })();\n\n return () => {\n sequence += 1;\n return `${prefix}_${randomPrefix}_${sequence.toString(36)}`;\n };\n}\n\nfunction freezeUrl(value: string, baseUrl: string): SanitizedObservedUrl {\n try {\n const url = new URL(value, baseUrl);\n return Object.freeze({\n origin: url.origin,\n pathname: url.pathname,\n queryKeys: Object.freeze(\n [...new Set(url.searchParams.keys())]\n .sort()\n .slice(0, DATA_FLOW_URL_QUERY_KEY_LIMIT),\n ),\n });\n } catch {\n return Object.freeze({\n pathname: value.split(/[?#]/u, 1)[0] ?? \"{invalid}\",\n queryKeys: Object.freeze([]),\n });\n }\n}\n\nfunction readFetchUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.toString();\n return input.url;\n}\n\nfunction readFetchMethod(input: RequestInfo | URL, init?: RequestInit): string {\n if (init?.method !== undefined) return init.method.toUpperCase();\n return typeof Request !== \"undefined\" && input instanceof Request\n ? input.method.toUpperCase()\n : \"GET\";\n}\n\nfunction isSpotPatchInternalUrl(value: string, baseUrl: string): boolean {\n try {\n const pathname = new URL(value, baseUrl).pathname;\n return (\n pathname === SPOTPATCH_API_BASE || pathname.startsWith(`${SPOTPATCH_API_BASE}/`)\n );\n } catch {\n return false;\n }\n}\n\nfunction approximateBytes(value: unknown): number {\n return new TextEncoder().encode(JSON.stringify(value)).byteLength;\n}\n\nfunction createRingStore(\n limits: RuntimeDataFlowLimits,\n target: DataFlowGlobal,\n): Readonly<{\n add: (observation: NetworkObservation) => void;\n clear: () => void;\n values: () => readonly NetworkObservation[];\n}> {\n const entries: RingEntry[] = [];\n let totalBytes = 0;\n\n function removeExpired(now: number): void {\n while (\n entries[0] !== undefined &&\n now - entries[0].recordedAt > limits.observationTtlMs\n ) {\n const removed = entries.shift();\n if (removed !== undefined) totalBytes -= removed.bytes;\n }\n }\n\n return Object.freeze({\n add(observation): void {\n const now = positiveNow(target);\n removeExpired(now);\n const bytes = approximateBytes(observation);\n if (bytes > limits.observationMaxBytes) return;\n entries.push(Object.freeze({ bytes, observation, recordedAt: now }));\n totalBytes += bytes;\n\n while (\n entries.length > limits.observationMaxEntries ||\n totalBytes > limits.observationMaxBytes\n ) {\n const removed = entries.shift();\n if (removed !== undefined) totalBytes -= removed.bytes;\n }\n },\n clear(): void {\n entries.length = 0;\n totalBytes = 0;\n },\n values(): readonly NetworkObservation[] {\n removeExpired(positiveNow(target));\n return Object.freeze(entries.map(({ observation }) => observation));\n },\n });\n}\n\nfunction ownPropertyDescriptor(\n target: object,\n key: PropertyKey,\n): PropertyDescriptor | undefined {\n try {\n return Object.getOwnPropertyDescriptor(target, key);\n } catch {\n return undefined;\n }\n}\n\nfunction nestedReactWrapperComponent(candidate: object): object | undefined {\n const marker: unknown = ownPropertyDescriptor(candidate, \"$$typeof\")?.value;\n const key =\n marker === REACT_MEMO_TYPE\n ? \"type\"\n : marker === REACT_FORWARD_REF_TYPE\n ? \"render\"\n : undefined;\n if (key === undefined) return undefined;\n const nested: unknown = ownPropertyDescriptor(candidate, key)?.value;\n return (typeof nested === \"object\" && nested !== null) || typeof nested === \"function\"\n ? nested\n : undefined;\n}\n\nfunction installWritableDataProperty(\n target: object,\n key: PropertyKey,\n replacement: object,\n original: PropertyDescriptor | undefined = ownPropertyDescriptor(target, key),\n): (() => void) | undefined {\n if (original === undefined || !(\"value\" in original) || !original.writable) {\n return undefined;\n }\n\n try {\n Object.defineProperty(target, key, { ...original, value: replacement });\n } catch {\n return undefined;\n }\n\n return (): void => {\n try {\n if (ownPropertyDescriptor(target, key)?.value === replacement) {\n Object.defineProperty(target, key, original);\n }\n } catch {\n // A host or later wrapper can make the property non-configurable.\n }\n };\n}\n\nfunction recordWithoutAffectingHost(record: () => void): void {\n try {\n record();\n } catch {\n // Observation is optional; the host transport result is authoritative.\n }\n}\n\nexport function createDataFlowRuntime(\n config: RuntimeDataFlowConfig,\n target: MutableDataFlowGlobal = globalThis,\n): DataFlowRuntime {\n const componentRegistry = new WeakMap<object, DataFlowComponentRegistration>();\n const xhrMetadata = new WeakMap<object, XhrMetadata>();\n const store = createRingStore(config.limits, target);\n const nextInvocationId = createOpaqueSequence(\"invocation\");\n const nextObservationId = createOpaqueSequence(\"observation\");\n const pageEpoch = createOpaqueSequence(\"page\")();\n const nextRouteEpoch = createOpaqueSequence(\"route\");\n let routeEpoch = nextRouteEpoch();\n let routeKey: string | undefined;\n let currentInvocation: DataFlowInvocationToken | undefined;\n let currentRequestFrame: DataFlowRequestFrame | undefined;\n let disposed = false;\n\n const originalFetch = (() => {\n try {\n return target.fetch;\n } catch {\n return undefined;\n }\n })();\n function spotPatchFetch(\n this: typeof globalThis,\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n if (originalFetch === undefined) {\n throw new TypeError(\"Fetch is unavailable.\");\n }\n const result = Reflect.apply(originalFetch, this, [input, init]);\n recordWithoutAffectingHost(() => {\n const frame = currentRequestFrame;\n const token = frame?.invocationToken;\n const rawUrl = readFetchUrl(input);\n if (\n isSpotPatchInternalUrl(\n rawUrl,\n target.location?.href ?? \"http://spotpatch.invalid/\",\n )\n ) {\n return;\n }\n store.add(\n Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n id: nextObservationId(),\n pageEpoch,\n routeEpoch,\n ...(frame === undefined\n ? {}\n : {\n requestCallsiteId: frame.requestCallsiteId,\n sourceVersion: frame.sourceVersion,\n }),\n ...(token === undefined\n ? {}\n : {\n invocationId: token.invocationId,\n componentSourceId: token.componentSourceId,\n triggerCallsiteId: token.triggerCallsiteId,\n }),\n transport: \"fetch\",\n method: readFetchMethod(input, init),\n url: freezeUrl(rawUrl, target.location?.href ?? \"http://spotpatch.invalid/\"),\n outcome: \"dispatched\",\n freshness: \"current\",\n diagnosticIds: Object.freeze([]),\n }),\n );\n });\n return result;\n }\n\n const restoreFetch =\n originalFetch === undefined\n ? undefined\n : installWritableDataProperty(target, \"fetch\", spotPatchFetch);\n\n const xhrPrototype = (() => {\n try {\n return target.XMLHttpRequest?.prototype;\n } catch {\n return undefined;\n }\n })();\n const originalOpenDescriptor =\n xhrPrototype === undefined\n ? undefined\n : ownPropertyDescriptor(xhrPrototype, \"open\");\n const originalSendDescriptor =\n xhrPrototype === undefined\n ? undefined\n : ownPropertyDescriptor(xhrPrototype, \"send\");\n\n function spotPatchOpen(\n this: XMLHttpRequest,\n method: string,\n url: string | URL,\n ...rest: readonly unknown[]\n ): void {\n const original: unknown = originalOpenDescriptor?.value;\n if (typeof original === \"function\") {\n Reflect.apply(original, this, [method, url, ...rest]);\n }\n recordWithoutAffectingHost(() => {\n xhrMetadata.set(this, Object.freeze({ method, url: String(url) }));\n });\n }\n\n function spotPatchSend(\n this: XMLHttpRequest,\n body?: Document | XMLHttpRequestBodyInit | null,\n ): void {\n const original: unknown = originalSendDescriptor?.value;\n if (typeof original === \"function\") Reflect.apply(original, this, [body]);\n recordWithoutAffectingHost(() => {\n const metadata = xhrMetadata.get(this);\n if (\n metadata === undefined ||\n isSpotPatchInternalUrl(\n metadata.url,\n target.location?.href ?? \"http://spotpatch.invalid/\",\n )\n ) {\n return;\n }\n const frame = currentRequestFrame;\n const token = frame?.invocationToken;\n store.add(\n Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n id: nextObservationId(),\n pageEpoch,\n routeEpoch,\n ...(frame === undefined\n ? {}\n : {\n requestCallsiteId: frame.requestCallsiteId,\n sourceVersion: frame.sourceVersion,\n }),\n ...(token === undefined\n ? {}\n : {\n invocationId: token.invocationId,\n componentSourceId: token.componentSourceId,\n triggerCallsiteId: token.triggerCallsiteId,\n }),\n transport: \"xhr\",\n method: metadata.method.toUpperCase(),\n url: freezeUrl(\n metadata.url,\n target.location?.href ?? \"http://spotpatch.invalid/\",\n ),\n outcome: \"dispatched\",\n freshness: \"current\",\n diagnosticIds: Object.freeze([]),\n }),\n );\n });\n }\n\n const restoreXhrOpen =\n xhrPrototype === undefined || typeof originalOpenDescriptor?.value !== \"function\"\n ? undefined\n : installWritableDataProperty(\n xhrPrototype,\n \"open\",\n spotPatchOpen,\n originalOpenDescriptor,\n );\n const restoreXhrSend =\n xhrPrototype === undefined || typeof originalSendDescriptor?.value !== \"function\"\n ? undefined\n : installWritableDataProperty(\n xhrPrototype,\n \"send\",\n spotPatchSend,\n originalSendDescriptor,\n );\n\n const runtime: DataFlowRuntime = Object.freeze({\n beginInvocation(metadata: DataFlowTriggerMetadata): DataFlowInvocationToken {\n return Object.freeze({\n invocationId: nextInvocationId(),\n componentSourceId: metadata.componentSourceId,\n triggerCallsiteId: metadata.triggerCallsiteId,\n sourceVersion: metadata.sourceVersion,\n });\n },\n bindInvocation<Arguments extends readonly unknown[], Result>(\n token: DataFlowInvocationToken | undefined,\n callback: (...args: Arguments) => Result,\n ): (...args: Arguments) => Result {\n return function boundInvocation(this: unknown, ...args: Arguments): Result {\n return runtime.withInvocation(token, () => Reflect.apply(callback, this, args));\n };\n },\n bindTrigger<Callback>(\n metadata: DataFlowTriggerMetadata,\n callback: Callback,\n ): Callback {\n if (typeof callback !== \"function\") return callback;\n const callable = callback as (...args: readonly unknown[]) => unknown;\n return function boundTrigger(this: unknown, ...args: readonly unknown[]) {\n const token = runtime.beginInvocation(metadata);\n return runtime.withInvocation(token, () => Reflect.apply(callable, this, args));\n } as Callback;\n },\n captureInvocation: () => currentInvocation,\n clear: store.clear,\n createTrpcLink(): DataFlowTrpcLink {\n return () =>\n <Operation extends DataFlowTrpcOperation, Result>(\n options: DataFlowTrpcLinkOptions<Operation, Result>,\n ): Result => {\n recordWithoutAffectingHost(() => {\n const operation = options.op.path;\n const operationType = options.op.type;\n if (\n typeof operation !== \"string\" ||\n operation.length === 0 ||\n operation.length > 512 ||\n (operationType !== \"query\" &&\n operationType !== \"mutation\" &&\n operationType !== \"subscription\")\n ) {\n return;\n }\n const frame = currentRequestFrame;\n const token = frame?.invocationToken;\n store.add(\n Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n id: nextObservationId(),\n pageEpoch,\n routeEpoch,\n ...(frame === undefined\n ? {}\n : {\n requestCallsiteId: frame.requestCallsiteId,\n sourceVersion: frame.sourceVersion,\n }),\n ...(token === undefined\n ? {}\n : {\n invocationId: token.invocationId,\n componentSourceId: token.componentSourceId,\n triggerCallsiteId: token.triggerCallsiteId,\n }),\n transport: \"trpc\",\n method: operationType.toUpperCase(),\n operation,\n url: Object.freeze({\n pathname: operation,\n queryKeys: Object.freeze([]),\n }),\n outcome: \"dispatched\",\n freshness: \"current\",\n diagnosticIds: Object.freeze([]),\n }),\n );\n });\n return options.next(options.op);\n };\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n store.clear();\n restoreFetch?.();\n restoreXhrOpen?.();\n restoreXhrSend?.();\n },\n getComponentRegistration: (component: object) => componentRegistry.get(component),\n getCurrentRequestFrame: () => currentRequestFrame,\n observations: () =>\n Object.freeze(\n store\n .values()\n .map((observation) =>\n observation.routeEpoch === routeEpoch\n ? observation\n : Object.freeze({ ...observation, freshness: \"stale-route\" as const }),\n ),\n ),\n registerComponent(\n component: object,\n componentSourceId: string,\n registeredSourceVersion: string,\n ): void {\n const registration = Object.freeze({\n componentSourceId,\n sourceVersion: registeredSourceVersion,\n });\n const pending = [component];\n const registered = new Set<object>();\n while (pending.length > 0) {\n const candidate = pending.pop();\n if (candidate === undefined || registered.has(candidate)) continue;\n registered.add(candidate);\n componentRegistry.set(candidate, registration);\n\n const nested = nestedReactWrapperComponent(candidate);\n if (nested !== undefined) pending.push(nested);\n }\n },\n updateRoute(nextRouteKey: string): void {\n if (routeKey === undefined) {\n routeKey = nextRouteKey;\n } else if (routeKey !== nextRouteKey) {\n routeKey = nextRouteKey;\n routeEpoch = nextRouteEpoch();\n }\n },\n withInvocation<Result>(\n token: DataFlowInvocationToken | undefined,\n callback: () => Result,\n ): Result {\n const parent = currentInvocation;\n currentInvocation = token;\n try {\n return callback();\n } finally {\n currentInvocation = parent;\n }\n },\n withRequestFrame<Result>(\n token: DataFlowInvocationToken | undefined,\n metadata: DataFlowRequestMetadata,\n callback: () => Result,\n ): Result {\n const parent = currentRequestFrame;\n currentRequestFrame = Object.freeze({\n requestCallsiteId: metadata.requestCallsiteId,\n sourceVersion: metadata.sourceVersion,\n ...(token === undefined ? {} : { invocationToken: token }),\n });\n try {\n return callback();\n } finally {\n currentRequestFrame = parent;\n }\n },\n });\n\n return runtime;\n}\n\nexport function installDataFlowPrelude(\n config: RuntimeDataFlowConfig,\n target: GlobalWithDataFlow = globalThis,\n): DataFlowRuntime | undefined {\n if (!config.enabled) return undefined;\n const runtime = target[RUNTIME_KEY] ?? createDataFlowRuntime(config, target);\n target[RUNTIME_KEY] = runtime;\n return runtime;\n}\n\nexport function getDataFlowRuntime(\n target: GlobalWithDataFlow = globalThis,\n): DataFlowRuntime | undefined {\n return target[RUNTIME_KEY];\n}\n","import {\n isSensitiveName,\n limitDataFlowReportCollections,\n type ComponentDataFlowReport,\n type DataDependency,\n type EvidenceRef,\n type NetworkObservation,\n type PageDataFlowReport,\n} from \"@spotpatch/shared\";\n\nfunction observationMatchesDependency(\n observation: NetworkObservation,\n dependency: DataDependency,\n): boolean {\n const origin = dependency.origin;\n const transportMatches =\n dependency.kind === \"rpc\"\n ? observation.transport === \"trpc\" &&\n dependency.operation !== undefined &&\n observation.operation === dependency.operation\n : dependency.kind === \"http\"\n ? observation.transport === \"fetch\" || observation.transport === \"xhr\"\n : false;\n if (\n !transportMatches ||\n observation.freshness !== \"current\" ||\n origin === undefined ||\n observation.requestCallsiteId !== origin.requestCallsiteId ||\n observation.sourceVersion !== origin.sourceVersion ||\n (dependency.method !== undefined &&\n observation.method.toUpperCase() !== dependency.method.toUpperCase()) ||\n (dependency.url !== undefined &&\n observation.url.pathname !== dependency.url.pathname) ||\n (dependency.url?.origin !== undefined &&\n observation.url.origin !== dependency.url.origin) ||\n (origin.componentSourceId !== undefined &&\n observation.componentSourceId !== undefined &&\n observation.componentSourceId !== origin.componentSourceId) ||\n (origin.triggerCallsiteId !== undefined &&\n observation.triggerCallsiteId !== undefined &&\n observation.triggerCallsiteId !== origin.triggerCallsiteId)\n ) {\n return false;\n }\n\n return (\n dependency.association !== \"transitive\" ||\n (observation.componentSourceId === origin.componentSourceId &&\n observation.triggerCallsiteId === origin.triggerCallsiteId)\n );\n}\n\nfunction runtimeEvidence(observation: NetworkObservation): EvidenceRef {\n return Object.freeze({\n id: observation.id,\n kind: \"runtime-observation\",\n summaryKey: \"dataFlow.evidence.runtimeDispatch\",\n });\n}\n\nfunction mergeDependencies(\n dependencies: readonly DataDependency[],\n observations: readonly NetworkObservation[],\n): Readonly<{\n dependencies: readonly DataDependency[];\n matchedObservationIds: ReadonlySet<string>;\n}> {\n const matchedObservationIds = new Set<string>();\n const merged = dependencies.map((dependency) => {\n const matches = observations.filter((observation) =>\n observationMatchesDependency(observation, dependency),\n );\n for (const observation of matches) matchedObservationIds.add(observation.id);\n if (matches.length === 0) return dependency;\n const observedOrigins = [\n ...new Set(\n matches.flatMap(({ url }) => (url.origin === undefined ? [] : [url.origin])),\n ),\n ];\n const observedOrigin =\n observedOrigins.length === 1 ? observedOrigins[0] : undefined;\n return Object.freeze({\n ...dependency,\n ...(dependency.url === undefined ||\n dependency.url.origin !== undefined ||\n observedOrigin === undefined\n ? {}\n : {\n url: Object.freeze({\n ...dependency.url,\n origin: observedOrigin,\n }),\n }),\n execution: \"observed\" as const,\n observationIds: Object.freeze([\n ...new Set([...dependency.observationIds, ...matches.map(({ id }) => id)]),\n ]),\n evidenceIds: Object.freeze([\n ...new Set([...dependency.evidenceIds, ...matches.map(({ id }) => id)]),\n ]),\n });\n });\n return Object.freeze({\n dependencies: Object.freeze(merged),\n matchedObservationIds,\n });\n}\n\nfunction appendRuntimeEvidence(\n evidence: readonly EvidenceRef[],\n observations: readonly NetworkObservation[],\n matchedIds: ReadonlySet<string>,\n): readonly EvidenceRef[] {\n const existing = new Set(evidence.map(({ id }) => id));\n return Object.freeze([\n ...evidence,\n ...observations.flatMap((observation) =>\n matchedIds.has(observation.id) && !existing.has(observation.id)\n ? [runtimeEvidence(observation)]\n : [],\n ),\n ]);\n}\n\nexport function mergeComponentDataFlowReport(\n report: ComponentDataFlowReport,\n observations: readonly NetworkObservation[],\n): ComponentDataFlowReport {\n const componentObservations = observations.filter(\n (observation) =>\n observation.componentSourceId === undefined ||\n observation.componentSourceId === report.component.componentSourceId,\n );\n const merged = mergeDependencies(report.dependencies, componentObservations);\n return limitDataFlowReportCollections(\n Object.freeze({\n ...report,\n dependencies: merged.dependencies,\n evidence: appendRuntimeEvidence(\n report.evidence,\n componentObservations,\n merged.matchedObservationIds,\n ),\n }),\n { mode: \"observation\" },\n );\n}\n\nfunction unassignedDependency(observation: NetworkObservation): DataDependency {\n const isRpc = observation.transport === \"trpc\";\n return Object.freeze({\n id: observation.id,\n kind: isRpc ? \"rpc\" : \"http\",\n direction:\n observation.method === \"GET\" ||\n observation.method === \"HEAD\" ||\n observation.method === \"QUERY\" ||\n observation.method === \"SUBSCRIPTION\"\n ? \"read\"\n : \"write\",\n execution: \"observed\",\n proof: \"unavailable\",\n association: \"unassigned\",\n method: observation.method,\n ...(isRpc\n ? observation.operation === undefined\n ? {}\n : { operation: observation.operation }\n : { url: observation.url }),\n parameters: Object.freeze(\n (isRpc ? [] : observation.url.queryKeys).map((path) =>\n Object.freeze({\n path,\n position: \"query\" as const,\n sensitive: isSensitiveName(path),\n valueState: \"not-collected\" as const,\n evidenceIds: Object.freeze([observation.id]),\n }),\n ),\n ),\n response: Object.freeze({\n consumedFields: Object.freeze([]),\n }),\n suppliedBindings: Object.freeze([]),\n locationIds: Object.freeze([]),\n evidenceIds: Object.freeze([observation.id]),\n observationIds: Object.freeze([observation.id]),\n });\n}\n\nexport function mergePageDataFlowReport(\n report: PageDataFlowReport,\n observations: readonly NetworkObservation[],\n): PageDataFlowReport {\n const currentObservations = observations.filter(\n ({ freshness }) => freshness === \"current\",\n );\n const merged = mergeDependencies(report.dependencies, currentObservations);\n const unassigned = currentObservations\n .filter(({ id }) => !merged.matchedObservationIds.has(id))\n .map(unassignedDependency);\n const allObservationIds = new Set(currentObservations.map(({ id }) => id));\n return limitDataFlowReportCollections(\n Object.freeze({\n ...report,\n dependencies: Object.freeze([...merged.dependencies, ...unassigned]),\n evidence: appendRuntimeEvidence(\n report.evidence,\n currentObservations,\n allObservationIds,\n ),\n }),\n { mode: \"observation\" },\n );\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["import_shared","source","code","react","element","styles","target","import_shared","import_shared","code","isRecord","text","target","import_shared","element","source","element","text","target","element","element","target","target","openingTag","code","value","import_shared","element","source","react","import_shared","element","element","target","target","import_shared","styles","target","source","sourceLocation","import_shared","element","target","react","target","target","record","import_shared"]}
|