@wenathlan/extension 1.1.32 → 1.1.34

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../memory.ts", "../../policy.ts", "../../progress.ts", "../../version.ts", "../../types.ts", "../../protocol.ts", "../browsertabs.ts", "../background.ts"],
4
- "sourcesContent": ["import type { agentplan, agentsession, auditevent, capabilityreport, diagnosticreport, endpointconfig, planprogress, runsettings, stepoutcome } from \"./types.js\";\n\n/** Provides a small storage seam that works in browser, tests and future adapters. */\nexport interface memoryadapter {\n get<T>(key: string): Promise<T | undefined>;\n set<T>(key: string, value: T): Promise<void>;\n}\n\nexport class sessionmemory {\n constructor(private readonly adapter: memoryadapter) {}\n\n async getconfig(): Promise<endpointconfig | undefined> { return this.adapter.get<endpointconfig>(\"config\"); }\n async setconfig(value: endpointconfig): Promise<void> { return this.adapter.set(\"config\", value); }\n async getsession(): Promise<agentsession | undefined> { return this.adapter.get<agentsession>(\"session\"); }\n async setsession(value: agentsession): Promise<void> { return this.adapter.set(\"session\", value); }\n async getplan(): Promise<agentplan | undefined> { return this.adapter.get<agentplan>(\"plan\"); }\n async setplan(value: agentplan): Promise<void> { return this.adapter.set(\"plan\", value); }\n async getdiagnostic(): Promise<diagnosticreport | undefined> { return this.adapter.get<diagnosticreport>(\"diagnostic\"); }\n async setdiagnostic(value: diagnosticreport): Promise<void> { return this.adapter.set(\"diagnostic\", value); }\n async getprogress(): Promise<planprogress | undefined> { return this.adapter.get<planprogress>(\"progress\"); }\n async setprogress(value: planprogress): Promise<void> { return this.adapter.set(\"progress\", value); }\n async getcapabilities(): Promise<capabilityreport | undefined> { return this.adapter.get<capabilityreport>(\"capabilities\"); }\n async setcapabilities(value: capabilityreport): Promise<void> { return this.adapter.set(\"capabilities\", value); }\n async getsettings(): Promise<runsettings | undefined> { return this.adapter.get<runsettings>(\"settings\"); }\n async setsettings(value: runsettings): Promise<void> { return this.adapter.set(\"settings\", value); }\n async getaudit(): Promise<auditevent[]> { return (await this.adapter.get<auditevent[]>(\"audit\")) ?? []; }\n async getoutcomes(): Promise<stepoutcome[]> { return (await this.adapter.get<stepoutcome[]>(\"outcomes\")) ?? []; }\n\n /** Records one audit event; retention is a user setting and an absent setting keeps every event. */\n async addaudi(event: auditevent): Promise<void> {\n const records = await this.getaudit();\n const combined = [event, ...records];\n const retention = (await this.getsettings())?.auditretention;\n await this.adapter.set(\"audit\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Records one step outcome; retention is a user setting and an absent setting keeps every outcome. */\n async addoutcome(outcome: stepoutcome): Promise<void> {\n const records = await this.getoutcomes();\n const combined = [outcome, ...records];\n const retention = (await this.getsettings())?.outcomeretention;\n await this.adapter.set(\"outcomes\", retention === undefined ? combined : combined.slice(0, retention));\n }\n}\n\n/** Creates identifiers locally without a network dependency. */\nexport function randomid(): string {\n return crypto.randomUUID();\n}\n", "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 { agentplan, planprogress, stepoutcome } from \"./types.js\";\n\n/**\n * Execution-progress logics for reviewed plans.\n * Every correlated rule for step completion, outcome history, deduplication and plan closure lives in this file.\n */\n\n/** Returns a fresh progress record for a plan that has not executed any step yet. */\nexport function emptyprogress(planid: string, now: number): planprogress {\n return { planid, completedsteps: [], updatedat: now };\n}\n\n/** Records one successfully executed step; repeated executions of the same step stay deduplicated. */\nexport function recordstep(progress: planprogress | undefined, planid: string, stepid: string, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n if (base.completedsteps.includes(stepid)) return { ...base, updatedat: now };\n return { planid, completedsteps: [...base.completedsteps, stepid], updatedat: now };\n}\n\n/** Records one structured step outcome beside the completion log; outcomes are never truncated. */\nexport function recordoutcome(progress: planprogress | undefined, planid: string, outcome: stepoutcome, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n return { ...base, outcomes: [...(base.outcomes ?? []), outcome], updatedat: now };\n}\n\n/** True only when every step of the plan has a recorded, successful execution. */\nexport function iscomplete(progress: planprogress | undefined, plan: agentplan): boolean {\n if (!progress || progress.planid !== plan.id) return false;\n const required = plan.steps.map(step => step.id);\n return required.length > 0 && required.every(id => progress.completedsteps.includes(id));\n}\n\n/** Clears progress whenever a different plan replaces the tracked one while preserving prior history snapshots. */\nexport function resetforplan(progress: planprogress | undefined, plan: agentplan, now: number): planprogress {\n if (progress && progress.planid === plan.id) return progress;\n if (!progress) return emptyprogress(plan.id, now);\n const snapshot: planprogress = { planid: progress.planid, completedsteps: progress.completedsteps, ...(progress.outcomes ? { outcomes: progress.outcomes } : {}), updatedat: progress.updatedat };\n return { planid: plan.id, completedsteps: [], outcomes: [], prior: [...(progress.prior ?? []), snapshot], updatedat: now };\n}\n", "/** Canonical package version synchronized from package.json. */\nexport const packageversion = \"1.1.32\" as const;\n", "/** Shared contracts for every Devthink target. */\nimport { packageversion } from \"./version.js\";\n\nexport const protocolversion = packageversion;\n\n/** Every reviewed action kind. Read kinds observe, interaction kinds move focus, sensitive kinds change page or browser state. */\nexport type actionkind =\n | \"observe\" | \"inspect\" | \"extract\" | \"wait\" | \"waitfor\" | \"waittext\"\n | \"readattribute\" | \"readstyle\" | \"readgeometry\" | \"readvalue\" | \"readtext\" | \"readhtml\"\n | \"countelements\" | \"readtable\" | \"readlinks\" | \"readimages\" | \"readmeta\" | \"readforms\"\n | \"readstorage\" | \"highlight\" | \"tablist\" | \"windowlist\" | \"tabsnapshot\"\n | \"focus\" | \"scroll\" | \"hover\" | \"clickdeep\" | \"rightclick\" | \"doubleclick\"\n | \"scrollpage\" | \"scrollby\" | \"scrollend\" | \"scrolltop\" | \"fullscreen\" | \"zoomset\"\n | \"click\" | \"type\" | \"navigate\" | \"select\" | \"presskey\" | \"drag\" | \"drop\" | \"upload\"\n | \"clear\" | \"check\" | \"uncheck\" | \"toggle\" | \"submit\" | \"reload\" | \"back\" | \"forward\"\n | \"writestorage\" | \"setattribute\" | \"removeattribute\" | \"evaluate\"\n | \"tabcreate\" | \"tabactivate\" | \"tabclose\" | \"tabreload\"\n | \"windowcreate\" | \"windowclose\" | \"windowresize\" | \"downloadfile\";\n\nexport type actionrisk = \"read\" | \"interaction\" | \"sensitive\";\nexport type planstate = \"draft\" | \"pending\" | \"approved\" | \"rejected\" | \"expired\" | \"completed\" | \"cancelled\";\nexport type auditkind = \"configure\" | \"session\" | \"observe\" | \"proposal\" | \"approval\" | \"action\" | \"error\" | \"stop\" | \"pause\" | \"resume\" | \"complete\" | \"capability\" | \"tab\" | \"window\" | \"download\";\n\nexport interface toolstep {\n id: string;\n kind: actionkind;\n target?: string;\n value?: string;\n /** Reviewed JSON parameters such as modifiers, amounts or coordinates. */\n options?: string;\n summary: string;\n risk: actionrisk;\n}\n\nexport interface agentplan {\n id: string;\n objective: string;\n origin: string;\n steps: toolstep[];\n createdat: number;\n expiresat: number;\n state: planstate;\n approvedat?: number;\n completedat?: number;\n}\n\nexport interface agentsession {\n id: string;\n tabid: number;\n origin: string;\n startedat: number;\n expiresat: number;\n stoppedat?: number;\n pausedat?: number;\n /** Origins granted to this session; prepared for multi origin work. */\n grants?: string[];\n}\n\nexport interface endpointconfig {\n endpoint: string;\n origin: string;\n configuredat: number;\n}\n\nexport interface observation {\n /** Observation schema version for forward compatibility. */\n schemaversion: number;\n url: string;\n title: string;\n textpreview: string;\n textlength: number;\n forms: Array<{ label: string; type: string; name: string; options?: string[] }>;\n interactive: Array<{ selector: string; role: string; label: string }>;\n capturedat: number;\n}\n\nexport interface auditevent {\n id: string;\n kind: auditkind;\n at: number;\n summary: string;\n sessionid?: string;\n planid?: string;\n stepid?: string;\n}\n\nexport interface diagnosticreport {\n id: string;\n sessionid: string;\n origin: string;\n capturedat: number;\n tabid: number;\n title: string;\n textlength: number;\n interactivecount: number;\n formcount: number;\n bridgeavailable: boolean;\n}\n\n/** Live report of the optional browser capabilities the user has granted. */\nexport interface capabilityreport {\n tabs: boolean;\n downloads: boolean;\n clipboardread: boolean;\n clipboardwrite: boolean;\n reportedat: number;\n}\n\n/** Structured result of one executed step, kept with configurable retention. */\nexport interface stepoutcome {\n stepid: string;\n ok: boolean;\n summary: string;\n details?: Record<string, unknown>;\n at: number;\n}\n\n/** User chosen retention windows; an absent value keeps everything forever. */\nexport interface runsettings {\n auditretention?: number;\n outcomeretention?: number;\n}\n\nexport interface proposalrequest {\n objective: string;\n session: agentsession;\n observation: observation;\n capabilities: capabilityreport;\n}\n\nexport interface planproposal {\n version: typeof protocolversion;\n plan: agentplan;\n}\n\nexport interface policyevaluation {\n allowed: boolean;\n reason?: string;\n}\n\n/** Tracks which reviewed steps of one plan have already executed locally. */\nexport interface planprogress {\n planid: string;\n completedsteps: string[];\n outcomes?: stepoutcome[];\n /** Prior progress snapshots preserved when a new plan replaces the tracked one. */\n prior?: planprogress[];\n updatedat: number;\n}\n", "import { actionrisk, parseoptions, validatestep } from \"./policy.js\";\nimport { protocolversion, type agentplan, type planproposal, type proposalrequest, type stepoutcome, type toolstep } from \"./types.js\";\n\nfunction record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Protocol message must be an object.\");\n return value as Record<string, unknown>;\n}\n\nfunction text(value: unknown, field: string): string {\n if (typeof value !== \"string\" || !value.trim()) throw new Error(`${field} must be a non-empty string.`);\n return value.trim();\n}\n\n/** Validates agent output before it becomes a locally reviewable plan. Plans may carry any number of steps. */\nexport function parseproposal(value: unknown, origin: string): planproposal {\n const root = record(value);\n if (root.version !== protocolversion) throw new Error(\"Unsupported protocol version.\");\n const planinput = record(root.plan);\n const stepsinput = planinput.steps;\n if (!Array.isArray(stepsinput) || stepsinput.length === 0) throw new Error(\"A plan needs at least one step.\");\n const steps: toolstep[] = stepsinput.map((input, index) => {\n const candidate = record(input);\n const kind = text(candidate.kind, `step ${index + 1} kind`) as toolstep[\"kind\"];\n const step: toolstep = {\n id: typeof candidate.id === \"string\" ? candidate.id : crypto.randomUUID(),\n kind,\n summary: text(candidate.summary, `step ${index + 1} summary`),\n risk: actionrisk(kind),\n ...(typeof candidate.target === \"string\" ? { target: candidate.target } : {}),\n ...(typeof candidate.value === \"string\" ? { value: candidate.value } : {}),\n ...(typeof candidate.options === \"string\" ? { options: candidate.options } : {}),\n };\n const evaluation = validatestep(step, origin);\n if (!evaluation.allowed) throw new Error(evaluation.reason);\n return step;\n });\n const createdat = Date.now();\n const expiresat = typeof planinput.expiresat === \"number\" ? planinput.expiresat : createdat + 10 * 60 * 1000;\n const plan: agentplan = {\n id: typeof planinput.id === \"string\" ? planinput.id : crypto.randomUUID(),\n objective: text(planinput.objective, \"objective\"),\n origin,\n steps,\n createdat,\n expiresat,\n state: \"pending\",\n };\n if (plan.expiresat <= createdat) throw new Error(\"Plan expiry must be in the future.\");\n return { version: protocolversion, plan };\n}\n\n/** Shapes the only data that may be sent to a user-configured agent endpoint. */\nexport function requestbody(input: proposalrequest): string {\n return JSON.stringify({ version: protocolversion, objective: input.objective, session: input.session, observation: input.observation, capabilities: input.capabilities });\n}\n\n/** Wraps one executed step outcome in the versioned response envelope for callers. */\nexport function outcomeresponse(input: { outcome: stepoutcome; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, outcome: input.outcome });\n}\n", "import type { capabilityreport, toolstep } from \"../types.js\";\n\n/**\n * Browser-level command surface for reviewed steps.\n * Every correlated rule for tab, window, zoom, snapshot and download actions plus capability negotiation lives in this file.\n */\n\nexport type browserresult = { ok: boolean; summary: string; details?: Record<string, unknown> };\n\nconst browserkinds: ReadonlySet<string> = new Set([\"tablist\", \"tabcreate\", \"tabactivate\", \"tabclose\", \"tabreload\", \"tabsnapshot\", \"windowlist\", \"windowcreate\", \"windowclose\", \"zoomset\", \"windowresize\", \"downloadfile\"]);\n\n/** True when the kind executes against browser-level surfaces instead of the page. */\nexport function isbrowserkind(kind: string): boolean {\n return browserkinds.has(kind);\n}\n\n/** Builds the live capability report from the optional permissions the user granted. */\nexport async function readcapabilities(): Promise<capabilityreport> {\n const [tabs, downloads, clipboardread, clipboardwrite] = await Promise.all([\n chrome.permissions.contains({ permissions: [\"tabs\"] }),\n chrome.permissions.contains({ permissions: [\"downloads\"] }),\n chrome.permissions.contains({ permissions: [\"clipboardRead\"] }),\n chrome.permissions.contains({ permissions: [\"clipboardWrite\"] }),\n ]);\n return { tabs, downloads, clipboardread, clipboardwrite, reportedat: Date.now() };\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\nfunction tabid(step: toolstep): number {\n return Number.parseInt(step.value ?? \"\", 10);\n}\n\n/** Executes one reviewed browser-level action kind against the live browser. */\nexport async function runbrowseraction(step: toolstep, sessiontabid: number, windowid: number): Promise<browserresult> {\n const options = stepoptions(step);\n switch (step.kind) {\n case \"tablist\": {\n const tabs = await chrome.tabs.query({});\n return { ok: true, summary: `Listed ${tabs.length} open tab${tabs.length === 1 ? \"\" : \"s\"}.`, details: { tabs: tabs.map(tab => ({ id: tab.id ?? 0, index: tab.index, title: tab.title ?? \"\", url: tab.url ?? \"\", active: tab.active, pinned: tab.pinned, audible: tab.audible ?? false })) } };\n }\n case \"tabcreate\": {\n const created = await chrome.tabs.create({ url: step.value, active: options.active !== false, pinned: options.pinned === true });\n return { ok: true, summary: `Opened a new tab for ${step.value}.`, details: { tabid: created?.id ?? 0 } };\n }\n case \"tabactivate\": {\n await chrome.tabs.update(tabid(step), { active: true });\n return { ok: true, summary: `Activated tab ${tabid(step)}.` };\n }\n case \"tabclose\": {\n await chrome.tabs.remove(tabid(step));\n return { ok: true, summary: `Closed tab ${tabid(step)}.` };\n }\n case \"tabreload\": {\n await chrome.tabs.reload(tabid(step), { bypassCache: options.bypasscache === true });\n return { ok: true, summary: `Reloaded tab ${tabid(step)}.` };\n }\n case \"tabsnapshot\": {\n const shot = await chrome.tabs.captureVisibleTab(windowid, { format: \"png\" });\n return { ok: true, summary: \"Captured the visible area of the active tab.\", details: { shot } };\n }\n case \"windowlist\": {\n const windows = await chrome.windows.getAll();\n return { ok: true, summary: `Listed ${windows.length} open window${windows.length === 1 ? \"\" : \"s\"}.`, details: { windows: windows.map(item => ({ id: item.id ?? 0, type: item.type, state: item.state ?? \"\", focused: item.focused })) } };\n }\n case \"windowcreate\": {\n const created = await chrome.windows.create({ url: step.value ?? \"about:blank\", ...(typeof options.width === \"number\" ? { width: options.width } : {}), ...(typeof options.height === \"number\" ? { height: options.height } : {}) });\n return { ok: true, summary: `Opened a new window for ${step.value}.`, details: { windowid: created?.id ?? 0 } };\n }\n case \"windowclose\": {\n await chrome.windows.remove(tabid(step));\n return { ok: true, summary: `Closed window ${tabid(step)}.` };\n }\n case \"zoomset\": {\n const zoom = Number(step.value);\n await chrome.tabs.setZoom(sessiontabid, zoom);\n return { ok: true, summary: `Set the tab zoom to ${zoom}.` };\n }\n case \"windowresize\": {\n await chrome.windows.update(tabid(step), { width: options.width as number, height: options.height as number });\n return { ok: true, summary: `Resized window ${tabid(step)}.` };\n }\n case \"downloadfile\": {\n const downloadid = await chrome.downloads.download({ url: step.value ?? \"\" });\n return { ok: true, summary: `Started the download of ${step.value}.`, details: { downloadid } };\n }\n default: return { ok: false, summary: \"Unsupported browser action.\" };\n }\n}\n", "import { randomid, sessionmemory } from \"../memory.js\";\nimport { canexecute, canpreview, hostpattern, normalizeendpoint, requiredcapability } from \"../policy.js\";\nimport { iscomplete, recordoutcome, recordstep, resetforplan } from \"../progress.js\";\nimport { parseproposal, requestbody } from \"../protocol.js\";\nimport type { agentplan, agentsession, auditevent, capabilityreport, diagnosticreport, observation, stepoutcome, toolstep } from \"../types.js\";\nimport { isbrowserkind, readcapabilities, runbrowseraction } from \"./browsertabs.js\";\n\nconst sessionduration = 15 * 60 * 1000;\nconst freshcheckkinds: ReadonlySet<string> = new Set([\"focus\", \"inspect\", \"click\", \"type\", \"scroll\", \"select\", \"hover\"]);\n\nconst chromestorage = {\n async get<T>(key: string): Promise<T | undefined> { return (await chrome.storage.local.get(key))[key] as T | undefined; },\n async set<T>(key: string, value: T): Promise<void> { await chrome.storage.local.set({ [key]: value }); },\n};\nconst memory = new sessionmemory(chromestorage);\n\nfunction extensionpage(sender: chrome.runtime.MessageSender): boolean {\n return sender.id === chrome.runtime.id && Boolean(sender.url?.startsWith(chrome.runtime.getURL(\"\")));\n}\n\nasync function audit(kind: auditevent[\"kind\"], summary: string, extra: Partial<auditevent> = {}): Promise<void> {\n await memory.addaudi({ id: randomid(), kind, at: Date.now(), summary, ...extra });\n}\n\n/** Refreshes and persists the capability report negotiated through the permissions api. */\nasync function refreshcapabilities(): Promise<capabilityreport> {\n const report = await readcapabilities();\n await memory.setcapabilities(report);\n return report;\n}\n\nasync function activecontext(): Promise<{ tab: chrome.tabs.Tab; origin: string }> {\n const [tab] = await chrome.tabs.query({ active: true, lastFocusedWindow: true });\n if (!tab?.id || !tab.url) throw new Error(\"No active web tab is available.\");\n const origin = new URL(tab.url).origin;\n if (!origin.startsWith(\"https://\")) throw new Error(\"Devthink can work with HTTPS pages only.\");\n return { tab, origin };\n}\n\nasync function snapshot(tabid: number): Promise<observation> {\n await chrome.scripting.executeScript({ target: { tabId: tabid }, files: [\"pagebridge.js\"] });\n const result = await chrome.scripting.executeScript({ target: { tabId: tabid }, func: () => {\n const bridge = (globalThis as typeof globalThis & { devthinkbridge?: { capturesnapshot: () => observation } }).devthinkbridge;\n if (!bridge) throw new Error(\"Devthink page bridge is unavailable.\");\n return bridge.capturesnapshot();\n } });\n const value = result[0]?.result;\n if (!value) throw new Error(\"The page did not return an observation.\");\n return value as observation;\n}\n\nasync function startsession(): Promise<agentsession> {\n const { tab, origin } = await activecontext();\n const session: agentsession = { id: randomid(), tabid: tab.id as number, origin, startedat: Date.now(), expiresat: Date.now() + sessionduration, grants: [origin] };\n await memory.setsession(session);\n await audit(\"session\", `Session started for ${origin}.`, { sessionid: session.id });\n return session;\n}\n\nasync function diagnostic(): Promise<diagnosticreport> {\n const session = await memory.getsession();\n const { tab, origin } = await activecontext();\n if (!session || session.stoppedat || session.expiresat <= Date.now() || session.tabid !== tab.id || session.origin !== origin) throw new Error(\"Start a current session for this active tab before diagnostics.\");\n const observation = await snapshot(session.tabid);\n const report: diagnosticreport = { id: randomid(), sessionid: session.id, origin, capturedat: Date.now(), tabid: session.tabid, title: observation.title, textlength: observation.textlength, interactivecount: observation.interactive.length, formcount: observation.forms.length, bridgeavailable: true };\n await memory.setdiagnostic(report);\n await audit(\"observe\", \"Structured diagnostics captured for the approved active tab.\", { sessionid: session.id });\n return report;\n}\n\nfunction localplan(objective: string, session: agentsession): agentplan {\n const now = Date.now();\n return { id: randomid(), objective, origin: session.origin, steps: [{ id: randomid(), kind: \"observe\", summary: \"Capture a complete semantic snapshot of the approved active tab.\", risk: \"read\" }], createdat: now, expiresat: now + sessionduration, state: \"pending\" };\n}\n\nasync function propose(objective: string, remote: boolean): Promise<agentplan> {\n if (!objective.trim()) throw new Error(\"An objective is required.\");\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Start a current browser session before requesting a plan.\");\n const { tab, origin } = await activecontext();\n if (session.tabid !== tab.id || session.origin !== origin) throw new Error(\"The selected tab or origin no longer matches the approved session.\");\n const observation = await snapshot(session.tabid);\n const capabilities = await refreshcapabilities();\n const config = await memory.getconfig();\n let plan = localplan(objective.trim(), session);\n if (remote) {\n if (!config) throw new Error(\"Configure an approved HTTPS endpoint before requesting a remote proposal.\");\n const response = await fetch(config.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, credentials: \"omit\", body: requestbody({ objective: objective.trim(), session, observation, capabilities }) });\n if (!response.ok) throw new Error(`Proposal endpoint returned ${response.status}.`);\n plan = parseproposal(await response.json(), session.origin).plan;\n }\n await memory.setplan(plan);\n await memory.setprogress(resetforplan(await memory.getprogress(), plan, Date.now()));\n await audit(\"proposal\", `Plan proposed with ${plan.steps.length} reviewed step${plan.steps.length === 1 ? \"\" : \"s\"}.`, { sessionid: session.id, planid: plan.id });\n return plan;\n}\n\nfunction browserauditkind(step: toolstep): auditevent[\"kind\"] {\n if (step.kind === \"downloadfile\") return \"download\";\n if (step.kind.startsWith(\"window\")) return \"window\";\n return \"tab\";\n}\n\nasync function executestep(stepid: string): Promise<{ ok: boolean; summary: string; details?: Record<string, unknown> }> {\n const session = await memory.getsession();\n const plan = await memory.getplan();\n const { tab, origin } = await activecontext();\n const step = plan?.steps.find(candidate => candidate.id === stepid);\n if (!step) throw new Error(\"Reviewed step was not found.\");\n const gate = canexecute({ session, plan, step, tabid: tab.id as number, origin });\n if (!gate.allowed) throw new Error(gate.reason);\n let output: { ok: boolean; summary: string; details?: Record<string, unknown> } | undefined;\n if (isbrowserkind(step.kind)) {\n const capability = requiredcapability(step.kind);\n if (capability) {\n const granted = await chrome.permissions.contains({ permissions: [capability] } as chrome.permissions.Permissions);\n if (!granted) throw new Error(`The ${capability} capability has not been granted; request it from the review panel.`);\n }\n output = await runbrowseraction(step, tab.id as number, tab.windowId ?? chrome.windows.WINDOW_ID_CURRENT);\n } else {\n if (step.target && freshcheckkinds.has(step.kind)) {\n const fresh = await snapshot(tab.id as number);\n if (!fresh.interactive.some(item => item.selector === step.target)) throw new Error(\"The page changed and the target must be reviewed again.\");\n }\n const result = await chrome.scripting.executeScript({ target: { tabId: tab.id as number }, func: (action: toolstep, expectedorigin: string) => {\n const bridge = (globalThis as typeof globalThis & { devthinkbridge?: { performstep: (input: toolstep, origin: string) => { ok: boolean; summary: string; details?: Record<string, unknown> } | Promise<{ ok: boolean; summary: string; details?: Record<string, unknown> }> } }).devthinkbridge;\n if (!bridge) throw new Error(\"Devthink page bridge is unavailable.\");\n return bridge.performstep(action, expectedorigin);\n }, args: [step, origin] });\n output = result[0]?.result as { ok: boolean; summary: string; details?: Record<string, unknown> } | undefined;\n }\n const summary = output?.summary ?? \"The page action returned no result.\";\n const outcome: stepoutcome = { stepid, ok: Boolean(output?.ok), summary, ...(output?.details ? { details: output.details } : {}), at: Date.now() };\n const auditkind = isbrowserkind(step.kind) ? browserauditkind(step) : output?.ok ? \"action\" : \"error\";\n await audit(auditkind, summary, { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}), stepid });\n await memory.addoutcome(outcome);\n if (output?.ok && plan) {\n const completed = recordstep(await memory.getprogress(), plan.id, stepid, Date.now());\n const tracked = recordoutcome(completed, plan.id, outcome, Date.now());\n await memory.setprogress(tracked);\n if (iscomplete(tracked, plan) && plan.state === \"approved\") {\n const done = { ...plan, state: \"completed\" as const, completedat: Date.now() };\n await memory.setplan(done);\n await audit(\"complete\", \"Every reviewed step of the approved plan has executed.\", { ...(session ? { sessionid: session.id } : {}), planid: done.id });\n }\n }\n return output ?? { ok: false, summary };\n}\n\n/** Highlights a reviewed target without clicking, typing, navigating or transmitting page data. */\nasync function previewstep(stepid: string): Promise<{ ok: boolean; summary: string }> {\n const session = await memory.getsession();\n const plan = await memory.getplan();\n const { tab, origin } = await activecontext();\n const step = plan?.steps.find(candidate => candidate.id === stepid);\n if (!step) throw new Error(\"Reviewed step was not found.\");\n const gate = canpreview({ session, plan, step, tabid: tab.id as number, origin });\n if (!gate.allowed) throw new Error(gate.reason);\n if (!step.target) throw new Error(\"Only a target-based step can be previewed.\");\n const result = await chrome.scripting.executeScript({ target: { tabId: tab.id as number }, func: (target: string, expectedorigin: string) => {\n const bridge = (globalThis as typeof globalThis & { devthinkbridge?: { previewtarget: (selector: string, origin: string) => { ok: boolean; summary: string } } }).devthinkbridge;\n if (!bridge) throw new Error(\"Devthink page bridge is unavailable.\");\n return bridge.previewtarget(target, expectedorigin);\n }, args: [step.target, origin] });\n const output = result[0]?.result as { ok: boolean; summary: string } | undefined;\n const summary = output?.summary ?? \"The target preview returned no result.\";\n await audit(output?.ok ? \"observe\" : \"error\", summary, { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}), stepid });\n return output ?? { ok: false, summary };\n}\n\nasync function pausesession(): Promise<agentsession> {\n const session = await memory.getsession();\n if (!session || session.stoppedat) throw new Error(\"No active browser session exists.\");\n if (session.expiresat <= Date.now()) throw new Error(\"The browser session has expired.\");\n if (session.pausedat) throw new Error(\"The browser session is already paused.\");\n const paused = { ...session, pausedat: Date.now() };\n await memory.setsession(paused);\n await audit(\"pause\", \"The user paused the browser session; no action or preview can run.\", { sessionid: session.id });\n return paused;\n}\n\nasync function resumesession(): Promise<agentsession> {\n const session = await memory.getsession();\n if (!session || session.stoppedat) throw new Error(\"No active browser session exists.\");\n if (session.expiresat <= Date.now()) throw new Error(\"The browser session has expired and cannot be resumed.\");\n if (!session.pausedat) throw new Error(\"The browser session is not paused.\");\n const resumed: agentsession = { id: session.id, tabid: session.tabid, origin: session.origin, startedat: session.startedat, expiresat: session.expiresat, ...(session.grants ? { grants: session.grants } : {}) };\n await memory.setsession(resumed);\n await audit(\"resume\", \"The user resumed the browser session; reviewed actions can run again.\", { sessionid: session.id });\n return resumed;\n}\n\nasync function grantcapability(permission: string): Promise<capabilityreport> {\n if (![\"tabs\", \"downloads\", \"clipboardRead\", \"clipboardWrite\"].includes(permission)) throw new Error(\"Unknown capability.\");\n const granted = await chrome.permissions.request({ permissions: [permission] } as chrome.permissions.Permissions);\n if (!granted) throw new Error(\"The capability grant was declined.\");\n await audit(\"capability\", `Capability ${permission} granted by the user.`);\n return refreshcapabilities();\n}\n\nasync function handlerequest(message: unknown, sender: chrome.runtime.MessageSender): Promise<unknown> {\n if (!extensionpage(sender)) throw new Error(\"Requests are accepted only from Devthink extension pages.\");\n const input = message as { kind?: string; endpoint?: string; objective?: string; stepid?: string; permission?: string };\n switch (input.kind) {\n case \"configure\": {\n const config = normalizeendpoint(input.endpoint ?? \"\");\n const granted = await chrome.permissions.contains({ origins: [hostpattern(config.origin)] });\n if (!granted) throw new Error(\"The endpoint origin has not received optional permission.\");\n await memory.setconfig(config);\n await audit(\"configure\", `Configured user-selected endpoint ${config.origin}.`);\n return config;\n }\n case \"startsession\": return startsession();\n case \"context\": {\n const plan = await memory.getplan();\n const progress = await memory.getprogress();\n return { config: await memory.getconfig(), session: await memory.getsession(), plan, progress: plan && progress?.planid === plan.id ? progress : undefined, diagnostic: await memory.getdiagnostic(), audit: await memory.getaudit(), capabilities: await refreshcapabilities(), outcomes: await memory.getoutcomes() };\n }\n case \"capabilities\": return refreshcapabilities();\n case \"grantcapability\": return grantcapability(input.permission ?? \"\");\n case \"diagnostic\": return diagnostic();\n case \"proposelocal\": return propose(input.objective ?? \"\", false);\n case \"proposeremote\": return propose(input.objective ?? \"\", true);\n case \"approve\": {\n const plan = await memory.getplan();\n if (!plan || plan.state !== \"pending\") throw new Error(\"Only a pending plan can be approved.\");\n const approved = { ...plan, state: \"approved\" as const, approvedat: Date.now() };\n await memory.setplan(approved);\n const current = await memory.getsession();\n await audit(\"approval\", \"The user approved the reviewed plan.\", { ...(current ? { sessionid: current.id } : {}), planid: approved.id });\n return approved;\n }\n case \"reject\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available to reject.\");\n const rejected = { ...plan, state: \"rejected\" as const };\n await memory.setplan(rejected);\n const current = await memory.getsession();\n await audit(\"approval\", \"The user rejected the plan.\", { ...(current ? { sessionid: current.id } : {}), planid: rejected.id });\n return rejected;\n }\n case \"preview\": return previewstep(input.stepid ?? \"\");\n case \"execute\": return executestep(input.stepid ?? \"\");\n case \"pausesession\": return pausesession();\n case \"resumesession\": return resumesession();\n case \"stop\": {\n const session = await memory.getsession();\n if (session) await memory.setsession({ ...session, stoppedat: Date.now() });\n const plan = await memory.getplan();\n if (plan && [\"pending\", \"approved\"].includes(plan.state)) await memory.setplan({ ...plan, state: \"cancelled\" });\n await audit(\"stop\", \"The user stopped the browser session.\", { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}) });\n return { stopped: true };\n }\n default: throw new Error(\"Unknown Devthink request.\");\n }\n}\n\nchrome.runtime.onMessage.addListener((message, sender, sendresponse) => {\n handlerequest(message, sender).then(value => sendresponse({ ok: true, value })).catch(error => sendresponse({ ok: false, error: error instanceof Error ? error.message : String(error) }));\n return true;\n});\n\nchrome.runtime.onConnect.addListener(port => {\n if (port.name !== \"devthinksidepanel\" || port.sender?.id !== chrome.runtime.id || !port.sender.url?.startsWith(chrome.runtime.getURL(\"\"))) return port.disconnect();\n port.onMessage.addListener(message => { handlerequest(message, port.sender ?? {}).then(value => port.postMessage({ ok: true, value })).catch(error => port.postMessage({ ok: false, error: error instanceof Error ? error.message : String(error) })); });\n});\n"],
5
- "mappings": "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",
6
- "names": ["snapshot", "tabid"]
3
+ "sources": ["../../memory.ts", "../../policy.ts", "../../progress.ts", "../../version.ts", "../../types.ts", "../../protocol.ts", "../browsertabs.ts", "../pagedialogs.ts", "../pageinteract.ts", "../pagecontrols.ts", "../background.ts"],
4
+ "sourcesContent": ["import type { a11ycapture, agentplan, agentsession, auditevent, bannerreport, capabilityreport, clickablemap, derivedselector, diagnosticreport, dialogdecision, dialogpolicy, endpointconfig, focusevent, keyholdstate, mutationevent, observationrecord, pagesignals, planprogress, readercapture, resolutionsummary, retryoutcome, runsettings, snapshotdiff, stepoutcome, templateprofile, watchregistration } from \"./types.js\";\n\n/** Provides a small storage seam that works in browser, tests and future adapters. */\nexport interface memoryadapter {\n get<T>(key: string): Promise<T | undefined>;\n set<T>(key: string, value: T): Promise<void>;\n}\n\n/**\n * Local memory for sessions, plans, audit evidence and interaction state.\n * Correlated rules for every stored record live in this one seam; each accessor is a one line storage delegation so future backends replace the adapter only.\n */\nexport class sessionmemory {\n constructor(private readonly adapter: memoryadapter) {}\n\n async getconfig(): Promise<endpointconfig | undefined> { return this.adapter.get<endpointconfig>(\"config\"); }\n async setconfig(value: endpointconfig): Promise<void> { return this.adapter.set(\"config\", value); }\n async getsession(): Promise<agentsession | undefined> { return this.adapter.get<agentsession>(\"session\"); }\n async setsession(value: agentsession): Promise<void> { return this.adapter.set(\"session\", value); }\n async getplan(): Promise<agentplan | undefined> { return this.adapter.get<agentplan>(\"plan\"); }\n async setplan(value: agentplan): Promise<void> { return this.adapter.set(\"plan\", value); }\n async getdiagnostic(): Promise<diagnosticreport | undefined> { return this.adapter.get<diagnosticreport>(\"diagnostic\"); }\n async setdiagnostic(value: diagnosticreport): Promise<void> { return this.adapter.set(\"diagnostic\", value); }\n async getprogress(): Promise<planprogress | undefined> { return this.adapter.get<planprogress>(\"progress\"); }\n async setprogress(value: planprogress): Promise<void> { return this.adapter.set(\"progress\", value); }\n async getcapabilities(): Promise<capabilityreport | undefined> { return this.adapter.get<capabilityreport>(\"capabilities\"); }\n async setcapabilities(value: capabilityreport): Promise<void> { return this.adapter.set(\"capabilities\", value); }\n async getsettings(): Promise<runsettings | undefined> { return this.adapter.get<runsettings>(\"settings\"); }\n async setsettings(value: runsettings): Promise<void> { return this.adapter.set(\"settings\", value); }\n async getaudit(): Promise<auditevent[]> { return (await this.adapter.get<auditevent[]>(\"audit\")) ?? []; }\n async getoutcomes(): Promise<stepoutcome[]> { return (await this.adapter.get<stepoutcome[]>(\"outcomes\")) ?? []; }\n\n /** Records one audit event; retention is a user setting and an absent setting keeps every event. */\n async addaudi(event: auditevent): Promise<void> {\n const records = await this.getaudit();\n const combined = [event, ...records];\n const retention = (await this.getsettings())?.auditretention;\n await this.adapter.set(\"audit\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Records one step outcome; retention is a user setting and an absent setting keeps every outcome. */\n async addoutcome(outcome: stepoutcome): Promise<void> {\n const records = await this.getoutcomes();\n const combined = [outcome, ...records];\n const retention = (await this.getsettings())?.outcomeretention;\n await this.adapter.set(\"outcomes\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Stores one clickable map under its observation version so every captured map stays available. */\n async setmap(map: clickablemap): Promise<void> { return this.adapter.set(`map${map.version}`, map); }\n\n /** Returns one stored clickable map by its observation version. */\n async getmap(version: number): Promise<clickablemap | undefined> { return this.adapter.get<clickablemap>(`map${version}`); }\n\n /** Advances and persists the observation version counter used to stamp clickable maps. */\n async nextobservationversion(): Promise<number> {\n const current = (await this.adapter.get<number>(\"observationversion\")) ?? 0;\n const next = current + 1;\n await this.adapter.set(\"observationversion\", next);\n return next;\n }\n\n /** Returns the latest observation version used to stamp a clickable map. */\n async getobservationversion(): Promise<number | undefined> { return this.adapter.get<number>(\"observationversion\"); }\n\n /** Returns the key hold registry, persisted so holds survive service worker restarts. */\n async getholds(): Promise<keyholdstate[]> { return (await this.adapter.get<keyholdstate[]>(\"holds\")) ?? []; }\n\n /** Replaces the key hold registry after one press or release transition. */\n async setholds(holds: keyholdstate[]): Promise<void> { return this.adapter.set(\"holds\", holds); }\n\n /** Returns every dialog decision recorded for the audit trail. */\n async getdialogs(): Promise<dialogdecision[]> { return (await this.adapter.get<dialogdecision[]>(\"dialogs\")) ?? []; }\n\n /** Records one dialog decision with the reviewed answer and the observed dialog text. */\n async adddialog(decision: dialogdecision): Promise<void> {\n const records = await this.getdialogs();\n await this.adapter.set(\"dialogs\", [decision, ...records]);\n }\n\n /** Returns every retry outcome recorded with attempts and movement deltas. */\n async getretries(): Promise<retryoutcome[]> { return (await this.adapter.get<retryoutcome[]>(\"retries\")) ?? []; }\n\n /** Records one retry outcome with the attempts made and the movement delta observed. */\n async addretry(outcome: retryoutcome): Promise<void> {\n const records = await this.getretries();\n await this.adapter.set(\"retries\", [outcome, ...records]);\n }\n\n /** Returns every resolution summary stored per target mode. */\n async getresolutions(): Promise<resolutionsummary[]> { return (await this.adapter.get<resolutionsummary[]>(\"resolutions\")) ?? []; }\n\n /** Records one resolution summary for later selector derivation. */\n async addresolution(summary: resolutionsummary): Promise<void> {\n const records = await this.getresolutions();\n await this.adapter.set(\"resolutions\", [summary, ...records]);\n }\n\n /** Returns the reviewed default dialog policy kept for the session auto handler. */\n async getdialogpolicy(): Promise<dialogpolicy | undefined> { return this.adapter.get<dialogpolicy>(\"dialogpolicy\"); }\n\n /** Stores the reviewed default dialog policy of the latest approved plan. */\n async setdialogpolicy(policy: dialogpolicy): Promise<void> { return this.adapter.set(\"dialogpolicy\", policy); }\n\n /** Stores one observation capture under its version so every observation version stays available. */\n async setobservation(record: observationrecord): Promise<void> { return this.adapter.set(`observation${record.version}`, record); }\n\n /** Returns one stored observation version. */\n async getobservation(version: number): Promise<observationrecord | undefined> { return this.adapter.get<observationrecord>(`observation${version}`); }\n\n /** Returns the observation retention window; an absent setting keeps every capture. */\n private async observationretention(): Promise<number | undefined> { return (await this.getsettings())?.observationretention; }\n\n /** Stores one accessibility tree capture; retention is a user setting and an absent setting keeps every tree. */\n async adda11ytree(capture: a11ycapture): Promise<void> {\n const records = await this.geta11ytrees();\n const combined = [capture, ...records];\n const retention = await this.observationretention();\n await this.adapter.set(\"a11ytrees\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Returns every stored accessibility tree capture, newest first. */\n async geta11ytrees(): Promise<a11ycapture[]> { return (await this.adapter.get<a11ycapture[]>(\"a11ytrees\")) ?? []; }\n\n /** Stores one reader article capture; retention is a user setting and an absent setting keeps every article. */\n async addreaderarticle(capture: readercapture): Promise<void> {\n const records = await this.getreaderarticles();\n const combined = [capture, ...records];\n const retention = await this.observationretention();\n await this.adapter.set(\"readerarticles\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Returns every stored reader article capture, newest first. */\n async getreaderarticles(): Promise<readercapture[]> { return (await this.adapter.get<readercapture[]>(\"readerarticles\")) ?? []; }\n\n /** Records one dom mutation observed inside a reviewed watch. */\n async addmutationevent(event: mutationevent): Promise<void> {\n const records = await this.getmutationevents();\n await this.adapter.set(\"mutationevents\", [event, ...records]);\n }\n\n /** Returns the mutation event stream of every reviewed watch. */\n async getmutationevents(): Promise<mutationevent[]> { return (await this.adapter.get<mutationevent[]>(\"mutationevents\")) ?? []; }\n\n /** Records one focus change observed inside a reviewed watch. */\n async addfocusevent(event: focusevent): Promise<void> {\n const records = await this.getfocusevents();\n await this.adapter.set(\"focusevents\", [event, ...records]);\n }\n\n /** Returns the focus event stream of every reviewed watch. */\n async getfocusevents(): Promise<focusevent[]> { return (await this.adapter.get<focusevent[]>(\"focusevents\")) ?? []; }\n\n /** Records one consent banner observed by a reviewed banner watch. */\n async addbanner(event: bannerreport): Promise<void> {\n const records = await this.getbanners();\n await this.adapter.set(\"banners\", [event, ...records]);\n }\n\n /** Returns every consent banner report observed so far. */\n async getbanners(): Promise<bannerreport[]> { return (await this.adapter.get<bannerreport[]>(\"banners\")) ?? []; }\n\n /** Records one snapshot diff between two observation versions. */\n async adddiff(diff: snapshotdiff): Promise<void> {\n const records = await this.getdiffs();\n await this.adapter.set(\"diffs\", [diff, ...records]);\n }\n\n /** Returns every stored snapshot diff, newest first. */\n async getdiffs(): Promise<snapshotdiff[]> { return (await this.adapter.get<snapshotdiff[]>(\"diffs\")) ?? []; }\n\n /** Records one derived selector with its stability score for reuse. */\n async addselector(selector: derivedselector): Promise<void> {\n const records = await this.getselectors();\n await this.adapter.set(\"selectors\", [selector, ...records]);\n }\n\n /** Returns every stored derived selector with its stability score, newest first. */\n async getselectors(): Promise<derivedselector[]> { return (await this.adapter.get<derivedselector[]>(\"selectors\")) ?? []; }\n\n /** Records one detected template class or section fingerprint for its origin. */\n async addtemplate(profile: templateprofile): Promise<void> {\n const records = await this.gettemplates();\n await this.adapter.set(\"templates\", [profile, ...records]);\n }\n\n /** Returns every stored template class and section fingerprint, newest first. */\n async gettemplates(): Promise<templateprofile[]> { return (await this.adapter.get<templateprofile[]>(\"templates\")) ?? []; }\n\n /** Records one watch registration so it survives service worker restarts. */\n async addwatch(watch: watchregistration): Promise<void> {\n const records = await this.getwatches();\n await this.adapter.set(\"watches\", [watch, ...records]);\n }\n\n /** Returns every watch registration, newest first, including closed windows. */\n async getwatches(): Promise<watchregistration[]> { return (await this.adapter.get<watchregistration[]>(\"watches\")) ?? []; }\n\n /** Closes one watch registration by watch id once its reviewed lifetime window ends. */\n async closewatch(watchid: string, closedat: number): Promise<void> {\n const records = await this.getwatches();\n await this.adapter.set(\"watches\", records.map(watch => watch.watchid === watchid && watch.closedat === undefined ? { ...watch, closedat } : watch));\n }\n\n /** Returns the live page signals of language, template, scroll lock and banner state. */\n async getsignals(): Promise<pagesignals | undefined> { return this.adapter.get<pagesignals>(\"signals\"); }\n\n /** Replaces the live page signals after an observation step refreshes them. */\n async setsignals(signals: pagesignals): Promise<void> { return this.adapter.set(\"signals\", signals); }\n}\n\n/** Creates identifiers locally without a network dependency. */\nexport function randomid(): string {\n return crypto.randomUUID();\n}\n", "import type { actionkind, agentplan, agentsession, endpointconfig, observationmode, 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\", \"a11ytree\", \"readvisible\", \"readertree\", \"detectlists\", \"detecttables\", \"readjson\", \"watchmutate\", \"waitquiet\", \"watchbanner\", \"detectinfinitescroll\", \"detectvirtual\", \"detectlazy\", \"readscrollpos\", \"readlang\", \"readoutline\", \"countpages\", \"listshadow\", \"listframes\", \"classifypage\", \"fingerprintsection\", \"diffsnapshots\", \"readselection\", \"watchfocus\", \"detectsticky\", \"detectscrolllock\", \"readopengraph\", \"detectlanguage\", \"deriveselector\"]);\nconst allowedactions = new Set<actionkind>([...sensitiveactions, ...interactionactions, ...readactions]);\nconst watchactions = new Set<actionkind>([\"watchmutate\", \"watchbanner\", \"watchfocus\"]);\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\", \"deriveselector\", \"fingerprintsection\"]);\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/** True when the action kind observes the page over a reviewed lifetime window. */\nexport function iswatchkind(kind: actionkind): boolean {\n return watchactions.has(kind);\n}\n\n/** Grades the observation mode of a kind: passive capture, watched lifetimes or diffing passes. */\nexport function observationmodeof(kind: actionkind): observationmode {\n if (watchactions.has(kind) || kind === \"waitquiet\") return \"watching\";\n if (kind === \"diffsnapshots\") return \"diffing\";\n return \"passive\";\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 if (watchactions.has(step.kind)) {\n if (typeof options.lifetime !== \"number\" || !Number.isFinite(options.lifetime) || options.lifetime <= 0) return { allowed: false, reason: \"A reviewed watch lifetime window in milliseconds is required in options.\" };\n if (options.scopes !== undefined && (!Array.isArray(options.scopes) || !options.scopes.every(scope => isnonempty(scope)))) return { allowed: false, reason: \"The reviewed watch scopes must be a list of non-empty selectors.\" };\n if (options.events !== undefined && (!Array.isArray(options.events) || !options.events.every(event => isnonempty(event)))) return { allowed: false, reason: \"The reviewed watch event kinds must be a list of non-empty strings.\" };\n if (!nonnegativeoption(options, \"poll\")) return { allowed: false, reason: \"The reviewed watch poll interval must be zero or a positive number of milliseconds.\" };\n }\n if (step.kind === \"waitquiet\") {\n const rule = options.quietrule;\n if (!rule || typeof rule !== \"object\" || Array.isArray(rule)) return { allowed: false, reason: \"A reviewed quietrule with an idle threshold is required in options.\" };\n const quiet = rule as Record<string, unknown>;\n if (typeof quiet.idle !== \"number\" || !Number.isFinite(quiet.idle) || quiet.idle <= 0) return { allowed: false, reason: \"The reviewed quiet idle threshold must be a positive number of milliseconds with no code ceiling.\" };\n if (!nonnegativeoption(quiet, \"poll\")) return { allowed: false, reason: \"The reviewed quiet poll interval must be zero or a positive number of milliseconds.\" };\n if (!nonnegativeoption(quiet, \"timeout\")) return { allowed: false, reason: \"The reviewed quiet timeout must be zero or a positive number of milliseconds.\" };\n }\n if (step.kind === \"diffsnapshots\") {\n const versions = options.versions;\n if (!Array.isArray(versions) || versions.length !== 2 || !versions.every(version => typeof version === \"number\" && Number.isInteger(version) && version >= 1)) return { allowed: false, reason: \"Two reviewed observation version numbers are required in options.\" };\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 if (input.step.kind === \"readjson\" && !origingranted(input.session, input.origin)) return { allowed: false, reason: \"The json state read 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 { agentplan, planprogress, stepoutcome } from \"./types.js\";\n\n/**\n * Execution-progress logics for reviewed plans.\n * Every correlated rule for step completion, outcome history, deduplication and plan closure lives in this file.\n */\n\n/** Returns a fresh progress record for a plan that has not executed any step yet. */\nexport function emptyprogress(planid: string, now: number): planprogress {\n return { planid, completedsteps: [], updatedat: now };\n}\n\n/** Records one successfully executed step; repeated executions of the same step stay deduplicated. */\nexport function recordstep(progress: planprogress | undefined, planid: string, stepid: string, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n if (base.completedsteps.includes(stepid)) return { ...base, updatedat: now };\n return { planid, completedsteps: [...base.completedsteps, stepid], updatedat: now };\n}\n\n/** Records one structured step outcome beside the completion log; outcomes are never truncated. */\nexport function recordoutcome(progress: planprogress | undefined, planid: string, outcome: stepoutcome, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n return { ...base, outcomes: [...(base.outcomes ?? []), outcome], updatedat: now };\n}\n\n/** True only when every step of the plan has a recorded, successful execution. */\nexport function iscomplete(progress: planprogress | undefined, plan: agentplan): boolean {\n if (!progress || progress.planid !== plan.id) return false;\n const required = plan.steps.map(step => step.id);\n return required.length > 0 && required.every(id => progress.completedsteps.includes(id));\n}\n\n/** Clears progress whenever a different plan replaces the tracked one while preserving prior history snapshots. */\nexport function resetforplan(progress: planprogress | undefined, plan: agentplan, now: number): planprogress {\n if (progress && progress.planid === plan.id) return progress;\n if (!progress) return emptyprogress(plan.id, now);\n const snapshot: planprogress = { planid: progress.planid, completedsteps: progress.completedsteps, ...(progress.outcomes ? { outcomes: progress.outcomes } : {}), updatedat: progress.updatedat };\n return { planid: plan.id, completedsteps: [], outcomes: [], prior: [...(progress.prior ?? []), snapshot], updatedat: now };\n}\n\n/** True when a reviewed watch lifetime window has closed at the given time. */\nexport function watchclosed(startedat: number, lifetime: number, now: number): boolean {\n return now >= startedat + lifetime;\n}\n\n/** Records one watch step as completed only once its reviewed lifetime window has closed. */\nexport function recordwatchcompletion(progress: planprogress | undefined, planid: string, stepid: string, startedat: number, lifetime: number, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n if (!watchclosed(startedat, lifetime, now)) return base;\n return recordstep(base, planid, stepid, now);\n}\n", "/** Canonical package version synchronized from package.json. */\nexport const packageversion = \"1.1.34\" as const;\n", "/** Shared contracts for every Devthink target. */\nimport { packageversion } from \"./version.js\";\n\nexport const protocolversion = packageversion;\n\n/** Every reviewed action kind. Read kinds observe, interaction kinds move focus, sensitive kinds change page or browser state. */\nexport type actionkind =\n | \"observe\" | \"inspect\" | \"extract\" | \"wait\" | \"waitfor\" | \"waittext\"\n | \"readattribute\" | \"readstyle\" | \"readgeometry\" | \"readvalue\" | \"readtext\" | \"readhtml\"\n | \"countelements\" | \"readtable\" | \"readlinks\" | \"readimages\" | \"readmeta\" | \"readforms\"\n | \"readstorage\" | \"highlight\" | \"tablist\" | \"windowlist\" | \"tabsnapshot\"\n | \"focus\" | \"scroll\" | \"hover\" | \"clickdeep\" | \"rightclick\" | \"doubleclick\"\n | \"scrollpage\" | \"scrollby\" | \"scrollend\" | \"scrolltop\" | \"fullscreen\" | \"zoomset\"\n | \"click\" | \"type\" | \"navigate\" | \"select\" | \"presskey\" | \"drag\" | \"drop\" | \"upload\"\n | \"clear\" | \"check\" | \"uncheck\" | \"toggle\" | \"submit\" | \"reload\" | \"back\" | \"forward\"\n | \"writestorage\" | \"setattribute\" | \"removeattribute\" | \"evaluate\"\n | \"tabcreate\" | \"tabactivate\" | \"tabclose\" | \"tabreload\"\n | \"windowcreate\" | \"windowclose\" | \"windowresize\" | \"downloadfile\"\n | \"movepointer\" | \"clickpoint\" | \"shiftclick\" | \"clicktext\" | \"clickaria\" | \"clickname\"\n | \"resolvexpath\" | \"typetime\" | \"appendtext\" | \"setvalue\" | \"typeedit\"\n | \"keyhold\" | \"keyrelease\" | \"submitsearch\" | \"selectmulti\" | \"chooseradio\"\n | \"setslider\" | \"setdate\" | \"setcolor\" | \"expanddetails\" | \"dismissdialog\"\n | \"pierceshadow\" | \"enterframe\" | \"retryaction\"\n | \"mapclicks\" | \"verifyvisible\" | \"verifyenabled\"\n | \"a11ytree\" | \"readvisible\" | \"readertree\" | \"detectlists\" | \"detecttables\"\n | \"readjson\" | \"watchmutate\" | \"waitquiet\" | \"watchbanner\" | \"detectinfinitescroll\"\n | \"detectvirtual\" | \"detectlazy\" | \"readscrollpos\" | \"readlang\" | \"readoutline\"\n | \"countpages\" | \"listshadow\" | \"listframes\" | \"classifypage\" | \"fingerprintsection\"\n | \"diffsnapshots\" | \"readselection\" | \"watchfocus\" | \"detectsticky\" | \"detectscrolllock\"\n | \"readopengraph\" | \"detectlanguage\" | \"deriveselector\";\n\nexport type actionrisk = \"read\" | \"interaction\" | \"sensitive\";\nexport type planstate = \"draft\" | \"pending\" | \"approved\" | \"rejected\" | \"expired\" | \"completed\" | \"cancelled\";\nexport type auditkind = \"configure\" | \"session\" | \"observe\" | \"proposal\" | \"approval\" | \"action\" | \"error\" | \"stop\" | \"pause\" | \"resume\" | \"complete\" | \"capability\" | \"tab\" | \"window\" | \"download\" | \"pointer\" | \"dialog\" | \"hold\" | \"retry\" | \"observation\" | \"watch\" | \"diff\";\n\n/** Observation mode classes: passive capture, watched lifetimes and diffing passes. */\nexport type observationmode = \"passive\" | \"watching\" | \"diffing\";\n\nexport interface toolstep {\n id: string;\n kind: actionkind;\n target?: string;\n value?: string;\n /** Reviewed JSON parameters such as modifiers, amounts or coordinates. */\n options?: string;\n summary: string;\n risk: actionrisk;\n}\n\nexport interface agentplan {\n id: string;\n objective: string;\n origin: string;\n steps: toolstep[];\n createdat: number;\n expiresat: number;\n state: planstate;\n approvedat?: number;\n completedat?: number;\n}\n\nexport interface agentsession {\n id: string;\n tabid: number;\n origin: string;\n startedat: number;\n expiresat: number;\n stoppedat?: number;\n pausedat?: number;\n /** Origins granted to this session; prepared for multi origin work. */\n grants?: string[];\n}\n\nexport interface endpointconfig {\n endpoint: string;\n origin: string;\n configuredat: number;\n}\n\nexport interface observation {\n /** Observation schema version for forward compatibility. */\n schemaversion: number;\n url: string;\n title: string;\n textpreview: string;\n textlength: number;\n forms: Array<{ label: string; type: string; name: string; options?: string[] }>;\n interactive: Array<{ selector: string; role: string; label: string }>;\n capturedat: number;\n /** Observation mode of this capture: passive, watching or diffing. */\n mode?: observationmode;\n /** Accessibility tree section captured by the page walker. */\n a11y?: a11ynode;\n /** Reader view article section extracted by the text density heuristic. */\n reader?: readerarticle;\n /** Repeated list patterns detected on the page. */\n listpattern?: listpattern[];\n /** Data table shapes detected on the page. */\n tableshape?: tableshape[];\n /** Snapshot diff section attached when two observation versions are compared. */\n diff?: snapshotdiff;\n}\n\nexport interface auditevent {\n id: string;\n kind: auditkind;\n at: number;\n summary: string;\n sessionid?: string;\n planid?: string;\n stepid?: string;\n}\n\nexport interface diagnosticreport {\n id: string;\n sessionid: string;\n origin: string;\n capturedat: number;\n tabid: number;\n title: string;\n textlength: number;\n interactivecount: number;\n formcount: number;\n bridgeavailable: boolean;\n}\n\n/** Live report of the optional browser capabilities the user has granted. */\nexport interface capabilityreport {\n tabs: boolean;\n downloads: boolean;\n clipboardread: boolean;\n clipboardwrite: boolean;\n reportedat: number;\n}\n\n/** Structured result of one executed step, kept with configurable retention. */\nexport interface stepoutcome {\n stepid: string;\n ok: boolean;\n summary: string;\n details?: Record<string, unknown>;\n at: number;\n}\n\n/** User chosen retention windows; an absent value keeps everything forever. */\nexport interface runsettings {\n auditretention?: number;\n outcomeretention?: number;\n /** Retention window for stored observation captures such as a11y trees and reader articles. */\n observationretention?: number;\n}\n\nexport interface proposalrequest {\n objective: string;\n session: agentsession;\n observation: observation;\n capabilities: capabilityreport;\n}\n\nexport interface planproposal {\n version: typeof protocolversion;\n plan: agentplan;\n}\n\nexport interface policyevaluation {\n allowed: boolean;\n reason?: string;\n}\n\n/** Tracks which reviewed steps of one plan have already executed locally. */\nexport interface planprogress {\n planid: string;\n completedsteps: string[];\n outcomes?: stepoutcome[];\n /** Prior progress snapshots preserved when a new plan replaces the tracked one. */\n prior?: planprogress[];\n updatedat: number;\n}\n\n/** Modes that address one element during target resolution. */\nexport type targetmode = \"selector\" | \"text\" | \"aria\" | \"name\" | \"xpath\" | \"index\" | \"point\";\n\n/** Reviewed element reference resolved by the page bridge at preview and execution time. */\nexport interface targetref {\n mode: targetmode;\n selector?: string;\n text?: string;\n role?: string;\n name?: string;\n xpath?: string;\n index?: number;\n x?: number;\n y?: number;\n}\n\n/** One point on a reviewed pointer path. */\nexport interface pointref {\n x: number;\n y: number;\n}\n\n/** Reviewed pointer path between two points through optional waypoints. */\nexport interface pointpath {\n start: pointref;\n end: pointref;\n waypoints?: pointref[];\n duration?: number;\n}\n\n/** Reviewed pointer speed shape with an easing curve, peak velocity and a jitter window. */\nexport interface speedprofile {\n easing?: \"linear\" | \"easeinout\";\n peak?: number;\n jitter?: number;\n}\n\n/** One key held down across steps under a hold id, with tab and step provenance. */\nexport interface keyholdstate {\n holdid: string;\n key: string;\n modifiers?: string[];\n tabid?: number;\n stepid?: string;\n pressedat: number;\n releasedat?: number;\n}\n\n/** Reviewed answers for confirm, alert and prompt dialogs; prompts need a reviewed answer. */\nexport interface dialogpolicy {\n accept: boolean;\n answer?: string;\n}\n\n/** Ordered frame indexes that address targets inside same origin iframes. */\nexport type framepath = number[];\n\n/** Ordered host selectors that address targets across open shadow roots. */\nexport type shadowpath = string[];\n\n/** Reviewed retry bounds with an attempt count that carries no hardcoded ceiling. */\nexport interface retryrule {\n attempts: number;\n settle?: number;\n tolerance?: number;\n}\n\n/** One numbered clickable element of a clickablemap. */\nexport interface mapentry {\n number: number;\n selector: string;\n role: string;\n label: string;\n mode: targetmode;\n}\n\n/** Numbered map of every clickable element captured inside one observation version. */\nexport interface clickablemap {\n version: number;\n entries: mapentry[];\n builtat: number;\n}\n\n/** Matched element summary attached to step results and review envelopes. */\nexport interface resolvedtarget {\n mode: targetmode;\n selector: string;\n tag: string;\n label: string;\n geometry: { x: number; y: number; width: number; height: number };\n candidates?: string[];\n}\n\n/** One dialog answered by the reviewed dialog policy, kept for the audit trail. */\nexport interface dialogdecision {\n id: string;\n dialog: string;\n text: string;\n accept: boolean;\n answer?: string;\n sessionid?: string;\n at: number;\n}\n\n/** One retry execution record with the attempts made and the movement delta observed between them. */\nexport interface retryoutcome {\n stepid: string;\n attempts: number;\n movement: number;\n ok: boolean;\n at: number;\n}\n\n/** Resolution summary stored per target mode for later selector derivation. */\nexport interface resolutionsummary {\n stepid: string;\n mode: targetmode;\n selector: string;\n label: string;\n at: number;\n}\n\n/** One accessibility tree node with role, accessible name, states, value and child refs. */\nexport interface a11ynode {\n role: string;\n name: string;\n states: string[];\n value?: string;\n childcount: number;\n children: a11ynode[];\n}\n\n/** One reader view article with title, byline, blocks and text statistics. */\nexport interface readerarticle {\n title: string;\n byline: string;\n blocks: Array<{ kind: string; text: string; words: number }>;\n words: number;\n characters: number;\n}\n\n/** One detected repeated list with its shared item selector, repeat count and samples. */\nexport interface listpattern {\n container: string;\n itemselector: string;\n repeat: number;\n samples: string[];\n}\n\n/** One detected data table shape with header row, column specs and caption. */\nexport interface tableshape {\n selector: string;\n headers: string[];\n columns: Array<{ label: string; cells: number }>;\n rows: number;\n caption: string;\n}\n\n/** One embedded json state payload extracted from an inline script. */\nexport interface jsonstate {\n scripturl: string;\n rootpath: string;\n payload: unknown;\n}\n\n/** Reviewed watch registration with selector scopes, event kinds and a lifetime window. */\nexport interface mutationwatch {\n watchid?: string;\n scopes?: string[];\n events?: string[];\n lifetime: number;\n}\n\n/** Reviewed network quiet rule with an idle threshold, poll interval and timeout. */\nexport interface quietrule {\n idle: number;\n poll?: number;\n timeout?: number;\n}\n\n/** One dom mutation observed inside a reviewed watch, with a timestamp and target path. */\nexport interface mutationevent {\n watchid: string;\n event: string;\n targetpath: string;\n sessionid?: string;\n at: number;\n}\n\n/** One focus change observed inside a reviewed focus watch, with a timestamp and target path. */\nexport interface focusevent {\n watchid: string;\n kind: \"focus\" | \"blur\";\n targetpath: string;\n sessionid?: string;\n at: number;\n}\n\n/** One consent banner observed by a reviewed banner watch, with its controls. */\nexport interface bannerreport {\n kind: string;\n selector: string;\n text: string;\n controls: string[];\n sessionid?: string;\n at: number;\n}\n\n/** One node change inside a snapshot diff. */\nexport interface diffentry {\n kind: \"added\" | \"removed\" | \"changed\";\n selector: string;\n summary: string;\n}\n\n/** One snapshot diff between two stored observation versions. */\nexport interface snapshotdiff {\n baseversion: number;\n targetversion: number;\n added: diffentry[];\n removed: diffentry[];\n changed: diffentry[];\n at: number;\n}\n\n/** One derived selector candidate with its strategy and stability score. */\nexport interface selectorcandidate {\n selector: string;\n strategy: string;\n score: number;\n}\n\n/** One derived selector stored with its stability score for reuse. */\nexport interface derivedselector {\n stepid: string;\n selector: string;\n strategy: string;\n score: number;\n at: number;\n}\n\n/** One watch registration persisted so watches survive service worker restarts. */\nexport interface watchregistration {\n watchid: string;\n kind: actionkind;\n stepid: string;\n sessionid: string;\n origin: string;\n scopes: string[];\n events: string[];\n startedat: number;\n lifetime: number;\n closedat?: number;\n}\n\n/** One stored observation capture under its version. */\nexport interface observationrecord {\n version: number;\n observation: observation;\n}\n\n/** One stored accessibility tree capture. */\nexport interface a11ycapture {\n version: number;\n tree: a11ynode;\n capturedat: number;\n}\n\n/** One stored reader article capture. */\nexport interface readercapture {\n version: number;\n article: readerarticle;\n capturedat: number;\n}\n\n/** Live page signals refreshed after observation steps: language, template, scroll lock and banner state. */\nexport interface pagesignals {\n language?: string;\n template?: string;\n scrolllocked?: boolean;\n banner?: string;\n refreshedat: number;\n}\n\n/** One detected template class or section fingerprint stored per origin. */\nexport interface templateprofile {\n origin: string;\n template: string;\n fingerprint: string;\n section?: string;\n at: number;\n}\n", "import { actionrisk, parseoptions, validatestep } from \"./policy.js\";\nimport { protocolversion, type agentplan, type bannerreport, type clickablemap, type focusevent, type keyholdstate, type mutationevent, type observation, type pagesignals, type planproposal, type proposalrequest, type resolvedtarget, type selectorcandidate, type snapshotdiff, type stepoutcome, type toolstep } from \"./types.js\";\n\nfunction record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Protocol message must be an object.\");\n return value as Record<string, unknown>;\n}\n\nfunction text(value: unknown, field: string): string {\n if (typeof value !== \"string\" || !value.trim()) throw new Error(`${field} must be a non-empty string.`);\n return value.trim();\n}\n\n/**\n * Reviewed options grammar shared by every step kind.\n *\n * A step may carry a JSON `options` object with the following reviewed fields:\n * - `targetref`: element addressing without a css selector, with `mode` one of `selector`, `text`, `aria`, `name`, `xpath`, `index` or `point`; the text mode carries `text`, the aria mode carries `role` plus `name`, the name mode carries `name`, the xpath mode carries `xpath`, the index mode carries a one based clickable map `index`, and the point mode carries viewport `x` and `y` coordinates.\n * - `pointpath`: pointer travel between two points, with `start` and `end` points, optional `waypoints` and a `duration` in milliseconds.\n * - `speedprofile`: pointer speed shape with `easing` (`linear` or `easeinout`), a `peak` velocity in pixels per second and a `jitter` window in milliseconds.\n * - `framepath`: ordered frame indexes routing a step inside same origin iframes.\n * - `shadow`: ordered host selectors addressing a target across open shadow roots.\n * - `retryrule`: retry bounds with `attempts`, a `settle` window in milliseconds and a movement `tolerance` in pixels; attempts carry no code ceiling.\n * - `dialogpolicy`: dialog answers with an `accept` flag and a reviewed prompt `answer` string.\n * - wrapper steps (`retryaction`, `enterframe`) reference an inner step by `stepid` or inline with `kind`, `target`, `value` and an `options` object.\n * - control kinds add reviewed `delay`, `values`, `results`, `timeout`, `holdid` and `modifiers` fields.\n * - watch kinds (`watchmutate`, `watchbanner`, `watchfocus`) carry a reviewed `lifetime` window in milliseconds, optional selector `scopes`, optional event kind filters `events` and an optional `poll` interval; the lifetime window carries no code ceiling.\n * - `waitquiet` carries a reviewed `quietrule` with a positive `idle` threshold in milliseconds, an optional `poll` interval and an optional `timeout`; every value carries no code ceiling.\n * - `diffsnapshots` carries exactly two reviewed observation `versions` to compare.\n * - observation kinds attach structured evidence to step details: a11y trees, reader articles, list patterns, table shapes, pagination estimates, watch event records, quiet probe samples, snapshot diffs and derived selector candidates with stability scores.\n *\n * Ambiguous text, aria or name resolutions are refused at execution time with the candidate list so the user can choose.\n */\n\n/** Validates agent output before it becomes a locally reviewable plan. Plans may carry any number of steps. */\nexport function parseproposal(value: unknown, origin: string): planproposal {\n const root = record(value);\n if (root.version !== protocolversion) throw new Error(\"Unsupported protocol version.\");\n const planinput = record(root.plan);\n const stepsinput = planinput.steps;\n if (!Array.isArray(stepsinput) || stepsinput.length === 0) throw new Error(\"A plan needs at least one step.\");\n const steps: toolstep[] = stepsinput.map((input, index) => {\n const candidate = record(input);\n const kind = text(candidate.kind, `step ${index + 1} kind`) as toolstep[\"kind\"];\n const step: toolstep = {\n id: typeof candidate.id === \"string\" ? candidate.id : crypto.randomUUID(),\n kind,\n summary: text(candidate.summary, `step ${index + 1} summary`),\n risk: actionrisk(kind),\n ...(typeof candidate.target === \"string\" ? { target: candidate.target } : {}),\n ...(typeof candidate.value === \"string\" ? { value: candidate.value } : {}),\n ...(typeof candidate.options === \"string\" ? { options: candidate.options } : {}),\n };\n const evaluation = validatestep(step, origin);\n if (!evaluation.allowed) throw new Error(evaluation.reason);\n return step;\n });\n for (const step of steps) {\n if (step.kind !== \"retryaction\" && step.kind !== \"enterframe\") continue;\n const options = parseoptions(step);\n if (typeof options.stepid === \"string\" && !steps.some(candidate => candidate.id === options.stepid)) throw new Error(\"A retry or frame wrapper references an unknown step id.\");\n }\n const createdat = Date.now();\n const expiresat = typeof planinput.expiresat === \"number\" ? planinput.expiresat : createdat + 10 * 60 * 1000;\n const plan: agentplan = {\n id: typeof planinput.id === \"string\" ? planinput.id : crypto.randomUUID(),\n objective: text(planinput.objective, \"objective\"),\n origin,\n steps,\n createdat,\n expiresat,\n state: \"pending\",\n };\n if (plan.expiresat <= createdat) throw new Error(\"Plan expiry must be in the future.\");\n return { version: protocolversion, plan };\n}\n\n/** Shapes the only data that may be sent to a user-configured agent endpoint. */\nexport function requestbody(input: proposalrequest): string {\n return JSON.stringify({ version: protocolversion, objective: input.objective, session: input.session, observation: input.observation, capabilities: input.capabilities });\n}\n\n/** Wraps one executed step outcome in the versioned response envelope for callers, attaching the matched element summary for review. */\nexport function outcomeresponse(input: { outcome: stepoutcome; plan: agentplan; resolvedtarget?: resolvedtarget }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, outcome: input.outcome, ...(input.resolvedtarget ? { resolvedtarget: input.resolvedtarget } : {}) });\n}\n\n/** Wraps a clickable map payload with numbered entries in the versioned response envelope. */\nexport function mapresponse(input: { map: clickablemap; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, map: input.map });\n}\n\n/** Reports the keys currently held on one tab for the live context envelope, refreshed per step. */\nexport function heldkeysreport(input: { tabid: number; holds: keyholdstate[] }): { version: typeof protocolversion; tabid: number; heldkeys: keyholdstate[] } {\n return { version: protocolversion, tabid: input.tabid, heldkeys: input.holds };\n}\n\n/** Wraps one observation capture with its a11y, reader, listpattern, tableshape and diff sections in the versioned response envelope. */\nexport function observationresponse(input: { observation: observation; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, observation: input.observation });\n}\n\n/** Wraps mutation, focus and banner event records with their timestamps and target paths in the versioned response envelope. */\nexport function eventresponse(input: { events: Array<mutationevent | focusevent | bannerreport>; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, events: input.events });\n}\n\n/** Wraps one snapshot diff with its added, removed and changed nodes and its two observation versions in the versioned response envelope. */\nexport function diffresponse(input: { diff: snapshotdiff; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, diff: input.diff });\n}\n\n/** Reports the detected page language, template class, scroll lock and banner state in the live context envelope. */\nexport function signalsreport(input: { signals?: pagesignals }): { version: typeof protocolversion; language?: string; template?: string; scrolllocked?: boolean; banner?: string } {\n const signals = input.signals;\n return {\n version: protocolversion,\n ...(signals && signals.language !== undefined ? { language: signals.language } : {}),\n ...(signals && signals.template !== undefined ? { template: signals.template } : {}),\n ...(signals && signals.scrolllocked !== undefined ? { scrolllocked: signals.scrolllocked } : {}),\n ...(signals && signals.banner !== undefined ? { banner: signals.banner } : {}),\n };\n}\n\n/** Wraps derived selector candidates with their stability scores in the versioned response envelope. */\nexport function selectorresponse(input: { candidates: selectorcandidate[]; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, candidates: input.candidates });\n}\n", "import type { capabilityreport, toolstep } from \"../types.js\";\n\n/**\n * Browser-level command surface for reviewed steps.\n * Every correlated rule for tab, window, zoom, snapshot and download actions plus capability negotiation lives in this file.\n */\n\nexport type browserresult = { ok: boolean; summary: string; details?: Record<string, unknown> };\n\nconst browserkinds: ReadonlySet<string> = new Set([\"tablist\", \"tabcreate\", \"tabactivate\", \"tabclose\", \"tabreload\", \"tabsnapshot\", \"windowlist\", \"windowcreate\", \"windowclose\", \"zoomset\", \"windowresize\", \"downloadfile\"]);\n\n/** True when the kind executes against browser-level surfaces instead of the page. */\nexport function isbrowserkind(kind: string): boolean {\n return browserkinds.has(kind);\n}\n\n/** Builds the live capability report from the optional permissions the user granted. */\nexport async function readcapabilities(): Promise<capabilityreport> {\n const [tabs, downloads, clipboardread, clipboardwrite] = await Promise.all([\n chrome.permissions.contains({ permissions: [\"tabs\"] }),\n chrome.permissions.contains({ permissions: [\"downloads\"] }),\n chrome.permissions.contains({ permissions: [\"clipboardRead\"] }),\n chrome.permissions.contains({ permissions: [\"clipboardWrite\"] }),\n ]);\n return { tabs, downloads, clipboardread, clipboardwrite, reportedat: Date.now() };\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\nfunction tabid(step: toolstep): number {\n return Number.parseInt(step.value ?? \"\", 10);\n}\n\n/** Executes one reviewed browser-level action kind against the live browser. */\nexport async function runbrowseraction(step: toolstep, sessiontabid: number, windowid: number): Promise<browserresult> {\n const options = stepoptions(step);\n switch (step.kind) {\n case \"tablist\": {\n const tabs = await chrome.tabs.query({});\n return { ok: true, summary: `Listed ${tabs.length} open tab${tabs.length === 1 ? \"\" : \"s\"}.`, details: { tabs: tabs.map(tab => ({ id: tab.id ?? 0, index: tab.index, title: tab.title ?? \"\", url: tab.url ?? \"\", active: tab.active, pinned: tab.pinned, audible: tab.audible ?? false })) } };\n }\n case \"tabcreate\": {\n const created = await chrome.tabs.create({ url: step.value, active: options.active !== false, pinned: options.pinned === true });\n return { ok: true, summary: `Opened a new tab for ${step.value}.`, details: { tabid: created?.id ?? 0 } };\n }\n case \"tabactivate\": {\n await chrome.tabs.update(tabid(step), { active: true });\n return { ok: true, summary: `Activated tab ${tabid(step)}.` };\n }\n case \"tabclose\": {\n await chrome.tabs.remove(tabid(step));\n return { ok: true, summary: `Closed tab ${tabid(step)}.` };\n }\n case \"tabreload\": {\n await chrome.tabs.reload(tabid(step), { bypassCache: options.bypasscache === true });\n return { ok: true, summary: `Reloaded tab ${tabid(step)}.` };\n }\n case \"tabsnapshot\": {\n const shot = await chrome.tabs.captureVisibleTab(windowid, { format: \"png\" });\n return { ok: true, summary: \"Captured the visible area of the active tab.\", details: { shot } };\n }\n case \"windowlist\": {\n const windows = await chrome.windows.getAll();\n return { ok: true, summary: `Listed ${windows.length} open window${windows.length === 1 ? \"\" : \"s\"}.`, details: { windows: windows.map(item => ({ id: item.id ?? 0, type: item.type, state: item.state ?? \"\", focused: item.focused })) } };\n }\n case \"windowcreate\": {\n const created = await chrome.windows.create({ url: step.value ?? \"about:blank\", ...(typeof options.width === \"number\" ? { width: options.width } : {}), ...(typeof options.height === \"number\" ? { height: options.height } : {}) });\n return { ok: true, summary: `Opened a new window for ${step.value}.`, details: { windowid: created?.id ?? 0 } };\n }\n case \"windowclose\": {\n await chrome.windows.remove(tabid(step));\n return { ok: true, summary: `Closed window ${tabid(step)}.` };\n }\n case \"zoomset\": {\n const zoom = Number(step.value);\n await chrome.tabs.setZoom(sessiontabid, zoom);\n return { ok: true, summary: `Set the tab zoom to ${zoom}.` };\n }\n case \"windowresize\": {\n await chrome.windows.update(tabid(step), { width: options.width as number, height: options.height as number });\n return { ok: true, summary: `Resized window ${tabid(step)}.` };\n }\n case \"downloadfile\": {\n const downloadid = await chrome.downloads.download({ url: step.value ?? \"\" });\n return { ok: true, summary: `Started the download of ${step.value}.`, details: { downloadid } };\n }\n default: return { ok: false, summary: \"Unsupported browser action.\" };\n }\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 { 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 { 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 { randomid, sessionmemory } from \"../memory.js\";\nimport { canexecute, canpreview, hostpattern, normalizeendpoint, parseoptions, requiredcapability, validatestep } from \"../policy.js\";\nimport { iscomplete, recordoutcome, recordstep, recordwatchcompletion, resetforplan, watchclosed } from \"../progress.js\";\nimport { heldkeysreport, mapresponse, observationresponse, outcomeresponse, parseproposal, requestbody, signalsreport } from \"../protocol.js\";\nimport type { a11ynode, agentplan, agentsession, auditevent, bannerreport, capabilityreport, clickablemap, derivedselector, diagnosticreport, diffentry, dialogdecision, dialogpolicy, focusevent, keyholdstate, mapentry, mutationevent, observation, pagesignals, readerarticle, resolvedtarget, retryoutcome, retryrule, selectorcandidate, snapshotdiff, stepoutcome, templateprofile, toolstep, watchregistration } from \"../types.js\";\nimport { isbrowserkind, readcapabilities, runbrowseraction } from \"./browsertabs.js\";\nimport { dialoganswer, installdialoghandler, parsedialogpolicy, type observeddialog } from \"./pagedialogs.js\";\nimport { innerstep, runretries } from \"./pageinteract.js\";\nimport { heldkeys, presshold, releasehold } from \"./pagecontrols.js\";\nimport type { nodesummary } from \"./pagewatch.js\";\n\nconst sessionduration = 15 * 60 * 1000;\nconst freshcheckkinds: ReadonlySet<string> = new Set([\"focus\", \"inspect\", \"click\", \"type\", \"scroll\", \"select\", \"hover\"]);\nconst pointerkinds: ReadonlySet<string> = new Set([\"movepointer\", \"clickpoint\", \"shiftclick\", \"clicktext\", \"clickaria\", \"clickname\", \"pierceshadow\"]);\nconst watchstepkinds: ReadonlySet<string> = new Set([\"watchmutate\", \"watchbanner\", \"watchfocus\"]);\nconst observationstepkinds: ReadonlySet<string> = new Set([\"a11ytree\", \"readvisible\", \"readertree\", \"detectlists\", \"detecttables\", \"readjson\", \"detectinfinitescroll\", \"detectvirtual\", \"detectlazy\", \"readscrollpos\", \"readlang\", \"readoutline\", \"countpages\", \"listshadow\", \"listframes\", \"classifypage\", \"fingerprintsection\", \"readselection\", \"detectsticky\", \"detectscrolllock\", \"readopengraph\", \"detectlanguage\", \"deriveselector\"]);\n\nconst chromestorage = {\n async get<T>(key: string): Promise<T | undefined> { return (await chrome.storage.local.get(key))[key] as T | undefined; },\n async set<T>(key: string, value: T): Promise<void> { await chrome.storage.local.set({ [key]: value }); },\n};\nconst memory = new sessionmemory(chromestorage);\n\ntype stepoutput = { ok: boolean; summary: string; details?: Record<string, unknown> };\n\nfunction extensionpage(sender: chrome.runtime.MessageSender): boolean {\n return sender.id === chrome.runtime.id && Boolean(sender.url?.startsWith(chrome.runtime.getURL(\"\")));\n}\n\nasync function audit(kind: auditevent[\"kind\"], summary: string, extra: Partial<auditevent> = {}): Promise<void> {\n await memory.addaudi({ id: randomid(), kind, at: Date.now(), summary, ...extra });\n}\n\n/** Reads the reviewed options of a step without throwing on malformed payloads. */\nfunction stepoptions(step: toolstep): Record<string, unknown> {\n try { return parseoptions(step); } catch { return {}; }\n}\n\n/** Refreshes and persists the capability report negotiated through the permissions api. */\nasync function refreshcapabilities(): Promise<capabilityreport> {\n const report = await readcapabilities();\n await memory.setcapabilities(report);\n return report;\n}\n\nasync function activecontext(): Promise<{ tab: chrome.tabs.Tab; origin: string }> {\n const [tab] = await chrome.tabs.query({ active: true, lastFocusedWindow: true });\n if (!tab?.id || !tab.url) throw new Error(\"No active web tab is available.\");\n const origin = new URL(tab.url).origin;\n if (!origin.startsWith(\"https://\")) throw new Error(\"Devthink can work with HTTPS pages only.\");\n return { tab, origin };\n}\n\nasync function snapshot(tabid: number): Promise<observation> {\n await chrome.scripting.executeScript({ target: { tabId: tabid }, files: [\"pagebridge.js\"] });\n const result = await chrome.scripting.executeScript({ target: { tabId: tabid }, func: () => {\n const bridge = (globalThis as typeof globalThis & { devthinkbridge?: { capturesnapshot: () => observation } }).devthinkbridge;\n if (!bridge) throw new Error(\"Devthink page bridge is unavailable.\");\n return bridge.capturesnapshot();\n } });\n const value = result[0]?.result;\n if (!value) throw new Error(\"The page did not return an observation.\");\n const observationcapture = value as observation;\n const version = await memory.nextobservationversion();\n await memory.setobservation({ version, observation: observationcapture });\n return observationcapture;\n}\n\n/** Finds the reviewed dialog policy of a plan, if the user reviewed a dismissdialog step. */\nfunction plandialogpolicy(plan: agentplan | undefined): dialogpolicy | null {\n const step = plan?.steps.find(candidate => candidate.kind === \"dismissdialog\");\n return step ? parsedialogpolicy(step) : null;\n}\n\n/** Installs the reviewed dialog handler in the main world of one tab; the isolated world cannot override window dialogs. */\nasync function installdialogpolicy(tabid: number, policy: dialogpolicy, persistent: boolean): Promise<void> {\n await chrome.scripting.executeScript({\n target: { tabId: tabid },\n world: \"MAIN\",\n func: installdialoghandler,\n args: [policy.accept, policy.answer ?? \"\", persistent],\n });\n}\n\n/** Applies the reviewed dialog policy before any step dispatch so unexpected dialogs cannot block the page. */\nasync function ensuredialoghandler(plan: agentplan | undefined, tabid: number): Promise<void> {\n const policy = plandialogpolicy(plan) ?? await memory.getdialogpolicy();\n if (!policy) return;\n try { await installdialogpolicy(tabid, policy, true); } catch { /* the page may refuse scripting; the step still dispatches */ }\n}\n\n/** Reads observed dialogs from the page and records each as an audited dialog decision with the reviewed answer. */\nasync function harvestdialogs(session: agentsession | undefined, plan: agentplan | undefined, stepid: string, tabid: number): Promise<void> {\n const policy = plandialogpolicy(plan) ?? await memory.getdialogpolicy();\n let observed: observeddialog[] = [];\n try {\n const result = await chrome.scripting.executeScript({ target: { tabId: tabid }, func: () => {\n const bridge = (globalThis as typeof globalThis & { devthinkbridge?: { readdialogs?: () => unknown[] } }).devthinkbridge;\n return bridge?.readdialogs ? bridge.readdialogs() : [];\n } });\n const value = result[0]?.result;\n if (Array.isArray(value)) observed = value as observeddialog[];\n } catch { /* the page may refuse scripting; no dialogs can be harvested */ }\n for (const entry of observed) {\n const reviewed = policy ? dialoganswer(policy, ([\"confirm\", \"alert\", \"prompt\"] as const).includes(entry.dialog as \"confirm\" | \"alert\" | \"prompt\") ? entry.dialog as \"confirm\" | \"alert\" | \"prompt\" : \"confirm\") : undefined;\n const decision: dialogdecision = {\n id: randomid(),\n dialog: entry.dialog,\n text: entry.text,\n accept: reviewed ? reviewed.accept : entry.result !== null && entry.result !== false,\n ...(reviewed?.answer !== undefined ? { answer: reviewed.answer } : {}),\n ...(session ? { sessionid: session.id } : {}),\n at: Number.isFinite(entry.at) ? entry.at : Date.now(),\n };\n await memory.adddialog(decision);\n await audit(\"dialog\", `Dialog ${decision.dialog} answered ${decision.accept ? \"accept\" : \"dismiss\"}${decision.answer ? ` with the reviewed answer \"${decision.answer}\"` : \"\"} for dialog text \"${decision.text.slice(0, 120)}\".`, { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}), stepid });\n }\n}\n\n/** Dispatches one reviewed page step through the page bridge after arming the reviewed dialog handler. */\nasync function dispatchpagestep(step: toolstep, tabid: number, origin: string, plan?: agentplan): Promise<stepoutput | undefined> {\n const session = await memory.getsession();\n const activeplan = plan ?? await memory.getplan();\n await ensuredialoghandler(activeplan, tabid);\n const result = await chrome.scripting.executeScript({ target: { tabId: tabid }, func: (action: toolstep, expectedorigin: string) => {\n const bridge = (globalThis as typeof globalThis & { devthinkbridge?: { performstep: (input: toolstep, origin: string) => Promise<{ ok: boolean; summary: string; details?: Record<string, unknown> }> } }).devthinkbridge;\n if (!bridge) throw new Error(\"Devthink page bridge is unavailable.\");\n return bridge.performstep(action, expectedorigin);\n }, args: [step, origin] });\n await harvestdialogs(session, activeplan, step.id, tabid);\n return result[0]?.result as stepoutput | undefined;\n}\n\nasync function startsession(): Promise<agentsession> {\n const { tab, origin } = await activecontext();\n const session: agentsession = { id: randomid(), tabid: tab.id as number, origin, startedat: Date.now(), expiresat: Date.now() + sessionduration, grants: [origin] };\n await memory.setsession(session);\n await audit(\"session\", `Session started for ${origin}.`, { sessionid: session.id });\n const policy = await memory.getdialogpolicy();\n if (policy) {\n try { await installdialogpolicy(session.tabid, policy, true); } catch { /* the auto handler is best effort until the page accepts scripting */ }\n }\n return session;\n}\n\nasync function diagnostic(): Promise<diagnosticreport> {\n const session = await memory.getsession();\n const { tab, origin } = await activecontext();\n if (!session || session.stoppedat || session.expiresat <= Date.now() || session.tabid !== tab.id || session.origin !== origin) throw new Error(\"Start a current session for this active tab before diagnostics.\");\n const observation = await snapshot(session.tabid);\n const report: diagnosticreport = { id: randomid(), sessionid: session.id, origin, capturedat: Date.now(), tabid: session.tabid, title: observation.title, textlength: observation.textlength, interactivecount: observation.interactive.length, formcount: observation.forms.length, bridgeavailable: true };\n await memory.setdiagnostic(report);\n await audit(\"observe\", \"Structured diagnostics captured for the approved active tab.\", { sessionid: session.id });\n return report;\n}\n\nfunction localplan(objective: string, session: agentsession): agentplan {\n const now = Date.now();\n return { id: randomid(), objective, origin: session.origin, steps: [{ id: randomid(), kind: \"observe\", summary: \"Capture a complete semantic snapshot of the approved active tab.\", risk: \"read\" }], createdat: now, expiresat: now + sessionduration, state: \"pending\" };\n}\n\nasync function propose(objective: string, remote: boolean): Promise<agentplan> {\n if (!objective.trim()) throw new Error(\"An objective is required.\");\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Start a current browser session before requesting a plan.\");\n const { tab, origin } = await activecontext();\n if (session.tabid !== tab.id || session.origin !== origin) throw new Error(\"The selected tab or origin no longer matches the approved session.\");\n const observation = await snapshot(session.tabid);\n const capabilities = await refreshcapabilities();\n const config = await memory.getconfig();\n let plan = localplan(objective.trim(), session);\n if (remote) {\n if (!config) throw new Error(\"Configure an approved HTTPS endpoint before requesting a remote proposal.\");\n const response = await fetch(config.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, credentials: \"omit\", body: requestbody({ objective: objective.trim(), session, observation, capabilities }) });\n if (!response.ok) throw new Error(`Proposal endpoint returned ${response.status}.`);\n plan = parseproposal(await response.json(), session.origin).plan;\n }\n await memory.setplan(plan);\n await memory.setprogress(resetforplan(await memory.getprogress(), plan, Date.now()));\n await audit(\"proposal\", `Plan proposed with ${plan.steps.length} reviewed step${plan.steps.length === 1 ? \"\" : \"s\"}.`, { sessionid: session.id, planid: plan.id });\n return plan;\n}\n\nfunction browserauditkind(step: toolstep): auditevent[\"kind\"] {\n if (step.kind === \"downloadfile\") return \"download\";\n if (step.kind.startsWith(\"window\")) return \"window\";\n return \"tab\";\n}\n\n/** Maps one page step to its audit kind, covering the pointer, dialog, hold, retry, observation, watch and diff event families. */\nfunction stepauditkind(step: toolstep, ok: boolean): auditevent[\"kind\"] {\n if (isbrowserkind(step.kind)) return browserauditkind(step);\n if (step.kind === \"dismissdialog\") return \"dialog\";\n if (step.kind === \"keyhold\" || step.kind === \"keyrelease\") return \"hold\";\n if (step.kind === \"retryaction\") return \"retry\";\n if (pointerkinds.has(step.kind)) return \"pointer\";\n if (watchstepkinds.has(step.kind)) return \"watch\";\n if (step.kind === \"diffsnapshots\") return \"diff\";\n if (observationstepkinds.has(step.kind)) return \"observation\";\n return ok ? \"action\" : \"error\";\n}\n\n/** Resolves the reviewed inner step of a retry or frame wrapper from a step id or inline options. */\nfunction resolvedinnerstep(step: toolstep, plan: agentplan): toolstep | null {\n const options = stepoptions(step);\n if (typeof options.stepid === \"string\" && options.stepid.trim()) {\n return plan.steps.find(candidate => candidate.id === options.stepid) ?? null;\n }\n return innerstep(step);\n}\n\n/** Executes one reviewed key hold: the page dispatches the keydown and the registry keeps the hold across steps. */\nasync function executekeyhold(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n if (!output?.ok) return output ?? { ok: false, summary: \"The key hold was not delivered.\" };\n const options = stepoptions(step);\n const holdid = typeof options.holdid === \"string\" && options.holdid.trim() ? options.holdid : randomid();\n const modifiers = Array.isArray(options.modifiers) ? options.modifiers.filter((item): item is string => typeof item === \"string\") : [];\n const hold: keyholdstate = { holdid, key: step.value ?? \"\", ...(modifiers.length > 0 ? { modifiers } : {}), tabid, stepid: step.id, pressedat: Date.now() };\n const next = presshold(await memory.getholds(), hold);\n if (!next.ok) return { ok: false, summary: `Hold id ${holdid} is already held.` };\n await memory.setholds(next.holds);\n await audit(\"hold\", `Key ${hold.key} held under hold id ${holdid} pressed at ${new Date(hold.pressedat).toISOString()}.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ok: true, summary: `Key ${hold.key} held under hold id ${holdid}.`, details: { holdid } };\n}\n\n/** Executes one reviewed key release: the held key receives its keyup and the registry records the release. */\nasync function executekeyrelease(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const holdid = step.value ?? \"\";\n const holds = await memory.getholds();\n const held = holds.find(candidate => candidate.holdid === holdid && candidate.releasedat === undefined);\n if (!held) throw new Error(`No held key matches hold id ${holdid}.`);\n const modifiers = held.modifiers ?? [];\n const dispatchstep: toolstep = { ...step, value: held.key, options: JSON.stringify({ ...(modifiers.length > 0 ? { modifiers } : {}) }) };\n const output = await dispatchpagestep(dispatchstep, tabid, origin, plan);\n const releasedat = Date.now();\n const transition = releasehold(holds, holdid, releasedat);\n await memory.setholds(transition.holds);\n await audit(\"hold\", `Key ${held.key} released from hold id ${holdid} at ${new Date(releasedat).toISOString()} after ${Math.max(0, releasedat - held.pressedat)} milliseconds.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ok: output?.ok ?? false, summary: output?.summary ?? \"Key release delivered.\", details: { holdid } };\n}\n\n/** Executes one reviewed dismissdialog step: one-shot main world wrappers answer the next dialog per the reviewed policy. */\nasync function executedismissdialog(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const policy = parsedialogpolicy(step);\n if (!policy) throw new Error(\"A reviewed dialog policy is required.\");\n await installdialogpolicy(tabid, policy, false);\n await harvestdialogs(session, plan, step.id, tabid);\n const answer = policy.answer !== undefined ? ` with the reviewed answer \"${policy.answer}\"` : \"\";\n return { ok: true, summary: `Dialog handler armed${answer} for the next confirm, alert or prompt.` };\n}\n\n/** Executes one reviewed retryaction step: the loop enforces the reviewed bounds, revalidates geometry between attempts and records the outcome. */\nasync function executeretryaction(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const rule = stepoptions(step).retryrule as retryrule | undefined;\n const inner = resolvedinnerstep(step, plan);\n if (!inner) throw new Error(\"The reviewed wrapper step could not be resolved.\");\n const innergate = validatestep(inner, origin);\n if (!innergate.allowed) throw new Error(`The wrapped step is not allowed: ${innergate.reason}`);\n const probe = async (): Promise<{ x: number; y: number } | null> => {\n const probestep: toolstep = { id: `${step.id}probe`, kind: \"readgeometry\", summary: step.summary, risk: \"read\", ...(inner.target ? { target: inner.target } : {}), ...(inner.options ? { options: inner.options } : {}) };\n const output = await dispatchpagestep(probestep, tabid, origin, plan);\n const geometry = output?.details?.geometry as { x?: unknown; y?: unknown } | undefined;\n if (!geometry || typeof geometry.x !== \"number\" || typeof geometry.y !== \"number\" || !Number.isFinite(geometry.x) || !Number.isFinite(geometry.y)) return null;\n return { x: geometry.x, y: geometry.y };\n };\n const execute = async (): Promise<{ ok: boolean; summary: string }> => {\n const output = await dispatchpagestep(inner, tabid, origin, plan);\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The wrapped step returned no result.\" };\n };\n const outcome = await runretries(rule ?? { attempts: 1 }, probe, execute);\n const record: retryoutcome = { stepid: step.id, attempts: outcome.attempts, movement: outcome.movement, ok: outcome.ok, at: Date.now() };\n await memory.addretry(record);\n await audit(\"retry\", outcome.summary, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ok: outcome.ok, summary: outcome.summary, details: { attempts: outcome.attempts, movement: outcome.movement } };\n}\n\n/** Executes one reviewed mapclicks step: the page builds the numbered map and memory stores it under a fresh observation version. */\nasync function executemapclicks(step: toolstep, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n if (!output?.ok) return output ?? { ok: false, summary: \"The clickable map was not captured.\" };\n const entries = Array.isArray(output.details?.entries) ? output.details?.entries as mapentry[] : [];\n const version = await memory.nextobservationversion();\n const map: clickablemap = { version, entries, builtat: Date.now() };\n await memory.setmap(map);\n return { ok: true, summary: output.summary, details: { entries, mapversion: version } };\n}\n\n/** Executes one reviewed enterframe step: the background resolves the wrapped step and the bridge routes it inside the same origin frame. */\nasync function executeenterframe(step: toolstep, plan: agentplan, tabid: number, origin: string): Promise<stepoutput | undefined> {\n const inner = resolvedinnerstep(step, plan);\n if (!inner) throw new Error(\"The reviewed frame wrapper step could not be resolved.\");\n const innergate = validatestep(inner, origin);\n if (!innergate.allowed) throw new Error(`The wrapped step is not allowed: ${innergate.reason}`);\n const options = stepoptions(step);\n const inneroptions = inner.options ? stepoptions(inner) : undefined;\n const derived: toolstep = { ...step, options: JSON.stringify({ ...options, kind: inner.kind, ...(inner.target ? { target: inner.target } : {}), ...(inner.value ? { value: inner.value } : {}), ...(inneroptions ? { options: inneroptions } : {}) }) };\n return dispatchpagestep(derived, tabid, origin, plan);\n}\n\n/** Converts one observation interactive inventory into the node summaries the diff engine compares. */\nfunction observationnodes(observationcapture: observation): nodesummary[] {\n return observationcapture.interactive.map(entry => ({ selector: entry.selector, tag: entry.role, text: entry.label, attributes: {} }));\n}\n\nfunction detailarray(details: Record<string, unknown> | undefined, key: string): unknown[] {\n const value = details?.[key];\n return Array.isArray(value) ? value : [];\n}\n\n/** Executes one reviewed diffsnapshots step: the background loads both observation versions, injects their node summaries and attaches the version pair to the diff result. */\nasync function executediffsnapshots(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const options = stepoptions(step);\n const versions = Array.isArray(options.versions) ? options.versions.filter((item): item is number => typeof item === \"number\") : [];\n const baseversion = versions[0];\n const targetversion = versions[1];\n if (baseversion === undefined || targetversion === undefined) throw new Error(\"Two reviewed observation versions are required.\");\n const base = await memory.getobservation(baseversion);\n const target = await memory.getobservation(targetversion);\n if (!base || !target) throw new Error(\"A reviewed observation version has not been captured yet.\");\n const derived: toolstep = { ...step, options: JSON.stringify({ ...options, base: observationnodes(base.observation), target: observationnodes(target.observation) }) };\n const output = await dispatchpagestep(derived, tabid, origin, plan) ?? { ok: false, summary: \"The snapshot diff returned no result.\" };\n const diff: snapshotdiff = {\n baseversion,\n targetversion,\n added: detailarray(output.details, \"added\") as diffentry[],\n removed: detailarray(output.details, \"removed\") as diffentry[],\n changed: detailarray(output.details, \"changed\") as diffentry[],\n at: Date.now(),\n };\n await memory.adddiff(diff);\n await audit(\"diff\", `Diffed observation versions ${baseversion} and ${targetversion}: ${diff.added.length} added, ${diff.removed.length} removed and ${diff.changed.length} changed nodes.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ok: Boolean(output.ok), summary: output.summary, details: { ...(output.details ?? {}), versions: [baseversion, targetversion] } };\n}\n\n/** Executes one reviewed watch step: the registration persists across service worker restarts, the bridge observes for the reviewed lifetime and the observed events land in the step result stream. */\nasync function executewatchstep(step: toolstep, session: agentsession, plan: agentplan, tabid: number, origin: string): Promise<{ output: stepoutput; watch: watchregistration }> {\n const options = stepoptions(step);\n const watchid = typeof options.watchid === \"string\" && options.watchid.trim() ? options.watchid : randomid();\n const scopes = Array.isArray(options.scopes) ? options.scopes.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const events = Array.isArray(options.events) ? options.events.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const lifetime = typeof options.lifetime === \"number\" && Number.isFinite(options.lifetime) && options.lifetime > 0 ? options.lifetime : 0;\n const watch: watchregistration = { watchid, kind: step.kind, stepid: step.id, sessionid: session.id, origin, scopes, events, startedat: Date.now(), lifetime };\n await memory.addwatch(watch);\n await audit(\"watch\", `Watch ${step.kind} registered under id ${watchid} for the reviewed lifetime of ${lifetime} milliseconds inside ${scopes.length > 0 ? `scopes ${scopes.join(\", \")}` : \"the whole document\"}.`, { sessionid: session.id, planid: plan.id, stepid: step.id });\n const output = await dispatchpagestep(step, tabid, origin, plan) ?? { ok: false, summary: \"The watch returned no result.\" };\n await memory.closewatch(watchid, Date.now());\n if (step.kind === \"watchmutate\") {\n for (const entry of detailarray(output.details, \"events\")) {\n if (!entry || typeof entry !== \"object\") continue;\n const record = entry as mutationevent;\n await memory.addmutationevent({ ...record, sessionid: session.id });\n }\n }\n if (step.kind === \"watchfocus\") {\n for (const entry of detailarray(output.details, \"events\")) {\n if (!entry || typeof entry !== \"object\") continue;\n const record = entry as focusevent;\n await memory.addfocusevent({ ...record, sessionid: session.id });\n }\n }\n if (step.kind === \"watchbanner\") {\n for (const entry of detailarray(output.details, \"banners\")) {\n if (!entry || typeof entry !== \"object\") continue;\n const record = entry as bannerreport;\n await memory.addbanner({ ...record, sessionid: session.id });\n }\n }\n await audit(\"watch\", `Watch ${watchid} closed after its reviewed lifetime of ${lifetime} milliseconds.`, { sessionid: session.id, planid: plan.id, stepid: step.id });\n return { output, watch };\n}\n\n/** Refreshes the live page signals of language, template, scroll lock and banner state from observation step evidence. */\nasync function refreshsignals(step: toolstep, output: stepoutput | undefined): Promise<void> {\n const current = await memory.getsignals();\n const next: pagesignals = current ? { ...current, refreshedat: Date.now() } : { refreshedat: Date.now() };\n let changed = false;\n if (step.kind === \"readlang\" || step.kind === \"detectlanguage\") {\n const language = output?.details?.language;\n if (typeof language === \"string\" && language) { next.language = language; changed = true; }\n }\n if (step.kind === \"classifypage\") {\n const template = output?.details?.template;\n if (typeof template === \"string\" && template) { next.template = template; changed = true; }\n }\n if (step.kind === \"detectscrolllock\") {\n const locked = output?.details?.locked;\n if (typeof locked === \"boolean\") { next.scrolllocked = locked; changed = true; }\n }\n if (step.kind === \"watchbanner\") {\n const banners = detailarray(output?.details, \"banners\");\n const first = banners[0] as { kind?: unknown } | undefined;\n if (first && typeof first.kind === \"string\") { next.banner = first.kind; changed = true; }\n }\n if (changed) await memory.setsignals(next);\n}\n\n/** Records the observation evidence of one executed page step: a11y trees, reader articles, template profiles and derived selectors. */\nasync function recordevidence(step: toolstep, output: stepoutput | undefined, session: agentsession | undefined, plan: agentplan | undefined, origin: string): Promise<void> {\n const extra = { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}), stepid: step.id };\n if (step.kind === \"a11ytree\" && output?.details?.tree && typeof output.details.tree === \"object\") {\n const version = await memory.nextobservationversion();\n await memory.adda11ytree({ version, tree: output.details.tree as a11ynode, capturedat: Date.now() });\n await audit(\"observation\", `Accessibility tree captured under observation version ${version} with ${output.details.nodecount ?? \"an unknown count of\"} nodes.`, extra);\n }\n if (step.kind === \"readertree\" && output?.details?.article && typeof output.details.article === \"object\") {\n const version = await memory.nextobservationversion();\n const article = output.details.article as readerarticle;\n await memory.addreaderarticle({ version, article, capturedat: Date.now() });\n await audit(\"observation\", `Reader article captured under observation version ${version} with ${article.blocks.length} blocks and ${article.words} words.`, extra);\n }\n if (step.kind === \"classifypage\" && typeof output?.details?.template === \"string\") {\n const fingerprint = typeof output.details.fingerprint === \"string\" ? output.details.fingerprint : \"\";\n const profile: templateprofile = { origin, template: output.details.template, fingerprint, at: Date.now() };\n await memory.addtemplate(profile);\n await audit(\"observation\", `Page template ${profile.template} classified for ${origin}${fingerprint ? ` with fingerprint ${fingerprint}` : \"\"}.`, extra);\n }\n if (step.kind === \"fingerprintsection\" && typeof output?.details?.fingerprint === \"string\") {\n const profile: templateprofile = { origin, template: \"\", fingerprint: output.details.fingerprint, ...(typeof output.details.section === \"string\" ? { section: output.details.section } : {}), at: Date.now() };\n await memory.addtemplate(profile);\n await audit(\"observation\", `Section fingerprint ${profile.fingerprint} computed for ${origin}.`, extra);\n }\n if (step.kind === \"deriveselector\") {\n const candidates = detailarray(output?.details, \"candidates\") as selectorcandidate[];\n const best = candidates[0];\n if (best && typeof best.selector === \"string\" && best.selector) {\n const record: derivedselector = { stepid: step.id, selector: best.selector, strategy: best.strategy, score: best.score, at: Date.now() };\n await memory.addselector(record);\n await audit(\"observation\", `Derived selector ${record.selector} through the ${record.strategy} strategy with stability ${record.score}.`, extra);\n }\n }\n await refreshsignals(step, output);\n}\n\nasync function executestep(stepid: string): Promise<stepoutput> {\n const session = await memory.getsession();\n const plan = await memory.getplan();\n const { tab, origin } = await activecontext();\n const step = plan?.steps.find(candidate => candidate.id === stepid);\n if (!step) throw new Error(\"Reviewed step was not found.\");\n const gate = canexecute({ session, plan, step, tabid: tab.id as number, origin });\n if (!gate.allowed) throw new Error(gate.reason);\n let output: stepoutput | undefined;\n let watchwindow: { startedat: number; lifetime: number } | undefined;\n if (isbrowserkind(step.kind)) {\n const capability = requiredcapability(step.kind);\n if (capability) {\n const granted = await chrome.permissions.contains({ permissions: [capability] } as chrome.permissions.Permissions);\n if (!granted) throw new Error(`The ${capability} capability has not been granted; request it from the review panel.`);\n }\n output = await runbrowseraction(step, tab.id as number, tab.windowId ?? chrome.windows.WINDOW_ID_CURRENT);\n } else if (step.kind === \"keyhold\") {\n output = await executekeyhold(step, session, plan as agentplan, tab.id as number, origin);\n } else if (step.kind === \"keyrelease\") {\n output = await executekeyrelease(step, session, plan as agentplan, tab.id as number, origin);\n } else if (step.kind === \"dismissdialog\") {\n output = await executedismissdialog(step, session, plan as agentplan, tab.id as number, origin);\n } else if (step.kind === \"retryaction\") {\n output = await executeretryaction(step, session, plan as agentplan, tab.id as number, origin);\n } else if (step.kind === \"mapclicks\") {\n output = await executemapclicks(step, plan as agentplan, tab.id as number, origin);\n } else if (step.kind === \"enterframe\") {\n output = await executeenterframe(step, plan as agentplan, tab.id as number, origin);\n } else if (watchstepkinds.has(step.kind)) {\n if (!session || !plan || plan.state !== \"approved\") throw new Error(\"Watch kinds refuse to run outside an approved session plan.\");\n const watched = await executewatchstep(step, session, plan, tab.id as number, origin);\n output = watched.output;\n watchwindow = { startedat: watched.watch.startedat, lifetime: watched.watch.lifetime };\n } else if (step.kind === \"diffsnapshots\") {\n output = await executediffsnapshots(step, session, plan as agentplan, tab.id as number, origin);\n } else {\n if (step.target && freshcheckkinds.has(step.kind)) {\n const fresh = await snapshot(tab.id as number);\n if (!fresh.interactive.some(item => item.selector === step.target)) throw new Error(\"The page changed and the target must be reviewed again.\");\n }\n output = await dispatchpagestep(step, tab.id as number, origin, plan);\n }\n await recordevidence(step, output, session, plan, origin);\n const summary = output?.summary ?? \"The page action returned no result.\";\n const resolved = output?.details?.resolvedtarget as resolvedtarget | undefined;\n if (resolved) {\n await memory.addresolution({ stepid, mode: resolved.mode, selector: resolved.selector, label: resolved.label, at: Date.now() });\n }\n const outcome: stepoutcome = { stepid, ok: Boolean(output?.ok), summary, ...(output?.details ? { details: output.details } : {}), at: Date.now() };\n const auditkind = stepauditkind(step, Boolean(output?.ok));\n await audit(auditkind, summary, { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}), stepid });\n await memory.addoutcome(outcome);\n if (output?.ok && plan) {\n const base = await memory.getprogress();\n const completed = watchwindow ? recordwatchcompletion(base, plan.id, stepid, watchwindow.startedat, watchwindow.lifetime, Date.now()) : recordstep(base, plan.id, stepid, Date.now());\n const tracked = recordoutcome(completed, plan.id, outcome, Date.now());\n await memory.setprogress(tracked);\n if (iscomplete(tracked, plan) && plan.state === \"approved\") {\n const done = { ...plan, state: \"completed\" as const, completedat: Date.now() };\n await memory.setplan(done);\n await audit(\"complete\", \"Every reviewed step of the approved plan has executed.\", { ...(session ? { sessionid: session.id } : {}), planid: done.id });\n }\n }\n return output ?? { ok: false, summary };\n}\n\n/** Highlights a reviewed target without clicking, typing, navigating or transmitting page data. */\nasync function previewstep(stepid: string): Promise<{ ok: boolean; summary: string; resolvedtarget?: resolvedtarget; candidates?: string[] }> {\n const session = await memory.getsession();\n const plan = await memory.getplan();\n const { tab, origin } = await activecontext();\n const step = plan?.steps.find(candidate => candidate.id === stepid);\n if (!step) throw new Error(\"Reviewed step was not found.\");\n const gate = canpreview({ session, plan, step, tabid: tab.id as number, origin });\n if (!gate.allowed) throw new Error(gate.reason);\n if (!step.target && !stepoptions(step).targetref) throw new Error(\"Only a target-based step can be previewed.\");\n const result = await chrome.scripting.executeScript({ target: { tabId: tab.id as number }, func: (action: toolstep, expectedorigin: string) => {\n const bridge = (globalThis as typeof globalThis & { devthinkbridge?: { previewtarget: (step: toolstep, origin: string) => { ok: boolean; summary: string; resolvedtarget?: resolvedtarget; candidates?: string[] } } }).devthinkbridge;\n if (!bridge) throw new Error(\"Devthink page bridge is unavailable.\");\n return bridge.previewtarget(action, expectedorigin);\n }, args: [step, origin] });\n const output = result[0]?.result as { ok: boolean; summary: string; resolvedtarget?: resolvedtarget; candidates?: string[] } | undefined;\n const summary = output?.summary ?? \"The target preview returned no result.\";\n await audit(output?.ok ? \"observe\" : \"error\", summary, { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}), stepid });\n return output ?? { ok: false, summary };\n}\n\nasync function pausesession(): Promise<agentsession> {\n const session = await memory.getsession();\n if (!session || session.stoppedat) throw new Error(\"No active browser session exists.\");\n if (session.expiresat <= Date.now()) throw new Error(\"The browser session has expired.\");\n if (session.pausedat) throw new Error(\"The browser session is already paused.\");\n const paused = { ...session, pausedat: Date.now() };\n await memory.setsession(paused);\n await audit(\"pause\", \"The user paused the browser session; no action or preview can run.\", { sessionid: session.id });\n return paused;\n}\n\nasync function resumesession(): Promise<agentsession> {\n const session = await memory.getsession();\n if (!session || session.stoppedat) throw new Error(\"No active browser session exists.\");\n if (session.expiresat <= Date.now()) throw new Error(\"The browser session has expired and cannot be resumed.\");\n if (!session.pausedat) throw new Error(\"The browser session is not paused.\");\n const resumed: agentsession = { id: session.id, tabid: session.tabid, origin: session.origin, startedat: session.startedat, expiresat: session.expiresat, ...(session.grants ? { grants: session.grants } : {}) };\n await memory.setsession(resumed);\n await audit(\"resume\", \"The user resumed the browser session; reviewed actions can run again.\", { sessionid: session.id });\n return resumed;\n}\n\nasync function grantcapability(permission: string): Promise<capabilityreport> {\n if (![\"tabs\", \"downloads\", \"clipboardRead\", \"clipboardWrite\"].includes(permission)) throw new Error(\"Unknown capability.\");\n const granted = await chrome.permissions.request({ permissions: [permission] } as chrome.permissions.Permissions);\n if (!granted) throw new Error(\"The capability grant was declined.\");\n await audit(\"capability\", `Capability ${permission} granted by the user.`);\n return refreshcapabilities();\n}\n\nasync function handlerequest(message: unknown, sender: chrome.runtime.MessageSender): Promise<unknown> {\n if (!extensionpage(sender)) throw new Error(\"Requests are accepted only from Devthink extension pages.\");\n const input = message as { kind?: string; endpoint?: string; objective?: string; stepid?: string; permission?: string };\n switch (input.kind) {\n case \"configure\": {\n const config = normalizeendpoint(input.endpoint ?? \"\");\n const granted = await chrome.permissions.contains({ origins: [hostpattern(config.origin)] });\n if (!granted) throw new Error(\"The endpoint origin has not received optional permission.\");\n await memory.setconfig(config);\n await audit(\"configure\", `Configured user-selected endpoint ${config.origin}.`);\n return config;\n }\n case \"startsession\": return startsession();\n case \"context\": {\n const plan = await memory.getplan();\n const progress = await memory.getprogress();\n const session = await memory.getsession();\n const holds = heldkeys(await memory.getholds());\n const observationversion = await memory.getobservationversion();\n const map = observationversion !== undefined && observationversion > 0 ? await memory.getmap(observationversion) : undefined;\n const a11y = (await memory.geta11ytrees())[0];\n const reader = (await memory.getreaderarticles())[0];\n const signals = await memory.getsignals();\n return { config: await memory.getconfig(), session, plan, progress: plan && progress?.planid === plan.id ? progress : undefined, diagnostic: await memory.getdiagnostic(), audit: await memory.getaudit(), capabilities: await refreshcapabilities(), outcomes: await memory.getoutcomes(), holds: heldkeysreport({ tabid: session?.tabid ?? 0, holds }), dialogs: await memory.getdialogs(), retries: await memory.getretries(), ...(signals ? { signals: signalsreport({ signals }) } : { signals: signalsreport({}) }), banners: await memory.getbanners(), mutationevents: await memory.getmutationevents(), focusevents: await memory.getfocusevents(), diffs: await memory.getdiffs(), selectors: await memory.getselectors(), ...(a11y ? { a11y } : {}), ...(reader ? { reader } : {}), ...(map ? { map } : {}) };\n }\n case \"capabilities\": return refreshcapabilities();\n case \"grantcapability\": return grantcapability(input.permission ?? \"\");\n case \"diagnostic\": return diagnostic();\n case \"proposelocal\": return propose(input.objective ?? \"\", false);\n case \"proposeremote\": return propose(input.objective ?? \"\", true);\n case \"approve\": {\n const plan = await memory.getplan();\n if (!plan || plan.state !== \"pending\") throw new Error(\"Only a pending plan can be approved.\");\n const approved = { ...plan, state: \"approved\" as const, approvedat: Date.now() };\n await memory.setplan(approved);\n const policy = plandialogpolicy(approved);\n if (policy) await memory.setdialogpolicy(policy);\n const current = await memory.getsession();\n await audit(\"approval\", \"The user approved the reviewed plan.\", { ...(current ? { sessionid: current.id } : {}), planid: approved.id });\n return approved;\n }\n case \"reject\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available to reject.\");\n const rejected = { ...plan, state: \"rejected\" as const };\n await memory.setplan(rejected);\n const current = await memory.getsession();\n await audit(\"approval\", \"The user rejected the plan.\", { ...(current ? { sessionid: current.id } : {}), planid: rejected.id });\n return rejected;\n }\n case \"preview\": return previewstep(input.stepid ?? \"\");\n case \"execute\": return executestep(input.stepid ?? \"\");\n case \"outcome\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for an outcome envelope.\");\n const outcome = (await memory.getoutcomes()).find(candidate => candidate.stepid === (input.stepid ?? \"\"));\n if (!outcome) throw new Error(\"No outcome exists for the reviewed step.\");\n const resolved = outcome.details?.resolvedtarget as resolvedtarget | undefined;\n return JSON.parse(outcomeresponse({ outcome, plan, ...(resolved ? { resolvedtarget: resolved } : {}) }));\n }\n case \"map\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a map envelope.\");\n const version = await memory.getobservationversion();\n const map = version !== undefined ? await memory.getmap(version) : undefined;\n if (!map) throw new Error(\"No clickable map has been captured yet.\");\n return JSON.parse(mapresponse({ map, plan }));\n }\n case \"observation\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for an observation envelope.\");\n const version = await memory.getobservationversion();\n const record = version !== undefined ? await memory.getobservation(version) : undefined;\n if (!record) throw new Error(\"No observation has been captured yet.\");\n return JSON.parse(observationresponse({ observation: record.observation, plan }));\n }\n case \"pausesession\": return pausesession();\n case \"resumesession\": return resumesession();\n case \"stop\": {\n const session = await memory.getsession();\n if (session) await memory.setsession({ ...session, stoppedat: Date.now() });\n const plan = await memory.getplan();\n if (plan && [\"pending\", \"approved\"].includes(plan.state)) await memory.setplan({ ...plan, state: \"cancelled\" });\n await audit(\"stop\", \"The user stopped the browser session.\", { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}) });\n return { stopped: true };\n }\n default: throw new Error(\"Unknown Devthink request.\");\n }\n}\n\nchrome.runtime.onMessage.addListener((message, sender, sendresponse) => {\n handlerequest(message, sender).then(value => sendresponse({ ok: true, value })).catch(error => sendresponse({ ok: false, error: error instanceof Error ? error.message : String(error) }));\n return true;\n});\n\n/** Reconciles persisted watch registrations when the service worker restarts: registrations stay alive in storage, windows that ended while the worker was down are closed and audited, and live windows stay open. */\nasync function reconcilewatches(): Promise<void> {\n for (const watch of await memory.getwatches()) {\n if (watch.closedat !== undefined) continue;\n if (!watchclosed(watch.startedat, watch.lifetime, Date.now())) continue;\n await memory.closewatch(watch.watchid, Date.now());\n await audit(\"watch\", `Watch ${watch.watchid} of ${watch.kind} closed on service worker restart after its reviewed lifetime of ${watch.lifetime} milliseconds.`, { sessionid: watch.sessionid, stepid: watch.stepid });\n }\n}\n\nreconcilewatches().catch(() => { /* a failing storage read retries on the next service worker start; closed windows stay auditable */ });\n\nchrome.runtime.onConnect.addListener(port => {\n if (port.name !== \"devthinksidepanel\" || port.sender?.id !== chrome.runtime.id || !port.sender.url?.startsWith(chrome.runtime.getURL(\"\"))) return port.disconnect();\n port.onMessage.addListener(message => { handlerequest(message, port.sender ?? {}).then(value => port.postMessage({ ok: true, value })).catch(error => port.postMessage({ ok: false, error: error instanceof Error ? error.message : String(error) })); });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["record", "snapshot", "record", "text", "tabid", "stepoptions", "tabid", "record"]
7
7
  }