@wenathlan/extension 1.1.32 → 1.1.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +221 -12
- package/dist/index.js.map +2 -2
- package/dist/memory.d.ts +33 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/policy.d.ts +8 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/protocol.d.ts +33 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/types.d.ts +114 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/extension/dist/background.js +565 -23
- package/extension/dist/background.js.map +4 -4
- package/extension/dist/manifest.json +1 -1
- package/extension/dist/pagebridge.js +894 -86
- package/extension/dist/pagebridge.js.map +4 -4
- package/extension/dist/popup.html +1 -1
- package/extension/dist/popup.js +12 -3
- package/extension/dist/popup.js.map +2 -2
- package/extension/dist/sidepanel.html +1 -1
- package/extension/dist/sidepanel.js +134 -25
- package/extension/dist/sidepanel.js.map +2 -2
- package/extension/dist/style.css +1 -1
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../policy.ts", "../pageactions.ts", "../pagereads.ts", "../pagebridge.ts"],
|
|
4
|
-
"sourcesContent": ["import type { actionkind, agentplan, agentsession, endpointconfig, policyevaluation, toolstep } from \"./types.js\";\n\nconst sensitiveactions = new Set<actionkind>([\"click\", \"type\", \"navigate\", \"select\", \"presskey\", \"drag\", \"drop\", \"upload\", \"clear\", \"check\", \"uncheck\", \"toggle\", \"submit\", \"reload\", \"back\", \"forward\", \"writestorage\", \"setattribute\", \"removeattribute\", \"evaluate\", \"tabcreate\", \"tabactivate\", \"tabclose\", \"tabreload\", \"windowcreate\", \"windowclose\", \"windowresize\", \"downloadfile\"]);\nconst interactionactions = new Set<actionkind>([\"focus\", \"scroll\", \"hover\", \"clickdeep\", \"rightclick\", \"doubleclick\", \"scrollpage\", \"scrollby\", \"scrollend\", \"scrolltop\", \"fullscreen\", \"zoomset\"]);\nconst readactions = new Set<actionkind>([\"observe\", \"inspect\", \"extract\", \"wait\", \"waitfor\", \"waittext\", \"readattribute\", \"readstyle\", \"readgeometry\", \"readvalue\", \"readtext\", \"readhtml\", \"countelements\", \"readtable\", \"readlinks\", \"readimages\", \"readmeta\", \"readforms\", \"readstorage\", \"highlight\", \"tablist\", \"windowlist\", \"tabsnapshot\"]);\nconst allowedactions = new Set<actionkind>([...sensitiveactions, ...interactionactions, ...readactions]);\nconst targetactions = new Set<actionkind>([\"inspect\", \"focus\", \"click\", \"type\", \"scroll\", \"select\", \"hover\", \"clickdeep\", \"rightclick\", \"doubleclick\", \"drag\", \"drop\", \"upload\", \"clear\", \"check\", \"uncheck\", \"toggle\", \"submit\", \"readattribute\", \"readstyle\", \"readgeometry\", \"readvalue\", \"readtext\", \"readhtml\", \"countelements\", \"readtable\", \"highlight\", \"setattribute\", \"removeattribute\", \"waitfor\"]);\nconst valueactions = new Set<actionkind>([\"presskey\", \"drag\", \"drop\", \"upload\", \"readattribute\", \"removeattribute\", \"waittext\", \"evaluate\", \"zoomset\", \"tabactivate\", \"tabclose\", \"tabreload\", \"windowclose\", \"windowresize\", \"tabcreate\", \"windowcreate\", \"downloadfile\"]);\n\n/** Normalizes a user supplied HTTPS endpoint without preserving a provider lock-in. */\nexport function normalizeendpoint(value: string): endpointconfig {\n const endpoint = new URL(value.trim());\n if (endpoint.protocol !== \"https:\") throw new Error(\"Devthink accepts HTTPS endpoints only.\");\n if (endpoint.username || endpoint.password) throw new Error(\"Endpoint credentials are not allowed in the URL.\");\n return { endpoint: endpoint.toString(), origin: endpoint.origin, configuredat: Date.now() };\n}\n\n/** Creates the exact optional host pattern requested from Chromium. */\nexport function hostpattern(origin: string): string {\n const parsed = new URL(origin);\n if (parsed.protocol !== \"https:\") throw new Error(\"Only HTTPS origins can be granted.\");\n return `${parsed.origin}/*`;\n}\n\n/** Defines action risk from the fixed local allowlist. */\nexport function actionrisk(kind: actionkind): \"read\" | \"interaction\" | \"sensitive\" {\n if (!allowedactions.has(kind)) throw new Error(\"Unsupported browser action.\");\n if (sensitiveactions.has(kind)) return \"sensitive\";\n return interactionactions.has(kind) ? \"interaction\" : \"read\";\n}\n\n/** Parses the reviewed JSON options of a step; malformed payloads are rejected early. */\nexport function parseoptions(step: toolstep): Record<string, unknown> {\n if (step.options === undefined) return {};\n let parsed: unknown;\n try { parsed = JSON.parse(step.options); } catch { throw new Error(\"Step options must be a JSON object.\"); }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error(\"Step options must be a JSON object.\");\n return parsed as Record<string, unknown>;\n}\n\n/** Maps an action kind to the optional browser permission it requires, if any. */\nexport function requiredcapability(kind: actionkind): string | undefined {\n if (kind === \"tablist\") return \"tabs\";\n if (kind === \"downloadfile\") return \"downloads\";\n return undefined;\n}\n\n/** Parses the reviewed wait duration of a wait step with no upper bound. */\nexport function waitduration(step: toolstep): number {\n const requested = step.value ? Number.parseInt(step.value, 10) : 250;\n if (!Number.isFinite(requested) || requested < 0) throw new Error(\"Wait duration must be zero or a positive number of milliseconds.\");\n return requested;\n}\n\nfunction isnumericid(value: unknown): value is string {\n return typeof value === \"string\" && /^\\d+$/.test(value);\n}\n\nfunction numericoption(options: Record<string, unknown>, key: string): boolean {\n return options[key] === undefined || (typeof options[key] === \"number\" && Number.isFinite(options[key] as number));\n}\n\n/** Validates a single proposal against the active tab origin and local policy. */\nexport function validatestep(step: toolstep, origin: string): policyevaluation {\n if (!allowedactions.has(step.kind)) return { allowed: false, reason: \"Unsupported action kind.\" };\n if (!step.summary.trim()) return { allowed: false, reason: \"A human-readable action summary is required.\" };\n if (targetactions.has(step.kind) && !step.target?.trim()) return { allowed: false, reason: \"A page target is required.\" };\n if (valueactions.has(step.kind) && !step.value?.trim()) return { allowed: false, reason: \"A reviewed value is required.\" };\n if (step.kind === \"select\" && !step.value?.trim()) return { allowed: false, reason: \"A reviewed option value is required.\" };\n if (step.kind === \"navigate\" && !step.value) return { allowed: false, reason: \"A navigation URL is required.\" };\n let options: Record<string, unknown>;\n try { options = parseoptions(step); } catch { return { allowed: false, reason: \"Step options must be a JSON object.\" }; }\n if (step.kind === \"wait\") {\n try { waitduration(step); } catch { return { allowed: false, reason: \"Wait duration must be zero or a positive number of milliseconds.\" }; }\n }\n if (step.kind === \"navigate\") {\n try {\n if (new URL(step.value ?? \"\").origin !== origin) return { allowed: false, reason: \"Navigation must remain within the approved origin.\" };\n } catch {\n return { allowed: false, reason: \"Navigation URL is invalid.\" };\n }\n }\n if (step.kind === \"tabcreate\" || step.kind === \"windowcreate\" || step.kind === \"downloadfile\") {\n try {\n const url = new URL(step.value ?? \"\");\n if (url.protocol !== \"https:\") return { allowed: false, reason: \"The reviewed URL must use HTTPS.\" };\n } catch {\n return { allowed: false, reason: \"The reviewed URL is invalid.\" };\n }\n }\n if (step.kind === \"tabactivate\" || step.kind === \"tabclose\" || step.kind === \"tabreload\" || step.kind === \"windowclose\" || step.kind === \"windowresize\") {\n if (!isnumericid(step.value)) return { allowed: false, reason: \"A numeric browser id is required.\" };\n }\n if (step.kind === \"zoomset\") {\n const zoom = Number(step.value);\n if (!Number.isFinite(zoom) || zoom <= 0) return { allowed: false, reason: \"The reviewed zoom must be a positive number.\" };\n }\n if (step.kind === \"setattribute\" || step.kind === \"writestorage\") {\n const keyname = step.kind === \"setattribute\" ? \"name\" : \"key\";\n if (typeof options[keyname] !== \"string\" || !(options[keyname] as string).trim()) return { allowed: false, reason: `A reviewed ${keyname} is required in options.` };\n if (typeof options.value !== \"string\") return { allowed: false, reason: \"A reviewed value is required in options.\" };\n }\n if (step.kind === \"windowresize\") {\n if (typeof options.width !== \"number\" || typeof options.height !== \"number\" || !Number.isFinite(options.width) || !Number.isFinite(options.height)) return { allowed: false, reason: \"Reviewed width and height numbers are required in options.\" };\n }\n if ((step.kind === \"scrollpage\" || step.kind === \"scrollby\") && (!numericoption(options, \"x\") || !numericoption(options, \"y\"))) return { allowed: false, reason: \"Scroll amounts must be numbers in options.\" };\n if (step.kind === \"waitfor\" && options.timeout !== undefined && (typeof options.timeout !== \"number\" || options.timeout < 0)) return { allowed: false, reason: \"The waitfor timeout must be zero or a positive number of milliseconds.\" };\n return { allowed: true };\n}\n\n/** Shared session gate: a live, unpaused session that still matches the active tab. */\nfunction sessiongate(input: { session: agentsession | undefined; tabid: number; origin: string; now: number; action: string }): policyevaluation {\n if (!input.session || input.session.stoppedat) return { allowed: false, reason: \"No active browser session exists.\" };\n if (input.session.expiresat <= input.now) return { allowed: false, reason: \"The browser session has expired.\" };\n if (input.session.pausedat) return { allowed: false, reason: `The browser session is paused and cannot ${input.action}.` };\n if (input.session.tabid !== input.tabid || input.session.origin !== input.origin) return { allowed: false, reason: `The ${input.action} is outside the approved tab or origin.` };\n return { allowed: true };\n}\n\n/** Applies the consent gate immediately before an action reaches the page bridge. */\nexport function canexecute(input: { session: agentsession | undefined; plan: agentplan | undefined; step: toolstep; tabid: number; origin: string; now?: number }): policyevaluation {\n const now = input.now ?? Date.now();\n const gate = sessiongate({ session: input.session, tabid: input.tabid, origin: input.origin, now, action: \"execute an action\" });\n if (!gate.allowed) return gate;\n if (!input.plan || input.plan.state !== \"approved\") return { allowed: false, reason: \"The plan has not received explicit approval.\" };\n if (input.plan.expiresat <= now) return { allowed: false, reason: \"The approved plan has expired.\" };\n return validatestep(input.step, input.origin);\n}\n\n/** Allows a non-mutating, temporary target preview during plan review. */\nexport function canpreview(input: { session: agentsession | undefined; plan: agentplan | undefined; step: toolstep; tabid: number; origin: string; now?: number }): policyevaluation {\n const now = input.now ?? Date.now();\n const gate = sessiongate({ session: input.session, tabid: input.tabid, origin: input.origin, now, action: \"preview a target\" });\n if (!gate.allowed) return gate;\n if (!input.plan || ![\"pending\", \"approved\"].includes(input.plan.state)) return { allowed: false, reason: \"Only a reviewed pending or approved plan can be previewed.\" };\n if (input.plan.expiresat <= now) return { allowed: false, reason: \"The reviewed plan has expired.\" };\n if (!targetactions.has(input.step.kind)) return { allowed: false, reason: \"Only a target-based action can be previewed.\" };\n return validatestep(input.step, input.origin);\n}\n", "import type { toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\n\n/**\n * Mutating page interactions for reviewed steps.\n * Every correlated rule for pointer, key, drag, upload, form, attribute, storage and evaluation actions lives in this file.\n */\n\nexport type stepresult = { ok: boolean; summary: string; details?: Record<string, unknown> };\n\nfunction events(target: Element): void {\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nfunction modifiers(options: Record<string, unknown>): string[] {\n return Array.isArray(options.modifiers) ? options.modifiers.filter((item): item is string => typeof item === \"string\") : [];\n}\n\nfunction keyevent(type: \"keydown\" | \"keypress\" | \"keyup\", key: string, mods: string[]): KeyboardEvent {\n const code = key.length === 1 ? `Key${key.toUpperCase()}` : key;\n return new KeyboardEvent(type, { key, code, bubbles: true, cancelable: true, composed: true, ctrlKey: mods.includes(\"ctrl\"), shiftKey: mods.includes(\"shift\"), altKey: mods.includes(\"alt\"), metaKey: mods.includes(\"meta\") });\n}\n\nfunction fieldlike(target: Element | null): HTMLInputElement | HTMLTextAreaElement | null {\n return target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement ? target : null;\n}\n\nfunction stringify(value: unknown): unknown {\n try { return JSON.parse(JSON.stringify(value)) ?? null; } catch { return String(value); }\n}\n\n/** Runs one mutating page action after the background policy gate and a fresh target check. */\nexport function runpageaction(step: toolstep, target: Element | null): stepresult | Promise<stepresult> {\n const options = (() => { try { return parseoptions(step); } catch { return {} as Record<string, unknown>; } })();\n switch (step.kind) {\n case \"presskey\": {\n const receiver = target instanceof HTMLElement ? target : document.activeElement instanceof HTMLElement ? document.activeElement : document.body;\n const key = step.value ?? \"\";\n const mods = modifiers(options);\n receiver.dispatchEvent(keyevent(\"keydown\", key, mods));\n receiver.dispatchEvent(keyevent(\"keypress\", key, mods));\n receiver.dispatchEvent(keyevent(\"keyup\", key, mods));\n return { ok: true, summary: `Key ${key} delivered with ${mods.length} modifier${mods.length === 1 ? \"\" : \"s\"}.` };\n }\n case \"clickdeep\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Action target is no longer available.\" };\n target.dispatchEvent(new PointerEvent(\"pointerdown\", { bubbles: true, cancelable: true, composed: true }));\n target.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true, cancelable: true }));\n target.dispatchEvent(new PointerEvent(\"pointerup\", { bubbles: true, cancelable: true, composed: true }));\n target.dispatchEvent(new MouseEvent(\"mouseup\", { bubbles: true, cancelable: true }));\n target.click();\n return { ok: true, summary: \"Full pointer click sequence delivered.\" };\n }\n case \"rightclick\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Action target is no longer available.\" };\n const init: MouseEventInit = { bubbles: true, cancelable: true, button: 2, buttons: 2 };\n target.dispatchEvent(new PointerEvent(\"pointerdown\", { ...init, composed: true }));\n target.dispatchEvent(new MouseEvent(\"mousedown\", init));\n target.dispatchEvent(new MouseEvent(\"contextmenu\", init));\n return { ok: true, summary: \"Context menu events delivered.\" };\n }\n case \"doubleclick\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Action target is no longer available.\" };\n target.click();\n target.click();\n target.dispatchEvent(new MouseEvent(\"dblclick\", { bubbles: true, cancelable: true, detail: 2 }));\n return { ok: true, summary: \"Double click sequence delivered.\" };\n }\n case \"drag\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Drag source is no longer available.\" };\n const destination = document.querySelector(step.value ?? \"\");\n if (!destination) return { ok: false, summary: \"Drag destination is no longer available.\" };\n const transfer = new DataTransfer();\n if (typeof options.data === \"string\") transfer.setData(\"text/plain\", options.data);\n target.dispatchEvent(new DragEvent(\"dragstart\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n destination.dispatchEvent(new DragEvent(\"dragenter\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n destination.dispatchEvent(new DragEvent(\"dragover\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n destination.dispatchEvent(new DragEvent(\"drop\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n target.dispatchEvent(new DragEvent(\"dragend\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n return { ok: true, summary: \"Drag and drop sequence delivered.\" };\n }\n case \"drop\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Drop zone is no longer available.\" };\n const transfer = new DataTransfer();\n transfer.setData(\"text/plain\", step.value ?? \"\");\n target.dispatchEvent(new DragEvent(\"dragenter\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n target.dispatchEvent(new DragEvent(\"dragover\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n target.dispatchEvent(new DragEvent(\"drop\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n return { ok: true, summary: \"Drop payload delivered.\" };\n }\n case \"upload\": {\n if (!(target instanceof HTMLInputElement) || target.type !== \"file\") return { ok: false, summary: \"Target is not a file input.\" };\n const transfer = new DataTransfer();\n transfer.items.add(new File([typeof options.content === \"string\" ? options.content : \"\"], step.value ?? \"upload\", { type: typeof options.type === \"string\" ? options.type : \"text/plain\" }));\n target.files = transfer.files;\n events(target);\n return { ok: true, summary: `Uploaded ${step.value ?? \"file\"} into the reviewed input.` };\n }\n case \"clear\": {\n const field = fieldlike(target);\n if (!field) return { ok: false, summary: \"Target cannot hold a value.\" };\n field.value = \"\";\n events(field);\n return { ok: true, summary: \"Field cleared.\" };\n }\n case \"check\":\n case \"uncheck\":\n case \"toggle\": {\n if (!(target instanceof HTMLInputElement) || (target.type !== \"checkbox\" && target.type !== \"radio\")) return { ok: false, summary: \"Target is not a checkbox or radio control.\" };\n if (step.kind === \"uncheck\" && target.type === \"radio\") return { ok: false, summary: \"A radio control cannot be unchecked.\" };\n target.checked = step.kind === \"toggle\" ? !target.checked : step.kind === \"check\";\n events(target);\n return { ok: true, summary: `Control is now ${target.checked ? \"checked\" : \"unchecked\"}.` };\n }\n case \"submit\": {\n const form = target instanceof HTMLFormElement ? target : target instanceof HTMLElement ? target.closest(\"form\") : null;\n if (!form) return { ok: false, summary: \"No form owns the reviewed target.\" };\n try { form.requestSubmit(target instanceof HTMLFormElement ? undefined : (target as HTMLElement)); } catch { form.submit(); }\n return { ok: true, summary: \"Form submission requested.\" };\n }\n case \"setattribute\": {\n if (!target) return { ok: false, summary: \"Action target is no longer available.\" };\n const name = typeof options.name === \"string\" ? options.name : \"\";\n target.setAttribute(name, typeof options.value === \"string\" ? options.value : \"\");\n return { ok: true, summary: `Attribute ${name} set.` };\n }\n case \"removeattribute\": {\n if (!target) return { ok: false, summary: \"Action target is no longer available.\" };\n const name = step.value ?? \"\";\n target.removeAttribute(name);\n return { ok: true, summary: `Attribute ${name} removed.` };\n }\n case \"writestorage\": {\n try {\n localStorage.setItem(typeof options.key === \"string\" ? options.key : \"\", typeof options.value === \"string\" ? options.value : \"\");\n return { ok: true, summary: `Local storage entry ${String(options.key)} written.` };\n } catch (error) { return { ok: false, summary: `Local storage refused the write: ${error instanceof Error ? error.message : String(error)}` }; }\n }\n case \"evaluate\": {\n try {\n let outcome: unknown;\n try { outcome = new Function(`\"use strict\"; return (${step.value ?? \"undefined\"});`)(); } catch { outcome = new Function(`\"use strict\"; ${step.value ?? \"\"}`)(); }\n return { ok: true, summary: `Reviewed expression returned ${outcome === undefined ? \"no value\" : \"a value\"}.`, details: { result: stringify(outcome) } };\n } catch (error) { return { ok: false, summary: `Reviewed expression failed: ${error instanceof Error ? error.message : String(error)}` }; }\n }\n case \"fullscreen\": {\n const element = target instanceof HTMLElement ? target : document.documentElement;\n return document.fullscreenElement === element\n ? document.exitFullscreen().then(() => ({ ok: true, summary: \"Fullscreen state cleared.\" }) as stepresult)\n : element.requestFullscreen().then(() => ({ ok: true, summary: \"Fullscreen state entered.\" }) as stepresult).catch(error => ({ ok: false, summary: `Fullscreen was refused: ${error instanceof Error ? error.message : String(error)}` }));\n }\n default: return { ok: false, summary: \"Unsupported page action.\" };\n }\n}\n", "import type { toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\n\n/**\n * Read-only page observation for reviewed steps.\n * Every correlated rule for attribute, style, geometry, value, content, table, link, image, meta, form, storage reads and bounded-free waits lives in this file.\n */\n\nimport type { stepresult } from \"./pageactions.js\";\n\nconst highlightid = \"devthinkactionhighlight\";\n\nfunction clearhighlight(): void {\n document.getElementById(highlightid)?.remove();\n}\n\n/** Outlines one reviewed target without dispatching page events. */\nfunction highlighttarget(target: Element): stepresult {\n clearhighlight();\n const rect = target.getBoundingClientRect();\n const overlay = document.createElement(\"div\");\n overlay.id = highlightid;\n overlay.setAttribute(\"aria-hidden\", \"true\");\n Object.assign(overlay.style, { position: \"fixed\", left: `${Math.max(0, rect.left - 3)}px`, top: `${Math.max(0, rect.top - 3)}px`, width: `${rect.width + 6}px`, height: `${rect.height + 6}px`, border: \"3px solid #2f9e44\", borderRadius: \"6px\", pointerEvents: \"none\", zIndex: \"2147483647\", boxSizing: \"border-box\" });\n document.documentElement.append(overlay);\n window.setTimeout(clearhighlight, 5000);\n return { ok: true, summary: \"Target outlined for five seconds.\" };\n}\n\nfunction poll(predicate: () => boolean, description: string, timeout: number): Promise<stepresult> {\n return new Promise(resolve => {\n const started = Date.now();\n const check = (): void => {\n if (predicate()) { resolve({ ok: true, summary: `${description} is now present on the page.` }); return; }\n if (timeout > 0 && Date.now() - started >= timeout) { resolve({ ok: false, summary: `${description} did not appear within ${timeout} milliseconds.` }); return; }\n window.setTimeout(check, 100);\n };\n check();\n });\n}\n\nfunction formstate(): Array<Record<string, unknown>> {\n return [...document.querySelectorAll(\"input, textarea, select\")].map(element => ({\n type: element.getAttribute(\"type\") ?? element.tagName.toLowerCase(),\n name: element.getAttribute(\"name\") ?? \"\",\n value: element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement ? element.value : \"\",\n ...(element instanceof HTMLInputElement && (element.type === \"checkbox\" || element.type === \"radio\") ? { checked: element.checked } : {}),\n }));\n}\n\n/** Runs one read-only page observation after the background policy gate. */\nexport function runpageread(step: toolstep, target: Element | null): stepresult | Promise<stepresult> {\n const options = (() => { try { return parseoptions(step); } catch { return {} as Record<string, unknown>; } })();\n switch (step.kind) {\n case \"highlight\": {\n if (!target) return { ok: false, summary: \"Highlight target is no longer available.\" };\n return highlighttarget(target);\n }\n case \"readattribute\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n const value = target.getAttribute(step.value ?? \"\");\n return value === null ? { ok: false, summary: `Attribute ${step.value} is absent.` } : { ok: true, summary: `Attribute ${step.value} read.`, details: { value } };\n }\n case \"readstyle\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n const computed = getComputedStyle(target);\n const styles: Record<string, string> = {};\n for (let index = 0; index < computed.length; index += 1) { const property = computed.item(index); styles[property] = computed.getPropertyValue(property); }\n return { ok: true, summary: `Read ${computed.length} computed style properties.`, details: { styles } };\n }\n case \"readgeometry\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n const rect = target.getBoundingClientRect();\n const geometry = { x: rect.x, y: rect.y, width: rect.width, height: rect.height, top: rect.top, right: rect.right, bottom: rect.bottom, left: rect.left };\n return { ok: true, summary: \"Target geometry read.\", details: { geometry } };\n }\n case \"readvalue\": {\n if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement)) return { ok: false, summary: \"Target does not hold a form value.\" };\n return { ok: true, summary: \"Form value read.\", details: { value: target.value } };\n }\n case \"readtext\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n const text = target.textContent ?? \"\";\n return { ok: true, summary: `Read ${text.length} characters of text.`, details: { text } };\n }\n case \"readhtml\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n return { ok: true, summary: \"Target markup read.\", details: { html: target.outerHTML } };\n }\n case \"countelements\": {\n const count = document.querySelectorAll(step.target ?? \"\").length;\n return { ok: true, summary: `Selector matches ${count} element${count === 1 ? \"\" : \"s\"}.`, details: { count } };\n }\n case \"readtable\": {\n if (!(target instanceof HTMLTableElement)) return { ok: false, summary: \"Read target is not a table element.\" };\n const rows = [...target.querySelectorAll(\"tr\")].map(row => [...row.querySelectorAll(\"th, td\")].map(cell => cell.textContent?.trim() ?? \"\"));\n const headers = rows[0] ?? [];\n const body = rows.slice(1);\n return { ok: true, summary: `Read table with ${headers.length} column${headers.length === 1 ? \"\" : \"s\"} and ${body.length} row${body.length === 1 ? \"\" : \"s\"}.`, details: { headers, rows: body } };\n }\n case \"readlinks\": {\n const links = [...document.querySelectorAll(\"a[href]\")].map(element => ({ text: element.textContent?.trim() ?? \"\", href: element.getAttribute(\"href\") ?? \"\" }));\n return { ok: true, summary: `Read ${links.length} link${links.length === 1 ? \"\" : \"s\"}.`, details: { links } };\n }\n case \"readimages\": {\n const images = [...document.querySelectorAll(\"img\")].map(element => ({ src: element.getAttribute(\"src\") ?? \"\", alt: element.getAttribute(\"alt\") ?? \"\" }));\n return { ok: true, summary: `Read ${images.length} image${images.length === 1 ? \"\" : \"s\"}.`, details: { images } };\n }\n case \"readmeta\": {\n const meta = [...document.querySelectorAll(\"meta\")].map(element => ({ name: element.getAttribute(\"name\") ?? \"\", property: element.getAttribute(\"property\") ?? \"\", content: element.getAttribute(\"content\") ?? \"\" }));\n return { ok: true, summary: `Read ${meta.length} meta entr${meta.length === 1 ? \"y\" : \"ies\"}.`, details: { meta } };\n }\n case \"readforms\": {\n const forms = formstate();\n return { ok: true, summary: `Read ${forms.length} form control${forms.length === 1 ? \"\" : \"s\"}.`, details: { forms } };\n }\n case \"readstorage\": {\n try {\n if (step.value) {\n const value = localStorage.getItem(step.value);\n return { ok: true, summary: `Read local storage entry ${step.value}.`, details: { value } };\n }\n const entries: Record<string, string | null> = {};\n for (let index = 0; index < localStorage.length; index += 1) { const key = localStorage.key(index); if (key !== null) entries[key] = localStorage.getItem(key); }\n return { ok: true, summary: `Read ${Object.keys(entries).length} local storage entr${Object.keys(entries).length === 1 ? \"y\" : \"ies\"}.`, details: { entries } };\n } catch (error) { return { ok: false, summary: `Local storage refused the read: ${error instanceof Error ? error.message : String(error)}` }; }\n }\n case \"waitfor\": {\n const selector = step.target ?? \"\";\n const timeout = typeof options.timeout === \"number\" ? options.timeout : 0;\n return poll(() => Boolean(document.querySelector(selector)), `Selector ${selector}`, timeout);\n }\n case \"waittext\": {\n const text = step.value ?? \"\";\n const timeout = typeof options.timeout === \"number\" ? options.timeout : 0;\n return poll(() => (document.body?.innerText ?? \"\").includes(text), `Text ${text}`, timeout);\n }\n default: return { ok: false, summary: \"Unsupported page read.\" };\n }\n}\n", "import type { observation, toolstep } from \"../types.js\";\nimport { runpageaction, type stepresult } from \"./pageactions.js\";\nimport { runpageread } from \"./pagereads.js\";\n\n/**\n * Page bridge for reviewed steps.\n * Correlated rules for semantic snapshots, target preview, step dispatch and the original action set live in this file.\n */\n\nfunction clean(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction label(element: Element): string {\n const aria = element.getAttribute(\"aria-label\");\n const labelledby = element.getAttribute(\"aria-labelledby\");\n const linked = labelledby ? document.getElementById(labelledby)?.textContent : \"\";\n return clean(aria || linked || element.getAttribute(\"title\") || element.textContent || \"\");\n}\n\nfunction selector(element: Element): string {\n if (element.id) return `#${CSS.escape(element.id)}`;\n const role = element.getAttribute(\"role\");\n const name = element.getAttribute(\"name\");\n if (role && name) return `[role=\"${CSS.escape(role)}\"][name=\"${CSS.escape(name)}\"]`;\n if (name) return `${element.tagName.toLowerCase()}[name=\"${CSS.escape(name)}\"]`;\n const tag = element.tagName.toLowerCase();\n const parent = element.parentElement;\n if (!parent) return tag;\n const peers = [...parent.children].filter(node => node.tagName === element.tagName);\n return `${tag}:nth-of-type(${peers.indexOf(element) + 1})`;\n}\n\nfunction stepoptions(step: toolstep): Record<string, unknown> {\n if (!step.options) return {};\n try {\n const parsed = JSON.parse(step.options);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? (parsed as Record<string, unknown>) : {};\n } catch { return {}; }\n}\n\nconst previewid = \"devthinktargetpreview\";\n\nfunction clearpreview(): void {\n document.getElementById(previewid)?.remove();\n}\n\n/** Shows an ephemeral outline only; it neither mutates page data nor dispatches page events. */\nexport function previewtarget(targetselector: string, expectedorigin: string): { ok: boolean; summary: string } {\n if (location.origin !== expectedorigin) return { ok: false, summary: \"Page origin changed before preview.\" };\n clearpreview();\n const target = document.querySelector(targetselector);\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Reviewed target is no longer available.\" };\n const rect = target.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return { ok: false, summary: \"Reviewed target is not currently visible.\" };\n const overlay = document.createElement(\"div\");\n overlay.id = previewid;\n overlay.setAttribute(\"aria-hidden\", \"true\");\n Object.assign(overlay.style, { position: \"fixed\", left: `${Math.max(0, rect.left - 3)}px`, top: `${Math.max(0, rect.top - 3)}px`, width: `${rect.width + 6}px`, height: `${rect.height + 6}px`, border: \"3px solid #2f80ed\", borderRadius: \"6px\", boxShadow: \"0 0 0 3px rgba(47,128,237,.28)\", pointerEvents: \"none\", zIndex: \"2147483647\", boxSizing: \"border-box\" });\n document.documentElement.append(overlay);\n window.setTimeout(clearpreview, 5000);\n return { ok: true, summary: `Previewing ${label(target) || target.tagName.toLowerCase()} for five seconds.` };\n}\n\n/** Captures the complete semantic page context for a user-approved active tab. */\nexport function capturesnapshot(): observation {\n const candidates = [...document.querySelectorAll(\"a[href], button, input, textarea, select, [role=button], [role=link], [role=combobox], [role=option], [role=checkbox], [role=radio], [role=switch], [role=tab], details, summary\")];\n const interactive = candidates.map(element => ({ selector: selector(element), role: element.getAttribute(\"role\") || element.tagName.toLowerCase(), label: label(element) })).filter(item => item.label || item.role);\n const forms = [...document.querySelectorAll(\"input, textarea, select\")].map(element => ({\n label: label(element),\n type: element.getAttribute(\"type\") || element.tagName.toLowerCase(),\n name: element.getAttribute(\"name\") || \"\",\n ...(element instanceof HTMLSelectElement ? { options: [...element.options].map(option => clean(option.textContent || option.value)) } : {}),\n }));\n const text = clean(document.body?.innerText || \"\");\n return { schemaversion: 2, url: location.href, title: clean(document.title), textpreview: text, textlength: document.body?.innerText.length ?? 0, forms, interactive, capturedat: Date.now() };\n}\n\n/** Extracts full, read-only structured content for a reviewed extraction step. */\nfunction extractcontent(targetselector: string | undefined): stepresult {\n if (!targetselector) {\n const links = [...document.querySelectorAll(\"a[href]\")].map(element => {\n const href = element instanceof HTMLAnchorElement ? element.getAttribute(\"href\") ?? \"\" : \"\";\n return { text: element.textContent?.trim() ?? \"\", href };\n });\n return { ok: true, summary: `Extracted ${links.length} link entries.`, details: { links } };\n }\n const target = document.querySelector(targetselector);\n if (!target) return { ok: false, summary: \"Extraction target is no longer available.\" };\n const text = target.textContent ?? \"\";\n return { ok: true, summary: `Extracted ${text.length} characters of content.`, details: { text } };\n}\n\n/** Scrolls one reviewed target into view without reading or changing other page state. */\nfunction scrolltarget(target: HTMLElement): stepresult {\n target.scrollIntoView({ block: \"center\", inline: \"nearest\", behavior: \"auto\" });\n return { ok: true, summary: `Scrolled ${label(target) || target.tagName.toLowerCase()} into view.` };\n}\n\n/** Dispatches hover events on one reviewed target. */\nfunction hovertarget(target: HTMLElement): stepresult {\n for (const type of [\"pointerover\", \"mouseover\", \"pointerenter\"] as const) {\n target.dispatchEvent(new PointerEvent(type, { bubbles: type !== \"pointerenter\", cancelable: true, composed: true }));\n }\n target.dispatchEvent(new MouseEvent(\"mouseenter\", { bubbles: false, cancelable: true }));\n return { ok: true, summary: `Hover events delivered to ${label(target) || target.tagName.toLowerCase()}.` };\n}\n\n/** Selects one reviewed existing option; values outside the declared options are refused. */\nfunction selectoption(target: HTMLElement, value: string): stepresult {\n if (!(target instanceof HTMLSelectElement)) return { ok: false, summary: \"Target is not a select element.\" };\n const option = [...target.options].find(candidate => candidate.value === value || candidate.textContent?.trim() === value);\n if (!option) return { ok: false, summary: \"Reviewed option is not part of the select element.\" };\n target.value = option.value;\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: true, summary: `Selected ${clean(option.textContent || option.value)}.` };\n}\n\nconst readkinds: ReadonlySet<string> = new Set([\"readattribute\", \"readstyle\", \"readgeometry\", \"readvalue\", \"readtext\", \"readhtml\", \"countelements\", \"readtable\", \"readlinks\", \"readimages\", \"readmeta\", \"readforms\", \"readstorage\", \"waitfor\", \"waittext\", \"highlight\"]);\nconst mutatingkinds: ReadonlySet<string> = new Set([\"presskey\", \"clickdeep\", \"rightclick\", \"doubleclick\", \"drag\", \"drop\", \"upload\", \"clear\", \"check\", \"uncheck\", \"toggle\", \"submit\", \"setattribute\", \"removeattribute\", \"writestorage\", \"evaluate\", \"fullscreen\"]);\n\n/** Performs one local action after the background policy gate and a fresh target check. */\nexport function performstep(step: toolstep, expectedorigin: string): stepresult | Promise<stepresult> {\n if (location.origin !== expectedorigin) return { ok: false, summary: \"Page origin changed before action.\" };\n if (step.kind === \"observe\") return { ok: true, summary: \"Observation completed.\" };\n if (step.kind === \"wait\") {\n const requested = step.value ? Number.parseInt(step.value, 10) : 250;\n const duration = Number.isFinite(requested) && requested > 0 ? requested : 0;\n return new Promise(resolve => window.setTimeout(() => resolve({ ok: true, summary: `Reviewed wait of ${duration} milliseconds completed.` }), duration));\n }\n if (step.kind === \"extract\") return extractcontent(step.target);\n if (step.kind === \"navigate\") {\n if (!step.value || new URL(step.value).origin !== expectedorigin) return { ok: false, summary: \"Navigation target is outside the approved origin.\" };\n location.assign(step.value);\n return { ok: true, summary: \"Navigation request sent.\" };\n }\n if (step.kind === \"reload\") { location.reload(); return { ok: true, summary: \"Page reload requested.\" }; }\n if (step.kind === \"back\") { history.back(); return { ok: true, summary: \"History back requested.\" }; }\n if (step.kind === \"forward\") { history.forward(); return { ok: true, summary: \"History forward requested.\" }; }\n if (step.kind === \"scrollpage\") {\n const options = stepoptions(step);\n window.scrollBy({ left: typeof options.x === \"number\" ? options.x : 0, top: typeof options.y === \"number\" ? options.y : 600, behavior: \"auto\" });\n return { ok: true, summary: \"Window scrolled by the reviewed amounts.\" };\n }\n if (step.kind === \"scrollend\") { window.scrollTo(0, document.documentElement.scrollHeight); return { ok: true, summary: \"Window scrolled to the page end.\" }; }\n if (step.kind === \"scrolltop\") { window.scrollTo(0, 0); return { ok: true, summary: \"Window scrolled to the page top.\" }; }\n if (readkinds.has(step.kind)) return runpageread(step, step.target ? document.querySelector(step.target) : null);\n if (mutatingkinds.has(step.kind)) return runpageaction(step, step.target ? document.querySelector(step.target) : null);\n if (!step.target) return { ok: false, summary: \"Action target is absent.\" };\n const target = document.querySelector(step.target);\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Action target is no longer available.\" };\n if (step.kind === \"scrollby\") {\n const options = stepoptions(step);\n target.scrollBy({ left: typeof options.x === \"number\" ? options.x : 0, top: typeof options.y === \"number\" ? options.y : 600, behavior: \"auto\" });\n return { ok: true, summary: \"Container scrolled by the reviewed amounts.\" };\n }\n if (step.kind === \"focus\") { target.focus(); return { ok: true, summary: \"Target focused.\" }; }\n if (step.kind === \"inspect\") return { ok: true, summary: `Target: ${label(target) || target.tagName.toLowerCase()}.` };\n if (step.kind === \"click\") { target.click(); return { ok: true, summary: \"Reviewed click completed.\" }; }\n if (step.kind === \"scroll\") return scrolltarget(target);\n if (step.kind === \"hover\") return hovertarget(target);\n if (step.kind === \"select\") return selectoption(target, step.value ?? \"\");\n if (step.kind === \"type\") {\n if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) return { ok: false, summary: \"Target cannot receive text.\" };\n if (typeof step.value !== \"string\") return { ok: false, summary: \"Approved text is absent.\" };\n target.focus();\n target.value = step.value;\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: true, summary: \"Approved text entered.\" };\n }\n return { ok: false, summary: \"Unsupported action.\" };\n}\n\nObject.assign(globalThis, { devthinkbridge: { capturesnapshot, previewtarget, performstep } });\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../../policy.ts", "../pageactions.ts", "../pagexpath.ts", "../pageresolve.ts", "../pagereads.ts", "../pagecontrols.ts", "../pagepointer.ts", "../pageinteract.ts", "../pagedialogs.ts", "../pagebridge.ts"],
|
|
4
|
+
"sourcesContent": ["import type { actionkind, agentplan, agentsession, endpointconfig, policyevaluation, toolstep } from \"./types.js\";\n\nconst sensitiveactions = new Set<actionkind>([\"click\", \"type\", \"navigate\", \"select\", \"presskey\", \"drag\", \"drop\", \"upload\", \"clear\", \"check\", \"uncheck\", \"toggle\", \"submit\", \"reload\", \"back\", \"forward\", \"writestorage\", \"setattribute\", \"removeattribute\", \"evaluate\", \"tabcreate\", \"tabactivate\", \"tabclose\", \"tabreload\", \"windowcreate\", \"windowclose\", \"windowresize\", \"downloadfile\", \"clickpoint\", \"shiftclick\", \"dismissdialog\", \"enterframe\", \"typetime\", \"appendtext\", \"setvalue\", \"typeedit\", \"keyhold\", \"keyrelease\", \"submitsearch\", \"selectmulti\", \"chooseradio\", \"setslider\", \"setdate\", \"setcolor\"]);\nconst interactionactions = new Set<actionkind>([\"focus\", \"scroll\", \"hover\", \"clickdeep\", \"rightclick\", \"doubleclick\", \"scrollpage\", \"scrollby\", \"scrollend\", \"scrolltop\", \"fullscreen\", \"zoomset\", \"movepointer\", \"clicktext\", \"clickaria\", \"clickname\", \"expanddetails\", \"pierceshadow\", \"retryaction\"]);\nconst readactions = new Set<actionkind>([\"observe\", \"inspect\", \"extract\", \"wait\", \"waitfor\", \"waittext\", \"readattribute\", \"readstyle\", \"readgeometry\", \"readvalue\", \"readtext\", \"readhtml\", \"countelements\", \"readtable\", \"readlinks\", \"readimages\", \"readmeta\", \"readforms\", \"readstorage\", \"highlight\", \"tablist\", \"windowlist\", \"tabsnapshot\", \"mapclicks\", \"verifyvisible\", \"verifyenabled\", \"resolvexpath\"]);\nconst allowedactions = new Set<actionkind>([...sensitiveactions, ...interactionactions, ...readactions]);\nconst targetactions = new Set<actionkind>([\"inspect\", \"focus\", \"click\", \"type\", \"scroll\", \"select\", \"hover\", \"clickdeep\", \"rightclick\", \"doubleclick\", \"drag\", \"drop\", \"upload\", \"clear\", \"check\", \"uncheck\", \"toggle\", \"submit\", \"readattribute\", \"readstyle\", \"readgeometry\", \"readvalue\", \"readtext\", \"readhtml\", \"countelements\", \"readtable\", \"highlight\", \"setattribute\", \"removeattribute\", \"waitfor\", \"shiftclick\", \"typetime\", \"appendtext\", \"setvalue\", \"typeedit\", \"submitsearch\", \"selectmulti\", \"chooseradio\", \"setslider\", \"setdate\", \"setcolor\", \"expanddetails\", \"verifyvisible\", \"verifyenabled\", \"pierceshadow\"]);\nconst valueactions = new Set<actionkind>([\"presskey\", \"drag\", \"drop\", \"upload\", \"readattribute\", \"removeattribute\", \"waittext\", \"evaluate\", \"zoomset\", \"tabactivate\", \"tabclose\", \"tabreload\", \"windowclose\", \"windowresize\", \"tabcreate\", \"windowcreate\", \"downloadfile\", \"typetime\", \"appendtext\", \"setvalue\", \"typeedit\", \"keyhold\", \"keyrelease\", \"chooseradio\", \"setslider\", \"setdate\", \"setcolor\"]);\n\n/** Normalizes a user supplied HTTPS endpoint without preserving a provider lock-in. */\nexport function normalizeendpoint(value: string): endpointconfig {\n const endpoint = new URL(value.trim());\n if (endpoint.protocol !== \"https:\") throw new Error(\"Devthink accepts HTTPS endpoints only.\");\n if (endpoint.username || endpoint.password) throw new Error(\"Endpoint credentials are not allowed in the URL.\");\n return { endpoint: endpoint.toString(), origin: endpoint.origin, configuredat: Date.now() };\n}\n\n/** Creates the exact optional host pattern requested from Chromium. */\nexport function hostpattern(origin: string): string {\n const parsed = new URL(origin);\n if (parsed.protocol !== \"https:\") throw new Error(\"Only HTTPS origins can be granted.\");\n return `${parsed.origin}/*`;\n}\n\n/** Defines action risk from the fixed local allowlist. */\nexport function actionrisk(kind: actionkind): \"read\" | \"interaction\" | \"sensitive\" {\n if (!allowedactions.has(kind)) throw new Error(\"Unsupported browser action.\");\n if (sensitiveactions.has(kind)) return \"sensitive\";\n return interactionactions.has(kind) ? \"interaction\" : \"read\";\n}\n\n/** True when the action kind accepts a css selector target or a reviewed targetref. */\nexport function needstarget(kind: actionkind): boolean {\n return targetactions.has(kind);\n}\n\n/** Parses the reviewed JSON options of a step; malformed payloads are rejected early. */\nexport function parseoptions(step: toolstep): Record<string, unknown> {\n if (step.options === undefined) return {};\n let parsed: unknown;\n try { parsed = JSON.parse(step.options); } catch { throw new Error(\"Step options must be a JSON object.\"); }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error(\"Step options must be a JSON object.\");\n return parsed as Record<string, unknown>;\n}\n\n/** Maps an action kind to the optional browser permission it requires, if any. */\nexport function requiredcapability(kind: actionkind): string | undefined {\n if (kind === \"tablist\") return \"tabs\";\n if (kind === \"downloadfile\") return \"downloads\";\n return undefined;\n}\n\n/** Parses the reviewed wait duration of a wait step with no upper bound. */\nexport function waitduration(step: toolstep): number {\n const requested = step.value ? Number.parseInt(step.value, 10) : 250;\n if (!Number.isFinite(requested) || requested < 0) throw new Error(\"Wait duration must be zero or a positive number of milliseconds.\");\n return requested;\n}\n\nfunction isnumericid(value: unknown): value is string {\n return typeof value === \"string\" && /^\\d+$/.test(value);\n}\n\nfunction numericoption(options: Record<string, unknown>, key: string): boolean {\n return options[key] === undefined || (typeof options[key] === \"number\" && Number.isFinite(options[key] as number));\n}\n\n/** True when an optional numeric option is absent or a finite number of zero or more. */\nfunction nonnegativeoption(options: Record<string, unknown>, key: string): boolean {\n return numericoption(options, key) && !(typeof options[key] === \"number\" && (options[key] as number) < 0);\n}\n\nfunction isnonempty(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction ispoint(value: unknown): boolean {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const point = value as Record<string, unknown>;\n return typeof point.x === \"number\" && Number.isFinite(point.x) && typeof point.y === \"number\" && Number.isFinite(point.y);\n}\n\n/** Grades a resolution match count: zero is absent, one is resolved and more than one is refused as ambiguous. */\nexport function resolutionverdict(count: number): \"absent\" | \"resolved\" | \"ambiguous\" {\n if (!Number.isFinite(count) || count <= 0) return \"absent\";\n return count === 1 ? \"resolved\" : \"ambiguous\";\n}\n\n/** Validates the reviewed targetref grammar of every resolution mode and rejects empty references. */\nexport function validatetargetref(reference: unknown): policyevaluation {\n if (!reference || typeof reference !== \"object\" || Array.isArray(reference)) return { allowed: false, reason: \"The reviewed target reference must be an object.\" };\n const ref = reference as Record<string, unknown>;\n if (ref.mode === \"selector\") return isnonempty(ref.selector) ? { allowed: true } : { allowed: false, reason: \"The selector target reference needs a non-empty selector.\" };\n if (ref.mode === \"text\") return isnonempty(ref.text) ? { allowed: true } : { allowed: false, reason: \"The text target reference needs non-empty text.\" };\n if (ref.mode === \"aria\") {\n if (!isnonempty(ref.role)) return { allowed: false, reason: \"The aria target reference needs a non-empty role.\" };\n return isnonempty(ref.name) ? { allowed: true } : { allowed: false, reason: \"The aria target reference needs a non-empty name.\" };\n }\n if (ref.mode === \"name\") return isnonempty(ref.name) ? { allowed: true } : { allowed: false, reason: \"The name target reference needs a non-empty name.\" };\n if (ref.mode === \"xpath\") return isnonempty(ref.xpath) ? { allowed: true } : { allowed: false, reason: \"The xpath target reference needs a non-empty expression.\" };\n if (ref.mode === \"index\") {\n const index = ref.index;\n return typeof index === \"number\" && Number.isInteger(index) && index >= 1 ? { allowed: true } : { allowed: false, reason: \"The index target reference needs a positive integer map number.\" };\n }\n if (ref.mode === \"point\") {\n const pointok = typeof ref.x === \"number\" && Number.isFinite(ref.x) && typeof ref.y === \"number\" && Number.isFinite(ref.y);\n return pointok ? { allowed: true } : { allowed: false, reason: \"The point target reference needs numeric x and y coordinates.\" };\n }\n return { allowed: false, reason: \"The target reference mode must be selector, text, aria, name, xpath, index or point.\" };\n}\n\n/** True when the session origin grants cover the given origin; a session without grants only allows its own origin. */\nexport function origingranted(session: agentsession | undefined, origin: string): boolean {\n if (!session) return false;\n const grants = session.grants ?? [session.origin];\n return grants.includes(origin);\n}\n\n/** Validates the reviewed inner step of a retry or frame wrapper against the same rules as a top-level step. */\nfunction validateinnerstep(options: Record<string, unknown>, origin: string): policyevaluation {\n const stepid = options.stepid;\n const kind = options.kind;\n if (isnonempty(stepid)) {\n if (kind !== undefined) return { allowed: false, reason: \"The reviewed wrapper must reference a step id or an inline step, not both.\" };\n return { allowed: true };\n }\n if (typeof kind !== \"string\" || !kind.trim()) return { allowed: false, reason: \"A reviewed step id or inline step kind is required in options.\" };\n if (kind === \"retryaction\" || kind === \"enterframe\") return { allowed: false, reason: \"The reviewed inner step cannot be another wrapper kind.\" };\n if (!allowedactions.has(kind as actionkind)) return { allowed: false, reason: \"The reviewed inner step kind is unsupported.\" };\n const inneroptions = options.options;\n if (inneroptions !== undefined && (!inneroptions || typeof inneroptions !== \"object\" || Array.isArray(inneroptions))) return { allowed: false, reason: \"The reviewed inner step options must be an object.\" };\n const inner: toolstep = {\n id: \"inner\",\n kind: kind as actionkind,\n summary: \"Reviewed inner step.\",\n risk: actionrisk(kind as actionkind),\n ...(isnonempty(options.target) ? { target: options.target } : {}),\n ...(isnonempty(options.value) ? { value: options.value } : {}),\n ...(inneroptions !== undefined ? { options: JSON.stringify(inneroptions) } : {}),\n };\n return validatestep(inner, origin);\n}\n\n/** Validates a single proposal against the active tab origin and local policy. */\nexport function validatestep(step: toolstep, origin: string): policyevaluation {\n if (!allowedactions.has(step.kind)) return { allowed: false, reason: \"Unsupported action kind.\" };\n if (!step.summary.trim()) return { allowed: false, reason: \"A human-readable action summary is required.\" };\n let options: Record<string, unknown>;\n try { options = parseoptions(step); } catch { return { allowed: false, reason: \"Step options must be a JSON object.\" }; }\n const hastargetref = options.targetref !== undefined;\n if (targetactions.has(step.kind) && !step.target?.trim() && !hastargetref) return { allowed: false, reason: \"A page target is required.\" };\n if (valueactions.has(step.kind) && !step.value?.trim()) return { allowed: false, reason: \"A reviewed value is required.\" };\n if (step.kind === \"select\" && !step.value?.trim()) return { allowed: false, reason: \"A reviewed option value is required.\" };\n if (step.kind === \"navigate\" && !step.value) return { allowed: false, reason: \"A navigation URL is required.\" };\n if (hastargetref) {\n const reference = validatetargetref(options.targetref);\n if (!reference.allowed) return reference;\n }\n if (step.kind === \"wait\") {\n try { waitduration(step); } catch { return { allowed: false, reason: \"Wait duration must be zero or a positive number of milliseconds.\" }; }\n }\n if (step.kind === \"navigate\") {\n try {\n if (new URL(step.value ?? \"\").origin !== origin) return { allowed: false, reason: \"Navigation must remain within the approved origin.\" };\n } catch {\n return { allowed: false, reason: \"Navigation URL is invalid.\" };\n }\n }\n if (step.kind === \"tabcreate\" || step.kind === \"windowcreate\" || step.kind === \"downloadfile\") {\n try {\n const url = new URL(step.value ?? \"\");\n if (url.protocol !== \"https:\") return { allowed: false, reason: \"The reviewed URL must use HTTPS.\" };\n } catch {\n return { allowed: false, reason: \"The reviewed URL is invalid.\" };\n }\n }\n if (step.kind === \"tabactivate\" || step.kind === \"tabclose\" || step.kind === \"tabreload\" || step.kind === \"windowclose\" || step.kind === \"windowresize\") {\n if (!isnumericid(step.value)) return { allowed: false, reason: \"A numeric browser id is required.\" };\n }\n if (step.kind === \"zoomset\") {\n const zoom = Number(step.value);\n if (!Number.isFinite(zoom) || zoom <= 0) return { allowed: false, reason: \"The reviewed zoom must be a positive number.\" };\n }\n if (step.kind === \"setattribute\" || step.kind === \"writestorage\") {\n const keyname = step.kind === \"setattribute\" ? \"name\" : \"key\";\n if (typeof options[keyname] !== \"string\" || !(options[keyname] as string).trim()) return { allowed: false, reason: `A reviewed ${keyname} is required in options.` };\n if (typeof options.value !== \"string\") return { allowed: false, reason: \"A reviewed value is required in options.\" };\n }\n if (step.kind === \"windowresize\") {\n if (typeof options.width !== \"number\" || typeof options.height !== \"number\" || !Number.isFinite(options.width) || !Number.isFinite(options.height)) return { allowed: false, reason: \"Reviewed width and height numbers are required in options.\" };\n }\n if ((step.kind === \"scrollpage\" || step.kind === \"scrollby\") && (!numericoption(options, \"x\") || !numericoption(options, \"y\"))) return { allowed: false, reason: \"Scroll amounts must be numbers in options.\" };\n if (step.kind === \"waitfor\" && options.timeout !== undefined && (typeof options.timeout !== \"number\" || options.timeout < 0)) return { allowed: false, reason: \"The waitfor timeout must be zero or a positive number of milliseconds.\" };\n if (step.kind === \"movepointer\") {\n const path = options.pointpath;\n if (!path || typeof path !== \"object\" || Array.isArray(path)) return { allowed: false, reason: \"A reviewed pointpath with start and end points is required in options.\" };\n const points = path as Record<string, unknown>;\n if (!ispoint(points.start) || !ispoint(points.end)) return { allowed: false, reason: \"The reviewed pointpath needs numeric start and end points.\" };\n if (points.waypoints !== undefined && (!Array.isArray(points.waypoints) || !points.waypoints.every(waypoint => ispoint(waypoint)))) return { allowed: false, reason: \"The reviewed pointpath waypoints must be numeric points.\" };\n if (!nonnegativeoption(points, \"duration\")) return { allowed: false, reason: \"The reviewed pointpath duration must be zero or a positive number of milliseconds.\" };\n const speed = options.speedprofile;\n if (speed !== undefined) {\n if (!speed || typeof speed !== \"object\" || Array.isArray(speed)) return { allowed: false, reason: \"The reviewed speed profile must be an object.\" };\n const profile = speed as Record<string, unknown>;\n if (profile.easing !== undefined && profile.easing !== \"linear\" && profile.easing !== \"easeinout\") return { allowed: false, reason: \"The reviewed easing must be linear or easeinout.\" };\n if (!nonnegativeoption(profile, \"peak\")) return { allowed: false, reason: \"The reviewed peak velocity must be zero or a positive number.\" };\n if (!nonnegativeoption(profile, \"jitter\")) return { allowed: false, reason: \"The reviewed jitter window must be zero or a positive number of milliseconds.\" };\n }\n }\n if (step.kind === \"clickpoint\" && (!hastargetref || (options.targetref as Record<string, unknown>).mode !== \"point\")) return { allowed: false, reason: \"A reviewed point target reference is required in options.\" };\n if (step.kind === \"clicktext\" && (!hastargetref || (options.targetref as Record<string, unknown>).mode !== \"text\")) return { allowed: false, reason: \"A reviewed text target reference is required in options.\" };\n if (step.kind === \"clickaria\" && (!hastargetref || (options.targetref as Record<string, unknown>).mode !== \"aria\")) return { allowed: false, reason: \"A reviewed aria target reference is required in options.\" };\n if (step.kind === \"clickname\" && (!hastargetref || (options.targetref as Record<string, unknown>).mode !== \"name\")) return { allowed: false, reason: \"A reviewed name target reference is required in options.\" };\n if (step.kind === \"resolvexpath\" && (!hastargetref || (options.targetref as Record<string, unknown>).mode !== \"xpath\")) return { allowed: false, reason: \"A reviewed xpath target reference is required in options.\" };\n if (step.kind === \"typetime\" && options.delay !== undefined && (typeof options.delay !== \"number\" || !Number.isFinite(options.delay) || options.delay < 0)) return { allowed: false, reason: \"The reviewed per keystroke delay must be zero or a positive number of milliseconds.\" };\n if (step.kind === \"submitsearch\") {\n if (!isnonempty(options.results)) return { allowed: false, reason: \"A reviewed results region selector is required in options.\" };\n if (options.timeout !== undefined && (typeof options.timeout !== \"number\" || !Number.isFinite(options.timeout) || options.timeout < 0)) return { allowed: false, reason: \"The submitsearch timeout must be zero or a positive number of milliseconds.\" };\n }\n if (step.kind === \"selectmulti\") {\n const values = options.values;\n if (!Array.isArray(values) || values.length === 0 || !values.every(value => isnonempty(value))) return { allowed: false, reason: \"A reviewed list of option values is required in options.\" };\n }\n if (step.kind === \"setslider\") {\n const slider = Number(step.value);\n if (!Number.isFinite(slider)) return { allowed: false, reason: \"The reviewed slider value must be a number.\" };\n }\n if (step.kind === \"setdate\" && !/^\\d{4}-\\d{2}-\\d{2}$/.test(step.value ?? \"\")) return { allowed: false, reason: \"The reviewed date must use the yyyy-mm-dd form.\" };\n if (step.kind === \"setcolor\" && !/^#[0-9a-fA-F]{6}$/.test(step.value ?? \"\")) return { allowed: false, reason: \"The reviewed color must use the #rrggbb form.\" };\n if (step.kind === \"keyhold\" && options.holdid !== undefined && !isnonempty(options.holdid)) return { allowed: false, reason: \"The reviewed hold id must be a non-empty string.\" };\n if (step.kind === \"dismissdialog\") {\n const accept = options.accept;\n const answer = options.answer;\n if (accept === undefined && !isnonempty(answer)) return { allowed: false, reason: \"A reviewed accept flag or prompt answer is required in options.\" };\n if (accept !== undefined && typeof accept !== \"boolean\") return { allowed: false, reason: \"The reviewed dialog accept flag must be a boolean.\" };\n if (answer !== undefined && !isnonempty(answer)) return { allowed: false, reason: \"The reviewed prompt answer must be a non-empty string.\" };\n }\n if (step.kind === \"pierceshadow\" && options.shadow !== undefined) {\n if (!Array.isArray(options.shadow) || !options.shadow.every(item => isnonempty(item))) return { allowed: false, reason: \"The reviewed shadow path must be a list of non-empty selectors.\" };\n }\n if (step.kind === \"enterframe\") {\n const path = options.framepath;\n if (!Array.isArray(path) || path.length === 0 || !path.every(item => typeof item === \"number\" && Number.isInteger(item) && item >= 0)) return { allowed: false, reason: \"A reviewed frame path of frame indexes is required in options.\" };\n return validateinnerstep(options, origin);\n }\n if (step.kind === \"retryaction\") {\n const inner = validateinnerstep(options, origin);\n if (!inner.allowed) return inner;\n const rule = options.retryrule;\n if (!rule || typeof rule !== \"object\" || Array.isArray(rule)) return { allowed: false, reason: \"A reviewed retry rule with attempts is required in options.\" };\n const retry = rule as Record<string, unknown>;\n if (typeof retry.attempts !== \"number\" || !Number.isInteger(retry.attempts) || retry.attempts < 1) return { allowed: false, reason: \"The reviewed retry attempts must be a positive integer with no code ceiling.\" };\n if (!nonnegativeoption(retry, \"settle\")) return { allowed: false, reason: \"The reviewed retry settle window must be zero or a positive number of milliseconds.\" };\n if (!nonnegativeoption(retry, \"tolerance\")) return { allowed: false, reason: \"The reviewed retry movement tolerance must be zero or a positive number of pixels.\" };\n }\n return { allowed: true };\n}\n\n/** Shared session gate: a live, unpaused session that still matches the active tab. */\nfunction sessiongate(input: { session: agentsession | undefined; tabid: number; origin: string; now: number; action: string }): policyevaluation {\n if (!input.session || input.session.stoppedat) return { allowed: false, reason: \"No active browser session exists.\" };\n if (input.session.expiresat <= input.now) return { allowed: false, reason: \"The browser session has expired.\" };\n if (input.session.pausedat) return { allowed: false, reason: `The browser session is paused and cannot ${input.action}.` };\n if (input.session.tabid !== input.tabid || input.session.origin !== input.origin) return { allowed: false, reason: `The ${input.action} is outside the approved tab or origin.` };\n return { allowed: true };\n}\n\n/** Applies the consent gate immediately before an action reaches the page bridge. */\nexport function canexecute(input: { session: agentsession | undefined; plan: agentplan | undefined; step: toolstep; tabid: number; origin: string; now?: number }): policyevaluation {\n const now = input.now ?? Date.now();\n const gate = sessiongate({ session: input.session, tabid: input.tabid, origin: input.origin, now, action: \"execute an action\" });\n if (!gate.allowed) return gate;\n if (!input.plan || input.plan.state !== \"approved\") return { allowed: false, reason: \"The plan has not received explicit approval.\" };\n if (input.plan.expiresat <= now) return { allowed: false, reason: \"The approved plan has expired.\" };\n if ((input.step.kind === \"pierceshadow\" || input.step.kind === \"enterframe\") && !origingranted(input.session, input.origin)) return { allowed: false, reason: \"The shadow or frame step is outside the session origin grants.\" };\n return validatestep(input.step, input.origin);\n}\n\n/** Allows a non-mutating, temporary target preview during plan review. */\nexport function canpreview(input: { session: agentsession | undefined; plan: agentplan | undefined; step: toolstep; tabid: number; origin: string; now?: number }): policyevaluation {\n const now = input.now ?? Date.now();\n const gate = sessiongate({ session: input.session, tabid: input.tabid, origin: input.origin, now, action: \"preview a target\" });\n if (!gate.allowed) return gate;\n if (!input.plan || ![\"pending\", \"approved\"].includes(input.plan.state)) return { allowed: false, reason: \"Only a reviewed pending or approved plan can be previewed.\" };\n if (input.plan.expiresat <= now) return { allowed: false, reason: \"The reviewed plan has expired.\" };\n let options: Record<string, unknown> = {};\n try { options = parseoptions(input.step); } catch { options = {}; }\n if (!targetactions.has(input.step.kind) && options.targetref === undefined) return { allowed: false, reason: \"Only a target-based action can be previewed.\" };\n return validatestep(input.step, input.origin);\n}\n", "import type { toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\n\n/**\n * Mutating page interactions for reviewed steps.\n * Every correlated rule for pointer, key, drag, upload, form, attribute, storage and evaluation actions lives in this file.\n */\n\nexport type stepresult = { ok: boolean; summary: string; details?: Record<string, unknown> };\n\nfunction events(target: Element): void {\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nfunction modifiers(options: Record<string, unknown>): string[] {\n return Array.isArray(options.modifiers) ? options.modifiers.filter((item): item is string => typeof item === \"string\") : [];\n}\n\nfunction keyevent(type: \"keydown\" | \"keypress\" | \"keyup\", key: string, mods: string[]): KeyboardEvent {\n const code = key.length === 1 ? `Key${key.toUpperCase()}` : key;\n return new KeyboardEvent(type, { key, code, bubbles: true, cancelable: true, composed: true, ctrlKey: mods.includes(\"ctrl\"), shiftKey: mods.includes(\"shift\"), altKey: mods.includes(\"alt\"), metaKey: mods.includes(\"meta\") });\n}\n\nfunction fieldlike(target: Element | null): HTMLInputElement | HTMLTextAreaElement | null {\n return target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement ? target : null;\n}\n\nfunction stringify(value: unknown): unknown {\n try { return JSON.parse(JSON.stringify(value)) ?? null; } catch { return String(value); }\n}\n\n/** Runs one mutating page action after the background policy gate and a fresh target check. */\nexport function runpageaction(step: toolstep, target: Element | null): stepresult | Promise<stepresult> {\n const options = (() => { try { return parseoptions(step); } catch { return {} as Record<string, unknown>; } })();\n switch (step.kind) {\n case \"presskey\": {\n const receiver = target instanceof HTMLElement ? target : document.activeElement instanceof HTMLElement ? document.activeElement : document.body;\n const key = step.value ?? \"\";\n const mods = modifiers(options);\n receiver.dispatchEvent(keyevent(\"keydown\", key, mods));\n receiver.dispatchEvent(keyevent(\"keypress\", key, mods));\n receiver.dispatchEvent(keyevent(\"keyup\", key, mods));\n return { ok: true, summary: `Key ${key} delivered with ${mods.length} modifier${mods.length === 1 ? \"\" : \"s\"}.` };\n }\n case \"clickdeep\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Action target is no longer available.\" };\n target.dispatchEvent(new PointerEvent(\"pointerdown\", { bubbles: true, cancelable: true, composed: true }));\n target.dispatchEvent(new MouseEvent(\"mousedown\", { bubbles: true, cancelable: true }));\n target.dispatchEvent(new PointerEvent(\"pointerup\", { bubbles: true, cancelable: true, composed: true }));\n target.dispatchEvent(new MouseEvent(\"mouseup\", { bubbles: true, cancelable: true }));\n target.click();\n return { ok: true, summary: \"Full pointer click sequence delivered.\" };\n }\n case \"rightclick\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Action target is no longer available.\" };\n const init: MouseEventInit = { bubbles: true, cancelable: true, button: 2, buttons: 2 };\n target.dispatchEvent(new PointerEvent(\"pointerdown\", { ...init, composed: true }));\n target.dispatchEvent(new MouseEvent(\"mousedown\", init));\n target.dispatchEvent(new MouseEvent(\"contextmenu\", init));\n return { ok: true, summary: \"Context menu events delivered.\" };\n }\n case \"doubleclick\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Action target is no longer available.\" };\n target.click();\n target.click();\n target.dispatchEvent(new MouseEvent(\"dblclick\", { bubbles: true, cancelable: true, detail: 2 }));\n return { ok: true, summary: \"Double click sequence delivered.\" };\n }\n case \"drag\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Drag source is no longer available.\" };\n const destination = document.querySelector(step.value ?? \"\");\n if (!destination) return { ok: false, summary: \"Drag destination is no longer available.\" };\n const transfer = new DataTransfer();\n if (typeof options.data === \"string\") transfer.setData(\"text/plain\", options.data);\n target.dispatchEvent(new DragEvent(\"dragstart\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n destination.dispatchEvent(new DragEvent(\"dragenter\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n destination.dispatchEvent(new DragEvent(\"dragover\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n destination.dispatchEvent(new DragEvent(\"drop\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n target.dispatchEvent(new DragEvent(\"dragend\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n return { ok: true, summary: \"Drag and drop sequence delivered.\" };\n }\n case \"drop\": {\n if (!(target instanceof HTMLElement)) return { ok: false, summary: \"Drop zone is no longer available.\" };\n const transfer = new DataTransfer();\n transfer.setData(\"text/plain\", step.value ?? \"\");\n target.dispatchEvent(new DragEvent(\"dragenter\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n target.dispatchEvent(new DragEvent(\"dragover\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n target.dispatchEvent(new DragEvent(\"drop\", { bubbles: true, cancelable: true, dataTransfer: transfer }));\n return { ok: true, summary: \"Drop payload delivered.\" };\n }\n case \"upload\": {\n if (!(target instanceof HTMLInputElement) || target.type !== \"file\") return { ok: false, summary: \"Target is not a file input.\" };\n const transfer = new DataTransfer();\n transfer.items.add(new File([typeof options.content === \"string\" ? options.content : \"\"], step.value ?? \"upload\", { type: typeof options.type === \"string\" ? options.type : \"text/plain\" }));\n target.files = transfer.files;\n events(target);\n return { ok: true, summary: `Uploaded ${step.value ?? \"file\"} into the reviewed input.` };\n }\n case \"clear\": {\n const field = fieldlike(target);\n if (!field) return { ok: false, summary: \"Target cannot hold a value.\" };\n field.value = \"\";\n events(field);\n return { ok: true, summary: \"Field cleared.\" };\n }\n case \"check\":\n case \"uncheck\":\n case \"toggle\": {\n if (!(target instanceof HTMLInputElement) || (target.type !== \"checkbox\" && target.type !== \"radio\")) return { ok: false, summary: \"Target is not a checkbox or radio control.\" };\n if (step.kind === \"uncheck\" && target.type === \"radio\") return { ok: false, summary: \"A radio control cannot be unchecked.\" };\n target.checked = step.kind === \"toggle\" ? !target.checked : step.kind === \"check\";\n events(target);\n return { ok: true, summary: `Control is now ${target.checked ? \"checked\" : \"unchecked\"}.` };\n }\n case \"submit\": {\n const form = target instanceof HTMLFormElement ? target : target instanceof HTMLElement ? target.closest(\"form\") : null;\n if (!form) return { ok: false, summary: \"No form owns the reviewed target.\" };\n try { form.requestSubmit(target instanceof HTMLFormElement ? undefined : (target as HTMLElement)); } catch { form.submit(); }\n return { ok: true, summary: \"Form submission requested.\" };\n }\n case \"setattribute\": {\n if (!target) return { ok: false, summary: \"Action target is no longer available.\" };\n const name = typeof options.name === \"string\" ? options.name : \"\";\n target.setAttribute(name, typeof options.value === \"string\" ? options.value : \"\");\n return { ok: true, summary: `Attribute ${name} set.` };\n }\n case \"removeattribute\": {\n if (!target) return { ok: false, summary: \"Action target is no longer available.\" };\n const name = step.value ?? \"\";\n target.removeAttribute(name);\n return { ok: true, summary: `Attribute ${name} removed.` };\n }\n case \"writestorage\": {\n try {\n localStorage.setItem(typeof options.key === \"string\" ? options.key : \"\", typeof options.value === \"string\" ? options.value : \"\");\n return { ok: true, summary: `Local storage entry ${String(options.key)} written.` };\n } catch (error) { return { ok: false, summary: `Local storage refused the write: ${error instanceof Error ? error.message : String(error)}` }; }\n }\n case \"evaluate\": {\n try {\n let outcome: unknown;\n try { outcome = new Function(`\"use strict\"; return (${step.value ?? \"undefined\"});`)(); } catch { outcome = new Function(`\"use strict\"; ${step.value ?? \"\"}`)(); }\n return { ok: true, summary: `Reviewed expression returned ${outcome === undefined ? \"no value\" : \"a value\"}.`, details: { result: stringify(outcome) } };\n } catch (error) { return { ok: false, summary: `Reviewed expression failed: ${error instanceof Error ? error.message : String(error)}` }; }\n }\n case \"fullscreen\": {\n const element = target instanceof HTMLElement ? target : document.documentElement;\n return document.fullscreenElement === element\n ? document.exitFullscreen().then(() => ({ ok: true, summary: \"Fullscreen state cleared.\" }) as stepresult)\n : element.requestFullscreen().then(() => ({ ok: true, summary: \"Fullscreen state entered.\" }) as stepresult).catch(error => ({ ok: false, summary: `Fullscreen was refused: ${error instanceof Error ? error.message : String(error)}` }));\n }\n default: return { ok: false, summary: \"Unsupported page action.\" };\n }\n}\n", "/**\n * Xpath resolution subset for reviewed steps.\n * Every correlated rule for expression parsing, node trees and evaluation of the supported xpath grammar lives in this file.\n * The engine supports absolute and descendant steps, tag or wildcard names, attribute predicates, text predicates and positional predicates.\n */\n\n/** Serializable dom node used by the xpath engine; the live glue attaches the element. */\nexport interface xnode {\n tag: string;\n attributes: Record<string, string>;\n text: string;\n children: xnode[];\n element?: Element;\n}\n\ntype xpathpredicate =\n | { kind: \"attr\"; name: string; value?: string; contains?: boolean }\n | { kind: \"text\"; value: string; contains?: boolean }\n | { kind: \"position\"; index: number };\n\ninterface xpathstep {\n descendant: boolean;\n tag: string;\n predicates: xpathpredicate[];\n}\n\nfunction owntext(element: Element): string {\n let combined = \"\";\n for (const node of element.childNodes) if (node.nodeType === Node.TEXT_NODE) combined += node.textContent ?? \"\";\n return combined.replace(/\\s+/g, \" \").trim();\n}\n\nfunction attributesof(element: Element): Record<string, string> {\n const attributes: Record<string, string> = {};\n for (const attribute of [...element.attributes]) attributes[attribute.name] = attribute.value;\n return attributes;\n}\n\nfunction wrap(element: Element): xnode {\n return { tag: element.tagName.toLowerCase(), attributes: attributesof(element), text: owntext(element), children: [...element.children].map(wrap), element };\n}\n\n/** Builds the serializable node tree of one live document for the xpath engine. */\nexport function buildxtree(root: Document): xnode {\n return { tag: \"#document\", attributes: {}, text: \"\", children: root.documentElement ? [wrap(root.documentElement)] : [] };\n}\n\n/** Parses one predicate body into the supported predicate shapes. */\nfunction parsepredicate(raw: string): xpathpredicate | null {\n const body = raw.trim();\n let match = /^@([\\w-]+)$/.exec(body);\n if (match) return { kind: \"attr\", name: match[1] as string };\n match = /^@([\\w-]+)\\s*=\\s*['\"]([^'\"]*)['\"]$/.exec(body);\n if (match) return { kind: \"attr\", name: match[1] as string, value: match[2] as string };\n match = /^contains\\(\\s*@([\\w-]+)\\s*,\\s*['\"]([^'\"]*)['\"]\\s*\\)$/.exec(body);\n if (match) return { kind: \"attr\", name: match[1] as string, value: match[2] as string, contains: true };\n match = /^text\\(\\)\\s*=\\s*['\"]([^'\"]*)['\"]$/.exec(body);\n if (match) return { kind: \"text\", value: match[1] as string };\n match = /^contains\\(\\s*text\\(\\)\\s*,\\s*['\"]([^'\"]*)['\"]\\s*\\)$/.exec(body);\n if (match) return { kind: \"text\", value: match[1] as string, contains: true };\n match = /^(\\d+)$/.exec(body);\n if (match) return { kind: \"position\", index: Number.parseInt(match[1] as string, 10) };\n return null;\n}\n\n/** Parses the reviewed xpath expression into evaluation steps; unsupported syntax is refused. */\nexport function parsexpath(expression: string): xpathstep[] {\n const trimmed = expression.trim();\n if (!trimmed.startsWith(\"/\")) throw new Error(\"The reviewed xpath expression must start with a slash.\");\n const steps: xpathstep[] = [];\n let index = 0;\n while (index < trimmed.length) {\n if (trimmed[index] !== \"/\") throw new Error(\"The reviewed xpath expression contains an unsupported segment.\");\n let slashes = 0;\n while (index < trimmed.length && trimmed[index] === \"/\") { slashes += 1; index += 1; }\n const start = index;\n let quote = \"\";\n while (index < trimmed.length) {\n const character = trimmed[index];\n if (quote) { if (character === quote) quote = \"\"; }\n else if (character === \"'\" || character === '\"') quote = character;\n else if (character === \"/\") break;\n index += 1;\n }\n const body = trimmed.slice(start, index);\n if (!body) throw new Error(\"The reviewed xpath expression contains an empty step.\");\n const parsed = /^(\\*|[a-zA-Z][\\w-]*)((?:\\[[^\\]]*\\])*)$/.exec(body);\n if (!parsed) throw new Error(`The reviewed xpath step ${body} is not supported.`);\n const predicates: xpathpredicate[] = [];\n const pattern = /\\[([^\\]]*)\\]/g;\n let predicate: RegExpExecArray | null;\n while ((predicate = pattern.exec(parsed[2] ?? \"\")) !== null) {\n const parsedpredicate = parsepredicate(predicate[1] as string);\n if (!parsedpredicate) throw new Error(`The reviewed xpath predicate [${predicate[1]}] is not supported.`);\n predicates.push(parsedpredicate);\n }\n steps.push({ descendant: slashes > 1, tag: (parsed[1] as string).toLowerCase(), predicates });\n }\n return steps;\n}\n\nfunction descendants(node: xnode, includeself: boolean): xnode[] {\n const result: xnode[] = includeself ? [node] : [];\n for (const child of node.children) { result.push(child); result.push(...descendants(child, false)); }\n return result;\n}\n\nfunction applypredicates(nodes: xnode[], predicates: xpathpredicate[]): xnode[] {\n let result = nodes;\n for (const predicate of predicates) {\n if (predicate.kind === \"position\") {\n const entry = result[predicate.index - 1];\n result = entry ? [entry] : [];\n continue;\n }\n result = result.filter(node => {\n if (predicate.kind === \"attr\") {\n const value = node.attributes[predicate.name];\n if (value === undefined) return false;\n if (predicate.value === undefined) return true;\n return predicate.contains ? value.includes(predicate.value) : value === predicate.value;\n }\n return predicate.contains ? node.text.includes(predicate.value) : node.text === predicate.value;\n });\n }\n return result;\n}\n\n/** Evaluates the supported xpath subset against a serializable node tree and returns every matched node in document order. */\nexport function evaluatexpath(root: xnode, expression: string): xnode[] {\n const steps = parsexpath(expression);\n let current: xnode[] = [root];\n let first = true;\n for (const step of steps) {\n let matched: xnode[] = [];\n for (const node of current) {\n const pool = step.descendant ? descendants(node, first) : node.children;\n matched = matched.concat(pool.filter(candidate => candidate.tag === step.tag || step.tag === \"*\"));\n }\n current = applypredicates(matched, step.predicates);\n first = false;\n }\n return current;\n}\n", "import { parseoptions, resolutionverdict } from \"../policy.js\";\nimport type { clickablemap, mapentry, resolvedtarget, targetmode, toolstep } from \"../types.js\";\nimport { buildxtree, evaluatexpath } from \"./pagexpath.js\";\n\n/**\n * Target resolution engine for reviewed steps.\n * Every correlated rule for element summaries, targetref modes, ambiguity reports, shadow piercing, frame walking and the numbered clickable map lives in this file.\n */\n\n/** Descriptive fields shared by every resolution candidate; the live dom glue attaches the element. */\nexport interface candidatefields {\n tag: string;\n id: string;\n role: string;\n name: string;\n label: string;\n text: string;\n selector: string;\n}\n\n/** One live dom candidate: descriptive fields plus the element itself. */\nexport interface livecandidate extends candidatefields {\n element: Element;\n}\n\n/** Serializable description of one document with nested frames; the glue attaches the live document. */\nexport interface framedescription {\n frames: frameentry[];\n live?: Document;\n}\n\n/** One nested frame: same origin frames expose their document, cross origin frames do not. */\nexport interface frameentry {\n sameorigin: boolean;\n document?: framedescription;\n}\n\n/** Serializable scope tree: one scope's candidates plus the open shadow scopes nested inside it. */\nexport interface scopetree<T extends candidatefields = livecandidate> {\n host?: T;\n candidates: T[];\n shadows: scopetree<T>[];\n}\n\nexport function clean(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction cssescape(value: string): string {\n return typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\" ? CSS.escape(value) : value.replace(/[^a-zA-Z0-9_-]/g, \"\\\\$&\");\n}\n\n/** Computes the accessible style label of an element from aria hints, linked labels, title and content. */\nexport function elementlabel(element: Element): string {\n const aria = element.getAttribute(\"aria-label\");\n let linked = \"\";\n const labelledby = element.getAttribute(\"aria-labelledby\");\n if (labelledby) {\n try {\n const owner = element.ownerDocument?.getElementById(labelledby);\n if (owner) linked = owner.textContent ?? \"\";\n } catch { /* detached documents refuse lookups; the label falls back */ }\n }\n let forlabel = \"\";\n if (element.id) {\n try {\n const label = element.ownerDocument?.querySelector(`label[for=\"${cssescape(element.id)}\"]`);\n if (label instanceof HTMLElement) forlabel = label.textContent ?? \"\";\n } catch { /* the document may be detached; the label falls back */ }\n }\n return clean(aria || linked || forlabel || element.getAttribute(\"title\") || element.textContent || \"\");\n}\n\n/** Computes the implicit aria role of common elements when no explicit role attribute exists. */\nexport function implicitrole(element: Element): string {\n const tag = element.tagName.toLowerCase();\n if (tag === \"button\") return \"button\";\n if (tag === \"a\" && element.getAttribute(\"href\")) return \"link\";\n if (tag === \"select\") return \"combobox\";\n if (tag === \"textarea\") return \"textbox\";\n if (tag === \"details\") return \"group\";\n if (tag === \"input\") {\n const type = element.getAttribute(\"type\") ?? \"text\";\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n if (type === \"button\" || type === \"submit\" || type === \"reset\") return \"button\";\n if (type === \"range\") return \"slider\";\n return \"textbox\";\n }\n return \"\";\n}\n\n/** Builds the css selector that re-finds one element inside its document. */\nexport function elementselector(element: Element): string {\n if (element.id) return `#${cssescape(element.id)}`;\n const role = element.getAttribute(\"role\");\n const name = element.getAttribute(\"name\");\n if (role && name) return `[role=\"${cssescape(role)}\"][name=\"${cssescape(name)}\"]`;\n if (name) return `${element.tagName.toLowerCase()}[name=\"${cssescape(name)}\"]`;\n const tag = element.tagName.toLowerCase();\n const parent = element.parentElement;\n if (!parent) return tag;\n const peers = [...parent.children].filter(node => node.tagName === element.tagName);\n return `${tag}:nth-of-type(${peers.indexOf(element) + 1})`;\n}\n\n/** Own text of an element: only its direct text nodes, so parents do not shadow their children. */\nexport function owntext(element: Element): string {\n let combined = \"\";\n for (const node of element.childNodes) if (node.nodeType === Node.TEXT_NODE) combined += node.textContent ?? \"\";\n return clean(combined);\n}\n\n/** Summarizes one live element into the candidate shape used by every resolution mode. */\nexport function summarize(element: Element): livecandidate {\n return {\n tag: element.tagName.toLowerCase(),\n id: element.id,\n role: element.getAttribute(\"role\")?.toLowerCase() || implicitrole(element),\n name: element.getAttribute(\"name\") ?? \"\",\n label: elementlabel(element),\n text: owntext(element),\n selector: elementselector(element),\n element,\n };\n}\n\nconst clickableselector = \"a[href], button, input, textarea, select, summary, [role=button], [role=link], [role=combobox], [role=option], [role=checkbox], [role=radio], [role=switch], [role=tab]\";\n\n/** Collects every clickable candidate in document order. */\nexport function collectclickable(root: ParentNode): livecandidate[] {\n return [...root.querySelectorAll(clickableselector)].map(summarize);\n}\n\n/** Collects every element as a resolution candidate in document order. */\nexport function collectcandidates(root: ParentNode): livecandidate[] {\n return [...root.querySelectorAll(\"*\")].map(summarize);\n}\n\n/** Matches candidates whose visible own text or label equals or contains the reviewed text. */\nexport function matchtext<T extends candidatefields>(candidates: T[], text: string): T[] {\n const wanted = clean(text).toLowerCase();\n if (!wanted) return [];\n const exact = candidates.filter(candidate => candidate.text.toLowerCase() === wanted || candidate.label.toLowerCase() === wanted);\n if (exact.length > 0) return exact;\n return candidates.filter(candidate => candidate.text.toLowerCase().includes(wanted) || candidate.label.toLowerCase().includes(wanted));\n}\n\n/** Matches candidates by the aria role and accessible name pair. */\nexport function matcharia<T extends candidatefields>(candidates: T[], role: string, name: string): T[] {\n const wantedrole = clean(role).toLowerCase();\n const wantedname = clean(name).toLowerCase();\n if (!wantedrole || !wantedname) return [];\n return candidates.filter(candidate => candidate.role.toLowerCase() === wantedrole && (candidate.label.toLowerCase() === wantedname || candidate.name.toLowerCase() === wantedname));\n}\n\n/** Matches candidates by accessible name, preferring clickable elements when several share one name. */\nexport function matchname<T extends candidatefields>(candidates: T[], name: string, clickable?: (candidate: T) => boolean): T[] {\n const wanted = clean(name).toLowerCase();\n if (!wanted) return [];\n const matches = candidates.filter(candidate => candidate.label.toLowerCase() === wanted || candidate.name.toLowerCase() === wanted);\n if (matches.length > 1 && clickable) {\n const interactive = matches.filter(clickable);\n if (interactive.length === 1) return interactive;\n }\n return matches;\n}\n\n/** Matches one clickable map number; map numbers are one based and stable inside one observation version. */\nexport function matchindex<T extends candidatefields>(candidates: T[], index: number): T[] {\n if (!Number.isInteger(index) || index < 1) return [];\n const entry = candidates[index - 1];\n return entry ? [entry] : [];\n}\n\n/** Builds the numbered clickable map from clickable candidates in document order. */\nexport function buildclickablemap<T extends candidatefields>(candidates: T[], version: number, builtat = 0): clickablemap {\n const entries: mapentry[] = candidates.map((candidate, position) => ({ number: position + 1, selector: candidate.selector, role: candidate.role || candidate.tag, label: candidate.label, mode: \"selector\" as const }));\n return { version, entries, builtat };\n}\n\n/** Describes the nested frame structure of one live document; cross origin frames stay opaque. */\nexport function describeframes(root: Document): framedescription {\n const frames = [...root.querySelectorAll(\"iframe\")].map(frame => {\n let content: Document | null = null;\n try { content = frame.contentDocument; } catch { content = null; }\n let sameorigin = false;\n try { sameorigin = content !== null && frame.contentWindow?.location.origin === location.origin; } catch { sameorigin = false; }\n return sameorigin && content ? { sameorigin: true, document: describeframes(content) } : { sameorigin: false };\n });\n return { frames, live: root };\n}\n\n/** Walks a reviewed frame path through same origin frames and refuses cross origin or absent hops. */\nexport function walkframepath(root: framedescription, path: number[]): { ok: true; document: framedescription } | { ok: false; reason: string } {\n let current = root;\n for (const index of path) {\n if (!Number.isInteger(index) || index < 0) return { ok: false, reason: \"The reviewed frame path contains an invalid frame index.\" };\n const entry = current.frames[index];\n if (!entry) return { ok: false, reason: `Frame ${index} of the reviewed frame path is absent.` };\n if (!entry.sameorigin || !entry.document) return { ok: false, reason: `Frame ${index} of the reviewed frame path is cross origin and was refused.` };\n current = entry.document;\n }\n return { ok: true, document: current };\n}\n\n/** Describes one document or shadow root scope with every nested open shadow scope. */\nexport function describescopes(root: ParentNode): scopetree {\n const elements = [...root.querySelectorAll(\"*\")];\n const shadows: scopetree[] = [];\n for (const element of elements) {\n const shadow = element.shadowRoot;\n if (shadow) {\n const nested = describescopes(shadow);\n nested.host = summarize(element);\n shadows.push(nested);\n }\n }\n return { candidates: elements.map(summarize), shadows };\n}\n\n/** Searches one scope tree depth first for candidates matching the predicate, piercing open shadow scopes recursively. */\nexport function piercescopes<T extends candidatefields>(scope: scopetree<T>, match: (candidate: T) => boolean): T[] {\n const found: T[] = [];\n for (const candidate of scope.candidates) if (match(candidate)) found.push(candidate);\n for (const shadow of scope.shadows) found.push(...piercescopes(shadow, match));\n return found;\n}\n\n/** Resolves a reviewed selector chain through open shadow roots: each selector resolves inside the previous scope. */\nexport function queryshadowchain(root: ParentNode, selectors: string[]): Element | null {\n let scope: ParentNode = root;\n for (let position = 0; position < selectors.length; position += 1) {\n const found = scope.querySelector(selectors[position] as string);\n if (!found) return null;\n if (position === selectors.length - 1) return found;\n const shadow = found.shadowRoot;\n if (!shadow) return null;\n scope = shadow;\n }\n return null;\n}\n\n/** Finds the first element matching a selector in the scope or any nested open shadow root. */\nexport function queryscoped(root: ParentNode, selector: string): Element | null {\n const direct = root.querySelector(selector);\n if (direct) return direct;\n for (const element of [...root.querySelectorAll(\"*\")]) {\n const shadow = element.shadowRoot;\n if (shadow) {\n const found = queryscoped(shadow, selector);\n if (found) return found;\n }\n }\n return null;\n}\n\nfunction parseoptionssafe(step: toolstep): Record<string, unknown> {\n try { return parseoptions(step); } catch { return {}; }\n}\n\n/** Builds the matched element summary attached to step results for review. */\nexport function targetsummary(mode: targetmode, element: HTMLElement): resolvedtarget {\n const rect = element.getBoundingClientRect();\n return { mode, selector: elementselector(element), tag: element.tagName.toLowerCase(), label: elementlabel(element), geometry: { x: rect.x, y: rect.y, width: rect.width, height: rect.height } };\n}\n\nexport type stepresolution =\n | { status: \"none\" }\n | { status: \"resolved\"; element: HTMLElement; target: resolvedtarget }\n | { status: \"ambiguous\"; mode: targetmode; candidates: string[] }\n | { status: \"absent\"; mode?: targetmode };\n\nfunction singleresolution(mode: targetmode, matches: livecandidate[]): stepresolution {\n const verdict = resolutionverdict(matches.length);\n if (verdict === \"resolved\") {\n const winner = matches[0];\n if (winner && winner.element instanceof HTMLElement) return { status: \"resolved\", element: winner.element, target: targetsummary(mode, winner.element) };\n return { status: \"absent\", mode };\n }\n if (verdict === \"ambiguous\") return { status: \"ambiguous\", mode, candidates: matches.slice(0, 8).map(candidate => candidate.label || candidate.selector) };\n return { status: \"absent\", mode };\n}\n\n/** Resolves one reviewed targetref mode against the live dom in a single pass. */\nfunction resolvetargetref(reference: Record<string, unknown>, root: Document): stepresolution {\n const mode = reference.mode;\n if (mode === \"selector\") {\n const selector = typeof reference.selector === \"string\" ? reference.selector : \"\";\n const element = selector ? root.querySelector(selector) : null;\n return element instanceof HTMLElement ? { status: \"resolved\", element, target: targetsummary(\"selector\", element) } : { status: \"absent\", mode: \"selector\" };\n }\n if (mode === \"point\") {\n const x = Number(reference.x);\n const y = Number(reference.y);\n if (!Number.isFinite(x) || !Number.isFinite(y)) return { status: \"absent\", mode: \"point\" };\n const element = root.elementFromPoint(x, y);\n return element instanceof HTMLElement ? { status: \"resolved\", element, target: targetsummary(\"point\", element) } : { status: \"absent\", mode: \"point\" };\n }\n if (mode === \"xpath\") {\n const expression = typeof reference.xpath === \"string\" ? reference.xpath : \"\";\n if (!expression) return { status: \"absent\", mode: \"xpath\" };\n const matches = evaluatexpath(buildxtree(root), expression);\n const first = matches[0];\n return first?.element instanceof HTMLElement ? { status: \"resolved\", element: first.element, target: targetsummary(\"xpath\", first.element) } : { status: \"absent\", mode: \"xpath\" };\n }\n if (mode === \"index\") {\n const matches = matchindex(collectclickable(root), Number(reference.index));\n return singleresolution(\"index\", matches);\n }\n const candidates = collectcandidates(root);\n if (mode === \"text\") return singleresolution(\"text\", matchtext(candidates, typeof reference.text === \"string\" ? reference.text : \"\"));\n if (mode === \"aria\") return singleresolution(\"aria\", matcharia(candidates, typeof reference.role === \"string\" ? reference.role : \"\", typeof reference.name === \"string\" ? reference.name : \"\"));\n if (mode === \"name\") return singleresolution(\"name\", matchname(candidates, typeof reference.name === \"string\" ? reference.name : \"\"));\n return { status: \"absent\" };\n}\n\n/** Resolves the reviewed target of a step: the options targetref when present, otherwise the css target. */\nexport function resolvestep(step: toolstep, root: Document): stepresolution {\n const reference = parseoptionssafe(step).targetref;\n if (reference && typeof reference === \"object\" && !Array.isArray(reference)) return resolvetargetref(reference as Record<string, unknown>, root);\n if (!step.target?.trim()) return { status: \"none\" };\n const element = root.querySelector(step.target);\n if (element instanceof HTMLElement) return { status: \"resolved\", element, target: targetsummary(\"selector\", element) };\n return { status: \"absent\", mode: \"selector\" };\n}\n", "import type { toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\n\n/**\n * Read-only page observation for reviewed steps.\n * Every correlated rule for attribute, style, geometry, value, content, table, link, image, meta, form, storage reads, bounded-free waits, clickable maps and verify reads lives in this file.\n */\n\nimport type { stepresult } from \"./pageactions.js\";\nimport { buildclickablemap, collectclickable, elementlabel, elementselector } from \"./pageresolve.js\";\nimport { buildxtree, evaluatexpath } from \"./pagexpath.js\";\n\nconst highlightid = \"devthinkactionhighlight\";\n\nfunction clearhighlight(): void {\n document.getElementById(highlightid)?.remove();\n}\n\n/** Outlines one reviewed target without dispatching page events. */\nfunction highlighttarget(target: Element): stepresult {\n clearhighlight();\n const rect = target.getBoundingClientRect();\n const overlay = document.createElement(\"div\");\n overlay.id = highlightid;\n overlay.setAttribute(\"aria-hidden\", \"true\");\n Object.assign(overlay.style, { position: \"fixed\", left: `${Math.max(0, rect.left - 3)}px`, top: `${Math.max(0, rect.top - 3)}px`, width: `${rect.width + 6}px`, height: `${rect.height + 6}px`, border: \"3px solid #2f9e44\", borderRadius: \"6px\", pointerEvents: \"none\", zIndex: \"2147483647\", boxSizing: \"border-box\" });\n document.documentElement.append(overlay);\n window.setTimeout(clearhighlight, 5000);\n return { ok: true, summary: \"Target outlined for five seconds.\" };\n}\n\nfunction poll(root: Document, predicate: () => boolean, description: string, timeout: number): Promise<stepresult> {\n return new Promise(resolve => {\n const started = Date.now();\n const check = (): void => {\n if (predicate()) { resolve({ ok: true, summary: `${description} is now present on the page.` }); return; }\n if (timeout > 0 && Date.now() - started >= timeout) { resolve({ ok: false, summary: `${description} did not appear within ${timeout} milliseconds.` }); return; }\n window.setTimeout(check, 100);\n };\n check();\n });\n}\n\nfunction formstate(root: Document): Array<Record<string, unknown>> {\n return [...root.querySelectorAll(\"input, textarea, select\")].map(element => ({\n type: element.getAttribute(\"type\") ?? element.tagName.toLowerCase(),\n name: element.getAttribute(\"name\") ?? \"\",\n value: element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement ? element.value : \"\",\n ...(element instanceof HTMLInputElement && (element.type === \"checkbox\" || element.type === \"radio\") ? { checked: element.checked } : {}),\n }));\n}\n\n/** Runs one read-only page observation after the background policy gate. */\nexport function runpageread(step: toolstep, target: Element | null, root: Document = document): stepresult | Promise<stepresult> {\n const options = (() => { try { return parseoptions(step); } catch { return {} as Record<string, unknown>; } })();\n switch (step.kind) {\n case \"highlight\": {\n if (!target) return { ok: false, summary: \"Highlight target is no longer available.\" };\n return highlighttarget(target);\n }\n case \"readattribute\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n const value = target.getAttribute(step.value ?? \"\");\n return value === null ? { ok: false, summary: `Attribute ${step.value} is absent.` } : { ok: true, summary: `Attribute ${step.value} read.`, details: { value } };\n }\n case \"readstyle\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n const computed = getComputedStyle(target);\n const styles: Record<string, string> = {};\n for (let index = 0; index < computed.length; index += 1) { const property = computed.item(index); styles[property] = computed.getPropertyValue(property); }\n return { ok: true, summary: `Read ${computed.length} computed style properties.`, details: { styles } };\n }\n case \"readgeometry\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n const rect = target.getBoundingClientRect();\n const geometry = { x: rect.x, y: rect.y, width: rect.width, height: rect.height, top: rect.top, right: rect.right, bottom: rect.bottom, left: rect.left };\n return { ok: true, summary: \"Target geometry read.\", details: { geometry } };\n }\n case \"readvalue\": {\n if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement)) return { ok: false, summary: \"Target does not hold a form value.\" };\n return { ok: true, summary: \"Form value read.\", details: { value: target.value } };\n }\n case \"readtext\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n const text = target.textContent ?? \"\";\n return { ok: true, summary: `Read ${text.length} characters of text.`, details: { text } };\n }\n case \"readhtml\": {\n if (!target) return { ok: false, summary: \"Read target is no longer available.\" };\n return { ok: true, summary: \"Target markup read.\", details: { html: target.outerHTML } };\n }\n case \"countelements\": {\n const count = root.querySelectorAll(step.target ?? \"\").length;\n return { ok: true, summary: `Selector matches ${count} element${count === 1 ? \"\" : \"s\"}.`, details: { count } };\n }\n case \"readtable\": {\n if (!(target instanceof HTMLTableElement)) return { ok: false, summary: \"Read target is not a table element.\" };\n const rows = [...target.querySelectorAll(\"tr\")].map(row => [...row.querySelectorAll(\"th, td\")].map(cell => cell.textContent?.trim() ?? \"\"));\n const headers = rows[0] ?? [];\n const body = rows.slice(1);\n return { ok: true, summary: `Read table with ${headers.length} column${headers.length === 1 ? \"\" : \"s\"} and ${body.length} row${body.length === 1 ? \"\" : \"s\"}.`, details: { headers, rows: body } };\n }\n case \"readlinks\": {\n const links = [...root.querySelectorAll(\"a[href]\")].map(element => ({ text: element.textContent?.trim() ?? \"\", href: element.getAttribute(\"href\") ?? \"\" }));\n return { ok: true, summary: `Read ${links.length} link${links.length === 1 ? \"\" : \"s\"}.`, details: { links } };\n }\n case \"readimages\": {\n const images = [...root.querySelectorAll(\"img\")].map(element => ({ src: element.getAttribute(\"src\") ?? \"\", alt: element.getAttribute(\"alt\") ?? \"\" }));\n return { ok: true, summary: `Read ${images.length} image${images.length === 1 ? \"\" : \"s\"}.`, details: { images } };\n }\n case \"readmeta\": {\n const meta = [...root.querySelectorAll(\"meta\")].map(element => ({ name: element.getAttribute(\"name\") ?? \"\", property: element.getAttribute(\"property\") ?? \"\", content: element.getAttribute(\"content\") ?? \"\" }));\n return { ok: true, summary: `Read ${meta.length} meta entr${meta.length === 1 ? \"y\" : \"ies\"}.`, details: { meta } };\n }\n case \"readforms\": {\n const forms = formstate(root);\n return { ok: true, summary: `Read ${forms.length} form control${forms.length === 1 ? \"\" : \"s\"}.`, details: { forms } };\n }\n case \"readstorage\": {\n try {\n if (step.value) {\n const value = localStorage.getItem(step.value);\n return { ok: true, summary: `Read local storage entry ${step.value}.`, details: { value } };\n }\n const entries: Record<string, string | null> = {};\n for (let index = 0; index < localStorage.length; index += 1) { const key = localStorage.key(index); if (key !== null) entries[key] = localStorage.getItem(key); }\n return { ok: true, summary: `Read ${Object.keys(entries).length} local storage entr${Object.keys(entries).length === 1 ? \"y\" : \"ies\"}.`, details: { entries } };\n } catch (error) { return { ok: false, summary: `Local storage refused the read: ${error instanceof Error ? error.message : String(error)}` }; }\n }\n case \"waitfor\": {\n const selector = step.target ?? \"\";\n const timeout = typeof options.timeout === \"number\" ? options.timeout : 0;\n return poll(root, () => Boolean(root.querySelector(selector)), `Selector ${selector}`, timeout);\n }\n case \"waittext\": {\n const text = step.value ?? \"\";\n const timeout = typeof options.timeout === \"number\" ? options.timeout : 0;\n return poll(root, () => (root.body?.innerText ?? \"\").includes(text), `Text ${text}`, timeout);\n }\n case \"mapclicks\": {\n const candidates = collectclickable(root);\n const map = buildclickablemap(candidates, 0, 0);\n return { ok: true, summary: `Mapped ${map.entries.length} clickable element${map.entries.length === 1 ? \"\" : \"s\"}.`, details: { entries: map.entries } };\n }\n case \"verifyvisible\": {\n if (!target) return { ok: false, summary: \"Verify target is no longer available.\" };\n const rect = target.getBoundingClientRect();\n const rendered = rect.width > 0 && rect.height > 0;\n return { ok: rendered, summary: rendered ? `Target is rendered at ${Math.round(rect.x)},${Math.round(rect.y)} with size ${Math.round(rect.width)}x${Math.round(rect.height)}.` : \"Target is not rendered.\", details: { visible: rendered, geometry: { x: rect.x, y: rect.y, width: rect.width, height: rect.height } } };\n }\n case \"verifyenabled\": {\n if (!target) return { ok: false, summary: \"Verify target is no longer available.\" };\n const control = target as HTMLInputElement;\n const disabled = control.disabled === true || target.hasAttribute(\"disabled\");\n const readonly = control.readOnly === true || target.hasAttribute(\"readonly\");\n const enabled = !disabled && !readonly;\n return { ok: enabled, summary: enabled ? \"Target is enabled and writable.\" : disabled ? \"Target is disabled.\" : \"Target is readonly.\", details: { enabled, disabled, readonly } };\n }\n case \"resolvexpath\": {\n const reference = options.targetref as Record<string, unknown> | undefined;\n const expression = typeof reference?.xpath === \"string\" ? reference.xpath : \"\";\n if (!expression) return { ok: false, summary: \"The reviewed xpath expression is absent.\" };\n let matches: ReturnType<typeof evaluatexpath> = [];\n try { matches = evaluatexpath(buildxtree(root), expression); } catch (error) { return { ok: false, summary: `The reviewed xpath expression failed: ${error instanceof Error ? error.message : String(error)}` }; }\n const summaries = matches.map(node => ({ tag: node.tag, ...(node.element ? { selector: elementselector(node.element), label: elementlabel(node.element) } : {}) }));\n return { ok: matches.length > 0, summary: matches.length > 0 ? `Resolved ${matches.length} element${matches.length === 1 ? \"\" : \"s\"} for the reviewed xpath.` : \"The reviewed xpath matched no elements.\", details: { mode: \"xpath\", matches: summaries } };\n }\n default: return { ok: false, summary: \"Unsupported page read.\" };\n }\n}\n", "import type { keyholdstate, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { clean } from \"./pageresolve.js\";\n\n/**\n * Field and control interactions for reviewed steps.\n * Every correlated rule for timed typing, value setting, key holds, search submission, multi selects, radio choices, sliders, dates, colors, details sections and the hold registry lives in this file.\n */\n\n/** Builds the per keystroke schedule of one reviewed typetime step. */\nexport function typetimeschedule(text: string, delay: number): Array<{ key: string; delay: number }> {\n return [...text].map((character, position) => ({ key: character, delay: position === 0 ? 0 : delay }));\n}\n\n/** Appends reviewed text to the current field value. */\nexport function appendvalue(current: string, addition: string): string {\n return current + addition;\n}\n\n/** Event order delivered after one reviewed value change. */\nexport function valueevents(): string[] {\n return [\"input\", \"change\"];\n}\n\n/** Splits reviewed multi select values into present and missing entries against the declared options. */\nexport function multichoices(values: string[], options: Array<{ value: string; label: string }>): { present: string[]; missing: string[] } {\n const present: string[] = [];\n const missing: string[] = [];\n for (const value of values) {\n const option = options.find(candidate => candidate.value === value || candidate.label === value);\n if (option) present.push(option.value);\n else missing.push(value);\n }\n return { present, missing };\n}\n\n/** Picks the reviewed radio input by value or label from one radio group; the index of the match or minus one. */\nexport function radiochoice(inputs: Array<{ value: string; label: string }>, choice: string): number {\n return inputs.findIndex(candidate => candidate.value === choice || candidate.label === choice);\n}\n\n/** Clamps one reviewed slider value to the declared range and step grid. */\nexport function slidervalue(requested: number, min: number, max: number, step: number): number {\n const lower = Math.min(min, max);\n const upper = Math.max(min, max);\n const clamped = Math.min(upper, Math.max(lower, requested));\n if (!Number.isFinite(step) || step <= 0) return clamped;\n return Math.round((clamped - lower) / step) * step + lower;\n}\n\n/** Validates and normalizes one reviewed yyyy-mm-dd date. */\nexport function datevalue(requested: string): string | null {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(requested)) return null;\n const parts = requested.split(\"-\").map(part => Number.parseInt(part, 10));\n const year = parts[0];\n const month = parts[1];\n const day = parts[2];\n if (!year || !month || !day || month < 1 || month > 12 || day < 1 || day > 31) return null;\n return requested;\n}\n\n/** Validates and normalizes one reviewed #rrggbb color. */\nexport function colorvalue(requested: string): string | null {\n if (!/^#[0-9a-fA-F]{6}$/.test(requested)) return null;\n return requested.toLowerCase();\n}\n\n/** Decides whether one reviewed details section still needs opening. */\nexport function expandstate(open: boolean): { open: boolean; changed: boolean } {\n return open ? { open: true, changed: false } : { open: true, changed: true };\n}\n\n/** Records one held key under its hold id; a repeated active hold id is refused. */\nexport function presshold(holds: keyholdstate[], hold: keyholdstate): { holds: keyholdstate[]; ok: boolean } {\n if (holds.some(existing => existing.holdid === hold.holdid && existing.releasedat === undefined)) return { holds, ok: false };\n return { holds: [...holds, hold], ok: true };\n}\n\n/** Releases one held key by hold id, keeping the release timestamp. */\nexport function releasehold(holds: keyholdstate[], holdid: string, releasedat: number): { holds: keyholdstate[]; released?: keyholdstate } {\n let released: keyholdstate | undefined;\n const next = holds.map(hold => {\n if (hold.holdid !== holdid || hold.releasedat !== undefined) return hold;\n released = { ...hold, releasedat };\n return released;\n });\n return { holds: next, ...(released ? { released } : {}) };\n}\n\n/** Returns the keys currently held, optionally filtered to one tab. */\nexport function heldkeys(holds: keyholdstate[], tabid?: number): keyholdstate[] {\n return holds.filter(hold => hold.releasedat === undefined && (tabid === undefined || hold.tabid === undefined || hold.tabid === tabid));\n}\n\nfunction events(target: Element): void {\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nfunction modifiers(options: Record<string, unknown>): string[] {\n return Array.isArray(options.modifiers) ? options.modifiers.filter((item): item is string => typeof item === \"string\") : [];\n}\n\nfunction keyevent(type: \"keydown\" | \"keyup\", key: string, mods: string[]): KeyboardEvent {\n const code = key.length === 1 ? `Key${key.toUpperCase()}` : key;\n return new KeyboardEvent(type, { key, code, bubbles: true, cancelable: true, composed: true, ctrlKey: mods.includes(\"ctrl\"), shiftKey: mods.includes(\"shift\"), altKey: mods.includes(\"alt\"), metaKey: mods.includes(\"meta\") });\n}\n\nfunction fieldlike(target: Element | null): HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null {\n return target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement ? target : null;\n}\n\nfunction receiver(target: Element | null): HTMLElement {\n return target instanceof HTMLElement ? target : document.activeElement instanceof HTMLElement ? document.activeElement : document.body;\n}\n\nfunction wait(delay: number): Promise<void> {\n return new Promise(resolve => window.setTimeout(resolve, delay));\n}\n\n/** Focuses the reviewed target before typing; an explicit reviewed focus option forces or suppresses the focus. */\nfunction focuswhenneeded(target: Element, options: Record<string, unknown>): void {\n if (!(target instanceof HTMLElement)) return;\n if (options.focus === false) return;\n if (options.focus === true || document.activeElement !== target) target.focus();\n}\n\nfunction pollfor(predicate: () => boolean, description: string, timeout: number): Promise<stepresult> {\n return new Promise(resolve => {\n const started = Date.now();\n const check = (): void => {\n if (predicate()) { resolve({ ok: true, summary: `${description} is now present on the page.` }); return; }\n if (timeout > 0 && Date.now() - started >= timeout) { resolve({ ok: false, summary: `${description} did not appear within ${timeout} milliseconds.` }); return; }\n window.setTimeout(check, 100);\n };\n check();\n });\n}\n\n/** Runs one reviewed control interaction after the background policy gate and a fresh target check; frame routed steps receive their frame document as the root. */\nexport function runpagecontrol(step: toolstep, target: Element | null, root: Document = document): stepresult | Promise<stepresult> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n switch (step.kind) {\n case \"typetime\": {\n const field = fieldlike(target);\n if (!field) return { ok: false, summary: \"Target cannot receive timed text.\" };\n const text = step.value ?? \"\";\n const delay = typeof options.delay === \"number\" && options.delay > 0 ? options.delay : 0;\n focuswhenneeded(field, options);\n const schedule = typetimeschedule(text, delay);\n return (async (): Promise<stepresult> => {\n for (const entry of schedule) {\n await wait(entry.delay);\n field.dispatchEvent(keyevent(\"keydown\", entry.key, []));\n field.dispatchEvent(new KeyboardEvent(\"keypress\", { key: entry.key, bubbles: true, cancelable: true }));\n field.value = `${field.value}${entry.key}`;\n field.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n field.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: true, summary: `Typed ${text.length} character${text.length === 1 ? \"\" : \"s\"} with a per keystroke delay of ${delay} milliseconds.` };\n })();\n }\n case \"appendtext\": {\n const field = fieldlike(target);\n if (!field) return { ok: false, summary: \"Target cannot hold a value.\" };\n focuswhenneeded(field, options);\n field.value = appendvalue(field.value, step.value ?? \"\");\n events(field);\n return { ok: true, summary: \"Reviewed text appended to the current field value.\" };\n }\n case \"setvalue\": {\n const field = fieldlike(target);\n if (!field) return { ok: false, summary: \"Target cannot hold a value.\" };\n focuswhenneeded(field, options);\n field.value = step.value ?? \"\";\n events(field);\n return { ok: true, summary: `Field value set through the dom property with ${valueevents().join(\" and \")} events.` };\n }\n case \"typeedit\": {\n if (!(target instanceof HTMLElement) || !target.isContentEditable) return { ok: false, summary: \"Target is not a content editable region.\" };\n focuswhenneeded(target, options);\n const text = step.value ?? \"\";\n return (async (): Promise<stepresult> => {\n for (const character of [...text]) {\n target.dispatchEvent(new InputEvent(\"beforeinput\", { bubbles: true, cancelable: true, data: character, inputType: \"insertText\" }));\n target.append(document.createTextNode(character));\n target.dispatchEvent(new InputEvent(\"input\", { bubbles: true, data: character, inputType: \"insertText\" }));\n }\n return { ok: true, summary: `Typed ${text.length} character${text.length === 1 ? \"\" : \"s\"} into the content editable region.` };\n })();\n }\n case \"keyhold\": {\n const key = step.value ?? \"\";\n const mods = modifiers(options);\n receiver(target).dispatchEvent(keyevent(\"keydown\", key, mods));\n const holdid = typeof options.holdid === \"string\" && options.holdid ? options.holdid : \"\";\n return { ok: true, summary: `Key ${key} pressed and held${holdid ? ` under hold id ${holdid}` : \"\"}.`, details: { ...(holdid ? { holdid } : {}), modifiers: mods } };\n }\n case \"keyrelease\": {\n const key = step.value ?? \"\";\n const mods = modifiers(options);\n receiver(target).dispatchEvent(keyevent(\"keyup\", key, mods));\n return { ok: true, summary: `Key ${key} released.`, details: { modifiers: mods } };\n }\n case \"submitsearch\": {\n const field = fieldlike(target);\n if (!field) return { ok: false, summary: \"Target is not a search field.\" };\n const results = typeof options.results === \"string\" ? options.results : \"\";\n const timeout = typeof options.timeout === \"number\" ? options.timeout : 0;\n focuswhenneeded(field, options);\n field.dispatchEvent(keyevent(\"keydown\", \"Enter\", []));\n field.dispatchEvent(new KeyboardEvent(\"keypress\", { key: \"Enter\", bubbles: true, cancelable: true }));\n field.dispatchEvent(keyevent(\"keyup\", \"Enter\", []));\n return pollfor(() => Boolean(document.querySelector(results)), `Results region ${results}`, timeout);\n }\n case \"selectmulti\": {\n if (!(target instanceof HTMLSelectElement) || !target.multiple) return { ok: false, summary: \"Target is not a multi select control.\" };\n const choices = [...target.options].map(option => ({ value: option.value, label: clean(option.textContent || option.value) }));\n const requested = Array.isArray(options.values) ? options.values.filter((item): item is string => typeof item === \"string\") : [];\n const outcome = multichoices(requested, choices);\n if (outcome.missing.length > 0) return { ok: false, summary: `Reviewed option${outcome.missing.length === 1 ? \"\" : \"s\"} ${outcome.missing.join(\", \")} ${outcome.missing.length === 1 ? \"is\" : \"are\"} not part of the select control.` };\n for (const option of target.options) option.selected = outcome.present.includes(option.value);\n events(target);\n return { ok: true, summary: `Selected ${outcome.present.length} reviewed option${outcome.present.length === 1 ? \"\" : \"s\"} in the multi select control.`, details: { selected: outcome.present } };\n }\n case \"chooseradio\": {\n const radios = target instanceof HTMLInputElement && target.type === \"radio\"\n ? [...root.querySelectorAll<HTMLInputElement>(`input[type=radio][name=\"${CSS.escape(target.name)}\"]`)]\n : target ? [...(target as ParentNode).querySelectorAll<HTMLInputElement>(\"input[type=radio]\")] : [];\n if (radios.length === 0) return { ok: false, summary: \"No radio group owns the reviewed target.\" };\n const inputs = radios.map(radio => ({ value: radio.value, label: radio.labels && radio.labels.length > 0 ? clean(radio.labels[0]?.textContent || \"\") || radio.value : radio.value }));\n const index = radiochoice(inputs, step.value ?? \"\");\n const chosen = radios[index];\n if (!chosen) return { ok: false, summary: \"The reviewed radio option is not part of the group.\" };\n chosen.checked = true;\n events(chosen);\n return { ok: true, summary: `Picked reviewed radio option ${step.value}.`, details: { value: chosen.value } };\n }\n case \"setslider\": {\n if (!(target instanceof HTMLInputElement) || target.type !== \"range\") return { ok: false, summary: \"Target is not a range slider.\" };\n const requested = Number(step.value);\n if (!Number.isFinite(requested)) return { ok: false, summary: \"The reviewed slider value is not a number.\" };\n focuswhenneeded(target, options);\n const value = slidervalue(requested, Number(target.min), Number(target.max), Number(target.step));\n target.value = String(value);\n events(target);\n return { ok: true, summary: `Slider dragged to the reviewed value ${value}.`, details: { value } };\n }\n case \"setdate\": {\n if (!(target instanceof HTMLInputElement) || target.type !== \"date\") return { ok: false, summary: \"Target is not a date input.\" };\n const value = datevalue(step.value ?? \"\");\n if (value === null) return { ok: false, summary: \"The reviewed date is invalid.\" };\n focuswhenneeded(target, options);\n target.value = value;\n events(target);\n return { ok: true, summary: `Date input set to ${value}.`, details: { value } };\n }\n case \"setcolor\": {\n if (!(target instanceof HTMLInputElement) || target.type !== \"color\") return { ok: false, summary: \"Target is not a color input.\" };\n const value = colorvalue(step.value ?? \"\");\n if (value === null) return { ok: false, summary: \"The reviewed color is invalid.\" };\n focuswhenneeded(target, options);\n target.value = value;\n events(target);\n return { ok: true, summary: `Color input set to ${value}.`, details: { value } };\n }\n case \"expanddetails\": {\n const details = target instanceof HTMLElement ? target.closest(\"details\") : null;\n if (!details) return { ok: false, summary: \"Target is not inside a details section.\" };\n const outcome = expandstate(details.open);\n details.open = outcome.open;\n return { ok: true, summary: outcome.changed ? \"Collapsed details section opened.\" : \"Details section was already open.\", details: { changed: outcome.changed } };\n }\n default: return { ok: false, summary: \"Unsupported control action.\" };\n }\n}\n", "import type { pointpath, speedprofile, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { resolvestep, type stepresolution } from \"./pageresolve.js\";\n\n/**\n * Pointer path and coordinate click logics for reviewed steps.\n * Every correlated rule for waypoint interpolation, easing, jitter, hop settling, pointer sequences and coordinate clicks lives in this file.\n */\n\n/** One interpolated pointer position with the settle delay before it is dispatched. */\nexport interface pointerhop {\n x: number;\n y: number;\n delay: number;\n}\n\n/** One planned pointer or mouse event of a coordinate click sequence. */\nexport interface plannedevent {\n type: string;\n eventkind: \"pointer\" | \"mouse\";\n x: number;\n y: number;\n shift: boolean;\n}\n\nconst basecadence = 16;\n\nfunction distance(a: { x: number; y: number }, b: { x: number; y: number }): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nfunction ease(easing: \"linear\" | \"easeinout\", progress: number): number {\n if (easing === \"easeinout\") return progress * progress * (3 - 2 * progress);\n return progress;\n}\n\nfunction ispointref(value: unknown): value is { x: number; y: number } {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const point = value as Record<string, unknown>;\n return typeof point.x === \"number\" && Number.isFinite(point.x) && typeof point.y === \"number\" && Number.isFinite(point.y);\n}\n\n/** Interpolates one reviewed pointer path into settle-delimited hops, honoring the reviewed easing, peak velocity and jitter window. */\nexport function pathhops(path: pointpath, profile: speedprofile | undefined, random: () => number = Math.random, cadence: number = basecadence): pointerhop[] {\n const easing = profile?.easing === \"easeinout\" ? \"easeinout\" : \"linear\";\n const peak = typeof profile?.peak === \"number\" && profile.peak > 0 ? profile.peak : undefined;\n const jitter = typeof profile?.jitter === \"number\" && profile.jitter > 0 ? profile.jitter : 0;\n const points: Array<{ x: number; y: number }> = [path.start, ...(path.waypoints ?? []), path.end];\n const lengths: number[] = [];\n let total = 0;\n for (let index = 1; index < points.length; index += 1) {\n const length = distance(points[index - 1] as { x: number; y: number }, points[index] as { x: number; y: number });\n lengths.push(length);\n total += length;\n }\n const reviewedduration = typeof path.duration === \"number\" && Number.isFinite(path.duration) && path.duration > 0 ? path.duration : undefined;\n const duration = reviewedduration ?? (peak !== undefined && total > 0 ? (total / peak) * 1000 : 300);\n const hops: pointerhop[] = [];\n let previous = points[0] as { x: number; y: number };\n for (let index = 1; index < points.length; index += 1) {\n const from = points[index - 1] as { x: number; y: number };\n const to = points[index] as { x: number; y: number };\n const length = lengths[index - 1] ?? 0;\n if (total <= 0 || length <= 0) {\n hops.push({ x: to.x, y: to.y, delay: 0 });\n previous = to;\n continue;\n }\n const segmentduration = (duration * length) / total;\n const count = Math.max(1, Math.ceil(segmentduration / Math.max(1, cadence)));\n for (let hop = 1; hop <= count; hop += 1) {\n const progress = hop / count;\n const eased = ease(easing, progress);\n const position = { x: from.x + (to.x - from.x) * eased, y: from.y + (to.y - from.y) * eased };\n const step = distance(previous, position);\n const base = segmentduration / count;\n const capped = peak !== undefined ? Math.max(base, (step / peak) * 1000) : base;\n hops.push({ x: position.x, y: position.y, delay: Math.max(0, capped + (jitter > 0 ? random() * jitter : 0)) });\n previous = position;\n }\n }\n return hops;\n}\n\n/** Builds the pointer event sequence around a reviewed path: pointerover, one pointermove per hop, then pointerout. */\nexport function pointersequence(hopcount: number): string[] {\n return [\"pointerover\", ...Array.from({ length: Math.max(0, hopcount) }, () => \"pointermove\"), \"pointerout\"];\n}\n\n/** Builds the full pointer click sequence for reviewed coordinates and modifiers. */\nexport function clickplan(x: number, y: number, modifiers: string[]): plannedevent[] {\n const shift = modifiers.includes(\"shift\");\n const pointer = (type: string): plannedevent => ({ type, eventkind: \"pointer\", x, y, shift });\n const mouse = (type: string): plannedevent => ({ type, eventkind: \"mouse\", x, y, shift });\n return [pointer(\"pointerover\"), pointer(\"pointermove\"), pointer(\"pointerdown\"), mouse(\"mousedown\"), pointer(\"pointerup\"), mouse(\"mouseup\"), mouse(\"click\")];\n}\n\n/** Dispatches one planned event on an element with the reviewed coordinates and modifier flags. */\nfunction dispatchplanned(element: Element, event: plannedevent): void {\n const init: MouseEventInit & PointerEventInit = { bubbles: true, cancelable: true, composed: true, clientX: event.x, clientY: event.y, shiftKey: event.shift };\n if (event.eventkind === \"pointer\") element.dispatchEvent(new PointerEvent(event.type, init));\n else element.dispatchEvent(new MouseEvent(event.type, init));\n}\n\n/** Dispatches the full pointer click sequence on one element with the reviewed modifiers. */\nexport function dispatchclick(element: HTMLElement, modifiers: string[] = []): void {\n const rect = element.getBoundingClientRect();\n const x = rect.left + rect.width / 2;\n const y = rect.top + rect.height / 2;\n for (const event of clickplan(x, y, modifiers)) dispatchplanned(element, event);\n}\n\n/** Scrolls one target into view before any pointer interaction. */\nexport function ensurevisible(element: HTMLElement): void {\n try { element.scrollIntoView({ block: \"center\", inline: \"nearest\", behavior: \"auto\" }); } catch { /* scroll containers may refuse; the interaction still proceeds */ }\n}\n\nfunction settle(delay: number): Promise<void> {\n return new Promise(resolve => window.setTimeout(resolve, delay));\n}\n\n/** Dispatches a pointermove event at one viewport position on the element under the pointer. */\nfunction dispatchmove(x: number, y: number): void {\n const element = document.elementFromPoint(x, y);\n const receiver = element ?? document.documentElement;\n receiver.dispatchEvent(new PointerEvent(\"pointermove\", { bubbles: true, cancelable: true, composed: true, clientX: x, clientY: y }));\n}\n\n/** Travels one reviewed pointpath with dispatched pointermove events, settling each hop before the next one. */\nasync function travel(path: pointpath, profile: speedprofile | undefined): Promise<stepresult> {\n const hops = pathhops(path, profile);\n const startelement = document.elementFromPoint(path.start.x, path.start.y) ?? document.documentElement;\n startelement.dispatchEvent(new PointerEvent(\"pointerover\", { bubbles: true, cancelable: true, composed: true, clientX: path.start.x, clientY: path.start.y }));\n for (const hop of hops) {\n await settle(hop.delay);\n dispatchmove(hop.x, hop.y);\n }\n const endelement = document.elementFromPoint(path.end.x, path.end.y) ?? document.documentElement;\n endelement.dispatchEvent(new PointerEvent(\"pointerout\", { bubbles: true, cancelable: true, composed: true, clientX: path.end.x, clientY: path.end.y }));\n return { ok: true, summary: `Pointer traveled ${hops.length} hop${hops.length === 1 ? \"\" : \"s\"} to the reviewed end point.` };\n}\n\n/** Runs one reviewed pointer step: movepointer paths, clickpoint coordinate clicks and shiftclick modified clicks. */\nexport function runpointerstep(step: toolstep, resolution: stepresolution): stepresult | Promise<stepresult> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n if (step.kind === \"movepointer\") {\n const path = options.pointpath as Record<string, unknown> | undefined;\n if (!path || !ispointref(path.start) || !ispointref(path.end)) return { ok: false, summary: \"The reviewed pointer path is absent.\" };\n const waypoints = Array.isArray(path.waypoints) && path.waypoints.every(item => ispointref(item)) ? path.waypoints as pointpath[\"waypoints\"] : undefined;\n const fullpath: pointpath = { start: path.start, end: path.end, ...(waypoints ? { waypoints } : {}), ...(typeof path.duration === \"number\" && Number.isFinite(path.duration) ? { duration: path.duration } : {}) };\n return travel(fullpath, options.speedprofile as speedprofile | undefined);\n }\n if (step.kind === \"clickpoint\") {\n const reference = options.targetref as Record<string, unknown> | undefined;\n const x = Number(reference?.x);\n const y = Number(reference?.y);\n if (!Number.isFinite(x) || !Number.isFinite(y)) return { ok: false, summary: \"The reviewed click coordinates are absent.\" };\n const element = document.elementFromPoint(x, y);\n if (!(element instanceof HTMLElement)) return { ok: false, summary: \"No element is rendered at the reviewed coordinates.\" };\n ensurevisible(element);\n for (const event of clickplan(x, y, [])) dispatchplanned(element, event);\n return { ok: true, summary: `Clicked the element at the reviewed coordinates ${x},${y}.` };\n }\n if (step.kind === \"shiftclick\") {\n if (resolution.status === \"ambiguous\") return { ok: false, summary: `The reviewed reference matched ${resolution.candidates.length} elements; choose one candidate.`, details: { mode: resolution.mode, candidates: resolution.candidates } };\n if (resolution.status !== \"resolved\") return { ok: false, summary: \"Action target is no longer available.\" };\n ensurevisible(resolution.element);\n dispatchclick(resolution.element, [\"shift\"]);\n return { ok: true, summary: `Shift click delivered to ${resolution.target.label || resolution.target.tag}.`, details: { mode: resolution.target.mode, resolvedtarget: resolution.target } };\n }\n return { ok: false, summary: \"Unsupported pointer action.\" };\n}\n", "import type { retryrule, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { describeframes, queryscoped, queryshadowchain, resolvestep, targetsummary, walkframepath } from \"./pageresolve.js\";\nimport { dispatchclick, ensurevisible } from \"./pagepointer.js\";\n\n/**\n * Resolution driven interactions for reviewed steps.\n * Every correlated rule for text, aria and name clicks, shadow piercing, frame routing, wrapper step extraction and the retry loop lives in this file.\n */\n\n/** Reads the reviewed options of a step without throwing on malformed payloads. */\nfunction optionsof(step: toolstep): Record<string, unknown> {\n try { return parseoptions(step); } catch { return {}; }\n}\n\n/** Extracts the reviewed inner step of a retry or frame wrapper from its inline options. */\nexport function innerstep(step: toolstep): toolstep | null {\n const options = optionsof(step);\n const kind = options.kind;\n if (typeof kind !== \"string\" || !kind.trim()) return null;\n const inneroptions = options.options;\n return {\n id: `${step.id}inner`,\n kind: kind as toolstep[\"kind\"],\n summary: step.summary,\n risk: step.risk,\n ...(typeof options.target === \"string\" ? { target: options.target } : {}),\n ...(typeof options.value === \"string\" ? { value: options.value } : {}),\n ...(inneroptions && typeof inneroptions === \"object\" && !Array.isArray(inneroptions) ? { options: JSON.stringify(inneroptions) } : {}),\n };\n}\n\nfunction pointdistance(a: { x: number; y: number }, b: { x: number; y: number }): number {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nfunction settle(delay: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, delay));\n}\n\nexport interface retryoutcomeplan {\n ok: boolean;\n attempts: number;\n movement: number;\n summary: string;\n}\n\n/** Runs the reviewed retry loop: each failed attempt waits the settle window, revalidates the target geometry and reruns only when the element moved beyond the tolerance. */\nexport async function runretries(rule: retryrule, probe: () => Promise<{ x: number; y: number } | null>, execute: (attempt: number) => Promise<{ ok: boolean; summary: string }>): Promise<retryoutcomeplan> {\n const attempts = Math.max(1, Number.isFinite(rule.attempts) ? Math.floor(rule.attempts) : 1);\n const tolerance = typeof rule.tolerance === \"number\" && Number.isFinite(rule.tolerance) ? rule.tolerance : 0;\n const settles = typeof rule.settle === \"number\" && Number.isFinite(rule.settle) ? rule.settle : 0;\n let previous = await probe();\n let movement = 0;\n let made = 0;\n let last = \"\";\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n made = attempt;\n const result = await execute(attempt);\n last = result.summary;\n if (result.ok) return { ok: true, attempts: made, movement, summary: `Retry interaction succeeded on attempt ${made} after ${movement.toFixed(1)} pixels of observed movement.` };\n if (attempt >= attempts) break;\n if (settles > 0) await settle(settles);\n const current = await probe();\n if (!current) { previous = null; continue; }\n if (previous) {\n const delta = pointdistance(previous, current);\n movement = Math.max(movement, delta);\n if (delta <= tolerance) return { ok: false, attempts: made, movement, summary: `The target stayed within the reviewed tolerance of ${tolerance} pixels; retry stopped after attempt ${made}. ${last}` };\n }\n previous = current;\n }\n return { ok: false, attempts: made, movement, summary: `Retry interaction failed after ${made} attempt${made === 1 ? \"\" : \"s\"} with ${movement.toFixed(1)} pixels of observed movement. ${last}` };\n}\n\n/** Dispatches one reviewed click on a resolved element and reports the target mode used. */\nfunction clickresolved(stepkind: string, resolution: ReturnType<typeof resolvestep>): stepresult {\n if (resolution.status === \"ambiguous\") return { ok: false, summary: `The reviewed ${resolution.mode} reference matched ${resolution.candidates.length} elements: ${resolution.candidates.join(\"; \")}.`, details: { mode: resolution.mode, candidates: resolution.candidates } };\n if (resolution.status !== \"resolved\") return { ok: false, summary: \"The reviewed target is no longer available.\" };\n ensurevisible(resolution.element);\n dispatchclick(resolution.element);\n return { ok: true, summary: `Clicked ${resolution.target.label || resolution.target.tag} resolved by ${stepkind} ${resolution.target.mode} mode.`, details: { mode: resolution.target.mode, resolvedtarget: resolution.target } };\n}\n\n/** Runs one resolution driven interaction: text, aria and name clicks, shadow piercing and frame routing. */\nexport function runinteractstep(step: toolstep, expectedorigin: string, dispatch: (inner: toolstep, origin: string, root?: Document) => stepresult | Promise<stepresult>): stepresult | Promise<stepresult> {\n if (step.kind === \"clicktext\" || step.kind === \"clickaria\" || step.kind === \"clickname\") {\n return clickresolved(step.kind, resolvestep(step, document));\n }\n if (step.kind === \"pierceshadow\") {\n const options = optionsof(step);\n const shadow = Array.isArray(options.shadow) ? options.shadow.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const element = shadow.length > 0 ? queryshadowchain(document, shadow) : queryscoped(document, step.target ?? \"\");\n if (!(element instanceof HTMLElement)) return { ok: false, summary: \"The reviewed shadow target is not available.\" };\n ensurevisible(element);\n dispatchclick(element);\n const summary = targetsummary(\"selector\", element);\n return { ok: true, summary: `Clicked ${summary.label || summary.tag} resolved through ${shadow.length > 0 ? \"the reviewed shadow path\" : \"open shadow roots\"}.`, details: { mode: \"selector\", resolvedtarget: summary } };\n }\n if (step.kind === \"enterframe\") {\n const options = optionsof(step);\n const path = Array.isArray(options.framepath) ? options.framepath.filter((item): item is number => typeof item === \"number\" && Number.isInteger(item) && item >= 0) : [];\n const walk = walkframepath(describeframes(document), path);\n if (!walk.ok) return { ok: false, summary: walk.reason };\n const framedocument = walk.document.live;\n if (!framedocument) return { ok: false, summary: \"The reviewed frame document is not available.\" };\n const inner = innerstep(step);\n if (!inner) return { ok: false, summary: \"The reviewed inner step is absent.\" };\n return dispatch(inner, expectedorigin, framedocument);\n }\n return { ok: false, summary: \"Unsupported interaction action.\" };\n}\n", "import type { dialogpolicy, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\n\n/**\n * Dialog policy logics for reviewed steps.\n * Every correlated rule for policy parsing, dialog answers, main world handler installation and observed dialog harvesting lives in this file.\n * The isolated world cannot override window.confirm, window.alert or window.prompt, so the background installs these wrappers through the scripting api in the main world.\n */\n\n/** One dialog observed by the main world handler, recorded on the shared document. */\nexport interface observeddialog {\n dialog: string;\n text: string;\n result: string | boolean | null;\n at: number;\n}\n\n/** Parses the reviewed dialog policy from step options; prompts need a reviewed answer. */\nexport function parsedialogpolicy(step: toolstep): dialogpolicy | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { return null; }\n const accept = options.accept;\n const answer = options.answer;\n if (typeof accept !== \"boolean\" && typeof answer !== \"string\") return null;\n return { accept: accept === true, ...(typeof answer === \"string\" && answer.trim() ? { answer } : {}) };\n}\n\n/** Decides how the reviewed policy answers one dialog kind; a prompt without a reviewed answer is dismissed. */\nexport function dialoganswer(policy: dialogpolicy, dialog: \"confirm\" | \"alert\" | \"prompt\"): { accept: boolean; answer?: string } {\n if (dialog === \"prompt\") {\n if (policy.answer === undefined || policy.answer === \"\") return { accept: false };\n return { accept: policy.accept !== false, ...(policy.answer !== undefined ? { answer: policy.answer } : {}) };\n }\n return { accept: policy.accept };\n}\n\n/** Reads and clears the dialog log the main world handler recorded on the shared document. */\nexport function harvestdialoglog(root: Document): observeddialog[] {\n const raw = root.documentElement.dataset.devthinkdialoglog;\n if (!raw) return [];\n delete root.documentElement.dataset.devthinkdialoglog;\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is observeddialog => Boolean(item) && typeof item === \"object\" && typeof (item as Record<string, unknown>).dialog === \"string\");\n } catch { return []; }\n}\n\n/** Installs confirm, alert and prompt wrappers in the page main world answering per the reviewed policy; runs through chrome.scripting with world main. */\nexport function installdialoghandler(accept: boolean, answer: string, persistent: boolean): void {\n const world = globalThis as typeof globalThis & { devthinkoriginaldialogs?: { confirm: (text?: string) => boolean; alert: (text?: string) => void; prompt: (text?: string, defaultvalue?: string) => string | null } };\n const originals = world.devthinkoriginaldialogs ?? { confirm: window.confirm.bind(window), alert: window.alert.bind(window), prompt: window.prompt.bind(window) };\n world.devthinkoriginaldialogs = originals;\n const decide = (dialog: string): { accept: boolean; answer: string | null } => {\n if (dialog === \"prompt\") return answer ? { accept: true, answer } : { accept: false, answer: null };\n return { accept, answer: null };\n };\n const record = (dialog: string, text: string, result: string | boolean | null): void => {\n try {\n const root = document.documentElement;\n const log = JSON.parse(root.dataset.devthinkdialoglog ?? \"[]\") as unknown[];\n log.push({ dialog, text, result, at: Date.now() });\n root.dataset.devthinkdialoglog = JSON.stringify(log);\n } catch { /* a locked down page refuses dataset writes; the handler still answers */ }\n };\n window.confirm = (text?: string): boolean => {\n const decision = decide(\"confirm\");\n record(\"confirm\", text ?? \"\", decision.accept);\n if (!persistent) window.confirm = originals.confirm;\n return decision.accept;\n };\n window.alert = (text?: string): void => {\n record(\"alert\", text ?? \"\", true);\n if (!persistent) window.alert = originals.alert;\n };\n window.prompt = (text?: string, defaultvalue?: string): string | null => {\n const decision = decide(\"prompt\");\n const outcome = decision.accept ? (decision.answer ?? defaultvalue ?? \"\") : null;\n record(\"prompt\", text ?? \"\", outcome);\n if (!persistent) window.prompt = originals.prompt;\n return outcome;\n };\n}\n", "import type { observation, resolvedtarget, toolstep } from \"../types.js\";\nimport { runpageaction, type stepresult } from \"./pageactions.js\";\nimport { runpageread } from \"./pagereads.js\";\nimport { runpagecontrol } from \"./pagecontrols.js\";\nimport { runinteractstep } from \"./pageinteract.js\";\nimport { runpointerstep } from \"./pagepointer.js\";\nimport { harvestdialoglog, type observeddialog } from \"./pagedialogs.js\";\nimport { clean, elementlabel as label, elementselector as selector, resolvestep } from \"./pageresolve.js\";\n\n/**\n * Page bridge for reviewed steps.\n * Correlated rules for the dispatch seam, semantic snapshots, target preview with resolution, dialog log reads and the original action set live in this file.\n */\n\nfunction stepoptions(step: toolstep): Record<string, unknown> {\n if (!step.options) return {};\n try {\n const parsed = JSON.parse(step.options);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? (parsed as Record<string, unknown>) : {};\n } catch { return {}; }\n}\n\nconst previewid = \"devthinktargetpreview\";\n\nfunction clearpreview(): void {\n document.getElementById(previewid)?.remove();\n}\n\n/** Shows an ephemeral outline only; it neither mutates page data nor dispatches page events. */\nexport function previewtarget(step: toolstep, expectedorigin: string): { ok: boolean; summary: string; resolvedtarget?: resolvedtarget; candidates?: string[] } {\n if (location.origin !== expectedorigin) return { ok: false, summary: \"Page origin changed before preview.\" };\n clearpreview();\n const resolution = resolvestep(step, document);\n if (resolution.status === \"ambiguous\") return { ok: false, summary: `The reviewed ${resolution.mode} reference matched ${resolution.candidates.length} elements: ${resolution.candidates.join(\"; \")}.`, candidates: resolution.candidates };\n if (resolution.status !== \"resolved\") return { ok: false, summary: \"Reviewed target is no longer available.\" };\n const target = resolution.element;\n const rect = target.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return { ok: false, summary: \"Reviewed target is not currently visible.\" };\n const overlay = document.createElement(\"div\");\n overlay.id = previewid;\n overlay.setAttribute(\"aria-hidden\", \"true\");\n Object.assign(overlay.style, { position: \"fixed\", left: `${Math.max(0, rect.left - 3)}px`, top: `${Math.max(0, rect.top - 3)}px`, width: `${rect.width + 6}px`, height: `${rect.height + 6}px`, border: \"3px solid #2f80ed\", borderRadius: \"6px\", boxShadow: \"0 0 0 3px rgba(47,128,237,.28)\", pointerEvents: \"none\", zIndex: \"2147483647\", boxSizing: \"border-box\" });\n document.documentElement.append(overlay);\n window.setTimeout(clearpreview, 5000);\n return { ok: true, summary: `Previewing ${label(target) || target.tagName.toLowerCase()} for five seconds.`, resolvedtarget: resolution.target };\n}\n\n/** Captures the complete semantic page context for a user-approved active tab. */\nexport function capturesnapshot(): observation {\n const candidates = [...document.querySelectorAll(\"a[href], button, input, textarea, select, [role=button], [role=link], [role=combobox], [role=option], [role=checkbox], [role=radio], [role=switch], [role=tab], details, summary\")];\n const interactive = candidates.map(element => ({ selector: selector(element), role: element.getAttribute(\"role\") || element.tagName.toLowerCase(), label: label(element) })).filter(item => item.label || item.role);\n const forms = [...document.querySelectorAll(\"input, textarea, select\")].map(element => ({\n label: label(element),\n type: element.getAttribute(\"type\") || element.tagName.toLowerCase(),\n name: element.getAttribute(\"name\") || \"\",\n ...(element instanceof HTMLSelectElement ? { options: [...element.options].map(option => clean(option.textContent || option.value)) } : {}),\n }));\n const text = clean(document.body?.innerText || \"\");\n return { schemaversion: 2, url: location.href, title: clean(document.title), textpreview: text, textlength: document.body?.innerText.length ?? 0, forms, interactive, capturedat: Date.now() };\n}\n\n/** Reads and clears the dialog log the main world handler recorded on the shared document. */\nexport function readdialogs(): observeddialog[] {\n return harvestdialoglog(document);\n}\n\n/** Extracts full, read-only structured content for a reviewed extraction step. */\nfunction extractcontent(targetselector: string | undefined, root: Document): stepresult {\n if (!targetselector) {\n const links = [...root.querySelectorAll(\"a[href]\")].map(element => {\n const href = element instanceof HTMLAnchorElement ? element.getAttribute(\"href\") ?? \"\" : \"\";\n return { text: element.textContent?.trim() ?? \"\", href };\n });\n return { ok: true, summary: `Extracted ${links.length} link entries.`, details: { links } };\n }\n const target = root.querySelector(targetselector);\n if (!target) return { ok: false, summary: \"Extraction target is no longer available.\" };\n const text = target.textContent ?? \"\";\n return { ok: true, summary: `Extracted ${text.length} characters of content.`, details: { text } };\n}\n\n/** Scrolls one reviewed target into view without reading or changing other page state. */\nfunction scrolltarget(target: HTMLElement): stepresult {\n target.scrollIntoView({ block: \"center\", inline: \"nearest\", behavior: \"auto\" });\n return { ok: true, summary: `Scrolled ${label(target) || target.tagName.toLowerCase()} into view.` };\n}\n\n/** Dispatches hover events on one reviewed target. */\nfunction hovertarget(target: HTMLElement): stepresult {\n for (const type of [\"pointerover\", \"mouseover\", \"pointerenter\"] as const) {\n target.dispatchEvent(new PointerEvent(type, { bubbles: type !== \"pointerenter\", cancelable: true, composed: true }));\n }\n target.dispatchEvent(new MouseEvent(\"mouseenter\", { bubbles: false, cancelable: true }));\n return { ok: true, summary: `Hover events delivered to ${label(target) || target.tagName.toLowerCase()}.` };\n}\n\n/** Selects one reviewed existing option; values outside the declared options are refused. */\nfunction selectoption(target: HTMLElement, value: string): stepresult {\n if (!(target instanceof HTMLSelectElement)) return { ok: false, summary: \"Target is not a select element.\" };\n const option = [...target.options].find(candidate => candidate.value === value || candidate.textContent?.trim() === value);\n if (!option) return { ok: false, summary: \"Reviewed option is not part of the select element.\" };\n target.value = option.value;\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: true, summary: `Selected ${clean(option.textContent || option.value)}.` };\n}\n\nconst readkinds: ReadonlySet<string> = new Set([\"readattribute\", \"readstyle\", \"readgeometry\", \"readvalue\", \"readtext\", \"readhtml\", \"countelements\", \"readtable\", \"readlinks\", \"readimages\", \"readmeta\", \"readforms\", \"readstorage\", \"waitfor\", \"waittext\", \"highlight\", \"mapclicks\", \"verifyvisible\", \"verifyenabled\", \"resolvexpath\"]);\nconst mutatingkinds: ReadonlySet<string> = new Set([\"presskey\", \"clickdeep\", \"rightclick\", \"doubleclick\", \"drag\", \"drop\", \"upload\", \"clear\", \"check\", \"uncheck\", \"toggle\", \"submit\", \"setattribute\", \"removeattribute\", \"writestorage\", \"evaluate\", \"fullscreen\"]);\nconst controlkinds: ReadonlySet<string> = new Set([\"typetime\", \"appendtext\", \"setvalue\", \"typeedit\", \"keyhold\", \"keyrelease\", \"submitsearch\", \"selectmulti\", \"chooseradio\", \"setslider\", \"setdate\", \"setcolor\", \"expanddetails\"]);\nconst interactkinds: ReadonlySet<string> = new Set([\"clicktext\", \"clickaria\", \"clickname\", \"pierceshadow\", \"enterframe\"]);\nconst pointerkinds: ReadonlySet<string> = new Set([\"movepointer\", \"clickpoint\", \"shiftclick\"]);\n\n/** Performs one local action after the background policy gate and a fresh target resolution. */\nexport async function performstep(step: toolstep, expectedorigin: string, rootdocument: Document = document): Promise<stepresult> {\n if (location.origin !== expectedorigin) return { ok: false, summary: \"Page origin changed before action.\" };\n if (step.kind === \"observe\") return { ok: true, summary: \"Observation completed.\" };\n if (step.kind === \"wait\") {\n const requested = step.value ? Number.parseInt(step.value, 10) : 250;\n const duration = Number.isFinite(requested) && requested > 0 ? requested : 0;\n return new Promise(resolve => window.setTimeout(() => resolve({ ok: true, summary: `Reviewed wait of ${duration} milliseconds completed.` }), duration));\n }\n if (step.kind === \"extract\") return extractcontent(step.target, rootdocument);\n if (step.kind === \"navigate\") {\n if (!step.value || new URL(step.value).origin !== expectedorigin) return { ok: false, summary: \"Navigation target is outside the approved origin.\" };\n location.assign(step.value);\n return { ok: true, summary: \"Navigation request sent.\" };\n }\n if (step.kind === \"reload\") { location.reload(); return { ok: true, summary: \"Page reload requested.\" }; }\n if (step.kind === \"back\") { history.back(); return { ok: true, summary: \"History back requested.\" }; }\n if (step.kind === \"forward\") { history.forward(); return { ok: true, summary: \"History forward requested.\" }; }\n if (step.kind === \"scrollpage\") {\n const options = stepoptions(step);\n window.scrollBy({ left: typeof options.x === \"number\" ? options.x : 0, top: typeof options.y === \"number\" ? options.y : 600, behavior: \"auto\" });\n return { ok: true, summary: \"Window scrolled by the reviewed amounts.\" };\n }\n if (step.kind === \"scrollend\") { window.scrollTo(0, document.documentElement.scrollHeight); return { ok: true, summary: \"Window scrolled to the page end.\" }; }\n if (step.kind === \"scrolltop\") { window.scrollTo(0, 0); return { ok: true, summary: \"Window scrolled to the page top.\" }; }\n const resolution = resolvestep(step, rootdocument);\n if (resolution.status === \"ambiguous\") {\n return { ok: false, summary: `The reviewed ${resolution.mode} reference matched ${resolution.candidates.length} elements: ${resolution.candidates.join(\"; \")}.`, details: { mode: resolution.mode, candidates: resolution.candidates } };\n }\n const element = resolution.status === \"resolved\" ? resolution.element : null;\n let result: stepresult | Promise<stepresult>;\n if (readkinds.has(step.kind)) result = runpageread(step, element, rootdocument);\n else if (controlkinds.has(step.kind)) result = runpagecontrol(step, element, rootdocument);\n else if (interactkinds.has(step.kind)) return await runinteractstep(step, expectedorigin, performstep);\n else if (pointerkinds.has(step.kind)) result = runpointerstep(step, resolution);\n else if (mutatingkinds.has(step.kind)) result = runpageaction(step, element);\n else {\n if (!element) return { ok: false, summary: \"Action target is no longer available.\" };\n if (step.kind === \"scrollby\") {\n const options = stepoptions(step);\n element.scrollBy({ left: typeof options.x === \"number\" ? options.x : 0, top: typeof options.y === \"number\" ? options.y : 600, behavior: \"auto\" });\n result = { ok: true, summary: \"Container scrolled by the reviewed amounts.\" };\n } else if (step.kind === \"focus\") { element.focus(); result = { ok: true, summary: \"Target focused.\" }; }\n else if (step.kind === \"inspect\") result = { ok: true, summary: `Target: ${label(element) || element.tagName.toLowerCase()}.` };\n else if (step.kind === \"click\") { element.click(); result = { ok: true, summary: \"Reviewed click completed.\" }; }\n else if (step.kind === \"scroll\") result = scrolltarget(element);\n else if (step.kind === \"hover\") result = hovertarget(element);\n else if (step.kind === \"select\") result = selectoption(element, step.value ?? \"\");\n else if (step.kind === \"type\") {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) return { ok: false, summary: \"Target cannot receive text.\" };\n if (typeof step.value !== \"string\") return { ok: false, summary: \"Approved text is absent.\" };\n element.focus();\n element.value = step.value;\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n result = { ok: true, summary: \"Approved text entered.\" };\n } else return { ok: false, summary: \"Unsupported action.\" };\n }\n const output = await result;\n if (resolution.status === \"resolved\") {\n return { ...output, details: { ...(output.details ?? {}), mode: resolution.target.mode, resolvedtarget: resolution.target } };\n }\n return output;\n}\n\nObject.assign(globalThis, { devthinkbridge: { capturesnapshot, previewtarget, performstep, readdialogs } });\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["receiver", "owntext", "events", "modifiers", "keyevent", "fieldlike", "modifiers", "receiver"]
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Devthink</title><link rel="stylesheet" href="style.css"></head>
|
|
4
|
-
<body><main><header><p class="eyebrow">DEVTHINK 1.1.
|
|
4
|
+
<body><main><header><p class="eyebrow">DEVTHINK 1.1.33</p><h1>Browser bridge</h1><p>Consent is required before page access or action.</p></header><label for="endpoint">Optional agent endpoint</label><input id="endpoint" type="url" inputmode="url" placeholder="https://agent.example/proposal" autocomplete="off"><button id="connect">Approve endpoint origin</button><div class="actions"><button id="session">Start active tab session</button><button id="pause" class="secondary">Pause session</button><button id="openpanel" class="secondary">Review plans</button><button id="stop" class="danger">Stop</button></div><p id="capabilities" role="status" class="muted">Optional capabilities: loading.</p><p id="livelogic" role="status" class="muted">Held keys: none · Open dialogs answered: none.</p><p id="status" role="status">Loading session state.</p></main><script type="module" src="popup.js"></script></body>
|
|
5
5
|
</html>
|