@wenathlan/extension 1.1.39 → 1.1.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/capture.d.ts +161 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +907 -5
- package/dist/index.js.map +4 -4
- package/dist/media.d.ts +96 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/memory.d.ts +40 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/policy.d.ts +31 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/protocol.d.ts +34 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/types.d.ts +294 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/extension/dist/background.js +1786 -51
- package/extension/dist/background.js.map +4 -4
- package/extension/dist/manifest.json +1 -1
- package/extension/dist/pagebridge.js +245 -3
- package/extension/dist/pagebridge.js.map +3 -3
- package/extension/dist/popup.html +1 -1
- package/extension/dist/popup.js +22 -2
- package/extension/dist/popup.js.map +2 -2
- package/extension/dist/sidepanel.html +1 -1
- package/extension/dist/sidepanel.js +390 -2
- package/extension/dist/sidepanel.js.map +3 -3
- package/extension/dist/style.css +4 -0
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
|
@@ -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", "../tabscommand.ts", "../pagedialogs.ts", "../pageinteract.ts", "../pagecontrols.ts", "../pagenav.ts", "../pagenet.ts", "../pageforms.ts", "../pagewizards.ts", "../pagedata.ts", "../datacommand.ts", "../filescommand.ts", "../background.ts"],
|
|
4
|
-
"sourcesContent": ["import type { a11ycapture, agentplan, agentsession, artifactinventoryentry, artifactrecord, auditevent, authrecord, bannerreport, capabilityreport, captchahandoff, capturecounter, clipboardconsentrecord, cleanuprule, cleanuprun, clipentry, clickablemap, closedtab, controltabstate, curatedlist, dataset, derivedselector, detectionrecord, diagnosticreport, dialogdecision, dialogpolicy, downloadrecord, endpointconfig, errorreport, exportedartifact, extractsession, focusevent, formprofile, keyholdstate, mimefilter, mutationevent, navcontrol, navintentrecord, navqueues, navrecord, netlogrecord, observationrecord, pagesignals, planprogress, provenancerecord, quarantineentry, ratelimitstate, readercapture, recenttab, resolutionsummary, retryoutcome, runsettings, safetyverdict, scanhookconfig, sessionsnapshot, sheetendpoint, snapshotdiff, stepoutcome, streamstate, submitticket, tabbadge, tabgrouprecord, tablayout, tabmeta, tabwatchevent, taskrules, templateprofile, trailentry, typeaheadpick, waitprofilerecord, watchregistration, wizardstate } 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 /** Appends one navigation trail entry of a session with its url, title, step ref and timestamp. */\n async addtrailentry(sessionid: string, entry: trailentry): Promise<void> {\n const records = await this.gettrail(sessionid);\n await this.adapter.set(`trail${sessionid}`, [...records, entry]);\n }\n\n /** Returns the navigation trail of a session, oldest first. */\n async gettrail(sessionid: string): Promise<trailentry[]> { return (await this.adapter.get<trailentry[]>(`trail${sessionid}`)) ?? []; }\n\n /** Stores one wait profile for an origin with user configured values, replacing the previous profile of that origin. */\n async setwaitprofile(record: waitprofilerecord): Promise<void> {\n const records = (await this.getwaitprofiles()).filter(item => item.origin !== record.origin);\n await this.adapter.set(\"waitprofiles\", [...records, record]);\n }\n\n /** Returns every stored wait profile with its origin and user configured values, newest first. */\n async getwaitprofiles(): Promise<waitprofilerecord[]> { return (await this.adapter.get<waitprofilerecord[]>(\"waitprofiles\")) ?? []; }\n\n /** Records one navigation step with its redirect chain and final url. */\n async addnavrecord(record: navrecord): Promise<void> {\n const records = await this.getnavrecords();\n await this.adapter.set(\"navrecords\", [record, ...records]);\n }\n\n /** Returns every stored navigation record with redirect chains and final urls, newest first. */\n async getnavrecords(): Promise<navrecord[]> { return (await this.adapter.get<navrecord[]>(\"navrecords\")) ?? []; }\n\n /** Records one navigation intent detected from a plan for audit review. */\n async addnavintent(record: navintentrecord): Promise<void> {\n const records = await this.getnavintents();\n await this.adapter.set(\"navintents\", [record, ...records]);\n }\n\n /** Returns every stored navigation intent record, newest first. */\n async getnavintents(): Promise<navintentrecord[]> { return (await this.adapter.get<navintentrecord[]>(\"navintents\")) ?? []; }\n\n /** Replaces the rate limit window state of one domain. */\n async setratestate(state: ratelimitstate): Promise<void> {\n const records = (await this.getratestates()).filter(item => item.domain !== state.domain);\n await this.adapter.set(\"ratestates\", [...records, state]);\n }\n\n /** Returns every rate limit window state per domain. */\n async getratestates(): Promise<ratelimitstate[]> { return (await this.adapter.get<ratelimitstate[]>(\"ratestates\")) ?? []; }\n\n /** Records one curated link list with its review state before batch opening. */\n async addcurated(list: curatedlist): Promise<void> {\n const records = await this.getcurateds();\n await this.adapter.set(\"curated\", [list, ...records]);\n }\n\n /** Returns every stored curated link list, newest first. */\n async getcurateds(): Promise<curatedlist[]> { return (await this.adapter.get<curatedlist[]>(\"curated\")) ?? []; }\n\n /** Stores reviewed basic auth credentials for one origin, replacing the previous record of that origin. */\n async setauth(record: authrecord): Promise<void> {\n const records = (await this.getauths()).filter(item => item.origin !== record.origin);\n await this.adapter.set(\"auths\", [...records, record]);\n }\n\n /** Returns every stored reviewed basic auth record per origin. */\n async getauths(): Promise<authrecord[]> { return (await this.adapter.get<authrecord[]>(\"auths\")) ?? []; }\n\n /** Records one task artifact routed into the artifact store. */\n async addartifact(record: artifactrecord): Promise<void> {\n const records = await this.getartifacts();\n await this.adapter.set(\"artifacts\", [record, ...records]);\n }\n\n /** Returns every stored task artifact, newest first. */\n async getartifacts(): Promise<artifactrecord[]> { return (await this.adapter.get<artifactrecord[]>(\"artifacts\")) ?? []; }\n\n /** Returns the navigation control state of paused navigation. */\n async getnavcontrol(): Promise<navcontrol | undefined> { return this.adapter.get<navcontrol>(\"navcontrol\"); }\n\n /** Replaces the navigation control state after a pause or resume transition. */\n async setnavcontrol(control: navcontrol): Promise<void> { return this.adapter.set(\"navcontrol\", control); }\n\n /** Records one url safety verdict produced by a checksafe verification. */\n async addsafety(verdict: safetyverdict): Promise<void> {\n const records = await this.getsafeties();\n await this.adapter.set(\"safeties\", [verdict, ...records]);\n }\n\n /** Returns every stored url safety verdict, newest first. */\n async getsafeties(): Promise<safetyverdict[]> { return (await this.adapter.get<safetyverdict[]>(\"safeties\")) ?? []; }\n\n /** Records one recently closed tab so a reopentab step can restore it. */\n async addrecenttab(tab: recenttab): Promise<void> {\n const records = await this.getrecenttabs();\n await this.adapter.set(\"recenttabs\", [tab, ...records]);\n }\n\n /** Returns every recently closed tab, newest first. */\n async getrecenttabs(): Promise<recenttab[]> { return (await this.adapter.get<recenttab[]>(\"recenttabs\")) ?? []; }\n\n /** Returns the queued prefetch and batch open target counts shown in the popup badge. */\n async getnavqueues(): Promise<navqueues | undefined> { return this.adapter.get<navqueues>(\"navqueues\"); }\n\n /** Replaces the queued prefetch and batch open target counts. */\n async setnavqueues(queues: navqueues): Promise<void> { return this.adapter.set(\"navqueues\", queues); }\n\n /** Returns the last known navigation state of a tab, kept across service worker restarts. */\n async getnavstate(tabid: number): Promise<navrecord | undefined> { return this.adapter.get<navrecord>(`navstate${tabid}`); }\n\n /** Replaces the last known navigation state of a tab. */\n async setnavstate(tabid: number, state: navrecord): Promise<void> { return this.adapter.set(`navstate${tabid}`, state); }\n\n /** Stores one named tab layout with its window bounds and group states, replacing the previous layout of that name. */\n async setlayout(layout: tablayout): Promise<void> {\n const records = (await this.getlayouts()).filter(item => item.name !== layout.name);\n await this.adapter.set(\"layouts\", [layout, ...records]);\n }\n\n /** Returns one saved tab layout by name with its timestamp. */\n async getlayout(name: string): Promise<tablayout | undefined> { return (await this.getlayouts()).find(item => item.name === name); }\n\n /** Returns every saved tab layout with its window bounds and group states. */\n async getlayouts(): Promise<tablayout[]> { return (await this.adapter.get<tablayout[]>(\"layouts\")) ?? []; }\n\n /** Stores one tab group definition with its color choice and member tabs, replacing the previous definition of that name. */\n async settabgroup(group: tabgrouprecord): Promise<void> {\n const records = (await this.gettabgroups()).filter(item => item.name !== group.name);\n await this.adapter.set(\"tabgroups\", [...records, group]);\n }\n\n /** Returns every stored tab group definition with its color choice, newest first. */\n async gettabgroups(): Promise<tabgrouprecord[]> { return (await this.adapter.get<tabgrouprecord[]>(\"tabgroups\")) ?? []; }\n\n /** Records one tabmeta record with task provenance, replacing the previous metadata of that tab. */\n async settabmeta(meta: tabmeta): Promise<void> {\n const records = (await this.gettabmetas()).filter(item => item.tabid !== meta.tabid);\n await this.adapter.set(\"tabmetas\", [...records, meta]);\n }\n\n /** Returns every stored tabmeta record with task provenance. */\n async gettabmetas(): Promise<tabmeta[]> { return (await this.adapter.get<tabmeta[]>(\"tabmetas\")) ?? []; }\n\n /** Records one session snapshot of tabs and windows for later restore. */\n async addsnapshot(snapshot: sessionsnapshot): Promise<void> {\n const records = await this.getsnapshots();\n await this.adapter.set(\"snapshots\", [snapshot, ...records]);\n }\n\n /** Returns every stored session snapshot, newest first. */\n async getsnapshots(): Promise<sessionsnapshot[]> { return (await this.adapter.get<sessionsnapshot[]>(\"snapshots\")) ?? []; }\n\n /** Records one closed tab in the history kept for restoretab and reopenrun. */\n async addclosedtab(tab: closedtab): Promise<void> {\n const records = await this.getclosedtabs();\n await this.adapter.set(\"closedtabs\", [tab, ...records]);\n }\n\n /** Returns the closed tab history, newest first. */\n async getclosedtabs(): Promise<closedtab[]> { return (await this.adapter.get<closedtab[]>(\"closedtabs\")) ?? []; }\n\n /** Stores one badge state per task, replacing the previous badge of that task. */\n async setbadge(badge: tabbadge): Promise<void> {\n const records = (await this.getbadges()).filter(item => item.taskid !== badge.taskid);\n await this.adapter.set(\"badges\", [...records, badge]);\n }\n\n /** Returns every stored badge state per task. */\n async getbadges(): Promise<tabbadge[]> { return (await this.adapter.get<tabbadge[]>(\"badges\")) ?? []; }\n\n /** Records one tab event observed inside a reviewed watchtab registration. */\n async addtabwatchevent(event: tabwatchevent): Promise<void> {\n const records = await this.gettabwatchevents();\n await this.adapter.set(\"tabwatchevents\", [event, ...records]);\n }\n\n /** Returns the tab event stream of every reviewed watchtab registration, newest first. */\n async gettabwatchevents(): Promise<tabwatchevent[]> { return (await this.adapter.get<tabwatchevent[]>(\"tabwatchevents\")) ?? []; }\n\n /** Returns the ids of the scratch windows opened for split work. */\n async getscratchwindows(): Promise<number[]> { return (await this.adapter.get<number[]>(\"scratchwindows\")) ?? []; }\n\n /** Replaces the scratch window id list after one scratch window opens or closes. */\n async setscratchwindows(ids: number[]): Promise<void> { return this.adapter.set(\"scratchwindows\", ids); }\n\n /** Returns the pinned control tab state with the live task feed. */\n async getcontroltab(): Promise<controltabstate | undefined> { return this.adapter.get<controltabstate>(\"controltab\"); }\n\n /** Replaces the pinned control tab state. */\n async setcontroltab(state: controltabstate): Promise<void> { return this.adapter.set(\"controltab\", state); }\n\n /** Stores one saved form profile under its reviewed name, replacing the previous profile of that name. */\n async setprofile(profile: formprofile): Promise<void> {\n const records = (await this.getprofiles()).filter(item => item.name !== profile.name);\n await this.adapter.set(\"formprofiles\", [profile, ...records]);\n }\n\n /** Returns one saved form profile by its reviewed name. */\n async getprofile(name: string): Promise<formprofile | undefined> { return (await this.getprofiles()).find(item => item.name === name); }\n\n /** Returns every saved form profile with its origin grants, newest first. */\n async getprofiles(): Promise<formprofile[]> { return (await this.adapter.get<formprofile[]>(\"formprofiles\")) ?? []; }\n\n /** Removes one saved form profile by its reviewed name. */\n async removeprofile(name: string): Promise<void> {\n const records = (await this.getprofiles()).filter(item => item.name !== name);\n await this.adapter.set(\"formprofiles\", records);\n }\n\n /** Records one wizard state with its step history. */\n async addwizard(state: wizardstate): Promise<void> {\n const records = await this.getwizards();\n await this.adapter.set(\"wizards\", [state, ...records]);\n }\n\n /** Returns every stored wizard state with its step history, newest first. */\n async getwizards(): Promise<wizardstate[]> { return (await this.adapter.get<wizardstate[]>(\"wizards\")) ?? []; }\n\n /** Stores one submission ticket with its values hash, replacing the previous ticket of that id. */\n async setticket(ticket: submitticket): Promise<void> {\n const records = (await this.gettickets()).filter(item => item.id !== ticket.id);\n await this.adapter.set(\"submittickets\", [ticket, ...records]);\n }\n\n /** Returns every stored submission ticket with its values hash, newest first. */\n async gettickets(): Promise<submitticket[]> { return (await this.adapter.get<submitticket[]>(\"submittickets\")) ?? []; }\n\n /** Records one collected error report for correction loops. */\n async adderrorreport(report: errorreport): Promise<void> {\n const records = await this.geterrorreports();\n await this.adapter.set(\"errorreports\", [report, ...records]);\n }\n\n /** Returns every stored error report, newest first. */\n async geterrorreports(): Promise<errorreport[]> { return (await this.adapter.get<errorreport[]>(\"errorreports\")) ?? []; }\n\n /** Records one typeahead pick observed when a reviewed suggestion entry was chosen. */\n async addpick(pick: typeaheadpick): Promise<void> {\n const records = await this.getpicks();\n await this.adapter.set(\"typeaheadpicks\", [pick, ...records]);\n }\n\n /** Returns every recorded typeahead pick, newest first. */\n async getpicks(): Promise<typeaheadpick[]> { return (await this.adapter.get<typeaheadpick[]>(\"typeaheadpicks\")) ?? []; }\n\n /** Records one captcha handoff while the plan waits for the user. */\n async addcaptcha(handoff: captchahandoff): Promise<void> {\n const records = await this.getcaptchas();\n await this.adapter.set(\"captchas\", [handoff, ...records]);\n }\n\n /** Returns every captcha handoff record with its resolution state, newest first. */\n async getcaptchas(): Promise<captchahandoff[]> { return (await this.adapter.get<captchahandoff[]>(\"captchas\")) ?? []; }\n\n /** Resolves one captcha handoff by id once the user finished it. */\n async resolvecaptcha(id: string, resolvedat: number): Promise<void> {\n const records = await this.getcaptchas();\n await this.adapter.set(\"captchas\", records.map(handoff => handoff.id === id && !handoff.resolved ? { ...handoff, resolved: true, resolvedat } : handoff));\n }\n\n /** Records one login or template detection for its origin. */\n async adddetection(record: detectionrecord): Promise<void> {\n const records = await this.getdetections();\n await this.adapter.set(\"detections\", [record, ...records]);\n }\n\n /** Returns every stored login and template detection per origin, newest first. */\n async getdetections(): Promise<detectionrecord[]> { return (await this.adapter.get<detectionrecord[]>(\"detections\")) ?? []; }\n\n /** Stores the reviewed one time code behind the consent gate of an active session. */\n async setcodevalue(value: string): Promise<void> { return this.adapter.set(\"codevalue\", value); }\n\n /** Returns the reviewed one time code, if the user stored one behind the consent gate. */\n async getcodevalue(): Promise<string | undefined> { return this.adapter.get<string>(\"codevalue\"); }\n\n /** Stores one dataset with its column specs and rows, replacing the previous record of that id. */\n async setdataset(value: dataset): Promise<void> {\n await this.adapter.set(`dataset${value.id}`, value);\n const ids = ((await this.adapter.get<string[]>(\"datasets\")) ?? []).filter(id => id !== value.id);\n await this.adapter.set(\"datasets\", [value.id, ...ids]);\n }\n\n /** Returns one stored dataset by its id with its column specs and row count. */\n async getdataset(id: string): Promise<dataset | undefined> { return this.adapter.get<dataset>(`dataset${id}`); }\n\n /** Returns every stored dataset id, newest first. */\n async getdatasets(): Promise<dataset[]> {\n const ids = (await this.adapter.get<string[]>(\"datasets\")) ?? [];\n const records: dataset[] = [];\n for (const id of ids) {\n const record = await this.adapter.get<dataset>(`dataset${id}`);\n if (record) records.push(record);\n }\n return records;\n }\n\n /** Stores one imported csv dataset for fill loops beside the dataset store. */\n async addimport(value: dataset): Promise<void> {\n await this.setdataset(value);\n const ids = ((await this.adapter.get<string[]>(\"imports\")) ?? []).filter(id => id !== value.id);\n await this.adapter.set(\"imports\", [value.id, ...ids]);\n }\n\n /** Returns every imported csv dataset for fill loops, newest first. */\n async getimports(): Promise<dataset[]> {\n const ids = (await this.adapter.get<string[]>(\"imports\")) ?? [];\n const records: dataset[] = [];\n for (const id of ids) {\n const record = await this.adapter.get<dataset>(`dataset${id}`);\n if (record) records.push(record);\n }\n return records;\n }\n\n /** Stores one extraction session with its cursor and page history, replacing the previous session of that id. */\n async setextractsession(value: extractsession): Promise<void> {\n await this.adapter.set(`extract${value.id}`, value);\n const ids = ((await this.adapter.get<string[]>(\"extracts\")) ?? []).filter(id => id !== value.id);\n await this.adapter.set(\"extracts\", [value.id, ...ids]);\n }\n\n /** Returns every extraction session with its cursor and page history, newest first. */\n async getextractsessions(): Promise<extractsession[]> {\n const ids = (await this.adapter.get<string[]>(\"extracts\")) ?? [];\n const records: extractsession[] = [];\n for (const id of ids) {\n const record = await this.adapter.get<extractsession>(`extract${id}`);\n if (record) records.push(record);\n }\n return records;\n }\n\n /** Records one provenance record of an exported artifact. */\n async addprovenance(record: provenancerecord): Promise<void> {\n const records = await this.getprovenances();\n await this.adapter.set(\"provenances\", [record, ...records]);\n }\n\n /** Returns every provenance record per exported artifact, newest first. */\n async getprovenances(): Promise<provenancerecord[]> { return (await this.adapter.get<provenancerecord[]>(\"provenances\")) ?? []; }\n\n /** Stores the transform rules and dedupe keys of one task, replacing the previous record of that task. */\n async settaskrules(value: taskrules): Promise<void> {\n const records = ((await this.adapter.get<taskrules[]>(\"taskrules\")) ?? []).filter(item => item.taskid !== value.taskid);\n await this.adapter.set(\"taskrules\", [value, ...records]);\n }\n\n /** Returns the transform rules and dedupe keys per task, newest first. */\n async gettaskrules(): Promise<taskrules[]> { return (await this.adapter.get<taskrules[]>(\"taskrules\")) ?? []; }\n\n /** Stores one stream chunk state for resume, replacing the previous state of that dataset. */\n async setstream(state: streamstate): Promise<void> {\n const records = ((await this.adapter.get<streamstate[]>(\"streams\")) ?? []).filter(item => item.datasetid !== state.datasetid);\n await this.adapter.set(\"streams\", [state, ...records]);\n }\n\n /** Returns every stream chunk state persisted for resume, newest first. */\n async getstreams(): Promise<streamstate[]> { return (await this.adapter.get<streamstate[]>(\"streams\")) ?? []; }\n\n /** Stores one reviewed sheet endpoint config behind its origin grant, replacing the previous config of that origin. */\n async setsheetendpoint(config: sheetendpoint): Promise<void> {\n const records = ((await this.adapter.get<sheetendpoint[]>(\"sheetendpoints\")) ?? []).filter(item => item.origin !== config.origin);\n await this.adapter.set(\"sheetendpoints\", [config, ...records]);\n }\n\n /** Returns every reviewed sheet endpoint config, newest first. */\n async getsheetendpoints(): Promise<sheetendpoint[]> { return (await this.adapter.get<sheetendpoint[]>(\"sheetendpoints\")) ?? []; }\n\n /** Records one exported data artifact; artifact retention is a user setting and an absent setting keeps every artifact. */\n async addexport(artifact: exportedartifact): Promise<void> {\n const records = await this.getexports();\n const combined = [artifact, ...records.filter(item => item.id !== artifact.id)];\n const retention = (await this.getsettings())?.artifactretention;\n await this.adapter.set(\"exports\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Returns every exported data artifact with its content and checksum, newest first. */\n async getexports(): Promise<exportedartifact[]> { return (await this.adapter.get<exportedartifact[]>(\"exports\")) ?? []; }\n\n /** Removes one exported data artifact by id and reports whether it existed. */\n async removeexport(id: string): Promise<boolean> {\n const records = await this.getexports();\n const remaining = records.filter(item => item.id !== id);\n await this.adapter.set(\"exports\", remaining);\n return remaining.length !== records.length;\n }\n\n /** Removes one run store artifact by id and reports whether it existed. */\n async removeartifact(id: string): Promise<boolean> {\n const records = await this.getartifacts();\n const remaining = records.filter(item => item.id !== id);\n await this.adapter.set(\"artifacts\", remaining);\n return remaining.length !== records.length;\n }\n\n /** Stores one batch download file record with its state, path and checksum, replacing the previous record of that id. */\n async setdownload(record: downloadrecord): Promise<void> {\n const records = ((await this.adapter.get<downloadrecord[]>(\"downloads\")) ?? []).filter(item => item.id !== record.id);\n await this.adapter.set(\"downloads\", [record, ...records]);\n }\n\n /** Returns every batch download file record with its state, path and checksum, newest first. */\n async getdownloads(): Promise<downloadrecord[]> { return (await this.adapter.get<downloadrecord[]>(\"downloads\")) ?? []; }\n\n /** Records one captured network log record; netlog retention is a user setting and an absent value keeps every record. */\n async addnetlog(record: netlogrecord): Promise<void> {\n const records = await this.getnetlog();\n const combined = [record, ...records];\n const retention = (await this.getsettings())?.netlogretention;\n await this.adapter.set(\"netlog\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Returns the captured network log of the run with its step correlation, newest first. */\n async getnetlog(): Promise<netlogrecord[]> { return (await this.adapter.get<netlogrecord[]>(\"netlog\")) ?? []; }\n\n /** Stores one clipboard consent record with its prompt and origin, replacing the previous record of that id. */\n async setclipconsent(record: clipboardconsentrecord): Promise<void> {\n const records = ((await this.adapter.get<clipboardconsentrecord[]>(\"clipconsents\")) ?? []).filter(item => item.id !== record.id);\n await this.adapter.set(\"clipconsents\", [record, ...records]);\n }\n\n /** Returns every clipboard consent record with its prompt and origin, newest first. */\n async getclipconsents(): Promise<clipboardconsentrecord[]> { return (await this.adapter.get<clipboardconsentrecord[]>(\"clipconsents\")) ?? []; }\n\n /** Records one clipboard entry hash with its origin provenance; the payload text itself never persists. */\n async addclip(entry: clipentry): Promise<void> {\n const records = await this.getclips();\n await this.adapter.set(\"clips\", [entry, ...records]);\n }\n\n /** Returns every clipboard entry hash with its kind and origin provenance, newest first. */\n async getclips(): Promise<clipentry[]> { return (await this.adapter.get<clipentry[]>(\"clips\")) ?? []; }\n\n /** Stores one quarantine entry with its scan verdict, replacing the previous entry of that id. */\n async setquarantine(entry: quarantineentry): Promise<void> {\n const records = ((await this.adapter.get<quarantineentry[]>(\"quarantines\")) ?? []).filter(item => item.id !== entry.id);\n await this.adapter.set(\"quarantines\", [entry, ...records]);\n }\n\n /** Returns every quarantine entry with its scan verdict and release ref, newest first. */\n async getquarantines(): Promise<quarantineentry[]> { return (await this.adapter.get<quarantineentry[]>(\"quarantines\")) ?? []; }\n\n /** Stores the reviewed cleanup rule set of the run, replacing the previous set. */\n async setcleanuprules(rules: cleanuprule[]): Promise<void> { return this.adapter.set(\"cleanuprules\", rules); }\n\n /** Returns the reviewed cleanup rule set of the run. */\n async getcleanuprules(): Promise<cleanuprule[]> { return (await this.adapter.get<cleanuprule[]>(\"cleanuprules\")) ?? []; }\n\n /** Records one cleanup run in the run history. */\n async addcleanuprun(run: cleanuprun): Promise<void> {\n const records = await this.getcleanupruns();\n await this.adapter.set(\"cleanupruns\", [run, ...records]);\n }\n\n /** Returns every cleanup run history record with removed and kept counts, newest first. */\n async getcleanupruns(): Promise<cleanuprun[]> { return (await this.adapter.get<cleanuprun[]>(\"cleanupruns\")) ?? []; }\n\n /** Stores the capture naming counters of one task, replacing the previous counters of that task. */\n async setcapturecounter(counter: capturecounter): Promise<void> {\n const records = ((await this.adapter.get<capturecounter[]>(\"capturecounters\")) ?? []).filter(item => item.taskid !== counter.taskid);\n await this.adapter.set(\"capturecounters\", [counter, ...records]);\n }\n\n /** Returns every stored capture naming counter per task, newest first. */\n async getcapturecounters(): Promise<capturecounter[]> { return (await this.adapter.get<capturecounter[]>(\"capturecounters\")) ?? []; }\n\n /** Replaces the artifact inventory the cleanup sweeper plans against. */\n async setinventory(entries: artifactinventoryentry[]): Promise<void> { return this.adapter.set(\"inventory\", entries); }\n\n /** Returns the artifact inventory with sizes and ages for the cleanup sweeper. */\n async getinventory(): Promise<artifactinventoryentry[]> { return (await this.adapter.get<artifactinventoryentry[]>(\"inventory\")) ?? []; }\n\n /** Stores one user configured virus scanning hook, replacing the previous hook of that scanner name. */\n async setscanhook(config: scanhookconfig): Promise<void> {\n const records = ((await this.adapter.get<scanhookconfig[]>(\"scanhooks\")) ?? []).filter(item => item.scanner !== config.scanner);\n await this.adapter.set(\"scanhooks\", [config, ...records]);\n }\n\n /** Returns every configured virus scanning hook, newest first. */\n async getscanhooks(): Promise<scanhookconfig[]> { return (await this.adapter.get<scanhookconfig[]>(\"scanhooks\")) ?? []; }\n\n /** Stores the armed mime interception filters of the run, newest first. */\n async setmimefilters(filters: mimefilter[]): Promise<void> { return this.adapter.set(\"mimefilters\", filters); }\n\n /** Returns the armed mime interception filters of the run, newest first. */\n async getmimefilters(): Promise<mimefilter[]> { return (await this.adapter.get<mimefilter[]>(\"mimefilters\")) ?? []; }\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, cleanuprule, downloadspec, endpointconfig, fieldkind, formprofile, mimefilter, observationmode, policyevaluation, quarantineentry, runsettings, safetyverdict, toolstep, transformrule } 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\", \"openlink\", \"openprivate\", \"reloadcache\", \"stopnav\", \"followlink\", \"spanav\", \"rewritequery\", \"setfragment\", \"navlist\", \"navprofile\", \"handleauth\", \"printpdf\", \"prefetch\", \"preconnect\", \"deeplink\", \"reopentab\", \"pausenav\", \"navrate\", \"openclipboard\", \"batchopen\", \"duplicatetab\", \"closepattern\", \"pintab\", \"mutetab\", \"movetab\", \"movetabwindow\", \"grouptabs\", \"colorgroup\", \"collapsegroup\", \"discardtab\", \"reloadtabs\", \"zoomin\", \"zoomout\", \"switchtab\", \"maximizewindow\", \"minimizewindow\", \"restorewindow\", \"focuswindow\", \"scratchwindow\", \"incognitowindow\", \"restoretab\", \"restorelayout\", \"reopenrun\", \"badgetab\", \"fillform\", \"filllabel\", \"fillplaceholder\", \"submitform\", \"retryform\", \"runwizard\", \"selectchain\", \"picktypeahead\", \"pickdate\", \"attachfile\", \"fillcard\", \"fillcode\", \"consentpassword\", \"exportcsv\", \"exportjson\", \"exportexcel\", \"copytable\", \"pushsheets\", \"streamdisk\", \"paginateextract\", \"resumeextract\", \"batchdownload\", \"pausedownload\", \"resumedownload\", \"interceptmime\", \"readclipboard\", \"writeclipboard\", \"copyscreen\", \"quarantinedownload\", \"scanvirus\", \"cleanupartifacts\"]);\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\", \"waitload\", \"waiturl\", \"spawait\", \"detecthttp\", \"readredirects\", \"readfinalurl\", \"trailaudit\", \"navintent\", \"checksafe\", \"querytabs\", \"watchtab\", \"findclones\", \"searchtabs\", \"listaudio\", \"snapshotsession\", \"savelayout\", \"attachmeta\", \"detectfields\", \"generatevalues\", \"saveprofiles\", \"asksubmit\", \"readerrors\", \"skiphoneypot\", \"detectlogin\", \"detecttemplate\", \"handoffcaptcha\", \"scrapetable\", \"importcsv\", \"looprows\", \"transformvalues\", \"deduperows\", \"mergepages\", \"stamplerows\", \"previewgrid\", \"logprovenance\", \"verifydownload\", \"exportnetlog\", \"namecaptures\"]);\nconst allowedactions = new Set<actionkind>([...sensitiveactions, ...interactionactions, ...readactions]);\nconst watchactions = new Set<actionkind>([\"watchmutate\", \"watchbanner\", \"watchfocus\", \"watchtab\"]);\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\", \"submitform\", \"retryform\", \"selectchain\", \"picktypeahead\", \"pickdate\", \"attachfile\", \"fillcode\", \"consentpassword\", \"scrapetable\", \"paginateextract\"]);\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\", \"followlink\", \"setfragment\", \"handleauth\", \"navintent\", \"openclipboard\", \"checksafe\", \"reopentab\", \"spanav\", \"duplicatetab\", \"pintab\", \"mutetab\", \"movetab\", \"movetabwindow\", \"searchtabs\", \"badgetab\", \"attachmeta\", \"focuswindow\", \"maximizewindow\", \"minimizewindow\", \"restorewindow\", \"incognitowindow\", \"asksubmit\", \"selectchain\", \"picktypeahead\", \"pickdate\", \"attachfile\", \"fillcode\", \"consentpassword\", \"pausedownload\", \"resumedownload\", \"verifydownload\", \"writeclipboard\", \"quarantinedownload\", \"scanvirus\"]);\nconst tabscommandactions = new Set<actionkind>([\"querytabs\", \"duplicatetab\", \"closepattern\", \"pintab\", \"mutetab\", \"movetab\", \"movetabwindow\", \"grouptabs\", \"colorgroup\", \"collapsegroup\", \"discardtab\", \"reloadtabs\", \"zoomin\", \"zoomout\", \"watchtab\", \"switchtab\", \"maximizewindow\", \"minimizewindow\", \"restorewindow\", \"focuswindow\", \"scratchwindow\", \"incognitowindow\", \"restoretab\", \"savelayout\", \"restorelayout\", \"findclones\", \"searchtabs\", \"badgetab\", \"attachmeta\", \"listaudio\", \"reopenrun\", \"snapshotsession\"]);\nconst formactions = new Set<actionkind>([\"fillform\", \"filllabel\", \"fillplaceholder\", \"detectfields\", \"generatevalues\", \"saveprofiles\", \"asksubmit\", \"submitform\", \"readerrors\", \"retryform\", \"runwizard\", \"selectchain\", \"picktypeahead\", \"pickdate\", \"attachfile\", \"handoffcaptcha\", \"fillcard\", \"fillcode\", \"consentpassword\", \"skiphoneypot\", \"detectlogin\", \"detecttemplate\"]);\n/** Extraction, transform, export and provenance kinds of the forms and data part two family. */\nconst datasetactions = new Set<actionkind>([\"scrapetable\", \"exportcsv\", \"exportjson\", \"exportexcel\", \"copytable\", \"pushsheets\", \"importcsv\", \"looprows\", \"transformvalues\", \"deduperows\", \"paginateextract\", \"mergepages\", \"stamplerows\", \"previewgrid\", \"streamdisk\", \"resumeextract\", \"logprovenance\"]);\n/** Export kinds that move extracted data out of local memory to disk, the clipboard or a reviewed sheet endpoint. */\nconst exportactions = new Set<actionkind>([\"exportcsv\", \"exportjson\", \"exportexcel\", \"copytable\", \"pushsheets\", \"streamdisk\"]);\n/** Files, clipboard and downloads kinds of the batch queue, interception, clipboard, quarantine, naming and cleanup family. */\nconst filesactions = new Set<actionkind>([\"batchdownload\", \"pausedownload\", \"resumedownload\", \"verifydownload\", \"interceptmime\", \"exportnetlog\", \"readclipboard\", \"writeclipboard\", \"copyscreen\", \"quarantinedownload\", \"scanvirus\", \"namecaptures\", \"cleanupartifacts\"]);\n/** Field kinds the form grammar accepts inside records, profiles and value rules. */\nconst fieldkinds: fieldkind[] = [\"text\", \"email\", \"phone\", \"date\", \"number\", \"select\", \"check\", \"radio\", \"file\", \"password\", \"card\", \"code\"];\nconst layoutmutationactions = new Set<actionkind>([\"grouptabs\", \"colorgroup\", \"collapsegroup\", \"savelayout\", \"restorelayout\"]);\n/** Chromium tab group colors accepted as reviewed group color choices. */\nconst groupcolors = [\"grey\", \"blue\", \"red\", \"yellow\", \"green\", \"pink\", \"purple\", \"cyan\", \"orange\"];\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 if (kind === \"openclipboard\") return \"clipboardRead\";\n if (kind === \"copytable\") return \"clipboardWrite\";\n if (kind === \"batchdownload\" || kind === \"pausedownload\" || kind === \"resumedownload\" || kind === \"verifydownload\" || kind === \"interceptmime\" || kind === \"quarantinedownload\" || kind === \"scanvirus\") return \"downloads\";\n if (kind === \"readclipboard\") return \"clipboardRead\";\n if (kind === \"writeclipboard\" || kind === \"copyscreen\") return \"clipboardWrite\";\n if (kind === \"openlink\" || kind === \"openprivate\" || kind === \"navlist\" || kind === \"batchopen\" || kind === \"reopentab\" || kind === \"deeplink\") return \"tabs\";\n if (tabscommandactions.has(kind)) return \"tabs\";\n return undefined;\n}\n\n/** True when the kind commands tabs or windows beyond the active tab and needs the optional tabs capability. */\nexport function istabscommandkind(kind: actionkind): boolean {\n return tabscommandactions.has(kind);\n}\n\n/** True when the kind mutates tab groups or layouts and therefore stays inside the active session. */\nexport function islayoutkind(kind: actionkind): boolean {\n return layoutmutationactions.has(kind);\n}\n\n/** True when the kind belongs to the forms and data family. */\nexport function isformkind(kind: actionkind): boolean {\n return formactions.has(kind);\n}\n\n/** True when the kind belongs to the extraction, transform, export and provenance family. */\nexport function isdatasetkind(kind: actionkind): boolean {\n return datasetactions.has(kind);\n}\n\n/** True when the kind exports extracted data out of local memory to disk, the clipboard or a reviewed sheet endpoint. */\nexport function isexportkind(kind: actionkind): boolean {\n return exportactions.has(kind);\n}\n\n/** True when the kind belongs to the files, clipboard and downloads family. */\nexport function isfileskind(kind: actionkind): boolean {\n return filesactions.has(kind);\n}\n\n/** Refuses any export that would leave local memory while the session origin grants do not cover the active origin. */\nexport function exportgranted(session: agentsession | undefined, origin: string): policyevaluation {\n if (!origingranted(session, origin)) return { allowed: false, reason: `The export of extracted data from ${origin} needs the session origin grants before it leaves local memory.` };\n return { allowed: true };\n}\n\n/** Validates the reviewed fieldmatch grammar of one form field entry. */\nexport function validatefieldmatch(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed field match is required in options.\" };\n const match = value as Record<string, unknown>;\n if (match.mode !== \"label\" && match.mode !== \"placeholder\" && match.mode !== \"arialabel\" && match.mode !== \"name\") return { allowed: false, reason: \"The reviewed field match mode must be label, placeholder, arialabel or name.\" };\n const key = match.mode === \"label\" ? \"label\" : match.mode === \"placeholder\" ? \"placeholder\" : match.mode === \"arialabel\" ? \"arialabel\" : \"name\";\n if (!isnonempty(match[key])) return { allowed: false, reason: `The reviewed ${match.mode} field match needs a non-empty ${key}.` };\n return { allowed: true };\n}\n\n/** Validates a reviewed structured form record; password entries are refused because passwords need the explicit consentpassword consent. */\nexport function validateformrecord(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed form record with entries is required in options.\" };\n const record = value as Record<string, unknown>;\n if (record.form !== undefined && !isnonempty(record.form)) return { allowed: false, reason: \"The reviewed form record form selector must be a non-empty string.\" };\n if (!Array.isArray(record.entries) || record.entries.length === 0) return { allowed: false, reason: \"The reviewed form record needs a non-empty list of entries.\" };\n for (const item of record.entries) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return { allowed: false, reason: \"Every reviewed form record entry must be an object.\" };\n const entry = item as Record<string, unknown>;\n const matchcheck = validatefieldmatch(entry.match);\n if (!matchcheck.allowed) return matchcheck;\n if (typeof entry.kind !== \"string\" || !fieldkinds.includes(entry.kind as fieldkind)) return { allowed: false, reason: \"Every reviewed form record entry needs a known field kind.\" };\n if (typeof entry.value !== \"string\") return { allowed: false, reason: \"Every reviewed form record entry needs a string value.\" };\n if (entry.kind === \"password\") return { allowed: false, reason: \"Password entries are refused inside form records; use consentpassword with a reviewed consent ref.\" };\n }\n return { allowed: true };\n}\n\n/** Validates the reviewed valuegen grammar of a generatevalues step. */\nexport function validatevaluegen(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed valuegen rule with a field kind is required in options.\" };\n const rule = value as Record<string, unknown>;\n if (typeof rule.kind !== \"string\" || !fieldkinds.includes(rule.kind as fieldkind)) return { allowed: false, reason: \"The reviewed valuegen kind must be a known field kind.\" };\n if (rule.locale !== undefined && !isnonempty(rule.locale)) return { allowed: false, reason: \"The reviewed valuegen locale must be a non-empty string.\" };\n if (rule.seed !== undefined && (typeof rule.seed !== \"number\" || !Number.isFinite(rule.seed))) return { allowed: false, reason: \"The reviewed valuegen seed must be a finite number.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed list of label or placeholder value pairs for filllabel and fillplaceholder steps. */\nfunction validatefieldpairs(options: Record<string, unknown>, mode: \"label\" | \"placeholder\"): policyevaluation {\n const pairs = options.fields;\n if (!Array.isArray(pairs) || pairs.length === 0) return { allowed: false, reason: \"A reviewed non-empty list of field pairs is required in options.\" };\n for (const item of pairs) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return { allowed: false, reason: \"Every reviewed field pair must be an object.\" };\n const pair = item as Record<string, unknown>;\n if (!isnonempty(pair[mode])) return { allowed: false, reason: `Every reviewed field pair needs a non-empty ${mode}.` };\n if (typeof pair.value !== \"string\" || !pair.value.trim()) return { allowed: false, reason: \"Every reviewed field pair needs a non-empty value.\" };\n }\n return { allowed: true };\n}\n\n/** Validates the reviewed card segment grammar of a fillcard step. */\nfunction validatecardsegments(value: unknown): policyevaluation {\n if (!Array.isArray(value) || value.length === 0) return { allowed: false, reason: \"A reviewed non-empty list of card segments is required in options.\" };\n for (const item of value) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return { allowed: false, reason: \"Every reviewed card segment must be an object.\" };\n const segment = item as Record<string, unknown>;\n const matchcheck = validatefieldmatch(segment.match);\n if (!matchcheck.allowed) return matchcheck;\n if (typeof segment.value !== \"string\" || !segment.value.trim()) return { allowed: false, reason: \"Every reviewed card segment needs a non-empty value.\" };\n }\n return { allowed: true };\n}\n\n/** Validates the reviewed forms and data parameter grammar of the form family. */\nfunction validateformgrammar(step: toolstep, options: Record<string, unknown>): policyevaluation {\n const kind = step.kind;\n if (kind === \"fillform\" || (kind === \"saveprofiles\" && options.formrecord !== undefined)) {\n const recordcheck = validateformrecord(options.formrecord);\n if (!recordcheck.allowed) return recordcheck;\n }\n if (kind === \"filllabel\" || kind === \"fillplaceholder\") {\n const paircheck = validatefieldpairs(options, kind === \"filllabel\" ? \"label\" : \"placeholder\");\n if (!paircheck.allowed) return paircheck;\n }\n if (kind === \"generatevalues\" && options.valuegen !== undefined) {\n const rulecheck = validatevaluegen(options.valuegen);\n if (!rulecheck.allowed) return rulecheck;\n }\n if (kind === \"saveprofiles\" && !isnonempty(options.name)) return { allowed: false, reason: \"A reviewed profile name is required in options.\" };\n if (kind === \"submitform\" && !isnonempty(options.consentref)) return { allowed: false, reason: \"A reviewed consent ref of an approved asksubmit ticket is required in options.\" };\n if (kind === \"retryform\") {\n const backoff = options.backoff;\n if (!backoff || typeof backoff !== \"object\" || Array.isArray(backoff)) return { allowed: false, reason: \"A reviewed backoff rule with wait and factor is required in options.\" };\n const rule = backoff as Record<string, unknown>;\n if (typeof rule.wait !== \"number\" || !Number.isFinite(rule.wait) || rule.wait <= 0) return { allowed: false, reason: \"The reviewed retry backoff wait must be a positive number of milliseconds with no code ceiling.\" };\n if (typeof rule.factor !== \"number\" || !Number.isFinite(rule.factor) || rule.factor < 1) return { allowed: false, reason: \"The reviewed retry backoff factor must be one or greater with no code ceiling.\" };\n if (options.attempts !== undefined && (typeof options.attempts !== \"number\" || !Number.isInteger(options.attempts) || options.attempts < 1)) return { allowed: false, reason: \"The reviewed retry attempts must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"runwizard\" && options.steps !== undefined && (typeof options.steps !== \"number\" || !Number.isInteger(options.steps) || options.steps < 1)) return { allowed: false, reason: \"The reviewed wizard step count must be a positive integer with no code ceiling.\" };\n if (kind === \"selectchain\") {\n if (!isnonempty(options.child)) return { allowed: false, reason: \"A reviewed child selector of the dependent control is required in options.\" };\n if (!nonnegativeoption(options, \"wait\")) return { allowed: false, reason: \"The reviewed dependent wait must be zero or a positive number of milliseconds.\" };\n }\n if (kind === \"picktypeahead\") {\n if (!isnonempty(options.pick)) return { allowed: false, reason: \"A reviewed suggestion entry to pick is required in options.\" };\n if (!nonnegativeoption(options, \"timeout\")) return { allowed: false, reason: \"The reviewed typeahead timeout must be zero or a positive number of milliseconds.\" };\n }\n if (kind === \"pickdate\" && !/^\\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 (kind === \"fillcard\") {\n const segmentcheck = validatecardsegments(options.segments);\n if (!segmentcheck.allowed) return segmentcheck;\n if (!nonnegativeoption(options, \"pause\")) return { allowed: false, reason: \"The reviewed card typing pause must be zero or a positive number of milliseconds.\" };\n }\n if (kind === \"fillcode\" && !isnonempty(options.source)) return { allowed: false, reason: \"A reviewed one time code source is required in options.\" };\n if (kind === \"consentpassword\" && !isnonempty(options.consentref)) return { allowed: false, reason: \"A reviewed consent ref is required in options before any password is filled.\" };\n return { allowed: true };\n}\n\n/** Validates one reviewed transform rule: a supported expression, source columns and a target column. */\nexport function validatetransformrule(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed transform rule with an expression, sources and a target is required in options.\" };\n const rule = value as Record<string, unknown>;\n const expression = rule.expression;\n if (typeof expression !== \"string\" || !/^(trim|upper|lower|number|prefix|suffix|replace)(?::.+)?$/.test(expression)) return { allowed: false, reason: \"The reviewed transform expression must be trim, upper, lower, number, prefix, suffix or replace with an optional argument.\" };\n if (expression.startsWith(\"replace\") && !expression.slice(\"replace\".length).includes(\"=>\")) return { allowed: false, reason: \"The reviewed replace expression needs the from=>to separator.\" };\n if (expression.startsWith(\"replace\") && expression.slice(\"replace:\".length).split(\"=>\")[0] === \"\") return { allowed: false, reason: \"The reviewed replace expression needs a non-empty from part.\" };\n if (!Array.isArray(rule.sources) || rule.sources.length === 0 || !rule.sources.every(source => isnonempty(source))) return { allowed: false, reason: \"Every reviewed transform rule needs a non-empty list of source columns.\" };\n if (!isnonempty(rule.target)) return { allowed: false, reason: \"Every reviewed transform rule needs a non-empty target column.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed dataset id list in options. */\nfunction validatedatasetids(options: Record<string, unknown>, key: string): policyevaluation {\n const ids = options[key];\n if (!Array.isArray(ids) || ids.length === 0 || !ids.every(id => isnonempty(id))) return { allowed: false, reason: `A reviewed non-empty list of dataset ids is required in options as ${key}.` };\n return { allowed: true };\n}\n\n/** Validates the reviewed extraction, transform, export and provenance parameter grammar of the data family. */\nfunction validatedatagrammar(step: toolstep, options: Record<string, unknown>, origin: string): policyevaluation {\n const kind = step.kind;\n if (kind === \"scrapetable\") {\n if (options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed dataset name must be a non-empty string.\" };\n if (options.rowlimit !== undefined && (typeof options.rowlimit !== \"number\" || !Number.isInteger(options.rowlimit) || options.rowlimit < 1)) return { allowed: false, reason: \"The reviewed row limit must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"paginateextract\") {\n if (!isnonempty(options.next)) return { allowed: false, reason: \"A reviewed next control selector is required in options.\" };\n if (options.pages !== undefined && (typeof options.pages !== \"number\" || !Number.isInteger(options.pages) || options.pages < 1)) return { allowed: false, reason: \"The reviewed page count must be a positive integer with no code ceiling.\" };\n if (!nonnegativeoption(options, \"wait\")) return { allowed: false, reason: \"The reviewed row freshness wait must be zero or a positive number of milliseconds.\" };\n }\n if (kind === \"exportcsv\" || kind === \"exportjson\" || kind === \"exportexcel\" || kind === \"copytable\" || kind === \"streamdisk\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed artifact name must be a non-empty string.\" };\n }\n if (kind === \"exportcsv\" && options.delimiter !== undefined && (typeof options.delimiter !== \"string\" || options.delimiter.length !== 1)) return { allowed: false, reason: \"The reviewed csv delimiter must be a single character.\" };\n if (kind === \"streamdisk\" && (typeof options.chunk !== \"number\" || !Number.isInteger(options.chunk) || options.chunk < 1)) return { allowed: false, reason: \"The reviewed streaming chunk size must be a positive integer with no code ceiling.\" };\n if (kind === \"pushsheets\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (!isnonempty(options.sheet)) return { allowed: false, reason: \"A reviewed sheet endpoint url is required in options.\" };\n if (!ishttpsurl(options.sheet)) return { allowed: false, reason: \"The reviewed sheet endpoint url must use HTTPS.\" };\n if (options.reviewed !== true) return { allowed: false, reason: \"The sheet push needs the explicit reviewed flag before any data leaves local memory.\" };\n }\n if (kind === \"importcsv\") {\n if (typeof options.csv !== \"string\" || !options.csv.trim()) return { allowed: false, reason: \"Reviewed csv content is required in options.\" };\n if (options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed dataset name must be a non-empty string.\" };\n if (options.mapping !== undefined) {\n const mapping = options.mapping;\n if (!mapping || typeof mapping !== \"object\" || Array.isArray(mapping) || !Object.values(mapping).every(item => typeof item === \"string\")) return { allowed: false, reason: \"The reviewed csv column mapping must be an object of string values.\" };\n }\n }\n if (kind === \"looprows\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (options.variable !== undefined && !isnonempty(options.variable)) return { allowed: false, reason: \"The reviewed row variable name must be a non-empty string.\" };\n const inner = validateinnerstep(options, origin);\n if (!inner.allowed) return inner;\n }\n if (kind === \"transformvalues\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n const rules = options.rules;\n if (!Array.isArray(rules) || rules.length === 0) return { allowed: false, reason: \"A reviewed non-empty list of transform rules is required in options.\" };\n for (const item of rules) {\n const rulecheck = validatetransformrule(item);\n if (!rulecheck.allowed) return rulecheck;\n }\n }\n if (kind === \"deduperows\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n const keys = options.keys;\n if (!Array.isArray(keys) || keys.length === 0 || !keys.every(key => isnonempty(key))) return { allowed: false, reason: \"A reviewed non-empty list of dedupe column keys is required in options.\" };\n }\n if (kind === \"mergepages\") {\n const listcheck = validatedatasetids(options, \"datasets\");\n if (!listcheck.allowed) return listcheck;\n }\n if (kind === \"stamplerows\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (options.url !== undefined && !ishttpsurl(options.url)) return { allowed: false, reason: \"The reviewed source url must use HTTPS.\" };\n }\n if (kind === \"previewgrid\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (options.sample !== undefined && (typeof options.sample !== \"number\" || !Number.isInteger(options.sample) || options.sample < 1)) return { allowed: false, reason: \"The reviewed sample row count must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"resumeextract\" && !isnonempty(options.session)) return { allowed: false, reason: \"A reviewed extract session id is required in options.\" };\n if (kind === \"logprovenance\" && !isnonempty(options.artifact)) return { allowed: false, reason: \"A reviewed artifact id or name is required in options.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed batch download specification: a non-empty HTTPS url list, an optional filename rule and an optional completion criterion. */\nexport function validatedownloadspec(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed downloadspec with a url list is required in options.\" };\n const spec = value as Record<string, unknown>;\n if (!Array.isArray(spec.urls) || spec.urls.length === 0 || !spec.urls.every(url => ishttpsurl(url))) return { allowed: false, reason: \"The reviewed downloadspec needs a non-empty list of HTTPS urls.\" };\n if (spec.filename !== undefined && !isnonempty(spec.filename)) return { allowed: false, reason: \"The reviewed downloadspec filename rule must be a non-empty string.\" };\n if (spec.complete !== undefined && spec.complete !== \"size\" && spec.complete !== \"checksum\") return { allowed: false, reason: \"The reviewed downloadspec completion criterion must be size or checksum.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed mime interception filter: include and exclude patterns plus the deny default for unlisted mime types. */\nexport function validatemimefilter(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed mimefilter with include and exclude patterns is required in options.\" };\n const filter = value as Record<string, unknown>;\n if (!Array.isArray(filter.include) || filter.include.length === 0 || !filter.include.every(pattern => isnonempty(pattern))) return { allowed: false, reason: \"The reviewed mimefilter needs a non-empty list of include patterns.\" };\n if (filter.exclude !== undefined && (!Array.isArray(filter.exclude) || !filter.exclude.every(pattern => isnonempty(pattern)))) return { allowed: false, reason: \"The reviewed mimefilter exclude patterns must be a list of non-empty strings.\" };\n if (filter.default !== \"deny\" && filter.default !== \"allow\") return { allowed: false, reason: \"The reviewed mimefilter needs the deny or allow default for unlisted mime types.\" };\n return { allowed: true };\n}\n\n/** Validates one reviewed cleanup rule: a positive age window with no code ceiling, an artifact kind and a keep policy. */\nexport function validatecleanuprule(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed cleanuprule with an age, a kind and a keep policy is required.\" };\n const rule = value as Record<string, unknown>;\n if (typeof rule.age !== \"number\" || !Number.isFinite(rule.age) || rule.age <= 0) return { allowed: false, reason: \"The reviewed cleanup age window must be a positive number of milliseconds with no code ceiling.\" };\n if (!isnonempty(rule.kind)) return { allowed: false, reason: \"The reviewed cleanup rule needs a non-empty artifact kind, or any to match every kind.\" };\n if (rule.keep !== \"none\" && rule.keep !== \"latest\" && rule.keep !== \"all\") return { allowed: false, reason: \"The reviewed cleanup keep policy must be none, latest or all.\" };\n return { allowed: true };\n}\n\n/** Validates the reviewed files, clipboard and downloads parameter grammar; batch sizes, concurrent windows and cleanup ages stay user configured with no code ceilings. */\nfunction validatefilesgrammar(step: toolstep, options: Record<string, unknown>): policyevaluation {\n const kind = step.kind;\n if (kind === \"batchdownload\") {\n const speccheck = validatedownloadspec(options.downloadspec);\n if (!speccheck.allowed) return speccheck;\n if (options.concurrent !== undefined && (typeof options.concurrent !== \"number\" || !Number.isInteger(options.concurrent) || options.concurrent < 1)) return { allowed: false, reason: \"The reviewed concurrent download window must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"pausedownload\" || kind === \"resumedownload\" || kind === \"verifydownload\" || kind === \"quarantinedownload\" || kind === \"scanvirus\") {\n if (!isnonempty(step.value)) return { allowed: false, reason: \"A reviewed download or quarantine reference is required.\" };\n if (kind === \"verifydownload\") {\n if (options.checksum !== undefined && !isnonempty(options.checksum)) return { allowed: false, reason: \"The reviewed expected checksum must be a non-empty string.\" };\n if (options.bytes !== undefined && (typeof options.bytes !== \"number\" || !Number.isFinite(options.bytes) || options.bytes < 0)) return { allowed: false, reason: \"The reviewed expected size must be zero or a positive number of bytes.\" };\n }\n if (kind === \"scanvirus\" && options.scanner !== undefined && !isnonempty(options.scanner)) return { allowed: false, reason: \"The reviewed scanner name must be a non-empty string.\" };\n if (kind === \"quarantinedownload\" && options.reason !== undefined && !isnonempty(options.reason)) return { allowed: false, reason: \"The reviewed quarantine reason must be a non-empty string.\" };\n }\n if (kind === \"interceptmime\") {\n const filtercheck = validatemimefilter(options.mimefilter);\n if (!filtercheck.allowed) return filtercheck;\n }\n if (kind === \"readclipboard\") {\n if (!isnonempty(options.consentref)) return { allowed: false, reason: \"A clipboard read requires a reviewed consent ref of an approved consent prompt in options.\" };\n if (options.prompt !== undefined && !isnonempty(options.prompt)) return { allowed: false, reason: \"The reviewed clipboard consent prompt must be a non-empty string.\" };\n }\n if (kind === \"exportnetlog\" && options.stepid !== undefined && !isnonempty(options.stepid)) return { allowed: false, reason: \"The reviewed netlog step filter must be a non-empty step id.\" };\n if (kind === \"namecaptures\") {\n if (!isnonempty(options.task)) return { allowed: false, reason: \"A reviewed task id is required in options for capture naming.\" };\n if (options.steps !== undefined && (!Array.isArray(options.steps) || options.steps.length === 0 || !options.steps.every(item => isnonempty(item)))) return { allowed: false, reason: \"The reviewed capture steps must be a non-empty list of step ids when present.\" };\n if (options.extension !== undefined && !isnonempty(options.extension)) return { allowed: false, reason: \"The reviewed capture extension must be a non-empty string.\" };\n }\n if (kind === \"cleanupartifacts\" && options.rules !== undefined) {\n const rules = options.rules;\n if (!Array.isArray(rules) || rules.length === 0) return { allowed: false, reason: \"The reviewed cleanup rules must be a non-empty list when present.\" };\n for (const item of rules) {\n const rulecheck = validatecleanuprule(item);\n if (!rulecheck.allowed) return rulecheck;\n }\n }\n return { allowed: true };\n}\n\n/** Requires an approved consent prompt before any clipboard read; every read consumes its own prompt. */\nexport function clipboardconsentgranted(step: toolstep): policyevaluation {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const consentref = options.consentref;\n if (typeof consentref !== \"string\" || !consentref.trim()) return { allowed: false, reason: \"A clipboard read requires a reviewed consent ref in options.\" };\n return { allowed: true };\n}\n\n/** Refuses to release any quarantined file before a clean scan verdict exists. */\nexport function quarantinereleasegranted(entry: quarantineentry): policyevaluation {\n if (entry.scan !== \"clean\") return { allowed: false, reason: `The quarantined file ${entry.path} cannot leave quarantine with the ${entry.scan} scan verdict; only a clean verdict releases it.` };\n return { allowed: true };\n}\n\n/** Refuses downloads and download interception that fall outside the session origin grants. */\nexport function downloadgranted(session: agentsession | undefined, url: string): policyevaluation {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { return { allowed: false, reason: \"The reviewed download URL is invalid.\" }; }\n if (!origingranted(session, origin)) return { allowed: false, reason: `The download from ${origin} leaves the session origin grants and needs a session grant first.` };\n return { allowed: true };\n}\n\n/** Masks a clipboard payload for every log line; the full text never persists anywhere. */\nexport function maskclipboard(payload: string): string {\n return `[clipboard payload of ${payload.length} character${payload.length === 1 ? \"\" : \"s\"}]`;\n}\n\n/** Requires an asksubmit review step before every form submission step. */\nexport function submitreviewgranted(steps: toolstep[], submitid: string): policyevaluation {\n const position = steps.findIndex(candidate => candidate.id === submitid);\n const asked = steps.some((candidate, index) => candidate.kind === \"asksubmit\" && (position === -1 || index < position));\n return asked ? { allowed: true } : { allowed: false, reason: \"Form submission requires an asksubmit review step before it.\" };\n}\n\n/** Requires a reviewed consent ref before any password field is filled. */\nexport function passwordconsentgranted(step: toolstep): policyevaluation {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const consentref = options.consentref;\n if (typeof consentref !== \"string\" || !consentref.trim()) return { allowed: false, reason: \"A password fill requires a reviewed consent ref in options.\" };\n return { allowed: true };\n}\n\n/** True when a numeric value passes the Luhn checksum used by card networks. */\nfunction luhnvalid(digits: string): boolean {\n let sum = 0;\n let double = false;\n for (let index = digits.length - 1; index >= 0; index -= 1) {\n let value = Number.parseInt(digits[index] ?? \"\", 10);\n if (!Number.isFinite(value)) return false;\n if (double) { value *= 2; if (value > 9) value -= 9; }\n sum += value;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\n/** Refuses generated values that look like real card numbers or personal identifiers; test prefixed card values stay allowed. */\nexport function generatedvalueallowed(value: string): policyevaluation {\n const compact = value.replace(/[\\s-]/g, \"\");\n if (/^\\d{13,19}$/.test(compact) && luhnvalid(compact) && !compact.startsWith(\"4111\")) return { allowed: false, reason: \"The generated value looks like a real card number and is refused; generated card values use the 4111 test prefix.\" };\n if (/^\\d{3}-\\d{2}-\\d{4}$/.test(value.trim())) return { allowed: false, reason: \"The generated value looks like a personal identifier and is refused.\" };\n return { allowed: true };\n}\n\n/** Requires the origin grants of a saved profile to cover the origin before its values fill a page. */\nexport function profilegrantgranted(profile: formprofile, origin: string): policyevaluation {\n if (!profile.grants.includes(origin)) return { allowed: false, reason: `The saved profile ${profile.name} is not granted to ${origin}; add the origin to the profile grants first.` };\n return { allowed: true };\n}\n\n/** Restricts group and layout mutations to the active session: they refuse without a live session. */\nexport function layoutmutationgranted(session: agentsession | undefined, now: number): policyevaluation {\n if (!session || session.stoppedat || session.expiresat <= now) return { allowed: false, reason: \"Group and layout mutations stay inside the active session.\" };\n return { allowed: true };\n}\n\n/** Requires explicit review before closing a window that holds more than one task tab. */\nexport function windowclosegate(tasktabcount: number, reviewed: boolean): policyevaluation {\n if (tasktabcount > 1 && !reviewed) return { allowed: false, reason: `The window holds ${tasktabcount} task tabs and needs explicit review before it closes.` };\n return { allowed: true };\n}\n\n/** Reads the user configured concurrent task tab ceiling; an absent value never refuses a tab. */\nexport function tasktabceiling(settings: runsettings | undefined): number | undefined {\n const ceiling = settings?.tasktabceiling;\n return typeof ceiling === \"number\" && Number.isFinite(ceiling) && ceiling >= 0 ? ceiling : 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/** Decides whether an unreviewed origin may open: the session grants cover it or a safe checksafe verdict vouches for it. */\nexport function originverified(url: string, grants: string[], verdicts: safetyverdict[]): policyevaluation {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { return { allowed: false, reason: \"The reviewed navigation URL is invalid.\" }; }\n if (grants.includes(origin)) return { allowed: true };\n const covered = verdicts.find(verdict => verdict.safe && (verdict.url === url || (safeorigin(verdict.url) === origin)));\n if (covered) return { allowed: true };\n return { allowed: false, reason: `The origin ${origin} is outside the session grants and has no safe checksafe verdict; run checksafe and review it first.` };\n}\n\nfunction safeorigin(url: string): string {\n try { return new URL(url).origin; } catch { return \"\"; }\n}\n\n/** Refuses navigation that would move a granted task tab outside the session origin grants until the user consents. */\nexport function navigationgranted(session: agentsession | undefined, url: string): policyevaluation {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { return { allowed: false, reason: \"The reviewed navigation URL is invalid.\" }; }\n if (origingranted(session, origin)) return { allowed: true };\n return { allowed: false, reason: `Navigation to ${origin} leaves the task tab origins and needs the user consent of a session grant first.` };\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\" || kind === \"looprows\") 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/** True when a reviewed https url parses. */\nfunction ishttpsurl(value: unknown): value is string {\n if (typeof value !== \"string\" || !value.trim()) return false;\n try { return new URL(value).protocol === \"https:\"; } catch { return false; }\n}\n\n/** Validates the reviewed navtarget grammar of a navigation step. */\nfunction validatenavtarget(value: unknown, kind: string): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed navtarget with a url is required in options.\" };\n const target = value as Record<string, unknown>;\n if (!ishttpsurl(target.url)) return { allowed: false, reason: \"The reviewed navtarget url must use HTTPS.\" };\n const container = target.container ?? \"tab\";\n if (container !== \"current\" && container !== \"tab\" && container !== \"window\" && container !== \"private\") return { allowed: false, reason: \"The reviewed navtarget container must be current, tab, window or private.\" };\n if (target.position !== undefined && target.position !== \"adjacent\" && target.position !== \"end\") return { allowed: false, reason: \"The reviewed navtarget position must be adjacent or end.\" };\n if (kind === \"openprivate\" && container !== \"private\") return { allowed: false, reason: \"The openprivate step requires the private container.\" };\n if (kind === \"openlink\" && container === \"private\") return { allowed: false, reason: \"The openlink step cannot open the private container; use openprivate.\" };\n return { allowed: true };\n}\n\n/** Validates the reviewed waitprofile grammar with its load signals, thresholds and per origin overrides. */\nfunction validatewaitprofile(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed waitprofile with load signals is required in options.\" };\n const profile = value as Record<string, unknown>;\n if (!Array.isArray(profile.signals) || profile.signals.length === 0 || !profile.signals.every(signal => isnonempty(signal))) return { allowed: false, reason: \"The reviewed waitprofile needs a non-empty list of load signals.\" };\n if (!nonnegativeoption(profile, \"idle\")) return { allowed: false, reason: \"The reviewed waitprofile idle threshold must be zero or a positive number of milliseconds.\" };\n if (!nonnegativeoption(profile, \"timeout\")) return { allowed: false, reason: \"The reviewed waitprofile timeout must be zero or a positive number of milliseconds.\" };\n if (profile.overrides !== undefined) {\n if (!Array.isArray(profile.overrides) || profile.overrides.length === 0) return { allowed: false, reason: \"The reviewed waitprofile overrides must be a non-empty list when present.\" };\n for (const entry of profile.overrides) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return { allowed: false, reason: \"Every reviewed waitprofile override must be an object with an origin.\" };\n const override = entry as Record<string, unknown>;\n if (!ishttpsurl(override.origin)) return { allowed: false, reason: \"Every reviewed waitprofile override origin must use HTTPS.\" };\n if (override.signals !== undefined && (!Array.isArray(override.signals) || !override.signals.every(signal => isnonempty(signal)))) return { allowed: false, reason: \"The reviewed waitprofile override signals must be a list of non-empty strings.\" };\n if (!nonnegativeoption(override, \"idle\") || !nonnegativeoption(override, \"timeout\")) return { allowed: false, reason: \"The reviewed waitprofile override thresholds must be zero or positive numbers.\" };\n }\n }\n return { allowed: true };\n}\n\n/** Validates the reviewed urlpattern grammar with its match mode plus query and fragment parts. */\nexport function validateurlpattern(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed urlpattern is required in options.\" };\n const pattern = value as Record<string, unknown>;\n if (pattern.mode !== \"exact\" && pattern.mode !== \"prefix\" && pattern.mode !== \"host\" && pattern.mode !== \"pattern\") return { allowed: false, reason: \"The reviewed urlpattern mode must be exact, prefix, host or pattern.\" };\n if (!ishttpsurl(pattern.url)) return { allowed: false, reason: \"The reviewed urlpattern url must use HTTPS.\" };\n if (pattern.query !== undefined) {\n if (!pattern.query || typeof pattern.query !== \"object\" || Array.isArray(pattern.query)) return { allowed: false, reason: \"The reviewed urlpattern query part must be an object of parameter names and values.\" };\n for (const item of Object.values(pattern.query)) if (typeof item !== \"string\") return { allowed: false, reason: \"The reviewed urlpattern query values must be strings.\" };\n }\n if (pattern.fragment !== undefined && !isnonempty(pattern.fragment)) return { allowed: false, reason: \"The reviewed urlpattern fragment must be a non-empty string.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed non-empty list of HTTPS urls in options. */\nfunction validateurllist(options: Record<string, unknown>, key: string): policyevaluation {\n const urls = options[key];\n if (!Array.isArray(urls) || urls.length === 0 || !urls.every(url => ishttpsurl(url))) return { allowed: false, reason: `A reviewed non-empty list of HTTPS urls is required in options as ${key}.` };\n return { allowed: true };\n}\n\n/** Validates the reviewed ratelimit grammar of a navrate step; the window and ceiling stay user configured with no hardcoded cap. */\nfunction validateratelimit(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed ratelimit with a window and a ceiling is required in options.\" };\n const limit = value as Record<string, unknown>;\n if (limit.domain !== undefined && !isnonempty(limit.domain)) return { allowed: false, reason: \"The reviewed ratelimit domain must be a non-empty string.\" };\n if (typeof limit.window !== \"number\" || !Number.isFinite(limit.window) || limit.window <= 0) return { allowed: false, reason: \"The reviewed ratelimit window must be a positive number of milliseconds with no code ceiling.\" };\n if (typeof limit.ceiling !== \"number\" || !Number.isInteger(limit.ceiling) || limit.ceiling < 1) return { allowed: false, reason: \"The reviewed ratelimit ceiling must be a positive integer with no code ceiling.\" };\n return { allowed: true };\n}\n\n/** Validates the reviewed tabquery grammar with url, title, id and pattern matchers; at least one matcher is required. */\nexport function validatetabquery(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed tabquery with at least one matcher is required in options.\" };\n const query = value as Record<string, unknown>;\n const hasmatcher = query.url !== undefined || query.title !== undefined || query.id !== undefined || query.pattern !== undefined;\n if (!hasmatcher) return { allowed: false, reason: \"The reviewed tabquery needs a url, title, id or pattern matcher.\" };\n if (query.url !== undefined && !isnonempty(query.url)) return { allowed: false, reason: \"The reviewed tabquery url matcher must be a non-empty string.\" };\n if (query.title !== undefined && !isnonempty(query.title)) return { allowed: false, reason: \"The reviewed tabquery title matcher must be a non-empty string.\" };\n if (query.pattern !== undefined && !isnonempty(query.pattern)) return { allowed: false, reason: \"The reviewed tabquery pattern matcher must be a non-empty string.\" };\n if (query.id !== undefined && (typeof query.id !== \"number\" || !Number.isInteger(query.id) || query.id < 0)) return { allowed: false, reason: \"The reviewed tabquery id matcher must be a non-negative integer tab id.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed group color choice against the Chromium tab group palette. */\nfunction validategroupcolor(value: unknown): boolean {\n return typeof value === \"string\" && (groupcolors as string[]).includes(value);\n}\n\n/** Validates a reviewed list of numeric browser ids in options. */\nfunction validateidlist(options: Record<string, unknown>, key: string): boolean {\n const ids = options[key];\n return Array.isArray(ids) && ids.length > 0 && ids.every(id => typeof id === \"number\" && Number.isInteger(id) && id >= 0);\n}\n\n/** Validates the reviewed tab and window parameter grammar of the tabs and windows command family. */\nfunction validatetabsgrammar(step: toolstep, options: Record<string, unknown>): policyevaluation {\n const kind = step.kind;\n if (kind === \"querytabs\" || kind === \"closepattern\") {\n const querycheck = validatetabquery(options.tabquery);\n if (!querycheck.allowed) return querycheck;\n if (kind === \"closepattern\" && options.reviewed !== true) return { allowed: false, reason: \"The close pattern needs the explicit reviewed flag before any tab closes.\" };\n }\n if (kind === \"duplicatetab\" || kind === \"pintab\" || kind === \"mutetab\" || kind === \"movetab\" || kind === \"movetabwindow\" || kind === \"badgetab\" || kind === \"attachmeta\") {\n if (!isnumericid(step.value)) return { allowed: false, reason: \"A numeric browser tab id is required.\" };\n }\n if (kind === \"focuswindow\" || kind === \"maximizewindow\" || kind === \"minimizewindow\" || kind === \"restorewindow\") {\n if (!isnumericid(step.value)) return { allowed: false, reason: \"A numeric browser window id is required.\" };\n }\n if (kind === \"pintab\" && typeof options.pinned !== \"boolean\") return { allowed: false, reason: \"A reviewed pinned flag is required in options.\" };\n if (kind === \"mutetab\" && typeof options.muted !== \"boolean\") return { allowed: false, reason: \"A reviewed muted flag is required in options.\" };\n if (kind === \"movetab\") {\n if (typeof options.index !== \"number\" || !Number.isInteger(options.index) || options.index < 0) return { allowed: false, reason: \"A reviewed non-negative target index is required in options.\" };\n }\n if (kind === \"movetabwindow\") {\n if (typeof options.windowid !== \"number\" || !Number.isInteger(options.windowid) || options.windowid < 0) return { allowed: false, reason: \"A reviewed target window id is required in options.\" };\n }\n if (kind === \"grouptabs\") {\n const group = options.group;\n if (!group || typeof group !== \"object\" || Array.isArray(group)) return { allowed: false, reason: \"A reviewed group with a name is required in options.\" };\n const spec = group as Record<string, unknown>;\n if (!isnonempty(spec.name)) return { allowed: false, reason: \"The reviewed group needs a non-empty name.\" };\n if (!validategroupcolor(spec.color)) return { allowed: false, reason: \"The reviewed group color must be a Chromium tab group color.\" };\n if (!validateidlist(spec, \"tabids\")) return { allowed: false, reason: \"The reviewed group needs a non-empty list of member tab ids.\" };\n }\n if (kind === \"colorgroup\") {\n if (!isnonempty(options.name)) return { allowed: false, reason: \"A reviewed group name is required in options.\" };\n if (!validategroupcolor(options.color)) return { allowed: false, reason: \"The reviewed group color must be a Chromium tab group color.\" };\n }\n if (kind === \"collapsegroup\") {\n if (!isnonempty(options.name)) return { allowed: false, reason: \"A reviewed group name is required in options.\" };\n if (typeof options.collapsed !== \"boolean\") return { allowed: false, reason: \"A reviewed collapsed flag is required in options.\" };\n }\n if (kind === \"discardtab\" || kind === \"reloadtabs\") {\n if (!isnumericid(step.value) && !validateidlist(options, \"tabs\")) return { allowed: false, reason: \"A numeric tab id or a reviewed list of tab ids is required.\" };\n }\n if (kind === \"zoomin\" || kind === \"zoomout\") {\n if (options.step !== undefined && (typeof options.step !== \"number\" || !Number.isFinite(options.step) || options.step <= 0)) return { allowed: false, reason: \"The reviewed zoom step must be a positive number with no code ceiling.\" };\n if (step.value !== undefined && step.value !== \"\" && !isnumericid(step.value)) return { allowed: false, reason: \"The reviewed zoom target must be a numeric tab id.\" };\n }\n if (kind === \"switchtab\") {\n if (options.direction !== \"next\" && options.direction !== \"previous\") return { allowed: false, reason: \"A reviewed switch direction of next or previous is required in options.\" };\n }\n if (kind === \"restorewindow\") {\n const bounds = options.bounds;\n if (bounds !== undefined) {\n if (!bounds || typeof bounds !== \"object\" || Array.isArray(bounds)) return { allowed: false, reason: \"The reviewed window bounds must be an object.\" };\n const shape = bounds as Record<string, unknown>;\n for (const field of [\"left\", \"top\", \"width\", \"height\"]) {\n if (typeof shape[field] !== \"number\" || !Number.isFinite(shape[field])) return { allowed: false, reason: \"The reviewed window bounds need numeric left, top, width and height.\" };\n }\n }\n }\n if (kind === \"scratchwindow\") {\n if (step.value !== undefined && step.value !== \"\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"The reviewed scratch window url must use HTTPS.\" };\n }\n if (kind === \"incognitowindow\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"A reviewed HTTPS url is required to open an incognito window.\" };\n if (kind === \"restoretab\" && step.value !== undefined && step.value !== \"\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"The reviewed restore url must use HTTPS.\" };\n if (kind === \"savelayout\" || kind === \"restorelayout\") {\n if (!isnonempty(options.name)) return { allowed: false, reason: \"A reviewed layout name is required in options.\" };\n }\n if (kind === \"badgetab\") {\n if (!isnonempty(options.label)) return { allowed: false, reason: \"A reviewed badge label is required in options.\" };\n if (options.taskid !== undefined && !isnonempty(options.taskid)) return { allowed: false, reason: \"The reviewed badge task id must be a non-empty string.\" };\n }\n if (kind === \"attachmeta\") {\n const labels = options.labels;\n const taskrefs = options.taskrefs;\n const haslabels = Array.isArray(labels) && labels.length > 0 && labels.every(label => isnonempty(label));\n const hastaskrefs = Array.isArray(taskrefs) && taskrefs.length > 0 && taskrefs.every(ref => isnonempty(ref));\n if (!haslabels && !hastaskrefs) return { allowed: false, reason: \"Reviewed labels or task refs are required in options to attach metadata.\" };\n if (options.provenance !== undefined && !isnonempty(options.provenance)) return { allowed: false, reason: \"The reviewed provenance must be a non-empty string.\" };\n }\n if (kind === \"reopenrun\" && !isnonempty(options.run)) return { allowed: false, reason: \"A reviewed run id is required in options to reopen its tabs.\" };\n return { allowed: true };\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 if (step.kind === \"openlink\" || step.kind === \"openprivate\" || step.kind === \"deeplink\") {\n const targetcheck = validatenavtarget(options.navtarget, step.kind);\n if (!targetcheck.allowed) return targetcheck;\n if (step.kind === \"deeplink\") {\n const app = options.app;\n if (!isnonempty(app)) return { allowed: false, reason: \"A reviewed deep link app pattern is required in options.\" };\n const params = options.params;\n if (params !== undefined && (!params || typeof params !== \"object\" || Array.isArray(params) || !Object.values(params).every(item => typeof item === \"string\"))) return { allowed: false, reason: \"The reviewed deep link params must be an object of string values.\" };\n }\n }\n if (step.kind === \"waitload\" && !nonnegativeoption(options, \"timeout\")) return { allowed: false, reason: \"The waitload timeout must be zero or a positive number of milliseconds.\" };\n if (step.kind === \"waiturl\" || step.kind === \"spawait\") {\n if (step.kind === \"waiturl\") {\n const patterncheck = validateurlpattern(options.urlpattern);\n if (!patterncheck.allowed) return patterncheck;\n }\n if (!nonnegativeoption(options, \"timeout\")) return { allowed: false, reason: \"The wait timeout must be zero or a positive number of milliseconds.\" };\n if (!nonnegativeoption(options, \"poll\")) return { allowed: false, reason: \"The wait poll interval must be zero or a positive number of milliseconds.\" };\n }\n if (step.kind === \"followlink\") {\n if (options.fragment !== undefined && typeof options.fragment !== \"boolean\") return { allowed: false, reason: \"The reviewed followlink fragment flag must be a boolean.\" };\n }\n if (step.kind === \"spanav\") {\n if (options.routepattern !== undefined) {\n const routecheck = validateurlpattern(options.routepattern);\n if (!routecheck.allowed) return routecheck;\n }\n if (!nonnegativeoption(options, \"timeout\")) return { allowed: false, reason: \"The spanav route timeout must be zero or a positive number of milliseconds.\" };\n }\n if (step.kind === \"rewritequery\") {\n const set = options.set;\n const remove = options.remove;\n if (set === undefined && remove === undefined) return { allowed: false, reason: \"Reviewed query parameters to set or remove are required in options.\" };\n if (set !== undefined && (!set || typeof set !== \"object\" || Array.isArray(set) || !Object.values(set).every(item => typeof item === \"string\"))) return { allowed: false, reason: \"The reviewed query parameters to set must be an object of string values.\" };\n if (remove !== undefined && (!Array.isArray(remove) || !remove.every(item => isnonempty(item)))) return { allowed: false, reason: \"The reviewed query parameters to remove must be a list of non-empty names.\" };\n }\n if (step.kind === \"navlist\") {\n const listcheck = validateurllist(options, \"urls\");\n if (!listcheck.allowed) return listcheck;\n }\n if (step.kind === \"navprofile\") {\n const profilecheck = validatewaitprofile(options.waitprofile);\n if (!profilecheck.allowed) return profilecheck;\n }\n if (step.kind === \"handleauth\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"A reviewed HTTPS origin or url is required as the auth target.\" };\n if (step.kind === \"printpdf\" && options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed artifact name must be a non-empty string.\" };\n if (step.kind === \"prefetch\") {\n const listcheck = validateurllist(options, \"urls\");\n if (!listcheck.allowed) return listcheck;\n }\n if (step.kind === \"preconnect\") {\n const origins = options.origins;\n if (!Array.isArray(origins) || origins.length === 0 || !origins.every(originurl => ishttpsurl(originurl))) return { allowed: false, reason: \"A reviewed non-empty list of HTTPS origins is required in options.\" };\n }\n if (step.kind === \"reopentab\" && step.value !== undefined && !ishttpsurl(step.value)) return { allowed: false, reason: \"The reviewed reopen url must use HTTPS.\" };\n if (step.kind === \"navrate\") {\n const limitcheck = validateratelimit(options.ratelimit);\n if (!limitcheck.allowed) return limitcheck;\n }\n if (step.kind === \"checksafe\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"A reviewed HTTPS url is required for the safety check.\" };\n if (step.kind === \"batchopen\") {\n const listcheck = validateurllist(options, \"urls\");\n if (!listcheck.allowed) return listcheck;\n }\n if (istabscommandkind(step.kind)) {\n const tabscheck = validatetabsgrammar(step, options);\n if (!tabscheck.allowed) return tabscheck;\n }\n if (isformkind(step.kind)) {\n const formcheck = validateformgrammar(step, options);\n if (!formcheck.allowed) return formcheck;\n }\n if (isdatasetkind(step.kind)) {\n const datacheck = validatedatagrammar(step, options, origin);\n if (!datacheck.allowed) return datacheck;\n }\n if (isfileskind(step.kind)) {\n const filescheck = validatefilesgrammar(step, options);\n if (!filescheck.allowed) return filescheck;\n }\n if (step.kind === \"tabcreate\") {\n if (options.background !== undefined && typeof options.background !== \"boolean\") return { allowed: false, reason: \"The reviewed background flag must be a boolean.\" };\n if (options.window !== undefined && (typeof options.window !== \"number\" || !Number.isInteger(options.window) || options.window < 0)) return { allowed: false, reason: \"The reviewed target window id must be a non-negative integer.\" };\n }\n if (step.kind === \"windowcreate\") {\n for (const field of [\"left\", \"top\", \"width\", \"height\"]) {\n if (options[field] !== undefined && (typeof options[field] !== \"number\" || !Number.isFinite(options[field]))) return { allowed: false, reason: `The reviewed window ${field} must be a number.` };\n }\n if (options.state !== undefined && ![\"normal\", \"maximized\", \"minimized\", \"fullscreen\"].includes(options.state as string)) return { allowed: false, reason: \"The reviewed window state must be normal, maximized, minimized or fullscreen.\" };\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; verdicts?: safetyverdict[] }): 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 if (isexportkind(input.step.kind)) {\n const exportgate = exportgranted(input.session, input.origin);\n if (!exportgate.allowed) return exportgate;\n }\n if (input.step.kind === \"navlist\") {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(input.step); } catch { options = {}; }\n for (const url of Array.isArray(options.urls) ? options.urls : []) {\n if (typeof url !== \"string\") continue;\n const navigation = navigationgranted(input.session, url);\n if (!navigation.allowed) return navigation;\n }\n }\n if (islayoutkind(input.step.kind) && !layoutmutationgranted(input.session, now).allowed) return { allowed: false, reason: \"Group and layout mutations stay inside the active session.\" };\n if (input.step.kind === \"submitform\" || input.step.kind === \"retryform\") {\n if (!input.plan) return { allowed: false, reason: \"Form submission requires an asksubmit review step before it.\" };\n const reviewgate = submitreviewgranted(input.plan.steps, input.step.id);\n if (!reviewgate.allowed) return reviewgate;\n }\n if (input.step.kind === \"consentpassword\") {\n const consentgate = passwordconsentgranted(input.step);\n if (!consentgate.allowed) return consentgate;\n }\n if (input.step.kind === \"readclipboard\") {\n const clipgate = clipboardconsentgranted(input.step);\n if (!clipgate.allowed) return clipgate;\n }\n if (input.step.kind === \"interceptmime\" && !origingranted(input.session, input.origin)) return { allowed: false, reason: \"The download interception is outside the session origin grants.\" };\n if (input.step.kind === \"openlink\" || input.step.kind === \"openprivate\" || input.step.kind === \"batchopen\" || input.step.kind === \"prefetch\" || input.step.kind === \"deeplink\" || input.step.kind === \"reopentab\") {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(input.step); } catch { options = {}; }\n const grammar = validatestep(input.step, input.origin);\n if (!grammar.allowed) return grammar;\n const grants = input.session?.grants ?? [input.session?.origin ?? input.origin];\n const targets: unknown[] = input.step.kind === \"batchopen\" || input.step.kind === \"prefetch\" ? (Array.isArray(options.urls) ? options.urls : []) : input.step.kind === \"reopentab\" ? [input.step.value] : [(options.navtarget as Record<string, unknown> | undefined)?.url];\n for (const target of targets) {\n if (typeof target !== \"string\" || !target) continue;\n const verified = originverified(target, grants, input.verdicts ?? []);\n if (!verified.allowed) return verified;\n }\n }\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, wizardstate } 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\n/** One navlist entry completion record with its index, url and outcome. */\nexport interface naventry {\n index: number;\n url: string;\n ok: boolean;\n}\n\n/** Records one navlist entry as it completes, beside the step outcome log, so the trail shows current url and remaining count. */\nexport function recordnaventry(progress: planprogress | undefined, planid: string, stepid: string, entry: naventry, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const outcome: stepoutcome = { stepid, ok: entry.ok, summary: `Navigation list entry ${entry.index + 1} of ${entry.url} ${entry.ok ? \"completed\" : \"failed\"}.`, details: { naventry: entry }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns every recorded navlist entry completion of one step, oldest first. */\nexport function naventries(progress: planprogress | undefined, planid: string, stepid: string): naventry[] {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.naventry !== undefined).map(outcome => outcome.details?.naventry as naventry);\n}\n\n/** Assigns one tab to the running task so progress tracks work across its tabs. */\nexport function assigntasktab(progress: planprogress | undefined, planid: string, tabid: number, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n if ((base.tasktabs ?? []).includes(tabid)) return { ...base, updatedat: now };\n return { ...base, tasktabs: [...(base.tasktabs ?? []), tabid], updatedat: now };\n}\n\n/** Releases one task tab when its work inside the running task ends. */\nexport function releasetasktab(progress: planprogress | undefined, planid: string, tabid: number, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const remaining = (base.tasktabs ?? []).filter(id => id !== tabid);\n const { tasktabs: released, ...rest } = base;\n void released;\n return { ...rest, ...(remaining.length > 0 ? { tasktabs: remaining } : {}), updatedat: now };\n}\n\n/** Returns the tabs assigned to the running task, in assignment order. */\nexport function tasktabs(progress: planprogress | undefined, planid: string): number[] {\n if (!progress || progress.planid !== planid) return [];\n return progress.tasktabs ?? [];\n}\n\n/** Returns the wizard completion share as executed steps over the total steps. */\nexport function wizardcompletion(state: wizardstate): number {\n if (state.steps <= 0) return 0;\n return Math.min(1, state.completed.filter(Boolean).length / state.steps);\n}\n\n/** Returns the extraction progress share as rows collected over the user estimated total; an absent estimate stays at zero. */\nexport function extractionshare(rowscollected: number, estimatedtotal: number): number {\n if (!Number.isFinite(estimatedtotal) || estimatedtotal <= 0) return 0;\n return Math.min(1, Math.max(0, rowscollected) / estimatedtotal);\n}\n\n/** One extraction page completion record with its page number, row count and cursor. */\nexport interface extractionentry {\n page: number;\n rows: number;\n cursor: number;\n}\n\n/** Records one extracted page in the plan progress outcome log with its page count, row count and resume cursor. */\nexport function recordextraction(progress: planprogress | undefined, planid: string, stepid: string, entry: extractionentry, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const outcome: stepoutcome = { stepid, ok: true, summary: `Extraction page ${entry.page} collected ${entry.rows} row${entry.rows === 1 ? \"\" : \"s\"} at cursor ${entry.cursor}.`, details: { extraction: entry }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns every recorded extraction page completion of one step, oldest first. */\nexport function extractionentries(progress: planprogress | undefined, planid: string, stepid: string): extractionentry[] {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.extraction !== undefined).map(outcome => outcome.details?.extraction as extractionentry);\n}\n\n/** Records one wizard step completion into the plan progress outcome log, beside the step log, with the step index and total steps. */\nexport function recordwizardstep(progress: planprogress | undefined, planid: string, stepid: string, state: wizardstate, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const executed = Math.min(state.index, state.steps);\n const done = executed >= state.steps;\n const outcome: stepoutcome = { stepid, ok: done, summary: `Wizard step ${executed} of ${state.steps} ${done ? \"completed the wizard\" : \"executed\"}.`, details: { wizard: { index: state.index, steps: state.steps, completed: [...state.completed] } }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns the batch download progress share as files completed over the total files of the batch. */\nexport function downloadshare(completed: number, total: number): number {\n if (!Number.isFinite(total) || total <= 0) return 0;\n return Math.min(1, Math.max(0, completed) / total);\n}\n\n/** One batch download file completion record with its index, url and resulting state. */\nexport interface downloadentry {\n index: number;\n url: string;\n state: string;\n}\n\n/** Records one batch download file completion in the plan progress outcome log so the queue shows live per file states. */\nexport function recorddownload(progress: planprogress | undefined, planid: string, stepid: string, entry: downloadentry, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const outcome: stepoutcome = { stepid, ok: entry.state === \"complete\", summary: `Download ${entry.index + 1} of ${entry.url} ended in the ${entry.state} state.`, details: { download: entry }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns every recorded batch download file completion of one step, oldest first. */\nexport function downloadentries(progress: planprogress | undefined, planid: string, stepid: string): downloadentry[] {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.download !== undefined).map(outcome => outcome.details?.download as downloadentry);\n}\n", "/** Canonical package version synchronized from package.json. */\nexport const packageversion = \"1.1.39\" 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 | \"openlink\" | \"openprivate\" | \"reloadcache\" | \"stopnav\" | \"waitload\" | \"waiturl\"\n | \"followlink\" | \"spanav\" | \"spawait\" | \"rewritequery\" | \"setfragment\" | \"navlist\"\n | \"navprofile\" | \"detecthttp\" | \"readredirects\" | \"readfinalurl\" | \"handleauth\" | \"printpdf\"\n | \"prefetch\" | \"preconnect\" | \"deeplink\" | \"reopentab\" | \"trailaudit\" | \"pausenav\"\n | \"navintent\" | \"navrate\" | \"openclipboard\" | \"checksafe\" | \"batchopen\"\n | \"querytabs\" | \"duplicatetab\" | \"closepattern\" | \"pintab\" | \"mutetab\" | \"movetab\"\n | \"movetabwindow\" | \"grouptabs\" | \"colorgroup\" | \"collapsegroup\" | \"discardtab\"\n | \"reloadtabs\" | \"zoomin\" | \"zoomout\" | \"watchtab\" | \"switchtab\" | \"maximizewindow\"\n | \"minimizewindow\" | \"restorewindow\" | \"focuswindow\" | \"scratchwindow\" | \"incognitowindow\"\n | \"restoretab\" | \"savelayout\" | \"restorelayout\" | \"findclones\" | \"searchtabs\"\n | \"badgetab\" | \"attachmeta\" | \"listaudio\" | \"reopenrun\" | \"snapshotsession\"\n | \"fillform\" | \"filllabel\" | \"fillplaceholder\" | \"detectfields\" | \"generatevalues\"\n | \"saveprofiles\" | \"asksubmit\" | \"submitform\" | \"readerrors\" | \"retryform\"\n | \"runwizard\" | \"selectchain\" | \"picktypeahead\" | \"pickdate\" | \"attachfile\"\n | \"handoffcaptcha\" | \"fillcard\" | \"fillcode\" | \"consentpassword\" | \"skiphoneypot\"\n | \"detectlogin\" | \"detecttemplate\"\n | \"scrapetable\" | \"exportcsv\" | \"exportjson\" | \"exportexcel\" | \"copytable\"\n | \"pushsheets\" | \"importcsv\" | \"looprows\" | \"transformvalues\" | \"deduperows\"\n | \"paginateextract\" | \"mergepages\" | \"stamplerows\" | \"previewgrid\"\n | \"streamdisk\" | \"resumeextract\" | \"logprovenance\"\n | \"batchdownload\" | \"pausedownload\" | \"resumedownload\" | \"verifydownload\" | \"interceptmime\"\n | \"exportnetlog\" | \"readclipboard\" | \"writeclipboard\" | \"copyscreen\" | \"quarantinedownload\"\n | \"scanvirus\" | \"namecaptures\" | \"cleanupartifacts\";\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\" | \"navigation\" | \"redirect\" | \"auth\" | \"prefetch\" | \"rate\" | \"group\" | \"layout\" | \"discard\" | \"badge\" | \"fill\" | \"submit\" | \"consent\" | \"handoff\" | \"scrape\" | \"export\" | \"stream\" | \"provenance\" | \"resume\" | \"intercept\" | \"clipboard\" | \"quarantine\" | \"cleanup\";\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 /** User configured ceiling on concurrent task tabs; an absent value never refuses a tab. */\n tasktabceiling?: number;\n /** Retention window for exported data artifacts; an absent value keeps every artifact. */\n artifactretention?: number;\n /** Retention window for captured network log records; an absent value keeps every record. */\n netlogretention?: number;\n /** True when the pinned control tab with the live task feed stays open. */\n controltab?: boolean;\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 /** Tabs assigned to the running task so progress tracks work across its tabs. */\n tasktabs?: number[];\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\n/** Reviewed navigation target with its url, container, position and private flag. */\nexport interface navtarget {\n url: string;\n container: \"current\" | \"tab\" | \"window\" | \"private\";\n position?: \"adjacent\" | \"end\";\n private: boolean;\n}\n\n/** Reviewed per origin override of one wait profile. */\nexport interface waitoverride {\n origin: string;\n signals?: string[];\n idle?: number;\n timeout?: number;\n}\n\n/** Reviewed wait profile with load signals, thresholds and per origin overrides. */\nexport interface waitprofile {\n signals: string[];\n idle?: number;\n timeout?: number;\n overrides?: waitoverride[];\n}\n\n/** Reviewed url pattern with a match mode plus required query and fragment parts. */\nexport interface urlpattern {\n mode: \"exact\" | \"prefix\" | \"host\" | \"pattern\";\n url: string;\n query?: Record<string, string>;\n fragment?: string;\n}\n\n/** One redirect hop of a redirect chain with its url, status and timestamp. */\nexport interface redirecthop {\n url: string;\n status: number;\n at: number;\n}\n\n/** One observed redirect chain with hops, statuses and timing. */\nexport interface redirectchain {\n hops: redirecthop[];\n startedat: number;\n endedat: number;\n}\n\n/** One navigation trail entry with url, title, step ref and timestamp. */\nexport interface trailentry {\n url: string;\n title: string;\n stepid?: string;\n at: number;\n}\n\n/** Reviewed per domain navigation rate limit with a window and a user configured ceiling. */\nexport interface ratelimit {\n domain: string;\n window: number;\n ceiling: number;\n}\n\n/** Live navigation state of a tab: load phase, final url and redirect chain. */\nexport interface navstate {\n phase: \"idle\" | \"loading\" | \"interactive\" | \"complete\";\n finalurl?: string;\n redirects?: redirectchain;\n}\n\n/** One stored wait profile applied per origin with user configured values. */\nexport interface waitprofilerecord {\n origin: string;\n profile: waitprofile;\n at: number;\n}\n\n/** One stored navigation record with the redirect chain and final url of one navigation step. */\nexport interface navrecord {\n stepid: string;\n sessionid?: string;\n origin: string;\n finalurl: string;\n chain: redirectchain;\n at: number;\n}\n\n/** One recorded navigation intent detected from a plan, kept for audit review. */\nexport interface navintentrecord {\n id: string;\n intent: string;\n origin: string;\n sessionid?: string;\n stepid?: string;\n at: number;\n}\n\n/** One rate limit window state per domain with the reviewed limit and the hit count. */\nexport interface ratelimitstate {\n domain: string;\n limit: ratelimit;\n openedat: number;\n count: number;\n}\n\n/** One curated link of a batch open list with its safety verdict and review state. */\nexport interface curatedlink {\n url: string;\n verdict: \"safe\" | \"unsafe\" | \"unknown\";\n reasons: string[];\n}\n\n/** One curated link list stored with its review state before batch opening. */\nexport interface curatedlist {\n id: string;\n links: curatedlink[];\n reviewedat?: number;\n at: number;\n}\n\n/** Reviewed basic auth credentials for one origin, stored only after explicit review. */\nexport interface authrecord {\n origin: string;\n username: string;\n password: string;\n reviewedat: number;\n}\n\n/** One url safety verdict produced by a checksafe verification. */\nexport interface safetyverdict {\n url: string;\n safe: boolean;\n reasons: string[];\n at: number;\n}\n\n/** One task artifact routed into the artifact store by a printpdf step. */\nexport interface artifactrecord {\n id: string;\n kind: string;\n name: string;\n stepid: string;\n at: number;\n}\n\n/** Navigation control state: paused navigation while a consent prompt is open. */\nexport interface navcontrol {\n pausedat?: number;\n reason?: string;\n updatedat: number;\n}\n\n/** One recently closed tab remembered so a reopentab step can restore it. */\nexport interface recenttab {\n url: string;\n tabid: number;\n closedat: number;\n}\n\n/** Queued navigation targets of prefetch and batch open steps, shown in the popup badge. */\nexport interface navqueues {\n prefetch: number;\n batchopen: number;\n updatedat: number;\n}\n\n/** Reviewed tab query with url, title, id and pattern matchers resolved against the live tab set. */\nexport interface tabquery {\n url?: string;\n title?: string;\n id?: number;\n pattern?: string;\n}\n\n/** Reviewed tab group definition with name, color, member tabs and collapse state. */\nexport interface tabgroupspec {\n name: string;\n color: string;\n tabids: number[];\n collapsed: boolean;\n}\n\n/** One stored tab group definition with its color choice and member tabs. */\nexport interface tabgrouprecord {\n groupid: string;\n name: string;\n color: string;\n tabids: number[];\n collapsed: boolean;\n savedat: number;\n}\n\n/** Window bounds of one window state or saved layout. */\nexport interface windowbounds {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/** Live or saved window state with bounds, maximize state and profile kind. */\nexport interface windowstate {\n bounds: windowbounds;\n maximized: boolean;\n profile: \"normal\" | \"incognito\" | \"scratch\";\n}\n\n/** One tab position inside a saved layout, carrying its window and pin state. */\nexport interface layouttab {\n url: string;\n title: string;\n pinned: boolean;\n index: number;\n windowid: number;\n}\n\n/** One saved tab layout with name, tabs, groups, positions and window bounds. */\nexport interface tablayout {\n name: string;\n tabs: layouttab[];\n groups: tabgroupspec[];\n windows: Array<{ windowid: number; state: windowstate }>;\n savedat: number;\n}\n\n/** Per tab task metadata with task refs, provenance and free text labels. */\nexport interface tabmeta {\n tabid: number;\n taskrefs: string[];\n provenance: string;\n labels: string[];\n at: number;\n}\n\n/** One per tab task status badge set by a badgetab step or refreshed from live progress. */\nexport interface tabbadge {\n tabid: number;\n taskid: string;\n label: string;\n setat: number;\n}\n\n/** One tab report entry carrying audio state and metadata per tab. */\nexport interface tabreportentry {\n tabid: number;\n url: string;\n title: string;\n index: number;\n windowid: number;\n active: boolean;\n pinned: boolean;\n audible: boolean;\n muted: boolean;\n discarded: boolean;\n meta?: tabmeta;\n}\n\n/** Tab report payload with matched tabs, groups and badges. */\nexport interface tabreport {\n matches: tabreportentry[];\n groups: tabgroupspec[];\n badges: tabbadge[];\n}\n\n/** One session snapshot of tabs and windows captured for later restore. */\nexport interface sessionsnapshot {\n id: string;\n sessionid?: string;\n layout: tablayout;\n capturedat: number;\n}\n\n/** One closed tab history entry kept for restoretab and reopenrun. */\nexport interface closedtab {\n url: string;\n title: string;\n tabid: number;\n windowid: number;\n closedat: number;\n}\n\n/** One tab event observed inside a reviewed watchtab registration. */\nexport interface tabwatchevent {\n watchid: string;\n event: \"title\" | \"activated\" | \"closed\";\n tabid: number;\n detail?: string;\n at: number;\n}\n\n/** Pinned control tab state carrying the live task feed. */\nexport interface controltabstate {\n tabid: number;\n enabled: boolean;\n updatedat: number;\n}\n\n/** Field kinds the form family recognizes across inputs, selects, checks and specialized payment fields. */\nexport type fieldkind = \"text\" | \"email\" | \"phone\" | \"date\" | \"number\" | \"select\" | \"check\" | \"radio\" | \"file\" | \"password\" | \"card\" | \"code\";\n\n/** Reviewed field match addressing one control by label, placeholder, aria label or name. */\nexport interface fieldmatch {\n mode: \"label\" | \"placeholder\" | \"arialabel\" | \"name\";\n label?: string;\n placeholder?: string;\n arialabel?: string;\n name?: string;\n}\n\n/** One reviewed form field entry pairing a field match with its kind and value. */\nexport interface formentry {\n match: fieldmatch;\n kind: fieldkind;\n value: string;\n}\n\n/** A reviewed structured form record with field entries, kinds and values. */\nexport interface formrecord {\n form?: string;\n entries: formentry[];\n}\n\n/** Reviewed value generation rules for one field kind with locale and seed choices. */\nexport interface valuegen {\n kind: fieldkind;\n locale?: string;\n seed?: number;\n}\n\n/** One saved form profile with a reviewed name, field entries and the origin grants it is bound to. */\nexport interface formprofile {\n name: string;\n fields: formentry[];\n grants: string[];\n savedat: number;\n}\n\n/** Live wizard state with the step index, the total steps and the per step completion flags. */\nexport interface wizardstate {\n index: number;\n steps: number;\n completed: boolean[];\n at: number;\n}\n\n/** One submission ticket with the form ref, the values hash and the consent ref of its asksubmit approval. */\nexport interface submitticket {\n id: string;\n form: string;\n valueshash: string;\n consentref: string;\n approved?: boolean;\n at: number;\n}\n\n/** One validation error message associated with a field ref. */\nexport interface fielderror {\n field: string;\n message: string;\n}\n\n/** One collected error report of a form, kept for correction loops. */\nexport interface errorreport {\n form: string;\n errors: fielderror[];\n at: number;\n}\n\n/** One captcha handoff record with its resolution state while the plan waits for the user. */\nexport interface captchahandoff {\n id: string;\n origin: string;\n resolved: boolean;\n openedat: number;\n resolvedat?: number;\n}\n\n/** One login or template detection stored per origin with the matched markers. */\nexport interface detectionrecord {\n origin: string;\n kind: \"login\" | \"signup\" | \"checkout\";\n markers: string[];\n at: number;\n}\n\n/** One typeahead pick recorded when a reviewed suggestion entry was chosen. */\nexport interface typeaheadpick {\n field: string;\n query: string;\n pick: string;\n at: number;\n}\n\n/** Form report payload with the detected fields, their kinds and the matched controls. */\nexport interface formreport {\n form: string;\n fields: Array<{ selector: string; label: string; kind: fieldkind; matched: boolean }>;\n}\n\n/** One scraped or imported dataset column with a stable key, its label, its value kind and the normalized name. */\nexport interface columnspec {\n key: string;\n label: string;\n kind: \"text\" | \"number\";\n normalized: string;\n}\n\n/** One dataset row keyed by column keys. */\nexport type datasetrow = Record<string, string>;\n\n/** One source reference attaching a row index to its url, timestamp and step ref. */\nexport interface sourceref {\n row: number;\n url: string;\n at: number;\n stepid?: string;\n}\n\n/** One structured dataset with column specs, rows and source refs; row counts stay user configured with no code ceiling. */\nexport interface dataset {\n id: string;\n name: string;\n columns: columnspec[];\n rows: datasetrow[];\n sources: sourceref[];\n at: number;\n}\n\n/** One reviewed transform rule applying an expression to source columns and writing the target column. */\nexport interface transformrule {\n expression: string;\n sources: string[];\n target: string;\n}\n\n/** One extraction session tracking visited pages, collected rows and the resume cursor. */\nexport interface extractsession {\n id: string;\n datasetid: string;\n name: string;\n target: string;\n next: string;\n planned: number;\n pages: string[];\n rows: number;\n cursor: number;\n done?: boolean;\n startedat: number;\n updatedat: number;\n}\n\n/** One provenance record of an exported artifact with its url, timestamp, step ref, row range and checksum. */\nexport interface provenancerecord {\n artifact: string;\n name: string;\n url: string;\n stepid: string;\n rowstart: number;\n rowend: number;\n checksum: string;\n at: number;\n}\n\n/** One exported data artifact kept in the task artifact store with its content and checksum. */\nexport interface exportedartifact {\n id: string;\n kind: \"csv\" | \"json\" | \"excel\";\n name: string;\n stepid: string;\n rowcount: number;\n content: string;\n checksum: string;\n at: number;\n}\n\n/** One streaming export state with chunk and written row counters persisted for resume. */\nexport interface streamstate {\n datasetid: string;\n name: string;\n chunk: number;\n chunks: number;\n written: number;\n done?: boolean;\n at: number;\n}\n\n/** One reviewed sheet endpoint configuration stored behind its origin grant. */\nexport interface sheetendpoint {\n endpoint: string;\n origin: string;\n configuredat: number;\n}\n\n/** Transform rules and dedupe keys remembered per task between extraction and export. */\nexport interface taskrules {\n taskid: string;\n transforms: transformrule[];\n dedupekeys: string[];\n at: number;\n}\n\n/** One reviewed batch download specification with its url list, filename rule and completion criteria. */\nexport interface downloadspec {\n urls: string[];\n filename?: string;\n complete?: \"size\" | \"checksum\";\n}\n\n/** Per file states of the batch download queue. */\nexport type downloadstate = \"queued\" | \"running\" | \"paused\" | \"complete\" | \"failed\";\n\n/** One batch download file record with its state, resolved path and checksum; concurrent windows stay user configured with no code ceiling. */\nexport interface downloadrecord {\n id: string;\n url: string;\n filename: string;\n state: downloadstate;\n downloadid?: number;\n path?: string;\n bytes?: number;\n checksum?: string;\n at: number;\n updatedat: number;\n}\n\n/** Reviewed mime interception filter with include and exclude patterns and a deny default for unlisted mime types. */\nexport interface mimefilter {\n include: string[];\n exclude: string[];\n default: \"deny\" | \"allow\";\n}\n\n/** One captured network log record with url, method, status, timing and step correlation through its request id. */\nexport interface netlogrecord {\n url: string;\n method: string;\n status: number;\n timing: number;\n requestid?: string;\n stepid: string;\n at: number;\n /** Captured header names; exported netlogs always carry their values redacted. */\n headers?: Record<string, string>;\n}\n\n/** One clipboard entry with its kind, payload hash and origin provenance; the payload text never persists. */\nexport interface clipentry {\n kind: \"read\" | \"write\" | \"screen\";\n hash: string;\n length: number;\n origin: string;\n stepid: string;\n at: number;\n}\n\n/** Verdicts of the configured virus scanning hooks. */\nexport type scanverdict = \"pending\" | \"clean\" | \"flagged\" | \"error\";\n\n/** One quarantined download kept outside the downloads folder with its reason, scan state and release ref. */\nexport interface quarantineentry {\n id: string;\n path: string;\n reason: string;\n scan: scanverdict;\n release?: string;\n at: number;\n updatedat: number;\n}\n\n/** One consistent capture filename stamped from task, step and sequence parts. */\nexport interface capturename {\n task: string;\n step: string;\n sequence: number;\n}\n\n/** One reviewed artifact cleanup rule with an age window, an artifact kind and a keep policy. */\nexport interface cleanuprule {\n age: number;\n kind: string;\n keep: \"none\" | \"latest\" | \"all\";\n}\n\n/** One clipboard consent record with its prompt, origin and single use approval state; every clipboard read needs its own approved prompt. */\nexport interface clipboardconsentrecord {\n id: string;\n prompt: string;\n origin: string;\n stepid: string;\n approved?: boolean;\n usedat?: number;\n at: number;\n}\n\n/** One user configured virus scanning hook endpoint stored behind its origin grant. */\nexport interface scanhookconfig {\n scanner: string;\n endpoint: string;\n origin: string;\n configuredat: number;\n}\n\n/** One stored capture naming counter per task and step base. */\nexport interface capturecounter {\n taskid: string;\n counters: Record<string, number>;\n at: number;\n}\n\n/** One artifact inventory entry for the cleanup sweeper with its size and capture time. */\nexport interface artifactinventoryentry {\n id: string;\n kind: string;\n name: string;\n size: number;\n at: number;\n}\n\n/** One cleanup run history record with the applied rule count and the removed and kept artifact counts. */\nexport interface cleanuprun {\n id: string;\n rules: number;\n removed: number;\n kept: number;\n at: number;\n}\n", "import { actionrisk, parseoptions, submitreviewgranted, validatestep } from \"./policy.js\";\nimport { protocolversion, type agentplan, type bannerreport, type clickablemap, type dataset, type downloadrecord, type errorreport, type extractsession, type focusevent, type formreport, type keyholdstate, type mutationevent, type navstate, type netlogrecord, type observation, type pagesignals, type planproposal, type proposalrequest, type provenancerecord, type quarantineentry, type resolvedtarget, type safetyverdict, type selectorcandidate, type snapshotdiff, type stepoutcome, type tablayout, type tabreport, type toolstep, type trailentry, type transformrule, type typeaheadpick, type wizardstate } 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 * - navigation kinds carry the navigation parameter grammar: `navtarget` with a `url`, a `container` (`current`, `tab`, `window` or `private`), a `position` (`adjacent` or `end`) and a `private` flag; `waitprofile` with non-empty load `signals`, optional `idle` and `timeout` thresholds and per origin `overrides`; and `urlpattern` with a `mode` (`exact`, `prefix`, `host` or `pattern`), a `url`, optional `query` parameter expectations and an optional `fragment`.\n * - `waiturl` and `spawait` carry a reviewed `urlpattern`, `timeout` and `poll`; `spanav` carries an optional `routepattern`, `followlink` an optional `fragment` flag, `rewritequery` reviewed `set` and `remove` query edits, `navlist`/`prefetch`/`batchopen` reviewed `urls` lists, `preconnect` reviewed `origins`, `navrate` a reviewed `ratelimit` with `domain`, `window` and `ceiling` (never capped in code), and `deeplink` a reviewed `app` pattern with `params`.\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 * - navigation steps attach structured evidence to step details: load phases and ready states, final urls after redirects, redirect chains with statuses and timing, http error, offline and certificate interstitial states, safety verdicts and navlist entry completions.\n * - the tabs and windows command family adds its parameter grammar: `tabquery` with url, title, id and pattern matchers (at least one matcher required, patterns use `*` and `**` wildcards); `group` with a `name`, a Chromium tab group `color`, member `tabids` and a `collapsed` flag; `layout` names for `savelayout` and `restorelayout`; reviewed `pinned`, `muted`, `index`, `windowid`, `direction`, `step`, `bounds`, `label`, `labels`, `taskrefs`, `provenance` and `run` fields; `tabcreate` gains reviewed `background` and `window` options and `windowcreate` gains reviewed `left`, `top`, `width`, `height` and `state` options; `closepattern` requires the explicit `reviewed` flag before any tab closes.\n * - tab command steps attach structured evidence to step details: tab reports with matched tabs carrying audio state and metadata, group registries, badge states, layout snapshots, clone warnings, discard candidates and watchtab event records.\n * - the forms and data family adds its parameter grammar: `formrecord` with an optional `form` selector and non-empty `entries` of `{ match, kind, value }` where `match` is a `fieldmatch` with `mode` one of `label`, `placeholder`, `arialabel` or `name`; `valuegen` with a field `kind`, an optional `locale` and an optional numeric `seed`; `fields` lists of label or placeholder value pairs for filllabel and fillplaceholder; a reviewed `name` plus `formrecord` for saveprofiles; a reviewed `consentref` for submitform and consentpassword; a reviewed `backoff` rule with `wait` and `factor` plus an optional `attempts` for retryform with no code ceiling; a reviewed `child` selector, `pick` entry, `pause` and `timeout` for chains, typeaheads and card typing; reviewed card `segments`; and a reviewed `source` for fillcode; password entries inside form records are refused because passwords need the explicit consentpassword consent.\n * - form steps attach structured evidence to step details: form reports with detected fields, kinds and matched controls, error reports with field refs and messages, wizard states with step history, typeahead picks, honeypot flags, login detections with session link markers and signup or checkout template detections.\n * - the forms and data part two family adds its parameter grammar: `scrapetable` and `paginateextract` carry an optional dataset `name`, an optional positive integer `rowlimit` (never capped in code), a reviewed `next` control selector, an optional positive integer `pages` count (never capped in code) and an optional `wait` row freshness window; the export kinds (`exportcsv`, `exportjson`, `exportexcel`, `copytable`, `streamdisk`, `pushsheets`) carry a reviewed `dataset` id, an optional artifact `name`, an optional single character csv `delimiter`, a reviewed positive integer streaming `chunk` size (never capped in code) and, for sheet pushes, a reviewed HTTPS `sheet` endpoint plus the explicit `reviewed` flag; `importcsv` carries reviewed `csv` text with an optional `name` and a `mapping` object of csv headers to target keys; `looprows` carries a reviewed `dataset` id, an optional row `variable` name and a wrapped inner step by `stepid` or inline; `transformvalues` carries reviewed `rules` of `{ expression, sources, target }` where the expression is `trim`, `upper`, `lower`, `number`, `prefix:x`, `suffix:x` or `replace:from=>to`; `deduperows` carries reviewed dedupe `keys`; `mergepages` carries a reviewed `datasets` id list; `stamplerows` carries a reviewed `dataset` id with an optional `url`; `previewgrid` carries a reviewed `dataset` id with an optional `sample` row count (never capped in code); `resumeextract` carries a reviewed `session` id; and `logprovenance` carries a reviewed `artifact` id or name.\n * - data steps attach structured evidence to step details: scraped grids with normalized column specs, span filled rows and nested child datasets, pagination page counts with remaining next controls, dataset previews with sampled rows, dedupe removed counts, transform error lists, stream chunk states and provenance records with checksums and row ranges.\n * - the files, clipboard and downloads family adds its parameter grammar: `batchdownload` carries a reviewed `downloadspec` with a non-empty `urls` list, an optional `filename` rule and an optional `complete` criterion (`size` or `checksum`) plus an optional positive integer `concurrent` window (never capped in code); `pausedownload`, `resumedownload`, `verifydownload`, `quarantinedownload` and `scanvirus` carry a reviewed download or quarantine reference with optional `checksum`, `bytes`, `scanner` and `reason` fields; `interceptmime` carries a reviewed `mimefilter` with non-empty `include` patterns, optional `exclude` patterns and the `deny` or `allow` default for unlisted mime types; `readclipboard` carries a reviewed `consentref` plus an optional `prompt`; `exportnetlog` carries an optional `stepid` filter; `namecaptures` carries a reviewed `task` with optional `steps` and `extension`; and `cleanupartifacts` carries reviewed `rules` of `{ age, kind, keep }` where the age window carries no code ceiling and the keep policy is `none`, `latest` or `all`.\n * - files steps attach structured evidence to step details: batch download reports with per file states, resolved paths and checksums, verification match results, netlog records correlated with steps through request ids, clipboard entries with payload hashes and origin provenance (the payload text never appears), quarantine entries with scan verdicts and release refs, capture names stamped from task, step and sequence parts, and cleanup run outcomes with removed and kept counts.\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\" && step.kind !== \"looprows\") continue;\n const options = parseoptions(step);\n if (typeof options.stepid === \"string\" && !steps.some(candidate => candidate.id === options.stepid)) throw new Error(\"A retry, frame or loop wrapper references an unknown step id.\");\n }\n for (const step of steps) {\n if (step.kind !== \"submitform\" && step.kind !== \"retryform\") continue;\n const review = submitreviewgranted(steps, step.id);\n if (!review.allowed) throw new Error(review.reason);\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\n/** Wraps the live navigation state with its load phase, final url and redirect chain in the versioned response envelope. */\nexport function navstateresponse(input: { navstate: navstate; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, navstate: input.navstate });\n}\n\n/** Carries the navigation trail of a session with its visited urls, titles and step refs in the session context envelope. */\nexport function trailreport(input: { sessionid?: string; trail: trailentry[] }): { version: typeof protocolversion; sessionid?: string; trail: trailentry[] } {\n return { version: protocolversion, ...(input.sessionid ? { sessionid: input.sessionid } : {}), trail: input.trail };\n}\n\n/** Wraps url safety verdicts with their reasons in the versioned response envelope for external link review. */\nexport function safetyresponse(input: { verdicts: safetyverdict[]; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, verdicts: input.verdicts });\n}\n\n/** Wraps one tab report with its matched tabs, groups and badges in the versioned response envelope. */\nexport function tabreportresponse(input: { report: tabreport; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, report: input.report });\n}\n\n/** Carries the saved tab layouts with their window bounds and group states in the session context envelope. */\nexport function layoutreport(input: { layouts: tablayout[] }): { version: typeof protocolversion; layouts: tablayout[] } {\n return { version: protocolversion, layouts: input.layouts };\n}\n\n/** Wraps one form report with the detected fields, their kinds and the matched controls in the versioned response envelope. */\nexport function formreportresponse(input: { report: formreport; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, report: input.report });\n}\n\n/** Wraps one collected error report with its field refs and messages in the versioned response envelope for correction loops. */\nexport function errorreportresponse(input: { report: errorreport; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, report: input.report });\n}\n\n/** Carries the wizard states with their step history and the recorded typeahead picks in the session context envelope. */\nexport function wizardreport(input: { sessionid?: string; wizards: wizardstate[]; picks: typeaheadpick[] }): { version: typeof protocolversion; sessionid?: string; wizards: wizardstate[]; picks: typeaheadpick[] } {\n return { version: protocolversion, ...(input.sessionid ? { sessionid: input.sessionid } : {}), wizards: input.wizards, picks: input.picks };\n}\n\n/** Wraps one dataset payload with its column specs and a sampled row list in the versioned response envelope. */\nexport function datasetresponse(input: { dataset: dataset; plan: agentplan; sample?: number }): string {\n const sample = Math.max(0, Math.floor(input.sample ?? 10));\n const payload = { ...input.dataset, rows: input.dataset.rows.slice(0, sample), totalrows: input.dataset.rows.length };\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, dataset: payload });\n}\n\n/** Carries the extraction progress with visited page counts, collected row counts and resume cursors in the session context envelope. */\nexport function extractionreport(input: { sessions: extractsession[] }): { version: typeof protocolversion; sessions: extractsession[] } {\n return { version: protocolversion, sessions: input.sessions };\n}\n\n/** Reports the provenance records of every exported artifact with its source url, step ref, row range and checksum in the session context envelope. */\nexport function provenancereport(input: { records: provenancerecord[] }): { version: typeof protocolversion; records: provenancerecord[] } {\n return { version: protocolversion, records: input.records };\n}\n\n/** Documents the reviewed transform rule grammar shared by transformvalues steps and the task rules store. */\nexport function transformgrammar(rules: transformrule[]): string {\n return JSON.stringify({ rules: rules.map(rule => ({ expression: rule.expression, sources: rule.sources, target: rule.target })) });\n}\n\n/** Wraps the batch download queue with per file states, resolved paths and checksums in the versioned response envelope. */\nexport function downloadreport(input: { downloads: downloadrecord[]; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, downloads: input.downloads });\n}\n\n/** Carries the captured network log records with their step correlation through request ids in the session context envelope. */\nexport function netlogreport(input: { records: netlogrecord[] }): { version: typeof protocolversion; records: netlogrecord[] } {\n return { version: protocolversion, records: input.records };\n}\n\n/** Carries the quarantine entries with their scan verdicts and release refs in the session context envelope. */\nexport function quarantinereport(input: { entries: quarantineentry[] }): { version: typeof protocolversion; entries: quarantineentry[] } {\n return { version: protocolversion, entries: input.entries };\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 targetwindow = typeof options.window === \"number\" && Number.isFinite(options.window) ? options.window : undefined;\n const created = await chrome.tabs.create({ url: step.value, active: options.active !== false && options.background !== true, pinned: options.pinned === true, ...(targetwindow !== undefined ? { windowId: targetwindow } : {}) });\n return { ok: true, summary: `Opened a new tab for ${step.value}${options.background === true ? \" in the background without activating it\" : \"\"}.`, details: { tabid: created?.id ?? 0, ...(targetwindow !== undefined ? { windowid: targetwindow } : {}), ...(options.background === true ? { background: true } : {}) } };\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 bounds = [\"left\", \"top\", \"width\", \"height\"].filter(field => typeof options[field] === \"number\");\n const geometry = Object.fromEntries(bounds.map(field => [field, options[field]])) as Record<string, number>;\n const state = typeof options.state === \"string\" && [\"normal\", \"maximized\", \"minimized\", \"fullscreen\"].includes(options.state) ? options.state : undefined;\n const created = await chrome.windows.create({ url: step.value ?? \"about:blank\", ...(Object.keys(geometry).length > 0 ? geometry : {}), ...(state !== undefined ? { state: state as chrome.windows.WindowState } : {}) });\n return { ok: true, summary: `Opened a new window for ${step.value}.`, details: { windowid: created?.id ?? 0, ...(Object.keys(geometry).length > 0 ? { bounds: geometry } : {}), ...(state !== undefined ? { state } : {}) } };\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 { tabgrouprecord, tablayout, tabquery, tabwatchevent, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport { assigntasktab, tasktabs } from \"../progress.js\";\nimport type { planprogress } from \"../types.js\";\n\n/**\n * Tabs and windows command logics for reviewed steps.\n * Every correlated rule for tab queries, clone detection, group membership, layouts, snapshots, watchers, badges, discard candidates, switcher order, zoom steps and the task tab budget lives in this file.\n */\n\n/** One serializable live tab shape resolved against the browser tab set. */\nexport interface tabshape {\n tabid: number;\n url: string;\n title: string;\n index: number;\n windowid: number;\n active: boolean;\n pinned: boolean;\n audible: boolean;\n muted: boolean;\n discarded: boolean;\n}\n\n/** One serializable live window shape with bounds, state and profile kind. */\nexport interface windowshape {\n windowid: number;\n left: number;\n top: number;\n width: number;\n height: number;\n state: \"normal\" | \"maximized\" | \"minimized\" | \"fullscreen\";\n incognito: boolean;\n focused: boolean;\n}\n\n/** Reads the reviewed tabquery of a tabs and windows command step; null when the step reviews none. */\nexport function parsetabquery(step: toolstep): tabquery | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options.tabquery;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const query = value as Record<string, unknown>;\n return {\n ...(typeof query.url === \"string\" && query.url ? { url: query.url } : {}),\n ...(typeof query.title === \"string\" && query.title ? { title: query.title } : {}),\n ...(typeof query.id === \"number\" && Number.isInteger(query.id) && query.id >= 0 ? { id: query.id } : {}),\n ...(typeof query.pattern === \"string\" && query.pattern ? { pattern: query.pattern } : {}),\n };\n}\n\n/** Matches one reviewed wildcard pattern against a url; `*` spans one path segment and `**` spans any part. */\nexport function tabpatternmatches(pattern: string, url: string): boolean {\n const source = pattern.split(\"**\").map(part => part.split(\"*\").map(piece => piece.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"[^/]*\")).join(\".*\");\n return new RegExp(`^${source}$`).test(url);\n}\n\n/** Resolves one reviewed tabquery against the live tab set: every matcher that exists must hold. */\nexport function querymatches(query: tabquery, tabs: tabshape[]): tabshape[] {\n return tabs.filter(tab => {\n if (query.id !== undefined && tab.tabid !== query.id) return false;\n if (query.url !== undefined && tab.url !== query.url) return false;\n if (query.title !== undefined && !tab.title.toLowerCase().includes(query.title.toLowerCase())) return false;\n if (query.pattern !== undefined && !tabpatternmatches(query.pattern, tab.url)) return false;\n return true;\n });\n}\n\n/** Normalizes one url for clone comparison by dropping the fragment and trailing slashes. */\nexport function normalizedtaburl(url: string): string {\n let normalized = url;\n const hash = normalized.indexOf(\"#\");\n if (hash >= 0) normalized = normalized.slice(0, hash);\n while (normalized.length > 1 && normalized.endsWith(\"/\")) normalized = normalized.slice(0, -1);\n return normalized;\n}\n\n/** One clone warning: a normalized url shared by more than one open tab. */\nexport interface clonewarning {\n url: string;\n tabids: number[];\n}\n\n/** Detects duplicate tabs by normalized url comparison and returns every url held by more than one tab. */\nexport function clonetabs(tabs: tabshape[]): clonewarning[] {\n const groups = new Map<string, number[]>();\n for (const tab of tabs) {\n if (!tab.url) continue;\n const key = normalizedtaburl(tab.url);\n groups.set(key, [...(groups.get(key) ?? []), tab.tabid]);\n }\n return [...groups.entries()].filter(([, tabids]) => tabids.length > 1).map(([url, tabids]) => ({ url, tabids }));\n}\n\n/** Searches across open tabs by title and url, case insensitive, returning matches in live order. */\nexport function searchtabmatches(tabs: tabshape[], text: string): tabshape[] {\n const needle = text.trim().toLowerCase();\n if (!needle) return [];\n return tabs.filter(tab => tab.title.toLowerCase().includes(needle) || tab.url.toLowerCase().includes(needle));\n}\n\n/** Lists the tabs that are playing audio: audible or muted but still playing. */\nexport function audiotabs(tabs: tabshape[]): tabshape[] {\n return tabs.filter(tab => tab.audible || (tab.muted && tab.audible));\n}\n\n/** Returns the inactive, unpinned and not yet discarded tabs a discardtab step may release. */\nexport function discardcandidates(tabs: tabshape[]): tabshape[] {\n return tabs.filter(tab => !tab.active && !tab.pinned && !tab.discarded && tab.url.length > 0);\n}\n\n/** Restores discarded tabs on demand without losing their urls; every discarded tab keeps its url for reload. */\nexport function restorediscarded(tabs: tabshape[]): Array<{ tabid: number; url: string }> {\n return tabs.filter(tab => tab.discarded && tab.url.length > 0).map(tab => ({ tabid: tab.tabid, url: tab.url }));\n}\n\n/** Captures one tab layout with name, tabs, groups, positions and window bounds from the live browser state. */\nexport function buildlayout(name: string, tabs: tabshape[], windows: windowshape[], groups: tabgrouprecord[], scratchwindowids: number[], at: number): tablayout {\n return {\n name,\n tabs: tabs.map(tab => ({ url: tab.url, title: tab.title, pinned: tab.pinned, index: tab.index, windowid: tab.windowid })),\n groups: groups.map(group => ({ name: group.name, color: group.color, tabids: group.tabids.filter(tabid => tabs.some(tab => tab.tabid === tabid)), collapsed: group.collapsed })),\n windows: windows.map(item => ({ windowid: item.windowid, state: { bounds: { left: item.left, top: item.top, width: item.width, height: item.height }, maximized: item.state === \"maximized\", profile: item.incognito ? \"incognito\" : scratchwindowids.includes(item.windowid) ? \"scratch\" : \"normal\" } })),\n savedat: at,\n };\n}\n\n/** Plans the restore of one saved layout: only urls that are not already open come back, in layout order. */\nexport function layoutrestoreplan(layout: tablayout, openurls: string[]): string[] {\n const open = new Set(openurls.map(url => normalizedtaburl(url)));\n return layout.tabs.map(tab => tab.url).filter(url => url.length > 0 && !open.has(normalizedtaburl(url)));\n}\n\n/** Keeps tabgroup membership through moves: member ids survive, their order follows the live tab order and closed members drop out. */\nexport function regroupaftermoves(groups: tabgrouprecord[], tabs: tabshape[], at: number): tabgrouprecord[] {\n const order = new Map(tabs.map(tab => [tab.tabid, tab.index]));\n return groups.map(group => {\n const members = group.tabids.filter(tabid => order.has(tabid));\n if (members.length === 0) return group;\n const ordered = [...members].sort((left, right) => (order.get(left) ?? 0) - (order.get(right) ?? 0));\n return ordered.length === group.tabids.length && ordered.every((tabid, index) => tabid === group.tabids[index]) ? group : { ...group, tabids: ordered, savedat: at };\n });\n}\n\n/** Renames one stored tab group while keeping its color choice, member tabs and collapse state. */\nexport function renamegroup(groups: tabgrouprecord[], name: string, newname: string, at: number): tabgrouprecord[] {\n return groups.map(group => group.name === name ? { ...group, name: newname, savedat: at } : group);\n}\n\n/** Counts the task tabs that live inside one window so the close gate can demand review. */\nexport function tasktabsinwindow(tabs: tabshape[], windowid: number, tasktabids: number[]): number {\n const tasks = new Set(tasktabids);\n return tabs.filter(tab => tab.windowid === windowid && tasks.has(tab.tabid)).length;\n}\n\n/** Selects the tabs a reviewed closepattern may close; the session tab itself is always refused protection. */\nexport function closeselection(query: tabquery, tabs: tabshape[], sessiontabid: number): { targets: tabshape[]; refused: tabshape[] } {\n const matches = querymatches(query, tabs);\n return {\n targets: matches.filter(tab => tab.tabid !== sessiontabid),\n refused: matches.filter(tab => tab.tabid === sessiontabid),\n };\n}\n\n/** Applies one reviewed zoom step with no code ceiling; a step never crosses zero, so it keeps the current zoom instead. */\nexport function zoomstep(current: number, direction: \"in\" | \"out\", step: number): number {\n const next = direction === \"in\" ? current + step : current - step;\n return next > 0 ? Number(next.toFixed(4)) : current;\n}\n\n/** Resolves the neighbor tab index a switchtab step activates, wrapping at both ends of the window. */\nexport function switchtarget(tabs: tabshape[], direction: \"next\" | \"previous\", currentindex: number): number | undefined {\n if (tabs.length === 0) return undefined;\n const offset = direction === \"next\" ? 1 : -1;\n return (currentindex + offset + tabs.length) % tabs.length;\n}\n\n/** Orders the quick switcher list by recency with filter keys; unseen tabs follow in live index order. */\nexport function switcherlist(tabs: tabshape[], recency: Array<{ tabid: number; at: number }>, filter: string): tabshape[] {\n const needle = filter.trim().toLowerCase();\n const matches = needle ? tabs.filter(tab => tab.title.toLowerCase().includes(needle) || tab.url.toLowerCase().includes(needle)) : [...tabs];\n const lastrun = new Map(recency.map(entry => [entry.tabid, entry.at]));\n return [...matches].sort((left, right) => {\n const leftat = lastrun.get(left.tabid) ?? -1;\n const rightat = lastrun.get(right.tabid) ?? -1;\n if (leftat !== rightat) return rightat - leftat;\n return left.index - right.index;\n });\n}\n\n/** Dispatches the tab events of one watchtab registration into the step result, honoring the reviewed event filters. */\nexport function watchtabdispatch(events: tabwatchevent[], watchid: string, filters: string[]): tabwatchevent[] {\n const allowed = filters.length > 0 ? new Set(filters) : undefined;\n return events.filter(event => event.watchid === watchid && (allowed === undefined || allowed.has(event.event)));\n}\n\n/** Computes the per task badge from the live progress state of the task. */\nexport function badgefromprogress(completed: number, total: number): { label: string; done: boolean } {\n if (total <= 0) return { label: \"idle\", done: false };\n if (completed >= total) return { label: \"done\", done: true };\n return { label: `${completed}/${total}`, done: false };\n}\n\n/** Grades the concurrent task tab budget: a user configured ceiling refuses, an absent ceiling never refuses. */\nexport function tasktabgauge(used: number, ceiling: number | undefined): { used: number; ceiling: number | undefined; over: boolean } {\n return { used, ceiling, over: ceiling !== undefined && used > ceiling };\n}\n\n/** True when a window profile inherits the session origin grants; incognito windows stay separated. */\nexport function windowprofilegrants(profile: \"normal\" | \"incognito\" | \"scratch\"): boolean {\n return profile !== \"incognito\";\n}\n\n/** Assigns every task tab of the plan progress, used when tabmeta routing records a tab for the plan steps. */\nexport function assigntasktabs(progress: planprogress | undefined, planid: string, tabids: number[], now: number): planprogress {\n let next = progress;\n for (const tabid of tabids) next = assigntasktab(next, planid, tabid, now);\n return next ?? { planid, completedsteps: [], tasktabs: [], updatedat: now };\n}\n\n/** Returns the task tabs tracked by one plan progress, used for window close review and badge refresh. */\nexport function trackedtasktabs(progress: planprogress | undefined, planid: string): number[] {\n return tasktabs(progress, planid);\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 type { navtarget, toolstep, urlpattern, waitoverride, waitprofile } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\n\n/**\n * Page navigation logics for reviewed steps.\n * Every correlated rule for navigation targets, container resolution, wait profiles, url patterns, link following, spa routing, query rewriting, deep links and recent tabs lives in this file.\n */\n\n/** One link shape matched by followlink and spanav, serializable for fixtures. */\nexport interface linkshape {\n text: string;\n href: string;\n selector: string;\n}\n\n/** One collected load signal sample with the signals that held true at its time. */\nexport interface signalsample {\n at: number;\n signals: string[];\n}\n\n/** Resolved container plan of one navigation target across tabs, windows and private profiles. */\nexport interface containerplan {\n kind: \"current\" | \"tab\" | \"window\" | \"private\";\n incognito: boolean;\n windowid?: number;\n position: \"adjacent\" | \"end\";\n}\n\n/** Reads the reviewed navtarget of a navigation step; null when the step reviews none. */\nexport function parsenavtarget(step: toolstep): navtarget | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options.navtarget;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const target = value as Record<string, unknown>;\n if (typeof target.url !== \"string\" || !target.url) return null;\n const container = target.container === \"current\" || target.container === \"window\" || target.container === \"private\" ? target.container : \"tab\";\n return {\n url: target.url,\n container,\n ...(target.position === \"end\" ? { position: \"end\" } : { position: \"adjacent\" }),\n private: container === \"private\" || target.private === true,\n };\n}\n\n/** Resolves the container plan of one navigation target: the current task tab, a new tab, a new window or a private window profile separated from normal windows. */\nexport function resolvecontainer(target: navtarget, windows: Array<{ id: number; incognito: boolean; focused: boolean }>): containerplan {\n if (target.container === \"current\") return { kind: \"current\", incognito: false, position: target.position ?? \"adjacent\" };\n if (target.container === \"private\" || target.private) return { kind: \"private\", incognito: true, position: target.position ?? \"adjacent\" };\n if (target.container === \"window\") {\n const focused = windows.find(item => item.focused);\n return { kind: \"window\", incognito: false, ...(focused ? { windowid: focused.id } : {}), position: target.position ?? \"adjacent\" };\n }\n const normal = windows.find(item => !item.incognito && item.focused) ?? windows.find(item => !item.incognito);\n return { kind: \"tab\", incognito: false, ...(normal ? { windowid: normal.id } : {}), position: target.position ?? \"adjacent\" };\n}\n\n/** Reads the reviewed waitprofile of a navprofile step; null when the step reviews none. */\nexport function parsewaitprofile(step: toolstep): waitprofile | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options.waitprofile;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const profile = value as Record<string, unknown>;\n const signals = Array.isArray(profile.signals) ? profile.signals.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n if (signals.length === 0) return null;\n const overrides: waitoverride[] = [];\n if (Array.isArray(profile.overrides)) {\n for (const item of profile.overrides) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const override = item as Record<string, unknown>;\n if (typeof override.origin !== \"string\" || !override.origin) continue;\n const overridesignals = Array.isArray(override.signals) ? override.signals.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0) : undefined;\n overrides.push({\n origin: override.origin,\n ...(overridesignals && overridesignals.length > 0 ? { signals: overridesignals } : {}),\n ...(typeof override.idle === \"number\" && Number.isFinite(override.idle) && override.idle >= 0 ? { idle: override.idle } : {}),\n ...(typeof override.timeout === \"number\" && Number.isFinite(override.timeout) && override.timeout >= 0 ? { timeout: override.timeout } : {}),\n });\n }\n }\n return {\n signals,\n ...(typeof profile.idle === \"number\" && Number.isFinite(profile.idle) && profile.idle >= 0 ? { idle: profile.idle } : {}),\n ...(typeof profile.timeout === \"number\" && Number.isFinite(profile.timeout) && profile.timeout >= 0 ? { timeout: profile.timeout } : {}),\n ...(overrides.length > 0 ? { overrides } : {}),\n };\n}\n\n/** Resolves the effective signals and thresholds of one wait profile for an origin by folding the per origin overrides in. */\nexport function profilefororigin(profile: waitprofile, origin: string): { signals: string[]; idle: number; timeout: number } {\n let signals = [...profile.signals];\n let idle = profile.idle ?? 0;\n let timeout = profile.timeout ?? 0;\n for (const override of profile.overrides ?? []) {\n if (!override.origin || new URL(override.origin).origin !== origin) continue;\n if (override.signals && override.signals.length > 0) signals = [...override.signals];\n if (override.idle !== undefined) idle = override.idle;\n if (override.timeout !== undefined) timeout = override.timeout;\n }\n return { signals, idle, timeout };\n}\n\n/** Maps a document ready state onto the live navigation load phase. */\nexport function loadphase(readystate: string): \"loading\" | \"interactive\" | \"complete\" {\n if (readystate === \"interactive\") return \"interactive\";\n if (readystate === \"complete\") return \"complete\";\n return \"loading\";\n}\n\n/** Decides the wait outcome of a wait profile from collected load signal samples: every required signal must hold in the latest sample inside the timeout. */\nexport function evaluatesignals(required: string[], samples: signalsample[], timeout: number): { ok: boolean; satisfied: string[]; waited: number; samples: number } {\n const start = samples[0]?.at ?? 0;\n const last = samples[samples.length - 1];\n const waited = Math.max(0, (last?.at ?? 0) - start);\n const held = last?.signals ?? [];\n const satisfied = required.filter(signal => held.includes(signal));\n if (required.length > 0 && satisfied.length === required.length) return { ok: true, satisfied, waited, samples: samples.length };\n if (timeout > 0 && waited >= timeout) return { ok: false, satisfied, waited, samples: samples.length };\n return { ok: false, satisfied, waited, samples: samples.length };\n}\n\n/** Reads the reviewed urlpattern of a waiturl, spanav or spawait step; null when the step reviews none. */\nexport function parseurlpattern(step: toolstep, key: string = \"urlpattern\"): urlpattern | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options[key];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const pattern = value as Record<string, unknown>;\n if (typeof pattern.url !== \"string\" || !pattern.url) return null;\n const mode = pattern.mode === \"exact\" || pattern.mode === \"host\" || pattern.mode === \"pattern\" ? pattern.mode : \"prefix\";\n const query: Record<string, string> = {};\n if (pattern.query && typeof pattern.query === \"object\" && !Array.isArray(pattern.query)) {\n for (const [name, item] of Object.entries(pattern.query as Record<string, unknown>)) if (typeof item === \"string\") query[name] = item;\n }\n return {\n mode,\n url: pattern.url,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(typeof pattern.fragment === \"string\" && pattern.fragment ? { fragment: pattern.fragment } : {}),\n };\n}\n\n/** Matches a wildcard path segment against one url path segment. */\nfunction segmentmatches(pattern: string, actual: string): boolean {\n if (pattern === \"*\" || pattern === \"**\") return true;\n if (!pattern.includes(\"*\")) return pattern === actual;\n const parts = pattern.split(\"*\");\n let index = 0;\n for (let position = 0; position < parts.length; position += 1) {\n const part = parts[position] as string;\n if (part === \"\") continue;\n const found = actual.indexOf(part, index);\n if (found < 0) return false;\n if (position === 0 && found !== 0) return false;\n index = found + part.length;\n }\n const last = parts[parts.length - 1] as string;\n return last === \"\" || actual.endsWith(last);\n}\n\n/** Matches one url against a reviewed urlpattern by mode plus required query and fragment parts. */\nexport function urlmatches(url: string, pattern: urlpattern): boolean {\n let parsed: URL;\n try { parsed = new URL(url); } catch { return false; }\n let expected: URL;\n try { expected = new URL(pattern.url); } catch { return false; }\n if (pattern.mode === \"exact\" && parsed.toString() !== expected.toString()) return false;\n if (pattern.mode === \"prefix\" && !parsed.toString().startsWith(pattern.url)) return false;\n if (pattern.mode === \"host\" && parsed.origin !== expected.origin) return false;\n if (pattern.mode === \"pattern\") {\n if (parsed.origin !== expected.origin) return false;\n const expectedsegments = expected.pathname.split(\"/\").filter(segment => segment !== \"\");\n const actualsegments = parsed.pathname.split(\"/\").filter(segment => segment !== \"\");\n if (expectedsegments.includes(\"**\")) {\n const cut = expectedsegments.indexOf(\"**\");\n const head = expectedsegments.slice(0, cut);\n const tail = expectedsegments.slice(cut + 1);\n if (actualsegments.length < head.length + tail.length) return false;\n if (!head.every((segment, position) => segmentmatches(segment, actualsegments[position] ?? \"\"))) return false;\n if (!tail.every((segment, position) => segmentmatches(segment, actualsegments[actualsegments.length - tail.length + position] ?? \"\"))) return false;\n } else if (expectedsegments.length !== actualsegments.length || !expectedsegments.every((segment, position) => segmentmatches(segment, actualsegments[position] ?? \"\"))) return false;\n }\n const values = parsed.searchParams;\n for (const [name, value] of Object.entries(pattern.query ?? {})) {\n if (!values.has(name)) return false;\n if (value !== \"*\" && values.get(name) !== value) return false;\n }\n if (pattern.fragment !== undefined && parsed.hash.slice(1) !== pattern.fragment) return false;\n return true;\n}\n\n/** Reads the current query parameters of a url. */\nfunction readquery(url: string): Record<string, string> {\n const values: Record<string, string> = {};\n try {\n for (const [name, value] of new URL(url).searchParams.entries()) values[name] = value;\n } catch { /* an unparseable url has no readable parameters */ }\n return values;\n}\n\n/** Result of one query rewrite with the parameters read, written and the new url. */\nexport interface queryrewriteoutcome {\n url: string;\n before: Record<string, string>;\n after: Record<string, string>;\n set: string[];\n removed: string[];\n}\n\n/** Rewrites the query parameters of one url: reviewed values are set, reviewed names removed and the rest preserved. */\nexport function rewritequeryurl(url: string, set: Record<string, string>, remove: string[]): queryrewriteoutcome {\n const parsed = new URL(url);\n const before = readquery(url);\n for (const name of remove) parsed.searchParams.delete(name);\n for (const [name, value] of Object.entries(set)) parsed.searchParams.set(name, value);\n parsed.hash = \"\";\n return { url: parsed.toString(), before, after: readquery(parsed.toString()), set: Object.keys(set), removed: [...remove] };\n}\n\n/** Applies one reviewed fragment to a url, keeping every other part untouched. */\nexport function fragmenturl(url: string, fragment: string): string {\n const parsed = new URL(url);\n parsed.hash = fragment.replace(/^#/, \"\");\n return parsed.toString();\n}\n\n/** Matches links by their visible text, case insensitively, refusing ambiguity through multiple matches. */\nexport function matchlinktext(links: linkshape[], text: string): linkshape[] {\n const wanted = text.trim().toLowerCase();\n return links.filter(link => link.text.trim().toLowerCase() === wanted);\n}\n\n/** Matches links by their href fragment when the reviewed option asks for fragment resolution. */\nexport function matchlinkfragment(links: linkshape[], fragment: string): linkshape[] {\n const wanted = fragment.trim().replace(/^#/, \"\");\n return links.filter(link => {\n try { return new URL(link.href, \"https://example.invalid\").hash.replace(/^#/, \"\") === wanted; } catch { return false; }\n });\n}\n\n/** Builds a deep link into a common web app from a reviewed app pattern and its string params; unknown apps are refused. */\nexport function deeplinkurl(app: string, params: Record<string, string>): string | null {\n const value = (name: string): string | undefined => {\n const item = params[name];\n return typeof item === \"string\" && item.trim() ? item.trim() : undefined;\n };\n switch (app.trim().toLowerCase()) {\n case \"github\": {\n const owner = value(\"owner\");\n const repo = value(\"repo\");\n if (!owner || !repo) return null;\n const path = value(\"path\");\n return `https://github.com/${owner}/${repo}${path ? `/${path.replace(/^\\/+/, \"\")}` : \"\"}`;\n }\n case \"youtube\": {\n const id = value(\"id\");\n if (id) return `https://www.youtube.com/watch?v=${encodeURIComponent(id)}`;\n const search = value(\"search\");\n if (search) return `https://www.youtube.com/results?search_query=${encodeURIComponent(search)}`;\n return null;\n }\n case \"maps\": {\n const query = value(\"query\");\n if (!query) return null;\n return `https://www.google.com/maps/search/${encodeURIComponent(query)}`;\n }\n case \"wikipedia\": {\n const title = value(\"title\");\n if (!title) return null;\n const language = value(\"language\") ?? \"en\";\n return `https://${language}.wikipedia.org/wiki/${encodeURIComponent(title.replace(/\\s+/g, \"_\"))}`;\n }\n case \"amazon\": {\n const search = value(\"search\");\n if (!search) return null;\n return `https://www.amazon.com/s?k=${encodeURIComponent(search)}`;\n }\n case \"x\": {\n const user = value(\"user\");\n if (!user) return null;\n return `https://x.com/${user.replace(/^@/, \"\")}`;\n }\n default: return null;\n }\n}\n\n/** True when the current url of a single page app changed without a reload, keeping the origin. */\nexport function spauroutechanged(previousurl: string, currenturl: string): boolean {\n if (previousurl === currenturl) return false;\n try {\n return new URL(previousurl).origin === new URL(currenturl).origin;\n } catch { return false; }\n}\n\n/** Picks the most recently closed tab whose url is no longer open; null when every recent tab is already restored. */\nexport function pickrecenttab(recenttabs: Array<{ url: string; tabid: number; closedat: number }>, openurls: string[]): { url: string; tabid: number; closedat: number } | null {\n return recenttabs.find(tab => !openurls.includes(tab.url)) ?? null;\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise(resolve => window.setTimeout(resolve, ms));\n}\n\nfunction stepoptions(step: toolstep): Record<string, unknown> {\n try { return parseoptions(step); } catch { return {}; }\n}\n\nfunction collectlinks(root: Document): linkshape[] {\n return [...root.querySelectorAll(\"a[href]\")].map(element => ({\n text: element.textContent?.trim() ?? \"\",\n href: element instanceof HTMLAnchorElement ? element.href : element.getAttribute(\"href\") ?? \"\",\n selector: element.getAttribute(\"href\") ?? \"\",\n }));\n}\n\n/** Resolves the reviewed link of a followlink or spanav step by visible text or href fragment, refusing links outside the allowed origins. */\nfunction resolvelink(step: toolstep, root: Document): { ok: true; element: HTMLAnchorElement } | { ok: false; summary: string } {\n const options = stepoptions(step);\n const allowedorigins = Array.isArray(options.allowedorigins) ? options.allowedorigins.filter((item): item is string => typeof item === \"string\") : [];\n const links = collectlinks(root);\n const matches = options.fragment === true ? matchlinkfragment(links, step.value ?? \"\") : matchlinktext(links, step.value ?? \"\");\n if (matches.length === 0) return { ok: false, summary: `No link matches the reviewed reference \"${step.value ?? \"\"}\".` };\n if (matches.length > 1) return { ok: false, summary: `The reviewed link reference matched ${matches.length} links; review a unique one.` };\n const element = [...root.querySelectorAll(\"a[href]\")].find(candidate => (candidate instanceof HTMLAnchorElement ? candidate.href : candidate.getAttribute(\"href\") ?? \"\") === matches[0]?.href);\n if (!(element instanceof HTMLAnchorElement)) return { ok: false, summary: \"The reviewed link is no longer available.\" };\n if (allowedorigins.length > 0) {\n let origin = \"\";\n try { origin = new URL(element.href).origin; } catch { origin = \"\"; }\n if (!allowedorigins.includes(origin)) return { ok: false, summary: `The reviewed link leaves the session origin grants for ${origin}.` };\n }\n return { ok: true, element };\n}\n\n/** Waits for the page load event and reports the ready state and load phase. */\nasync function runwaitload(step: toolstep): Promise<stepresult> {\n const options = stepoptions(step);\n const timeout = typeof options.timeout === \"number\" && Number.isFinite(options.timeout) && options.timeout > 0 ? options.timeout : 0;\n const started = Date.now();\n for (;;) {\n const phase = loadphase(document.readyState);\n if (phase === \"complete\") return { ok: true, summary: `The page load event fired and the document is complete after ${Date.now() - started} milliseconds.`, details: { phase, readystate: document.readyState, waited: Date.now() - started } };\n if (timeout > 0 && Date.now() - started >= timeout) return { ok: false, summary: `The page did not reach the complete load phase within the reviewed timeout of ${timeout} milliseconds.`, details: { phase, readystate: document.readyState, waited: Date.now() - started } };\n await wait(50);\n }\n}\n\n/** Waits until the current url matches the reviewed urlpattern. */\nasync function runwaiturl(step: toolstep): Promise<stepresult> {\n const options = stepoptions(step);\n const pattern = parseurlpattern(step);\n if (!pattern) return { ok: false, summary: \"A reviewed urlpattern is required.\" };\n const timeout = typeof options.timeout === \"number\" && Number.isFinite(options.timeout) && options.timeout > 0 ? options.timeout : 0;\n const poll = typeof options.poll === \"number\" && Number.isFinite(options.poll) && options.poll > 0 ? options.poll : 100;\n const started = Date.now();\n for (;;) {\n if (urlmatches(location.href, pattern)) return { ok: true, summary: `The url matched the reviewed ${pattern.mode} pattern after ${Date.now() - started} milliseconds.`, details: { url: location.href, mode: pattern.mode, waited: Date.now() - started } };\n if (timeout > 0 && Date.now() - started >= timeout) return { ok: false, summary: `The url did not match the reviewed ${pattern.mode} pattern within the reviewed timeout of ${timeout} milliseconds.`, details: { url: location.href, mode: pattern.mode, waited: Date.now() - started } };\n await wait(poll);\n }\n}\n\n/** Follows one reviewed link, reporting the href travelled to. */\nasync function runfollowlink(step: toolstep, root: Document): Promise<stepresult> {\n const resolution = resolvelink(step, root);\n if (!resolution.ok) return { ok: false, summary: resolution.summary };\n const href = resolution.element.href;\n resolution.element.click();\n return { ok: true, summary: `Followed the reviewed link to ${href}.`, details: { href } };\n}\n\n/** Navigates a single page app by clicking the reviewed control and waiting for the route change without a reload. */\nasync function runspanav(step: toolstep, root: Document): Promise<stepresult> {\n const options = stepoptions(step);\n const resolution = resolvelink(step, root);\n if (!resolution.ok) return { ok: false, summary: resolution.summary };\n const timeout = typeof options.timeout === \"number\" && Number.isFinite(options.timeout) && options.timeout > 0 ? options.timeout : 0;\n const pattern = parseurlpattern(step, \"routepattern\");\n const before = location.href;\n resolution.element.click();\n const started = Date.now();\n for (;;) {\n const changed = spauroutechanged(before, location.href);\n const matched = pattern ? urlmatches(location.href, pattern) : changed;\n if (matched) return { ok: true, summary: `The single page app route changed to ${location.href} without a reload.`, details: { from: before, to: location.href, waited: Date.now() - started } };\n if (timeout > 0 && Date.now() - started >= timeout) return { ok: false, summary: `The single page app route did not change within the reviewed timeout of ${timeout} milliseconds.`, details: { from: before, to: location.href, waited: Date.now() - started } };\n await wait(50);\n }\n}\n\n/** Waits for a url change inside a single page app without a reload, through popstate, hashchange and history polling. */\nasync function runspawait(step: toolstep): Promise<stepresult> {\n const options = stepoptions(step);\n const timeout = typeof options.timeout === \"number\" && Number.isFinite(options.timeout) && options.timeout > 0 ? options.timeout : 0;\n const poll = typeof options.poll === \"number\" && Number.isFinite(options.poll) && options.poll > 0 ? options.poll : 100;\n const pattern = parseurlpattern(step);\n const before = location.href;\n const started = Date.now();\n let detected = false;\n const onroute = (): void => { if (spauroutechanged(before, location.href)) detected = true; };\n window.addEventListener(\"popstate\", onroute);\n window.addEventListener(\"hashchange\", onroute);\n try {\n for (;;) {\n if (pattern ? urlmatches(location.href, pattern) : detected || spauroutechanged(before, location.href)) {\n return { ok: true, summary: `The single page app url changed to ${location.href} without a reload.`, details: { from: before, to: location.href, waited: Date.now() - started } };\n }\n if (timeout > 0 && Date.now() - started >= timeout) return { ok: false, summary: `The single page app url did not change within the reviewed timeout of ${timeout} milliseconds.`, details: { from: before, to: location.href, waited: Date.now() - started } };\n await wait(poll);\n }\n } finally {\n window.removeEventListener(\"popstate\", onroute);\n window.removeEventListener(\"hashchange\", onroute);\n }\n}\n\n/** Reads and rewrites the query parameters of the current url with pushstate, reporting the parameters read and the new url. */\nfunction runrewritequery(step: toolstep): stepresult {\n const options = stepoptions(step);\n const set: Record<string, string> = {};\n if (options.set && typeof options.set === \"object\" && !Array.isArray(options.set)) {\n for (const [name, value] of Object.entries(options.set as Record<string, unknown>)) if (typeof value === \"string\") set[name] = value;\n }\n const remove = Array.isArray(options.remove) ? options.remove.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const outcome = rewritequeryurl(location.href, set, remove);\n history.pushState(history.state, document.title, outcome.url);\n return { ok: true, summary: `Rewrote ${outcome.set.length + outcome.removed.length} query parameter${outcome.set.length + outcome.removed.length === 1 ? \"\" : \"s\"}; the url is now ${outcome.url}.`, details: { url: outcome.url, before: outcome.before, after: outcome.after, set: outcome.set, removed: outcome.removed } };\n}\n\n/** Sets the reviewed url fragment and scrolls to its anchor with smooth behavior. */\nasync function runsetfragment(step: toolstep): Promise<stepresult> {\n const fragment = (step.value ?? \"\").replace(/^#/, \"\");\n if (!fragment) return { ok: false, summary: \"A reviewed fragment is required.\" };\n const url = fragmenturl(location.href, fragment);\n history.pushState(history.state, document.title, url);\n const anchor = document.getElementById(fragment);\n anchor?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n return { ok: true, summary: `Set the url fragment to ${fragment} and scrolled to its anchor.`, details: { url, fragment, anchored: Boolean(anchor) } };\n}\n\n/** Stops a pending navigation by halting the document load. */\nfunction runstopnav(): stepresult {\n window.stop();\n return { ok: true, summary: \"Stopped the pending navigation of the page.\" };\n}\n\n/** Prefetches the reviewed urls by injecting prefetch hints into the document head. */\nfunction runprefetch(step: toolstep): stepresult {\n const options = stepoptions(step);\n const urls = Array.isArray(options.urls) ? options.urls.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n if (urls.length === 0) return { ok: false, summary: \"A reviewed list of prefetch urls is required.\" };\n for (const url of urls) {\n const hint = document.createElement(\"link\");\n hint.rel = \"prefetch\";\n hint.href = url;\n document.head.append(hint);\n }\n return { ok: true, summary: `Queued ${urls.length} prefetch hint${urls.length === 1 ? \"\" : \"s\"}.`, details: { urls } };\n}\n\n/** Preconnects to the reviewed origins by injecting preconnect hints into the document head. */\nfunction runpreconnect(step: toolstep): stepresult {\n const options = stepoptions(step);\n const origins = Array.isArray(options.origins) ? options.origins.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n if (origins.length === 0) return { ok: false, summary: \"A reviewed list of preconnect origins is required.\" };\n for (const origin of origins) {\n const hint = document.createElement(\"link\");\n hint.rel = \"preconnect\";\n hint.href = origin;\n document.head.append(hint);\n }\n return { ok: true, summary: `Opened ${origins.length} preconnect hint${origins.length === 1 ? \"\" : \"s\"}.`, details: { origins } };\n}\n\n/** Prints the page through the browser print pipeline; the artifact routing happens in the background. */\nfunction runprintpdf(): stepresult {\n window.print();\n return { ok: true, summary: \"Sent the page to the browser print pipeline.\" };\n}\n\n/** Runs one reviewed page navigation kind inside the page world. */\nexport function runpagenav(step: toolstep, root: Document = document): stepresult | Promise<stepresult> {\n switch (step.kind) {\n case \"waitload\": return runwaitload(step);\n case \"waiturl\": return runwaiturl(step);\n case \"followlink\": return runfollowlink(step, root);\n case \"spanav\": return runspanav(step, root);\n case \"spawait\": return runspawait(step);\n case \"rewritequery\": return runrewritequery(step);\n case \"setfragment\": return runsetfragment(step);\n case \"stopnav\": return runstopnav();\n case \"prefetch\": return runprefetch(step);\n case \"preconnect\": return runpreconnect(step);\n case \"printpdf\": return runprintpdf();\n default: return { ok: false, summary: \"Unsupported navigation action.\" };\n }\n}\n", "import type { authrecord, curatedlink, redirectchain, redirecthop, ratelimit, ratelimitstate, safetyverdict, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\n\n/**\n * Navigation network state logics for reviewed steps.\n * Every correlated rule for redirect chain assembly, http error and interstitial classification, per domain rate limit windows, url safety verdicts, curated batch lists, prefetch verification, preconnect origins and basic auth credential gating lives in this file.\n */\n\n/** One navigation watch event as observed from browser navigation listeners, serializable for fixtures. */\nexport interface navwatchevent {\n event: \"beforenavigate\" | \"committed\" | \"completed\" | \"error\" | \"urlchange\";\n url: string;\n timestamp: number;\n status?: number;\n redirect?: boolean;\n error?: string;\n}\n\n/** Assembles one redirect chain from navigation watch events: successive url changes become hops with statuses and timing, and the chain closes on completion or error. */\nexport function buildredirectchain(events: navwatchevent[]): redirectchain {\n const hops: redirecthop[] = [];\n let startedat = 0;\n let endedat = 0;\n let open = false;\n for (const event of events) {\n if (event.event === \"beforenavigate\") {\n hops.length = 0;\n startedat = event.timestamp;\n endedat = event.timestamp;\n open = true;\n hops.push({ url: event.url, status: event.status ?? 0, at: event.timestamp });\n continue;\n }\n if (!open) continue;\n endedat = event.timestamp;\n if (event.event === \"urlchange\" || event.redirect || (event.event === \"committed\" && hops[hops.length - 1]?.url !== event.url)) {\n if (hops[hops.length - 1]?.url === event.url && typeof event.status === \"number\") hops[hops.length - 1] = { url: event.url, status: event.status, at: event.timestamp };\n else hops.push({ url: event.url, status: event.status ?? 0, at: event.timestamp });\n continue;\n }\n if (event.event === \"committed\" && typeof event.status === \"number\" && hops[hops.length - 1]) {\n hops[hops.length - 1] = { url: event.url, status: event.status, at: event.timestamp };\n continue;\n }\n if (event.event === \"completed\" || event.event === \"error\") {\n if (event.event === \"completed\" && hops[hops.length - 1] && hops[hops.length - 1]?.url !== event.url) hops.push({ url: event.url, status: event.status ?? 200, at: event.timestamp });\n if (event.event === \"completed\" && typeof event.status === \"number\" && hops[hops.length - 1]) hops[hops.length - 1] = { url: event.url, status: event.status, at: event.timestamp };\n open = false;\n }\n }\n return { hops, startedat, endedat: endedat || startedat };\n}\n\n/** Returns the final url of a redirect chain: the url of its last hop. */\nexport function finalurl(chain: redirectchain): string {\n return chain.hops[chain.hops.length - 1]?.url ?? \"\";\n}\n\n/** Counts the redirect hops of a chain, ignoring the first and the final urls when no intermediary hop exists. */\nexport function redirectcount(chain: redirectchain): number {\n return Math.max(0, chain.hops.length - 1);\n}\n\n/** Classifies a navigation url change: a full load, a spa route change without reload, a reload or no change. */\nexport function classifynavchange(previousurl: string, currenturl: string, status: string | undefined): \"load\" | \"route\" | \"reload\" | \"none\" {\n if (previousurl === currenturl) return status === \"loading\" ? \"reload\" : \"none\";\n try {\n if (new URL(previousurl).origin !== new URL(currenturl).origin) return \"load\";\n } catch { return \"load\"; }\n return status === \"loading\" ? \"load\" : \"route\";\n}\n\n/** One classified http state of a navigation: http error, offline and certificate interstitial flags with reasons. */\nexport interface httpstate {\n httperror: boolean;\n offline: boolean;\n certificate: boolean;\n reasons: string[];\n}\n\n/** Detects the http error, offline and certificate interstitial states from the offline flag, error strings and observed statuses. */\nexport function detecthttpstate(input: { offline: boolean; errors?: string[]; statuses?: number[] }): httpstate {\n const reasons: string[] = [];\n let httperror = false;\n let certificate = false;\n const errors = input.errors ?? [];\n const statuses = input.statuses ?? [];\n for (const error of errors) {\n if (/CERT|SSL|TLS|privacy bad|your connection is not private/i.test(error)) { certificate = true; httperror = true; reasons.push(`certificate interstitial: ${error}`); continue; }\n if (/ERR_NAME_NOT_RESOLVED|ERR_CONNECTION|ERR_TIMED_OUT|ERR_INTERNET_DISCONNECTED|ERR_ADDRESS_UNREACHABLE|ERR_NETWORK/i.test(error)) { httperror = true; reasons.push(`network error: ${error}`); continue; }\n httperror = true;\n reasons.push(`navigation error: ${error}`);\n }\n for (const status of statuses) {\n if (status >= 400 && status < 600) { httperror = true; reasons.push(`http status ${status}`); }\n }\n if (input.offline) reasons.push(\"browser reports offline\");\n return { httperror, offline: input.offline, certificate, reasons };\n}\n\n/** Applies the certificate interstitial policy: interstitials are reported for review, never bypassed. */\nexport function interstitialpolicy(state: httpstate): { interstitial: boolean; bypass: boolean; guidance: string } {\n if (state.certificate) return { interstitial: true, bypass: false, guidance: \"A certificate interstitial was detected; Devthink reports it for review and never bypasses it.\" };\n if (state.httperror) return { interstitial: true, bypass: false, guidance: \"An http error state was detected and is reported for review.\" };\n return { interstitial: false, bypass: false, guidance: \"No interstitial was detected.\" };\n}\n\n/** Reads the reviewed ratelimit of a navrate step; null when the step reviews none. */\nexport function parseratelimit(step: toolstep): ratelimit | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options.ratelimit;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const limit = value as Record<string, unknown>;\n const window = typeof limit.window === \"number\" && Number.isFinite(limit.window) && limit.window > 0 ? limit.window : 0;\n const ceiling = typeof limit.ceiling === \"number\" && Number.isInteger(limit.ceiling) && limit.ceiling >= 1 ? limit.ceiling : 0;\n if (window <= 0 || ceiling < 1) return null;\n const domain = typeof limit.domain === \"string\" && limit.domain.trim() ? limit.domain.trim() : \"\";\n return { domain, window, ceiling };\n}\n\n/** Reads the domain of a url for rate limit accounting. */\nexport function domainof(url: string): string {\n try { return new URL(url).hostname; } catch { return \"\"; }\n}\n\n/** Returns the live rate limit window state of one domain, opening a fresh window when the reviewed window has elapsed. */\nexport function ratewindow(state: ratelimitstate | undefined, limit: ratelimit, now: number): ratelimitstate {\n if (state && state.domain === limit.domain && state.limit.window === limit.window && state.limit.ceiling === limit.ceiling && now < state.openedat + limit.window) return state;\n return { domain: limit.domain, limit, openedat: now, count: 0 };\n}\n\n/** Decides whether one more navigation fits inside the reviewed per domain rate limit window. */\nexport function rateallows(state: ratelimitstate, now: number): { allowed: boolean; remaining: number; retryafter: number } {\n const elapsed = now - state.openedat;\n const remaining = Math.max(0, state.limit.ceiling - state.count);\n const retryafter = Math.max(0, state.limit.window - elapsed);\n return { allowed: remaining > 0, remaining, retryafter };\n}\n\n/** Records one navigation hit inside the live rate limit window of a domain. */\nexport function recordratehit(state: ratelimitstate, now: number): ratelimitstate {\n return { ...state, count: state.count + 1, ...(state.count + 1 === 1 ? { openedat: now } : {}) };\n}\n\n/** Verifies one url for safety: HTTPS only, no embedded credentials and no private network or raw ip targets. */\nexport function checksafe(url: string): safetyverdict {\n const reasons: string[] = [];\n let safe = true;\n let parsed: URL;\n try { parsed = new URL(url); } catch { return { url, safe: false, reasons: [\"the url does not parse\"], at: 0 }; }\n if (parsed.protocol !== \"https:\") { safe = false; reasons.push(\"the url must use HTTPS\"); }\n if (parsed.username || parsed.password) { safe = false; reasons.push(\"the url carries embedded credentials\"); }\n const host = parsed.hostname.toLowerCase();\n const privatelist = [\"localhost\", \"127.0.0.1\", \"0.0.0.0\", \"::1\", \"[::1]\"];\n if (privatelist.includes(host) || /^10\\./.test(host) || /^192\\.168\\./.test(host) || /^172\\.(1[6-9]|2\\d|3[01])\\./.test(host) || /^169\\.254\\./.test(host)) { safe = false; reasons.push(`the host ${host} is a private network target`); }\n if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(host) || /^\\[?[0-9a-f:]+\\]?$/i.test(host)) { safe = false; reasons.push(`the host ${host} is a raw address without a domain`); }\n return { url, safe, reasons, at: 0 };\n}\n\n/** Builds the curated link list of a batchopen step from per url safety verdicts. */\nexport function curatelinks(urls: string[], verifier: (url: string) => safetyverdict): curatedlink[] {\n return urls.map(url => {\n const verdict = verifier(url);\n return { url, verdict: verdict.safe ? \"safe\" : \"unsafe\", reasons: verdict.reasons };\n });\n}\n\n/** Splits a curated link list into the urls batch opening may open and the unsafe ones it refuses. */\nexport function batchopenset(links: curatedlink[]): { open: string[]; refused: Array<{ url: string; reasons: string[] }> } {\n const open: string[] = [];\n const refused: Array<{ url: string; reasons: string[] }> = [];\n for (const link of links) {\n if (link.verdict === \"safe\") open.push(link.url);\n else refused.push({ url: link.url, reasons: link.reasons });\n }\n return { open, refused };\n}\n\n/** Verifies prefetch candidates against the session grants: only granted urls may be prefetched. */\nexport function prefetchcandidates(urls: string[], grants: string[]): { allowed: string[]; refused: string[] } {\n const allowed: string[] = [];\n const refused: string[] = [];\n for (const url of urls) {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { refused.push(url); continue; }\n if (grants.includes(origin)) allowed.push(url);\n else refused.push(url);\n }\n return { allowed, refused };\n}\n\n/** Deduplicates the preconnect origins of one preconnect step. */\nexport function preconnectorigins(origins: string[]): string[] {\n return [...new Set(origins.map(origin => origin.trim()).filter(Boolean))];\n}\n\n/** Finds the reviewed basic auth credentials of one origin; the auth flow refuses to run without them. */\nexport function authfor(auths: authrecord[], url: string): authrecord | undefined {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { return undefined; }\n return auths.find(record => record.origin === origin);\n}\n", "import type { fielderror, fieldkind, fieldmatch, formrecord, formentry, formreport, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { clean, elementlabel as label, elementselector as selector } from \"./pageresolve.js\";\n\n/**\n * Form field logics for reviewed steps.\n * Every correlated rule for field matching, field kind classification, seeded value generation, native value fills, honeypot detection, login and template detection, error association and form record parsing lives in this file.\n */\n\n/** One serializable form field shape resolved against the page controls. */\nexport interface fieldshape {\n selector: string;\n tag: string;\n type: string;\n name: string;\n label: string;\n placeholder: string;\n arialabel: string;\n autocomplete: string;\n options?: string[];\n}\n\n/** One surveyed field shape carrying the visibility, geometry and timing evidence the honeypot detector reads. */\nexport interface fieldsurvey extends fieldshape {\n hidden: boolean;\n offscreen: boolean;\n createdat?: number;\n}\n\n/** One honeypot field flagged by hidden, offscreen or time trap evidence. */\nexport interface honeypotevidence {\n selector: string;\n reason: \"hidden\" | \"offscreen\" | \"timetrap\";\n}\n\n/** One surveyed field with the aria describedby ref and the sibling message texts the error reader associates. */\nexport interface errorcontext extends fieldshape {\n describedby?: string;\n siblings: string[];\n}\n\n/** Resolves controls by label, placeholder, aria label and name attributes; matches are case insensitive substrings. */\nexport function matchfield(fields: fieldshape[], match: fieldmatch): fieldshape[] {\n const key = match.mode === \"label\" ? \"label\" : match.mode === \"placeholder\" ? \"placeholder\" : match.mode === \"arialabel\" ? \"arialabel\" : \"name\";\n const needle = (match[key] ?? \"\").trim().toLowerCase();\n if (!needle) return [];\n return fields.filter(field => {\n const primary = (field[key] as string).toLowerCase();\n const secondary = match.mode === \"label\" || match.mode === \"name\" ? field.name.toLowerCase() : match.mode === \"placeholder\" ? field.arialabel.toLowerCase() : field.placeholder.toLowerCase();\n return primary.includes(needle) || secondary.includes(needle);\n });\n}\n\n/** Infers the field kind of one control from its input type, autocomplete hint and label text. */\nexport function classifyfield(input: { type: string; autocomplete: string; label: string }): fieldkind {\n const type = input.type.toLowerCase();\n const autocomplete = input.autocomplete.toLowerCase();\n const label = input.label.toLowerCase();\n if (type === \"password\") return \"password\";\n if (autocomplete.startsWith(\"cc-\") || label.includes(\"card number\") || label.includes(\"credit card\") || label.includes(\"cardholder\")) return \"card\";\n if (autocomplete.includes(\"one-time-code\") || autocomplete.includes(\"otp\") || label.includes(\"one time code\") || label.includes(\"verification code\") || label.includes(\"otp\")) return \"code\";\n if (type === \"email\" || autocomplete.includes(\"email\") || label.includes(\"email\")) return \"email\";\n if (type === \"tel\" || autocomplete.includes(\"tel\") || label.includes(\"phone\") || label.includes(\"telephone\")) return \"phone\";\n if (type === \"date\") return \"date\";\n if (type === \"number\") return \"number\";\n if (type === \"checkbox\") return \"check\";\n if (type === \"radio\") return \"radio\";\n if (type === \"file\") return \"file\";\n if (type === \"select\" || type === \"select-one\") return \"select\";\n return \"text\";\n}\n\nconst firstnames: Record<string, string[]> = { en: [\"alex\", \"jordan\", \"taylor\", \"morgan\", \"casey\"], pt: [\"ana\", \"bruno\", \"carla\", \"diego\", \"helena\"] };\nconst lastnames: Record<string, string[]> = { en: [\"brooks\", \"carter\", \"diaz\", \"evans\", \"reyes\"], pt: [\"alves\", \"costa\", \"lima\", \"souza\", \"moraes\"] };\n\nfunction localekey(locale: string): string {\n const normalized = locale.toLowerCase();\n if (normalized.startsWith(\"pt\")) return \"pt\";\n return \"en\";\n}\n\n/** Generates one realistic value for a field kind, deterministically seeded and locale aware for names, emails and phones. */\nexport function generatevalue(kind: fieldkind, rule: { locale?: string; seed?: number }): string {\n const seed = typeof rule.seed === \"number\" && Number.isFinite(rule.seed) ? Math.abs(Math.floor(rule.seed)) : 1;\n const names = firstnames[localekey(rule.locale ?? \"en\")] ?? firstnames.en ?? [\"alex\"];\n const surnames = lastnames[localekey(rule.locale ?? \"en\")] ?? lastnames.en ?? [\"brooks\"];\n let state = seed * 1103515245 + 12345;\n const next = (): number => { state = (state * 1103515245 + 12345) % 2147483648; return state / 2147483648; };\n const pick = <T>(items: T[]): T => items[Math.floor(next() * items.length) % items.length] ?? items[0] as T;\n const digits = (count: number): string => Array.from({ length: count }, () => String(Math.floor(next() * 10))).join(\"\");\n const person = `${pick(names)} ${pick(surnames)}`;\n switch (kind) {\n case \"email\": return `${person.replace(\" \", \".\")}${digits(2)}@example.com`;\n case \"phone\": return localekey(rule.locale ?? \"en\") === \"pt\" ? `+55 (11) 9${digits(4)}-${digits(4)}` : `+1 (555) 010-${digits(4)}`;\n case \"date\": return `${2024 + Math.floor(next() * 2)}-${String(1 + Math.floor(next() * 12)).padStart(2, \"0\")}-${String(1 + Math.floor(next() * 28)).padStart(2, \"0\")}`;\n case \"number\": return String(Math.floor(next() * 1000));\n case \"select\": return `option ${1 + Math.floor(next() * 5)}`;\n case \"check\": return next() > 0.5 ? \"true\" : \"false\";\n case \"radio\": return `choice ${1 + Math.floor(next() * 4)}`;\n case \"file\": return `sample${digits(2)}.pdf`;\n case \"password\": return `pw-${digits(6)}-${pick(names)}`;\n case \"card\": return `4111 ${digits(4)} ${digits(4)} ${digits(4)}`;\n case \"code\": return digits(6);\n default: return person;\n }\n}\n\n/** Builds a deterministic values hash of the reviewed field values a submission ticket records. */\nexport function valueshash(values: Array<{ label: string; value: string }>): string {\n const source = values.map(entry => `${entry.label}=${entry.value}`).join(\"|\");\n let hash = 5381;\n for (let index = 0; index < source.length; index += 1) hash = ((hash * 33) ^ source.charCodeAt(index)) >>> 0;\n return hash.toString(16);\n}\n\n/** Parses the reviewed structured form record of a step; null when the step reviews none or the shape is invalid. */\nexport function parseformrecord(value: unknown): formrecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n if (!Array.isArray(record.entries)) return null;\n const entries: formentry[] = [];\n for (const item of record.entries) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const entry = item as Record<string, unknown>;\n const match = entry.match;\n if (!match || typeof match !== \"object\" || Array.isArray(match)) continue;\n const shapes = match as Record<string, unknown>;\n if (typeof shapes.mode !== \"string\") continue;\n const fieldmatch: fieldmatch = {\n mode: shapes.mode as fieldmatch[\"mode\"],\n ...(typeof shapes.label === \"string\" ? { label: shapes.label } : {}),\n ...(typeof shapes.placeholder === \"string\" ? { placeholder: shapes.placeholder } : {}),\n ...(typeof shapes.arialabel === \"string\" ? { arialabel: shapes.arialabel } : {}),\n ...(typeof shapes.name === \"string\" ? { name: shapes.name } : {}),\n };\n if (typeof entry.kind !== \"string\" || typeof entry.value !== \"string\") continue;\n entries.push({ match: fieldmatch, kind: entry.kind as fieldkind, value: entry.value });\n }\n if (entries.length === 0) return null;\n return { ...(typeof record.form === \"string\" && record.form ? { form: record.form } : {}), entries };\n}\n\n/** Builds form record entries from reviewed label or placeholder value pairs. */\nexport function pairentries(pairs: Array<{ label?: string; placeholder?: string; value: string }>, mode: \"label\" | \"placeholder\"): formrecord {\n return { entries: pairs.map(pair => ({ match: mode === \"label\" ? { mode, label: pair.label ?? \"\" } : { mode, placeholder: pair.placeholder ?? \"\" }, kind: \"text\", value: pair.value })) };\n}\n\n/** One fill operation outcome: the entry, the matched control, the honeypot skip flag or the refusal reason. */\nexport interface filloutcome {\n entry: formentry;\n matched?: fieldshape;\n skipped?: boolean;\n reason?: string;\n}\n\n/** Resolves every entry of a form record against the surveyed fields, skipping honeypots and refusing unmatched or ambiguous entries. */\nexport function filloperations(record: formrecord, fields: fieldshape[], skippedselectors: string[] = []): filloutcome[] {\n return record.entries.map(entry => {\n const matches = matchfield(fields, entry.match);\n if (matches.length === 0) return { entry, reason: \"unmatched\" };\n if (matches.length > 1) return { entry, reason: \"ambiguous\" };\n const matched = matches[0] as fieldshape;\n if (skippedselectors.includes(matched.selector)) return { entry, matched, skipped: true };\n return { entry, matched };\n });\n}\n\n/** Masks one card segment so side panels can render card fills without exposing the full value. */\nexport function cardmask(value: string): string {\n const trimmed = value.trim();\n if (/^\\d[\\d\\s-]{11,18}$/.test(trimmed)) {\n const compact = trimmed.replace(/[\\s-]/g, \"\");\n const last = compact.slice(-4);\n return `${\"\u2022\".repeat(Math.max(0, compact.length - 4))}${last}`;\n }\n return \"\u2022\".repeat(trimmed.length);\n}\n\n/** Flags hidden, offscreen and time trap fields so fill steps skip them instead of tripping anti bot defenses. */\nexport function detecthoneypots(surveys: fieldsurvey[], loadedat: number): honeypotevidence[] {\n const traps: honeypotevidence[] = [];\n for (const field of surveys) {\n if (field.hidden) traps.push({ selector: field.selector, reason: \"hidden\" });\n else if (field.offscreen) traps.push({ selector: field.selector, reason: \"offscreen\" });\n else if (field.createdat !== undefined && loadedat > 0 && field.createdat > loadedat) traps.push({ selector: field.selector, reason: \"timetrap\" });\n }\n return traps;\n}\n\n/** Detects a login form: a password field plus an identifier field with session links nearby. */\nexport function detectlogin(fields: fieldshape[], links: string[]): { login: boolean; markers: string[] } {\n const markers: string[] = [];\n const password = fields.find(field => classifyfield(field) === \"password\");\n if (password) markers.push(\"password field\");\n const identifier = fields.find(field => {\n const kind = classifyfield(field);\n return kind === \"email\" || (kind === \"text\" && /user|login|account|identifier/i.test(`${field.name} ${field.label}`));\n });\n if (identifier) markers.push(\"identifier field\");\n const sessionlink = links.some(link => /sign in|log in|log on|forgot|create account|sign up/i.test(link));\n if (sessionlink) markers.push(\"session link\");\n return { login: Boolean(password && identifier && sessionlink), markers };\n}\n\nconst signupmarkers = [\"sign up\", \"create account\", \"register\", \"confirm password\", \"terms\"];\nconst checkoutmarkers = [\"checkout\", \"payment\", \"billing\", \"shipping\", \"card number\", \"place order\", \"cart\"];\n\n/** Detects signup and checkout templates by matching the field labels, autocompletes and page text against known markers. */\nexport function detecttemplate(fields: fieldshape[], text: string): { template: \"signup\" | \"checkout\" | \"unknown\"; markers: string[] } {\n const corpus = [text, ...fields.map(field => `${field.label} ${field.name} ${field.placeholder} ${field.arialabel} ${field.autocomplete}`)].join(\" \").toLowerCase();\n const signup = signupmarkers.filter(marker => corpus.includes(marker));\n const checkout = checkoutmarkers.filter(marker => corpus.includes(marker));\n if (signup.length >= 2 && signup.length >= checkout.length) return { template: \"signup\", markers: signup };\n if (checkout.length >= 2) return { template: \"checkout\", markers: checkout };\n return { template: \"unknown\", markers: [...signup, ...checkout] };\n}\n\n/** Associates validation messages with fields through aria describedby refs and the sibling text next to each field. */\nexport function associateerrors(contexts: errorcontext[], messages: Array<{ id?: string; text: string }>): fielderror[] {\n const errors: fielderror[] = [];\n for (const field of contexts) {\n const byref = field.describedby ? messages.find(message => message.id === field.describedby && message.text.trim()) : undefined;\n if (byref) { errors.push({ field: field.selector, message: byref.text.trim() }); continue; }\n const sibling = field.siblings.map(text => text.trim()).find(text => text.length > 0);\n if (sibling) errors.push({ field: field.selector, message: sibling });\n }\n return errors;\n}\n\n/** Resolves one reviewed artifact name against the run store before a file input is filled. */\nexport function attachplan(name: string, artifacts: Array<{ id: string; name: string; kind: string }>): { artifact?: { id: string; name: string; kind: string }; reason?: string } {\n const artifact = artifacts.find(item => item.name === name || item.id === name);\n if (!artifact) return { reason: \"The reviewed artifact name is not part of the run store.\" };\n return { artifact };\n}\n\n/** Selectors the captcha detector probes; a hit hands control back to the user instead of forcing the page. */\nexport const captchamarkers = ['iframe[src*=\"recaptcha\"]', 'iframe[title*=\"recaptcha\" i]', '.g-recaptcha', '[data-sitekey]', 'iframe[title*=\"captcha\" i]', '.h-captcha'];\n\n/** True when any captcha marker matched, so the plan pauses and hands control to the user. */\nexport function captchadetected(matched: string[]): boolean {\n return matched.length > 0;\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\n/** Fills one control through the native setter with input and change events; checks, radios and selects use their own grammar. */\nexport function fillcontrol(element: Element, entry: formentry): boolean {\n if (element instanceof HTMLInputElement && (entry.kind === \"check\" || element.type === \"checkbox\")) { element.checked = entry.value === \"true\" || entry.value === \"on\" || entry.value === \"checked\"; events(element); return true; }\n if (element instanceof HTMLInputElement && (entry.kind === \"radio\" || element.type === \"radio\")) { element.checked = true; events(element); return true; }\n if (element instanceof HTMLSelectElement) {\n const option = [...element.options].find(candidate => candidate.value === entry.value || candidate.textContent?.trim() === entry.value);\n if (!option) return false;\n element.value = option.value;\n events(element);\n return true;\n }\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n if (element instanceof HTMLInputElement && element.type === \"file\") return false;\n element.focus();\n const setter = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element), \"value\")?.set;\n if (setter) setter.call(element, entry.value); else element.value = entry.value;\n events(element);\n return true;\n }\n return false;\n}\n\nfunction controlshape(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): fieldshape {\n return {\n selector: selector(element),\n tag: element.tagName.toLowerCase(),\n type: element instanceof HTMLSelectElement ? \"select\" : element.getAttribute(\"type\") || \"text\",\n name: element.getAttribute(\"name\") || \"\",\n label: label(element),\n placeholder: element.getAttribute(\"placeholder\") || \"\",\n arialabel: element.getAttribute(\"aria-label\") || \"\",\n autocomplete: element.getAttribute(\"autocomplete\") || \"\",\n ...(element instanceof HTMLSelectElement ? { options: [...element.options].map(option => option.value) } : {}),\n };\n}\n\n/** Collects the serializable field shapes of one form scope; absent scopes survey the whole document. */\nfunction collectfields(root: Document, formscope?: string): Array<{ shape: fieldshape; element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement }> {\n const scope = formscope ? root.querySelector(formscope) : root;\n if (!scope) return [];\n const controls = [...scope.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\"input, select, textarea\")];\n return controls.filter(element => element.type !== \"hidden\").map(element => ({ shape: controlshape(element), element }));\n}\n\n/** Surveys the visibility and geometry evidence the honeypot detector reads for one form scope. */\nfunction surveyfields(root: Document, formscope?: string): Array<{ survey: fieldsurvey; element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement }> {\n const viewport = { left: 0, top: 0, right: window.innerWidth || 0, bottom: window.innerHeight || 0 };\n return collectfields(root, formscope).map(({ shape, element }) => {\n const rect = element.getBoundingClientRect();\n const hidden = element.getAttribute(\"aria-hidden\") === \"true\" || element.tabIndex < 0 && (element as HTMLElement).offsetParent === null || (element as HTMLElement).offsetParent === null && rect.width === 0 && rect.height === 0;\n const offscreen = rect.width > 0 && rect.height > 0 && (rect.bottom < viewport.top || rect.top > viewport.bottom || rect.right < viewport.left || rect.left > viewport.right);\n return { survey: { ...shape, hidden, offscreen }, element };\n });\n}\n\n/** Reads the error context of one form scope: describedby refs and the sibling texts after each field. */\nfunction collecterrorcontext(root: Document, formscope?: string): Array<{ context: errorcontext; element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement }> {\n return collectfields(root, formscope).map(({ shape, element }) => {\n const siblings: string[] = [];\n let neighbor = element.nextElementSibling;\n for (let index = 0; neighbor && index < 3; index += 1) {\n const text = clean(neighbor.textContent || \"\");\n if (text && text !== shape.label) siblings.push(text);\n neighbor = neighbor.nextElementSibling;\n }\n const describedby = element.getAttribute(\"aria-describedby\");\n return { context: { ...shape, ...(describedby ? { describedby } : {}), siblings }, element };\n });\n}\n\n/** Runs one reviewed forms and data step inside the page: fills, surveys, detects and reads errors without leaving the form scope. */\nexport function runpageform(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 const formscope = typeof options.form === \"string\" && options.form ? options.form : step.target;\n switch (step.kind) {\n case \"fillform\": {\n const record = parseformrecord(options.formrecord);\n if (!record) return { ok: false, summary: \"A reviewed form record with entries is required in options.\" };\n const surveys = surveyfields(root, record.form);\n const honeypots = detecthoneypots(surveys.map(entry => entry.survey), 0);\n const operations = filloperations(record, surveys.map(entry => entry.survey), honeypots.map(trap => trap.selector));\n let filled = 0;\n const skipped: string[] = [];\n const failures: string[] = [];\n const values: Array<{ label: string; value: string }> = [];\n for (const operation of operations) {\n if (operation.skipped && operation.matched) { skipped.push(operation.matched.selector); continue; }\n if (!operation.matched) { failures.push(`${operation.reason}: ${operation.entry.match.label ?? operation.entry.match.name ?? operation.entry.match.placeholder ?? \"field\"}`); continue; }\n const element = surveys.find(entry => entry.survey.selector === operation.matched?.selector)?.element;\n if (!element || !fillcontrol(element, operation.entry)) { failures.push(`unfillable: ${operation.matched.selector}`); continue; }\n filled += 1;\n values.push({ label: operation.matched.label || operation.matched.name, value: operation.entry.kind === \"password\" ? \"\" : operation.entry.value });\n }\n const report: formreport = { form: record.form ?? \"\", fields: operations.map(operation => ({ selector: operation.matched?.selector ?? \"\", label: operation.matched?.label ?? operation.entry.match.label ?? \"\", kind: operation.entry.kind, matched: Boolean(operation.matched) })) };\n return {\n ok: failures.length === 0,\n summary: failures.length === 0 ? `Filled ${filled} reviewed field${filled === 1 ? \"\" : \"s\"} from the structured record${skipped.length > 0 ? ` and skipped ${skipped.length} honeypot field${skipped.length === 1 ? \"\" : \"s\"}` : \"\"}.` : `Filled ${filled} of ${record.entries.length} reviewed fields; ${failures.length} refusals: ${failures.join(\"; \")}.`,\n details: { filled, skipped, failures, values, report },\n };\n }\n case \"filllabel\":\n case \"fillplaceholder\": {\n const mode = step.kind === \"filllabel\" ? \"label\" : \"placeholder\";\n const pairs = Array.isArray(options.fields) ? (options.fields as Array<Record<string, unknown>>).filter(item => item && typeof item === \"object\") : [];\n const record = pairentries(pairs.map(pair => ({ label: typeof pair.label === \"string\" ? pair.label : \"\", placeholder: typeof pair.placeholder === \"string\" ? pair.placeholder : \"\", value: typeof pair.value === \"string\" ? pair.value : \"\" })), mode);\n if (record.entries.length === 0) return { ok: false, summary: \"A reviewed non-empty list of field pairs is required in options.\" };\n const surveys = surveyfields(root, formscope);\n const honeypots = detecthoneypots(surveys.map(entry => entry.survey), 0);\n const operations = filloperations(record, surveys.map(entry => entry.survey), honeypots.map(trap => trap.selector));\n let filled = 0;\n const failures: string[] = [];\n for (const operation of operations) {\n if (operation.skipped) continue;\n if (!operation.matched) { failures.push(`${operation.reason}: ${mode === \"label\" ? operation.entry.match.label : operation.entry.match.placeholder}`); continue; }\n const element = surveys.find(entry => entry.survey.selector === operation.matched?.selector)?.element;\n const refined: formentry = { ...operation.entry, kind: classifyfield(operation.matched) };\n if (!element || !fillcontrol(element, refined)) { failures.push(`unfillable: ${operation.matched.selector}`); continue; }\n filled += 1;\n }\n return { ok: failures.length === 0, summary: failures.length === 0 ? `Filled ${filled} field${filled === 1 ? \"\" : \"s\"} matched by ${mode}.` : `Filled ${filled} of ${record.entries.length} fields matched by ${mode}; ${failures.join(\"; \")}.`, details: { filled, failures, mode } };\n }\n case \"detectfields\": {\n const collected = collectfields(root, formscope);\n const report: formreport = { form: formscope ?? \"\", fields: collected.map(entry => ({ selector: entry.shape.selector, label: entry.shape.label || entry.shape.name, kind: classifyfield(entry.shape), matched: Boolean(entry.shape.label || entry.shape.name) })) };\n return { ok: true, summary: `Detected ${collected.length} form field${collected.length === 1 ? \"\" : \"s\"} with their kinds.`, details: { report, count: collected.length } };\n }\n case \"generatevalues\": {\n const rule = options.valuegen && typeof options.valuegen === \"object\" && !Array.isArray(options.valuegen) ? options.valuegen as Record<string, unknown> : {};\n const locale = typeof rule.locale === \"string\" ? rule.locale : \"en\";\n const seed = typeof rule.seed === \"number\" && Number.isFinite(rule.seed) ? rule.seed : 1;\n const surveys = surveyfields(root, formscope);\n const honeypots = detecthoneypots(surveys.map(entry => entry.survey), 0);\n const skippedselectors = new Set(honeypots.map(trap => trap.selector));\n const candidates = surveys.filter(entry => !skippedselectors.has(entry.survey.selector));\n const values = candidates.map(entry => ({ label: entry.survey.label || entry.survey.name || entry.survey.selector, kind: classifyfield(entry.survey), value: generatevalue(classifyfield(entry.survey), { locale, seed }) }));\n const single = values.length === 0 && typeof rule.kind === \"string\" ? [{ label: rule.kind, kind: rule.kind, value: generatevalue(rule.kind as fieldkind, { locale, seed }) }] : values;\n return { ok: true, summary: `Generated ${single.length} realistic value${single.length === 1 ? \"\" : \"s\"} for the detected field kinds.`, details: { values: single, locale, seed } };\n }\n case \"readerrors\": {\n const contexts = collecterrorcontext(root, formscope);\n const messages = [...root.querySelectorAll<HTMLElement>(\"[id]\")].map(element => ({ id: element.id, text: clean(element.textContent || \"\") })).filter(message => message.text.length > 0);\n const errors = associateerrors(contexts.map(entry => entry.context), messages);\n return { ok: true, summary: errors.length === 0 ? \"No validation error was found next to the reviewed fields.\" : `Collected ${errors.length} inline validation message${errors.length === 1 ? \"\" : \"s\"}.`, details: { errors, form: formscope ?? \"\" } };\n }\n case \"skiphoneypot\": {\n const surveys = surveyfields(root, formscope);\n const traps = detecthoneypots(surveys.map(entry => entry.survey), 0);\n return { ok: true, summary: traps.length === 0 ? \"No honeypot field was detected.\" : `Skipped ${traps.length} honeypot field${traps.length === 1 ? \"\" : \"s\"}: ${traps.map(trap => `${trap.selector} (${trap.reason})`).join(\", \")}.`, details: { skipped: traps } };\n }\n case \"detectlogin\": {\n const collected = collectfields(root, formscope);\n const links = [...(formscope ? root.querySelectorAll(formscope) : [root] as unknown as Element[])].flatMap(scope => [...scope.querySelectorAll(\"a[href], button\")]).map(element => clean(element.textContent || \"\"));\n const detection = detectlogin(collected.map(entry => entry.shape), links);\n return { ok: true, summary: detection.login ? `Login form detected with ${detection.markers.join(\", \")}.` : \"No login form was detected.\", details: { login: detection.login, markers: detection.markers } };\n }\n case \"detecttemplate\": {\n const collected = collectfields(root, formscope);\n const text = clean(root.body?.innerText || \"\");\n const detection = detecttemplate(collected.map(entry => entry.shape), text);\n return { ok: true, summary: detection.template === \"unknown\" ? \"No signup or checkout template was detected.\" : `${detection.template} template detected with markers ${detection.markers.join(\", \")}.`, details: { template: detection.template, markers: detection.markers } };\n }\n case \"handoffcaptcha\": {\n const matched = captchamarkers.filter(marker => root.querySelector(marker) !== null);\n return { ok: true, summary: captchadetected(matched) ? `Captcha presence detected (${matched.join(\", \")}); control hands back to the user.` : \"No captcha was detected.\", details: { captcha: captchadetected(matched), markers: matched } };\n }\n case \"asksubmit\": {\n const collected = collectfields(root, step.value || undefined);\n const values = collected.map(entry => ({ label: entry.shape.label || entry.shape.name || entry.shape.selector, value: entry.element instanceof HTMLSelectElement ? entry.element.value : (entry.element as HTMLInputElement).value }));\n return { ok: true, summary: `Read ${values.length} field value${values.length === 1 ? \"\" : \"s\"} for the submission review.`, details: { values } };\n }\n case \"submitform\": {\n const form = target instanceof HTMLFormElement ? target : target instanceof HTMLElement ? target.closest(\"form\") : null;\n if (!form) return { ok: false, summary: \"No owning form was found for the reviewed submission.\" };\n form.requestSubmit();\n return { ok: true, summary: \"Form submitted programmatically through its owning form.\" };\n }\n case \"consentpassword\": {\n if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) return { ok: false, summary: \"The reviewed password target cannot receive text.\" };\n const entry: formentry = { match: { mode: \"name\", name: target.name || target.getAttribute(\"id\") || \"\" }, kind: \"password\", value: step.value ?? \"\" };\n if (!fillcontrol(target, entry)) return { ok: false, summary: \"The password field refused the native setter fill.\" };\n return { ok: true, summary: \"Password field filled after the reviewed consent; the value never appears in the audit trail.\" };\n }\n case \"attachfile\": {\n if (!(target instanceof HTMLInputElement) || target.type !== \"file\") return { ok: false, summary: \"The reviewed target is not a file input.\" };\n const artifactname = typeof options.artifactname === \"string\" && options.artifactname ? options.artifactname : \"artifact\";\n try {\n const file = new File([new Blob([\"devthink artifact\"], { type: \"application/octet-stream\" })], artifactname);\n const transfer = new DataTransfer();\n transfer.items.add(file);\n target.files = transfer.files;\n events(target);\n return { ok: true, summary: `Artifact ${artifactname} attached to the reviewed file input.`, details: { artifact: options.artifact, artifactname } };\n } catch {\n return { ok: false, summary: \"The reviewed file input refused the artifact attachment.\" };\n }\n }\n default: return { ok: false, summary: \"Unsupported forms and data action.\" };\n }\n}\n", "import type { toolstep, wizardstate } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { cardmask } from \"./pageforms.js\";\nimport { clean } from \"./pageresolve.js\";\n\n/**\n * Wizard, dependent control and payment field logics for reviewed steps.\n * Every correlated rule for wizard tracking, dependent option waits, typeahead picks, calendar navigation, card segment typing, one time code sources and submission retry backoff lives in this file.\n */\n\n/** Advances one wizard step, recording the completion signal of the executed step and the new step index. */\nexport function wizardadvance(state: wizardstate, completed: boolean, at: number): wizardstate {\n const flags = [...state.completed];\n while (flags.length < state.index + 1) flags.push(false);\n flags[state.index] = completed;\n return { ...state, index: Math.min(state.index + 1, state.steps), completed: flags, at };\n}\n\n/** True when the dependent child options finished loading after a parent selection changed their count. */\nexport function dependentloaded(previouscount: number, currentcount: number): boolean {\n return currentcount !== previouscount;\n}\n\n/** Picks the reviewed suggestion entry from a typeahead list, case insensitive; undefined when the entry is absent. */\nexport function typeaheadpick(suggestions: string[], pick: string): string | undefined {\n const needle = pick.trim().toLowerCase();\n return suggestions.find(suggestion => suggestion.trim().toLowerCase() === needle);\n}\n\n/** Parses one reviewed yyyy-mm-dd date into its year, month and day parts; null when the form is invalid. */\nexport function parsedateparts(value: string): { year: number; month: number; day: number } | null {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return null;\n const parts = value.split(\"-\").map(part => Number.parseInt(part, 10));\n const year = parts[0] ?? 0;\n const month = parts[1] ?? 0;\n const day = parts[2] ?? 0;\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n return { year, month, day };\n}\n\n/** Plans the calendar navigation to the reviewed date: the month delta and the day cell to click. */\nexport function calendarplan(view: { year: number; month: number }, date: { year: number; month: number; day: number }): { months: number; day: number } {\n return { months: (date.year - view.year) * 12 + (date.month - view.month), day: date.day };\n}\n\n/** Splits one card number into its typed groups so the filler pauses between groups. */\nexport function cardgroups(number: string): string[] {\n const groups = number.replace(/[-\\s]+/g, \" \").trim().split(\" \");\n return groups.filter(group => group.length > 0);\n}\n\n/** True when the reviewed one time code source is ready to deliver the code before typing. */\nexport function codeready(source: string, value: string | undefined): boolean {\n if (source === \"reviewed\") return typeof value === \"string\" && value.trim().length > 0;\n return false;\n}\n\n/** One reviewed retry backoff rule with an attempt count, a wait window and a growth factor, all user configured. */\nexport interface backoffrule {\n attempts: number;\n wait: number;\n factor: number;\n}\n\n/** Parses the reviewed backoff rule of a retryform step; null when the step reviews none. */\nexport function parsebackoff(step: toolstep): backoffrule | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const backoff = options.backoff;\n if (!backoff || typeof backoff !== \"object\" || Array.isArray(backoff)) return null;\n const rule = backoff as Record<string, unknown>;\n const wait = rule.wait;\n const factor = rule.factor;\n if (typeof wait !== \"number\" || !Number.isFinite(wait) || wait <= 0) return null;\n if (typeof factor !== \"number\" || !Number.isFinite(factor) || factor < 1) return null;\n const attempts = typeof options.attempts === \"number\" && Number.isInteger(options.attempts) && options.attempts >= 1 ? options.attempts : 2;\n return { attempts, wait, factor };\n}\n\n/** Computes the reviewed backoff windows between submission retries; no code ceiling applies. */\nexport function backoffwaits(attempts: number, wait: number, factor: number): number[] {\n const windows: number[] = [];\n let current = wait;\n for (let index = 1; index < attempts; index += 1) {\n windows.push(current);\n current *= factor;\n }\n return windows;\n}\n\nfunction wait(delay: number): Promise<void> {\n return new Promise(resolve => window.setTimeout(resolve, delay));\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 wizard or payment field step inside the page, from multi step wizards to card segments and one time codes. */\nexport function runpagewizard(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 \"runwizard\": {\n const scope = target instanceof HTMLElement ? target : root.body ?? root.documentElement;\n const steps = typeof options.steps === \"number\" && Number.isInteger(options.steps) && options.steps > 0 ? options.steps : 1;\n const state: wizardstate = { index: 0, steps, completed: [], at: Date.now() };\n const next = scope.querySelector<HTMLElement>(\"button[type=submit], button[name=next], [data-next]\");\n if (!next) return { ok: false, summary: \"No next step control was found inside the wizard scope.\", details: { wizard: state } };\n next.click();\n const advanced = wizardadvance(state, true, Date.now());\n return { ok: advanced.index >= steps, summary: `Wizard advanced to step ${advanced.index + 1} of ${steps}${advanced.index >= steps ? \" and completed\" : \"\"}.`, details: { wizard: advanced } };\n }\n case \"selectchain\": {\n if (!(target instanceof HTMLSelectElement)) return { ok: false, summary: \"The reviewed parent target is not a select element.\" };\n const childselector = typeof options.child === \"string\" ? options.child : \"\";\n const child = root.querySelector<HTMLSelectElement>(childselector);\n if (!child) return { ok: false, summary: \"The reviewed dependent child control was not found.\" };\n const previouscount = child.options.length;\n const option = [...target.options].find(candidate => candidate.value === step.value || candidate.textContent?.trim() === step.value);\n if (!option) return { ok: false, summary: \"The reviewed parent option is not part of the select element.\" };\n target.value = option.value;\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true }));\n const waitwindow = typeof options.wait === \"number\" && options.wait > 0 ? options.wait : 0;\n return pollfor(() => dependentloaded(previouscount, child.options.length), \"Dependent options of the child control\", waitwindow);\n }\n case \"picktypeahead\": {\n const field = target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement ? target : null;\n if (!field) return { ok: false, summary: \"The reviewed typeahead target cannot receive text.\" };\n const pick = typeof options.pick === \"string\" ? options.pick : \"\";\n const timeout = typeof options.timeout === \"number\" && options.timeout > 0 ? options.timeout : 0;\n field.focus();\n field.value = step.value ?? \"\";\n field.dispatchEvent(new Event(\"input\", { bubbles: true }));\n const list = root.querySelector<HTMLElement>('[role=listbox], .suggestions, ul.autocomplete, [data-typeahead]');\n const suggestions = list ? [...list.querySelectorAll<HTMLElement>(\"[role=option], li, .suggestion\")].map(entry => clean(entry.textContent || \"\")) : [];\n const chosen = typeaheadpick(suggestions, pick);\n if (chosen === undefined) return { ok: false, summary: `The reviewed suggestion \"${pick}\" is not part of the typeahead list.`, details: { suggestions } };\n const entry = [...(list?.querySelectorAll<HTMLElement>(\"[role=option], li, .suggestion\") ?? [])].find(item => clean(item.textContent || \"\").trim().toLowerCase() === chosen.trim().toLowerCase());\n entry?.click();\n field.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: Boolean(entry), summary: `Picked the reviewed typeahead entry \"${chosen}\".`, details: { pick: chosen, query: step.value ?? \"\" } };\n }\n case \"pickdate\": {\n const calendar = target instanceof HTMLElement ? target : root.body ?? root.documentElement;\n const date = parsedateparts(step.value ?? \"\");\n if (!date) return { ok: false, summary: \"The reviewed date must use the yyyy-mm-dd form.\" };\n const header = clean(calendar.querySelector<HTMLElement>(\"[data-calendar-title], .calendar-title, header\")?.textContent || \"\");\n const match = /(\\d{4})/.exec(header);\n const monthnames = [\"january\", \"february\", \"march\", \"april\", \"may\", \"june\", \"july\", \"august\", \"september\", \"october\", \"november\", \"december\"];\n const viewyear = match ? Number.parseInt(match[1] ?? \"0\", 10) : new Date().getFullYear();\n const viewmonth = monthnames.findIndex(name => header.toLowerCase().includes(name)) >= 0 ? monthnames.findIndex(name => header.toLowerCase().includes(name)) : new Date().getMonth() + 1;\n const plan = calendarplan({ year: viewyear, month: viewmonth }, date);\n const forward = plan.months >= 0;\n for (let index = 0; index < Math.abs(plan.months); index += 1) {\n calendar.querySelector<HTMLElement>(forward ? \"[data-next-month], .next-month, [aria-label=next]\" : \"[data-prev-month], .prev-month, [aria-label=previous]\")?.click();\n }\n const day = [...calendar.querySelectorAll<HTMLElement>(\"[role=gridcell], [data-day], td\")].find(cell => Number.parseInt(clean(cell.textContent || \"\"), 10) === plan.day);\n if (!day) return { ok: false, summary: `The reviewed day cell ${plan.day} was not found in the calendar widget.` };\n day.click();\n return { ok: true, summary: `Picked ${step.value} from the calendar widget after ${Math.abs(plan.months)} month navigation${Math.abs(plan.months) === 1 ? \"\" : \"s\"}.`, details: { months: plan.months, day: plan.day } };\n }\n case \"fillcard\": {\n const segments = Array.isArray(options.segments) ? (options.segments as Array<Record<string, unknown>>).filter(item => item && typeof item === \"object\") : [];\n if (segments.length === 0) return { ok: false, summary: \"A reviewed non-empty list of card segments is required in options.\" };\n const pause = typeof options.pause === \"number\" && options.pause > 0 ? options.pause : 0;\n const filled: Array<{ label: string; masked: string }> = [];\n const failures: string[] = [];\n const fillsegment = async (segment: Record<string, unknown>): Promise<void> => {\n const match = segment.match as Record<string, unknown> | undefined;\n const value = typeof segment.value === \"string\" ? segment.value : \"\";\n if (!match || typeof match !== \"object\") { failures.push(\"segment without a reviewed match\"); return; }\n const scope = root.body ?? root.documentElement;\n const candidates = [...scope.querySelectorAll<HTMLInputElement>(\"input, select\")];\n const key = match.mode === \"label\" ? \"label\" : match.mode === \"placeholder\" ? \"placeholder\" : match.mode === \"arialabel\" ? \"arialabel\" : \"name\";\n const needle = String(match[key] ?? \"\").toLowerCase();\n const element = candidates.find(input => (key === \"label\" ? input.name.toLowerCase() || input.getAttribute(\"aria-label\")?.toLowerCase() || \"\" : (input.getAttribute(key) ?? input.name).toLowerCase()).includes(needle) || (input.getAttribute(\"aria-label\") ?? \"\").toLowerCase().includes(needle));\n if (!element) { failures.push(`unmatched: ${needle}`); return; }\n element.focus();\n for (const group of cardgroups(value)) {\n element.value = group;\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n if (pause > 0) await wait(pause);\n }\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n filled.push({ label: String(match[key] ?? \"\"), masked: cardmask(value) });\n };\n return (async (): Promise<stepresult> => {\n for (const segment of segments) await fillsegment(segment);\n return {\n ok: failures.length === 0,\n summary: failures.length === 0 ? `Filled ${filled.length} card segment${filled.length === 1 ? \"\" : \"s\"} with pauses between card number groups.` : `Filled ${filled.length} of ${segments.length} card segments; ${failures.join(\"; \")}.`,\n details: { segments: filled, failures, pause },\n };\n })();\n }\n case \"fillcode\": {\n const field = target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement ? target : null;\n if (!field) return { ok: false, summary: \"The reviewed one time code target cannot receive text.\" };\n const source = typeof options.source === \"string\" ? options.source : \"\";\n const timeout = typeof options.timeout === \"number\" && options.timeout > 0 ? options.timeout : 0;\n const code = step.value ?? \"\";\n return pollfor(() => codeready(source, code), \"The reviewed one time code source\", timeout).then(result => {\n if (!codeready(source, code)) return { ok: false, summary: `The reviewed code source ${source} is not ready to deliver the code yet.` };\n field.focus();\n field.value = code;\n field.dispatchEvent(new Event(\"input\", { bubbles: true }));\n field.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: true, summary: `One time code typed from the reviewed source ${source}.`, details: { source } };\n });\n }\n default: return { ok: false, summary: \"Unsupported wizard action.\" };\n }\n}\n", "import type { columnspec, datasetrow, sourceref, toolstep, transformrule } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { clean, elementselector as selector } from \"./pageresolve.js\";\n\n/**\n * Table and dataset logics for reviewed steps.\n * Every correlated rule for header normalization, span expansion, nested table walking, pagination following, row hashing, transform expressions, dataset merging, row sampling and csv, json and excel serialization lives in this file.\n */\n\n/** One raw table cell with its text, header flag, span geometry and an optional nested table. */\nexport interface cellshape {\n text: string;\n header: boolean;\n rowspan: number;\n colspan: number;\n nested?: { selector: string; rows: rowshape[] };\n}\n\n/** One raw table row of span carrying cells. */\nexport interface rowshape {\n cells: cellshape[];\n header: boolean;\n}\n\n/** One nested child table linked to the body row it belongs to. */\nexport interface childtable {\n parentrow: number;\n selector: string;\n columns: columnspec[];\n rows: datasetrow[];\n}\n\n/** Result of the table reader: normalized column specs, keyed body rows and child datasets. */\nexport interface gridresult {\n columns: columnspec[];\n rows: datasetrow[];\n children: childtable[];\n}\n\n/** Trims, lowercases and slugifies one header cell into a stable column key. */\nexport function normalizeheader(label: string): string {\n const slug = label.trim().toLowerCase().replace(/[^\\p{L}\\p{N}]+/gu, \"-\").replace(/^-+|-+$/g, \"\");\n return slug || \"column\";\n}\n\n/** Builds one column spec from a header label with a unique stable key and the normalized name. */\nexport function columnspecof(label: string, used: Set<string> = new Set()): columnspec {\n const base = normalizeheader(label);\n let key = base;\n let suffix = 2;\n while (used.has(key)) {\n key = `${base}${suffix}`;\n suffix += 1;\n }\n used.add(key);\n return { key, label: label.trim(), kind: \"text\", normalized: label.trim().toLowerCase() };\n}\n\n/** Classifies a column as number only when every non-empty value parses as a number. */\nexport function classifycolumn(values: string[]): \"text\" | \"number\" {\n const present = values.filter(value => value.trim().length > 0);\n if (present.length === 0) return \"text\";\n return present.every(value => Number.isFinite(Number(value.replace(/,/g, \".\")))) ? \"number\" : \"text\";\n}\n\n/** Expands rowspan and colspan cells into a filled rectangular grid of values. */\nexport function expandspans(rows: rowshape[]): string[][] {\n const filled: Array<Array<string | undefined>> = [];\n const pending = new Map<string, string>();\n for (let index = 0; index < rows.length; index += 1) {\n const row: Array<string | undefined> = filled[index] ?? (filled[index] = []);\n let column = 0;\n for (const cell of rows[index]!.cells) {\n while (row[column] !== undefined || pending.has(`${index},${column}`)) {\n if (row[column] === undefined) row[column] = pending.get(`${index},${column}`);\n column += 1;\n }\n row[column] = cell.text;\n for (let spanrow = 0; spanrow < Math.max(1, cell.rowspan); spanrow += 1) {\n for (let spancol = 0; spancol < Math.max(1, cell.colspan); spancol += 1) {\n if (spanrow === 0 && spancol === 0) continue;\n pending.set(`${index + spanrow},${column + spancol}`, cell.text);\n }\n }\n column += Math.max(1, cell.colspan);\n }\n }\n for (const [key, value] of pending) {\n const [rowpart, columnpart] = key.split(\",\");\n const rowindex = Number.parseInt(rowpart ?? \"0\", 10);\n const columnindex = Number.parseInt(columnpart ?? \"0\", 10);\n const target = filled[rowindex] ?? (filled[rowindex] = []);\n if (target[columnindex] === undefined) target[columnindex] = value;\n }\n const width = filled.reduce((largest, row) => Math.max(largest, row.length), 0);\n return filled.map(row => Array.from({ length: width }, (_, column) => row[column] ?? \"\"));\n}\n\n/** Reads header and body rows into normalized column specs and keyed body rows, extracting nested tables into child datasets. */\nexport function readgrid(rows: rowshape[]): gridresult {\n const headerindex = rows.findIndex(row => row.header || (row.cells[0]?.header ?? false));\n const useheader = headerindex !== -1 ? headerindex : 0;\n const hasheader = headerindex !== -1 || rows.length > 0;\n const grid = expandspans(rows);\n const headercells = hasheader ? (grid[useheader] ?? []) : [];\n const used = new Set<string>();\n const columns = Array.from({ length: headercells.length || (grid[0]?.length ?? 0) }, (_, index) => columnspecof(headercells[index] ?? `column${index + 1}`, used));\n const bodyrows = grid.filter((_, index) => hasheader ? index !== useheader : true)\n .filter(line => line.some(value => value.trim().length > 0))\n .map(line => {\n const row: datasetrow = {};\n columns.forEach((column, index) => { row[column.key] = line[index] ?? \"\"; });\n return row;\n });\n for (const column of columns) column.kind = classifycolumn(bodyrows.map(row => row[column.key] ?? \"\"));\n const children: childtable[] = [];\n rows.forEach((row, rowindex) => {\n if (hasheader && rowindex === useheader) return;\n const parentrow = hasheader && rowindex > useheader ? rowindex - 1 : rowindex;\n row.cells.forEach(cell => {\n if (!cell.nested) return;\n const child = readgrid(cell.nested.rows);\n children.push({ parentrow, selector: cell.nested!.selector, columns: child.columns, rows: child.rows });\n });\n });\n return { columns, rows: bodyrows, children };\n}\n\n/** Resolves the next pagination control from numbered page entries: the entry after the current one or a next word control. */\nexport function nextcontrol(entries: Array<{ text: string; selector: string; current: boolean }>): string | undefined {\n const current = entries.findIndex(entry => entry.current);\n if (current !== -1 && current + 1 < entries.length) return entries[current + 1]?.selector;\n const nextwords = [\"next\", \"next page\", \">\", \">>\", \"\u203A\", \"\u00BB\", \"pr\u00F3xima\", \"seguinte\"];\n return entries.find(entry => nextwords.includes(entry.text.trim().toLowerCase()))?.selector;\n}\n\n/** True when the current row set contains at least one row the previous set did not carry. */\nexport function rowsfresh(previous: datasetrow[], current: datasetrow[]): boolean {\n if (current.length === 0) return false;\n const known = new Set(previous.map(row => JSON.stringify(row)));\n return current.some(row => !known.has(JSON.stringify(row)));\n}\n\n/** Computes a stable row hash over the reviewed keys; an empty key list hashes every column. */\nexport function rowhash(row: datasetrow, keys: string[]): string {\n const source = (keys.length > 0 ? keys : Object.keys(row).sort()).map(key => `${key}=${row[key] ?? \"\"}`).join(\"|\");\n let hash = 5381;\n for (let index = 0; index < source.length; index += 1) hash = ((hash * 33) ^ source.charCodeAt(index)) >>> 0;\n return hash.toString(16);\n}\n\n/** Deduplicates rows by reviewed keys, keeping the first occurrence of every key set. */\nexport function dedupebykeys(rows: datasetrow[], keys: string[]): { kept: datasetrow[]; removed: number } {\n const seen = new Set<string>();\n const kept: datasetrow[] = [];\n for (const row of rows) {\n const hash = rowhash(row, keys);\n if (seen.has(hash)) continue;\n seen.add(hash);\n kept.push(row);\n }\n return { kept, removed: rows.length - kept.length };\n}\n\n/** Applies one reviewed transform expression to a value; unsupported expressions are refused. */\nexport function applyexpression(value: string, expression: string): string {\n const split = expression.indexOf(\":\");\n const op = split === -1 ? expression : expression.slice(0, split);\n const argument = split === -1 ? undefined : expression.slice(split + 1);\n if (op === \"trim\") return value.trim();\n if (op === \"upper\") return value.toUpperCase();\n if (op === \"lower\") return value.toLowerCase();\n if (op === \"number\") return value.replace(/[^\\d.\\-]/g, \"\");\n if (op === \"prefix\") return `${argument ?? \"\"}${value}`;\n if (op === \"suffix\") return `${value}${argument ?? \"\"}`;\n if (op === \"replace\") {\n const separator = argument?.indexOf(\"=>\") ?? -1;\n if (separator === -1 || separator === 0) throw new Error(`The reviewed transform expression ${expression} needs the from=>to separator.`);\n const from = argument!.slice(0, separator);\n const to = argument!.slice(separator + 2);\n return value.split(from).join(to);\n }\n throw new Error(`The reviewed transform expression ${op} is not supported.`);\n}\n\n/** Applies reviewed transform rules to dataset rows, surfacing per rule errors and keeping the original values on failure. */\nexport function transformrows(rows: datasetrow[], rules: transformrule[]): { rows: datasetrow[]; errors: string[] } {\n const errors: string[] = [];\n const output = rows.map(row => ({ ...row }));\n for (const rule of rules) {\n const updated: datasetrow[] = [];\n try {\n for (const row of output) updated.push({ ...row, [rule.target]: applyexpression(rule.sources.map(source => row[source] ?? \"\").join(\" \"), rule.expression) });\n } catch (error) {\n errors.push(`${rule.target}: ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n output.splice(0, output.length, ...updated);\n }\n return { rows: output, errors };\n}\n\n/** Merges datasets across pages: columns align by key with gaps filled empty and rows concatenate in page order. */\nexport function mergedatasets(datasets: Array<{ columns: columnspec[]; rows: datasetrow[] }>): { columns: columnspec[]; rows: datasetrow[] } {\n const columns: columnspec[] = [];\n const seen = new Set<string>();\n for (const dataset of datasets) {\n for (const column of dataset.columns) {\n if (seen.has(column.key)) continue;\n seen.add(column.key);\n columns.push(column);\n }\n }\n const rows = datasets.flatMap(dataset => dataset.rows.map(row => {\n const merged: datasetrow = {};\n for (const column of columns) merged[column.key] = row[column.key] ?? \"\";\n return merged;\n }));\n return { columns, rows };\n}\n\n/** Attaches the source url, timestamp and step ref to every row and returns the matching source refs. */\nexport function samplerows(rows: datasetrow[], url: string, stepid: string, at: number): { rows: datasetrow[]; sources: sourceref[] } {\n const stamped = rows.map(row => ({ ...row, source: url, capturedat: String(at), step: stepid }));\n const sources = stamped.map((row, index) => ({ row: index, url, at, stepid }));\n return { rows: stamped, sources };\n}\n\n/** Escapes one csv field, wrapping values that carry the delimiter, quotes or line breaks. */\nfunction csvfield(value: string, delimiter: string): string {\n return value.includes(delimiter) || value.includes(\"\\\"\") || value.includes(\"\\n\") ? `\"${value.replace(/\"/g, \"\\\"\\\"\")}\"` : value;\n}\n\n/** Serializes columns and rows into csv text. */\nexport function tocsv(columns: columnspec[], rows: datasetrow[], delimiter = \",\"): string {\n const lines = [columns.map(column => csvfield(column.label || column.key, delimiter)).join(delimiter)];\n for (const row of rows) lines.push(columns.map(column => csvfield(row[column.key] ?? \"\", delimiter)).join(delimiter));\n return lines.join(\"\\n\");\n}\n\n/** Parses csv text into headers and raw rows, honoring quoted fields and escaped quotes. */\nexport function parsecsv(text: string, delimiter = \",\"): { headers: string[]; rows: string[][] } {\n const records: string[][] = [];\n let field = \"\";\n let record: string[] = [];\n let quoted = false;\n for (let index = 0; index < text.length; index += 1) {\n const character = text[index]!;\n if (quoted) {\n if (character === \"\\\"\") {\n if (text[index + 1] === \"\\\"\") { field += \"\\\"\"; index += 1; }\n else quoted = false;\n } else field += character;\n continue;\n }\n if (character === \"\\\"\") { quoted = true; continue; }\n if (character === delimiter) { record.push(field); field = \"\"; continue; }\n if (character === \"\\n\" || character === \"\\r\") {\n if (character === \"\\r\" && text[index + 1] === \"\\n\") index += 1;\n record.push(field);\n field = \"\";\n if (record.some(value => value.length > 0) || record.length > 1) records.push(record);\n record = [];\n continue;\n }\n field += character;\n }\n record.push(field);\n if (record.some(value => value.length > 0) || record.length > 1) records.push(record);\n const [headers = [], ...rows] = records;\n return { headers, rows };\n}\n\n/** Maps parsed csv headers onto dataset column specs through a reviewed mapping of csv names to target keys. */\nexport function mapcolumns(headers: string[], mapping: Record<string, string> = {}): columnspec[] {\n const used = new Set<string>();\n return headers.map(header => {\n const target = mapping[header] ?? mapping[normalizeheader(header)] ?? header;\n return columnspecof(target, used);\n });\n}\n\n/** Serializes columns and rows into a json dataset payload. */\nexport function tojson(columns: columnspec[], rows: datasetrow[]): string {\n return JSON.stringify({ columns, rows });\n}\n\n/** Escapes one xml text node. */\nfunction xmltext(value: string): string {\n return value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\");\n}\n\n/** Serializes columns and rows into an Excel SpreadsheetML 2003 workbook that Excel opens natively. */\nexport function toexcel(columns: columnspec[], rows: datasetrow[], name: string): string {\n const head = columns.map(column => `<Cell ss:StyleID=\"head\"><Data ss:Type=\"String\">${xmltext(column.label || column.key)}</Data></Cell>`).join(\"\");\n const body = rows.map(row => `<Row>${columns.map(column => {\n const value = row[column.key] ?? \"\";\n const numeric = column.kind === \"number\" && value.trim() !== \"\" && Number.isFinite(Number(value));\n return numeric ? `<Cell><Data ss:Type=\"Number\">${xmltext(value)}</Data></Cell>` : `<Cell><Data ss:Type=\"String\">${xmltext(value)}</Data></Cell>`;\n }).join(\"\")}</Row>`).join(\"\");\n return `<?xml version=\"1.0\"?><?mso-application progid=\"Excel.Sheet\"?><Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"><Styles><Style ss:ID=\"head\"><Font ss:Bold=\"1\"/></Style></Styles><Worksheet ss:Name=\"${xmltext(name || \"dataset\").slice(0, 31)}\"><Table><Row>${head}</Row>${body}</Table></Worksheet></Workbook>`;\n}\n\n/** Collects the raw span carrying row shapes of one html table, separating nested tables into cell refs. */\nfunction collectrowshapes(table: HTMLTableElement): rowshape[] {\n return [...table.rows].map(row => ({\n header: [...row.cells].every(cell => cell.tagName === \"TH\") && row.cells.length > 0,\n cells: [...row.cells].map(cell => {\n const nested = cell.querySelector(\"table\");\n return {\n text: clean(nested ? `${nested.rows.length} rows` : cell.textContent ?? \"\"),\n header: cell.tagName === \"TH\",\n rowspan: cell.rowSpan,\n colspan: cell.colSpan,\n ...(nested instanceof HTMLTableElement ? { nested: { selector: selector(nested), rows: collectrowshapes(nested) } } : {}),\n };\n }),\n }));\n}\n\n/** Reads the reviewed table element into a grid result. */\nfunction readtable(target: Element | null, root: Document, fallbackselector: string | undefined): gridresult | null {\n const table = target instanceof HTMLTableElement ? target : (fallbackselector ? root.querySelector<HTMLTableElement>(fallbackselector) : root.querySelector<HTMLTableElement>(\"table\"));\n if (!table) return null;\n return readgrid(collectrowshapes(table));\n}\n\n/** Reads the live pagination entries of a table container for the next control resolution. */\nfunction paginationentries(root: Document, scope: string | undefined): Array<{ text: string; selector: string; current: boolean }> {\n const container = scope ? root.querySelector(scope) : root;\n if (!container) return [];\n return [...container.querySelectorAll(\"a[href], button\")].map(element => ({\n text: clean(element.textContent ?? \"\"),\n selector: selector(element),\n current: element.getAttribute(\"aria-current\") === \"page\" || element.classList.contains(\"active\") || element.classList.contains(\"current\"),\n }));\n}\n\n/** Runs one reviewed data step on the page: table scraping into datasets and pagination following with fresh row waits. */\nexport async function runpagedata(step: toolstep, target: Element | null, root: Document = document): Promise<stepresult> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n if (step.kind === \"scrapetable\") {\n const grid = readtable(target, root, step.target);\n if (!grid) return { ok: false, summary: \"The reviewed table selector matches no table element.\" };\n const rowlimit = typeof options.rowlimit === \"number\" && Number.isInteger(options.rowlimit) && options.rowlimit > 0 ? options.rowlimit : grid.rows.length;\n const limited = grid.rows.slice(0, rowlimit);\n return {\n ok: true,\n summary: `Scraped ${limited.length} row${limited.length === 1 ? \"\" : \"s\"} into ${grid.columns.length} normalized column${grid.columns.length === 1 ? \"\" : \"s\"}${grid.children.length > 0 ? ` with ${grid.children.length} nested child table${grid.children.length === 1 ? \"\" : \"s\"}` : \"\"}.`,\n details: { grid: { columns: grid.columns, rows: limited, children: grid.children }, rows: limited.length, columns: grid.columns.length },\n };\n }\n if (step.kind === \"paginateextract\") {\n const nextselector = typeof options.next === \"string\" ? options.next : \"\";\n const pages = typeof options.pages === \"number\" && Number.isInteger(options.pages) && options.pages > 0 ? options.pages : 1;\n const wait = typeof options.wait === \"number\" && Number.isFinite(options.wait) && options.wait > 0 ? options.wait : 0;\n const cursor = typeof options.cursor === \"number\" && Number.isInteger(options.cursor) && options.cursor > 0 ? options.cursor : 0;\n const grids: gridresult[] = [];\n let previous: datasetrow[] = [];\n for (let page = 0; page < pages + cursor; page += 1) {\n if (page < cursor) {\n const control = root.querySelector<HTMLElement>(nextselector);\n if (!control) break;\n control.click();\n await new Promise(resolve => window.setTimeout(resolve, 0));\n continue;\n }\n if (page > cursor) {\n const control = root.querySelector<HTMLElement>(nextselector);\n if (!control) break;\n control.click();\n const deadline = Date.now() + wait;\n let fresh = false;\n while (!fresh && Date.now() < deadline) {\n await new Promise(resolve => window.setTimeout(resolve, Math.min(100, Math.max(16, deadline - Date.now()))));\n const probe = readtable(target, root, step.target);\n fresh = probe !== null && rowsfresh(previous, probe.rows);\n }\n }\n const grid = readtable(target, root, step.target);\n if (!grid) return { ok: false, summary: \"The reviewed table selector matches no table element.\" };\n grids.push(grid);\n previous = grid.rows;\n }\n const merged = mergedatasets(grids);\n const hasnext = Boolean(root.querySelector(nextselector));\n return {\n ok: grids.length > 0,\n summary: grids.length > 0 ? `Followed ${grids.length} page${grids.length === 1 ? \"\" : \"s\"} of the reviewed table into ${merged.rows.length} row${merged.rows.length === 1 ? \"\" : \"s\"}${hasnext ? \"; a next control remains\" : \"\"}.` : \"No page of the reviewed table was extracted.\",\n details: { grid: { columns: merged.columns, rows: merged.rows, children: grids.flatMap(grid => grid.children) }, pages: grids.length, rows: merged.rows.length, next: hasnext },\n };\n }\n return { ok: false, summary: \"Unsupported data step.\" };\n}\n\n/** Exposes the pagination entries of the current document so plan review can suggest next controls. */\nexport function pagepagination(root: Document = document): Array<{ text: string; selector: string; current: boolean }> {\n return paginationentries(root, undefined);\n}\n", "import type { artifactrecord, columnspec, dataset, datasetrow, exportedartifact, extractsession, provenancerecord, streamstate, toolstep, transformrule } from \"../types.js\";\nimport { tocsv, toexcel, tojson } from \"./pagedata.js\";\n\n/**\n * Dataset command logics for the background executors.\n * Every correlated rule for dataset records, artifact exports with checksums, chunked streaming with backpressure, extraction cursors, loop row variables, provenance records and artifact retention lives in this file.\n */\n\n/** Builds one dataset record from a scraped grid result. */\nexport function builddataset(id: string, name: string, grid: { columns: columnspec[]; rows: datasetrow[]; children?: Array<{ parentrow: number; selector: string; columns: columnspec[]; rows: datasetrow[] }> }, at: number): dataset {\n return { id, name: name || id, columns: grid.columns, rows: grid.rows, sources: [], at };\n}\n\n/** Computes the deterministic checksum of an exported artifact's content. */\nexport function checksum(value: string): string {\n let hash = 5381;\n for (let index = 0; index < value.length; index += 1) hash = ((hash * 33) ^ value.charCodeAt(index)) >>> 0;\n return `fnv1a-${hash.toString(16)}`;\n}\n\n/** Serializes one dataset into the reviewed export format. */\nexport function exportcontent(datasetvalue: dataset, format: \"csv\" | \"json\" | \"excel\", delimiter = \",\"): string {\n if (format === \"json\") return tojson(datasetvalue.columns, datasetvalue.rows);\n if (format === \"excel\") return toexcel(datasetvalue.columns, datasetvalue.rows, datasetvalue.name);\n return tocsv(datasetvalue.columns, datasetvalue.rows, delimiter);\n}\n\n/** Builds one exported artifact record with its content and checksum for the task artifact store. */\nexport function exportartifact(id: string, datasetvalue: dataset, format: \"csv\" | \"json\" | \"excel\", stepid: string, content: string, at: number): exportedartifact {\n const extension = format === \"excel\" ? \"xml\" : format;\n return { id, kind: format, name: `${datasetvalue.name || datasetvalue.id}.${extension}`, stepid, rowcount: datasetvalue.rows.length, content, checksum: checksum(content), at };\n}\n\n/** Converts one exported artifact into the artifact record shape the run store keeps. */\nexport function artifactrecordof(artifact: exportedartifact): artifactrecord {\n return { id: artifact.id, kind: artifact.kind, name: artifact.name, stepid: artifact.stepid, at: artifact.at };\n}\n\n/** Plans the chunk boundaries of a streaming export from a user configured chunk size with no code ceiling. */\nexport function chunkplan(rows: number, chunk: number): Array<{ index: number; from: number; to: number }> {\n const size = Math.max(1, Math.floor(chunk));\n const chunks: Array<{ index: number; from: number; to: number }> = [];\n for (let from = 0; from < rows || chunks.length === 0; from += size) {\n const to = Math.min(rows, from + size);\n chunks.push({ index: chunks.length, from, to });\n if (to >= rows) break;\n }\n return chunks;\n}\n\n/** True when the stream writer must wait for acknowledgements: pending writes reached the in-flight budget of one. */\nexport function backpressure(written: number, acknowledged: number): boolean {\n return written - acknowledged >= 1;\n}\n\n/** Advances one stream state by one acknowledged chunk of rows. */\nexport function advancestream(state: streamstate, chunk: { index: number; to: number }, at: number, done: boolean): streamstate {\n return { datasetid: state.datasetid, name: state.name, chunk: chunk.index + 1, chunks: state.chunks, written: chunk.to, ...(done ? { done: true } : {}), at };\n}\n\n/** Returns the first unwritten row index of a stream, starting a fresh stream at zero. */\nexport function streamfrom(state: streamstate | undefined, rows: number): number {\n if (!state || state.done) return 0;\n return Math.min(state.written, rows);\n}\n\n/** Builds the initial stream state of one dataset. */\nexport function newstream(datasetvalue: dataset, chunks: number, at: number): streamstate {\n return { datasetid: datasetvalue.id, name: datasetvalue.name, chunk: 0, chunks, written: 0, at };\n}\n\n/** Advances one extraction session by one extracted page with its row count. */\nexport function advancecursor(sessionvalue: extractsession, page: string, rows: number, at: number, done: boolean): extractsession {\n return {\n id: sessionvalue.id,\n datasetid: sessionvalue.datasetid,\n name: sessionvalue.name,\n target: sessionvalue.target,\n next: sessionvalue.next,\n planned: sessionvalue.planned,\n pages: [...sessionvalue.pages, page],\n rows: sessionvalue.rows + rows,\n cursor: sessionvalue.cursor + 1,\n ...(done || sessionvalue.cursor + 1 >= sessionvalue.planned ? { done: true } : {}),\n startedat: sessionvalue.startedat,\n updatedat: at,\n };\n}\n\n/** Builds the initial extraction session of one dataset extraction. */\nexport function newextractsession(id: string, datasetid: string, name: string, target: string, next: string, planned: number, at: number): extractsession {\n return { id, datasetid, name, target, next, planned, pages: [], rows: 0, cursor: 0, startedat: at, updatedat: at };\n}\n\n/** Returns the pages an interrupted extraction still owes after its stored cursor. */\nexport function remainingpages(sessionvalue: extractsession, planned: number): number {\n if (sessionvalue.done) return 0;\n return Math.max(0, Math.max(sessionvalue.planned, planned) - sessionvalue.cursor);\n}\n\n/** Builds one provenance record of an exported artifact with its source url, step ref, row range and checksum. */\nexport function provenancefor(artifact: { id: string; name: string; rowcount: number; checksum: string }, url: string, stepid: string, at: number): provenancerecord {\n return { artifact: artifact.id, name: artifact.name, url, stepid, rowstart: artifact.rowcount > 0 ? 1 : 0, rowend: artifact.rowcount, checksum: artifact.checksum, at };\n}\n\n/** Applies the user configured artifact retention to exported artifacts; an absent setting keeps everything. */\nexport function retainedexports<T>(records: T[], retention: number | undefined): T[] {\n return retention === undefined ? records : records.slice(0, retention);\n}\n\n/** Interpolates one text through the {{column}} tokens of a dataset row. */\nexport function interpolate(text: string, row: datasetrow): string {\n return text.replace(/\\{\\{([^}]+)\\}\\}/g, (_, key: string) => row[key.trim()] ?? \"\");\n}\n\n/** Substitutes the row variables of one looprows iteration into the target, value and options of the inner step. */\nexport function loopstep(step: toolstep, row: datasetrow): toolstep {\n return {\n ...step,\n ...(step.target !== undefined ? { target: interpolate(step.target, row) } : {}),\n ...(step.value !== undefined ? { value: interpolate(step.value, row) } : {}),\n ...(step.options !== undefined ? { options: interpolate(step.options, row) } : {}),\n };\n}\n\n/** Exposes one dataset row as the step variables of a looprows iteration. */\nexport function loopvariables(row: datasetrow): datasetrow {\n return { ...row };\n}\n\n/** Builds the grid preview of a dataset with its column order, total rows and sampled rows. */\nexport function gridpreview(datasetvalue: dataset, sample: number): { datasetid: string; columns: string[]; rows: number; sample: datasetrow[] } {\n return { datasetid: datasetvalue.id, columns: datasetvalue.columns.map(column => column.key), rows: datasetvalue.rows.length, sample: datasetvalue.rows.slice(0, Math.max(0, Math.floor(sample))) };\n}\n\n/** Sorts dataset rows by one column key in the reviewed direction with a stable fallback for equal values. */\nexport function sortrows(rows: datasetrow[], key: string, direction: \"asc\" | \"desc\"): datasetrow[] {\n const sign = direction === \"desc\" ? -1 : 1;\n return [...rows].sort((left, right) => {\n const a = left[key] ?? \"\";\n const b = right[key] ?? \"\";\n const numeric = Number(a);\n const numericb = Number(b);\n if (Number.isFinite(numeric) && Number.isFinite(numericb) && a.trim() !== \"\" && b.trim() !== \"\") return (numeric - numericb) * sign;\n return a.localeCompare(b) * sign;\n });\n}\n\n/** Builds the sheet push payload of one dataset for a reviewed sheet endpoint. */\nexport function sheetpayload(datasetvalue: dataset, sheet: string): { sheet: string; columns: string[]; rows: datasetrow[] } {\n return { sheet, columns: datasetvalue.columns.map(column => column.key), rows: datasetvalue.rows };\n}\n\n/** Merges reviewed transform rules and dedupe keys into the task rules record of one task. */\nexport function mergetaskrules(existing: { taskid: string; transforms: transformrule[]; dedupekeys: string[] } | undefined, taskid: string, transforms: transformrule[], dedupekeys: string[], at: number): { taskid: string; transforms: transformrule[]; dedupekeys: string[]; at: number } {\n return {\n taskid,\n transforms: transforms.length > 0 ? transforms : (existing?.transforms ?? []),\n dedupekeys: dedupekeys.length > 0 ? dedupekeys : (existing?.dedupekeys ?? []),\n at,\n };\n}\n", "import type { artifactinventoryentry, capturename, cleanuprule, clipentry, downloadrecord, downloadstate, mimefilter, netlogrecord, quarantineentry, scanverdict, toolstep } from \"../types.js\";\nimport { checksum } from \"./datacommand.js\";\n\n/**\n * Files, clipboard and downloads command logics for the background executors.\n * Every correlated rule for batch queue state transitions, filename conflicts, verification matching, mime interception with the deny default, netlog correlation and header redaction, clipboard entry hashing, quarantine paths and scan verdicts, capture naming counters and cleanup sweeps lives in this file.\n */\n\n/** Legal batch queue transitions between the download states. */\nconst downloadtransitions: Record<downloadstate, downloadstate[]> = {\n queued: [\"running\", \"complete\", \"failed\"],\n running: [\"paused\", \"complete\", \"failed\"],\n paused: [\"running\", \"failed\"],\n complete: [],\n failed: [],\n};\n\n/** True when the batch queue allows the transition between two download states. */\nexport function transitionallowed(from: downloadstate, to: downloadstate): boolean {\n return downloadtransitions[from].includes(to);\n}\n\n/** Applies one batch queue state transition with its path, bytes, checksum and browser download id evidence; impossible transitions leave the record untouched. */\nexport function advancedownload(record: downloadrecord, state: downloadstate, at: number, evidence?: { path?: string; bytes?: number; checksum?: string; downloadid?: number }): downloadrecord {\n if (!transitionallowed(record.state, state)) return record;\n return {\n ...record,\n state,\n ...(evidence?.path !== undefined ? { path: evidence.path } : record.path !== undefined ? { path: record.path } : {}),\n ...(evidence?.bytes !== undefined ? { bytes: evidence.bytes } : record.bytes !== undefined ? { bytes: record.bytes } : {}),\n ...(evidence?.checksum !== undefined ? { checksum: evidence.checksum } : record.checksum !== undefined ? { checksum: record.checksum } : {}),\n ...(evidence?.downloadid !== undefined ? { downloadid: evidence.downloadid } : record.downloadid !== undefined ? { downloadid: record.downloadid } : {}),\n updatedat: at,\n };\n}\n\n/** True when the batch queue may start another download under the user configured concurrent choice; an absent window never blocks. */\nexport function concurrentwindow(running: number, ceiling: number | undefined): boolean {\n return ceiling === undefined || running < ceiling;\n}\n\n/** Resolves a filename conflict with a sequence suffix while keeping the extension intact. */\nexport function conflictfree(filename: string, taken: string[]): string {\n if (!taken.includes(filename)) return filename;\n const dot = filename.lastIndexOf(\".\");\n const base = dot > 0 ? filename.slice(0, dot) : filename;\n const extension = dot > 0 ? filename.slice(dot) : \"\";\n let sequence = 2;\n while (taken.includes(`${base}-${sequence}${extension}`)) sequence += 1;\n return `${base}-${sequence}${extension}`;\n}\n\n/** Derives the download filename of one reviewed url from the spec filename rule or the url basename. */\nexport function downloadfilename(url: string, rule: string | undefined): string {\n if (rule && rule.trim()) return rule.trim();\n let name = \"\";\n try {\n const parsed = new URL(url);\n name = decodeURIComponent(parsed.pathname.split(\"/\").filter(Boolean).pop() ?? parsed.hostname);\n } catch { name = url; }\n return name || \"download\";\n}\n\n/** Verifies one completed download against the reviewed size and checksum expectations. */\nexport function verifybytes(record: downloadrecord, expected: { bytes?: number; checksum?: string }): { ok: boolean; summary: string; matches: { state: boolean; size: boolean; checksum: boolean } } {\n const statematch = record.state === \"complete\";\n const sizematch = expected.bytes === undefined ? true : record.bytes === expected.bytes;\n const checksummatch = expected.checksum === undefined ? true : record.checksum === expected.checksum;\n const ok = statematch && sizematch && checksummatch;\n const parts = [`state ${record.state}${statematch ? \" matches\" : \" does not match the completed expectation\"}`];\n if (expected.bytes !== undefined) parts.push(`size ${record.bytes ?? \"unknown\"} of ${expected.bytes} bytes ${sizematch ? \"matches\" : \"differs\"}`);\n if (expected.checksum !== undefined) parts.push(`checksum ${record.checksum ?? \"unknown\"} ${checksummatch ? \"matches\" : \"differs from\"} the reviewed ${expected.checksum}`);\n return { ok, summary: `${ok ? \"Verified\" : \"Failed to verify\"} the download of ${record.filename}: ${parts.join(\"; \")}.`, matches: { state: statematch, size: sizematch, checksum: checksummatch } };\n}\n\n/** Matches one reviewed mime pattern with a trailing * wildcard against a mime type. */\nfunction mimepatternmatches(pattern: string, mime: string): boolean {\n if (!pattern.endsWith(\"*\")) return pattern === mime;\n return mime.startsWith(pattern.slice(0, -1));\n}\n\n/** True when the mime type passes the reviewed filter: exclude wins, then include, then the default for unlisted mime types. */\nexport function mimeallowed(filter: mimefilter, mime: string): boolean {\n if (filter.exclude.some(pattern => mimepatternmatches(pattern, mime))) return false;\n if (filter.include.some(pattern => mimepatternmatches(pattern, mime))) return true;\n return filter.default === \"allow\";\n}\n\n/** Redacts every header value of a captured request so exported netlogs never leak them. */\nexport function redactheaders(headers: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.entries(headers).map(([name]) => [name, \"[redacted]\"]));\n}\n\n/** Builds one netlog record correlated with its step through the request id. */\nexport function netlogentry(input: { url: string; method: string; status: number; timing: number; requestid: string; stepid: string; at: number }): netlogrecord {\n return { url: input.url, method: input.method, status: input.status, timing: input.timing, requestid: input.requestid, stepid: input.stepid, at: input.at };\n}\n\n/** Returns the netlog records of one step, oldest first, correlated through the request ids. */\nexport function netlogforstep(records: netlogrecord[], stepid: string): netlogrecord[] {\n return records.filter(record => record.stepid === stepid);\n}\n\n/** Builds one clipboard entry from the payload hash and length; the payload text itself never persists. */\nexport function clipentryof(kind: clipentry[\"kind\"], payload: { hash: string; length: number }, origin: string, stepid: string, at: number): clipentry {\n return { kind, hash: payload.hash, length: payload.length, origin, stepid, at };\n}\n\n/** Hashes one clipboard payload so audits and memory carry the hash only. */\nexport function cliphash(payload: string): string {\n return checksum(payload);\n}\n\n/** Routes a quarantined path outside the downloads folder until release. */\nexport function quarantinedpath(filename: string): string {\n return `devthink-quarantine/${filename.replace(/^\\/+/, \"\")}`;\n}\n\n/** Builds one quarantine entry outside the downloads folder with a pending scan verdict. */\nexport function newquarantine(id: string, filename: string, reason: string, at: number): quarantineentry {\n const path = quarantinedpath(filename);\n return { id, path, reason, scan: \"pending\", at, updatedat: at };\n}\n\n/** Applies one scan verdict to a quarantined entry; hook failures stay pending instead of releasing. */\nexport function scanresult(entry: quarantineentry, verdict: scanverdict, at: number): quarantineentry {\n return { ...entry, scan: verdict, updatedat: at };\n}\n\n/** Maps one scanning hook response to its verdict; absent or malformed responses stay pending as hook failures. */\nexport function scanverdictof(response: unknown): scanverdict {\n if (!response || typeof response !== \"object\") return \"pending\";\n const verdict = (response as Record<string, unknown>).verdict;\n if (verdict === \"clean\" || verdict === \"flagged\" || verdict === \"error\") return verdict;\n return \"pending\";\n}\n\n/** Stamps the release ref of one quarantined entry after the policy gate approved it. */\nexport function released(entry: quarantineentry, ref: string, at: number): quarantineentry {\n return { ...entry, release: ref, updatedat: at };\n}\n\n/** Normalizes one capture name part into a filename safe lowercase slug. */\nfunction capturepart(value: string): string {\n return value.replace(/[^a-z0-9-]+/gi, \"-\").replace(/^-+|-+$/g, \"\").toLowerCase() || \"capture\";\n}\n\n/** Builds one consistent capture filename from its task, step and sequence parts. */\nexport function capturefilename(name: capturename, extension: string): string {\n const safeextension = extension.replace(/^\\.+/, \"\").toLowerCase() || \"png\";\n return `${capturepart(name.task)}-${capturepart(name.step)}-${name.sequence}.${safeextension}`;\n}\n\n/** Advances the capture naming counter of one step base and returns the stamped sequence. */\nexport function advancecounter(counters: Record<string, number>, base: string): { sequence: number; counters: Record<string, number> } {\n const sequence = (counters[base] ?? 0) + 1;\n return { sequence, counters: { ...counters, [base]: sequence } };\n}\n\n/** Stamps consistent capture names for the steps of one task with per task counters. */\nexport function capturenames(counters: Record<string, number>, task: string, steps: string[], extension: string): { names: string[]; counters: Record<string, number> } {\n let current = { ...counters };\n const names = steps.map(step => {\n const advanced = advancecounter(current, step);\n current = advanced.counters;\n return capturefilename({ task, step, sequence: advanced.sequence }, extension);\n });\n return { names, counters: current };\n}\n\n/** Collects the artifact references of open review cards so the cleanup sweeper keeps them. */\nexport function referencedartifacts(plan: { steps: Array<{ id: string; kind: string; value?: string }> } | undefined, completed: string[]): string[] {\n if (!plan) return [];\n return plan.steps.filter(step => step.kind === \"attachfile\" && !completed.includes(step.id)).map(step => step.value ?? \"\").filter(value => value.trim().length > 0);\n}\n\n/** Plans one cleanup sweep by age and kind while keeping referenced artifacts and honoring the keep policies. */\nexport function sweepplan(entries: artifactinventoryentry[], rules: cleanuprule[], now: number, keeprefs: string[]): { remove: string[]; keep: string[] } {\n const remove = new Set<string>();\n for (const rule of rules) {\n const matching = entries.filter(entry => rule.kind === \"any\" || entry.kind === rule.kind);\n const aged = matching.filter(entry => now - entry.at >= rule.age);\n const kept: artifactinventoryentry[] = [];\n if (rule.keep === \"all\") kept.push(...aged);\n else if (rule.keep === \"latest\") {\n const newest = [...aged].sort((left, right) => right.at - left.at)[0];\n if (newest) kept.push(newest);\n }\n for (const entry of aged) {\n if (kept.some(item => item.id === entry.id)) continue;\n if (keeprefs.includes(entry.id) || keeprefs.includes(entry.name)) continue;\n remove.add(entry.id);\n }\n }\n return { remove: [...remove], keep: entries.filter(entry => !remove.has(entry.id)).map(entry => entry.id) };\n}\n\n/** Reads the step ids a namecaptures step should stamp from its options or the plan steps. */\nexport function capturesteps(options: Record<string, unknown>, plan: { steps: toolstep[] }): string[] {\n const listed = Array.isArray(options.steps) ? options.steps.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n return listed.length > 0 ? listed : plan.steps.map(step => step.id);\n}\n", "import { randomid, sessionmemory } from \"../memory.js\";\nimport { canexecute, canpreview, clipboardconsentgranted, exportgranted, generatedvalueallowed, hostpattern, isdatasetkind, isfileskind, isformkind, islayoutkind, istabscommandkind, layoutmutationgranted, maskclipboard, navigationgranted, normalizeendpoint, originverified, parseoptions, passwordconsentgranted, profilegrantgranted, quarantinereleasegranted, requiredcapability, tasktabceiling, validatecleanuprule, validatestep, windowclosegate } from \"../policy.js\";\nimport { assigntasktab, downloadshare, extractionshare, iscomplete, recorddownload, recordnaventry, recordoutcome, recordstep, recordwatchcompletion, recordwizardstep, recordextraction, resetforplan, tasktabs, watchclosed, wizardcompletion } from \"../progress.js\";\nimport { datasetresponse, downloadreport, errorreportresponse, extractionreport, formreportresponse, heldkeysreport, layoutreport, mapresponse, navstateresponse, netlogreport, observationresponse, outcomeresponse, parseproposal, provenancereport, quarantinereport, requestbody, safetyresponse, signalsreport, trailreport, wizardreport } from \"../protocol.js\";\nimport type { a11ynode, agentplan, agentsession, artifactinventoryentry, artifactrecord, auditevent, authrecord, bannerreport, capabilityreport, captchahandoff, clipboardconsentrecord, cleanuprule, cleanuprun, clickablemap, closedtab, columnspec, controltabstate, curatedlink, curatedlist, dataset, datasetrow, derivedselector, detectionrecord, diagnosticreport, diffentry, dialogdecision, dialogpolicy, downloadrecord, downloadspec, downloadstate, errorreport, exportedartifact, extractsession, fielderror, fieldkind, focusevent, formprofile, formreport, keyholdstate, mapentry, mimefilter, mutationevent, navcontrol, navintentrecord, navqueues, navrecord, navstate, observation, pagesignals, provenancerecord, readerarticle, ratelimit, ratelimitstate, recenttab, resolvedtarget, retryoutcome, retryrule, safetyverdict, scanhookconfig, scanverdict, selectorcandidate, sessionsnapshot, sheetendpoint, snapshotdiff, stepoutcome, streamstate, submitticket, tabbadge, tabgrouprecord, tablayout, tabmeta, tabreport, tabreportentry, tabwatchevent, taskrules, templateprofile, toolstep, trailentry, transformrule, typeaheadpick, waitprofilerecord, watchregistration, wizardstate } from \"../types.js\";\nimport { isbrowserkind, readcapabilities, runbrowseraction } from \"./browsertabs.js\";\nimport { assigntasktabs, audiotabs, badgefromprogress, buildlayout, clonetabs, closeselection, discardcandidates, layoutrestoreplan, parsetabquery, querymatches, regroupaftermoves, restorediscarded, searchtabmatches, switchtarget, tasktabgauge, tasktabsinwindow, trackedtasktabs, watchtabdispatch, windowprofilegrants, zoomstep, type tabshape, type windowshape } from \"./tabscommand.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\";\nimport { deeplinkurl, parsenavtarget, parsewaitprofile, pickrecenttab, profilefororigin, resolvecontainer } from \"./pagenav.js\";\nimport { authfor, batchopenset, buildredirectchain, checksafe, classifynavchange, curatelinks, detecthttpstate, domainof, finalurl, interstitialpolicy, navwatchevent, parseratelimit, prefetchcandidates, preconnectorigins, rateallows, ratewindow, recordratehit } from \"./pagenet.js\";\nimport { generatevalue, parseformrecord, valueshash } from \"./pageforms.js\";\nimport { backoffwaits, parsebackoff } from \"./pagewizards.js\";\nimport { dedupebykeys, mapcolumns, mergedatasets, parsecsv, samplerows, transformrows, type gridresult } from \"./pagedata.js\";\nimport { advancecursor, advancestream, artifactrecordof, backpressure, builddataset, chunkplan, exportartifact, exportcontent, gridpreview, loopstep, loopvariables, mergetaskrules, newextractsession, newstream, provenancefor, remainingpages, sheetpayload, streamfrom } from \"./datacommand.js\";\nimport { advancedownload, capturenames, capturesteps, clipentryof, cliphash, concurrentwindow, conflictfree, downloadfilename, mimeallowed, netlogentry, netlogforstep, newquarantine, redactheaders, referencedartifacts, released, scanresult, scanverdictof, sweepplan, transitionallowed, verifybytes } from \"./filescommand.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\"]);\nconst navigationstepkinds: ReadonlySet<string> = new Set([\"openlink\", \"openprivate\", \"reloadcache\", \"stopnav\", \"waitload\", \"waiturl\", \"followlink\", \"spanav\", \"spawait\", \"rewritequery\", \"setfragment\", \"navlist\", \"navprofile\", \"detecthttp\", \"readredirects\", \"readfinalurl\", \"handleauth\", \"printpdf\", \"prefetch\", \"preconnect\", \"deeplink\", \"reopentab\", \"trailaudit\", \"pausenav\", \"navintent\", \"navrate\", \"openclipboard\", \"checksafe\", \"batchopen\"]);\nconst pausenavkinds: ReadonlySet<string> = new Set([\"openlink\", \"openprivate\", \"followlink\", \"spanav\", \"navlist\", \"openclipboard\", \"batchopen\", \"prefetch\", \"preconnect\", \"deeplink\", \"reopentab\"]);\nconst ratecheckedkinds: ReadonlySet<string> = new Set([\"openlink\", \"openprivate\", \"followlink\", \"spanav\", \"navlist\", \"openclipboard\", \"batchopen\", \"deeplink\", \"reopentab\"]);\nconst formfillkinds: ReadonlySet<string> = new Set([\"fillform\", \"filllabel\", \"fillplaceholder\", \"fillcard\", \"fillcode\", \"attachfile\", \"saveprofiles\", \"runwizard\", \"selectchain\", \"picktypeahead\", \"pickdate\"]);\n/** Internal evidence capture cadence for navigation records; not a policy cap on any reviewed value. */\nconst evidencepoll = 100;\n/** Internal evidence capture window used while a tab settles after a navigation; not a policy cap on any reviewed value. */\nconst evidencesettle = 5000;\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, diff, navigation and tabs command event families. */\nfunction stepauditkind(step: toolstep, ok: boolean): auditevent[\"kind\"] {\n if (isbrowserkind(step.kind)) return browserauditkind(step);\n if (istabscommandkind(step.kind)) {\n if (step.kind === \"grouptabs\" || step.kind === \"colorgroup\" || step.kind === \"collapsegroup\") return \"group\";\n if (step.kind === \"savelayout\" || step.kind === \"restorelayout\" || step.kind === \"snapshotsession\" || step.kind === \"reopenrun\") return \"layout\";\n if (step.kind === \"discardtab\") return \"discard\";\n if (step.kind === \"badgetab\") return \"badge\";\n if (step.kind === \"watchtab\") return \"watch\";\n if (step.kind === \"maximizewindow\" || step.kind === \"minimizewindow\" || step.kind === \"restorewindow\" || step.kind === \"focuswindow\" || step.kind === \"scratchwindow\" || step.kind === \"incognitowindow\") return \"window\";\n return \"tab\";\n }\n if (step.kind === \"dismissdialog\") return \"dialog\";\n if (step.kind === \"keyhold\" || step.kind === \"keyrelease\") return \"hold\";\n if (step.kind === \"retryaction\" || step.kind === \"retryform\") return \"retry\";\n if (step.kind === \"submitform\" || step.kind === \"asksubmit\") return \"submit\";\n if (step.kind === \"consentpassword\") return \"consent\";\n if (step.kind === \"handoffcaptcha\") return \"handoff\";\n if (isfileskind(step.kind)) {\n if (step.kind === \"interceptmime\") return \"intercept\";\n if (step.kind === \"readclipboard\" || step.kind === \"writeclipboard\" || step.kind === \"copyscreen\") return \"clipboard\";\n if (step.kind === \"quarantinedownload\" || step.kind === \"scanvirus\") return \"quarantine\";\n if (step.kind === \"cleanupartifacts\") return \"cleanup\";\n if (step.kind === \"verifydownload\" || step.kind === \"exportnetlog\" || step.kind === \"namecaptures\") return \"observation\";\n return \"download\";\n }\n if (isdatasetkind(step.kind)) {\n if (step.kind === \"exportcsv\" || step.kind === \"exportjson\" || step.kind === \"exportexcel\" || step.kind === \"copytable\" || step.kind === \"pushsheets\") return \"export\";\n if (step.kind === \"streamdisk\") return \"stream\";\n if (step.kind === \"resumeextract\") return \"resume\";\n if (step.kind === \"logprovenance\") return \"provenance\";\n return \"scrape\";\n }\n if (formfillkinds.has(step.kind)) return \"fill\";\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 (step.kind === \"readredirects\" || step.kind === \"readfinalurl\" || step.kind === \"detecthttp\") return \"redirect\";\n if (step.kind === \"handleauth\") return \"auth\";\n if (step.kind === \"prefetch\" || step.kind === \"preconnect\") return \"prefetch\";\n if (step.kind === \"navrate\") return \"rate\";\n if (navigationstepkinds.has(step.kind)) return \"navigation\";\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\n/** Live navigation watch buffers per tab, rebuilt on every new navigation of the tab. */\nconst navbuffers = new Map<number, navwatchevent[]>();\n/** Last known urls per tab so closed tabs can be remembered for reopentab steps. */\nconst lastknownurls = new Map<number, string>();\n\n/** Tracks one tab update into the navigation watch buffer, the spa route trail, the last known url and the live title memory. */\nasync function tracktabupdate(tabid: number, changeinfo: { url?: string; status?: string; title?: string }): Promise<void> {\n const now = Date.now();\n const url = typeof changeinfo.url === \"string\" ? changeinfo.url : undefined;\n const status = changeinfo.status;\n if (typeof changeinfo.title === \"string\" && changeinfo.title) {\n lastknowntitles.set(tabid, changeinfo.title);\n await recordtabwatchevent(\"title\", tabid, changeinfo.title);\n }\n const previous = lastknownurls.get(tabid);\n if (status === \"loading\" && url) {\n navbuffers.set(tabid, [{ event: \"beforenavigate\", url, timestamp: now }]);\n lastknownurls.set(tabid, url);\n return;\n }\n const buffer = navbuffers.get(tabid) ?? [];\n if (url) {\n const kind = classifynavchange(previous ?? url, url, status);\n buffer.push({ event: kind === \"route\" ? \"urlchange\" : \"committed\", url, timestamp: now, redirect: kind === \"route\" });\n if (kind === \"route\" && previous) {\n const session = await memory.getsession();\n if (session && !session.stoppedat && session.tabid === tabid) {\n await memory.addtrailentry(session.id, { url, title: \"\", at: now });\n }\n }\n lastknownurls.set(tabid, url);\n }\n if (status === \"complete\") buffer.push({ event: \"completed\", url: lastknownurls.get(tabid) ?? \"\", timestamp: now, status: 200 });\n navbuffers.set(tabid, buffer);\n}\n\nchrome.tabs.onUpdated.addListener((tabid, changeinfo) => { void tracktabupdate(tabid, changeinfo); });\n\n/** Records the activation of a tab into every live watchtab registration. */\nchrome.tabs.onActivated.addListener(activeinfo => { void recordtabwatchevent(\"activated\", activeinfo.tabId); });\n\n/** Remembers the last known url and title of a closed tab so restoretab and reopenrun can restore it. */\nchrome.tabs.onRemoved.addListener(tabid => {\n const url = lastknownurls.get(tabid);\n const title = lastknowntitles.get(tabid) ?? \"\";\n const windowid = 0;\n if (url) {\n void memory.addrecenttab({ url, tabid, closedat: Date.now() });\n void memory.addclosedtab({ url, title, tabid, windowid, closedat: Date.now() });\n }\n void recordtabwatchevent(\"closed\", tabid, url);\n lastknownurls.delete(tabid);\n lastknowntitles.delete(tabid);\n navbuffers.delete(tabid);\n});\n\n/** Records one completed navigation: the redirect chain from the watch buffer, the final url, the per tab state, the navigation trail entry and the correlated netlog records. */\nasync function recordnavigation(step: toolstep, session: agentsession | undefined, tabid: number): Promise<navrecord> {\n const started = Date.now();\n let tab = await chrome.tabs.get(tabid).catch(() => undefined);\n while (tab && tab.status !== \"complete\" && Date.now() - started < evidencesettle) {\n await new Promise(resolve => setTimeout(resolve, evidencepoll));\n tab = await chrome.tabs.get(tabid).catch(() => undefined);\n }\n const url = tab?.url ?? lastknownurls.get(tabid) ?? \"\";\n const title = tab?.title ?? \"\";\n const chain = buildredirectchain(navbuffers.get(tabid) ?? []);\n const record: navrecord = {\n stepid: step.id,\n ...(session ? { sessionid: session.id } : {}),\n origin: session?.origin ?? (url ? new URL(url).origin : \"\"),\n finalurl: finalurl(chain) || url,\n chain,\n at: Date.now(),\n };\n await memory.addnavrecord(record);\n await memory.setnavstate(tabid, record);\n if (session && url) await memory.addtrailentry(session.id, { url, title, stepid: step.id, at: Date.now() });\n await collectnetlog(tabid, step);\n return record;\n}\n\n/** Collects the network log of one recorded navigation from the tab watch buffer, correlating each request with the step through request ids. */\nasync function collectnetlog(tabid: number, step: toolstep): Promise<void> {\n const events = navbuffers.get(tabid) ?? [];\n if (events.length === 0) return;\n const first = events[0]?.timestamp ?? Date.now();\n for (const [index, event] of events.entries()) {\n const status = event.status ?? (event.event === \"completed\" ? 200 : event.event === \"error\" ? 0 : 0);\n await memory.addnetlog(netlogentry({ url: event.url, method: \"GET\", status, timing: Math.max(0, event.timestamp - first), requestid: `${step.id}-${index + 1}`, stepid: step.id, at: event.timestamp }));\n }\n}\n\n/** Appends the session origin grants to the options of a page navigation step so the bridge can refuse out-of-grant links. */\nfunction injectallowedorigins(step: toolstep, session: agentsession | undefined): toolstep {\n const allowedorigins = session?.grants ?? (session ? [session.origin] : []);\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n return { ...step, options: JSON.stringify({ ...options, allowedorigins }) };\n}\n\n/** Enforces the reviewed per domain navigation rate limit before one navigation runs. */\nasync function enforceratelimit(url: string, stepid: string, sessionid: string | undefined): Promise<void> {\n const domain = domainof(url);\n if (!domain) return;\n const states = await memory.getratestates();\n const stored = states.find(item => item.domain === domain);\n if (!stored) return;\n const live = ratewindow(stored, stored.limit, Date.now());\n const decision = rateallows(live, Date.now());\n if (!decision.allowed) {\n await audit(\"rate\", `The navigation rate limit of ${live.limit.ceiling} per ${live.limit.window} milliseconds for ${domain} was exceeded; the navigation was refused.`, { ...(sessionid ? { sessionid } : {}), stepid });\n throw new Error(`The navigation rate limit for ${domain} has been reached; retry after ${Math.ceil(decision.retryafter / 1000)} seconds.`);\n }\n await memory.setratestate(recordratehit(live, Date.now()));\n await audit(\"rate\", `Navigation to ${url} counted against the reviewed rate limit of ${live.limit.ceiling} per ${live.limit.window} milliseconds for ${domain}; ${decision.remaining - 1} remaining.`, { ...(sessionid ? { sessionid } : {}), stepid });\n}\n\n/** Refuses navigation while the reviewed navigation pause is armed for an open consent prompt. */\nasync function refusenavpause(step: toolstep): Promise<void> {\n if (!pausenavkinds.has(step.kind)) return;\n const control = await memory.getnavcontrol();\n if (control?.pausedat) throw new Error(control.reason ? `Navigation is paused: ${control.reason}` : \"Navigation is paused while a consent prompt is open; resume navigation first.\");\n}\n\n/** Opens one reviewed navigation target in its resolved container across tabs, windows and private profiles. */\nasync function opencontainer(step: toolstep, session: agentsession | undefined, url: string, container: \"current\" | \"tab\" | \"window\" | \"private\", position: \"adjacent\" | \"end\"): Promise<stepoutput> {\n const windows = await chrome.windows.getAll().catch(() => [] as Array<{ id?: number; incognito?: boolean; focused?: boolean }>);\n const plan = resolvecontainer({ url, container, position, private: container === \"private\" }, windows.map(item => ({ id: item.id ?? 0, incognito: item.incognito ?? false, focused: item.focused ?? false })));\n const extra = { ...(session ? { sessionid: session.id } : {}), stepid: step.id };\n if (plan.kind === \"current\" && session) {\n const tabid = session.tabid;\n await chrome.tabs.update(tabid, { url });\n const record = await recordnavigation(step, session, tabid);\n await audit(\"navigation\", `Navigated the task tab to ${url}.`, extra);\n return { ok: true, summary: `Navigated the task tab to ${url}.`, details: { container: plan.kind, url, finalurl: record.finalurl, hops: record.chain.hops.length } };\n }\n if (plan.kind === \"private\" || plan.kind === \"window\") {\n const created = await chrome.windows.create({ url, incognito: plan.incognito });\n await audit(\"navigation\", `Opened ${plan.kind === \"private\" ? \"a private window\" : \"a new window\"} for ${url}${plan.kind === \"private\" ? \" separated from normal windows\" : \"\"}.`, extra);\n return { ok: true, summary: `Opened ${plan.kind === \"private\" ? \"a private window\" : \"a new window\"} for ${url}.`, details: { container: plan.kind, url, windowid: created?.id ?? 0, incognito: plan.incognito } };\n }\n const created = await chrome.tabs.create({ url, ...(plan.windowid !== undefined ? { windowId: plan.windowid } : {}), active: true });\n await audit(\"navigation\", `Opened a new tab for ${url} without leaving the current page.`, extra);\n return { ok: true, summary: `Opened a new tab for ${url}.`, details: { container: \"tab\", url, tabid: created?.id ?? 0, position: plan.position } };\n}\n\n/** Verifies one url against the session grants and the stored checksafe verdicts before it opens. */\nasync function verifyopenurl(url: string, session: agentsession | undefined): Promise<void> {\n const grants = session?.grants ?? (session ? [session.origin] : []);\n const verified = originverified(url, grants, await memory.getsafeties());\n if (!verified.allowed) throw new Error(verified.reason);\n}\n\n/** Executes one reviewed openlink or openprivate step from its navtarget container. */\nasync function executeopenlink(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n const target = parsenavtarget(step);\n if (!target) throw new Error(\"A reviewed navtarget is required.\");\n await refusenavpause(step);\n await enforceratelimit(target.url, step.id, session?.id);\n await verifyopenurl(target.url, session);\n return opencontainer(step, session, target.url, target.container, target.position ?? \"adjacent\");\n}\n\n/** Executes one reviewed deeplink step by building the deep link and opening it in the reviewed container. */\nasync function executedeeplink(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const params: Record<string, string> = {};\n if (options.params && typeof options.params === \"object\" && !Array.isArray(options.params)) {\n for (const [name, value] of Object.entries(options.params as Record<string, unknown>)) if (typeof value === \"string\") params[name] = value;\n }\n const url = deeplinkurl(typeof options.app === \"string\" ? options.app : \"\", params);\n if (!url) throw new Error(\"The reviewed deep link pattern is not a known web app.\");\n await refusenavpause(step);\n await enforceratelimit(url, step.id, session?.id);\n await verifyopenurl(url, session);\n const target = parsenavtarget(step);\n const container = target?.container === \"window\" ? \"window\" : target?.container === \"private\" ? \"private\" : target?.container === \"current\" ? \"current\" : \"tab\";\n const output = await opencontainer(step, session, url, container, target?.position ?? \"adjacent\");\n return { ...output, details: { ...(output.details ?? {}), app: options.app, deeplink: url } };\n}\n\n/** Executes one reviewed reopentab step: the most recently closed tab url is restored in a new tab. */\nasync function executereopentab(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n await refusenavpause(step);\n let url = step.value;\n if (!url) {\n const tabs = await chrome.tabs.query({}).catch(() => [] as Array<{ url?: string }>);\n const openurls = tabs.map(tab => tab.url ?? \"\").filter(Boolean);\n const recent = pickrecenttab(await memory.getrecenttabs(), openurls);\n if (!recent) throw new Error(\"No recently closed tab is available to reopen.\");\n url = recent.url;\n }\n await enforceratelimit(url, step.id, session?.id);\n await verifyopenurl(url, session);\n const created = await chrome.tabs.create({ url, active: true });\n await audit(\"navigation\", `Reopened the recently closed tab ${url}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Reopened ${url} in a new tab.`, details: { url, tabid: created?.id ?? 0 } };\n}\n\n/** Waits until one tab reports the complete load status, bounded by the internal evidence window. */\nasync function waitforcomplete(tabid: number): Promise<boolean> {\n const started = Date.now();\n for (;;) {\n const tab = await chrome.tabs.get(tabid).catch(() => undefined);\n if (!tab) return false;\n if (tab.status === \"complete\") return true;\n if (Date.now() - started >= evidencesettle) return false;\n await new Promise(resolve => setTimeout(resolve, evidencepoll));\n }\n}\n\n/** Records one navlist entry completion in the plan progress. */\nasync function recordnaventryoutcome(step: toolstep, plan: agentplan, entry: { index: number; url: string; ok: boolean }): Promise<void> {\n const base = await memory.getprogress();\n await memory.setprogress(recordnaventry(base, plan.id, step.id, entry, Date.now()));\n}\n\n/** Executes one reviewed navlist step: the reviewed urls are navigated sequentially, each entry recorded as it completes. */\nasync function executenavlist(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const urls = Array.isArray(options.urls) ? options.urls.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n if (urls.length === 0) throw new Error(\"A reviewed list of navigation urls is required.\");\n await refusenavpause(step);\n let completed = 0;\n let failed = \"\";\n for (let index = 0; index < urls.length; index += 1) {\n const url = urls[index] as string;\n const entrygate = navigationgranted(session, url);\n if (!entrygate.allowed) {\n failed = entrygate.reason ?? \"The navigation list entry was refused.\";\n await recordnaventryoutcome(step, plan, { index, url, ok: false });\n break;\n }\n try {\n await enforceratelimit(url, step.id, session?.id);\n await refusenavpause(step);\n await chrome.tabs.update(tabid, { url });\n await waitforcomplete(tabid);\n await recordnavigation(step, session, tabid);\n completed += 1;\n await recordnaventryoutcome(step, plan, { index, url, ok: true });\n } catch (error) {\n failed = error instanceof Error ? error.message : String(error);\n await recordnaventryoutcome(step, plan, { index, url, ok: false });\n break;\n }\n }\n const remaining = urls.length - completed;\n const ok = failed === \"\" && completed === urls.length;\n return {\n ok,\n summary: ok\n ? `Navigated the reviewed list of ${urls.length} url${urls.length === 1 ? \"\" : \"s\"} sequentially.`\n : `The navigation list stopped after ${completed} of ${urls.length} entries: ${failed}`,\n details: { completed, remaining, urls },\n };\n}\n\n/** Applies one reviewed per site wait profile during navigation and stores it per origin for the following steps. */\nasync function executenavprofile(step: toolstep, session: agentsession | undefined, origin: string): Promise<stepoutput> {\n const profile = parsewaitprofile(step);\n if (!profile) throw new Error(\"A reviewed waitprofile is required.\");\n const record: waitprofilerecord = { origin, profile, at: Date.now() };\n await memory.setwaitprofile(record);\n const effective = profilefororigin(profile, origin);\n await audit(\"navigation\", `Wait profile applied for ${origin} with signals ${effective.signals.join(\", \")}${effective.idle > 0 ? `, idle ${effective.idle}ms` : \"\"}${effective.timeout > 0 ? ` and timeout ${effective.timeout}ms` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Applied the reviewed wait profile for ${origin} during navigation.`, details: { origin, signals: effective.signals, idle: effective.idle, timeout: effective.timeout, overrides: (profile.overrides ?? []).map(override => override.origin) } };\n}\n\n/** Detects the http error, offline and certificate interstitial states of the session tab. */\nasync function executedetecthttp(session: agentsession | undefined, tabid: number): Promise<stepoutput> {\n const records = await memory.getnavrecords();\n const buffer = navbuffers.get(tabid) ?? [];\n const errors = buffer.filter(event => event.error !== undefined).map(event => event.error as string);\n const statuses = (records[0]?.chain.hops ?? []).map(hop => hop.status).filter(status => status > 0);\n const state = detecthttpstate({ offline: !navigator.onLine, errors, statuses });\n const policy = interstitialpolicy(state);\n return {\n ok: true,\n summary: state.httperror || state.offline\n ? `Detected ${state.reasons.length} navigation problem${state.reasons.length === 1 ? \"\" : \"s\"}: ${state.reasons.join(\"; \")}.`\n : \"No http error, offline state or certificate interstitial was detected.\",\n details: { httperror: state.httperror, offline: state.offline, certificate: state.certificate, reasons: state.reasons, interstitial: policy.interstitial, bypass: policy.bypass, guidance: policy.guidance },\n };\n}\n\n/** Returns the redirect chain of the latest navigation step with its statuses and timing. */\nasync function executereadredirects(session: agentsession | undefined): Promise<stepoutput> {\n const record = (await memory.getnavrecords()).find(item => !session || item.sessionid === session.id);\n if (!record) return { ok: false, summary: \"No navigation has been recorded yet.\", details: { chain: { hops: [], startedat: 0, endedat: 0 } } };\n return { ok: true, summary: `The latest navigation travelled ${Math.max(0, record.chain.hops.length - 1)} redirect${record.chain.hops.length - 1 === 1 ? \"\" : \"s\"} to ${record.finalurl}.`, details: { chain: record.chain, finalurl: record.finalurl, duration: record.chain.endedat - record.chain.startedat } };\n}\n\n/** Captures the final url after redirects of the latest navigation step. */\nasync function executereadfinalurl(session: agentsession | undefined): Promise<stepoutput> {\n const record = (await memory.getnavrecords()).find(item => !session || item.sessionid === session.id);\n if (!record) return { ok: false, summary: \"No navigation has been recorded yet.\", details: { finalurl: \"\" } };\n return { ok: true, summary: `The final url after redirects is ${record.finalurl}.`, details: { finalurl: record.finalurl, hops: record.chain.hops } };\n}\n\n/** Answers a basic auth prompt from stored reviewed credentials; the flow refuses to run without them. */\nasync function executehandleauth(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n const auths = await memory.getauths();\n const record = authfor(auths, step.value ?? \"\");\n if (!record) throw new Error(`No reviewed basic auth credentials are stored for ${step.value ?? \"\"}; store them from the side panel first.`);\n await audit(\"auth\", `Basic auth credentials for ${record.origin} reviewed as ${record.username} were armed for the auth prompt; the password stays out of every step detail.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Armed the reviewed basic auth credentials of ${record.username} for ${record.origin}.`, details: { origin: record.origin, username: record.username, reviewedat: record.reviewedat, armed: true } };\n}\n\n/** Prints the page through the browser print pipeline and routes the artifact record into the task artifact store. */\nasync function executeprintpdf(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const name = typeof options.name === \"string\" && options.name ? options.name : `${step.id}.pdf`;\n const artifact: artifactrecord = { id: randomid(), kind: \"printpdf\", name, stepid: step.id, at: Date.now() };\n await memory.addartifact(artifact);\n await audit(\"navigation\", `Printed the page to pdf through the browser print pipeline and routed the artifact ${name} into the task artifact store.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: output?.ok ?? false, summary: output?.summary ?? \"The print pipeline returned no result.\", details: { ...(output?.details ?? {}), artifact } };\n}\n\n/** Verifies the prefetch candidates against the session grants and queues the granted ones as page hints. */\nasync function executeprefetch(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const urls = Array.isArray(options.urls) ? options.urls.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const grants = session?.grants ?? (session ? [session.origin] : []);\n const verdict = prefetchcandidates(urls, grants);\n if (verdict.allowed.length === 0) throw new Error(\"No prefetch candidate is covered by the session grants.\");\n await refusenavpause(step);\n const derived: toolstep = { ...step, options: JSON.stringify({ ...options, urls: verdict.allowed }) };\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n await memory.setnavqueues({ prefetch: verdict.allowed.length, batchopen: (await memory.getnavqueues())?.batchopen ?? 0, updatedat: Date.now() });\n await refreshbadge();\n await audit(\"prefetch\", `Prefetched ${verdict.allowed.length} predicted next page${verdict.allowed.length === 1 ? \"\" : \"s\"} verified against the session grants${verdict.refused.length > 0 ? ` and refused ${verdict.refused.length} candidate${verdict.refused.length === 1 ? \"\" : \"s\"} outside the grants` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The prefetch step returned no result.\", details: { ...(output?.details ?? {}), allowed: verdict.allowed, refused: verdict.refused } };\n}\n\n/** Preconnects to the reviewed expected origins. */\nasync function executepreconnect(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const origins = preconnectorigins(Array.isArray(options.origins) ? options.origins.filter((item): item is string => typeof item === \"string\") : []);\n await refusenavpause(step);\n const output = await dispatchpagestep({ ...step, options: JSON.stringify({ ...options, origins }) }, tabid, origin, plan);\n await audit(\"prefetch\", `Preconnected to ${origins.length} expected origin${origins.length === 1 ? \"\" : \"s\"}: ${origins.join(\", \")}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The preconnect step returned no result.\", details: { ...(output?.details ?? {}), origins } };\n}\n\n/** Opens a url read from the clipboard on the explicit consent of the approved step. */\nasync function executeopenclipboard(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n await refusenavpause(step);\n const text = await navigator.clipboard.readText();\n let url = \"\";\n try { url = new URL(text.trim()).toString(); } catch { throw new Error(\"The clipboard does not hold a valid url.\"); }\n if (!url.startsWith(\"https://\")) throw new Error(\"The clipboard url must use HTTPS.\");\n await enforceratelimit(url, step.id, session?.id);\n await verifyopenurl(url, session);\n const output = await opencontainer(step, session, url, \"tab\", \"adjacent\");\n await audit(\"navigation\", `Opened the clipboard url ${url} on the explicit consent of the reviewed step.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ...output, details: { ...(output.details ?? {}), url } };\n}\n\n/** Verifies one url for safety and stores the verdict for review. */\nasync function executechecksafe(step: toolstep, session: agentsession | undefined, planid: string | undefined): Promise<stepoutput> {\n const verdict = { ...checksafe(step.value ?? \"\"), at: Date.now() };\n await memory.addsafety(verdict);\n await audit(\"navigation\", `Safety check of ${verdict.url} returned ${verdict.safe ? \"safe\" : \"unsafe\"}${verdict.reasons.length > 0 ? `: ${verdict.reasons.join(\"; \")}` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}), ...(planid ? { planid } : {}), stepid: step.id });\n return { ok: true, summary: verdict.safe ? `The url ${verdict.url} passed every safety check.` : `The url ${verdict.url} is unsafe: ${verdict.reasons.join(\"; \")}.`, details: { verdict } };\n}\n\n/** Opens one curated link list with per url safety checks; any unsafe url refuses the whole batch. */\nasync function executebatchopen(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const urls = Array.isArray(options.urls) ? options.urls.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const links: curatedlink[] = curatelinks(urls, url => ({ ...checksafe(url), at: Date.now() }));\n const curated: curatedlist = { id: randomid(), links, at: Date.now() };\n await memory.addcurated(curated);\n const set = batchopenset(links);\n if (set.refused.length > 0) {\n await memory.setnavqueues({ prefetch: (await memory.getnavqueues())?.prefetch ?? 0, batchopen: set.refused.length, updatedat: Date.now() });\n await refreshbadge();\n await audit(\"navigation\", `Batch open refused for ${set.refused.length} unsafe url${set.refused.length === 1 ? \"\" : \"s\"}; the curated list waits for review.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: false, summary: `The batch was refused because ${set.refused.length} of ${links.length} urls are unsafe; review the curated list before opening.`, details: { curated, refused: set.refused } };\n }\n await refusenavpause(step);\n const opened: number[] = [];\n for (const url of set.open) {\n await enforceratelimit(url, step.id, session?.id);\n const created = await chrome.tabs.create({ url, active: opened.length === 0 });\n opened.push(created?.id ?? 0);\n if (session) await memory.addtrailentry(session.id, { url, title: \"\", stepid: step.id, at: Date.now() });\n }\n await memory.addcurated({ ...curated, reviewedat: Date.now() });\n await memory.setnavqueues({ prefetch: (await memory.getnavqueues())?.prefetch ?? 0, batchopen: 0, updatedat: Date.now() });\n await refreshbadge();\n await audit(\"navigation\", `Batch opened ${set.open.length} curated url${set.open.length === 1 ? \"\" : \"s\"} after per url safety checks.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Opened ${set.open.length} curated url${set.open.length === 1 ? \"\" : \"s\"} after per url safety checks.`, details: { curated, tabids: opened } };\n}\n\n/** Toggles the navigation pause that holds navigation while a consent prompt is open. */\nasync function executepausenav(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n const control = await memory.getnavcontrol();\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n if (control?.pausedat) {\n await memory.setnavcontrol({ updatedat: Date.now() });\n await audit(\"resume\", `Navigation resumed after ${Date.now() - control.pausedat} milliseconds of pause.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: \"Navigation resumed; reviewed navigation steps can run again.\", details: { paused: false } };\n }\n const reason = typeof options.reason === \"string\" && options.reason ? options.reason : \"a consent prompt is open\";\n await memory.setnavcontrol({ pausedat: Date.now(), reason, updatedat: Date.now() });\n await audit(\"pause\", `Navigation paused while ${reason}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Navigation paused while ${reason}.`, details: { paused: true, reason } };\n}\n\n/** Records the navigation intent detected from the plan for audit review. */\nasync function executenavintent(step: toolstep, session: agentsession | undefined, origin: string): Promise<stepoutput> {\n const record: navintentrecord = { id: randomid(), intent: step.value ?? \"\", origin, ...(session ? { sessionid: session.id } : {}), stepid: step.id, at: Date.now() };\n await memory.addnavintent(record);\n await audit(\"navigation\", `Navigation intent \"${record.intent}\" recorded for ${origin}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Recorded the navigation intent \"${record.intent}\".`, details: { intent: record.intent, origin, at: record.at } };\n}\n\n/** Applies the reviewed per domain navigation rate limit and reports the live window state. */\nasync function executenavrate(step: toolstep, session: agentsession | undefined, origin: string): Promise<stepoutput> {\n const limit = parseratelimit(step);\n if (!limit) throw new Error(\"A reviewed ratelimit is required.\");\n if (!limit.domain) limit.domain = domainof(origin) || origin;\n const states = await memory.getratestates();\n const stored = states.find(item => item.domain === limit.domain);\n const live = ratewindow(stored, limit, Date.now());\n const decision = rateallows(live, Date.now());\n await memory.setratestate(live);\n await audit(\"rate\", `Navigation rate limit of ${limit.ceiling} per ${limit.window} milliseconds applied for ${limit.domain}; ${decision.remaining} navigation${decision.remaining === 1 ? \"\" : \"s\"} remaining in the window.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Applied the reviewed navigation rate limit for ${limit.domain}.`, details: { domain: limit.domain, window: limit.window, ceiling: limit.ceiling, count: live.count, remaining: decision.remaining, retryafter: decision.retryafter } };\n}\n\n/** Restores the navigation trail of the session for audit. */\nasync function executetrailaudit(session: agentsession | undefined): Promise<stepoutput> {\n if (!session) throw new Error(\"No active browser session exists.\");\n const trail = await memory.gettrail(session.id);\n return { ok: true, summary: `The navigation trail of the session holds ${trail.length} visited url${trail.length === 1 ? \"\" : \"s\"}.`, details: { trail } };\n}\n\n/** Dispatches one reviewed navigation kind: page world steps go through the bridge, container and state steps stay in the background. */\nasync function executenavigationkind(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n switch (step.kind) {\n case \"openlink\": return executeopenlink(step, session);\n case \"openprivate\": return executeopenlink(step, session);\n case \"deeplink\": return executedeeplink(step, session);\n case \"reopentab\": return executereopentab(step, session);\n case \"reloadcache\": {\n await refusenavpause(step);\n await chrome.tabs.reload(tabid, { bypassCache: true });\n const record = await recordnavigation(step, session, tabid);\n await audit(\"navigation\", `Reloaded the page bypassing the cache.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: \"Reloaded the page bypassing the cache.\", details: { bypasscache: true, finalurl: record.finalurl } };\n }\n case \"navlist\": return executenavlist(step, session, plan, tabid);\n case \"navprofile\": return executenavprofile(step, session, origin);\n case \"detecthttp\": return executedetecthttp(session, tabid);\n case \"readredirects\": return executereadredirects(session);\n case \"readfinalurl\": return executereadfinalurl(session);\n case \"handleauth\": return executehandleauth(step, session);\n case \"printpdf\": return executeprintpdf(step, session, plan, tabid, origin);\n case \"prefetch\": return executeprefetch(step, session, plan, tabid, origin);\n case \"preconnect\": return executepreconnect(step, session, plan, tabid, origin);\n case \"checksafe\": return executechecksafe(step, session, plan.id);\n case \"batchopen\": return executebatchopen(step, session);\n case \"pausenav\": return executepausenav(step, session);\n case \"navintent\": return executenavintent(step, session, origin);\n case \"navrate\": return executenavrate(step, session, origin);\n case \"trailaudit\": return executetrailaudit(session);\n case \"openclipboard\": return executeopenclipboard(step, session);\n default: {\n await refusenavpause(step);\n if (ratecheckedkinds.has(step.kind)) await enforceratelimit(origin, step.id, session?.id);\n const derived = injectallowedorigins(step, session);\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n if (step.kind === \"followlink\" || step.kind === \"spanav\") {\n const record = await recordnavigation(step, session, tabid);\n return { ...(output ?? { ok: false, summary: \"The navigation step returned no result.\" }), details: { ...((output ?? {}).details ?? {}), finalurl: record.finalurl, hops: record.chain.hops.length } };\n }\n return output ?? { ok: false, summary: \"The navigation step returned no result.\" };\n }\n }\n}\n\n/** Live tab set of the whole browser resolved into the serializable tabshape contract. */\nasync function livetabs(): Promise<tabshape[]> {\n const tabs = await chrome.tabs.query({}).catch(() => [] as chrome.tabs.Tab[]);\n return tabs.map(tab => ({\n tabid: tab.id ?? 0,\n url: tab.url ?? \"\",\n title: tab.title ?? \"\",\n index: tab.index,\n windowid: tab.windowId ?? 0,\n active: tab.active,\n pinned: tab.pinned,\n audible: tab.audible ?? false,\n muted: tab.mutedInfo?.muted ?? false,\n discarded: tab.discarded ?? false,\n }));\n}\n\n/** Live window set resolved into the serializable windowshape contract. */\nasync function livewindows(): Promise<windowshape[]> {\n const windows = await chrome.windows.getAll().catch(() => [] as chrome.windows.Window[]);\n return windows.map(item => ({\n windowid: item.id ?? 0,\n left: item.left ?? 0,\n top: item.top ?? 0,\n width: item.width ?? 0,\n height: item.height ?? 0,\n state: item.state === \"maximized\" || item.state === \"minimized\" || item.state === \"fullscreen\" ? item.state : \"normal\",\n incognito: item.incognito ?? false,\n focused: item.focused,\n }));\n}\n\n/** Live watchtab event buffers per watch id, filled by the tab event listeners and read by the step executor. */\nconst tabwatchbuffers = new Map<string, tabwatchevent[]>();\n/** Last known titles per tab so closed tabs keep their title inside the closed tab history. */\nconst lastknowntitles = new Map<number, string>();\n\n/** Records one tab event into every live watchtab registration and its step stream buffer. */\nasync function recordtabwatchevent(event: \"title\" | \"activated\" | \"closed\", tabid: number, detail?: string): Promise<void> {\n const now = Date.now();\n for (const watch of await memory.getwatches()) {\n if (watch.closedat !== undefined || watch.kind !== \"watchtab\") continue;\n if (watchclosed(watch.startedat, watch.lifetime, now)) continue;\n if (watch.events.length > 0 && !watch.events.includes(event)) continue;\n const record: tabwatchevent = { watchid: watch.watchid, event, tabid, ...(detail !== undefined ? { detail } : {}), at: now };\n await memory.addtabwatchevent(record);\n tabwatchbuffers.set(watch.watchid, [...(tabwatchbuffers.get(watch.watchid) ?? []), record]);\n }\n}\n\n/** Builds one tab report with matched tabs carrying audio state and metadata, the group registry and the badge states. */\nasync function buildtabreport(matches: tabshape[]): Promise<tabreport> {\n const [groups, badges, metas] = await Promise.all([memory.gettabgroups(), memory.getbadges(), memory.gettabmetas()]);\n const metabytab = new Map(metas.map(meta => [meta.tabid, meta]));\n const entries: tabreportentry[] = matches.map(tab => ({\n tabid: tab.tabid,\n url: tab.url,\n title: tab.title,\n index: tab.index,\n windowid: tab.windowid,\n active: tab.active,\n pinned: tab.pinned,\n audible: tab.audible,\n muted: tab.muted,\n discarded: tab.discarded,\n ...(metabytab.has(tab.tabid) ? { meta: metabytab.get(tab.tabid) as tabmeta } : {}),\n }));\n return { matches: entries, groups: groups.map(group => ({ name: group.name, color: group.color, tabids: group.tabids, collapsed: group.collapsed })), badges };\n}\n\n/** Reads the numeric tab ids a reviewed tabs and windows command step addresses, from the value or the reviewed list. */\nfunction commandtabids(step: toolstep, options: Record<string, unknown>): number[] {\n const listed = Array.isArray(options.tabs) ? options.tabs.filter((item): item is number => typeof item === \"number\" && Number.isInteger(item) && item >= 0) : [];\n const single = step.value && /^\\d+$/.test(step.value) ? [Number.parseInt(step.value, 10)] : [];\n return listed.length > 0 ? listed : single;\n}\n\n/** Executes one reviewed tabs and windows command kind against the live browser surface with persistence and audits. */\nasync function executetabscommand(step: toolstep, session: agentsession | undefined, plan: agentplan, sessiontabid: number): Promise<stepoutput> {\n const options = stepoptions(step);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n const windowid = step.value && /^\\d+$/.test(step.value) ? Number.parseInt(step.value, 10) : 0;\n const layoutgate = layoutmutationgranted(session, Date.now());\n if (islayoutkind(step.kind) && !layoutgate.allowed) throw new Error(layoutgate.reason ?? \"Group and layout mutations stay inside the active session.\");\n switch (step.kind) {\n case \"querytabs\": {\n const query = parsetabquery(step);\n if (!query) throw new Error(\"A reviewed tabquery is required.\");\n const matches = querymatches(query, await livetabs());\n const report = await buildtabreport(matches);\n await audit(\"tab\", `Queried the live tab set and matched ${matches.length} tab${matches.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Matched ${matches.length} open tab${matches.length === 1 ? \"\" : \"s\"} by the reviewed tabquery.`, details: { report, matches: matches.length } };\n }\n case \"duplicatetab\": {\n const source = Number.parseInt(step.value ?? \"\", 10);\n const created = await chrome.tabs.duplicate(source);\n await audit(\"tab\", `Duplicated tab ${source} with its history into tab ${created?.id ?? 0}.`, extra);\n return { ok: true, summary: `Duplicated tab ${source} with its history.`, details: { sourcetab: source, tabid: created?.id ?? 0 } };\n }\n case \"closepattern\": {\n const query = parsetabquery(step);\n if (!query) throw new Error(\"A reviewed tabquery is required.\");\n const tabs = await livetabs();\n const selection = closeselection(query, tabs, session?.tabid ?? sessiontabid);\n if (selection.refused.length > 0) throw new Error(\"The close pattern matches the session tab itself; review the pattern so the session tab survives.\");\n if (selection.targets.length === 0) return { ok: true, summary: \"The reviewed close pattern matched no tab outside the session tab.\", details: { closed: 0 } };\n for (const target of selection.targets) await chrome.tabs.remove(target.tabid).catch(() => undefined);\n await audit(\"tab\", `Closed ${selection.targets.length} tab${selection.targets.length === 1 ? \"\" : \"s\"} matching the reviewed close pattern.`, extra);\n return { ok: true, summary: `Closed ${selection.targets.length} tab${selection.targets.length === 1 ? \"\" : \"s\"} matching the reviewed pattern.`, details: { closed: selection.targets.length, urls: selection.targets.map(tab => tab.url) } };\n }\n case \"pintab\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n await chrome.tabs.update(target, { pinned: options.pinned === true });\n await audit(\"tab\", `${options.pinned === true ? \"Pinned\" : \"Unpinned\"} tab ${target} by the reviewed flag.`, extra);\n return { ok: true, summary: `${options.pinned === true ? \"Pinned\" : \"Unpinned\"} tab ${target}.`, details: { tabid: target, pinned: options.pinned === true } };\n }\n case \"mutetab\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n await chrome.tabs.update(target, { muted: options.muted === true });\n await audit(\"tab\", `${options.muted === true ? \"Muted\" : \"Unmuted\"} tab ${target} by the reviewed flag.`, extra);\n return { ok: true, summary: `${options.muted === true ? \"Muted\" : \"Unmuted\"} tab ${target}.`, details: { tabid: target, muted: options.muted === true } };\n }\n case \"movetab\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n await chrome.tabs.move(target, { index: options.index as number });\n const groups = regroupaftermoves(await memory.gettabgroups(), await livetabs(), Date.now());\n for (const group of groups) await memory.settabgroup(group);\n await audit(\"tab\", `Moved tab ${target} to index ${options.index} inside its window; group membership is kept.`, extra);\n return { ok: true, summary: `Moved tab ${target} to index ${options.index}.`, details: { tabid: target, index: options.index } };\n }\n case \"movetabwindow\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n await chrome.tabs.move(target, { windowId: options.windowid as number, index: -1 });\n const groups = regroupaftermoves(await memory.gettabgroups(), await livetabs(), Date.now());\n for (const group of groups) await memory.settabgroup(group);\n await audit(\"tab\", `Moved tab ${target} across windows into window ${options.windowid}; group membership is kept.`, extra);\n return { ok: true, summary: `Moved tab ${target} into window ${options.windowid}.`, details: { tabid: target, windowid: options.windowid } };\n }\n case \"grouptabs\": {\n const group = options.group as { name?: unknown; color?: unknown; tabids?: unknown };\n const record: tabgrouprecord = { groupid: randomid(), name: String(group.name ?? \"\"), color: String(group.color ?? \"grey\"), tabids: Array.isArray(group.tabids) ? group.tabids.filter((item): item is number => typeof item === \"number\") : [], collapsed: false, savedat: Date.now() };\n await memory.settabgroup(record);\n await audit(\"group\", `Grouped ${record.tabids.length} tab${record.tabids.length === 1 ? \"\" : \"s\"} under the reviewed name ${record.name} with color ${record.color}; membership lives in the Devthink group registry.`, extra);\n return { ok: true, summary: `Grouped ${record.tabids.length} tab${record.tabids.length === 1 ? \"\" : \"s\"} under ${record.name}.`, details: { group: record } };\n }\n case \"colorgroup\": {\n const groups = await memory.gettabgroups();\n const target = groups.find(group => group.name === options.name);\n if (!target) throw new Error(`No tab group named ${options.name} is stored yet.`);\n const updated: tabgrouprecord = { ...target, color: String(options.color), savedat: Date.now() };\n await memory.settabgroup(updated);\n await audit(\"group\", `Set the color of tab group ${updated.name} to ${updated.color}.`, extra);\n return { ok: true, summary: `Set the color of group ${updated.name} to ${updated.color}.`, details: { group: updated } };\n }\n case \"collapsegroup\": {\n const groups = await memory.gettabgroups();\n const target = groups.find(group => group.name === options.name);\n if (!target) throw new Error(`No tab group named ${options.name} is stored yet.`);\n const updated: tabgrouprecord = { ...target, collapsed: options.collapsed === true, savedat: Date.now() };\n await memory.settabgroup(updated);\n await audit(\"group\", `${updated.collapsed ? \"Collapsed\" : \"Expanded\"} tab group ${updated.name}.`, extra);\n return { ok: true, summary: `${updated.collapsed ? \"Collapsed\" : \"Expanded\"} group ${updated.name}.`, details: { group: updated } };\n }\n case \"discardtab\": {\n const ids = commandtabids(step, options);\n if (ids.length === 0) throw new Error(\"A numeric tab id or a reviewed list of tab ids is required.\");\n const candidates = discardcandidates(await livetabs()).filter(tab => ids.includes(tab.tabid));\n const discarded: number[] = [];\n const urls: Array<{ tabid: number; url: string }> = [];\n for (const candidate of candidates) {\n const result = await chrome.tabs.discard(candidate.tabid).catch(() => undefined);\n if (result) { discarded.push(candidate.tabid); urls.push({ tabid: candidate.tabid, url: candidate.url }); }\n }\n await audit(\"discard\", `Discarded ${discarded.length} inactive tab${discarded.length === 1 ? \"\" : \"s\"} to save memory; the urls survive for on demand restore.`, extra);\n return { ok: discarded.length > 0, summary: `Discarded ${discarded.length} inactive tab${discarded.length === 1 ? \"\" : \"s\"}; their urls stay available for restore.`, details: { discarded, urls, refused: ids.filter(id => !discarded.includes(id)) } };\n }\n case \"reloadtabs\": {\n const ids = commandtabids(step, options);\n if (ids.length === 0) throw new Error(\"A numeric tab id or a reviewed list of tab ids is required.\");\n for (const id of ids) await chrome.tabs.reload(id).catch(() => undefined);\n await audit(\"tab\", `Reloaded ${ids.length} reviewed tab${ids.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Reloaded ${ids.length} tab${ids.length === 1 ? \"\" : \"s\"}.`, details: { tabs: ids } };\n }\n case \"zoomin\":\n case \"zoomout\": {\n const target = step.value && /^\\d+$/.test(step.value) ? Number.parseInt(step.value, 10) : sessiontabid;\n const current = await chrome.tabs.getZoom(target);\n const next = zoomstep(current, step.kind === \"zoomin\" ? \"in\" : \"out\", typeof options.step === \"number\" && options.step > 0 ? options.step : 0.1);\n await chrome.tabs.setZoom(target, next);\n await audit(\"tab\", `Zoomed tab ${target} ${step.kind === \"zoomin\" ? \"in\" : \"out\"} from ${current} to ${next} by the reviewed step.`, extra);\n return { ok: true, summary: `Zoomed tab ${target} ${step.kind === \"zoomin\" ? \"in\" : \"out\"} to ${next}.`, details: { tabid: target, from: current, to: next, step: typeof options.step === \"number\" ? options.step : 0.1 } };\n }\n case \"switchtab\": {\n const direction = options.direction === \"previous\" ? \"previous\" : \"next\";\n const focusedwindow = (await livewindows()).find(item => item.focused)?.windowid ?? 0;\n const windowtabs = (await livetabs()).filter(tab => tab.windowid === focusedwindow);\n const active = windowtabs.find(tab => tab.active);\n const target = switchtarget(windowtabs, direction, active?.index ?? 0);\n const totab = windowtabs.find(tab => tab.index === target);\n if (!totab) throw new Error(\"No neighbor tab is available to switch to.\");\n await chrome.tabs.update(totab.tabid, { active: true });\n await audit(\"tab\", `Switched to the ${direction} tab ${totab.tabid}.`, extra);\n return { ok: true, summary: `Switched to the ${direction} tab.`, details: { tabid: totab.tabid, direction } };\n }\n case \"maximizewindow\": {\n await chrome.windows.update(windowid, { state: \"maximized\" });\n await audit(\"window\", `Maximized window ${windowid}.`, extra);\n return { ok: true, summary: `Maximized window ${windowid}.`, details: { windowid, state: \"maximized\" } };\n }\n case \"minimizewindow\": {\n await chrome.windows.update(windowid, { state: \"minimized\" });\n await audit(\"window\", `Minimized window ${windowid}.`, extra);\n return { ok: true, summary: `Minimized window ${windowid}.`, details: { windowid, state: \"minimized\" } };\n }\n case \"restorewindow\": {\n const bounds = options.bounds as { left?: number; top?: number; width?: number; height?: number } | undefined;\n await chrome.windows.update(windowid, { state: \"normal\", ...(bounds && typeof bounds.left === \"number\" ? { left: bounds.left } : {}), ...(bounds && typeof bounds.top === \"number\" ? { top: bounds.top } : {}), ...(bounds && typeof bounds.width === \"number\" ? { width: bounds.width } : {}), ...(bounds && typeof bounds.height === \"number\" ? { height: bounds.height } : {}) });\n await audit(\"window\", `Restored window ${windowid} to its reviewed bounds.`, extra);\n return { ok: true, summary: `Restored window ${windowid} to its reviewed bounds.`, details: { windowid, bounds: bounds ?? null } };\n }\n case \"focuswindow\": {\n await chrome.windows.update(windowid, { focused: true });\n await audit(\"window\", `Focused window ${windowid}.`, extra);\n return { ok: true, summary: `Focused window ${windowid}.`, details: { windowid } };\n }\n case \"scratchwindow\": {\n const url = typeof step.value === \"string\" && step.value ? step.value : \"about:blank\";\n const created = await chrome.windows.create({ url });\n const window = created?.id ?? 0;\n await memory.setscratchwindows([...(await memory.getscratchwindows()), window]);\n await audit(\"window\", `Opened a scratch window ${window} for split work.`, extra);\n return { ok: true, summary: `Opened a scratch window for split work.`, details: { windowid: window, url } };\n }\n case \"incognitowindow\": {\n const created = await chrome.windows.create({ url: step.value ?? \"\", incognito: true });\n await audit(\"window\", `Opened an incognito window ${created?.id ?? 0} for ${step.value} on the explicit reviewed request; the window stays separated from the session grant inheritance.`, extra);\n return { ok: true, summary: `Opened an incognito window for ${step.value} on explicit request.`, details: { windowid: created?.id ?? 0, url: step.value, grantsinherited: windowprofilegrants(\"incognito\") } };\n }\n case \"restoretab\": {\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n let url = step.value && /^https:\\/\\//.test(step.value) ? step.value : undefined;\n if (!url) {\n const closed = (await memory.getclosedtabs()).find(entry => !open.includes(entry.url));\n if (!closed) throw new Error(\"No closed tab is available to restore from the session history.\");\n url = closed.url;\n }\n const created = await chrome.tabs.create({ url, active: true });\n await audit(\"tab\", `Restored the closed tab ${url} from the session history.`, extra);\n return { ok: true, summary: `Restored ${url} from the closed tab history.`, details: { url, tabid: created?.id ?? 0 } };\n }\n case \"savelayout\": {\n const name = typeof options.name === \"string\" ? options.name : \"\";\n const [tabs, windows, groups, scratch] = await Promise.all([livetabs(), livewindows(), memory.gettabgroups(), memory.getscratchwindows()]);\n const layout = buildlayout(name, tabs, windows, groups, scratch, Date.now());\n await memory.setlayout(layout);\n await audit(\"layout\", `Saved the tab layout ${name} with ${layout.tabs.length} tab${layout.tabs.length === 1 ? \"\" : \"s\"}, ${layout.groups.length} group${layout.groups.length === 1 ? \"\" : \"s\"} and ${layout.windows.length} window bound${layout.windows.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Saved the tab layout ${name}.`, details: { layout } };\n }\n case \"restorelayout\": {\n const name = typeof options.name === \"string\" ? options.name : \"\";\n const layout = await memory.getlayout(name);\n if (!layout) throw new Error(`No tab layout named ${name} is stored yet.`);\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n const urls = layoutrestoreplan(layout, open);\n const created: number[] = [];\n for (const url of urls) {\n const tab = await chrome.tabs.create({ url, active: created.length === 0 });\n created.push(tab?.id ?? 0);\n }\n await audit(\"layout\", `Restored the tab layout ${name}: ${created.length} tab${created.length === 1 ? \"\" : \"s\"} reopened, ${layout.tabs.length - created.length} already open.`, extra);\n return { ok: true, summary: `Restored the tab layout ${name}.`, details: { name, reopened: created.length, alreadyopen: layout.tabs.length - created.length, tabs: created } };\n }\n case \"findclones\": {\n const clones = clonetabs(await livetabs());\n await audit(\"tab\", `Detected ${clones.length} duplicate url group${clones.length === 1 ? \"\" : \"s\"} across the open tabs.`, extra);\n return { ok: true, summary: clones.length === 0 ? \"No duplicate tab was detected by normalized url comparison.\" : `Detected ${clones.length} duplicate url group${clones.length === 1 ? \"\" : \"s\"}.`, details: { clones } };\n }\n case \"searchtabs\": {\n const matches = searchtabmatches(await livetabs(), step.value ?? \"\");\n await audit(\"tab\", `Searched the open tabs and matched ${matches.length} tab${matches.length === 1 ? \"\" : \"s\"} for \"${step.value}\".`, extra);\n return { ok: true, summary: `Matched ${matches.length} open tab${matches.length === 1 ? \"\" : \"s\"} for \"${step.value}\".`, details: { matches } };\n }\n case \"badgetab\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n const badge: tabbadge = { tabid: target, taskid: typeof options.taskid === \"string\" && options.taskid ? options.taskid : plan.id, label: typeof options.label === \"string\" ? options.label : \"\", setat: Date.now() };\n await memory.setbadge(badge);\n await refreshbadge();\n await audit(\"badge\", `Set the task badge of tab ${target} to ${badge.label} for task ${badge.taskid}.`, extra);\n return { ok: true, summary: `Set the badge of tab ${target} to ${badge.label}.`, details: { badge } };\n }\n case \"attachmeta\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n const meta: tabmeta = {\n tabid: target,\n taskrefs: Array.isArray(options.taskrefs) ? options.taskrefs.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [],\n provenance: typeof options.provenance === \"string\" && options.provenance ? options.provenance : \"plan step\",\n labels: Array.isArray(options.labels) ? options.labels.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [],\n at: Date.now(),\n };\n await memory.settabmeta(meta);\n await memory.setprogress(assigntasktab(await memory.getprogress(), plan.id, target, Date.now()));\n await audit(\"tab\", `Attached metadata to tab ${target} with ${meta.labels.length} label${meta.labels.length === 1 ? \"\" : \"s\"} and ${meta.taskrefs.length} task ref${meta.taskrefs.length === 1 ? \"\" : \"s\"}; the tab joins the task progress.`, extra);\n return { ok: true, summary: `Attached metadata to tab ${target} for task routing.`, details: { meta } };\n }\n case \"listaudio\": {\n const playing = audiotabs(await livetabs());\n await audit(\"tab\", `Listed ${playing.length} tab${playing.length === 1 ? \"\" : \"s\"} that are playing audio.`, extra);\n return { ok: true, summary: `${playing.length} tab${playing.length === 1 ? \" is\" : \"s are\"} playing audio.`, details: { audio: playing } };\n }\n case \"reopenrun\": {\n const run = typeof options.run === \"string\" ? options.run : \"\";\n const snapshots = await memory.getsnapshots();\n const snapshot = snapshots.find(item => item.sessionid === run) ?? snapshots.find(item => item.id === run);\n if (!snapshot) throw new Error(`No stored session snapshot exists for the run ${run}.`);\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n const urls = layoutrestoreplan(snapshot.layout, open);\n const created: number[] = [];\n for (const url of urls) {\n const tab = await chrome.tabs.create({ url, active: created.length === 0 });\n created.push(tab?.id ?? 0);\n }\n await audit(\"layout\", `Reopened ${created.length} tab${created.length === 1 ? \"\" : \"s\"} of the previous run ${run}.`, extra);\n return { ok: true, summary: `Reopened ${created.length} tab${created.length === 1 ? \"\" : \"s\"} of the previous run.`, details: { run, reopened: created.length, tabs: created } };\n }\n case \"snapshotsession\": {\n const [tabs, windows, groups, scratch] = await Promise.all([livetabs(), livewindows(), memory.gettabgroups(), memory.getscratchwindows()]);\n const layout = buildlayout(`session ${new Date().toISOString()}`, tabs, windows, groups, scratch, Date.now());\n const snapshot: sessionsnapshot = { id: randomid(), ...(session ? { sessionid: session.id } : {}), layout, capturedat: Date.now() };\n await memory.addsnapshot(snapshot);\n await audit(\"layout\", `Captured the full session snapshot with ${layout.tabs.length} tab${layout.tabs.length === 1 ? \"\" : \"s\"} and ${layout.windows.length} window${layout.windows.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Captured the session snapshot of ${layout.tabs.length} tabs and ${layout.windows.length} windows.`, details: { snapshot } };\n }\n case \"watchtab\": {\n const lifetime = typeof options.lifetime === \"number\" && Number.isFinite(options.lifetime) && options.lifetime > 0 ? options.lifetime : 0;\n if (lifetime <= 0) throw new Error(\"A reviewed watch lifetime window in milliseconds is required in options.\");\n const events = Array.isArray(options.events) ? options.events.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const watchid = typeof options.watchid === \"string\" && options.watchid.trim() ? options.watchid : randomid();\n const watch: watchregistration = { watchid, kind: \"watchtab\", stepid: step.id, sessionid: session?.id ?? plan.id, origin: session?.origin ?? plan.origin, scopes: [], events, startedat: Date.now(), lifetime };\n await memory.addwatch(watch);\n await audit(\"watch\", `Watchtab registered under id ${watchid} for the reviewed lifetime of ${lifetime} milliseconds${events.length > 0 ? ` over events ${events.join(\", \")}` : \" over title, activation and closure events\"}.`, extra);\n await new Promise(resolve => setTimeout(resolve, lifetime));\n const observed = watchtabdispatch(tabwatchbuffers.get(watchid) ?? [], watchid, events);\n await memory.closewatch(watchid, Date.now());\n tabwatchbuffers.delete(watchid);\n await audit(\"watch\", `Watchtab ${watchid} closed after its reviewed lifetime of ${lifetime} milliseconds with ${observed.length} observed event${observed.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Observed ${observed.length} tab event${observed.length === 1 ? \"\" : \"s\"} inside the reviewed lifetime.`, details: { watchid, events: observed } };\n }\n default: return { ok: false, summary: \"Unsupported tabs and windows command.\" };\n }\n}\n\n/** Stores one reviewed form profile under its name behind the origin grants; password entries are refused by the form record grammar. */\nasync function executesaveprofiles(step: toolstep, session: agentsession | undefined, origin: string): Promise<stepoutput> {\n const options = stepoptions(step);\n const record = parseformrecord(options.formrecord);\n const name = typeof options.name === \"string\" ? options.name : \"\";\n if (!name || !record) throw new Error(\"A reviewed profile name and form record are required.\");\n const grants = session?.grants ?? (session ? [session.origin] : [origin]);\n const profile: formprofile = { name, fields: record.entries, grants, savedat: Date.now() };\n await memory.setprofile(profile);\n await audit(\"fill\", `Form profile ${name} stored locally with ${profile.fields.length} field entries behind the origin grants of ${grants.join(\", \")}; password entries are refused.`, { ...(session ? { sessionid: session.id } : {}) });\n return { ok: true, summary: `Stored the form profile ${name} locally with ${profile.fields.length} field entries.`, details: { profile: { name: profile.name, fields: profile.fields.length, grants: profile.grants } } };\n}\n\n/** Opens one asksubmit prompt through the sidepanel approval surface and records the submission ticket with the values hash. */\nasync function executeasksubmit(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const values = Array.isArray(output?.details?.values) ? output?.details?.values as Array<{ label: string; value: string }> : [];\n const ticket: submitticket = { id: randomid(), form: step.value ?? \"\", valueshash: valueshash(values), consentref: step.id, at: Date.now() };\n await memory.setticket(ticket);\n await audit(\"submit\", `Asksubmit prompt opened for form ${ticket.form || \"the reviewed form\"} with the values hash ${ticket.valueshash}; the submission waits for the user approval.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n await refreshbadge();\n return { ok: true, summary: `Asksubmit prompt opened for form ${ticket.form || \"the reviewed form\"}; the submission waits for your approval.`, details: { ticket, values } };\n}\n\n/** Submits one reviewed form through its owning form; the consent ref must match an approved asksubmit ticket. */\nasync function executesubmitform(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const consentref = typeof stepoptions(step).consentref === \"string\" ? stepoptions(step).consentref as string : \"\";\n const ticket = (await memory.gettickets()).find(item => item.approved === true && (item.consentref === consentref || item.id === consentref));\n if (!ticket) throw new Error(\"No approved asksubmit ticket matches the reviewed consent ref; approve the submission in the review panel first.\");\n const output = await dispatchpagestep(step, tabid, origin, plan) ?? { ok: false, summary: \"The form submission returned no result.\" };\n await audit(\"submit\", `Form ${ticket.form || \"the reviewed form\"} submitted through its owning form under ticket ${ticket.id} with values hash ${ticket.valueshash} and outcome ${output.ok ? \"delivered\" : \"refused\"}.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ...output, details: { ...(output.details ?? {}), ticket: { id: ticket.id, valueshash: ticket.valueshash, consentref: ticket.consentref } } };\n}\n\n/** Retries a failed submission with the reviewed backoff windows; every retry resubmits through the owning form. */\nasync function executeretryform(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const rule = parsebackoff(step);\n if (!rule) throw new Error(\"A reviewed backoff rule with wait and factor is required.\");\n const windows = backoffwaits(rule.attempts, rule.wait, rule.factor);\n let attempts = 0;\n let output: stepoutput | undefined;\n while (attempts < rule.attempts) {\n attempts += 1;\n output = await dispatchpagestep(step, tabid, origin, plan) ?? { ok: false, summary: \"The retried submission returned no result.\" };\n if (output.ok) break;\n const waitwindow = windows[attempts - 1];\n if (waitwindow !== undefined && attempts < rule.attempts) await new Promise(resolve => setTimeout(resolve, waitwindow));\n }\n await audit(\"retry\", `Form submission retried ${attempts} time${attempts === 1 ? \"\" : \"s\"} with the reviewed backoff windows ${windows.join(\", \") || \"none\"} milliseconds; outcome ${output?.ok ? \"delivered\" : \"refused\"}.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The retried submission returned no result.\", details: { attempts, windows, ok: Boolean(output?.ok) } };\n}\n\n/** Fills one password field after explicit consent; the reviewed consent ref is required and the password never appears in the audit trail. */\nasync function executeconsentpassword(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const consentref = typeof stepoptions(step).consentref === \"string\" ? stepoptions(step).consentref as string : \"\";\n const gate = passwordconsentgranted(step);\n if (!gate.allowed) throw new Error(gate.reason ?? \"A password fill requires a reviewed consent ref.\");\n const output = await dispatchpagestep(step, tabid, origin, plan);\n await audit(\"consent\", `Password field filled after the explicit consent ref ${consentref}; the value never appears in the audit trail.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return output ?? { ok: false, summary: \"The password fill returned no result.\" };\n}\n\n/** Attaches one generated artifact from the run store to a reviewed file input inside the form submission. */\nasync function executeattachfile(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const name = step.value ?? \"\";\n const artifacts = await memory.getartifacts();\n const artifact = artifacts.find(item => item.name === name || item.id === name);\n if (!artifact) throw new Error(`No generated artifact named ${name} exists in the run store yet.`);\n const derived: toolstep = { ...step, options: JSON.stringify({ ...stepoptions(step), artifact: artifact.id, artifactname: artifact.name }) };\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n await audit(\"fill\", `Artifact ${artifact.name} of kind ${artifact.kind} attached to the reviewed file input inside the form submission.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ...output ?? { ok: false, summary: \"The artifact attachment returned no result.\" }, details: { ...(output?.details ?? {}), artifact } };\n}\n\n/** Reads captcha presence, hands control back to the user and pauses the plan while the captcha handoff stays open. */\nasync function executecaptchahandoff(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const output = await dispatchpagestep(step, tabid, origin, plan) ?? { ok: false, summary: \"The captcha probe returned no result.\" };\n if (output.details?.captcha !== true) return { ok: true, summary: \"No captcha was detected; the plan continues.\", details: { captcha: false } };\n const handoff: captchahandoff = { id: randomid(), origin, resolved: false, openedat: Date.now() };\n await memory.addcaptcha(handoff);\n if (session && !session.pausedat && !session.stoppedat) await memory.setsession({ ...session, pausedat: Date.now() });\n await audit(\"handoff\", `Captcha detected on ${origin}; control handed back to the user and the plan pauses until the handoff ${handoff.id} resolves.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n await refreshbadge();\n return { ok: true, summary: \"Captcha detected; control is yours and the plan waits until you resolve the handoff.\", details: { captcha: true, handoff } };\n}\n\n/** Executes one reviewed forms and data kind: profile storage, submission tickets, retries, consent fills and artifact attachments stay in the background, page work dispatches through the bridge. */\nasync function executeformstep(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n switch (step.kind) {\n case \"saveprofiles\": return executesaveprofiles(step, session, origin);\n case \"asksubmit\": return executeasksubmit(step, session, plan, tabid, origin);\n case \"submitform\": return executesubmitform(step, session, plan, tabid, origin);\n case \"retryform\": return executeretryform(step, session, plan, tabid, origin);\n case \"consentpassword\": return executeconsentpassword(step, session, plan, tabid, origin);\n case \"attachfile\": return executeattachfile(step, session, plan, tabid, origin);\n case \"handoffcaptcha\": return executecaptchahandoff(step, session, plan, tabid, origin);\n case \"fillcode\": {\n const stored = await memory.getcodevalue();\n const source = typeof stepoptions(step).source === \"string\" ? stepoptions(step).source as string : \"\";\n const derived: toolstep = stored !== undefined && source === \"reviewed\" ? { ...step, value: stored } : step;\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n await audit(\"fill\", `One time code typed from the reviewed source ${source}${stored !== undefined ? \" through the consent gated code entry\" : \"\"}.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return output ?? { ok: false, summary: \"The one time code fill returned no result.\" };\n }\n default: {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n if (step.kind === \"runwizard\" && output?.details?.wizard && typeof output.details.wizard === \"object\") {\n const state = output.details.wizard as wizardstate;\n await memory.addwizard(state);\n await memory.setprogress(recordwizardstep(await memory.getprogress(), plan.id, step.id, state, Date.now()));\n await audit(\"fill\", `Wizard advanced to step ${Math.min(state.index, state.steps)} of ${state.steps} with a completion share of ${Math.round(wizardcompletion(state) * 100)} percent.`, extra);\n }\n if (step.kind === \"picktypeahead\" && typeof output?.details?.pick === \"string\") {\n const pick: typeaheadpick = { field: step.target ?? \"\", query: step.value ?? \"\", pick: output.details.pick, at: Date.now() };\n await memory.addpick(pick);\n }\n if (step.kind === \"readerrors\" && Array.isArray(output?.details?.errors)) {\n const report: errorreport = { form: step.target ?? \"\", errors: output?.details?.errors as fielderror[], at: Date.now() };\n await memory.adderrorreport(report);\n await audit(\"fill\", `Collected ${report.errors.length} inline validation message${report.errors.length === 1 ? \"\" : \"s\"} for the correction loop.`, extra);\n }\n if ((step.kind === \"detectlogin\" || step.kind === \"detecttemplate\") && output?.ok) {\n const detected = step.kind === \"detectlogin\" ? output.details?.login === true : output.details?.template === \"signup\" || output.details?.template === \"checkout\";\n if (detected) {\n const kind = step.kind === \"detectlogin\" ? \"login\" : output.details?.template === \"checkout\" ? \"checkout\" : \"signup\";\n const markers = Array.isArray(output.details?.markers) ? output.details?.markers as string[] : [];\n const record: detectionrecord = { origin, kind, markers, at: Date.now() };\n await memory.adddetection(record);\n await audit(\"fill\", `${kind} shape detected on ${origin} with markers ${markers.join(\", \") || \"none\"}; sensitive work stays behind the consent gates.`, extra);\n }\n }\n if (step.kind === \"skiphoneypot\" && Array.isArray(output?.details?.skipped)) {\n await audit(\"fill\", `Honeypot survey flagged ${output.details.skipped.length} field${output.details.skipped.length === 1 ? \"\" : \"s\"} as skipped so fills never trip them.`, extra);\n }\n if (step.kind === \"fillform\" || step.kind === \"filllabel\" || step.kind === \"fillplaceholder\") {\n const filled = typeof output?.details?.filled === \"number\" ? output.details.filled : 0;\n const skipped = Array.isArray(output?.details?.skipped) ? output.details.skipped.length : 0;\n await audit(\"fill\", `Filled ${filled} reviewed field${filled === 1 ? \"\" : \"s\"}${skipped > 0 ? ` and skipped ${skipped} honeypot field${skipped === 1 ? \"\" : \"s\"}` : \"\"}.`, extra);\n }\n if (step.kind === \"generatevalues\") {\n const count = Array.isArray(output?.details?.values) ? output.details.values.length : 0;\n await audit(\"fill\", `Generated ${count} realistic value${count === 1 ? \"\" : \"s\"} with the reviewed seed and locale; real looking card numbers and personal identifiers are refused.`, extra);\n }\n return output ?? { ok: false, summary: \"The forms and data step returned no result.\" };\n }\n }\n}\n\n/** Loads one reviewed dataset by id, refusing when it has not been scraped or imported yet. */\nasync function loaddataset(datasetid: string): Promise<dataset> {\n const record = await memory.getdataset(datasetid);\n if (!record) throw new Error(`No dataset ${datasetid} exists yet; scrape or import it first.`);\n return record;\n}\n\n/** Reads the grid result of one dispatched page step, refusing when the page returned none. */\nfunction readgridoutput(output: stepoutput | undefined): gridresult | null {\n const grid = output?.details?.grid;\n if (!grid || typeof grid !== \"object\") return null;\n return grid as gridresult;\n}\n\n/** Writes one exported artifact into the task artifact store and records its provenance with the row range and checksum. */\nasync function storeexport(stepid: string, datasetvalue: dataset, format: \"csv\" | \"json\" | \"excel\", delimiter: string, session: agentsession | undefined, planid: string, origin: string): Promise<exportedartifact> {\n const content = exportcontent(datasetvalue, format, delimiter);\n const artifact = exportartifact(randomid(), datasetvalue, format, stepid, content, Date.now());\n await memory.addexport(artifact);\n await memory.addartifact(artifactrecordof(artifact));\n await memory.addprovenance(provenancefor(artifact, datasetvalue.sources[0]?.url ?? origin, stepid, Date.now()));\n await audit(\"export\", `Exported ${artifact.rowcount} row${artifact.rowcount === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} into the ${format} artifact ${artifact.name} with checksum ${artifact.checksum}; the provenance record keeps the source url, step ref and row range.`, { ...(session ? { sessionid: session.id } : {}), planid, stepid });\n await refreshbadge();\n return artifact;\n}\n\n/** Executes one reviewed forms and data part two kind: scraping, pagination, transforms, dedupe, merge, sampling, imports, loops, exports, streaming, resume and provenance stay in the background while page work dispatches through the bridge. */\nasync function executedatastep(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const options = stepoptions(step);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n switch (step.kind) {\n case \"scrapetable\": {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const grid = readgridoutput(output);\n if (!output?.ok || !grid) return output ?? { ok: false, summary: \"The table scrape returned no result.\" };\n const id = randomid();\n const name = typeof options.name === \"string\" && options.name ? options.name : `dataset-${step.id}`;\n const datasetvalue = builddataset(id, name, grid, Date.now());\n await memory.setdataset(datasetvalue);\n const extract = advancecursor(newextractsession(randomid(), id, name, step.target ?? \"\", \"\", 1, Date.now()), origin, datasetvalue.rows.length, Date.now(), true);\n await memory.setextractsession(extract);\n await memory.setprogress(recordextraction(await memory.getprogress(), plan.id, step.id, { page: 1, rows: datasetvalue.rows.length, cursor: 1 }, Date.now()));\n await refreshbadge();\n return { ok: true, summary: output.summary, details: { ...(output.details ?? {}), dataset: { id, name, rows: datasetvalue.rows.length, columns: grid.columns.length } } };\n }\n case \"paginateextract\": {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const grid = readgridoutput(output);\n if (!output?.ok || !grid) return output ?? { ok: false, summary: \"The paginated extraction returned no result.\" };\n const id = randomid();\n const name = typeof options.name === \"string\" && options.name ? options.name : `dataset-${step.id}`;\n const datasetvalue = builddataset(id, name, grid, Date.now());\n await memory.setdataset(datasetvalue);\n const planned = typeof options.pages === \"number\" && Number.isInteger(options.pages) && options.pages > 0 ? options.pages : Number(output.details?.pages ?? 1);\n const next = output.details?.next === true;\n const extract = advancecursor(newextractsession(randomid(), id, name, step.target ?? \"\", typeof options.next === \"string\" ? options.next : \"\", planned, Date.now()), origin, datasetvalue.rows.length, Date.now(), !next);\n await memory.setextractsession(extract);\n await memory.setprogress(recordextraction(await memory.getprogress(), plan.id, step.id, { page: extract.cursor, rows: datasetvalue.rows.length, cursor: extract.cursor }, Date.now()));\n await refreshbadge();\n const extractedpages = Number(output.details?.pages ?? 1);\n const estimated = Math.max(1, Math.round(datasetvalue.rows.length / Math.max(1, extractedpages) * planned));\n return { ok: true, summary: output.summary, details: { ...(output.details ?? {}), dataset: { id, name, rows: datasetvalue.rows.length, columns: grid.columns.length }, extractsession: { id: extract.id, cursor: extract.cursor, planned, done: extract.done === true }, progressshare: extractionshare(datasetvalue.rows.length, estimated) } };\n }\n case \"resumeextract\": {\n const sessionid = typeof options.session === \"string\" ? options.session : \"\";\n const extract = (await memory.getextractsessions()).find(item => item.id === sessionid);\n if (!extract) throw new Error(`No extract session ${sessionid} is stored yet.`);\n if (extract.done) return { ok: true, summary: `Extraction ${extract.name} already completed at cursor ${extract.cursor}.`, details: { cursor: extract.cursor, done: true } };\n const datasetvalue = await loaddataset(extract.datasetid);\n const remaining = remainingpages(extract, extract.planned);\n const derived: toolstep = { id: step.id, kind: \"paginateextract\", target: extract.target, summary: step.summary, risk: \"sensitive\", options: JSON.stringify({ next: extract.next, pages: remaining, cursor: extract.cursor, name: extract.name }) };\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n const grid = readgridoutput(output);\n if (!output?.ok || !grid) return output ?? { ok: false, summary: \"The resumed extraction returned no result.\" };\n const merged = mergedatasets([{ columns: datasetvalue.columns, rows: datasetvalue.rows }, { columns: grid.columns, rows: grid.rows }]);\n const updated: dataset = { ...datasetvalue, columns: merged.columns, rows: merged.rows, at: Date.now() };\n await memory.setdataset(updated);\n const next = output.details?.next === true;\n const resumed = advancecursor({ ...extract, updatedat: Date.now() }, origin, grid.rows.length, Date.now(), !next);\n await memory.setextractsession(resumed);\n await memory.setprogress(recordextraction(await memory.getprogress(), plan.id, step.id, { page: resumed.cursor, rows: grid.rows.length, cursor: resumed.cursor }, Date.now()));\n await audit(\"resume\", `Extraction ${extract.name} resumed from cursor ${extract.cursor} and collected ${grid.rows.length} further row${grid.rows.length === 1 ? \"\" : \"s\"} across ${Number(output.details?.pages ?? 1)} page${Number(output.details?.pages ?? 1) === 1 ? \"\" : \"s\"}; the dataset now holds ${updated.rows.length} rows.`, extra);\n return { ok: true, summary: `Resumed extraction ${extract.name} from cursor ${extract.cursor}; the dataset now holds ${updated.rows.length} rows.`, details: { dataset: { id: updated.id, rows: updated.rows.length }, extractsession: { id: resumed.id, cursor: resumed.cursor, planned: resumed.planned, done: resumed.done === true } } };\n }\n case \"mergepages\": {\n const ids = Array.isArray(options.datasets) ? options.datasets.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const records: dataset[] = [];\n for (const id of ids) records.push(await loaddataset(id));\n const merged = mergedatasets(records);\n const id = randomid();\n const datasetvalue: dataset = { id, name: typeof options.name === \"string\" && options.name ? options.name : `merged-${step.id}`, columns: merged.columns, rows: merged.rows, sources: records.flatMap(record => record.sources), at: Date.now() };\n await memory.setdataset(datasetvalue);\n await refreshbadge();\n return { ok: true, summary: `Merged ${records.length} dataset${records.length === 1 ? \"\" : \"s\"} into ${datasetvalue.name} with ${merged.columns.length} aligned column${merged.columns.length === 1 ? \"\" : \"s\"} and ${merged.rows.length} row${merged.rows.length === 1 ? \"\" : \"s\"}.`, details: { dataset: { id, name: datasetvalue.name, rows: merged.rows.length, columns: merged.columns.length }, merged: records.map(record => record.id) } };\n }\n case \"transformvalues\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const rules = (Array.isArray(options.rules) ? options.rules : []).filter((item): item is transformrule => Boolean(item) && typeof item === \"object\" && !Array.isArray(item));\n const applied = transformrows(datasetvalue.rows, rules);\n await memory.setdataset({ ...datasetvalue, rows: applied.rows, at: Date.now() });\n const existing = (await memory.gettaskrules()).find(item => item.taskid === plan.id);\n await memory.settaskrules(mergetaskrules(existing, plan.id, rules, [], Date.now()));\n if (applied.errors.length > 0) return { ok: false, summary: `Transform rules surfaced ${applied.errors.length} error${applied.errors.length === 1 ? \"\" : \"s\"}: ${applied.errors.join(\"; \")}.`, details: { errors: applied.errors, rules: rules.length } };\n return { ok: true, summary: `Applied ${rules.length} reviewed transform rule${rules.length === 1 ? \"\" : \"s\"} to ${applied.rows.length} row${applied.rows.length === 1 ? \"\" : \"s\"}.`, details: { rules: rules.length, rows: applied.rows.length } };\n }\n case \"deduperows\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const keys = Array.isArray(options.keys) ? options.keys.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const result = dedupebykeys(datasetvalue.rows, keys);\n await memory.setdataset({ ...datasetvalue, rows: result.kept, at: Date.now() });\n const existing = (await memory.gettaskrules()).find(item => item.taskid === plan.id);\n await memory.settaskrules(mergetaskrules(existing, plan.id, [], keys, Date.now()));\n return { ok: true, summary: `Deduplicated ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} by ${keys.join(\", \")}: removed ${result.removed} duplicate${result.removed === 1 ? \"\" : \"s\"}, kept ${result.kept.length}.`, details: { dedupe: { removed: result.removed, kept: result.kept.length, keys } } };\n }\n case \"stamplerows\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const url = typeof options.url === \"string\" && options.url ? options.url : origin;\n const stamped = samplerows(datasetvalue.rows, url, step.id, Date.now());\n await memory.setdataset({ ...datasetvalue, rows: stamped.rows, sources: stamped.sources, at: Date.now() });\n return { ok: true, summary: `Stamped ${stamped.rows.length} row${stamped.rows.length === 1 ? \"\" : \"s\"} with the source url, timestamp and step ref.`, details: { rows: stamped.rows.length, url } };\n }\n case \"previewgrid\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const sample = typeof options.sample === \"number\" && Number.isInteger(options.sample) && options.sample > 0 ? options.sample : 10;\n const preview = gridpreview(datasetvalue, sample);\n return { ok: true, summary: `Previewed ${preview.rows} row${preview.rows === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} in the grid with ${preview.columns.length} column${preview.columns.length === 1 ? \"\" : \"s\"}.`, details: { preview } };\n }\n case \"importcsv\": {\n const csv = typeof options.csv === \"string\" ? options.csv : \"\";\n const parsed = parsecsv(csv, typeof options.delimiter === \"string\" && options.delimiter.length === 1 ? options.delimiter : \",\");\n const mapping = options.mapping && typeof options.mapping === \"object\" && !Array.isArray(options.mapping) ? options.mapping as Record<string, string> : {};\n const columns = mapcolumns(parsed.headers, mapping);\n const rows = parsed.rows.map(line => {\n const row: datasetrow = {};\n columns.forEach((column, index) => { row[column.key] = line[index] ?? \"\"; });\n return row;\n });\n const id = randomid();\n const datasetvalue: dataset = { id, name: typeof options.name === \"string\" && options.name ? options.name : `import-${step.id}`, columns, rows, sources: [], at: Date.now() };\n await memory.addimport(datasetvalue);\n await refreshbadge();\n return { ok: true, summary: `Imported ${rows.length} row${rows.length === 1 ? \"\" : \"s\"} and ${columns.length} mapped column${columns.length === 1 ? \"\" : \"s\"} from the reviewed csv for fill loops.`, details: { dataset: { id, name: datasetvalue.name, rows: rows.length, columns: columns.length } } };\n }\n case \"looprows\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const inner = resolvedinnerstep(step, plan);\n if (!inner) throw new Error(\"A reviewed inner step or step id is required in options.\");\n const variable = typeof options.variable === \"string\" && options.variable ? options.variable : \"row\";\n let completed = 0;\n let failed = 0;\n for (const [index, row] of datasetvalue.rows.entries()) {\n const derived = loopstep(inner, row);\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n if (output?.ok) completed += 1; else failed += 1;\n await memory.setprogress(recordoutcome(await memory.getprogress(), plan.id, { stepid: step.id, ok: Boolean(output?.ok), summary: `Iteration ${index + 1} of ${datasetvalue.rows.length}: ${output?.summary ?? \"no result\"}`, details: { iteration: index + 1, variable, variables: loopvariables(row) }, at: Date.now() }, Date.now()));\n }\n return { ok: failed === 0, summary: `Looped ${datasetvalue.rows.length} dataset row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} as ${variable} variables: ${completed} iteration${completed === 1 ? \"\" : \"s\"} completed${failed > 0 ? `, ${failed} failed` : \"\"}.`, details: { iterations: datasetvalue.rows.length, completed, failed, variable } };\n }\n case \"exportcsv\":\n case \"exportjson\":\n case \"exportexcel\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const format = step.kind === \"exportcsv\" ? \"csv\" : step.kind === \"exportjson\" ? \"json\" : \"excel\";\n const delimiter = typeof options.delimiter === \"string\" && options.delimiter.length === 1 ? options.delimiter : \",\";\n const artifact = await storeexport(step.id, { ...datasetvalue, ...(typeof options.name === \"string\" && options.name ? { name: options.name } : {}) }, format, delimiter, session, plan.id, origin);\n return { ok: true, summary: `Exported ${artifact.rowcount} row${artifact.rowcount === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} to ${artifact.name} with checksum ${artifact.checksum}.`, details: { artifact: { id: artifact.id, name: artifact.name, kind: artifact.kind, checksum: artifact.checksum, rowcount: artifact.rowcount } } };\n }\n case \"copytable\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const content = exportcontent(datasetvalue, \"csv\", typeof options.delimiter === \"string\" && options.delimiter.length === 1 ? options.delimiter : \",\");\n await navigator.clipboard.writeText(content);\n await audit(\"export\", `Copied ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} to the clipboard under the clipboardWrite capability.`, extra);\n return { ok: true, summary: `Copied ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} to the clipboard.`, details: { rows: datasetvalue.rows.length } };\n }\n case \"pushsheets\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const sheet = typeof options.sheet === \"string\" ? options.sheet : \"\";\n const config = (await memory.getsheetendpoints()).find(item => item.endpoint === sheet || item.origin === new URL(sheet).origin);\n if (!config) throw new Error(`The reviewed sheet endpoint has not been configured; configure ${sheet} from the review panel first.`);\n const granted = await chrome.permissions.contains({ origins: [hostpattern(config.origin)] } as chrome.permissions.Permissions);\n if (!granted) throw new Error(`The sheet endpoint origin ${config.origin} has not received optional permission.`);\n const payload = sheetpayload(datasetvalue, sheet);\n const response = await fetch(config.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify(payload) });\n await audit(\"export\", `Pushed ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} to the reviewed sheet endpoint ${config.origin} with response ${response.status}.`, extra);\n return { ok: response.ok, summary: response.ok ? `Pushed ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} to the reviewed sheet endpoint ${config.origin}.` : `The reviewed sheet endpoint answered ${response.status}; the push failed.`, details: { endpoint: config.endpoint, status: response.status, rows: datasetvalue.rows.length } };\n }\n case \"streamdisk\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const chunk = typeof options.chunk === \"number\" && Number.isInteger(options.chunk) && options.chunk > 0 ? options.chunk : datasetvalue.rows.length || 1;\n const planchunks = chunkplan(datasetvalue.rows.length, chunk);\n const previous = (await memory.getstreams()).find(item => item.datasetid === datasetvalue.id && item.done !== true);\n let state = previous && previous.chunks === planchunks.length ? previous : newstream(datasetvalue, planchunks.length, Date.now());\n let written = 0;\n let acknowledged = 0;\n for (const part of planchunks.slice(state.chunk)) {\n written += 1;\n if (backpressure(written, acknowledged)) await new Promise(resolve => setTimeout(resolve, 0));\n state = advancestream(state, part, Date.now(), part.to >= datasetvalue.rows.length);\n await memory.setstream(state);\n acknowledged += 1;\n }\n const artifact = await storeexport(step.id, datasetvalue, \"csv\", \",\", session, plan.id, origin);\n await audit(\"stream\", `Streamed ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} to disk in ${planchunks.length} reviewed chunk${planchunks.length === 1 ? \"\" : \"s\"} of ${chunk} row${chunk === 1 ? \"\" : \"s\"} with backpressure; the stream state stays persisted for resume.`, extra);\n return { ok: true, summary: `Streamed ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} to disk in ${planchunks.length} chunk${planchunks.length === 1 ? \"\" : \"s\"} and landed the artifact ${artifact.name}.`, details: { chunks: planchunks.length, chunk, rows: datasetvalue.rows.length, artifact: { id: artifact.id, name: artifact.name, checksum: artifact.checksum } } };\n }\n case \"logprovenance\": {\n const reference = typeof options.artifact === \"string\" ? options.artifact : \"\";\n const artifact = (await memory.getexports()).find(item => item.id === reference || item.name === reference);\n if (!artifact) throw new Error(`No exported artifact ${reference} exists yet.`);\n const record = provenancefor(artifact, origin, step.id, Date.now());\n await memory.addprovenance(record);\n await audit(\"provenance\", `Provenance of artifact ${artifact.name}: rows ${record.rowstart} to ${record.rowend}, checksum ${record.checksum}, source ${record.url}.`, extra);\n return { ok: true, summary: `Logged the provenance of ${artifact.name} for audit: rows ${record.rowstart} to ${record.rowend} with checksum ${record.checksum}.`, details: { provenance: record } };\n }\n default: return { ok: false, summary: \"Unsupported forms and data step.\" };\n }\n}\n\n/** Loads one batch download record by id, filename or url, refusing when it is not stored yet. */\nasync function loadownload(reference: string): Promise<downloadrecord | undefined> {\n const records = await memory.getdownloads();\n return records.find(item => item.id === reference || item.filename === reference || item.url === reference);\n}\n\n/** Waits until one browser download settles inside the internal evidence window, keeping unfinished downloads in the running state. */\nasync function settlesdownload(record: downloadrecord): Promise<{ state: downloadstate; evidence?: { path?: string; bytes?: number } }> {\n const started = Date.now();\n for (;;) {\n const items = record.downloadid === undefined ? [] : await chrome.downloads.search({ id: record.downloadid }).catch(() => []);\n const item = items[0];\n if (item?.state === \"complete\") return { state: \"complete\", evidence: { path: item.filename, bytes: item.fileSize ?? item.totalBytes ?? 0 } };\n if (item?.state === \"interrupted\") return { state: \"failed\" };\n if (Date.now() - started >= evidencesettle) return { state: \"running\" };\n await new Promise(resolve => setTimeout(resolve, evidencepoll));\n }\n}\n\n/** Pauses one running batch download through the downloads api and persists the paused record. */\nasync function pauseonerecord(record: downloadrecord, extra: Partial<auditevent>): Promise<stepoutput> {\n if (!transitionallowed(record.state, \"paused\")) throw new Error(`A ${record.state} download cannot pause.`);\n if (record.downloadid !== undefined) await chrome.downloads.pause(record.downloadid).catch(() => undefined);\n const paused = advancedownload(record, \"paused\", Date.now());\n await memory.setdownload(paused);\n await audit(\"download\", `Paused the download of ${record.filename} from ${record.url}.`, extra);\n return { ok: true, summary: `Paused the download of ${record.filename}.`, details: { download: paused } };\n}\n\n/** Resumes one paused batch download through the downloads api and persists the running record. */\nasync function resumeonerecord(record: downloadrecord, extra: Partial<auditevent>): Promise<stepoutput> {\n if (!transitionallowed(record.state, \"running\")) throw new Error(`A ${record.state} download cannot resume.`);\n if (record.downloadid !== undefined) await chrome.downloads.resume(record.downloadid).catch(() => undefined);\n const resumed = advancedownload(record, \"running\", Date.now());\n await memory.setdownload(resumed);\n await audit(\"download\", `Resumed the paused download of ${record.filename} from ${record.url}.`, extra);\n return { ok: true, summary: `Resumed the download of ${record.filename}.`, details: { download: resumed } };\n}\n\n/** Verifies one completed download against the reviewed size and checksum expectations. */\nasync function verifyonerecord(record: downloadrecord, expected: { bytes?: number; checksum?: string }, extra: Partial<auditevent>): Promise<stepoutput> {\n const verification = verifybytes(record, expected);\n await audit(\"observation\", `Verified the download of ${record.filename}: ${verification.summary}`, extra);\n return { ok: verification.ok, summary: verification.summary, details: { verification: { ...verification.matches, state: record.state, path: record.path, checksum: record.checksum, bytes: record.bytes } } };\n}\n\n/** Executes one reviewed files, clipboard and downloads kind: batch queues, verification, interception, netlog export, consented clipboard work, quarantine, scan hooks, capture naming and cleanup sweeps stay in the background while clipboard writes dispatch through the bridge. */\nasync function executefilesstep(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const options = stepoptions(step);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n switch (step.kind) {\n case \"batchdownload\": {\n const spec = options.downloadspec as downloadspec | undefined;\n const urls = Array.isArray(spec?.urls) ? (spec?.urls as unknown[]).filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const concurrent = typeof options.concurrent === \"number\" && Number.isInteger(options.concurrent) && options.concurrent > 0 ? options.concurrent : undefined;\n const taken = (await memory.getdownloads()).map(record => record.filename);\n const records: downloadrecord[] = urls.map(url => {\n const filename = conflictfree(downloadfilename(url, spec?.filename), taken);\n taken.push(filename);\n return { id: randomid(), url, filename, state: \"queued\" as const, at: Date.now(), updatedat: Date.now() };\n });\n let completed = 0;\n let failed = 0;\n let queued = 0;\n let index = 0;\n while (index < records.length) {\n const wave: downloadrecord[] = [];\n while (index < records.length && concurrentwindow(wave.length, concurrent)) {\n const record = records[index] as downloadrecord;\n index += 1;\n const downloadid = await chrome.downloads.download({ url: record.url, filename: record.filename }).catch(() => undefined);\n const started = downloadid === undefined ? advancedownload(record, \"failed\", Date.now()) : advancedownload(record, \"running\", Date.now(), { downloadid });\n await memory.setdownload(started);\n wave.push(started);\n }\n for (const started of wave) {\n if (started.state === \"failed\") { failed += 1; continue; }\n const settled = await settlesdownload(started);\n const final = advancedownload(started, settled.state, Date.now(), settled.evidence);\n await memory.setdownload(final);\n if (final.state === \"complete\") completed += 1; else if (final.state === \"failed\") failed += 1; else queued += 1;\n await memory.setprogress(recorddownload(await memory.getprogress(), plan.id, step.id, { index: records.indexOf(started), url: started.url, state: final.state }, Date.now()));\n }\n }\n await refreshbadge();\n await audit(\"download\", `Batch downloaded ${records.length} reviewed file${records.length === 1 ? \"\" : \"s\"}${concurrent !== undefined ? ` under the user configured concurrent window of ${concurrent}` : \"\"}: ${completed} completed, ${failed} failed${queued > 0 ? `, ${queued} still running` : \"\"}.`, extra);\n return { ok: failed === 0, summary: `Batch downloaded ${records.length} file${records.length === 1 ? \"\" : \"s\"}: ${completed} completed, ${failed} failed${queued > 0 ? `, ${queued} still running` : \"\"}.`, details: { downloads: records, completed, failed, running: queued, total: records.length, share: downloadshare(completed, records.length), concurrent } };\n }\n case \"pausedownload\": {\n const record = await loadownload(step.value ?? \"\");\n if (!record) throw new Error(`No stored download matches ${step.value ?? \"\"}.`);\n return pauseonerecord(record, extra);\n }\n case \"resumedownload\": {\n const record = await loadownload(step.value ?? \"\");\n if (!record) throw new Error(`No stored download matches ${step.value ?? \"\"}.`);\n return resumeonerecord(record, extra);\n }\n case \"verifydownload\": {\n const record = await loadownload(step.value ?? \"\");\n if (!record) throw new Error(`No stored download matches ${step.value ?? \"\"}.`);\n return verifyonerecord(record, { ...(typeof options.bytes === \"number\" ? { bytes: options.bytes } : {}), ...(typeof options.checksum === \"string\" ? { checksum: options.checksum } : {}) }, extra);\n }\n case \"interceptmime\": {\n const filter = options.mimefilter as mimefilter | undefined;\n if (!filter) throw new Error(\"A reviewed mimefilter is required in options.\");\n const filters = await memory.getmimefilters();\n await memory.setmimefilters([filter, ...filters]);\n armedmimefilter = filter;\n installmimelistener();\n await audit(\"intercept\", `Armed the reviewed mime interception filter: include ${filter.include.join(\", \")}, exclude ${filter.exclude.join(\", \") || \"none\"} and the ${filter.default} default for unlisted mime types; matching downloads reroute into quarantine.`, extra);\n return { ok: true, summary: `Armed the mime interception filter with the ${filter.default} default for unlisted mime types.`, details: { mimefilter: filter } };\n }\n case \"exportnetlog\": {\n const records = await memory.getnetlog();\n const stepfilter = typeof options.stepid === \"string\" && options.stepid ? options.stepid : undefined;\n const filtered = (stepfilter ? netlogforstep(records, stepfilter) : records).map(record => ({ ...record, headers: redactheaders(record.headers ?? {}) }));\n await audit(\"observation\", `Exported ${filtered.length} netlog record${filtered.length === 1 ? \"\" : \"s\"} of the run${stepfilter ? ` correlated with step ${stepfilter}` : \"\"} with every header value redacted.`, extra);\n return { ok: true, summary: `Exported ${filtered.length} netlog record${filtered.length === 1 ? \"\" : \"s\"} with header values redacted.`, details: { netlog: filtered, count: filtered.length, redacted: true, redaction: \"every header value is redacted from exported netlogs\" } };\n }\n case \"readclipboard\": {\n const consentref = typeof options.consentref === \"string\" ? options.consentref : \"\";\n const consents = await memory.getclipconsents();\n const consent = consents.find(item => item.id === consentref && item.approved === true && item.usedat === undefined);\n if (!consent) {\n const pending: clipboardconsentrecord = { id: consentref || randomid(), prompt: typeof options.prompt === \"string\" && options.prompt ? options.prompt : step.summary, origin, stepid: step.id, at: Date.now() };\n await memory.setclipconsent(pending);\n await refreshbadge();\n await audit(\"clipboard\", `Clipboard read consent prompt ${pending.id} opened for step ${step.id} on ${origin}; the read waits for the user approval and every read needs its own prompt.`, extra);\n return { ok: false, summary: `The clipboard read waits for your consent approval${consentref ? ` under ref ${consentref}` : \"\"}; approve it in the review panel and run the step again.`, details: { consent: { id: pending.id, prompt: pending.prompt, origin, stepid: step.id, approved: false } } };\n }\n const text = await navigator.clipboard.readText();\n const entry = clipentryof(\"read\", { hash: cliphash(text), length: text.length }, origin, step.id, Date.now());\n await memory.addclip(entry);\n await memory.setclipconsent({ ...consent, usedat: Date.now() });\n await refreshbadge();\n await audit(\"clipboard\", `Read ${entry.length} clipboard character${entry.length === 1 ? \"\" : \"s\"} on the approved consent ${consent.id} with payload hash ${entry.hash}; the payload text never appears in logs or memory.`, extra);\n return { ok: true, summary: `Read ${entry.length} clipboard character${entry.length === 1 ? \"\" : \"s\"} on the approved consent ${consent.id} with payload hash ${entry.hash}.`, details: { clip: entry, masked: maskclipboard(text) } };\n }\n case \"writeclipboard\": {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const hash = typeof output?.details?.hash === \"string\" ? output.details.hash : cliphash(step.value ?? \"\");\n const length = typeof output?.details?.length === \"number\" ? output.details.length : (step.value ?? \"\").length;\n const entry = clipentryof(\"write\", { hash, length }, origin, step.id, Date.now());\n await memory.addclip(entry);\n await audit(\"clipboard\", `Wrote ${length} reviewed character${length === 1 ? \"\" : \"s\"} to the clipboard with payload hash ${hash}; the payload text never appears in logs or memory.`, extra);\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The clipboard write returned no result.\", details: { ...(output?.details ?? {}), clip: entry } };\n }\n case \"copyscreen\": {\n const windowid = chrome.windows.WINDOW_ID_CURRENT;\n const shot = await chrome.tabs.captureVisibleTab(windowid, { format: \"png\" });\n let destination = \"clipboard\";\n try {\n const blob = await (await fetch(shot)).blob();\n await navigator.clipboard.write([new ClipboardItem({ \"image/png\": blob })]);\n } catch { destination = \"clipboard unavailable\"; }\n const entry = clipentryof(\"screen\", { hash: cliphash(shot), length: shot.length }, origin, step.id, Date.now());\n await memory.addclip(entry);\n await audit(\"clipboard\", `Copied a screenshot of the visible tab (${entry.length} characters of png data) to the clipboard with payload hash ${entry.hash}; destination ${destination}.`, extra);\n return { ok: destination === \"clipboard\", summary: `Copied the visible tab screenshot with payload hash ${entry.hash} to the clipboard.`, details: { clip: entry, destination } };\n }\n case \"quarantinedownload\": {\n const record = await loadownload(step.value ?? \"\");\n if (!record) throw new Error(`No stored download matches ${step.value ?? \"\"}.`);\n const reason = typeof options.reason === \"string\" && options.reason ? options.reason : `moved from ${record.url} by the reviewed quarantine step`;\n const entry = newquarantine(randomid(), record.path ?? record.filename, reason, Date.now());\n await memory.setquarantine(entry);\n await refreshbadge();\n await audit(\"quarantine\", `Quarantined the download ${record.filename} outside the downloads folder at ${entry.path} with reason ${reason}; the file stays there until a clean scan verdict releases it.`, extra);\n return { ok: true, summary: `Quarantined ${record.filename} at ${entry.path} with a pending scan verdict.`, details: { quarantine: entry } };\n }\n case \"scanvirus\": {\n const reference = step.value ?? \"\";\n const entry = (await memory.getquarantines()).find(item => item.id === reference || item.path === reference);\n if (!entry) throw new Error(`No quarantined file matches ${reference}.`);\n const scanner = typeof options.scanner === \"string\" && options.scanner ? options.scanner : undefined;\n const hooks = await memory.getscanhooks();\n const hook = scanner ? hooks.find(item => item.scanner === scanner) : hooks[0];\n let verdict: scanverdict = \"pending\";\n if (hook) {\n const granted = await chrome.permissions.contains({ origins: [hostpattern(hook.origin)] } as chrome.permissions.Permissions).catch(() => false);\n if (granted) {\n try {\n const response = await fetch(hook.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, credentials: \"omit\", body: JSON.stringify({ quarantine: entry.id, path: entry.path, reason: entry.reason }) });\n verdict = scanverdictof(await response.json().catch(() => undefined));\n } catch { verdict = \"pending\"; }\n }\n }\n const scanned = scanresult(entry, verdict, Date.now());\n await memory.setquarantine(scanned);\n await refreshbadge();\n await audit(\"quarantine\", `Scan hook ${hook ? hook.scanner : scanner ?? \"none configured\"} ${hook ? `returned the ${verdict} verdict` : \"is not configured or granted; the verdict stays pending\"} for the quarantined file ${entry.path}; hook failures never release a file.`, extra);\n return { ok: true, summary: `Scan verdict ${verdict} recorded for ${entry.path}.`, details: { quarantine: scanned, verdict } };\n }\n case \"namecaptures\": {\n const task = typeof options.task === \"string\" && options.task ? options.task : plan.id;\n const steps = capturesteps(options, plan);\n const extension = typeof options.extension === \"string\" && options.extension ? options.extension : \"png\";\n const existing = (await memory.getcapturecounters()).find(item => item.taskid === task);\n const stamped = capturenames(existing?.counters ?? {}, task, steps, extension);\n await memory.setcapturecounter({ taskid: task, counters: stamped.counters, at: Date.now() });\n await audit(\"observation\", `Stamped ${stamped.names.length} consistent capture name${stamped.names.length === 1 ? \"\" : \"s\"} for task ${task} from task, step and sequence parts.`, extra);\n return { ok: true, summary: `Stamped ${stamped.names.length} capture name${stamped.names.length === 1 ? \"\" : \"s\"} for task ${task}.`, details: { task, names: stamped.names, counters: stamped.counters } };\n }\n case \"cleanupartifacts\": {\n const inlinrules = (Array.isArray(options.rules) ? options.rules : []).filter((item): item is cleanuprule => Boolean(item) && typeof item === \"object\" && !Array.isArray(item));\n const rules = inlinrules.length > 0 ? inlinrules : await memory.getcleanuprules();\n if (rules.length === 0) throw new Error(\"No reviewed cleanup rules are present; pass rules in options or store a rule set from the review panel.\");\n if (inlinrules.length > 0) await memory.setcleanuprules(inlinrules);\n const exportrecords = await memory.getexports();\n const artifacts = await memory.getartifacts();\n const inventory: artifactinventoryentry[] = [\n ...exportrecords.map(artifact => ({ id: artifact.id, kind: `export-${artifact.kind}`, name: artifact.name, size: artifact.content.length, at: artifact.at })),\n ...artifacts.map(artifact => ({ id: artifact.id, kind: artifact.kind, name: artifact.name, size: 0, at: artifact.at })),\n ];\n await memory.setinventory(inventory);\n const progress = await memory.getprogress();\n const keeprefs = referencedartifacts(plan, progress?.planid === plan.id ? progress.completedsteps : []);\n const sweep = sweepplan(inventory, rules, Date.now(), keeprefs);\n let removed = 0;\n for (const id of sweep.remove) {\n if (await memory.removeexport(id)) removed += 1;\n else if (await memory.removeartifact(id)) removed += 1;\n }\n const run: cleanuprun = { id: randomid(), rules: rules.length, removed, kept: sweep.keep.length, at: Date.now() };\n await memory.addcleanuprun(run);\n await refreshbadge();\n await audit(\"cleanup\", `Cleanup sweep applied ${rules.length} reviewed rule${rules.length === 1 ? \"\" : \"s\"} by age and kind: removed ${removed} artifact${removed === 1 ? \"\" : \"s\"}, kept ${sweep.keep.length}${keeprefs.length > 0 ? ` while holding every artifact referenced by open review cards` : \"\"}.`, extra);\n return { ok: true, summary: `Cleanup sweep removed ${removed} artifact${removed === 1 ? \"\" : \"s\"} and kept ${sweep.keep.length} under the reviewed rules.`, details: { run: { id: run.id, rules: run.rules, removed: run.removed, kept: run.kept }, remove: sweep.remove, inventory: inventory.length } };\n }\n default: return { ok: false, summary: \"Unsupported files, clipboard and downloads step.\" };\n }\n}\n\n/** Live mime interception filter cached for the synchronous filename determination listener. */\nlet armedmimefilter: mimefilter | undefined;\n/** Guards the one time installation of the download interception listener behind the optional downloads capability. */\nlet mimelistenerinstalled = false;\n\n/** Installs the download interception listener once, after the optional downloads capability exists. */\nfunction installmimelistener(): void {\n if (mimelistenerinstalled || typeof chrome.downloads?.onDeterminingFilename?.addListener !== \"function\") return;\n mimelistenerinstalled = true;\n chrome.downloads.onDeterminingFilename.addListener((item, suggest) => {\n const filter = armedmimefilter;\n if (!filter || item.byExtensionId === chrome.runtime.id) { suggest({ filename: item.filename, conflictAction: \"uniquify\" }); return; }\n const mime = item.mime ?? \"\";\n if (mimeallowed(filter, mime)) {\n suggest({ filename: `devthink-quarantine/${item.filename}`, conflictAction: \"uniquify\" });\n void memory.setquarantine(newquarantine(randomid(), item.filename, `mime ${mime || \"unknown\"} matched the reviewed include patterns`, Date.now())).then(() => audit(\"intercept\", `Intercepted the download of ${item.filename} (${mime || \"unknown mime\"}) into quarantine under the reviewed mime filter.`, {})).catch(() => undefined);\n return;\n }\n if (filter.default === \"deny\") {\n void chrome.downloads.cancel(item.id).catch(() => undefined);\n void audit(\"intercept\", `Denied the unlisted download of ${item.filename} (${mime || \"unknown mime\"}) under the deny default of the reviewed mime filter.`, {}).catch(() => undefined);\n }\n suggest({ filename: item.filename, conflictAction: \"uniquify\" });\n });\n}\n\ninstallmimelistener();\n\n/** Re-arms the reviewed mime interception filter after a service worker restart. */\nasync function reconcilmimefilter(): Promise<void> {\n const filters = await memory.getmimefilters();\n armedmimefilter = filters[0];\n installmimelistener();\n}\n\nreconcilmimefilter().catch(() => { /* a failing storage read leaves interception disarmed; the reviewed step re-arms it */ });\n\n/** Enforces the reviewed window close: a window that holds more than one task tab needs the explicit reviewed flag. */\nasync function enforcewindowreview(step: toolstep, session: agentsession | undefined, plan: agentplan | undefined): Promise<void> {\n const windowid = step.value && /^\\d+$/.test(step.value) ? Number.parseInt(step.value, 10) : 0;\n const progress = plan ? await memory.getprogress() : undefined;\n const tasktabids = plan ? trackedtasktabs(progress, plan.id) : [];\n const count = tasktabsinwindow(await livetabs(), windowid, tasktabids);\n const gate = windowclosegate(count, stepoptions(step).reviewed === true);\n if (!gate.allowed) throw new Error(gate.reason ?? \"The window close needs explicit review.\");\n if (session && count > 0) await audit(\"window\", `Window ${windowid} closes while holding ${count} task tab${count === 1 ? \"\" : \"s\"} under the explicit reviewed flag.`, { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}), stepid: step.id });\n}\n\n/** Refreshes the per task badges from the live progress state of each task tab. */\nasync function updatetaskbadges(plan: agentplan | undefined, progress: Awaited<ReturnType<typeof memory.getprogress>>): Promise<void> {\n if (!plan || !progress || progress.planid !== plan.id) return;\n const state = badgefromprogress(progress.completedsteps.length, plan.steps.length);\n for (const tabid of tasktabs(progress, plan.id)) {\n await memory.setbadge({ tabid, taskid: plan.id, label: state.label, setat: Date.now() });\n }\n}\n\n/** Opens or closes the pinned control tab with the live task feed when the user enables it. */\nasync function togglecontroltab(enabled: boolean): Promise<controltabstate> {\n const current = await memory.getcontroltab();\n if (current && current.tabid) await chrome.tabs.remove(current.tabid).catch(() => undefined);\n if (!enabled) {\n const closed: controltabstate = { tabid: 0, enabled: false, updatedat: Date.now() };\n await memory.setcontroltab(closed);\n await audit(\"tab\", \"The pinned control tab was closed.\");\n return closed;\n }\n const created = await chrome.tabs.create({ url: chrome.runtime.getURL(\"sidepanel.html\"), pinned: true, active: false });\n const state: controltabstate = { tabid: created?.id ?? 0, enabled: true, updatedat: Date.now() };\n await memory.setcontroltab(state);\n await audit(\"tab\", `The pinned control tab ${state.tabid} was opened with the live task feed.`);\n return state;\n}\n\n/** Refreshes the popup badge with the queued prefetch and batch open target counts, the tabs with active tasks, the open asksubmit and clipboard consent prompts, the datasets collected in the session and the quarantined files awaiting scan verdicts. */\nasync function refreshbadge(): Promise<void> {\n const queues = await memory.getnavqueues();\n const badges = await memory.getbadges();\n const prompts = (await memory.gettickets()).filter(ticket => ticket.approved === undefined).length;\n const consents = (await memory.getclipconsents()).filter(record => record.approved === undefined).length;\n const quarantined = (await memory.getquarantines()).filter(entry => entry.scan === \"pending\").length;\n const datasets = (await memory.getdatasets()).length;\n const tasktabs = new Set(badges.map(badge => badge.tabid)).size;\n const total = (queues?.prefetch ?? 0) + (queues?.batchopen ?? 0) + tasktabs + prompts + consents + quarantined + datasets;\n await chrome.action.setBadgeText({ text: total > 0 ? String(total) : \"\" }).catch(() => { /* the badge is cosmetic and may be unavailable */ });\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, verdicts: await memory.getsafeties() });\n if (!gate.allowed) throw new Error(gate.reason);\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 let output: stepoutput | undefined;\n let watchwindow: { startedat: number; lifetime: number } | undefined;\n if (step.kind === \"windowclose\") {\n await enforcewindowreview(step, session, plan);\n }\n if (istabscommandkind(step.kind)) {\n output = await executetabscommand(step, session, plan as agentplan, tab.id as number);\n } else if (isdatasetkind(step.kind)) {\n output = await executedatastep(step, session, plan as agentplan, tab.id as number, origin);\n } else if (isfileskind(step.kind)) {\n output = await executefilesstep(step, session, plan as agentplan, tab.id as number, origin);\n } else if (isformkind(step.kind)) {\n output = await executeformstep(step, session, plan as agentplan, tab.id as number, origin);\n } else if (isbrowserkind(step.kind)) {\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 if (navigationstepkinds.has(step.kind)) {\n output = await executenavigationkind(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 if ([\"navigate\", \"back\", \"forward\"].includes(step.kind)) await recordnavigation(step, session, tab.id as number);\n await recordevidence(step, output, session, plan, origin);\n if (output?.ok && plan && typeof output.details?.tabid === \"number\") {\n await memory.setprogress(assigntasktab(await memory.getprogress(), plan.id, output.details.tabid as number, Date.now()));\n }\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 await updatetaskbadges(plan, tracked);\n await refreshbadge();\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 if (permission === \"downloads\") installmimelistener();\n await audit(\"capability\", `Capability ${permission} granted by the user.`);\n return refreshcapabilities();\n}\n\n/** Builds the extraction progress envelope of every stored extract session. */\nasync function extractionreportValue() {\n return extractionreport({ sessions: await memory.getextractsessions() });\n}\n\n/** Builds the provenance envelope of every exported artifact. */\nasync function provenancereportValue() {\n return provenancereport({ records: await memory.getprovenances() });\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 const trail = session ? await memory.gettrail(session.id) : [];\n const navrecords = await memory.getnavrecords();\n const ratestates = await memory.getratestates();\n const safeties = await memory.getsafeties();\n const curated = await memory.getcurateds();\n const waitprofiles = await memory.getwaitprofiles();\n const auths = (await memory.getauths()).map(record => ({ origin: record.origin, username: record.username, reviewedat: record.reviewedat }));\n const navcontrol = await memory.getnavcontrol();\n const navqueues = await memory.getnavqueues();\n const artifacts = await memory.getartifacts();\n const tabs = await livetabs().catch(() => [] as tabshape[]);\n const windows = await livewindows().catch(() => [] as windowshape[]);\n const layouts = await memory.getlayouts();\n const tabgroups = await memory.gettabgroups();\n const tabmetas = await memory.gettabmetas();\n const badges = await memory.getbadges();\n const snapshots = await memory.getsnapshots();\n const closedtabs = await memory.getclosedtabs();\n const controltab = await memory.getcontroltab();\n const tabwatchevents = await memory.gettabwatchevents();\n const profiles = await memory.getprofiles();\n const tickets = await memory.gettickets();\n const wizards = await memory.getwizards();\n const picks = await memory.getpicks();\n const errorreports = await memory.geterrorreports();\n const captchas = await memory.getcaptchas();\n const detections = await memory.getdetections();\n const codeentry = await memory.getcodevalue();\n const datasets = await memory.getdatasets();\n const imports = await memory.getimports();\n const extractsessions = await memory.getextractsessions();\n const streams = await memory.getstreams();\n const exports = (await memory.getexports()).map(artifact => ({ id: artifact.id, kind: artifact.kind, name: artifact.name, stepid: artifact.stepid, rowcount: artifact.rowcount, checksum: artifact.checksum, at: artifact.at }));\n const provenances = await memory.getprovenances();\n const taskrules = await memory.gettaskrules();\n const sheetendpoints: sheetendpoint[] = await memory.getsheetendpoints();\n const sheetgrants: Array<{ endpoint: string; origin: string; configuredat: number; granted: boolean }> = [];\n for (const config of sheetendpoints) {\n sheetgrants.push({ ...config, granted: await chrome.permissions.contains({ origins: [hostpattern(config.origin)] } as chrome.permissions.Permissions).catch(() => false) });\n }\n const downloads = await memory.getdownloads();\n const netlogs = await memory.getnetlog();\n const clipconsents = await memory.getclipconsents();\n const clips = await memory.getclips();\n const quarantines = await memory.getquarantines();\n const cleanuprules = await memory.getcleanuprules();\n const cleanupruns = await memory.getcleanupruns();\n const capturecounters = await memory.getcapturecounters();\n const inventory = await memory.getinventory();\n const mimefilters = await memory.getmimefilters();\n const scanhooks: Array<{ scanner: string; endpoint: string; origin: string; configuredat: number; granted: boolean }> = [];\n for (const hook of await memory.getscanhooks()) {\n scanhooks.push({ ...hook, granted: await chrome.permissions.contains({ origins: [hostpattern(hook.origin)] } as chrome.permissions.Permissions).catch(() => false) });\n }\n const clones = clonetabs(tabs);\n const taskgauge = tasktabgauge(tabs.filter(tab => badges.some(badge => badge.tabid === tab.tabid)).length, tasktabceiling(await memory.getsettings()));\n const report: tabreport = await buildtabreport(tabs);\n const livetab = session ? await chrome.tabs.get(session.tabid).catch(() => undefined) : undefined;\n const waitprofile = session ? waitprofiles.find(record => record.origin === session.origin) : undefined;\n const livestate: navstate = { phase: livetab?.status === \"loading\" ? \"loading\" : \"complete\", ...(navrecords[0] ? { finalurl: navrecords[0].finalurl, redirects: navrecords[0].chain } : {}) };\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 } : {}), trail: trailreport({ ...(session ? { sessionid: session.id } : {}), trail }), navrecords, ratestates, safeties, curated, waitprofiles, auths, navcontrol, navqueues, artifacts, navstate: livestate, ...(waitprofile ? { waitprofile } : {}), offline: !navigator.onLine, tabs, windows, layouts: layoutreport({ layouts }), tabgroups, tabmetas, badges, snapshots, closedtabs, tabwatchevents, clones, tasktabgauge: taskgauge, ...(controltab ? { controltab } : {}), tabreport: report, profiles, tickets, wizards: wizardreport({ ...(session ? { sessionid: session.id } : {}), wizards, picks }), picks, errorreports, captchas, detections, ...(codeentry !== undefined ? { codeentry: true } : {}), datasets, imports, extractsessions, streams, exports, provenances, taskrules, sheetendpoints: sheetgrants, downloads, netlogs, clipconsents, clips, quarantines, cleanuprules, cleanupruns, capturecounters, inventory, mimefilters, scanhooks };\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 \"storeauth\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Basic auth credentials are stored only behind the consent gate of an active session.\");\n const inputauth = message as { origin?: string; username?: string; password?: string };\n const origin = new URL(inputauth.origin ?? \"\").origin;\n if (!origin.startsWith(\"https://\")) throw new Error(\"Basic auth credentials need an HTTPS origin.\");\n if (!inputauth.username?.trim() || !inputauth.password) throw new Error(\"Basic auth credentials need a username and a password.\");\n const record: authrecord = { origin, username: inputauth.username.trim(), password: inputauth.password, reviewedat: Date.now() };\n await memory.setauth(record);\n await audit(\"auth\", `Basic auth credentials for ${origin} stored after explicit review; the password never leaves local storage.`, { sessionid: session.id });\n return { origin: record.origin, username: record.username, reviewedat: record.reviewedat };\n }\n case \"checksafe\": {\n const inputurl = message as { url?: string };\n const verdict = { ...checksafe(inputurl.url ?? \"\"), at: Date.now() };\n await memory.addsafety(verdict);\n const session = await memory.getsession();\n await audit(\"navigation\", `Safety check of ${verdict.url} returned ${verdict.safe ? \"safe\" : \"unsafe\"}${verdict.reasons.length > 0 ? `: ${verdict.reasons.join(\"; \")}` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}) });\n return verdict;\n }\n case \"navstate\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a navstate envelope.\");\n const record = (await memory.getnavrecords())[0];\n const session = await memory.getsession();\n const livetab = session ? await chrome.tabs.get(session.tabid).catch(() => undefined) : undefined;\n const state: navstate = { phase: livetab?.status === \"loading\" ? \"loading\" : \"complete\", ...(record ? { finalurl: record.finalurl, redirects: record.chain } : {}) };\n return JSON.parse(navstateresponse({ navstate: state, plan }));\n }\n case \"safeties\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a safety envelope.\");\n return JSON.parse(safetyresponse({ verdicts: await memory.getsafeties(), plan }));\n }\n case \"jumptotab\": {\n const inputtab = message as { tabid?: number };\n if (typeof inputtab.tabid !== \"number\") throw new Error(\"A numeric tab id is required to jump.\");\n await chrome.tabs.update(inputtab.tabid, { active: true }).catch(() => { throw new Error(\"The tab to jump to is no longer open.\"); });\n await audit(\"tab\", `The review panel jumped to tab ${inputtab.tabid}.`);\n return { tabid: inputtab.tabid };\n }\n case \"tabsearch\": {\n const inputsearch = message as { text?: string };\n const granted = await chrome.permissions.contains({ permissions: [\"tabs\"] } as chrome.permissions.Permissions);\n if (!granted) throw new Error(\"The tabs capability has not been granted; request it from the review panel.\");\n const matches = searchtabmatches(await livetabs(), inputsearch.text ?? \"\");\n await audit(\"tab\", `The review panel searched the open tabs for \"${inputsearch.text ?? \"\"}\" and matched ${matches.length} tab${matches.length === 1 ? \"\" : \"s\"}.`);\n return { matches };\n }\n case \"savelayout\": {\n const session = await memory.getsession();\n const gate = layoutmutationgranted(session, Date.now());\n if (!gate.allowed) throw new Error(gate.reason);\n const inputlayout = message as { name?: string };\n if (!inputlayout.name?.trim()) throw new Error(\"A layout name is required.\");\n const [tabs, windows, groups, scratch] = await Promise.all([livetabs(), livewindows(), memory.gettabgroups(), memory.getscratchwindows()]);\n const layout = buildlayout(inputlayout.name.trim(), tabs, windows, groups, scratch, Date.now());\n await memory.setlayout(layout);\n await audit(\"layout\", `The review panel saved the tab layout ${layout.name} with ${layout.tabs.length} tabs and ${layout.windows.length} window bounds.`, { ...(session ? { sessionid: session.id } : {}) });\n return layout;\n }\n case \"restorelayout\": {\n const session = await memory.getsession();\n const gate = layoutmutationgranted(session, Date.now());\n if (!gate.allowed) throw new Error(gate.reason);\n const inputlayout = message as { name?: string };\n const layout = await memory.getlayout(inputlayout.name ?? \"\");\n if (!layout) throw new Error(`No tab layout named ${inputlayout.name ?? \"\"} is stored yet.`);\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n const urls = layoutrestoreplan(layout, open);\n const opened: number[] = [];\n for (const url of urls) {\n const created = await chrome.tabs.create({ url, active: opened.length === 0 });\n opened.push(created?.id ?? 0);\n }\n await audit(\"layout\", `The review panel restored the tab layout ${layout.name}: ${opened.length} tab${opened.length === 1 ? \"\" : \"s\"} reopened.`, { ...(session ? { sessionid: session.id } : {}) });\n return { name: layout.name, reopened: opened.length };\n }\n case \"restoresnapshot\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Snapshot restore stays behind the consent gate of an active session.\");\n const inputsnapshot = message as { id?: string };\n const snapshot = (await memory.getsnapshots()).find(item => item.id === inputsnapshot.id);\n if (!snapshot) throw new Error(\"No stored session snapshot matches the requested id.\");\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n const urls = layoutrestoreplan(snapshot.layout, open);\n const opened: number[] = [];\n for (const url of urls) {\n const created = await chrome.tabs.create({ url, active: opened.length === 0 });\n opened.push(created?.id ?? 0);\n }\n await audit(\"layout\", `The review panel restored the session snapshot ${snapshot.id}: ${opened.length} tab${opened.length === 1 ? \"\" : \"s\"} reopened.`, { sessionid: session.id });\n return { id: snapshot.id, reopened: opened.length };\n }\n case \"controltab\": {\n const inputcontrol = message as { enabled?: boolean };\n const state = await togglecontroltab(inputcontrol.enabled === true);\n const settings = await memory.getsettings();\n await memory.setsettings({ ...settings, controltab: state.enabled });\n return state;\n }\n case \"settasktabceiling\": {\n const inputceiling = message as { ceiling?: number };\n const settings = await memory.getsettings();\n const ceiling = typeof inputceiling.ceiling === \"number\" && Number.isFinite(inputceiling.ceiling) && inputceiling.ceiling >= 0 ? inputceiling.ceiling : undefined;\n await memory.setsettings({ ...settings, ...(ceiling !== undefined ? { tasktabceiling: ceiling } : {}) });\n await audit(\"configure\", `The user set the concurrent task tab ceiling to ${ceiling === undefined ? \"no ceiling\" : ceiling}; the value stays a user choice with no code cap.`);\n return { tasktabceiling: ceiling };\n }\n case \"windowstate\": {\n const inputwindow = message as { windowid?: number; state?: string };\n if (typeof inputwindow.windowid !== \"number\" || !inputwindow.state || ![\"normal\", \"maximized\", \"minimized\", \"fullscreen\"].includes(inputwindow.state)) throw new Error(\"A numeric window id and a known window state are required.\");\n await chrome.windows.update(inputwindow.windowid, { state: inputwindow.state as chrome.windows.WindowState });\n await audit(\"window\", `The popup set window ${inputwindow.windowid} to the ${inputwindow.state} state.`);\n return { windowid: inputwindow.windowid, state: inputwindow.state };\n }\n case \"closewindow\": {\n const inputclose = message as { windowid?: number; reviewed?: boolean };\n if (typeof inputclose.windowid !== \"number\") throw new Error(\"A numeric window id is required.\");\n const session = await memory.getsession();\n const plan = await memory.getplan();\n const progress = plan ? await memory.getprogress() : undefined;\n const tasktabids = plan && progress ? trackedtasktabs(progress, plan.id) : [];\n const count = tasktabsinwindow(await livetabs(), inputclose.windowid, tasktabids);\n const gate = windowclosegate(count, inputclose.reviewed === true);\n if (!gate.allowed) throw new Error(gate.reason);\n await chrome.windows.remove(inputclose.windowid);\n await audit(\"window\", `The review panel closed window ${inputclose.windowid}${count > 0 ? ` while holding ${count} task tab${count === 1 ? \"\" : \"s\"} under explicit review` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}) });\n return { windowid: inputclose.windowid, closed: true };\n }\n case \"applyprofile\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Profile application stays inside the consent gate of an active session.\");\n const inputprofile = message as { name?: string };\n const profile = await memory.getprofile(inputprofile.name ?? \"\");\n if (!profile) throw new Error(`No form profile named ${inputprofile.name ?? \"\"} is stored yet.`);\n const gate = profilegrantgranted(profile, session.origin);\n if (!gate.allowed) throw new Error(gate.reason);\n await audit(\"fill\", `Form profile ${profile.name} applied as the reviewed field map for ${session.origin} under its origin grants.`, { sessionid: session.id });\n return { profile: { name: profile.name, fields: profile.fields, grants: profile.grants } };\n }\n case \"approvesubmit\": {\n const inputticket = message as { id?: string; approved?: boolean };\n const tickets = await memory.gettickets();\n const ticket = tickets.find(item => item.id === inputticket.id);\n if (!ticket) throw new Error(\"No submission ticket matches the requested id.\");\n const updated = { ...ticket, approved: inputticket.approved !== false };\n await memory.setticket(updated);\n const session = await memory.getsession();\n await audit(\"submit\", `Submission ticket ${ticket.id} for form ${ticket.form} ${updated.approved ? \"approved\" : \"declined\"} by the user with values hash ${ticket.valueshash}.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return updated;\n }\n case \"resolvecaptcha\": {\n const open = (await memory.getcaptchas()).find(item => !item.resolved);\n if (!open) throw new Error(\"No open captcha handoff exists.\");\n await memory.resolvecaptcha(open.id, Date.now());\n const session = await memory.getsession();\n if (session?.pausedat && !session.stoppedat) {\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 }\n await audit(\"handoff\", `Captcha handoff ${open.id} resolved by the user after ${Date.now() - open.openedat} milliseconds; the plan continues.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return { resolved: true, id: open.id };\n }\n case \"storecode\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"The one time code entry stays behind the consent gate of an active session.\");\n const inputcode = message as { code?: string };\n if (!inputcode.code?.trim()) throw new Error(\"A non-empty one time code is required.\");\n await memory.setcodevalue(inputcode.code.trim());\n await audit(\"consent\", `A one time code was stored behind the consent gate of the active session; the value never appears in the audit trail.`, { sessionid: session.id });\n return { stored: true };\n }\n case \"regeneratevalue\": {\n const inputvalue = message as { field?: string; locale?: string; seed?: number };\n if (typeof inputvalue.field !== \"string\" || !inputvalue.field) throw new Error(\"A field kind is required to regenerate a value.\");\n const rule: { locale?: string; seed?: number } = {};\n if (typeof inputvalue.locale === \"string\" && inputvalue.locale) rule.locale = inputvalue.locale;\n if (typeof inputvalue.seed === \"number\" && Number.isFinite(inputvalue.seed)) rule.seed = inputvalue.seed;\n const value = generatevalue(inputvalue.field as fieldkind, rule);\n const verdict = generatedvalueallowed(value);\n if (!verdict.allowed) throw new Error(verdict.reason ?? \"The regenerated value was refused.\");\n return { kind: inputvalue.field, value, locale: rule.locale ?? \"en\", seed: rule.seed ?? 1 };\n }\n case \"removeprofile\": {\n const inputprofile = message as { name?: string };\n const profile = await memory.getprofile(inputprofile.name ?? \"\");\n if (!profile) throw new Error(`No form profile named ${inputprofile.name ?? \"\"} is stored yet.`);\n await memory.removeprofile(profile.name);\n const session = await memory.getsession();\n await audit(\"fill\", `Form profile ${profile.name} removed from local memory by the user.`, { ...(session ? { sessionid: session.id } : {}) });\n return { removed: true, name: profile.name };\n }\n case \"formreport\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a form report envelope.\");\n const outcome = (await memory.getoutcomes()).find(candidate => plan.steps.some(step => step.id === candidate.stepid && step.kind === \"detectfields\"));\n const report = outcome?.details?.report;\n if (!report) throw new Error(\"No form report has been captured yet.\");\n return JSON.parse(formreportresponse({ report: report as formreport, plan }));\n }\n case \"errorreport\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for an error report envelope.\");\n const report = (await memory.geterrorreports())[0];\n if (!report) throw new Error(\"No error report has been collected yet.\");\n return JSON.parse(errorreportresponse({ report, plan }));\n }\n case \"configuresheet\": {\n const inputsheet = message as { endpoint?: string };\n const config = normalizeendpoint(inputsheet.endpoint ?? \"\");\n const granted = await chrome.permissions.contains({ origins: [hostpattern(config.origin)] });\n if (!granted) throw new Error(\"The sheet endpoint origin has not received optional permission.\");\n const record: sheetendpoint = { endpoint: config.endpoint, origin: config.origin, configuredat: Date.now() };\n await memory.setsheetendpoint(record);\n await audit(\"configure\", `Configured the reviewed sheet endpoint ${config.origin} for data pushes; pushes need the explicit reviewed flag.`);\n return record;\n }\n case \"exportdataset\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Data exports stay behind the consent gate of an active session.\");\n const { tab, origin } = await activecontext();\n const gate = exportgranted(session, origin);\n if (!gate.allowed) throw new Error(gate.reason);\n const inputexport = message as { datasetid?: string; format?: string; name?: string };\n const format = inputexport.format === \"json\" ? \"json\" : inputexport.format === \"excel\" ? \"excel\" : \"csv\";\n const datasetvalue = await loaddataset(inputexport.datasetid ?? \"\");\n const artifact = await storeexport(\"panel\", { ...datasetvalue, ...(inputexport.name?.trim() ? { name: inputexport.name.trim() } : {}) }, format, \",\", session, \"\", origin);\n void tab;\n return { id: artifact.id, kind: artifact.kind, name: artifact.name, rowcount: artifact.rowcount, checksum: artifact.checksum, at: artifact.at };\n }\n case \"importcsv\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Csv imports stay behind the consent gate of an active session.\");\n const inputimport = message as { csv?: string; name?: string; mapping?: Record<string, string> };\n const parsed = parsecsv(inputimport.csv ?? \"\");\n if (parsed.headers.length === 0) throw new Error(\"The reviewed csv needs a header line.\");\n const columns = mapcolumns(parsed.headers, inputimport.mapping ?? {});\n const rows = parsed.rows.map(line => {\n const row: datasetrow = {};\n columns.forEach((column, index) => { row[column.key] = line[index] ?? \"\"; });\n return row;\n });\n const datasetvalue: dataset = { id: randomid(), name: inputimport.name?.trim() || `import-${Date.now()}`, columns, rows, sources: [], at: Date.now() };\n await memory.addimport(datasetvalue);\n await audit(\"scrape\", `The review panel imported ${rows.length} row${rows.length === 1 ? \"\" : \"s\"} from the reviewed csv as dataset ${datasetvalue.name} for fill loops.`, { sessionid: session.id });\n await refreshbadge();\n return { id: datasetvalue.id, name: datasetvalue.name, rows: rows.length, columns: columns.length };\n }\n case \"dataset\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a dataset envelope.\");\n const inputdataset = message as { datasetid?: string; sample?: number };\n const datasetvalue = await memory.getdataset(inputdataset.datasetid ?? \"\");\n if (!datasetvalue) throw new Error(\"No dataset has been captured yet.\");\n return JSON.parse(datasetresponse({ dataset: datasetvalue, plan, ...(typeof inputdataset.sample === \"number\" ? { sample: inputdataset.sample } : {}) }));\n }\n case \"extraction\": return extractionreportValue();\n case \"provenance\": return provenancereportValue();\n case \"downloadreport\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a download report envelope.\");\n return JSON.parse(downloadreport({ downloads: await memory.getdownloads(), plan }));\n }\n case \"quarantine\": return quarantinereport({ entries: await memory.getquarantines() });\n case \"netlog\": return netlogreport({ records: await memory.getnetlog() });\n case \"downloadaction\": {\n const inputdownload = message as { id?: string; action?: string };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Download actions stay behind the consent gate of an active session.\");\n const record = await loadownload(inputdownload.id ?? \"\");\n if (!record) throw new Error(`No stored download matches ${inputdownload.id ?? \"\"}.`);\n const extra = { sessionid: session.id };\n if (inputdownload.action === \"pause\") return pauseonerecord(record, extra);\n if (inputdownload.action === \"resume\") return resumeonerecord(record, extra);\n if (inputdownload.action === \"verify\") return verifyonerecord(record, {}, extra);\n throw new Error(\"A pause, resume or verify action is required.\");\n }\n case \"approveclipconsent\": {\n const inputconsent = message as { id?: string; approved?: boolean };\n const record = (await memory.getclipconsents()).find(item => item.id === inputconsent.id);\n if (!record) throw new Error(\"No clipboard consent prompt matches the requested id.\");\n await memory.setclipconsent({ ...record, approved: inputconsent.approved !== false });\n const session = await memory.getsession();\n await audit(\"clipboard\", `Clipboard consent prompt ${record.id} for step ${record.stepid} on ${record.origin} ${inputconsent.approved !== false ? \"approved\" : \"declined\"} by the user; every read consumes its own prompt.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return { id: record.id, approved: inputconsent.approved !== false };\n }\n case \"releasequarantine\": {\n const inputquarantine = message as { id?: string };\n const entry = (await memory.getquarantines()).find(item => item.id === inputquarantine.id);\n if (!entry) throw new Error(\"No quarantined file matches the requested id.\");\n if (entry.release !== undefined) throw new Error(`The quarantined file ${entry.path} was already released.`);\n const gate = quarantinereleasegranted(entry);\n if (!gate.allowed) throw new Error(gate.reason);\n const releasedentry = released(entry, `user-${Date.now()}`, Date.now());\n await memory.setquarantine(releasedentry);\n const session = await memory.getsession();\n await audit(\"quarantine\", `Quarantine release of ${entry.path} approved with the ${entry.scan} scan verdict under ref ${releasedentry.release}; every release is audited with its verdict.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return releasedentry;\n }\n case \"setcleanuprules\": {\n const inputrules = message as { rules?: unknown[] };\n const rules = (Array.isArray(inputrules.rules) ? inputrules.rules : []).filter((item): item is cleanuprule => Boolean(item) && typeof item === \"object\" && !Array.isArray(item));\n for (const rule of rules) {\n const gate = validatecleanuprule(rule);\n if (!gate.allowed) throw new Error(gate.reason);\n }\n await memory.setcleanuprules(rules);\n const session = await memory.getsession();\n await audit(\"cleanup\", `The review panel stored ${rules.length} reviewed cleanup rule${rules.length === 1 ? \"\" : \"s\"} with age windows and keep policies; ages stay user configured with no code ceiling.`, { ...(session ? { sessionid: session.id } : {}) });\n return { rules: rules.length };\n }\n case \"configurescanhook\": {\n const inputhook = message as { scanner?: string; endpoint?: string };\n const config = normalizeendpoint(inputhook.endpoint ?? \"\");\n const granted = await chrome.permissions.contains({ origins: [hostpattern(config.origin)] });\n if (!granted) throw new Error(\"The scan hook origin has not received optional permission.\");\n if (!inputhook.scanner?.trim()) throw new Error(\"A scanner name is required for the scan hook.\");\n const hook: scanhookconfig = { scanner: inputhook.scanner.trim(), endpoint: config.endpoint, origin: config.origin, configuredat: Date.now() };\n await memory.setscanhook(hook);\n await audit(\"quarantine\", `Configured the virus scanning hook ${hook.scanner} at ${hook.origin}; scan verdicts arrive from the endpoint and hook failures stay pending verdicts.`, {});\n return hook;\n }\n case \"exportnetlog\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Netlog exports stay behind the consent gate of an active session.\");\n const records = (await memory.getnetlog()).map(record => ({ ...record, headers: redactheaders(record.headers ?? {}) }));\n await audit(\"observation\", `The review panel exported ${records.length} netlog record${records.length === 1 ? \"\" : \"s\"} of the run with every header value redacted.`, { sessionid: session.id });\n return { records, redacted: true, redaction: \"every header value is redacted from exported netlogs\" };\n }\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", "tabid", "snapshot", "record", "snapshot", "tabid", "text", "tabid", "record", "text", "released", "tabid", "window", "record", "record", "text", "record", "text", "record", "stepoptions", "tabid", "record", "created", "text", "window", "snapshot", "id", "tasktabs"]
|
|
3
|
+
"sources": ["../../memory.ts", "../../policy.ts", "../../progress.ts", "../../version.ts", "../../types.ts", "../../protocol.ts", "../../capture.ts", "../../media.ts", "../browsertabs.ts", "../tabscommand.ts", "../pagedialogs.ts", "../pageinteract.ts", "../pagecontrols.ts", "../pagenav.ts", "../pagenet.ts", "../pageforms.ts", "../pagewizards.ts", "../pagedata.ts", "../datacommand.ts", "../filescommand.ts", "../background.ts"],
|
|
4
|
+
"sourcesContent": ["import type { a11ycapture, agentplan, agentsession, artifactinventoryentry, artifactrecord, assetrecord, auditevent, authrecord, bannerreport, capabilityreport, canvasrecord, captchahandoff, capturecounter, clipboardconsentrecord, cleanuprule, cleanuprun, clipentry, clickablemap, closedtab, controltabstate, curatedlist, dataset, derivedselector, detectionrecord, diagnosticreport, dialogdecision, dialogpolicy, downloadrecord, endpointconfig, errorreport, exportedartifact, extractsession, focusevent, formprofile, framerecord, imagebatch, keyholdstate, mediarecord, pdfrecord, mimefilter, mutationevent, navcontrol, navintentrecord, navqueues, navrecord, netlogrecord, observationrecord, pagesignals, planprogress, provenancerecord, quarantineentry, ratelimitstate, readercapture, recenttab, recordingconsentrecord, recordingrecord, resolutionsummary, retryoutcome, runsettings, safetyverdict, scanhookconfig, sessionsnapshot, sheetendpoint, shotpair, shotrecord, snapshotdiff, stepoutcome, streamstate, submitticket, tabbadge, tabgrouprecord, tablayout, tabmeta, tabwatchevent, taskrules, templateprofile, trailentry, typeaheadpick, waitprofilerecord, watchregistration, wizardstate } 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 /** Appends one navigation trail entry of a session with its url, title, step ref and timestamp. */\n async addtrailentry(sessionid: string, entry: trailentry): Promise<void> {\n const records = await this.gettrail(sessionid);\n await this.adapter.set(`trail${sessionid}`, [...records, entry]);\n }\n\n /** Returns the navigation trail of a session, oldest first. */\n async gettrail(sessionid: string): Promise<trailentry[]> { return (await this.adapter.get<trailentry[]>(`trail${sessionid}`)) ?? []; }\n\n /** Stores one wait profile for an origin with user configured values, replacing the previous profile of that origin. */\n async setwaitprofile(record: waitprofilerecord): Promise<void> {\n const records = (await this.getwaitprofiles()).filter(item => item.origin !== record.origin);\n await this.adapter.set(\"waitprofiles\", [...records, record]);\n }\n\n /** Returns every stored wait profile with its origin and user configured values, newest first. */\n async getwaitprofiles(): Promise<waitprofilerecord[]> { return (await this.adapter.get<waitprofilerecord[]>(\"waitprofiles\")) ?? []; }\n\n /** Records one navigation step with its redirect chain and final url. */\n async addnavrecord(record: navrecord): Promise<void> {\n const records = await this.getnavrecords();\n await this.adapter.set(\"navrecords\", [record, ...records]);\n }\n\n /** Returns every stored navigation record with redirect chains and final urls, newest first. */\n async getnavrecords(): Promise<navrecord[]> { return (await this.adapter.get<navrecord[]>(\"navrecords\")) ?? []; }\n\n /** Records one navigation intent detected from a plan for audit review. */\n async addnavintent(record: navintentrecord): Promise<void> {\n const records = await this.getnavintents();\n await this.adapter.set(\"navintents\", [record, ...records]);\n }\n\n /** Returns every stored navigation intent record, newest first. */\n async getnavintents(): Promise<navintentrecord[]> { return (await this.adapter.get<navintentrecord[]>(\"navintents\")) ?? []; }\n\n /** Replaces the rate limit window state of one domain. */\n async setratestate(state: ratelimitstate): Promise<void> {\n const records = (await this.getratestates()).filter(item => item.domain !== state.domain);\n await this.adapter.set(\"ratestates\", [...records, state]);\n }\n\n /** Returns every rate limit window state per domain. */\n async getratestates(): Promise<ratelimitstate[]> { return (await this.adapter.get<ratelimitstate[]>(\"ratestates\")) ?? []; }\n\n /** Records one curated link list with its review state before batch opening. */\n async addcurated(list: curatedlist): Promise<void> {\n const records = await this.getcurateds();\n await this.adapter.set(\"curated\", [list, ...records]);\n }\n\n /** Returns every stored curated link list, newest first. */\n async getcurateds(): Promise<curatedlist[]> { return (await this.adapter.get<curatedlist[]>(\"curated\")) ?? []; }\n\n /** Stores reviewed basic auth credentials for one origin, replacing the previous record of that origin. */\n async setauth(record: authrecord): Promise<void> {\n const records = (await this.getauths()).filter(item => item.origin !== record.origin);\n await this.adapter.set(\"auths\", [...records, record]);\n }\n\n /** Returns every stored reviewed basic auth record per origin. */\n async getauths(): Promise<authrecord[]> { return (await this.adapter.get<authrecord[]>(\"auths\")) ?? []; }\n\n /** Records one task artifact routed into the artifact store. */\n async addartifact(record: artifactrecord): Promise<void> {\n const records = await this.getartifacts();\n await this.adapter.set(\"artifacts\", [record, ...records]);\n }\n\n /** Returns every stored task artifact, newest first. */\n async getartifacts(): Promise<artifactrecord[]> { return (await this.adapter.get<artifactrecord[]>(\"artifacts\")) ?? []; }\n\n /** Returns the navigation control state of paused navigation. */\n async getnavcontrol(): Promise<navcontrol | undefined> { return this.adapter.get<navcontrol>(\"navcontrol\"); }\n\n /** Replaces the navigation control state after a pause or resume transition. */\n async setnavcontrol(control: navcontrol): Promise<void> { return this.adapter.set(\"navcontrol\", control); }\n\n /** Records one url safety verdict produced by a checksafe verification. */\n async addsafety(verdict: safetyverdict): Promise<void> {\n const records = await this.getsafeties();\n await this.adapter.set(\"safeties\", [verdict, ...records]);\n }\n\n /** Returns every stored url safety verdict, newest first. */\n async getsafeties(): Promise<safetyverdict[]> { return (await this.adapter.get<safetyverdict[]>(\"safeties\")) ?? []; }\n\n /** Records one recently closed tab so a reopentab step can restore it. */\n async addrecenttab(tab: recenttab): Promise<void> {\n const records = await this.getrecenttabs();\n await this.adapter.set(\"recenttabs\", [tab, ...records]);\n }\n\n /** Returns every recently closed tab, newest first. */\n async getrecenttabs(): Promise<recenttab[]> { return (await this.adapter.get<recenttab[]>(\"recenttabs\")) ?? []; }\n\n /** Returns the queued prefetch and batch open target counts shown in the popup badge. */\n async getnavqueues(): Promise<navqueues | undefined> { return this.adapter.get<navqueues>(\"navqueues\"); }\n\n /** Replaces the queued prefetch and batch open target counts. */\n async setnavqueues(queues: navqueues): Promise<void> { return this.adapter.set(\"navqueues\", queues); }\n\n /** Returns the last known navigation state of a tab, kept across service worker restarts. */\n async getnavstate(tabid: number): Promise<navrecord | undefined> { return this.adapter.get<navrecord>(`navstate${tabid}`); }\n\n /** Replaces the last known navigation state of a tab. */\n async setnavstate(tabid: number, state: navrecord): Promise<void> { return this.adapter.set(`navstate${tabid}`, state); }\n\n /** Stores one named tab layout with its window bounds and group states, replacing the previous layout of that name. */\n async setlayout(layout: tablayout): Promise<void> {\n const records = (await this.getlayouts()).filter(item => item.name !== layout.name);\n await this.adapter.set(\"layouts\", [layout, ...records]);\n }\n\n /** Returns one saved tab layout by name with its timestamp. */\n async getlayout(name: string): Promise<tablayout | undefined> { return (await this.getlayouts()).find(item => item.name === name); }\n\n /** Returns every saved tab layout with its window bounds and group states. */\n async getlayouts(): Promise<tablayout[]> { return (await this.adapter.get<tablayout[]>(\"layouts\")) ?? []; }\n\n /** Stores one tab group definition with its color choice and member tabs, replacing the previous definition of that name. */\n async settabgroup(group: tabgrouprecord): Promise<void> {\n const records = (await this.gettabgroups()).filter(item => item.name !== group.name);\n await this.adapter.set(\"tabgroups\", [...records, group]);\n }\n\n /** Returns every stored tab group definition with its color choice, newest first. */\n async gettabgroups(): Promise<tabgrouprecord[]> { return (await this.adapter.get<tabgrouprecord[]>(\"tabgroups\")) ?? []; }\n\n /** Records one tabmeta record with task provenance, replacing the previous metadata of that tab. */\n async settabmeta(meta: tabmeta): Promise<void> {\n const records = (await this.gettabmetas()).filter(item => item.tabid !== meta.tabid);\n await this.adapter.set(\"tabmetas\", [...records, meta]);\n }\n\n /** Returns every stored tabmeta record with task provenance. */\n async gettabmetas(): Promise<tabmeta[]> { return (await this.adapter.get<tabmeta[]>(\"tabmetas\")) ?? []; }\n\n /** Records one session snapshot of tabs and windows for later restore. */\n async addsnapshot(snapshot: sessionsnapshot): Promise<void> {\n const records = await this.getsnapshots();\n await this.adapter.set(\"snapshots\", [snapshot, ...records]);\n }\n\n /** Returns every stored session snapshot, newest first. */\n async getsnapshots(): Promise<sessionsnapshot[]> { return (await this.adapter.get<sessionsnapshot[]>(\"snapshots\")) ?? []; }\n\n /** Records one closed tab in the history kept for restoretab and reopenrun. */\n async addclosedtab(tab: closedtab): Promise<void> {\n const records = await this.getclosedtabs();\n await this.adapter.set(\"closedtabs\", [tab, ...records]);\n }\n\n /** Returns the closed tab history, newest first. */\n async getclosedtabs(): Promise<closedtab[]> { return (await this.adapter.get<closedtab[]>(\"closedtabs\")) ?? []; }\n\n /** Stores one badge state per task, replacing the previous badge of that task. */\n async setbadge(badge: tabbadge): Promise<void> {\n const records = (await this.getbadges()).filter(item => item.taskid !== badge.taskid);\n await this.adapter.set(\"badges\", [...records, badge]);\n }\n\n /** Returns every stored badge state per task. */\n async getbadges(): Promise<tabbadge[]> { return (await this.adapter.get<tabbadge[]>(\"badges\")) ?? []; }\n\n /** Records one tab event observed inside a reviewed watchtab registration. */\n async addtabwatchevent(event: tabwatchevent): Promise<void> {\n const records = await this.gettabwatchevents();\n await this.adapter.set(\"tabwatchevents\", [event, ...records]);\n }\n\n /** Returns the tab event stream of every reviewed watchtab registration, newest first. */\n async gettabwatchevents(): Promise<tabwatchevent[]> { return (await this.adapter.get<tabwatchevent[]>(\"tabwatchevents\")) ?? []; }\n\n /** Returns the ids of the scratch windows opened for split work. */\n async getscratchwindows(): Promise<number[]> { return (await this.adapter.get<number[]>(\"scratchwindows\")) ?? []; }\n\n /** Replaces the scratch window id list after one scratch window opens or closes. */\n async setscratchwindows(ids: number[]): Promise<void> { return this.adapter.set(\"scratchwindows\", ids); }\n\n /** Returns the pinned control tab state with the live task feed. */\n async getcontroltab(): Promise<controltabstate | undefined> { return this.adapter.get<controltabstate>(\"controltab\"); }\n\n /** Replaces the pinned control tab state. */\n async setcontroltab(state: controltabstate): Promise<void> { return this.adapter.set(\"controltab\", state); }\n\n /** Stores one saved form profile under its reviewed name, replacing the previous profile of that name. */\n async setprofile(profile: formprofile): Promise<void> {\n const records = (await this.getprofiles()).filter(item => item.name !== profile.name);\n await this.adapter.set(\"formprofiles\", [profile, ...records]);\n }\n\n /** Returns one saved form profile by its reviewed name. */\n async getprofile(name: string): Promise<formprofile | undefined> { return (await this.getprofiles()).find(item => item.name === name); }\n\n /** Returns every saved form profile with its origin grants, newest first. */\n async getprofiles(): Promise<formprofile[]> { return (await this.adapter.get<formprofile[]>(\"formprofiles\")) ?? []; }\n\n /** Removes one saved form profile by its reviewed name. */\n async removeprofile(name: string): Promise<void> {\n const records = (await this.getprofiles()).filter(item => item.name !== name);\n await this.adapter.set(\"formprofiles\", records);\n }\n\n /** Records one wizard state with its step history. */\n async addwizard(state: wizardstate): Promise<void> {\n const records = await this.getwizards();\n await this.adapter.set(\"wizards\", [state, ...records]);\n }\n\n /** Returns every stored wizard state with its step history, newest first. */\n async getwizards(): Promise<wizardstate[]> { return (await this.adapter.get<wizardstate[]>(\"wizards\")) ?? []; }\n\n /** Stores one submission ticket with its values hash, replacing the previous ticket of that id. */\n async setticket(ticket: submitticket): Promise<void> {\n const records = (await this.gettickets()).filter(item => item.id !== ticket.id);\n await this.adapter.set(\"submittickets\", [ticket, ...records]);\n }\n\n /** Returns every stored submission ticket with its values hash, newest first. */\n async gettickets(): Promise<submitticket[]> { return (await this.adapter.get<submitticket[]>(\"submittickets\")) ?? []; }\n\n /** Records one collected error report for correction loops. */\n async adderrorreport(report: errorreport): Promise<void> {\n const records = await this.geterrorreports();\n await this.adapter.set(\"errorreports\", [report, ...records]);\n }\n\n /** Returns every stored error report, newest first. */\n async geterrorreports(): Promise<errorreport[]> { return (await this.adapter.get<errorreport[]>(\"errorreports\")) ?? []; }\n\n /** Records one typeahead pick observed when a reviewed suggestion entry was chosen. */\n async addpick(pick: typeaheadpick): Promise<void> {\n const records = await this.getpicks();\n await this.adapter.set(\"typeaheadpicks\", [pick, ...records]);\n }\n\n /** Returns every recorded typeahead pick, newest first. */\n async getpicks(): Promise<typeaheadpick[]> { return (await this.adapter.get<typeaheadpick[]>(\"typeaheadpicks\")) ?? []; }\n\n /** Records one captcha handoff while the plan waits for the user. */\n async addcaptcha(handoff: captchahandoff): Promise<void> {\n const records = await this.getcaptchas();\n await this.adapter.set(\"captchas\", [handoff, ...records]);\n }\n\n /** Returns every captcha handoff record with its resolution state, newest first. */\n async getcaptchas(): Promise<captchahandoff[]> { return (await this.adapter.get<captchahandoff[]>(\"captchas\")) ?? []; }\n\n /** Resolves one captcha handoff by id once the user finished it. */\n async resolvecaptcha(id: string, resolvedat: number): Promise<void> {\n const records = await this.getcaptchas();\n await this.adapter.set(\"captchas\", records.map(handoff => handoff.id === id && !handoff.resolved ? { ...handoff, resolved: true, resolvedat } : handoff));\n }\n\n /** Records one login or template detection for its origin. */\n async adddetection(record: detectionrecord): Promise<void> {\n const records = await this.getdetections();\n await this.adapter.set(\"detections\", [record, ...records]);\n }\n\n /** Returns every stored login and template detection per origin, newest first. */\n async getdetections(): Promise<detectionrecord[]> { return (await this.adapter.get<detectionrecord[]>(\"detections\")) ?? []; }\n\n /** Stores the reviewed one time code behind the consent gate of an active session. */\n async setcodevalue(value: string): Promise<void> { return this.adapter.set(\"codevalue\", value); }\n\n /** Returns the reviewed one time code, if the user stored one behind the consent gate. */\n async getcodevalue(): Promise<string | undefined> { return this.adapter.get<string>(\"codevalue\"); }\n\n /** Stores one dataset with its column specs and rows, replacing the previous record of that id. */\n async setdataset(value: dataset): Promise<void> {\n await this.adapter.set(`dataset${value.id}`, value);\n const ids = ((await this.adapter.get<string[]>(\"datasets\")) ?? []).filter(id => id !== value.id);\n await this.adapter.set(\"datasets\", [value.id, ...ids]);\n }\n\n /** Returns one stored dataset by its id with its column specs and row count. */\n async getdataset(id: string): Promise<dataset | undefined> { return this.adapter.get<dataset>(`dataset${id}`); }\n\n /** Returns every stored dataset id, newest first. */\n async getdatasets(): Promise<dataset[]> {\n const ids = (await this.adapter.get<string[]>(\"datasets\")) ?? [];\n const records: dataset[] = [];\n for (const id of ids) {\n const record = await this.adapter.get<dataset>(`dataset${id}`);\n if (record) records.push(record);\n }\n return records;\n }\n\n /** Stores one imported csv dataset for fill loops beside the dataset store. */\n async addimport(value: dataset): Promise<void> {\n await this.setdataset(value);\n const ids = ((await this.adapter.get<string[]>(\"imports\")) ?? []).filter(id => id !== value.id);\n await this.adapter.set(\"imports\", [value.id, ...ids]);\n }\n\n /** Returns every imported csv dataset for fill loops, newest first. */\n async getimports(): Promise<dataset[]> {\n const ids = (await this.adapter.get<string[]>(\"imports\")) ?? [];\n const records: dataset[] = [];\n for (const id of ids) {\n const record = await this.adapter.get<dataset>(`dataset${id}`);\n if (record) records.push(record);\n }\n return records;\n }\n\n /** Stores one extraction session with its cursor and page history, replacing the previous session of that id. */\n async setextractsession(value: extractsession): Promise<void> {\n await this.adapter.set(`extract${value.id}`, value);\n const ids = ((await this.adapter.get<string[]>(\"extracts\")) ?? []).filter(id => id !== value.id);\n await this.adapter.set(\"extracts\", [value.id, ...ids]);\n }\n\n /** Returns every extraction session with its cursor and page history, newest first. */\n async getextractsessions(): Promise<extractsession[]> {\n const ids = (await this.adapter.get<string[]>(\"extracts\")) ?? [];\n const records: extractsession[] = [];\n for (const id of ids) {\n const record = await this.adapter.get<extractsession>(`extract${id}`);\n if (record) records.push(record);\n }\n return records;\n }\n\n /** Records one provenance record of an exported artifact. */\n async addprovenance(record: provenancerecord): Promise<void> {\n const records = await this.getprovenances();\n await this.adapter.set(\"provenances\", [record, ...records]);\n }\n\n /** Returns every provenance record per exported artifact, newest first. */\n async getprovenances(): Promise<provenancerecord[]> { return (await this.adapter.get<provenancerecord[]>(\"provenances\")) ?? []; }\n\n /** Stores the transform rules and dedupe keys of one task, replacing the previous record of that task. */\n async settaskrules(value: taskrules): Promise<void> {\n const records = ((await this.adapter.get<taskrules[]>(\"taskrules\")) ?? []).filter(item => item.taskid !== value.taskid);\n await this.adapter.set(\"taskrules\", [value, ...records]);\n }\n\n /** Returns the transform rules and dedupe keys per task, newest first. */\n async gettaskrules(): Promise<taskrules[]> { return (await this.adapter.get<taskrules[]>(\"taskrules\")) ?? []; }\n\n /** Stores one stream chunk state for resume, replacing the previous state of that dataset. */\n async setstream(state: streamstate): Promise<void> {\n const records = ((await this.adapter.get<streamstate[]>(\"streams\")) ?? []).filter(item => item.datasetid !== state.datasetid);\n await this.adapter.set(\"streams\", [state, ...records]);\n }\n\n /** Returns every stream chunk state persisted for resume, newest first. */\n async getstreams(): Promise<streamstate[]> { return (await this.adapter.get<streamstate[]>(\"streams\")) ?? []; }\n\n /** Stores one reviewed sheet endpoint config behind its origin grant, replacing the previous config of that origin. */\n async setsheetendpoint(config: sheetendpoint): Promise<void> {\n const records = ((await this.adapter.get<sheetendpoint[]>(\"sheetendpoints\")) ?? []).filter(item => item.origin !== config.origin);\n await this.adapter.set(\"sheetendpoints\", [config, ...records]);\n }\n\n /** Returns every reviewed sheet endpoint config, newest first. */\n async getsheetendpoints(): Promise<sheetendpoint[]> { return (await this.adapter.get<sheetendpoint[]>(\"sheetendpoints\")) ?? []; }\n\n /** Records one exported data artifact; artifact retention is a user setting and an absent setting keeps every artifact. */\n async addexport(artifact: exportedartifact): Promise<void> {\n const records = await this.getexports();\n const combined = [artifact, ...records.filter(item => item.id !== artifact.id)];\n const retention = (await this.getsettings())?.artifactretention;\n await this.adapter.set(\"exports\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Returns every exported data artifact with its content and checksum, newest first. */\n async getexports(): Promise<exportedartifact[]> { return (await this.adapter.get<exportedartifact[]>(\"exports\")) ?? []; }\n\n /** Removes one exported data artifact by id and reports whether it existed. */\n async removeexport(id: string): Promise<boolean> {\n const records = await this.getexports();\n const remaining = records.filter(item => item.id !== id);\n await this.adapter.set(\"exports\", remaining);\n return remaining.length !== records.length;\n }\n\n /** Removes one run store artifact by id and reports whether it existed. */\n async removeartifact(id: string): Promise<boolean> {\n const records = await this.getartifacts();\n const remaining = records.filter(item => item.id !== id);\n await this.adapter.set(\"artifacts\", remaining);\n return remaining.length !== records.length;\n }\n\n /** Stores one batch download file record with its state, path and checksum, replacing the previous record of that id. */\n async setdownload(record: downloadrecord): Promise<void> {\n const records = ((await this.adapter.get<downloadrecord[]>(\"downloads\")) ?? []).filter(item => item.id !== record.id);\n await this.adapter.set(\"downloads\", [record, ...records]);\n }\n\n /** Returns every batch download file record with its state, path and checksum, newest first. */\n async getdownloads(): Promise<downloadrecord[]> { return (await this.adapter.get<downloadrecord[]>(\"downloads\")) ?? []; }\n\n /** Records one captured network log record; netlog retention is a user setting and an absent value keeps every record. */\n async addnetlog(record: netlogrecord): Promise<void> {\n const records = await this.getnetlog();\n const combined = [record, ...records];\n const retention = (await this.getsettings())?.netlogretention;\n await this.adapter.set(\"netlog\", retention === undefined ? combined : combined.slice(0, retention));\n }\n\n /** Returns the captured network log of the run with its step correlation, newest first. */\n async getnetlog(): Promise<netlogrecord[]> { return (await this.adapter.get<netlogrecord[]>(\"netlog\")) ?? []; }\n\n /** Stores one clipboard consent record with its prompt and origin, replacing the previous record of that id. */\n async setclipconsent(record: clipboardconsentrecord): Promise<void> {\n const records = ((await this.adapter.get<clipboardconsentrecord[]>(\"clipconsents\")) ?? []).filter(item => item.id !== record.id);\n await this.adapter.set(\"clipconsents\", [record, ...records]);\n }\n\n /** Returns every clipboard consent record with its prompt and origin, newest first. */\n async getclipconsents(): Promise<clipboardconsentrecord[]> { return (await this.adapter.get<clipboardconsentrecord[]>(\"clipconsents\")) ?? []; }\n\n /** Records one clipboard entry hash with its origin provenance; the payload text itself never persists. */\n async addclip(entry: clipentry): Promise<void> {\n const records = await this.getclips();\n await this.adapter.set(\"clips\", [entry, ...records]);\n }\n\n /** Returns every clipboard entry hash with its kind and origin provenance, newest first. */\n async getclips(): Promise<clipentry[]> { return (await this.adapter.get<clipentry[]>(\"clips\")) ?? []; }\n\n /** Stores one quarantine entry with its scan verdict, replacing the previous entry of that id. */\n async setquarantine(entry: quarantineentry): Promise<void> {\n const records = ((await this.adapter.get<quarantineentry[]>(\"quarantines\")) ?? []).filter(item => item.id !== entry.id);\n await this.adapter.set(\"quarantines\", [entry, ...records]);\n }\n\n /** Returns every quarantine entry with its scan verdict and release ref, newest first. */\n async getquarantines(): Promise<quarantineentry[]> { return (await this.adapter.get<quarantineentry[]>(\"quarantines\")) ?? []; }\n\n /** Stores the reviewed cleanup rule set of the run, replacing the previous set. */\n async setcleanuprules(rules: cleanuprule[]): Promise<void> { return this.adapter.set(\"cleanuprules\", rules); }\n\n /** Returns the reviewed cleanup rule set of the run. */\n async getcleanuprules(): Promise<cleanuprule[]> { return (await this.adapter.get<cleanuprule[]>(\"cleanuprules\")) ?? []; }\n\n /** Records one cleanup run in the run history. */\n async addcleanuprun(run: cleanuprun): Promise<void> {\n const records = await this.getcleanupruns();\n await this.adapter.set(\"cleanupruns\", [run, ...records]);\n }\n\n /** Returns every cleanup run history record with removed and kept counts, newest first. */\n async getcleanupruns(): Promise<cleanuprun[]> { return (await this.adapter.get<cleanuprun[]>(\"cleanupruns\")) ?? []; }\n\n /** Stores the capture naming counters of one task, replacing the previous counters of that task. */\n async setcapturecounter(counter: capturecounter): Promise<void> {\n const records = ((await this.adapter.get<capturecounter[]>(\"capturecounters\")) ?? []).filter(item => item.taskid !== counter.taskid);\n await this.adapter.set(\"capturecounters\", [counter, ...records]);\n }\n\n /** Returns every stored capture naming counter per task, newest first. */\n async getcapturecounters(): Promise<capturecounter[]> { return (await this.adapter.get<capturecounter[]>(\"capturecounters\")) ?? []; }\n\n /** Replaces the artifact inventory the cleanup sweeper plans against. */\n async setinventory(entries: artifactinventoryentry[]): Promise<void> { return this.adapter.set(\"inventory\", entries); }\n\n /** Returns the artifact inventory with sizes and ages for the cleanup sweeper. */\n async getinventory(): Promise<artifactinventoryentry[]> { return (await this.adapter.get<artifactinventoryentry[]>(\"inventory\")) ?? []; }\n\n /** Stores one user configured virus scanning hook, replacing the previous hook of that scanner name. */\n async setscanhook(config: scanhookconfig): Promise<void> {\n const records = ((await this.adapter.get<scanhookconfig[]>(\"scanhooks\")) ?? []).filter(item => item.scanner !== config.scanner);\n await this.adapter.set(\"scanhooks\", [config, ...records]);\n }\n\n /** Returns every configured virus scanning hook, newest first. */\n async getscanhooks(): Promise<scanhookconfig[]> { return (await this.adapter.get<scanhookconfig[]>(\"scanhooks\")) ?? []; }\n\n /** Stores the armed mime interception filters of the run, newest first. */\n async setmimefilters(filters: mimefilter[]): Promise<void> { return this.adapter.set(\"mimefilters\", filters); }\n\n /** Returns the armed mime interception filters of the run, newest first. */\n async getmimefilters(): Promise<mimefilter[]> { return (await this.adapter.get<mimefilter[]>(\"mimefilters\")) ?? []; }\n\n /** Stores one capture record with its bytes and step linkage, replacing the previous record of that id; the user configured capture retention window expires the oldest bytes while the metadata always survives for the audit trail. */\n async addcapture(record: shotrecord): Promise<void> {\n const records = await this.getcaptures();\n const retention = (await this.getsettings())?.captureretention;\n const combined = [record, ...records.filter(item => item.id !== record.id)];\n const stored = retention === undefined ? combined : combined.map((item, index) => index < retention ? item : expirecapturebytes(item));\n await this.adapter.set(\"captures\", stored);\n }\n\n /** Returns every stored capture record with its metadata, newest first. */\n async getcaptures(): Promise<shotrecord[]> { return (await this.adapter.get<shotrecord[]>(\"captures\")) ?? []; }\n\n /** Returns one capture record with its bytes by its id. */\n async getcapture(id: string): Promise<shotrecord | undefined> { return (await this.getcaptures()).find(item => item.id === id); }\n\n /** Returns the capture records filtered by run, step and kind. */\n async listcaptures(filter: { runid?: string; stepid?: string; kind?: string }): Promise<shotrecord[]> {\n const records = await this.getcaptures();\n return records.filter(item => (filter.runid === undefined || item.runid === filter.runid) && (filter.stepid === undefined || item.stepid === filter.stepid) && (filter.kind === undefined || item.kind === filter.kind));\n }\n\n /** Records one before and after shotpair of the run with its action context. */\n async addpair(pair: shotpair): Promise<void> {\n const records = await this.getpairs();\n await this.adapter.set(\"capturepairs\", [pair, ...records.filter(item => item.id !== pair.id)]);\n }\n\n /** Returns the shotpairs of one run resolved through their before records, newest first; an absent run returns every pair. */\n async getpairs(runid?: string): Promise<shotpair[]> {\n const records = (await this.adapter.get<shotpair[]>(\"capturepairs\")) ?? [];\n if (runid === undefined) return records;\n const runs = new Map<string, string>();\n for (const capture of await this.getcaptures()) runs.set(capture.id, capture.runid);\n return records.filter(item => runs.get(item.beforeid) === runid);\n }\n\n /** Stores one media record of the 1.1.41 family with its bytes and step linkage, replacing the previous record of that id; the user configured media retention window expires the oldest bytes while the metadata and the recording index always survive. */\n async addmedia(record: mediarecord): Promise<void> {\n const records = await this.getmediarecords();\n const retention = (await this.getsettings())?.mediaretention;\n const combined = [record, ...records.filter(item => item.id !== record.id)];\n const stored = retention === undefined ? combined : combined.map((item, index) => index < retention ? item : expiremediabytes(item));\n await this.adapter.set(\"media\", stored);\n }\n\n /** Returns every stored media record, newest first. */\n async getmediarecords(): Promise<mediarecord[]> { return (await this.adapter.get<mediarecord[]>(\"media\")) ?? []; }\n\n /** Returns the media records filtered by run and kind; an absent filter returns every record. */\n async listmedia(filter: { runid?: string; kind?: string }): Promise<mediarecord[]> {\n const records = await this.getmediarecords();\n return records.filter(item => (filter.runid === undefined || item.runid === filter.runid) && (filter.kind === undefined || mediakindof(item) === filter.kind));\n }\n\n /** Returns one media record by its id. */\n async getmediarecord(id: string): Promise<mediarecord | undefined> { return (await this.getmediarecords()).find(item => item.id === id); }\n\n /** Returns one recording with its file reference and frame index by its id. */\n async getrecording(id: string): Promise<recordingrecord | undefined> {\n const found = await this.getmediarecord(id);\n return found !== undefined && \"startedat\" in found ? found : undefined;\n }\n\n /** Removes one media record by its id; the audit trail keeps its outcome evidence. */\n async removemedia(id: string): Promise<void> {\n await this.adapter.set(\"media\", (await this.getmediarecords()).filter(item => item.id !== id));\n }\n\n /** Stores one observed image batch of a downloadimages step, replacing the previous batch of that id. */\n async addimagebatch(batch: imagebatch): Promise<void> {\n const records = (await this.adapter.get<imagebatch[]>(\"imagebatches\")) ?? [];\n await this.adapter.set(\"imagebatches\", [batch, ...records.filter(item => item.id !== batch.id)]);\n }\n\n /** Returns every observed image batch with its filter match counts, newest first. */\n async getimagebatches(): Promise<imagebatch[]> { return (await this.adapter.get<imagebatch[]>(\"imagebatches\")) ?? []; }\n\n /** Stores one recording consent decision of an origin, replacing the previous record of that id. */\n async setrecordingconsent(record: recordingconsentrecord): Promise<void> {\n const records = ((await this.adapter.get<recordingconsentrecord[]>(\"recordingconsents\")) ?? []).filter(item => item.id !== record.id);\n await this.adapter.set(\"recordingconsents\", [record, ...records]);\n }\n\n /** Returns every recording consent decision with its prompt and origin, newest first. */\n async getrecordingconsents(): Promise<recordingconsentrecord[]> { return (await this.adapter.get<recordingconsentrecord[]>(\"recordingconsents\")) ?? []; }\n}\n\n/** Resolves the media family discriminator of one stored media record. */\nfunction mediakindof(record: mediarecord): string {\n if (\"pages\" in record) return \"pdf\";\n if (\"startedat\" in record) return \"recording\";\n if (\"timestamp\" in record) return \"frame\";\n if (\"context\" in record) return \"canvas\";\n if (\"tracks\" in record) return \"stream\";\n return \"asset\";\n}\n\n/** Expires the bytes of one media record while keeping the metadata and the recording frame index for the audit trail. */\nfunction expiremediabytes(record: mediarecord): mediarecord {\n if (\"dataurl\" in record) {\n const source = record as pdfrecord | canvasrecord | framerecord;\n const copy = { ...source } as { dataurl?: string };\n delete copy.dataurl;\n return { ...copy, bytesexpired: true } as mediarecord;\n }\n if (\"startedat\" in record) {\n const source = record as recordingrecord;\n const copy = { ...source };\n delete copy.bytes;\n return { ...copy, bytesexpired: true };\n }\n return record;\n}\n\n/** Expires the bytes of one capture record while keeping the metadata for the audit trail. */\nfunction expirecapturebytes(record: shotrecord): shotrecord {\n const { bytes, ...metadata } = record;\n void bytes;\n return { ...metadata, bytesexpired: true };\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, captureexport, captureformat, capturenaming, captureoptions, cleanuprule, downloadspec, endpointconfig, fieldkind, formprofile, mimefilter, observationmode, policyevaluation, quarantineentry, regionrect, runsettings, safetyverdict, toolstep, transformrule } 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\", \"openlink\", \"openprivate\", \"reloadcache\", \"stopnav\", \"followlink\", \"spanav\", \"rewritequery\", \"setfragment\", \"navlist\", \"navprofile\", \"handleauth\", \"printpdf\", \"prefetch\", \"preconnect\", \"deeplink\", \"reopentab\", \"pausenav\", \"navrate\", \"openclipboard\", \"batchopen\", \"duplicatetab\", \"closepattern\", \"pintab\", \"mutetab\", \"movetab\", \"movetabwindow\", \"grouptabs\", \"colorgroup\", \"collapsegroup\", \"discardtab\", \"reloadtabs\", \"zoomin\", \"zoomout\", \"switchtab\", \"maximizewindow\", \"minimizewindow\", \"restorewindow\", \"focuswindow\", \"scratchwindow\", \"incognitowindow\", \"restoretab\", \"restorelayout\", \"reopenrun\", \"badgetab\", \"fillform\", \"filllabel\", \"fillplaceholder\", \"submitform\", \"retryform\", \"runwizard\", \"selectchain\", \"picktypeahead\", \"pickdate\", \"attachfile\", \"fillcard\", \"fillcode\", \"consentpassword\", \"exportcsv\", \"exportjson\", \"exportexcel\", \"copytable\", \"pushsheets\", \"streamdisk\", \"paginateextract\", \"resumeextract\", \"batchdownload\", \"pausedownload\", \"resumedownload\", \"interceptmime\", \"readclipboard\", \"writeclipboard\", \"copyscreen\", \"quarantinedownload\", \"scanvirus\", \"cleanupartifacts\", \"recordscreen\", \"captureaudio\", \"downloadimages\"]);\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\", \"waitload\", \"waiturl\", \"spawait\", \"detecthttp\", \"readredirects\", \"readfinalurl\", \"trailaudit\", \"navintent\", \"checksafe\", \"querytabs\", \"watchtab\", \"findclones\", \"searchtabs\", \"listaudio\", \"snapshotsession\", \"savelayout\", \"attachmeta\", \"detectfields\", \"generatevalues\", \"saveprofiles\", \"asksubmit\", \"readerrors\", \"skiphoneypot\", \"detectlogin\", \"detecttemplate\", \"handoffcaptcha\", \"scrapetable\", \"importcsv\", \"looprows\", \"transformvalues\", \"deduperows\", \"mergepages\", \"stamplerows\", \"previewgrid\", \"logprovenance\", \"verifydownload\", \"exportnetlog\", \"namecaptures\", \"shotview\", \"shotfullpage\", \"shotelement\", \"shotregion\", \"contactsheet\", \"capturepdf\", \"captureframe\", \"readmedia\", \"readassets\", \"probestream\", \"timelapse\", \"shotcanvas\", \"convertimage\", \"makethumbs\"]);\nconst allowedactions = new Set<actionkind>([...sensitiveactions, ...interactionactions, ...readactions]);\nconst watchactions = new Set<actionkind>([\"watchmutate\", \"watchbanner\", \"watchfocus\", \"watchtab\"]);\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\", \"submitform\", \"retryform\", \"selectchain\", \"picktypeahead\", \"pickdate\", \"attachfile\", \"fillcode\", \"consentpassword\", \"scrapetable\", \"paginateextract\", \"shotelement\", \"captureframe\", \"shotcanvas\"]);\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\", \"followlink\", \"setfragment\", \"handleauth\", \"navintent\", \"openclipboard\", \"checksafe\", \"reopentab\", \"spanav\", \"duplicatetab\", \"pintab\", \"mutetab\", \"movetab\", \"movetabwindow\", \"searchtabs\", \"badgetab\", \"attachmeta\", \"focuswindow\", \"maximizewindow\", \"minimizewindow\", \"restorewindow\", \"incognitowindow\", \"asksubmit\", \"selectchain\", \"picktypeahead\", \"pickdate\", \"attachfile\", \"fillcode\", \"consentpassword\", \"pausedownload\", \"resumedownload\", \"verifydownload\", \"writeclipboard\", \"quarantinedownload\", \"scanvirus\"]);\nconst tabscommandactions = new Set<actionkind>([\"querytabs\", \"duplicatetab\", \"closepattern\", \"pintab\", \"mutetab\", \"movetab\", \"movetabwindow\", \"grouptabs\", \"colorgroup\", \"collapsegroup\", \"discardtab\", \"reloadtabs\", \"zoomin\", \"zoomout\", \"watchtab\", \"switchtab\", \"maximizewindow\", \"minimizewindow\", \"restorewindow\", \"focuswindow\", \"scratchwindow\", \"incognitowindow\", \"restoretab\", \"savelayout\", \"restorelayout\", \"findclones\", \"searchtabs\", \"badgetab\", \"attachmeta\", \"listaudio\", \"reopenrun\", \"snapshotsession\"]);\nconst formactions = new Set<actionkind>([\"fillform\", \"filllabel\", \"fillplaceholder\", \"detectfields\", \"generatevalues\", \"saveprofiles\", \"asksubmit\", \"submitform\", \"readerrors\", \"retryform\", \"runwizard\", \"selectchain\", \"picktypeahead\", \"pickdate\", \"attachfile\", \"handoffcaptcha\", \"fillcard\", \"fillcode\", \"consentpassword\", \"skiphoneypot\", \"detectlogin\", \"detecttemplate\"]);\n/** Extraction, transform, export and provenance kinds of the forms and data part two family. */\nconst datasetactions = new Set<actionkind>([\"scrapetable\", \"exportcsv\", \"exportjson\", \"exportexcel\", \"copytable\", \"pushsheets\", \"importcsv\", \"looprows\", \"transformvalues\", \"deduperows\", \"paginateextract\", \"mergepages\", \"stamplerows\", \"previewgrid\", \"streamdisk\", \"resumeextract\", \"logprovenance\"]);\n/** Export kinds that move extracted data out of local memory to disk, the clipboard or a reviewed sheet endpoint. */\nconst exportactions = new Set<actionkind>([\"exportcsv\", \"exportjson\", \"exportexcel\", \"copytable\", \"pushsheets\", \"streamdisk\"]);\n/** Files, clipboard and downloads kinds of the batch queue, interception, clipboard, quarantine, naming and cleanup family. */\nconst filesactions = new Set<actionkind>([\"batchdownload\", \"pausedownload\", \"resumedownload\", \"verifydownload\", \"interceptmime\", \"exportnetlog\", \"readclipboard\", \"writeclipboard\", \"copyscreen\", \"quarantinedownload\", \"scanvirus\", \"namecaptures\", \"cleanupartifacts\"]);\nconst captureactions = new Set<actionkind>([\"shotview\", \"shotfullpage\", \"shotelement\", \"shotregion\", \"contactsheet\"]);\n/** Media capture part two kinds of the pdf, recording, image, canvas, stream, asset, lapse, conversion and thumbnail family. */\nconst mediaactions = new Set<actionkind>([\"capturepdf\", \"recordscreen\", \"captureaudio\", \"captureframe\", \"downloadimages\", \"shotcanvas\", \"probestream\", \"readmedia\", \"readassets\", \"timelapse\", \"convertimage\", \"makethumbs\"]);\n/** Field kinds the form grammar accepts inside records, profiles and value rules. */\nconst fieldkinds: fieldkind[] = [\"text\", \"email\", \"phone\", \"date\", \"number\", \"select\", \"check\", \"radio\", \"file\", \"password\", \"card\", \"code\"];\nconst layoutmutationactions = new Set<actionkind>([\"grouptabs\", \"colorgroup\", \"collapsegroup\", \"savelayout\", \"restorelayout\"]);\n/** Chromium tab group colors accepted as reviewed group color choices. */\nconst groupcolors = [\"grey\", \"blue\", \"red\", \"yellow\", \"green\", \"pink\", \"purple\", \"cyan\", \"orange\"];\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 if (kind === \"openclipboard\") return \"clipboardRead\";\n if (kind === \"copytable\") return \"clipboardWrite\";\n if (kind === \"batchdownload\" || kind === \"pausedownload\" || kind === \"resumedownload\" || kind === \"verifydownload\" || kind === \"interceptmime\" || kind === \"quarantinedownload\" || kind === \"scanvirus\") return \"downloads\";\n if (kind === \"readclipboard\") return \"clipboardRead\";\n if (kind === \"writeclipboard\" || kind === \"copyscreen\") return \"clipboardWrite\";\n if (kind === \"downloadimages\") return \"downloads\";\n if (kind === \"openlink\" || kind === \"openprivate\" || kind === \"navlist\" || kind === \"batchopen\" || kind === \"reopentab\" || kind === \"deeplink\") return \"tabs\";\n if (tabscommandactions.has(kind)) return \"tabs\";\n return undefined;\n}\n\n/** True when the kind commands tabs or windows beyond the active tab and needs the optional tabs capability. */\nexport function istabscommandkind(kind: actionkind): boolean {\n return tabscommandactions.has(kind);\n}\n\n/** True when the kind mutates tab groups or layouts and therefore stays inside the active session. */\nexport function islayoutkind(kind: actionkind): boolean {\n return layoutmutationactions.has(kind);\n}\n\n/** True when the kind belongs to the forms and data family. */\nexport function isformkind(kind: actionkind): boolean {\n return formactions.has(kind);\n}\n\n/** True when the kind belongs to the extraction, transform, export and provenance family. */\nexport function isdatasetkind(kind: actionkind): boolean {\n return datasetactions.has(kind);\n}\n\n/** True when the kind exports extracted data out of local memory to disk, the clipboard or a reviewed sheet endpoint. */\nexport function isexportkind(kind: actionkind): boolean {\n return exportactions.has(kind);\n}\n\n/** True when the kind belongs to the files, clipboard and downloads family. */\nexport function isfileskind(kind: actionkind): boolean {\n return filesactions.has(kind);\n}\n\n/** True when the kind belongs to the media capture family of viewport, full page, element, region and contact sheet shots. */\nexport function iscapturekind(kind: actionkind): boolean {\n return captureactions.has(kind);\n}\n\n/** Requires the active tab grant of the live session before any capture kind runs: the session tab and origin must match and the origin grant must cover the active origin. */\nexport function capturegate(session: agentsession | undefined, tabid: number, origin: string, now: number): policyevaluation {\n if (!session || session.stoppedat) return { allowed: false, reason: \"No active browser session exists for the capture.\" };\n if (session.expiresat <= now) return { allowed: false, reason: \"The browser session has expired and cannot capture.\" };\n if (session.pausedat) return { allowed: false, reason: \"The browser session is paused and cannot capture.\" };\n if (session.tabid !== tabid) return { allowed: false, reason: `The capture needs the active tab grant of session tab ${session.tabid} and refuses tab ${tabid}.` };\n if (!origingranted(session, origin)) return { allowed: false, reason: `The capture of ${origin} needs the session origin grants first.` };\n return { allowed: true };\n}\n\n/** Validates one reviewed capture options payload: format inside the png, jpeg and webp set, quality bounded only by the format range, pixel ratio from one up with no code ceiling, and a known export target. */\nexport function validatecaptureoptions(value: unknown): policyevaluation {\n if (value === undefined) return { allowed: true };\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"The reviewed capture options must be an object in options.capture.\" };\n const options = value as Record<string, unknown>;\n if (options.format !== undefined && options.format !== \"png\" && options.format !== \"jpeg\" && options.format !== \"webp\") return { allowed: false, reason: \"The reviewed capture format must be png, jpeg or webp.\" };\n if (options.quality !== undefined && (typeof options.quality !== \"number\" || !Number.isFinite(options.quality) || options.quality < 0 || options.quality > 100)) return { allowed: false, reason: \"The reviewed capture quality must stay between zero and one hundred; any value in that range is the user choice with no code cap.\" };\n if (options.pixelratio !== undefined && (typeof options.pixelratio !== \"number\" || !Number.isFinite(options.pixelratio) || options.pixelratio < 1)) return { allowed: false, reason: \"The reviewed pixel ratio starts at one and climbs to any user configured ceiling with no code ceiling.\" };\n if (options.annotate !== undefined && typeof options.annotate !== \"boolean\") return { allowed: false, reason: \"The reviewed capture annotation flag must be a boolean.\" };\n if (options.exporttarget !== undefined && options.exporttarget !== \"memory\" && options.exporttarget !== \"download\" && options.exporttarget !== \"clipboard\") return { allowed: false, reason: \"The reviewed capture export target must be memory, download or clipboard.\" };\n return { allowed: true };\n}\n\n/** Validates one reviewed region rectangle in css pixels; negative coordinates and non positive sizes are refused. */\nexport function validateregionrect(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed regionrect with x, y, width and height in css pixels is required in options.\" };\n const rect = value as Record<string, unknown>;\n for (const field of [\"x\", \"y\", \"width\", \"height\"]) {\n if (typeof rect[field] !== \"number\" || !Number.isFinite(rect[field] as number)) return { allowed: false, reason: `The reviewed regionrect needs a numeric ${field} in css pixels.` };\n }\n if ((rect.x as number) < 0 || (rect.y as number) < 0) return { allowed: false, reason: \"The reviewed regionrect refuses negative coordinates.\" };\n if ((rect.width as number) <= 0 || (rect.height as number) <= 0) return { allowed: false, reason: \"The reviewed regionrect needs positive width and height values.\" };\n return { allowed: true };\n}\n\n/** Validates one reviewed capture naming rule against the allowed segment set: run, step, sequence and kind flags only. */\nexport function validatecapturenaming(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed capturenaming rule with run, step, sequence and kind flags is required.\" };\n const rule = value as Record<string, unknown>;\n const segments = [\"run\", \"step\", \"sequence\", \"kind\"];\n for (const key of Object.keys(rule)) {\n if (!segments.includes(key)) return { allowed: false, reason: `The reviewed capturenaming rule refuses the unknown ${key} segment; only run, step, sequence and kind participate.` };\n }\n for (const segment of segments) {\n if (rule[segment] !== undefined && typeof rule[segment] !== \"boolean\") return { allowed: false, reason: `The reviewed capturenaming ${segment} flag must be a boolean.` };\n }\n if (!segments.some(segment => rule[segment] === true)) return { allowed: false, reason: \"The reviewed capturenaming rule needs at least one enabled segment of run, step, sequence and kind.\" };\n return { allowed: true };\n}\n\n/** Routes the capture export target: memory stays local, clipboard needs the clipboardwrite grant and disk writes only run through the reviewed download flow. */\nexport function captureexportgranted(target: captureexport | undefined): policyevaluation {\n if (target === undefined || target === \"memory\") return { allowed: true };\n if (target === \"clipboard\") return { allowed: true, reason: \"The clipboard capture export runs behind the optional clipboardwrite capability, negotiated through the permissions api before the copy.\" };\n if (target === \"download\") return { allowed: true, reason: \"The download capture export runs only through the reviewed download flow behind the optional downloads capability.\" };\n return { allowed: false, reason: \"The capture export target must be memory, download or clipboard; no other disk route exists.\" };\n}\n\n/** Keeps the stitching scroll budget inside the reviewed wait window: the settle windows of every tile must fit the reviewed wait window with no code ceiling on either side. */\nexport function stitchbudgetallowed(tiles: number, settle: number, wait: number): policyevaluation {\n if (tiles <= 0) return { allowed: false, reason: \"The stitch budget needs at least one tile.\" };\n if (settle < 0 || wait < 0) return { allowed: false, reason: \"The reviewed settle and wait windows must be zero or positive milliseconds.\" };\n if (tiles * settle > wait) return { allowed: false, reason: `The stitching scroll budget of ${tiles} tiles at ${settle} milliseconds exceeds the reviewed wait window of ${wait} milliseconds; review a wider window or a smaller settle.` };\n return { allowed: true };\n}\n\n/** Allows beforeafter state capture to wrap any existing action kind except the capture kinds themselves; pixel evidence around sensitive actions grades as reviewable evidence. */\nexport function beforeafterwrapallowed(kind: actionkind): boolean {\n return allowedactions.has(kind) && !captureactions.has(kind);\n}\n\n/** Exposes the capture retention window as a user configured choice; an absent value keeps every capture byte forever with no code ceiling. */\nexport function captureretentionwindow(settings: runsettings | undefined): number | undefined {\n return settings?.captureretention;\n}\n\n/** Validates the reviewed media capture parameter grammar; pixel ratios, quality values, cell counts and retention windows stay user choices with no code ceilings. */\nfunction validatecapturegrammar(step: toolstep, options: Record<string, unknown>): policyevaluation {\n const kind = step.kind;\n const optioncheck = validatecaptureoptions(options.capture);\n if (!optioncheck.allowed) return optioncheck;\n if (options.settle !== undefined && (typeof options.settle !== \"number\" || !Number.isFinite(options.settle) || options.settle < 0)) return { allowed: false, reason: \"The reviewed capture settle window must be zero or a positive number of milliseconds.\" };\n if (options.overlap !== undefined && (typeof options.overlap !== \"number\" || !Number.isInteger(options.overlap) || options.overlap < 0)) return { allowed: false, reason: \"The reviewed stitch overlap must be zero or a positive number of rows.\" };\n if (options.wait !== undefined && (typeof options.wait !== \"number\" || !Number.isFinite(options.wait) || options.wait < 0)) return { allowed: false, reason: \"The reviewed capture wait window must be zero or a positive number of milliseconds.\" };\n if (options.naming !== undefined) {\n const namingcheck = validatecapturenaming(options.naming);\n if (!namingcheck.allowed) return namingcheck;\n }\n if (kind === \"shotregion\") {\n const rectcheck = validateregionrect(options.regionrect);\n if (!rectcheck.allowed) return rectcheck;\n if (options.reviewed !== true) return { allowed: false, reason: \"Every reviewed regionrect needs the explicit reviewed flag before shotregion runs.\" };\n if (options.container !== undefined && !isnonempty(options.container)) return { allowed: false, reason: \"The reviewed scrollable container selector must be a non-empty string.\" };\n if (options.steps !== undefined && (typeof options.steps !== \"number\" || !Number.isInteger(options.steps) || options.steps < 1)) return { allowed: false, reason: \"The reviewed container scroll steps must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"contactsheet\") {\n const elements = options.elements;\n if (!Array.isArray(elements) || elements.length === 0 || !elements.every(item => isnonempty(item))) return { allowed: false, reason: \"A reviewed non-empty list of element selectors is required in options for the contact sheet; the cell count stays the user choice.\" };\n const layout = options.sheet;\n if (layout !== undefined) {\n if (!layout || typeof layout !== \"object\" || Array.isArray(layout)) return { allowed: false, reason: \"The reviewed sheetlayout must be an object with cellsize, columns and label.\" };\n const sheet = layout as Record<string, unknown>;\n if (typeof sheet.cellsize !== \"number\" || !Number.isFinite(sheet.cellsize) || sheet.cellsize <= 0) return { allowed: false, reason: \"The reviewed contact sheet cell size must be a positive number of pixels.\" };\n if (typeof sheet.columns !== \"number\" || !Number.isInteger(sheet.columns) || sheet.columns < 1) return { allowed: false, reason: \"The reviewed contact sheet column count must be a positive integer with no code ceiling.\" };\n if (sheet.label !== undefined && sheet.label !== \"none\" && sheet.label !== \"index\" && sheet.label !== \"selector\" && sheet.label !== \"both\") return { allowed: false, reason: \"The reviewed contact sheet label style must be none, index, selector or both.\" };\n }\n }\n return { allowed: true };\n}\n\n/** Refuses any export that would leave local memory while the session origin grants do not cover the active origin. */\nexport function exportgranted(session: agentsession | undefined, origin: string): policyevaluation {\n if (!origingranted(session, origin)) return { allowed: false, reason: `The export of extracted data from ${origin} needs the session origin grants before it leaves local memory.` };\n return { allowed: true };\n}\n\n/** Validates the reviewed fieldmatch grammar of one form field entry. */\nexport function validatefieldmatch(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed field match is required in options.\" };\n const match = value as Record<string, unknown>;\n if (match.mode !== \"label\" && match.mode !== \"placeholder\" && match.mode !== \"arialabel\" && match.mode !== \"name\") return { allowed: false, reason: \"The reviewed field match mode must be label, placeholder, arialabel or name.\" };\n const key = match.mode === \"label\" ? \"label\" : match.mode === \"placeholder\" ? \"placeholder\" : match.mode === \"arialabel\" ? \"arialabel\" : \"name\";\n if (!isnonempty(match[key])) return { allowed: false, reason: `The reviewed ${match.mode} field match needs a non-empty ${key}.` };\n return { allowed: true };\n}\n\n/** Validates a reviewed structured form record; password entries are refused because passwords need the explicit consentpassword consent. */\nexport function validateformrecord(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed form record with entries is required in options.\" };\n const record = value as Record<string, unknown>;\n if (record.form !== undefined && !isnonempty(record.form)) return { allowed: false, reason: \"The reviewed form record form selector must be a non-empty string.\" };\n if (!Array.isArray(record.entries) || record.entries.length === 0) return { allowed: false, reason: \"The reviewed form record needs a non-empty list of entries.\" };\n for (const item of record.entries) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return { allowed: false, reason: \"Every reviewed form record entry must be an object.\" };\n const entry = item as Record<string, unknown>;\n const matchcheck = validatefieldmatch(entry.match);\n if (!matchcheck.allowed) return matchcheck;\n if (typeof entry.kind !== \"string\" || !fieldkinds.includes(entry.kind as fieldkind)) return { allowed: false, reason: \"Every reviewed form record entry needs a known field kind.\" };\n if (typeof entry.value !== \"string\") return { allowed: false, reason: \"Every reviewed form record entry needs a string value.\" };\n if (entry.kind === \"password\") return { allowed: false, reason: \"Password entries are refused inside form records; use consentpassword with a reviewed consent ref.\" };\n }\n return { allowed: true };\n}\n\n/** Validates the reviewed valuegen grammar of a generatevalues step. */\nexport function validatevaluegen(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed valuegen rule with a field kind is required in options.\" };\n const rule = value as Record<string, unknown>;\n if (typeof rule.kind !== \"string\" || !fieldkinds.includes(rule.kind as fieldkind)) return { allowed: false, reason: \"The reviewed valuegen kind must be a known field kind.\" };\n if (rule.locale !== undefined && !isnonempty(rule.locale)) return { allowed: false, reason: \"The reviewed valuegen locale must be a non-empty string.\" };\n if (rule.seed !== undefined && (typeof rule.seed !== \"number\" || !Number.isFinite(rule.seed))) return { allowed: false, reason: \"The reviewed valuegen seed must be a finite number.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed list of label or placeholder value pairs for filllabel and fillplaceholder steps. */\nfunction validatefieldpairs(options: Record<string, unknown>, mode: \"label\" | \"placeholder\"): policyevaluation {\n const pairs = options.fields;\n if (!Array.isArray(pairs) || pairs.length === 0) return { allowed: false, reason: \"A reviewed non-empty list of field pairs is required in options.\" };\n for (const item of pairs) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return { allowed: false, reason: \"Every reviewed field pair must be an object.\" };\n const pair = item as Record<string, unknown>;\n if (!isnonempty(pair[mode])) return { allowed: false, reason: `Every reviewed field pair needs a non-empty ${mode}.` };\n if (typeof pair.value !== \"string\" || !pair.value.trim()) return { allowed: false, reason: \"Every reviewed field pair needs a non-empty value.\" };\n }\n return { allowed: true };\n}\n\n/** Validates the reviewed card segment grammar of a fillcard step. */\nfunction validatecardsegments(value: unknown): policyevaluation {\n if (!Array.isArray(value) || value.length === 0) return { allowed: false, reason: \"A reviewed non-empty list of card segments is required in options.\" };\n for (const item of value) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return { allowed: false, reason: \"Every reviewed card segment must be an object.\" };\n const segment = item as Record<string, unknown>;\n const matchcheck = validatefieldmatch(segment.match);\n if (!matchcheck.allowed) return matchcheck;\n if (typeof segment.value !== \"string\" || !segment.value.trim()) return { allowed: false, reason: \"Every reviewed card segment needs a non-empty value.\" };\n }\n return { allowed: true };\n}\n\n/** Validates the reviewed forms and data parameter grammar of the form family. */\nfunction validateformgrammar(step: toolstep, options: Record<string, unknown>): policyevaluation {\n const kind = step.kind;\n if (kind === \"fillform\" || (kind === \"saveprofiles\" && options.formrecord !== undefined)) {\n const recordcheck = validateformrecord(options.formrecord);\n if (!recordcheck.allowed) return recordcheck;\n }\n if (kind === \"filllabel\" || kind === \"fillplaceholder\") {\n const paircheck = validatefieldpairs(options, kind === \"filllabel\" ? \"label\" : \"placeholder\");\n if (!paircheck.allowed) return paircheck;\n }\n if (kind === \"generatevalues\" && options.valuegen !== undefined) {\n const rulecheck = validatevaluegen(options.valuegen);\n if (!rulecheck.allowed) return rulecheck;\n }\n if (kind === \"saveprofiles\" && !isnonempty(options.name)) return { allowed: false, reason: \"A reviewed profile name is required in options.\" };\n if (kind === \"submitform\" && !isnonempty(options.consentref)) return { allowed: false, reason: \"A reviewed consent ref of an approved asksubmit ticket is required in options.\" };\n if (kind === \"retryform\") {\n const backoff = options.backoff;\n if (!backoff || typeof backoff !== \"object\" || Array.isArray(backoff)) return { allowed: false, reason: \"A reviewed backoff rule with wait and factor is required in options.\" };\n const rule = backoff as Record<string, unknown>;\n if (typeof rule.wait !== \"number\" || !Number.isFinite(rule.wait) || rule.wait <= 0) return { allowed: false, reason: \"The reviewed retry backoff wait must be a positive number of milliseconds with no code ceiling.\" };\n if (typeof rule.factor !== \"number\" || !Number.isFinite(rule.factor) || rule.factor < 1) return { allowed: false, reason: \"The reviewed retry backoff factor must be one or greater with no code ceiling.\" };\n if (options.attempts !== undefined && (typeof options.attempts !== \"number\" || !Number.isInteger(options.attempts) || options.attempts < 1)) return { allowed: false, reason: \"The reviewed retry attempts must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"runwizard\" && options.steps !== undefined && (typeof options.steps !== \"number\" || !Number.isInteger(options.steps) || options.steps < 1)) return { allowed: false, reason: \"The reviewed wizard step count must be a positive integer with no code ceiling.\" };\n if (kind === \"selectchain\") {\n if (!isnonempty(options.child)) return { allowed: false, reason: \"A reviewed child selector of the dependent control is required in options.\" };\n if (!nonnegativeoption(options, \"wait\")) return { allowed: false, reason: \"The reviewed dependent wait must be zero or a positive number of milliseconds.\" };\n }\n if (kind === \"picktypeahead\") {\n if (!isnonempty(options.pick)) return { allowed: false, reason: \"A reviewed suggestion entry to pick is required in options.\" };\n if (!nonnegativeoption(options, \"timeout\")) return { allowed: false, reason: \"The reviewed typeahead timeout must be zero or a positive number of milliseconds.\" };\n }\n if (kind === \"pickdate\" && !/^\\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 (kind === \"fillcard\") {\n const segmentcheck = validatecardsegments(options.segments);\n if (!segmentcheck.allowed) return segmentcheck;\n if (!nonnegativeoption(options, \"pause\")) return { allowed: false, reason: \"The reviewed card typing pause must be zero or a positive number of milliseconds.\" };\n }\n if (kind === \"fillcode\" && !isnonempty(options.source)) return { allowed: false, reason: \"A reviewed one time code source is required in options.\" };\n if (kind === \"consentpassword\" && !isnonempty(options.consentref)) return { allowed: false, reason: \"A reviewed consent ref is required in options before any password is filled.\" };\n return { allowed: true };\n}\n\n/** Validates one reviewed transform rule: a supported expression, source columns and a target column. */\nexport function validatetransformrule(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed transform rule with an expression, sources and a target is required in options.\" };\n const rule = value as Record<string, unknown>;\n const expression = rule.expression;\n if (typeof expression !== \"string\" || !/^(trim|upper|lower|number|prefix|suffix|replace)(?::.+)?$/.test(expression)) return { allowed: false, reason: \"The reviewed transform expression must be trim, upper, lower, number, prefix, suffix or replace with an optional argument.\" };\n if (expression.startsWith(\"replace\") && !expression.slice(\"replace\".length).includes(\"=>\")) return { allowed: false, reason: \"The reviewed replace expression needs the from=>to separator.\" };\n if (expression.startsWith(\"replace\") && expression.slice(\"replace:\".length).split(\"=>\")[0] === \"\") return { allowed: false, reason: \"The reviewed replace expression needs a non-empty from part.\" };\n if (!Array.isArray(rule.sources) || rule.sources.length === 0 || !rule.sources.every(source => isnonempty(source))) return { allowed: false, reason: \"Every reviewed transform rule needs a non-empty list of source columns.\" };\n if (!isnonempty(rule.target)) return { allowed: false, reason: \"Every reviewed transform rule needs a non-empty target column.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed dataset id list in options. */\nfunction validatedatasetids(options: Record<string, unknown>, key: string): policyevaluation {\n const ids = options[key];\n if (!Array.isArray(ids) || ids.length === 0 || !ids.every(id => isnonempty(id))) return { allowed: false, reason: `A reviewed non-empty list of dataset ids is required in options as ${key}.` };\n return { allowed: true };\n}\n\n/** Validates the reviewed extraction, transform, export and provenance parameter grammar of the data family. */\nfunction validatedatagrammar(step: toolstep, options: Record<string, unknown>, origin: string): policyevaluation {\n const kind = step.kind;\n if (kind === \"scrapetable\") {\n if (options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed dataset name must be a non-empty string.\" };\n if (options.rowlimit !== undefined && (typeof options.rowlimit !== \"number\" || !Number.isInteger(options.rowlimit) || options.rowlimit < 1)) return { allowed: false, reason: \"The reviewed row limit must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"paginateextract\") {\n if (!isnonempty(options.next)) return { allowed: false, reason: \"A reviewed next control selector is required in options.\" };\n if (options.pages !== undefined && (typeof options.pages !== \"number\" || !Number.isInteger(options.pages) || options.pages < 1)) return { allowed: false, reason: \"The reviewed page count must be a positive integer with no code ceiling.\" };\n if (!nonnegativeoption(options, \"wait\")) return { allowed: false, reason: \"The reviewed row freshness wait must be zero or a positive number of milliseconds.\" };\n }\n if (kind === \"exportcsv\" || kind === \"exportjson\" || kind === \"exportexcel\" || kind === \"copytable\" || kind === \"streamdisk\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed artifact name must be a non-empty string.\" };\n }\n if (kind === \"exportcsv\" && options.delimiter !== undefined && (typeof options.delimiter !== \"string\" || options.delimiter.length !== 1)) return { allowed: false, reason: \"The reviewed csv delimiter must be a single character.\" };\n if (kind === \"streamdisk\" && (typeof options.chunk !== \"number\" || !Number.isInteger(options.chunk) || options.chunk < 1)) return { allowed: false, reason: \"The reviewed streaming chunk size must be a positive integer with no code ceiling.\" };\n if (kind === \"pushsheets\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (!isnonempty(options.sheet)) return { allowed: false, reason: \"A reviewed sheet endpoint url is required in options.\" };\n if (!ishttpsurl(options.sheet)) return { allowed: false, reason: \"The reviewed sheet endpoint url must use HTTPS.\" };\n if (options.reviewed !== true) return { allowed: false, reason: \"The sheet push needs the explicit reviewed flag before any data leaves local memory.\" };\n }\n if (kind === \"importcsv\") {\n if (typeof options.csv !== \"string\" || !options.csv.trim()) return { allowed: false, reason: \"Reviewed csv content is required in options.\" };\n if (options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed dataset name must be a non-empty string.\" };\n if (options.mapping !== undefined) {\n const mapping = options.mapping;\n if (!mapping || typeof mapping !== \"object\" || Array.isArray(mapping) || !Object.values(mapping).every(item => typeof item === \"string\")) return { allowed: false, reason: \"The reviewed csv column mapping must be an object of string values.\" };\n }\n }\n if (kind === \"looprows\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (options.variable !== undefined && !isnonempty(options.variable)) return { allowed: false, reason: \"The reviewed row variable name must be a non-empty string.\" };\n const inner = validateinnerstep(options, origin);\n if (!inner.allowed) return inner;\n }\n if (kind === \"transformvalues\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n const rules = options.rules;\n if (!Array.isArray(rules) || rules.length === 0) return { allowed: false, reason: \"A reviewed non-empty list of transform rules is required in options.\" };\n for (const item of rules) {\n const rulecheck = validatetransformrule(item);\n if (!rulecheck.allowed) return rulecheck;\n }\n }\n if (kind === \"deduperows\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n const keys = options.keys;\n if (!Array.isArray(keys) || keys.length === 0 || !keys.every(key => isnonempty(key))) return { allowed: false, reason: \"A reviewed non-empty list of dedupe column keys is required in options.\" };\n }\n if (kind === \"mergepages\") {\n const listcheck = validatedatasetids(options, \"datasets\");\n if (!listcheck.allowed) return listcheck;\n }\n if (kind === \"stamplerows\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (options.url !== undefined && !ishttpsurl(options.url)) return { allowed: false, reason: \"The reviewed source url must use HTTPS.\" };\n }\n if (kind === \"previewgrid\") {\n if (!isnonempty(options.dataset)) return { allowed: false, reason: \"A reviewed dataset id is required in options.\" };\n if (options.sample !== undefined && (typeof options.sample !== \"number\" || !Number.isInteger(options.sample) || options.sample < 1)) return { allowed: false, reason: \"The reviewed sample row count must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"resumeextract\" && !isnonempty(options.session)) return { allowed: false, reason: \"A reviewed extract session id is required in options.\" };\n if (kind === \"logprovenance\" && !isnonempty(options.artifact)) return { allowed: false, reason: \"A reviewed artifact id or name is required in options.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed batch download specification: a non-empty HTTPS url list, an optional filename rule and an optional completion criterion. */\nexport function validatedownloadspec(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed downloadspec with a url list is required in options.\" };\n const spec = value as Record<string, unknown>;\n if (!Array.isArray(spec.urls) || spec.urls.length === 0 || !spec.urls.every(url => ishttpsurl(url))) return { allowed: false, reason: \"The reviewed downloadspec needs a non-empty list of HTTPS urls.\" };\n if (spec.filename !== undefined && !isnonempty(spec.filename)) return { allowed: false, reason: \"The reviewed downloadspec filename rule must be a non-empty string.\" };\n if (spec.complete !== undefined && spec.complete !== \"size\" && spec.complete !== \"checksum\") return { allowed: false, reason: \"The reviewed downloadspec completion criterion must be size or checksum.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed mime interception filter: include and exclude patterns plus the deny default for unlisted mime types. */\nexport function validatemimefilter(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed mimefilter with include and exclude patterns is required in options.\" };\n const filter = value as Record<string, unknown>;\n if (!Array.isArray(filter.include) || filter.include.length === 0 || !filter.include.every(pattern => isnonempty(pattern))) return { allowed: false, reason: \"The reviewed mimefilter needs a non-empty list of include patterns.\" };\n if (filter.exclude !== undefined && (!Array.isArray(filter.exclude) || !filter.exclude.every(pattern => isnonempty(pattern)))) return { allowed: false, reason: \"The reviewed mimefilter exclude patterns must be a list of non-empty strings.\" };\n if (filter.default !== \"deny\" && filter.default !== \"allow\") return { allowed: false, reason: \"The reviewed mimefilter needs the deny or allow default for unlisted mime types.\" };\n return { allowed: true };\n}\n\n/** Validates one reviewed cleanup rule: a positive age window with no code ceiling, an artifact kind and a keep policy. */\nexport function validatecleanuprule(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed cleanuprule with an age, a kind and a keep policy is required.\" };\n const rule = value as Record<string, unknown>;\n if (typeof rule.age !== \"number\" || !Number.isFinite(rule.age) || rule.age <= 0) return { allowed: false, reason: \"The reviewed cleanup age window must be a positive number of milliseconds with no code ceiling.\" };\n if (!isnonempty(rule.kind)) return { allowed: false, reason: \"The reviewed cleanup rule needs a non-empty artifact kind, or any to match every kind.\" };\n if (rule.keep !== \"none\" && rule.keep !== \"latest\" && rule.keep !== \"all\") return { allowed: false, reason: \"The reviewed cleanup keep policy must be none, latest or all.\" };\n return { allowed: true };\n}\n\n/** Validates the reviewed files, clipboard and downloads parameter grammar; batch sizes, concurrent windows and cleanup ages stay user configured with no code ceilings. */\nfunction validatefilesgrammar(step: toolstep, options: Record<string, unknown>): policyevaluation {\n const kind = step.kind;\n if (kind === \"batchdownload\") {\n const speccheck = validatedownloadspec(options.downloadspec);\n if (!speccheck.allowed) return speccheck;\n if (options.concurrent !== undefined && (typeof options.concurrent !== \"number\" || !Number.isInteger(options.concurrent) || options.concurrent < 1)) return { allowed: false, reason: \"The reviewed concurrent download window must be a positive integer with no code ceiling.\" };\n }\n if (kind === \"pausedownload\" || kind === \"resumedownload\" || kind === \"verifydownload\" || kind === \"quarantinedownload\" || kind === \"scanvirus\") {\n if (!isnonempty(step.value)) return { allowed: false, reason: \"A reviewed download or quarantine reference is required.\" };\n if (kind === \"verifydownload\") {\n if (options.checksum !== undefined && !isnonempty(options.checksum)) return { allowed: false, reason: \"The reviewed expected checksum must be a non-empty string.\" };\n if (options.bytes !== undefined && (typeof options.bytes !== \"number\" || !Number.isFinite(options.bytes) || options.bytes < 0)) return { allowed: false, reason: \"The reviewed expected size must be zero or a positive number of bytes.\" };\n }\n if (kind === \"scanvirus\" && options.scanner !== undefined && !isnonempty(options.scanner)) return { allowed: false, reason: \"The reviewed scanner name must be a non-empty string.\" };\n if (kind === \"quarantinedownload\" && options.reason !== undefined && !isnonempty(options.reason)) return { allowed: false, reason: \"The reviewed quarantine reason must be a non-empty string.\" };\n }\n if (kind === \"interceptmime\") {\n const filtercheck = validatemimefilter(options.mimefilter);\n if (!filtercheck.allowed) return filtercheck;\n }\n if (kind === \"readclipboard\") {\n if (!isnonempty(options.consentref)) return { allowed: false, reason: \"A clipboard read requires a reviewed consent ref of an approved consent prompt in options.\" };\n if (options.prompt !== undefined && !isnonempty(options.prompt)) return { allowed: false, reason: \"The reviewed clipboard consent prompt must be a non-empty string.\" };\n }\n if (kind === \"exportnetlog\" && options.stepid !== undefined && !isnonempty(options.stepid)) return { allowed: false, reason: \"The reviewed netlog step filter must be a non-empty step id.\" };\n if (kind === \"namecaptures\") {\n if (!isnonempty(options.task)) return { allowed: false, reason: \"A reviewed task id is required in options for capture naming.\" };\n if (options.steps !== undefined && (!Array.isArray(options.steps) || options.steps.length === 0 || !options.steps.every(item => isnonempty(item)))) return { allowed: false, reason: \"The reviewed capture steps must be a non-empty list of step ids when present.\" };\n if (options.extension !== undefined && !isnonempty(options.extension)) return { allowed: false, reason: \"The reviewed capture extension must be a non-empty string.\" };\n }\n if (kind === \"cleanupartifacts\" && options.rules !== undefined) {\n const rules = options.rules;\n if (!Array.isArray(rules) || rules.length === 0) return { allowed: false, reason: \"The reviewed cleanup rules must be a non-empty list when present.\" };\n for (const item of rules) {\n const rulecheck = validatecleanuprule(item);\n if (!rulecheck.allowed) return rulecheck;\n }\n }\n return { allowed: true };\n}\n\n/** Requires an approved consent prompt before any clipboard read; every read consumes its own prompt. */\nexport function clipboardconsentgranted(step: toolstep): policyevaluation {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const consentref = options.consentref;\n if (typeof consentref !== \"string\" || !consentref.trim()) return { allowed: false, reason: \"A clipboard read requires a reviewed consent ref in options.\" };\n return { allowed: true };\n}\n\n/** Refuses to release any quarantined file before a clean scan verdict exists. */\nexport function quarantinereleasegranted(entry: quarantineentry): policyevaluation {\n if (entry.scan !== \"clean\") return { allowed: false, reason: `The quarantined file ${entry.path} cannot leave quarantine with the ${entry.scan} scan verdict; only a clean verdict releases it.` };\n return { allowed: true };\n}\n\n/** Refuses downloads and download interception that fall outside the session origin grants. */\nexport function downloadgranted(session: agentsession | undefined, url: string): policyevaluation {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { return { allowed: false, reason: \"The reviewed download URL is invalid.\" }; }\n if (!origingranted(session, origin)) return { allowed: false, reason: `The download from ${origin} leaves the session origin grants and needs a session grant first.` };\n return { allowed: true };\n}\n\n/** Masks a clipboard payload for every log line; the full text never persists anywhere. */\nexport function maskclipboard(payload: string): string {\n return `[clipboard payload of ${payload.length} character${payload.length === 1 ? \"\" : \"s\"}]`;\n}\n\n/** Requires an asksubmit review step before every form submission step. */\nexport function submitreviewgranted(steps: toolstep[], submitid: string): policyevaluation {\n const position = steps.findIndex(candidate => candidate.id === submitid);\n const asked = steps.some((candidate, index) => candidate.kind === \"asksubmit\" && (position === -1 || index < position));\n return asked ? { allowed: true } : { allowed: false, reason: \"Form submission requires an asksubmit review step before it.\" };\n}\n\n/** Requires a reviewed consent ref before any password field is filled. */\nexport function passwordconsentgranted(step: toolstep): policyevaluation {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const consentref = options.consentref;\n if (typeof consentref !== \"string\" || !consentref.trim()) return { allowed: false, reason: \"A password fill requires a reviewed consent ref in options.\" };\n return { allowed: true };\n}\n\n/** True when a numeric value passes the Luhn checksum used by card networks. */\nfunction luhnvalid(digits: string): boolean {\n let sum = 0;\n let double = false;\n for (let index = digits.length - 1; index >= 0; index -= 1) {\n let value = Number.parseInt(digits[index] ?? \"\", 10);\n if (!Number.isFinite(value)) return false;\n if (double) { value *= 2; if (value > 9) value -= 9; }\n sum += value;\n double = !double;\n }\n return sum % 10 === 0;\n}\n\n/** Refuses generated values that look like real card numbers or personal identifiers; test prefixed card values stay allowed. */\nexport function generatedvalueallowed(value: string): policyevaluation {\n const compact = value.replace(/[\\s-]/g, \"\");\n if (/^\\d{13,19}$/.test(compact) && luhnvalid(compact) && !compact.startsWith(\"4111\")) return { allowed: false, reason: \"The generated value looks like a real card number and is refused; generated card values use the 4111 test prefix.\" };\n if (/^\\d{3}-\\d{2}-\\d{4}$/.test(value.trim())) return { allowed: false, reason: \"The generated value looks like a personal identifier and is refused.\" };\n return { allowed: true };\n}\n\n/** Requires the origin grants of a saved profile to cover the origin before its values fill a page. */\nexport function profilegrantgranted(profile: formprofile, origin: string): policyevaluation {\n if (!profile.grants.includes(origin)) return { allowed: false, reason: `The saved profile ${profile.name} is not granted to ${origin}; add the origin to the profile grants first.` };\n return { allowed: true };\n}\n\n/** Restricts group and layout mutations to the active session: they refuse without a live session. */\nexport function layoutmutationgranted(session: agentsession | undefined, now: number): policyevaluation {\n if (!session || session.stoppedat || session.expiresat <= now) return { allowed: false, reason: \"Group and layout mutations stay inside the active session.\" };\n return { allowed: true };\n}\n\n/** Requires explicit review before closing a window that holds more than one task tab. */\nexport function windowclosegate(tasktabcount: number, reviewed: boolean): policyevaluation {\n if (tasktabcount > 1 && !reviewed) return { allowed: false, reason: `The window holds ${tasktabcount} task tabs and needs explicit review before it closes.` };\n return { allowed: true };\n}\n\n/** Reads the user configured concurrent task tab ceiling; an absent value never refuses a tab. */\nexport function tasktabceiling(settings: runsettings | undefined): number | undefined {\n const ceiling = settings?.tasktabceiling;\n return typeof ceiling === \"number\" && Number.isFinite(ceiling) && ceiling >= 0 ? ceiling : 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/** Decides whether an unreviewed origin may open: the session grants cover it or a safe checksafe verdict vouches for it. */\nexport function originverified(url: string, grants: string[], verdicts: safetyverdict[]): policyevaluation {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { return { allowed: false, reason: \"The reviewed navigation URL is invalid.\" }; }\n if (grants.includes(origin)) return { allowed: true };\n const covered = verdicts.find(verdict => verdict.safe && (verdict.url === url || (safeorigin(verdict.url) === origin)));\n if (covered) return { allowed: true };\n return { allowed: false, reason: `The origin ${origin} is outside the session grants and has no safe checksafe verdict; run checksafe and review it first.` };\n}\n\nfunction safeorigin(url: string): string {\n try { return new URL(url).origin; } catch { return \"\"; }\n}\n\n/** Refuses navigation that would move a granted task tab outside the session origin grants until the user consents. */\nexport function navigationgranted(session: agentsession | undefined, url: string): policyevaluation {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { return { allowed: false, reason: \"The reviewed navigation URL is invalid.\" }; }\n if (origingranted(session, origin)) return { allowed: true };\n return { allowed: false, reason: `Navigation to ${origin} leaves the task tab origins and needs the user consent of a session grant first.` };\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\" || kind === \"looprows\") 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/** True when a reviewed https url parses. */\nfunction ishttpsurl(value: unknown): value is string {\n if (typeof value !== \"string\" || !value.trim()) return false;\n try { return new URL(value).protocol === \"https:\"; } catch { return false; }\n}\n\n/** Validates the reviewed navtarget grammar of a navigation step. */\nfunction validatenavtarget(value: unknown, kind: string): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed navtarget with a url is required in options.\" };\n const target = value as Record<string, unknown>;\n if (!ishttpsurl(target.url)) return { allowed: false, reason: \"The reviewed navtarget url must use HTTPS.\" };\n const container = target.container ?? \"tab\";\n if (container !== \"current\" && container !== \"tab\" && container !== \"window\" && container !== \"private\") return { allowed: false, reason: \"The reviewed navtarget container must be current, tab, window or private.\" };\n if (target.position !== undefined && target.position !== \"adjacent\" && target.position !== \"end\") return { allowed: false, reason: \"The reviewed navtarget position must be adjacent or end.\" };\n if (kind === \"openprivate\" && container !== \"private\") return { allowed: false, reason: \"The openprivate step requires the private container.\" };\n if (kind === \"openlink\" && container === \"private\") return { allowed: false, reason: \"The openlink step cannot open the private container; use openprivate.\" };\n return { allowed: true };\n}\n\n/** Validates the reviewed waitprofile grammar with its load signals, thresholds and per origin overrides. */\nfunction validatewaitprofile(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed waitprofile with load signals is required in options.\" };\n const profile = value as Record<string, unknown>;\n if (!Array.isArray(profile.signals) || profile.signals.length === 0 || !profile.signals.every(signal => isnonempty(signal))) return { allowed: false, reason: \"The reviewed waitprofile needs a non-empty list of load signals.\" };\n if (!nonnegativeoption(profile, \"idle\")) return { allowed: false, reason: \"The reviewed waitprofile idle threshold must be zero or a positive number of milliseconds.\" };\n if (!nonnegativeoption(profile, \"timeout\")) return { allowed: false, reason: \"The reviewed waitprofile timeout must be zero or a positive number of milliseconds.\" };\n if (profile.overrides !== undefined) {\n if (!Array.isArray(profile.overrides) || profile.overrides.length === 0) return { allowed: false, reason: \"The reviewed waitprofile overrides must be a non-empty list when present.\" };\n for (const entry of profile.overrides) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return { allowed: false, reason: \"Every reviewed waitprofile override must be an object with an origin.\" };\n const override = entry as Record<string, unknown>;\n if (!ishttpsurl(override.origin)) return { allowed: false, reason: \"Every reviewed waitprofile override origin must use HTTPS.\" };\n if (override.signals !== undefined && (!Array.isArray(override.signals) || !override.signals.every(signal => isnonempty(signal)))) return { allowed: false, reason: \"The reviewed waitprofile override signals must be a list of non-empty strings.\" };\n if (!nonnegativeoption(override, \"idle\") || !nonnegativeoption(override, \"timeout\")) return { allowed: false, reason: \"The reviewed waitprofile override thresholds must be zero or positive numbers.\" };\n }\n }\n return { allowed: true };\n}\n\n/** Validates the reviewed urlpattern grammar with its match mode plus query and fragment parts. */\nexport function validateurlpattern(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed urlpattern is required in options.\" };\n const pattern = value as Record<string, unknown>;\n if (pattern.mode !== \"exact\" && pattern.mode !== \"prefix\" && pattern.mode !== \"host\" && pattern.mode !== \"pattern\") return { allowed: false, reason: \"The reviewed urlpattern mode must be exact, prefix, host or pattern.\" };\n if (!ishttpsurl(pattern.url)) return { allowed: false, reason: \"The reviewed urlpattern url must use HTTPS.\" };\n if (pattern.query !== undefined) {\n if (!pattern.query || typeof pattern.query !== \"object\" || Array.isArray(pattern.query)) return { allowed: false, reason: \"The reviewed urlpattern query part must be an object of parameter names and values.\" };\n for (const item of Object.values(pattern.query)) if (typeof item !== \"string\") return { allowed: false, reason: \"The reviewed urlpattern query values must be strings.\" };\n }\n if (pattern.fragment !== undefined && !isnonempty(pattern.fragment)) return { allowed: false, reason: \"The reviewed urlpattern fragment must be a non-empty string.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed non-empty list of HTTPS urls in options. */\nfunction validateurllist(options: Record<string, unknown>, key: string): policyevaluation {\n const urls = options[key];\n if (!Array.isArray(urls) || urls.length === 0 || !urls.every(url => ishttpsurl(url))) return { allowed: false, reason: `A reviewed non-empty list of HTTPS urls is required in options as ${key}.` };\n return { allowed: true };\n}\n\n/** Validates the reviewed ratelimit grammar of a navrate step; the window and ceiling stay user configured with no hardcoded cap. */\nfunction validateratelimit(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed ratelimit with a window and a ceiling is required in options.\" };\n const limit = value as Record<string, unknown>;\n if (limit.domain !== undefined && !isnonempty(limit.domain)) return { allowed: false, reason: \"The reviewed ratelimit domain must be a non-empty string.\" };\n if (typeof limit.window !== \"number\" || !Number.isFinite(limit.window) || limit.window <= 0) return { allowed: false, reason: \"The reviewed ratelimit window must be a positive number of milliseconds with no code ceiling.\" };\n if (typeof limit.ceiling !== \"number\" || !Number.isInteger(limit.ceiling) || limit.ceiling < 1) return { allowed: false, reason: \"The reviewed ratelimit ceiling must be a positive integer with no code ceiling.\" };\n return { allowed: true };\n}\n\n/** Validates the reviewed tabquery grammar with url, title, id and pattern matchers; at least one matcher is required. */\nexport function validatetabquery(value: unknown): policyevaluation {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return { allowed: false, reason: \"A reviewed tabquery with at least one matcher is required in options.\" };\n const query = value as Record<string, unknown>;\n const hasmatcher = query.url !== undefined || query.title !== undefined || query.id !== undefined || query.pattern !== undefined;\n if (!hasmatcher) return { allowed: false, reason: \"The reviewed tabquery needs a url, title, id or pattern matcher.\" };\n if (query.url !== undefined && !isnonempty(query.url)) return { allowed: false, reason: \"The reviewed tabquery url matcher must be a non-empty string.\" };\n if (query.title !== undefined && !isnonempty(query.title)) return { allowed: false, reason: \"The reviewed tabquery title matcher must be a non-empty string.\" };\n if (query.pattern !== undefined && !isnonempty(query.pattern)) return { allowed: false, reason: \"The reviewed tabquery pattern matcher must be a non-empty string.\" };\n if (query.id !== undefined && (typeof query.id !== \"number\" || !Number.isInteger(query.id) || query.id < 0)) return { allowed: false, reason: \"The reviewed tabquery id matcher must be a non-negative integer tab id.\" };\n return { allowed: true };\n}\n\n/** Validates a reviewed group color choice against the Chromium tab group palette. */\nfunction validategroupcolor(value: unknown): boolean {\n return typeof value === \"string\" && (groupcolors as string[]).includes(value);\n}\n\n/** Validates a reviewed list of numeric browser ids in options. */\nfunction validateidlist(options: Record<string, unknown>, key: string): boolean {\n const ids = options[key];\n return Array.isArray(ids) && ids.length > 0 && ids.every(id => typeof id === \"number\" && Number.isInteger(id) && id >= 0);\n}\n\n/** Validates the reviewed tab and window parameter grammar of the tabs and windows command family. */\nfunction validatetabsgrammar(step: toolstep, options: Record<string, unknown>): policyevaluation {\n const kind = step.kind;\n if (kind === \"querytabs\" || kind === \"closepattern\") {\n const querycheck = validatetabquery(options.tabquery);\n if (!querycheck.allowed) return querycheck;\n if (kind === \"closepattern\" && options.reviewed !== true) return { allowed: false, reason: \"The close pattern needs the explicit reviewed flag before any tab closes.\" };\n }\n if (kind === \"duplicatetab\" || kind === \"pintab\" || kind === \"mutetab\" || kind === \"movetab\" || kind === \"movetabwindow\" || kind === \"badgetab\" || kind === \"attachmeta\") {\n if (!isnumericid(step.value)) return { allowed: false, reason: \"A numeric browser tab id is required.\" };\n }\n if (kind === \"focuswindow\" || kind === \"maximizewindow\" || kind === \"minimizewindow\" || kind === \"restorewindow\") {\n if (!isnumericid(step.value)) return { allowed: false, reason: \"A numeric browser window id is required.\" };\n }\n if (kind === \"pintab\" && typeof options.pinned !== \"boolean\") return { allowed: false, reason: \"A reviewed pinned flag is required in options.\" };\n if (kind === \"mutetab\" && typeof options.muted !== \"boolean\") return { allowed: false, reason: \"A reviewed muted flag is required in options.\" };\n if (kind === \"movetab\") {\n if (typeof options.index !== \"number\" || !Number.isInteger(options.index) || options.index < 0) return { allowed: false, reason: \"A reviewed non-negative target index is required in options.\" };\n }\n if (kind === \"movetabwindow\") {\n if (typeof options.windowid !== \"number\" || !Number.isInteger(options.windowid) || options.windowid < 0) return { allowed: false, reason: \"A reviewed target window id is required in options.\" };\n }\n if (kind === \"grouptabs\") {\n const group = options.group;\n if (!group || typeof group !== \"object\" || Array.isArray(group)) return { allowed: false, reason: \"A reviewed group with a name is required in options.\" };\n const spec = group as Record<string, unknown>;\n if (!isnonempty(spec.name)) return { allowed: false, reason: \"The reviewed group needs a non-empty name.\" };\n if (!validategroupcolor(spec.color)) return { allowed: false, reason: \"The reviewed group color must be a Chromium tab group color.\" };\n if (!validateidlist(spec, \"tabids\")) return { allowed: false, reason: \"The reviewed group needs a non-empty list of member tab ids.\" };\n }\n if (kind === \"colorgroup\") {\n if (!isnonempty(options.name)) return { allowed: false, reason: \"A reviewed group name is required in options.\" };\n if (!validategroupcolor(options.color)) return { allowed: false, reason: \"The reviewed group color must be a Chromium tab group color.\" };\n }\n if (kind === \"collapsegroup\") {\n if (!isnonempty(options.name)) return { allowed: false, reason: \"A reviewed group name is required in options.\" };\n if (typeof options.collapsed !== \"boolean\") return { allowed: false, reason: \"A reviewed collapsed flag is required in options.\" };\n }\n if (kind === \"discardtab\" || kind === \"reloadtabs\") {\n if (!isnumericid(step.value) && !validateidlist(options, \"tabs\")) return { allowed: false, reason: \"A numeric tab id or a reviewed list of tab ids is required.\" };\n }\n if (kind === \"zoomin\" || kind === \"zoomout\") {\n if (options.step !== undefined && (typeof options.step !== \"number\" || !Number.isFinite(options.step) || options.step <= 0)) return { allowed: false, reason: \"The reviewed zoom step must be a positive number with no code ceiling.\" };\n if (step.value !== undefined && step.value !== \"\" && !isnumericid(step.value)) return { allowed: false, reason: \"The reviewed zoom target must be a numeric tab id.\" };\n }\n if (kind === \"switchtab\") {\n if (options.direction !== \"next\" && options.direction !== \"previous\") return { allowed: false, reason: \"A reviewed switch direction of next or previous is required in options.\" };\n }\n if (kind === \"restorewindow\") {\n const bounds = options.bounds;\n if (bounds !== undefined) {\n if (!bounds || typeof bounds !== \"object\" || Array.isArray(bounds)) return { allowed: false, reason: \"The reviewed window bounds must be an object.\" };\n const shape = bounds as Record<string, unknown>;\n for (const field of [\"left\", \"top\", \"width\", \"height\"]) {\n if (typeof shape[field] !== \"number\" || !Number.isFinite(shape[field])) return { allowed: false, reason: \"The reviewed window bounds need numeric left, top, width and height.\" };\n }\n }\n }\n if (kind === \"scratchwindow\") {\n if (step.value !== undefined && step.value !== \"\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"The reviewed scratch window url must use HTTPS.\" };\n }\n if (kind === \"incognitowindow\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"A reviewed HTTPS url is required to open an incognito window.\" };\n if (kind === \"restoretab\" && step.value !== undefined && step.value !== \"\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"The reviewed restore url must use HTTPS.\" };\n if (kind === \"savelayout\" || kind === \"restorelayout\") {\n if (!isnonempty(options.name)) return { allowed: false, reason: \"A reviewed layout name is required in options.\" };\n }\n if (kind === \"badgetab\") {\n if (!isnonempty(options.label)) return { allowed: false, reason: \"A reviewed badge label is required in options.\" };\n if (options.taskid !== undefined && !isnonempty(options.taskid)) return { allowed: false, reason: \"The reviewed badge task id must be a non-empty string.\" };\n }\n if (kind === \"attachmeta\") {\n const labels = options.labels;\n const taskrefs = options.taskrefs;\n const haslabels = Array.isArray(labels) && labels.length > 0 && labels.every(label => isnonempty(label));\n const hastaskrefs = Array.isArray(taskrefs) && taskrefs.length > 0 && taskrefs.every(ref => isnonempty(ref));\n if (!haslabels && !hastaskrefs) return { allowed: false, reason: \"Reviewed labels or task refs are required in options to attach metadata.\" };\n if (options.provenance !== undefined && !isnonempty(options.provenance)) return { allowed: false, reason: \"The reviewed provenance must be a non-empty string.\" };\n }\n if (kind === \"reopenrun\" && !isnonempty(options.run)) return { allowed: false, reason: \"A reviewed run id is required in options to reopen its tabs.\" };\n return { allowed: true };\n}\n\n/** True when the kind belongs to the media capture family of pdf documents, recordings, images, canvases, streams, assets, lapses, conversions and thumbnails. */\nexport function ismediakind(kind: actionkind): boolean {\n return mediaactions.has(kind);\n}\n\n/** True when the kind records user activity and needs the reviewed recording consent before it starts. */\nexport function isrecordingkind(kind: actionkind): boolean {\n return kind === \"recordscreen\" || kind === \"captureaudio\";\n}\n\n/** Requires the active tab grant of the live session for every media kind: the session tab and origin must match and the origin grant must cover the active origin. */\nexport function mediagate(session: agentsession | undefined, tabid: number, origin: string, now: number): policyevaluation {\n if (!session || session.stoppedat) return { allowed: false, reason: \"No active browser session exists for the media capture.\" };\n if (session.expiresat <= now) return { allowed: false, reason: \"The browser session has expired and cannot capture media.\" };\n if (session.pausedat) return { allowed: false, reason: \"The browser session is paused and cannot capture media.\" };\n if (session.tabid !== tabid) return { allowed: false, reason: `The media capture needs the active tab grant of session tab ${session.tabid} and refuses tab ${tabid}.` };\n if (!origingranted(session, origin)) return { allowed: false, reason: `The media capture of ${origin} needs the session origin grants first.` };\n return { allowed: true };\n}\n\n/** Requires an approved recording consent prompt before any recording of user activity starts; every start consumes its own prompt. */\nexport function recordingconsentgranted(step: toolstep): policyevaluation {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const consentref = options.consentref;\n if (typeof consentref !== \"string\" || !consentref.trim()) return { allowed: false, reason: \"A recording of user activity requires a reviewed consent ref in options before it starts.\" };\n return { allowed: true };\n}\n\n/** Exposes the recording duration window as a user configured choice in milliseconds; an absent window leaves the duration to the reviewed step options with no code ceiling. */\nexport function recordingwindow(settings: runsettings | undefined): number | undefined {\n const window = settings?.recordingwindow;\n return typeof window === \"number\" && Number.isFinite(window) && window > 0 ? window : undefined;\n}\n\n/** Keeps the reviewed lapse plan inside the reviewed wait budget: the whole lapse duration must fit the wait window with no code ceiling on either side. */\nexport function lapsebudgetallowed(interval: number, duration: number, wait: number | undefined): policyevaluation {\n if (!(interval > 0)) return { allowed: false, reason: \"The reviewed lapse interval must be a positive number of milliseconds.\" };\n if (!(duration > 0)) return { allowed: false, reason: \"The reviewed lapse duration must be a positive number of milliseconds.\" };\n if (wait !== undefined && !(wait >= 0)) return { allowed: false, reason: \"The reviewed wait budget must be zero or a positive number of milliseconds.\" };\n if (wait !== undefined && duration > wait) return { allowed: false, reason: `The lapse duration of ${duration} milliseconds exceeds the reviewed wait budget of ${wait} milliseconds; review a wider budget or a shorter duration.` };\n return { allowed: true };\n}\n\n/** Validates the reviewed media capture parameter grammar of the 1.1.41 family: pdf paper sizes, recording scopes and windows, image filters, lapse plans, conversion targets and thumbnail directives stay user choices with no code ceilings. */\nfunction validatemediagrammar(step: toolstep, options: Record<string, unknown>): policyevaluation {\n const kind = step.kind;\n if (kind === \"capturepdf\") {\n const pdf = options.pdf;\n if (pdf !== undefined) {\n if (!pdf || typeof pdf !== \"object\" || Array.isArray(pdf)) return { allowed: false, reason: \"The reviewed pdf options must be an object in options.pdf.\" };\n const pdfoptions = pdf as Record<string, unknown>;\n if (pdfoptions.paperwidth !== undefined && (typeof pdfoptions.paperwidth !== \"number\" || !Number.isFinite(pdfoptions.paperwidth) || pdfoptions.paperwidth <= 0)) return { allowed: false, reason: \"The reviewed pdf paper width must be a positive number of inches with no code cap.\" };\n if (pdfoptions.paperheight !== undefined && (typeof pdfoptions.paperheight !== \"number\" || !Number.isFinite(pdfoptions.paperheight) || pdfoptions.paperheight <= 0)) return { allowed: false, reason: \"The reviewed pdf paper height must be a positive number of inches with no code cap.\" };\n if (pdfoptions.margins !== undefined) {\n const margins = pdfoptions.margins;\n if (!margins || typeof margins !== \"object\" || Array.isArray(margins)) return { allowed: false, reason: \"The reviewed pdf margins must be an object with top, right, bottom and left inches.\" };\n for (const side of [\"top\", \"right\", \"bottom\", \"left\"]) {\n const value = (margins as Record<string, unknown>)[side];\n if (value === undefined) continue;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return { allowed: false, reason: `The reviewed pdf ${side} margin must be zero or a positive number of inches; negative margins are refused.` };\n }\n }\n if (pdfoptions.scale !== undefined && (typeof pdfoptions.scale !== \"number\" || !Number.isFinite(pdfoptions.scale) || pdfoptions.scale <= 0)) return { allowed: false, reason: \"The reviewed pdf scale must be a positive number with no code cap.\" };\n if (pdfoptions.landscape !== undefined && typeof pdfoptions.landscape !== \"boolean\") return { allowed: false, reason: \"The reviewed pdf landscape flag must be a boolean.\" };\n if (pdfoptions.paginate !== undefined && typeof pdfoptions.paginate !== \"boolean\") return { allowed: false, reason: \"The reviewed pdf paginate flag must be a boolean.\" };\n }\n if (options.breakpoints !== undefined && (!Array.isArray(options.breakpoints) || options.breakpoints.length === 0 || !options.breakpoints.every(item => isnonempty(item)))) return { allowed: false, reason: \"The reviewed pdf break points must be a non-empty list of selectors when present.\" };\n if (options.exporttarget !== undefined && options.exporttarget !== \"memory\" && options.exporttarget !== \"download\") return { allowed: false, reason: \"The reviewed pdf export target must be memory or download; pdf documents do not route to the clipboard.\" };\n if (options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed pdf artifact name must be a non-empty string.\" };\n }\n if (kind === \"recordscreen\" || kind === \"captureaudio\") {\n const recording = options.recording;\n if (recording !== undefined) {\n if (!recording || typeof recording !== \"object\" || Array.isArray(recording)) return { allowed: false, reason: \"The reviewed recording options must be an object in options.recording.\" };\n const recordoptions = recording as Record<string, unknown>;\n if (recordoptions.scope !== undefined && recordoptions.scope !== \"tab\" && recordoptions.scope !== \"run\") return { allowed: false, reason: \"The reviewed recording scope must be tab or run.\" };\n if (recordoptions.fps !== undefined && (typeof recordoptions.fps !== \"number\" || !Number.isFinite(recordoptions.fps) || recordoptions.fps <= 0)) return { allowed: false, reason: \"The reviewed recording fps must be a positive number with no code ceiling.\" };\n if (recordoptions.bitrate !== undefined && (typeof recordoptions.bitrate !== \"number\" || !Number.isFinite(recordoptions.bitrate) || recordoptions.bitrate <= 0)) return { allowed: false, reason: \"The reviewed recording bitrate must be a positive number with no code ceiling.\" };\n if (recordoptions.audio !== undefined && typeof recordoptions.audio !== \"boolean\") return { allowed: false, reason: \"The reviewed recording audio flag must be a boolean.\" };\n }\n if (options.duration !== undefined && (typeof options.duration !== \"number\" || !Number.isFinite(options.duration) || options.duration <= 0)) return { allowed: false, reason: \"The reviewed recording duration must be a positive number of milliseconds with no code ceiling.\" };\n const consent = recordingconsentgranted(step);\n if (!consent.allowed) return consent;\n }\n if (kind === \"captureframe\") {\n if (options.timestamp !== undefined && (typeof options.timestamp !== \"number\" || !Number.isFinite(options.timestamp) || options.timestamp < 0)) return { allowed: false, reason: \"The reviewed frame timestamp must be zero or a positive number of seconds.\" };\n if (options.poster !== undefined && typeof options.poster !== \"boolean\") return { allowed: false, reason: \"The reviewed poster flag must be a boolean.\" };\n const capturecheck = validatecaptureoptions(options.capture);\n if (!capturecheck.allowed) return capturecheck;\n }\n if (kind === \"downloadimages\") {\n const filter = options.imagefilter;\n if (!filter || typeof filter !== \"object\" || Array.isArray(filter)) return { allowed: false, reason: \"A reviewed imagefilter is required in options before any image downloads.\" };\n const imagefilter = filter as Record<string, unknown>;\n if (imagefilter.selector !== undefined && !isnonempty(imagefilter.selector)) return { allowed: false, reason: \"The reviewed imagefilter selector must be a non-empty selector from the reviewed selector grammar.\" };\n if (imagefilter.minwidth !== undefined && (typeof imagefilter.minwidth !== \"number\" || !Number.isFinite(imagefilter.minwidth) || imagefilter.minwidth < 0)) return { allowed: false, reason: \"The reviewed imagefilter minimum width must be zero or a positive number of pixels.\" };\n if (imagefilter.minheight !== undefined && (typeof imagefilter.minheight !== \"number\" || !Number.isFinite(imagefilter.minheight) || imagefilter.minheight < 0)) return { allowed: false, reason: \"The reviewed imagefilter minimum height must be zero or a positive number of pixels.\" };\n if (imagefilter.formats !== undefined && (!Array.isArray(imagefilter.formats) || imagefilter.formats.length === 0 || !imagefilter.formats.every(item => isnonempty(item)))) return { allowed: false, reason: \"The reviewed imagefilter format list must be a non-empty list of mime or extension patterns when present.\" };\n if (options.naming !== undefined) {\n const namingcheck = validatecapturenaming(options.naming);\n if (!namingcheck.allowed) return namingcheck;\n }\n }\n if (kind === \"shotcanvas\") {\n const capturecheck = validatecaptureoptions(options.capture);\n if (!capturecheck.allowed) return capturecheck;\n }\n if (kind === \"probestream\" && options.selector !== undefined && !isnonempty(options.selector)) return { allowed: false, reason: \"The reviewed stream probe scope selector must be a non-empty string.\" };\n if (kind === \"timelapse\") {\n const lapse = options.lapse;\n if (!lapse || typeof lapse !== \"object\" || Array.isArray(lapse)) return { allowed: false, reason: \"A reviewed lapse plan with interval, duration and format is required in options.\" };\n const plan = lapse as Record<string, unknown>;\n if (typeof plan.interval !== \"number\" || !Number.isFinite(plan.interval) || plan.interval <= 0) return { allowed: false, reason: \"The reviewed lapse interval must be a positive number of milliseconds with no code ceiling.\" };\n if (typeof plan.duration !== \"number\" || !Number.isFinite(plan.duration) || plan.duration <= 0) return { allowed: false, reason: \"The reviewed lapse duration must be a positive number of milliseconds with no code ceiling.\" };\n if (plan.format !== undefined && plan.format !== \"png\" && plan.format !== \"jpeg\" && plan.format !== \"webp\") return { allowed: false, reason: \"The reviewed lapse format must be png, jpeg or webp.\" };\n const budget = lapsebudgetallowed(plan.interval as number, plan.duration as number, typeof options.wait === \"number\" ? options.wait : undefined);\n if (!budget.allowed) return budget;\n const capturecheck = validatecaptureoptions(options.capture);\n if (!capturecheck.allowed) return capturecheck;\n }\n if (kind === \"convertimage\" || kind === \"makethumbs\") {\n const single = options.capture;\n const list = options.captures;\n const hasone = isnonempty(single);\n const haslist = Array.isArray(list) && list.length > 0 && list.every(item => isnonempty(item));\n if (!hasone && !haslist) return { allowed: false, reason: \"A reviewed capture id or a reviewed non-empty capture id list is required in options.\" };\n if (hasone && haslist) return { allowed: false, reason: \"The reviewed step needs one capture id or a capture id list, not both.\" };\n }\n if (kind === \"convertimage\") {\n const convert = options.convert;\n if (!convert || typeof convert !== \"object\" || Array.isArray(convert)) return { allowed: false, reason: \"A reviewed convert directive with a target format is required in options.\" };\n const directive = convert as Record<string, unknown>;\n if (directive.target !== \"png\" && directive.target !== \"jpeg\" && directive.target !== \"webp\") return { allowed: false, reason: \"The reviewed conversion target must be png, jpeg or webp.\" };\n if (directive.source !== undefined && directive.source !== \"png\" && directive.source !== \"jpeg\" && directive.source !== \"webp\") return { allowed: false, reason: \"The reviewed conversion source must be png, jpeg or webp.\" };\n if (directive.quality !== undefined && (typeof directive.quality !== \"number\" || !Number.isFinite(directive.quality) || directive.quality < 0 || directive.quality > 100)) return { allowed: false, reason: \"The reviewed conversion quality must stay between zero and one hundred with no code cap inside that range.\" };\n }\n if (kind === \"makethumbs\") {\n const thumb = options.thumb;\n if (!thumb || typeof thumb !== \"object\" || Array.isArray(thumb)) return { allowed: false, reason: \"A reviewed thumb directive with size, fit and suffix is required in options.\" };\n const directive = thumb as Record<string, unknown>;\n if (typeof directive.size !== \"number\" || !Number.isFinite(directive.size) || directive.size <= 0) return { allowed: false, reason: \"The reviewed thumbnail size must be a positive number of pixels with no fixed set.\" };\n if (directive.fit !== \"cover\" && directive.fit !== \"contain\") return { allowed: false, reason: \"The reviewed thumbnail fit must be cover or contain.\" };\n if (!isnonempty(directive.suffix)) return { allowed: false, reason: \"The reviewed thumbnail naming suffix must be a non-empty string.\" };\n }\n return { allowed: true };\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 if (step.kind === \"openlink\" || step.kind === \"openprivate\" || step.kind === \"deeplink\") {\n const targetcheck = validatenavtarget(options.navtarget, step.kind);\n if (!targetcheck.allowed) return targetcheck;\n if (step.kind === \"deeplink\") {\n const app = options.app;\n if (!isnonempty(app)) return { allowed: false, reason: \"A reviewed deep link app pattern is required in options.\" };\n const params = options.params;\n if (params !== undefined && (!params || typeof params !== \"object\" || Array.isArray(params) || !Object.values(params).every(item => typeof item === \"string\"))) return { allowed: false, reason: \"The reviewed deep link params must be an object of string values.\" };\n }\n }\n if (step.kind === \"waitload\" && !nonnegativeoption(options, \"timeout\")) return { allowed: false, reason: \"The waitload timeout must be zero or a positive number of milliseconds.\" };\n if (step.kind === \"waiturl\" || step.kind === \"spawait\") {\n if (step.kind === \"waiturl\") {\n const patterncheck = validateurlpattern(options.urlpattern);\n if (!patterncheck.allowed) return patterncheck;\n }\n if (!nonnegativeoption(options, \"timeout\")) return { allowed: false, reason: \"The wait timeout must be zero or a positive number of milliseconds.\" };\n if (!nonnegativeoption(options, \"poll\")) return { allowed: false, reason: \"The wait poll interval must be zero or a positive number of milliseconds.\" };\n }\n if (step.kind === \"followlink\") {\n if (options.fragment !== undefined && typeof options.fragment !== \"boolean\") return { allowed: false, reason: \"The reviewed followlink fragment flag must be a boolean.\" };\n }\n if (step.kind === \"spanav\") {\n if (options.routepattern !== undefined) {\n const routecheck = validateurlpattern(options.routepattern);\n if (!routecheck.allowed) return routecheck;\n }\n if (!nonnegativeoption(options, \"timeout\")) return { allowed: false, reason: \"The spanav route timeout must be zero or a positive number of milliseconds.\" };\n }\n if (step.kind === \"rewritequery\") {\n const set = options.set;\n const remove = options.remove;\n if (set === undefined && remove === undefined) return { allowed: false, reason: \"Reviewed query parameters to set or remove are required in options.\" };\n if (set !== undefined && (!set || typeof set !== \"object\" || Array.isArray(set) || !Object.values(set).every(item => typeof item === \"string\"))) return { allowed: false, reason: \"The reviewed query parameters to set must be an object of string values.\" };\n if (remove !== undefined && (!Array.isArray(remove) || !remove.every(item => isnonempty(item)))) return { allowed: false, reason: \"The reviewed query parameters to remove must be a list of non-empty names.\" };\n }\n if (step.kind === \"navlist\") {\n const listcheck = validateurllist(options, \"urls\");\n if (!listcheck.allowed) return listcheck;\n }\n if (step.kind === \"navprofile\") {\n const profilecheck = validatewaitprofile(options.waitprofile);\n if (!profilecheck.allowed) return profilecheck;\n }\n if (step.kind === \"handleauth\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"A reviewed HTTPS origin or url is required as the auth target.\" };\n if (step.kind === \"printpdf\" && options.name !== undefined && !isnonempty(options.name)) return { allowed: false, reason: \"The reviewed artifact name must be a non-empty string.\" };\n if (step.kind === \"prefetch\") {\n const listcheck = validateurllist(options, \"urls\");\n if (!listcheck.allowed) return listcheck;\n }\n if (step.kind === \"preconnect\") {\n const origins = options.origins;\n if (!Array.isArray(origins) || origins.length === 0 || !origins.every(originurl => ishttpsurl(originurl))) return { allowed: false, reason: \"A reviewed non-empty list of HTTPS origins is required in options.\" };\n }\n if (step.kind === \"reopentab\" && step.value !== undefined && !ishttpsurl(step.value)) return { allowed: false, reason: \"The reviewed reopen url must use HTTPS.\" };\n if (step.kind === \"navrate\") {\n const limitcheck = validateratelimit(options.ratelimit);\n if (!limitcheck.allowed) return limitcheck;\n }\n if (step.kind === \"checksafe\" && !ishttpsurl(step.value)) return { allowed: false, reason: \"A reviewed HTTPS url is required for the safety check.\" };\n if (step.kind === \"batchopen\") {\n const listcheck = validateurllist(options, \"urls\");\n if (!listcheck.allowed) return listcheck;\n }\n if (istabscommandkind(step.kind)) {\n const tabscheck = validatetabsgrammar(step, options);\n if (!tabscheck.allowed) return tabscheck;\n }\n if (isformkind(step.kind)) {\n const formcheck = validateformgrammar(step, options);\n if (!formcheck.allowed) return formcheck;\n }\n if (isdatasetkind(step.kind)) {\n const datacheck = validatedatagrammar(step, options, origin);\n if (!datacheck.allowed) return datacheck;\n }\n if (isfileskind(step.kind)) {\n const filescheck = validatefilesgrammar(step, options);\n if (!filescheck.allowed) return filescheck;\n }\n if (iscapturekind(step.kind)) {\n const capturecheck = validatecapturegrammar(step, options);\n if (!capturecheck.allowed) return capturecheck;\n }\n if (ismediakind(step.kind)) {\n const mediacheck = validatemediagrammar(step, options);\n if (!mediacheck.allowed) return mediacheck;\n }\n if (step.kind === \"tabcreate\") {\n if (options.background !== undefined && typeof options.background !== \"boolean\") return { allowed: false, reason: \"The reviewed background flag must be a boolean.\" };\n if (options.window !== undefined && (typeof options.window !== \"number\" || !Number.isInteger(options.window) || options.window < 0)) return { allowed: false, reason: \"The reviewed target window id must be a non-negative integer.\" };\n }\n if (step.kind === \"windowcreate\") {\n for (const field of [\"left\", \"top\", \"width\", \"height\"]) {\n if (options[field] !== undefined && (typeof options[field] !== \"number\" || !Number.isFinite(options[field]))) return { allowed: false, reason: `The reviewed window ${field} must be a number.` };\n }\n if (options.state !== undefined && ![\"normal\", \"maximized\", \"minimized\", \"fullscreen\"].includes(options.state as string)) return { allowed: false, reason: \"The reviewed window state must be normal, maximized, minimized or fullscreen.\" };\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; verdicts?: safetyverdict[] }): 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 if (isexportkind(input.step.kind)) {\n const exportgate = exportgranted(input.session, input.origin);\n if (!exportgate.allowed) return exportgate;\n }\n if (input.step.kind === \"navlist\") {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(input.step); } catch { options = {}; }\n for (const url of Array.isArray(options.urls) ? options.urls : []) {\n if (typeof url !== \"string\") continue;\n const navigation = navigationgranted(input.session, url);\n if (!navigation.allowed) return navigation;\n }\n }\n if (islayoutkind(input.step.kind) && !layoutmutationgranted(input.session, now).allowed) return { allowed: false, reason: \"Group and layout mutations stay inside the active session.\" };\n if (input.step.kind === \"submitform\" || input.step.kind === \"retryform\") {\n if (!input.plan) return { allowed: false, reason: \"Form submission requires an asksubmit review step before it.\" };\n const reviewgate = submitreviewgranted(input.plan.steps, input.step.id);\n if (!reviewgate.allowed) return reviewgate;\n }\n if (input.step.kind === \"consentpassword\") {\n const consentgate = passwordconsentgranted(input.step);\n if (!consentgate.allowed) return consentgate;\n }\n if (input.step.kind === \"readclipboard\") {\n const clipgate = clipboardconsentgranted(input.step);\n if (!clipgate.allowed) return clipgate;\n }\n if (input.step.kind === \"interceptmime\" && !origingranted(input.session, input.origin)) return { allowed: false, reason: \"The download interception is outside the session origin grants.\" };\n if (iscapturekind(input.step.kind)) {\n const capturegatecheck = capturegate(input.session, input.tabid, input.origin, now);\n if (!capturegatecheck.allowed) return capturegatecheck;\n let captureoptions: Record<string, unknown> = {};\n try { captureoptions = parseoptions(input.step); } catch { captureoptions = {}; }\n const target = (captureoptions.capture as Record<string, unknown> | undefined)?.exporttarget;\n if (target !== undefined && target !== \"memory\" && target !== \"download\" && target !== \"clipboard\") return { allowed: false, reason: \"The capture export target must be memory, download or clipboard.\" };\n }\n if (ismediakind(input.step.kind)) {\n const mediagatecheck = mediagate(input.session, input.tabid, input.origin, now);\n if (!mediagatecheck.allowed) return mediagatecheck;\n }\n if (isrecordingkind(input.step.kind)) {\n const recordinggate = recordingconsentgranted(input.step);\n if (!recordinggate.allowed) return recordinggate;\n }\n if (input.step.kind === \"openlink\" || input.step.kind === \"openprivate\" || input.step.kind === \"batchopen\" || input.step.kind === \"prefetch\" || input.step.kind === \"deeplink\" || input.step.kind === \"reopentab\") {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(input.step); } catch { options = {}; }\n const grammar = validatestep(input.step, input.origin);\n if (!grammar.allowed) return grammar;\n const grants = input.session?.grants ?? [input.session?.origin ?? input.origin];\n const targets: unknown[] = input.step.kind === \"batchopen\" || input.step.kind === \"prefetch\" ? (Array.isArray(options.urls) ? options.urls : []) : input.step.kind === \"reopentab\" ? [input.step.value] : [(options.navtarget as Record<string, unknown> | undefined)?.url];\n for (const target of targets) {\n if (typeof target !== \"string\" || !target) continue;\n const verified = originverified(target, grants, input.verdicts ?? []);\n if (!verified.allowed) return verified;\n }\n }\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, shotpair, shotrecord, stepoutcome, wizardstate } 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\n/** One navlist entry completion record with its index, url and outcome. */\nexport interface naventry {\n index: number;\n url: string;\n ok: boolean;\n}\n\n/** Records one navlist entry as it completes, beside the step outcome log, so the trail shows current url and remaining count. */\nexport function recordnaventry(progress: planprogress | undefined, planid: string, stepid: string, entry: naventry, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const outcome: stepoutcome = { stepid, ok: entry.ok, summary: `Navigation list entry ${entry.index + 1} of ${entry.url} ${entry.ok ? \"completed\" : \"failed\"}.`, details: { naventry: entry }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns every recorded navlist entry completion of one step, oldest first. */\nexport function naventries(progress: planprogress | undefined, planid: string, stepid: string): naventry[] {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.naventry !== undefined).map(outcome => outcome.details?.naventry as naventry);\n}\n\n/** Assigns one tab to the running task so progress tracks work across its tabs. */\nexport function assigntasktab(progress: planprogress | undefined, planid: string, tabid: number, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n if ((base.tasktabs ?? []).includes(tabid)) return { ...base, updatedat: now };\n return { ...base, tasktabs: [...(base.tasktabs ?? []), tabid], updatedat: now };\n}\n\n/** Releases one task tab when its work inside the running task ends. */\nexport function releasetasktab(progress: planprogress | undefined, planid: string, tabid: number, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const remaining = (base.tasktabs ?? []).filter(id => id !== tabid);\n const { tasktabs: released, ...rest } = base;\n void released;\n return { ...rest, ...(remaining.length > 0 ? { tasktabs: remaining } : {}), updatedat: now };\n}\n\n/** Returns the tabs assigned to the running task, in assignment order. */\nexport function tasktabs(progress: planprogress | undefined, planid: string): number[] {\n if (!progress || progress.planid !== planid) return [];\n return progress.tasktabs ?? [];\n}\n\n/** Returns the wizard completion share as executed steps over the total steps. */\nexport function wizardcompletion(state: wizardstate): number {\n if (state.steps <= 0) return 0;\n return Math.min(1, state.completed.filter(Boolean).length / state.steps);\n}\n\n/** Returns the extraction progress share as rows collected over the user estimated total; an absent estimate stays at zero. */\nexport function extractionshare(rowscollected: number, estimatedtotal: number): number {\n if (!Number.isFinite(estimatedtotal) || estimatedtotal <= 0) return 0;\n return Math.min(1, Math.max(0, rowscollected) / estimatedtotal);\n}\n\n/** One extraction page completion record with its page number, row count and cursor. */\nexport interface extractionentry {\n page: number;\n rows: number;\n cursor: number;\n}\n\n/** Records one extracted page in the plan progress outcome log with its page count, row count and resume cursor. */\nexport function recordextraction(progress: planprogress | undefined, planid: string, stepid: string, entry: extractionentry, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const outcome: stepoutcome = { stepid, ok: true, summary: `Extraction page ${entry.page} collected ${entry.rows} row${entry.rows === 1 ? \"\" : \"s\"} at cursor ${entry.cursor}.`, details: { extraction: entry }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns every recorded extraction page completion of one step, oldest first. */\nexport function extractionentries(progress: planprogress | undefined, planid: string, stepid: string): extractionentry[] {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.extraction !== undefined).map(outcome => outcome.details?.extraction as extractionentry);\n}\n\n/** Records one wizard step completion into the plan progress outcome log, beside the step log, with the step index and total steps. */\nexport function recordwizardstep(progress: planprogress | undefined, planid: string, stepid: string, state: wizardstate, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const executed = Math.min(state.index, state.steps);\n const done = executed >= state.steps;\n const outcome: stepoutcome = { stepid, ok: done, summary: `Wizard step ${executed} of ${state.steps} ${done ? \"completed the wizard\" : \"executed\"}.`, details: { wizard: { index: state.index, steps: state.steps, completed: [...state.completed] } }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns the batch download progress share as files completed over the total files of the batch. */\nexport function downloadshare(completed: number, total: number): number {\n if (!Number.isFinite(total) || total <= 0) return 0;\n return Math.min(1, Math.max(0, completed) / total);\n}\n\n/** One batch download file completion record with its index, url and resulting state. */\nexport interface downloadentry {\n index: number;\n url: string;\n state: string;\n}\n\n/** Records one batch download file completion in the plan progress outcome log so the queue shows live per file states. */\nexport function recorddownload(progress: planprogress | undefined, planid: string, stepid: string, entry: downloadentry, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const outcome: stepoutcome = { stepid, ok: entry.state === \"complete\", summary: `Download ${entry.index + 1} of ${entry.url} ended in the ${entry.state} state.`, details: { download: entry }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns every recorded batch download file completion of one step, oldest first. */\nexport function downloadentries(progress: planprogress | undefined, planid: string, stepid: string): downloadentry[] {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.download !== undefined).map(outcome => outcome.details?.download as downloadentry);\n}\n\n/** Records one capture completion in the plan progress outcome log with the record id, format and byte size as reviewable evidence. */\nexport function recordcapture(progress: planprogress | undefined, planid: string, stepid: string, capture: shotrecord, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const bytes = capture.bytes?.length ?? 0;\n const outcome: stepoutcome = { stepid, ok: true, summary: `Captured a ${capture.format} ${capture.kind} shot of ${capture.width} by ${capture.height} pixels with ${bytes} character${bytes === 1 ? \"\" : \"s\"} of image data.`, details: { capture: { id: capture.id, kind: capture.kind, format: capture.format, width: capture.width, height: capture.height, bytes } }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Records one before and after shotpair of a wrapped action in the plan progress outcome log with both shot ids and the dom snapshot id. */\nexport function recordpair(progress: planprogress | undefined, planid: string, stepid: string, pair: shotpair, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const outcome: stepoutcome = { stepid, ok: true, summary: `Paired the before shot ${pair.beforeid} with the after shot ${pair.afterid} around the ${pair.actionkind} action.`, details: { shotpair: { id: pair.id, beforeid: pair.beforeid, afterid: pair.afterid, actionkind: pair.actionkind, ...(pair.target !== undefined ? { target: pair.target } : {}), ...(pair.domsnapshotid !== undefined ? { domsnapshotid: pair.domsnapshotid } : {}) } }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns every recorded capture completion of one step, oldest first. */\nexport function captureentries(progress: planprogress | undefined, planid: string, stepid: string): Array<{ id: string; kind: string; format: string; width: number; height: number; bytes: number }> {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.capture !== undefined).map(outcome => outcome.details?.capture as { id: string; kind: string; format: string; width: number; height: number; bytes: number });\n}\n\n/** Returns every recorded shotpair of one step, oldest first. */\nexport function pairentries(progress: planprogress | undefined, planid: string, stepid: string): Array<{ id: string; beforeid: string; afterid: string; actionkind: string }> {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.shotpair !== undefined).map(outcome => outcome.details?.shotpair as { id: string; beforeid: string; afterid: string; actionkind: string });\n}\n\n/** Records one media capture completion in the plan progress outcome log with the record id, kind, scope and byte size as reviewable evidence. */\nexport function recordmedia(progress: planprogress | undefined, planid: string, stepid: string, media: { id: string; kind: string; scope: string; bytes: number }, now: number): planprogress {\n const base = progress && progress.planid === planid ? progress : emptyprogress(planid, now);\n const outcome: stepoutcome = { stepid, ok: true, summary: `Captured a ${media.kind} media record of ${media.scope} scope with ${media.bytes} character${media.bytes === 1 ? \"\" : \"s\"} of media data.`, details: { media }, at: now };\n return recordoutcome(base, planid, outcome, now);\n}\n\n/** Returns every recorded media capture completion of one step, oldest first. */\nexport function mediaentries(progress: planprogress | undefined, planid: string, stepid: string): Array<{ id: string; kind: string; scope: string; bytes: number }> {\n if (!progress || progress.planid !== planid) return [];\n return (progress.outcomes ?? []).filter(outcome => outcome.stepid === stepid && outcome.details?.media !== undefined).map(outcome => outcome.details?.media as { id: string; kind: string; scope: string; bytes: number });\n}\n", "/** Canonical package version synchronized from package.json. */\nexport const packageversion = \"1.1.41\" 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 | \"openlink\" | \"openprivate\" | \"reloadcache\" | \"stopnav\" | \"waitload\" | \"waiturl\"\n | \"followlink\" | \"spanav\" | \"spawait\" | \"rewritequery\" | \"setfragment\" | \"navlist\"\n | \"navprofile\" | \"detecthttp\" | \"readredirects\" | \"readfinalurl\" | \"handleauth\" | \"printpdf\"\n | \"prefetch\" | \"preconnect\" | \"deeplink\" | \"reopentab\" | \"trailaudit\" | \"pausenav\"\n | \"navintent\" | \"navrate\" | \"openclipboard\" | \"checksafe\" | \"batchopen\"\n | \"querytabs\" | \"duplicatetab\" | \"closepattern\" | \"pintab\" | \"mutetab\" | \"movetab\"\n | \"movetabwindow\" | \"grouptabs\" | \"colorgroup\" | \"collapsegroup\" | \"discardtab\"\n | \"reloadtabs\" | \"zoomin\" | \"zoomout\" | \"watchtab\" | \"switchtab\" | \"maximizewindow\"\n | \"minimizewindow\" | \"restorewindow\" | \"focuswindow\" | \"scratchwindow\" | \"incognitowindow\"\n | \"restoretab\" | \"savelayout\" | \"restorelayout\" | \"findclones\" | \"searchtabs\"\n | \"badgetab\" | \"attachmeta\" | \"listaudio\" | \"reopenrun\" | \"snapshotsession\"\n | \"fillform\" | \"filllabel\" | \"fillplaceholder\" | \"detectfields\" | \"generatevalues\"\n | \"saveprofiles\" | \"asksubmit\" | \"submitform\" | \"readerrors\" | \"retryform\"\n | \"runwizard\" | \"selectchain\" | \"picktypeahead\" | \"pickdate\" | \"attachfile\"\n | \"handoffcaptcha\" | \"fillcard\" | \"fillcode\" | \"consentpassword\" | \"skiphoneypot\"\n | \"detectlogin\" | \"detecttemplate\"\n | \"scrapetable\" | \"exportcsv\" | \"exportjson\" | \"exportexcel\" | \"copytable\"\n | \"pushsheets\" | \"importcsv\" | \"looprows\" | \"transformvalues\" | \"deduperows\"\n | \"paginateextract\" | \"mergepages\" | \"stamplerows\" | \"previewgrid\"\n | \"streamdisk\" | \"resumeextract\" | \"logprovenance\"\n | \"batchdownload\" | \"pausedownload\" | \"resumedownload\" | \"verifydownload\" | \"interceptmime\"\n | \"exportnetlog\" | \"readclipboard\" | \"writeclipboard\" | \"copyscreen\" | \"quarantinedownload\"\n | \"scanvirus\" | \"namecaptures\" | \"cleanupartifacts\"\n | \"shotview\" | \"shotfullpage\" | \"shotelement\" | \"shotregion\" | \"contactsheet\"\n | \"capturepdf\" | \"recordscreen\" | \"captureaudio\" | \"captureframe\" | \"downloadimages\"\n | \"shotcanvas\" | \"probestream\" | \"readmedia\" | \"readassets\" | \"timelapse\" | \"convertimage\" | \"makethumbs\";\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\" | \"navigation\" | \"redirect\" | \"auth\" | \"prefetch\" | \"rate\" | \"group\" | \"layout\" | \"discard\" | \"badge\" | \"fill\" | \"submit\" | \"consent\" | \"handoff\" | \"scrape\" | \"export\" | \"stream\" | \"provenance\" | \"resume\" | \"intercept\" | \"clipboard\" | \"quarantine\" | \"cleanup\" | \"capture\" | \"media\";\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, with the capture kinds the active tab grant already covers. */\nexport interface capabilityreport {\n tabs: boolean;\n downloads: boolean;\n clipboardread: boolean;\n clipboardwrite: boolean;\n /** Capture kinds listed among the available capabilities because they need no optional permission beyond the active tab. */\n captures?: string[];\n /** Media capture part two kinds listed among the available capabilities. */\n media?: string[];\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 /** User configured ceiling on concurrent task tabs; an absent value never refuses a tab. */\n tasktabceiling?: number;\n /** Retention window for exported data artifacts; an absent value keeps every artifact. */\n artifactretention?: number;\n /** Retention window for captured network log records; an absent value keeps every record. */\n netlogretention?: number;\n /** Retention window for stored capture bytes; an absent value keeps every byte and the metadata always survives. */\n captureretention?: number;\n /** Retention window for stored media bytes such as pdf documents, frames, canvases and recordings; an absent value keeps every byte. */\n mediaretention?: number;\n /** Recording duration window in milliseconds for recordscreen and captureaudio; an absent window leaves the duration to the reviewed step options. */\n recordingwindow?: number;\n /** Capture policy of the run: off, manual, annotated or beforeafter state pairs around actions. */\n capturepolicy?: capturepolicy;\n /** True when the pinned control tab with the live task feed stays open. */\n controltab?: boolean;\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 /** Tabs assigned to the running task so progress tracks work across its tabs. */\n tasktabs?: number[];\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\n/** Reviewed navigation target with its url, container, position and private flag. */\nexport interface navtarget {\n url: string;\n container: \"current\" | \"tab\" | \"window\" | \"private\";\n position?: \"adjacent\" | \"end\";\n private: boolean;\n}\n\n/** Reviewed per origin override of one wait profile. */\nexport interface waitoverride {\n origin: string;\n signals?: string[];\n idle?: number;\n timeout?: number;\n}\n\n/** Reviewed wait profile with load signals, thresholds and per origin overrides. */\nexport interface waitprofile {\n signals: string[];\n idle?: number;\n timeout?: number;\n overrides?: waitoverride[];\n}\n\n/** Reviewed url pattern with a match mode plus required query and fragment parts. */\nexport interface urlpattern {\n mode: \"exact\" | \"prefix\" | \"host\" | \"pattern\";\n url: string;\n query?: Record<string, string>;\n fragment?: string;\n}\n\n/** One redirect hop of a redirect chain with its url, status and timestamp. */\nexport interface redirecthop {\n url: string;\n status: number;\n at: number;\n}\n\n/** One observed redirect chain with hops, statuses and timing. */\nexport interface redirectchain {\n hops: redirecthop[];\n startedat: number;\n endedat: number;\n}\n\n/** One navigation trail entry with url, title, step ref and timestamp. */\nexport interface trailentry {\n url: string;\n title: string;\n stepid?: string;\n at: number;\n}\n\n/** Reviewed per domain navigation rate limit with a window and a user configured ceiling. */\nexport interface ratelimit {\n domain: string;\n window: number;\n ceiling: number;\n}\n\n/** Live navigation state of a tab: load phase, final url and redirect chain. */\nexport interface navstate {\n phase: \"idle\" | \"loading\" | \"interactive\" | \"complete\";\n finalurl?: string;\n redirects?: redirectchain;\n}\n\n/** One stored wait profile applied per origin with user configured values. */\nexport interface waitprofilerecord {\n origin: string;\n profile: waitprofile;\n at: number;\n}\n\n/** One stored navigation record with the redirect chain and final url of one navigation step. */\nexport interface navrecord {\n stepid: string;\n sessionid?: string;\n origin: string;\n finalurl: string;\n chain: redirectchain;\n at: number;\n}\n\n/** One recorded navigation intent detected from a plan, kept for audit review. */\nexport interface navintentrecord {\n id: string;\n intent: string;\n origin: string;\n sessionid?: string;\n stepid?: string;\n at: number;\n}\n\n/** One rate limit window state per domain with the reviewed limit and the hit count. */\nexport interface ratelimitstate {\n domain: string;\n limit: ratelimit;\n openedat: number;\n count: number;\n}\n\n/** One curated link of a batch open list with its safety verdict and review state. */\nexport interface curatedlink {\n url: string;\n verdict: \"safe\" | \"unsafe\" | \"unknown\";\n reasons: string[];\n}\n\n/** One curated link list stored with its review state before batch opening. */\nexport interface curatedlist {\n id: string;\n links: curatedlink[];\n reviewedat?: number;\n at: number;\n}\n\n/** Reviewed basic auth credentials for one origin, stored only after explicit review. */\nexport interface authrecord {\n origin: string;\n username: string;\n password: string;\n reviewedat: number;\n}\n\n/** One url safety verdict produced by a checksafe verification. */\nexport interface safetyverdict {\n url: string;\n safe: boolean;\n reasons: string[];\n at: number;\n}\n\n/** One task artifact routed into the artifact store by a printpdf step. */\nexport interface artifactrecord {\n id: string;\n kind: string;\n name: string;\n stepid: string;\n at: number;\n}\n\n/** Navigation control state: paused navigation while a consent prompt is open. */\nexport interface navcontrol {\n pausedat?: number;\n reason?: string;\n updatedat: number;\n}\n\n/** One recently closed tab remembered so a reopentab step can restore it. */\nexport interface recenttab {\n url: string;\n tabid: number;\n closedat: number;\n}\n\n/** Queued navigation targets of prefetch and batch open steps, shown in the popup badge. */\nexport interface navqueues {\n prefetch: number;\n batchopen: number;\n updatedat: number;\n}\n\n/** Reviewed tab query with url, title, id and pattern matchers resolved against the live tab set. */\nexport interface tabquery {\n url?: string;\n title?: string;\n id?: number;\n pattern?: string;\n}\n\n/** Reviewed tab group definition with name, color, member tabs and collapse state. */\nexport interface tabgroupspec {\n name: string;\n color: string;\n tabids: number[];\n collapsed: boolean;\n}\n\n/** One stored tab group definition with its color choice and member tabs. */\nexport interface tabgrouprecord {\n groupid: string;\n name: string;\n color: string;\n tabids: number[];\n collapsed: boolean;\n savedat: number;\n}\n\n/** Window bounds of one window state or saved layout. */\nexport interface windowbounds {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/** Live or saved window state with bounds, maximize state and profile kind. */\nexport interface windowstate {\n bounds: windowbounds;\n maximized: boolean;\n profile: \"normal\" | \"incognito\" | \"scratch\";\n}\n\n/** One tab position inside a saved layout, carrying its window and pin state. */\nexport interface layouttab {\n url: string;\n title: string;\n pinned: boolean;\n index: number;\n windowid: number;\n}\n\n/** One saved tab layout with name, tabs, groups, positions and window bounds. */\nexport interface tablayout {\n name: string;\n tabs: layouttab[];\n groups: tabgroupspec[];\n windows: Array<{ windowid: number; state: windowstate }>;\n savedat: number;\n}\n\n/** Per tab task metadata with task refs, provenance and free text labels. */\nexport interface tabmeta {\n tabid: number;\n taskrefs: string[];\n provenance: string;\n labels: string[];\n at: number;\n}\n\n/** One per tab task status badge set by a badgetab step or refreshed from live progress. */\nexport interface tabbadge {\n tabid: number;\n taskid: string;\n label: string;\n setat: number;\n}\n\n/** One tab report entry carrying audio state and metadata per tab. */\nexport interface tabreportentry {\n tabid: number;\n url: string;\n title: string;\n index: number;\n windowid: number;\n active: boolean;\n pinned: boolean;\n audible: boolean;\n muted: boolean;\n discarded: boolean;\n meta?: tabmeta;\n}\n\n/** Tab report payload with matched tabs, groups and badges. */\nexport interface tabreport {\n matches: tabreportentry[];\n groups: tabgroupspec[];\n badges: tabbadge[];\n}\n\n/** One session snapshot of tabs and windows captured for later restore. */\nexport interface sessionsnapshot {\n id: string;\n sessionid?: string;\n layout: tablayout;\n capturedat: number;\n}\n\n/** One closed tab history entry kept for restoretab and reopenrun. */\nexport interface closedtab {\n url: string;\n title: string;\n tabid: number;\n windowid: number;\n closedat: number;\n}\n\n/** One tab event observed inside a reviewed watchtab registration. */\nexport interface tabwatchevent {\n watchid: string;\n event: \"title\" | \"activated\" | \"closed\";\n tabid: number;\n detail?: string;\n at: number;\n}\n\n/** Pinned control tab state carrying the live task feed. */\nexport interface controltabstate {\n tabid: number;\n enabled: boolean;\n updatedat: number;\n}\n\n/** Field kinds the form family recognizes across inputs, selects, checks and specialized payment fields. */\nexport type fieldkind = \"text\" | \"email\" | \"phone\" | \"date\" | \"number\" | \"select\" | \"check\" | \"radio\" | \"file\" | \"password\" | \"card\" | \"code\";\n\n/** Reviewed field match addressing one control by label, placeholder, aria label or name. */\nexport interface fieldmatch {\n mode: \"label\" | \"placeholder\" | \"arialabel\" | \"name\";\n label?: string;\n placeholder?: string;\n arialabel?: string;\n name?: string;\n}\n\n/** One reviewed form field entry pairing a field match with its kind and value. */\nexport interface formentry {\n match: fieldmatch;\n kind: fieldkind;\n value: string;\n}\n\n/** A reviewed structured form record with field entries, kinds and values. */\nexport interface formrecord {\n form?: string;\n entries: formentry[];\n}\n\n/** Reviewed value generation rules for one field kind with locale and seed choices. */\nexport interface valuegen {\n kind: fieldkind;\n locale?: string;\n seed?: number;\n}\n\n/** One saved form profile with a reviewed name, field entries and the origin grants it is bound to. */\nexport interface formprofile {\n name: string;\n fields: formentry[];\n grants: string[];\n savedat: number;\n}\n\n/** Live wizard state with the step index, the total steps and the per step completion flags. */\nexport interface wizardstate {\n index: number;\n steps: number;\n completed: boolean[];\n at: number;\n}\n\n/** One submission ticket with the form ref, the values hash and the consent ref of its asksubmit approval. */\nexport interface submitticket {\n id: string;\n form: string;\n valueshash: string;\n consentref: string;\n approved?: boolean;\n at: number;\n}\n\n/** One validation error message associated with a field ref. */\nexport interface fielderror {\n field: string;\n message: string;\n}\n\n/** One collected error report of a form, kept for correction loops. */\nexport interface errorreport {\n form: string;\n errors: fielderror[];\n at: number;\n}\n\n/** One captcha handoff record with its resolution state while the plan waits for the user. */\nexport interface captchahandoff {\n id: string;\n origin: string;\n resolved: boolean;\n openedat: number;\n resolvedat?: number;\n}\n\n/** One login or template detection stored per origin with the matched markers. */\nexport interface detectionrecord {\n origin: string;\n kind: \"login\" | \"signup\" | \"checkout\";\n markers: string[];\n at: number;\n}\n\n/** One typeahead pick recorded when a reviewed suggestion entry was chosen. */\nexport interface typeaheadpick {\n field: string;\n query: string;\n pick: string;\n at: number;\n}\n\n/** Form report payload with the detected fields, their kinds and the matched controls. */\nexport interface formreport {\n form: string;\n fields: Array<{ selector: string; label: string; kind: fieldkind; matched: boolean }>;\n}\n\n/** One scraped or imported dataset column with a stable key, its label, its value kind and the normalized name. */\nexport interface columnspec {\n key: string;\n label: string;\n kind: \"text\" | \"number\";\n normalized: string;\n}\n\n/** One dataset row keyed by column keys. */\nexport type datasetrow = Record<string, string>;\n\n/** One source reference attaching a row index to its url, timestamp and step ref. */\nexport interface sourceref {\n row: number;\n url: string;\n at: number;\n stepid?: string;\n}\n\n/** One structured dataset with column specs, rows and source refs; row counts stay user configured with no code ceiling. */\nexport interface dataset {\n id: string;\n name: string;\n columns: columnspec[];\n rows: datasetrow[];\n sources: sourceref[];\n at: number;\n}\n\n/** One reviewed transform rule applying an expression to source columns and writing the target column. */\nexport interface transformrule {\n expression: string;\n sources: string[];\n target: string;\n}\n\n/** One extraction session tracking visited pages, collected rows and the resume cursor. */\nexport interface extractsession {\n id: string;\n datasetid: string;\n name: string;\n target: string;\n next: string;\n planned: number;\n pages: string[];\n rows: number;\n cursor: number;\n done?: boolean;\n startedat: number;\n updatedat: number;\n}\n\n/** One provenance record of an exported artifact with its url, timestamp, step ref, row range and checksum. */\nexport interface provenancerecord {\n artifact: string;\n name: string;\n url: string;\n stepid: string;\n rowstart: number;\n rowend: number;\n checksum: string;\n at: number;\n}\n\n/** One exported data artifact kept in the task artifact store with its content and checksum. */\nexport interface exportedartifact {\n id: string;\n kind: \"csv\" | \"json\" | \"excel\";\n name: string;\n stepid: string;\n rowcount: number;\n content: string;\n checksum: string;\n at: number;\n}\n\n/** One streaming export state with chunk and written row counters persisted for resume. */\nexport interface streamstate {\n datasetid: string;\n name: string;\n chunk: number;\n chunks: number;\n written: number;\n done?: boolean;\n at: number;\n}\n\n/** One reviewed sheet endpoint configuration stored behind its origin grant. */\nexport interface sheetendpoint {\n endpoint: string;\n origin: string;\n configuredat: number;\n}\n\n/** Transform rules and dedupe keys remembered per task between extraction and export. */\nexport interface taskrules {\n taskid: string;\n transforms: transformrule[];\n dedupekeys: string[];\n at: number;\n}\n\n/** One reviewed batch download specification with its url list, filename rule and completion criteria. */\nexport interface downloadspec {\n urls: string[];\n filename?: string;\n complete?: \"size\" | \"checksum\";\n}\n\n/** Per file states of the batch download queue. */\nexport type downloadstate = \"queued\" | \"running\" | \"paused\" | \"complete\" | \"failed\";\n\n/** One batch download file record with its state, resolved path and checksum; concurrent windows stay user configured with no code ceiling. */\nexport interface downloadrecord {\n id: string;\n url: string;\n filename: string;\n state: downloadstate;\n downloadid?: number;\n path?: string;\n bytes?: number;\n checksum?: string;\n at: number;\n updatedat: number;\n}\n\n/** Reviewed mime interception filter with include and exclude patterns and a deny default for unlisted mime types. */\nexport interface mimefilter {\n include: string[];\n exclude: string[];\n default: \"deny\" | \"allow\";\n}\n\n/** One captured network log record with url, method, status, timing and step correlation through its request id. */\nexport interface netlogrecord {\n url: string;\n method: string;\n status: number;\n timing: number;\n requestid?: string;\n stepid: string;\n at: number;\n /** Captured header names; exported netlogs always carry their values redacted. */\n headers?: Record<string, string>;\n}\n\n/** One clipboard entry with its kind, payload hash and origin provenance; the payload text never persists. */\nexport interface clipentry {\n kind: \"read\" | \"write\" | \"screen\";\n hash: string;\n length: number;\n origin: string;\n stepid: string;\n at: number;\n}\n\n/** Verdicts of the configured virus scanning hooks. */\nexport type scanverdict = \"pending\" | \"clean\" | \"flagged\" | \"error\";\n\n/** One quarantined download kept outside the downloads folder with its reason, scan state and release ref. */\nexport interface quarantineentry {\n id: string;\n path: string;\n reason: string;\n scan: scanverdict;\n release?: string;\n at: number;\n updatedat: number;\n}\n\n/** One consistent capture filename stamped from task, step and sequence parts. */\nexport interface capturename {\n task: string;\n step: string;\n sequence: number;\n}\n\n/** One reviewed artifact cleanup rule with an age window, an artifact kind and a keep policy. */\nexport interface cleanuprule {\n age: number;\n kind: string;\n keep: \"none\" | \"latest\" | \"all\";\n}\n\n/** One clipboard consent record with its prompt, origin and single use approval state; every clipboard read needs its own approved prompt. */\nexport interface clipboardconsentrecord {\n id: string;\n prompt: string;\n origin: string;\n stepid: string;\n approved?: boolean;\n usedat?: number;\n at: number;\n}\n\n/** One user configured virus scanning hook endpoint stored behind its origin grant. */\nexport interface scanhookconfig {\n scanner: string;\n endpoint: string;\n origin: string;\n configuredat: number;\n}\n\n/** One stored capture naming counter per task and step base. */\nexport interface capturecounter {\n taskid: string;\n counters: Record<string, number>;\n at: number;\n}\n\n/** One artifact inventory entry for the cleanup sweeper with its size and capture time. */\nexport interface artifactinventoryentry {\n id: string;\n kind: string;\n name: string;\n size: number;\n at: number;\n}\n\n/** One cleanup run history record with the applied rule count and the removed and kept artifact counts. */\nexport interface cleanuprun {\n id: string;\n rules: number;\n removed: number;\n kept: number;\n at: number;\n}\n\n/** Formats a reviewed capture may produce; anything outside this set is refused. */\nexport type captureformat = \"png\" | \"jpeg\" | \"webp\";\n\n/** Export targets a reviewed capture may route to: session memory, the reviewed download flow or the clipboard. */\nexport type captureexport = \"memory\" | \"download\" | \"clipboard\";\n\n/** Capture policy modes: captures off, manual shots only, annotated evidence or before and after state pairs around actions. */\nexport type capturepolicy = \"off\" | \"manual\" | \"annotated\" | \"beforeafter\";\n\n/** Reviewed capture options: format, quality, pixel ratio, annotation flag and export target; every bound stays a user choice. */\nexport interface captureoptions {\n format?: captureformat;\n /** Jpeg and webp quality between zero and one hundred; any value in the format range is a user choice with no code cap. */\n quality?: number;\n /** Output scale from one up to any user configured ceiling with no code ceiling. */\n pixelratio?: number;\n annotate?: boolean;\n exporttarget?: captureexport;\n}\n\n/** One reviewed rectangle of the page in css pixels. */\nexport interface regionrect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** One planned viewport tiling of a full page capture: tile grid, scroll offsets and overlap rows. */\nexport interface stitchplan {\n columns: number;\n rows: number;\n tiles: Array<{ x: number; y: number }>;\n overlap: number;\n scrollwidth: number;\n scrollheight: number;\n viewportwidth: number;\n viewportheight: number;\n}\n\n/** Reviewed contact sheet layout: cell size, column count and label style; cell counts stay user choice only. */\nexport interface sheetlayout {\n cellsize: number;\n columns: number;\n label: \"none\" | \"index\" | \"selector\" | \"both\";\n}\n\n/** Reviewed capture naming rule choosing which filename segments participate. */\nexport interface capturenaming {\n run: boolean;\n step: boolean;\n sequence: boolean;\n kind: boolean;\n}\n\n/** One stored screen capture record with its run, step, kind, format, geometry and capture time. */\nexport interface shotrecord {\n id: string;\n runid: string;\n stepid: string;\n kind: string;\n format: captureformat;\n width: number;\n height: number;\n capturedat: number;\n /** Stored image bytes as a data url while the retention window still covers the record. */\n bytes?: string;\n name?: string;\n annotated?: boolean;\n exporttarget?: captureexport;\n target?: string;\n /** True once the retention window expired the bytes; the metadata stays for the audit trail. */\n bytesexpired?: boolean;\n}\n\n/** One before and after state pair linked to the action it wraps, with the dom snapshot id of the same moment. */\nexport interface shotpair {\n id: string;\n beforeid: string;\n afterid: string;\n actionkind: string;\n target?: string;\n domsnapshotid?: string;\n at: number;\n}\n\n/** One stored pdf document record of a capturepdf step with its page count, reviewed page size, margins and byte size. */\nexport interface pdfrecord {\n id: string;\n runid: string;\n stepid: string;\n pages: number;\n /** Paper size in pdf points after the landscape swap. */\n pagewidth: number;\n pageheight: number;\n margins: { top: number; right: number; bottom: number; left: number };\n landscape: boolean;\n scale: number;\n bytes: number;\n at: number;\n /** Stored pdf bytes as a data url while the retention window still covers the record. */\n dataurl?: string;\n name?: string;\n /** True once the retention window expired the bytes; the metadata stays for the audit trail. */\n bytesexpired?: boolean;\n}\n\n/** Reviewed pdf print options: paper width and height in inches, margins in inches, scale, landscape and the paginate flag; every bound stays a user choice with no code cap. */\nexport interface pdfoptions {\n paperwidth?: number;\n paperheight?: number;\n margins?: { top: number; right: number; bottom: number; left: number };\n scale?: number;\n landscape?: boolean;\n paginate?: boolean;\n}\n\n/** One stored recording of user activity with its tab, start and end times, format and duration; the frame index survives the byte expiry. */\nexport interface recordingrecord {\n id: string;\n runid: string;\n stepid: string;\n tabid: number;\n kind: \"screen\" | \"audio\";\n scope: \"tab\" | \"run\";\n format: string;\n startedat: number;\n endedat?: number;\n duration?: number;\n fps?: number;\n bitrate?: number;\n audio?: boolean;\n /** Ordered frame capture ids of a derived frame sequence recording. */\n frames?: string[];\n /** File reference of the finished artifact routed through the reviewed download flow. */\n file?: string;\n at: number;\n /** Byte size of the derived artifact manifest while the retention window still covers the record. */\n bytes?: number;\n bytesexpired?: boolean;\n}\n\n/** Reviewed recording options: scope tab or run, fps, bitrate and the audio flag; fps and bitrate stay user choices with no code ceiling. */\nexport interface recordingoptions {\n scope?: \"tab\" | \"run\";\n fps?: number;\n bitrate?: number;\n audio?: boolean;\n}\n\n/** One still frame grabbed from a video element with its source element, reviewed timestamp and poster flag. */\nexport interface framerecord {\n id: string;\n runid: string;\n stepid: string;\n source: string;\n timestamp: number;\n poster: boolean;\n format: captureformat;\n width: number;\n height: number;\n at: number;\n dataurl?: string;\n name?: string;\n bytesexpired?: boolean;\n}\n\n/** One image observed on the page with its url, alt text, dimensions, byte size and mime type. */\nexport interface imagedescriptor {\n url: string;\n alt: string;\n width: number;\n height: number;\n bytes: number;\n mime: string;\n}\n\n/** Reviewed image filter: selector scope, minimum dimensions and a format list; batch sizes and thresholds stay user choices with no code ceilings. */\nexport interface imagefilter {\n selector?: string;\n minwidth?: number;\n minheight?: number;\n formats?: string[];\n}\n\n/** One captured canvas content record with its element, context kind and data url. */\nexport interface canvasrecord {\n id: string;\n runid: string;\n stepid: string;\n element: string;\n context: \"2d\" | \"webgl\";\n width: number;\n height: number;\n format: captureformat;\n at: number;\n dataurl?: string;\n name?: string;\n bytesexpired?: boolean;\n}\n\n/** One webrtc media stream probe record with its kind, track count, label and live flag. */\nexport interface streamrecord {\n id: string;\n runid: string;\n stepid: string;\n kind: string;\n tracks: number;\n label: string;\n live: boolean;\n at: number;\n /** Track details of the probe: kind, label, settings and ready state. */\n detail?: Array<{ kind: string; label: string; width?: number; height?: number; framerate?: number; state: string }>;\n}\n\n/** One embedded media source datum with its source url, mime type, duration, dimensions and codecs. */\nexport interface mediadatum {\n url: string;\n mime: string;\n duration: number;\n width: number;\n height: number;\n codecs: string;\n tracks: string[];\n}\n\n/** One collected page asset of kind favicon or logo with its url and byte size. */\nexport interface assetrecord {\n id: string;\n runid: string;\n stepid: string;\n kind: \"favicon\" | \"logo\";\n url: string;\n bytes: number;\n /** Declared icon sizes of the asset, for example 32x32 or any. */\n sizes?: string;\n at: number;\n}\n\n/** Reviewed time lapse plan: interval, duration and output format; both windows stay user choices with no code ceilings. */\nexport interface lapseplan {\n interval: number;\n duration: number;\n format: captureformat;\n}\n\n/** Reviewed image conversion directive: source format, target format and quality. */\nexport interface convertdirective {\n source?: captureformat;\n target: captureformat;\n quality?: number;\n}\n\n/** Reviewed thumbnail directive: size, fit and naming suffix; sizes stay user choices with no fixed set. */\nexport interface thumbdirective {\n size: number;\n fit: \"cover\" | \"contain\";\n suffix: string;\n}\n\n/** One image batch observed by downloadimages with its filter match counts and the observed image descriptors. */\nexport interface imagebatch {\n id: string;\n runid: string;\n stepid: string;\n images: imagedescriptor[];\n matched: number;\n downloaded: number;\n at: number;\n}\n\n/** One recording consent decision persisted per origin; every recordscreen and captureaudio start needs its own approved prompt. */\nexport interface recordingconsentrecord {\n id: string;\n prompt: string;\n origin: string;\n stepid: string;\n approved?: boolean;\n usedat?: number;\n at: number;\n}\n\n/** The union of media records stored per run: pdf documents, recordings, video frames, canvas contents, stream probes and page assets. */\nexport type mediarecord = pdfrecord | recordingrecord | framerecord | canvasrecord | streamrecord | assetrecord;\n", "import { actionrisk, parseoptions, submitreviewgranted, validatestep } from \"./policy.js\";\nimport { protocolversion, type agentplan, type bannerreport, type clickablemap, type dataset, type downloadrecord, type errorreport, type extractsession, type focusevent, type formreport, type imagebatch, type keyholdstate, type mediarecord, type mutationevent, type navstate, type netlogrecord, type observation, type pagesignals, type planproposal, type proposalrequest, type provenancerecord, type quarantineentry, type resolvedtarget, type safetyverdict, type selectorcandidate, type shotpair, type shotrecord, type snapshotdiff, type stepoutcome, type tablayout, type tabreport, type toolstep, type trailentry, type transformrule, type typeaheadpick, type wizardstate } 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 * - navigation kinds carry the navigation parameter grammar: `navtarget` with a `url`, a `container` (`current`, `tab`, `window` or `private`), a `position` (`adjacent` or `end`) and a `private` flag; `waitprofile` with non-empty load `signals`, optional `idle` and `timeout` thresholds and per origin `overrides`; and `urlpattern` with a `mode` (`exact`, `prefix`, `host` or `pattern`), a `url`, optional `query` parameter expectations and an optional `fragment`.\n * - `waiturl` and `spawait` carry a reviewed `urlpattern`, `timeout` and `poll`; `spanav` carries an optional `routepattern`, `followlink` an optional `fragment` flag, `rewritequery` reviewed `set` and `remove` query edits, `navlist`/`prefetch`/`batchopen` reviewed `urls` lists, `preconnect` reviewed `origins`, `navrate` a reviewed `ratelimit` with `domain`, `window` and `ceiling` (never capped in code), and `deeplink` a reviewed `app` pattern with `params`.\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 * - navigation steps attach structured evidence to step details: load phases and ready states, final urls after redirects, redirect chains with statuses and timing, http error, offline and certificate interstitial states, safety verdicts and navlist entry completions.\n * - the tabs and windows command family adds its parameter grammar: `tabquery` with url, title, id and pattern matchers (at least one matcher required, patterns use `*` and `**` wildcards); `group` with a `name`, a Chromium tab group `color`, member `tabids` and a `collapsed` flag; `layout` names for `savelayout` and `restorelayout`; reviewed `pinned`, `muted`, `index`, `windowid`, `direction`, `step`, `bounds`, `label`, `labels`, `taskrefs`, `provenance` and `run` fields; `tabcreate` gains reviewed `background` and `window` options and `windowcreate` gains reviewed `left`, `top`, `width`, `height` and `state` options; `closepattern` requires the explicit `reviewed` flag before any tab closes.\n * - tab command steps attach structured evidence to step details: tab reports with matched tabs carrying audio state and metadata, group registries, badge states, layout snapshots, clone warnings, discard candidates and watchtab event records.\n * - the forms and data family adds its parameter grammar: `formrecord` with an optional `form` selector and non-empty `entries` of `{ match, kind, value }` where `match` is a `fieldmatch` with `mode` one of `label`, `placeholder`, `arialabel` or `name`; `valuegen` with a field `kind`, an optional `locale` and an optional numeric `seed`; `fields` lists of label or placeholder value pairs for filllabel and fillplaceholder; a reviewed `name` plus `formrecord` for saveprofiles; a reviewed `consentref` for submitform and consentpassword; a reviewed `backoff` rule with `wait` and `factor` plus an optional `attempts` for retryform with no code ceiling; a reviewed `child` selector, `pick` entry, `pause` and `timeout` for chains, typeaheads and card typing; reviewed card `segments`; and a reviewed `source` for fillcode; password entries inside form records are refused because passwords need the explicit consentpassword consent.\n * - form steps attach structured evidence to step details: form reports with detected fields, kinds and matched controls, error reports with field refs and messages, wizard states with step history, typeahead picks, honeypot flags, login detections with session link markers and signup or checkout template detections.\n * - the forms and data part two family adds its parameter grammar: `scrapetable` and `paginateextract` carry an optional dataset `name`, an optional positive integer `rowlimit` (never capped in code), a reviewed `next` control selector, an optional positive integer `pages` count (never capped in code) and an optional `wait` row freshness window; the export kinds (`exportcsv`, `exportjson`, `exportexcel`, `copytable`, `streamdisk`, `pushsheets`) carry a reviewed `dataset` id, an optional artifact `name`, an optional single character csv `delimiter`, a reviewed positive integer streaming `chunk` size (never capped in code) and, for sheet pushes, a reviewed HTTPS `sheet` endpoint plus the explicit `reviewed` flag; `importcsv` carries reviewed `csv` text with an optional `name` and a `mapping` object of csv headers to target keys; `looprows` carries a reviewed `dataset` id, an optional row `variable` name and a wrapped inner step by `stepid` or inline; `transformvalues` carries reviewed `rules` of `{ expression, sources, target }` where the expression is `trim`, `upper`, `lower`, `number`, `prefix:x`, `suffix:x` or `replace:from=>to`; `deduperows` carries reviewed dedupe `keys`; `mergepages` carries a reviewed `datasets` id list; `stamplerows` carries a reviewed `dataset` id with an optional `url`; `previewgrid` carries a reviewed `dataset` id with an optional `sample` row count (never capped in code); `resumeextract` carries a reviewed `session` id; and `logprovenance` carries a reviewed `artifact` id or name.\n * - data steps attach structured evidence to step details: scraped grids with normalized column specs, span filled rows and nested child datasets, pagination page counts with remaining next controls, dataset previews with sampled rows, dedupe removed counts, transform error lists, stream chunk states and provenance records with checksums and row ranges.\n * - the files, clipboard and downloads family adds its parameter grammar: `batchdownload` carries a reviewed `downloadspec` with a non-empty `urls` list, an optional `filename` rule and an optional `complete` criterion (`size` or `checksum`) plus an optional positive integer `concurrent` window (never capped in code); `pausedownload`, `resumedownload`, `verifydownload`, `quarantinedownload` and `scanvirus` carry a reviewed download or quarantine reference with optional `checksum`, `bytes`, `scanner` and `reason` fields; `interceptmime` carries a reviewed `mimefilter` with non-empty `include` patterns, optional `exclude` patterns and the `deny` or `allow` default for unlisted mime types; `readclipboard` carries a reviewed `consentref` plus an optional `prompt`; `exportnetlog` carries an optional `stepid` filter; `namecaptures` carries a reviewed `task` with optional `steps` and `extension`; and `cleanupartifacts` carries reviewed `rules` of `{ age, kind, keep }` where the age window carries no code ceiling and the keep policy is `none`, `latest` or `all`.\n * - files steps attach structured evidence to step details: batch download reports with per file states, resolved paths and checksums, verification match results, netlog records correlated with steps through request ids, clipboard entries with payload hashes and origin provenance (the payload text never appears), quarantine entries with scan verdicts and release refs, capture names stamped from task, step and sequence parts, and cleanup run outcomes with removed and kept counts.\n * - the media capture family adds its parameter grammar: every capture kind (`shotview`, `shotfullpage`, `shotelement`, `shotregion`, `contactsheet`) carries a reviewed `capture` options object with `format` (`png`, `jpeg` or `webp`), `quality` between zero and one hundred, `pixelratio` from one up with no code ceiling, an `annotate` flag and an `exporttarget` of `memory`, `download` or `clipboard`; `shotfullpage` adds reviewed `settle`, `overlap` and `wait` windows that keep the stitching scroll budget inside the reviewed wait window; `shotelement` addresses its element through the step target; `shotregion` requires a reviewed `regionrect` of `x`, `y`, `width` and `height` in css pixels plus the explicit `reviewed` flag, with an optional scrollable `container` selector and `steps` count; `contactsheet` carries reviewed `elements` selectors with an optional `sheet` layout of `cellsize`, `columns` and `label` (`none`, `index`, `selector` or `both`); and a reviewed `naming` rule of `run`, `step`, `sequence` and `kind` segment flags extends the 1.1.39 capture naming rule with the capture kind segment.\n * - capture steps attach structured evidence to step details: shotrecords with record id, run, step, kind, format, geometry and byte size, the stitch tile count of full page captures, shotpair ids of before and after state captures with their action kind, target selector and dom snapshot id, and contact sheet cells with selector labels; the response envelope gains a capture block with the record id, format and byte size, and the capture report carries every stored record and pair.\n * - the media capture part two family adds its parameter grammar: `capturepdf` carries reviewed `pdf` options of `paperwidth` and `paperheight` inches (positive, never capped in code), `margins` of `top`, `right`, `bottom` and `left` inches (negative margins are refused), a positive `scale`, `landscape` and `paginate` flags, optional reviewed break point `selectors` and an `exporttarget` of memory or download; `recordscreen` and `captureaudio` carry reviewed `recording` options of `scope` (`tab` or `run`), positive `fps` and `bitrate` values with no code ceilings, an `audio` flag, a positive `duration` window and a reviewed `consentref` of an approved recording consent prompt; `captureframe` addresses a video element through the step target with an optional `timestamp` in seconds and a `poster` flag; `downloadimages` carries a reviewed `imagefilter` of `selector` scope, `minwidth` and `minheight` thresholds and a `formats` list plus an optional `naming` rule; `shotcanvas` addresses a canvas element through the step target with reviewed capture options; `probestream` carries an optional scope `selector`; `readmedia` and `readassets` carry no parameters; `timelapse` carries a reviewed `lapse` plan of positive `interval` and `duration` windows with a `format` and the lapse duration kept inside the reviewed `wait` budget; `convertimage` carries reviewed `capture` or `captures` ids plus a `convert` directive of `source`, `target` (png, jpeg or webp) and `quality`; and `makethumbs` carries the same capture ids plus a `thumb` directive of positive `size`, `fit` (cover or contain) and `suffix`.\n * - media steps attach structured evidence to step details: pdf records with page count, paper size, margins and byte size, recording records with ids, durations, frame counts and file refs, image batches with filter match counts and deduplicated url lists, frame records with source, timestamp and poster flag, canvas records with context kind, stream probe results with track details, asset lists and ordered lapse frame ids; the response envelope gains a media block with the record id, kind and byte size, and the media report carries every stored media record and image batch.\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\" && step.kind !== \"looprows\") continue;\n const options = parseoptions(step);\n if (typeof options.stepid === \"string\" && !steps.some(candidate => candidate.id === options.stepid)) throw new Error(\"A retry, frame or loop wrapper references an unknown step id.\");\n }\n for (const step of steps) {\n if (step.kind !== \"submitform\" && step.kind !== \"retryform\") continue;\n const review = submitreviewgranted(steps, step.id);\n if (!review.allowed) throw new Error(review.reason);\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, the capture block of capture steps and the media block of media steps for review. */\nexport function outcomeresponse(input: { outcome: stepoutcome; plan: agentplan; resolvedtarget?: resolvedtarget; capture?: { id: string; format: string; bytes: number }; media?: { id: string; kind: string; bytes: number } }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, outcome: input.outcome, ...(input.resolvedtarget ? { resolvedtarget: input.resolvedtarget } : {}), ...(input.capture ? { capture: input.capture } : {}), ...(input.media ? { media: input.media } : {}) });\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\n/** Wraps the live navigation state with its load phase, final url and redirect chain in the versioned response envelope. */\nexport function navstateresponse(input: { navstate: navstate; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, navstate: input.navstate });\n}\n\n/** Carries the navigation trail of a session with its visited urls, titles and step refs in the session context envelope. */\nexport function trailreport(input: { sessionid?: string; trail: trailentry[] }): { version: typeof protocolversion; sessionid?: string; trail: trailentry[] } {\n return { version: protocolversion, ...(input.sessionid ? { sessionid: input.sessionid } : {}), trail: input.trail };\n}\n\n/** Wraps url safety verdicts with their reasons in the versioned response envelope for external link review. */\nexport function safetyresponse(input: { verdicts: safetyverdict[]; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, verdicts: input.verdicts });\n}\n\n/** Wraps one tab report with its matched tabs, groups and badges in the versioned response envelope. */\nexport function tabreportresponse(input: { report: tabreport; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, report: input.report });\n}\n\n/** Carries the saved tab layouts with their window bounds and group states in the session context envelope. */\nexport function layoutreport(input: { layouts: tablayout[] }): { version: typeof protocolversion; layouts: tablayout[] } {\n return { version: protocolversion, layouts: input.layouts };\n}\n\n/** Wraps one form report with the detected fields, their kinds and the matched controls in the versioned response envelope. */\nexport function formreportresponse(input: { report: formreport; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, report: input.report });\n}\n\n/** Wraps one collected error report with its field refs and messages in the versioned response envelope for correction loops. */\nexport function errorreportresponse(input: { report: errorreport; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, report: input.report });\n}\n\n/** Carries the wizard states with their step history and the recorded typeahead picks in the session context envelope. */\nexport function wizardreport(input: { sessionid?: string; wizards: wizardstate[]; picks: typeaheadpick[] }): { version: typeof protocolversion; sessionid?: string; wizards: wizardstate[]; picks: typeaheadpick[] } {\n return { version: protocolversion, ...(input.sessionid ? { sessionid: input.sessionid } : {}), wizards: input.wizards, picks: input.picks };\n}\n\n/** Wraps one dataset payload with its column specs and a sampled row list in the versioned response envelope. */\nexport function datasetresponse(input: { dataset: dataset; plan: agentplan; sample?: number }): string {\n const sample = Math.max(0, Math.floor(input.sample ?? 10));\n const payload = { ...input.dataset, rows: input.dataset.rows.slice(0, sample), totalrows: input.dataset.rows.length };\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, dataset: payload });\n}\n\n/** Carries the extraction progress with visited page counts, collected row counts and resume cursors in the session context envelope. */\nexport function extractionreport(input: { sessions: extractsession[] }): { version: typeof protocolversion; sessions: extractsession[] } {\n return { version: protocolversion, sessions: input.sessions };\n}\n\n/** Reports the provenance records of every exported artifact with its source url, step ref, row range and checksum in the session context envelope. */\nexport function provenancereport(input: { records: provenancerecord[] }): { version: typeof protocolversion; records: provenancerecord[] } {\n return { version: protocolversion, records: input.records };\n}\n\n/** Documents the reviewed transform rule grammar shared by transformvalues steps and the task rules store. */\nexport function transformgrammar(rules: transformrule[]): string {\n return JSON.stringify({ rules: rules.map(rule => ({ expression: rule.expression, sources: rule.sources, target: rule.target })) });\n}\n\n/** Wraps the batch download queue with per file states, resolved paths and checksums in the versioned response envelope. */\nexport function downloadreport(input: { downloads: downloadrecord[]; plan: agentplan }): string {\n return JSON.stringify({ version: protocolversion, planid: input.plan.id, planstate: input.plan.state, downloads: input.downloads });\n}\n\n/** Carries the captured network log records with their step correlation through request ids in the session context envelope. */\nexport function netlogreport(input: { records: netlogrecord[] }): { version: typeof protocolversion; records: netlogrecord[] } {\n return { version: protocolversion, records: input.records };\n}\n\n/** Carries the quarantine entries with their scan verdicts and release refs in the session context envelope. */\nexport function quarantinereport(input: { entries: quarantineentry[] }): { version: typeof protocolversion; entries: quarantineentry[] } {\n return { version: protocolversion, entries: input.entries };\n}\n\n/** Carries every stored capture record with its metadata and the before and after shotpairs of the run in the session context envelope. */\nexport function capturereport(input: { records: shotrecord[]; pairs: shotpair[] }): { version: typeof protocolversion; records: shotrecord[]; pairs: shotpair[] } {\n return { version: protocolversion, records: input.records, pairs: input.pairs };\n}\n\n/** Carries every stored media record of pdf documents, recordings, frames, canvases, stream probes and assets beside the observed image batches in the session context envelope. */\nexport function mediareport(input: { records: mediarecord[]; images: imagebatch[] }): { version: typeof protocolversion; records: mediarecord[]; images: imagebatch[] } {\n return { version: protocolversion, records: input.records, images: input.images };\n}\n", "import type { captureexport, captureformat, capturenaming, captureoptions, regionrect, sheetlayout, shotpair, shotrecord, stitchplan } from \"./types.js\";\n\n/**\n * Media capture logics for the 1.1.40 family.\n * Every correlated rule for the capture options defaults, the stitch tiling and seam blending, the fixed header skip, the pixel ratio scaling, the element crop and viewport fallback, the region container steps, the contact sheet grid, the annotation plan, the capture naming rule and the before and after state pairing lives in this file.\n */\n\n/** Formats every capture kind may produce; the policy grammar refuses anything outside this set. */\nexport const captureformats: captureformat[] = [\"png\", \"jpeg\", \"webp\"];\n\n/** Export targets a reviewed capture may route to; disk writes stay inside the reviewed download flow. */\nexport const capturetargets: captureexport[] = [\"memory\", \"download\", \"clipboard\"];\n\n/** The capture kinds of the 1.1.40 family, listed among the available capabilities of every proposal request. */\nexport const capturekinds: string[] = [\"shotview\", \"shotfullpage\", \"shotelement\", \"shotregion\", \"contactsheet\"];\n\n/** Normalizes reviewed capture options with png, pixel ratio one and the memory export target as defaults. */\nexport function captureoptionsof(value: unknown): captureoptions {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const options = value as Record<string, unknown>;\n const normalized: captureoptions = {};\n if (options.format === \"png\" || options.format === \"jpeg\" || options.format === \"webp\") normalized.format = options.format;\n if (typeof options.quality === \"number\" && Number.isFinite(options.quality)) normalized.quality = options.quality;\n if (typeof options.pixelratio === \"number\" && Number.isFinite(options.pixelratio)) normalized.pixelratio = options.pixelratio;\n if (typeof options.annotate === \"boolean\") normalized.annotate = options.annotate;\n if (options.exporttarget === \"memory\" || options.exporttarget === \"download\" || options.exporttarget === \"clipboard\") normalized.exporttarget = options.exporttarget;\n return normalized;\n}\n\n/** Builds one shotrecord for a visible viewport capture with the reviewed geometry and byte size. */\nexport function capturevisible(input: { runid: string; stepid: string; options: captureoptions; viewport: { width: number; height: number }; dataurl: string; at: number; id: string; name?: string; target?: string }): shotrecord {\n const ratio = input.options.pixelratio ?? 1;\n return {\n id: input.id,\n runid: input.runid,\n stepid: input.stepid,\n kind: \"shotview\",\n format: input.options.format ?? \"png\",\n width: Math.round(input.viewport.width * ratio),\n height: Math.round(input.viewport.height * ratio),\n capturedat: input.at,\n bytes: input.dataurl,\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.options.annotate === true ? { annotated: true } : {}),\n ...(input.options.exporttarget !== undefined ? { exporttarget: input.options.exporttarget } : {}),\n ...(input.target !== undefined ? { target: input.target } : {}),\n };\n}\n\n/** Builds one shotrecord for a stitched full page capture from the tile plan geometry. */\nexport function capturestitched(input: { runid: string; stepid: string; options: captureoptions; plan: stitchplan; dataurl: string; at: number; id: string; name?: string }): shotrecord {\n const ratio = input.options.pixelratio ?? 1;\n return {\n id: input.id,\n runid: input.runid,\n stepid: input.stepid,\n kind: \"shotfullpage\",\n format: input.options.format ?? \"png\",\n width: Math.round(input.plan.scrollwidth * ratio),\n height: Math.round(input.plan.scrollheight * ratio),\n capturedat: input.at,\n bytes: input.dataurl,\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.options.annotate === true ? { annotated: true } : {}),\n ...(input.options.exporttarget !== undefined ? { exporttarget: input.options.exporttarget } : {}),\n };\n}\n\n/** Builds one shotrecord for an element capture cropped to the pixel ratio scaled element bounds. */\nexport function captureelement(input: { runid: string; stepid: string; options: captureoptions; rect: regionrect; dataurl: string; at: number; id: string; name?: string; target?: string }): shotrecord {\n const ratio = input.options.pixelratio ?? 1;\n const scaled = scaledrect(input.rect, ratio);\n return {\n id: input.id,\n runid: input.runid,\n stepid: input.stepid,\n kind: \"shotelement\",\n format: input.options.format ?? \"png\",\n width: scaled.width,\n height: scaled.height,\n capturedat: input.at,\n bytes: input.dataurl,\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.options.annotate === true ? { annotated: true } : {}),\n ...(input.options.exporttarget !== undefined ? { exporttarget: input.options.exporttarget } : {}),\n ...(input.target !== undefined ? { target: input.target } : {}),\n };\n}\n\n/** Builds one shotrecord for a region capture of one reviewed rectangle or scrollable container. */\nexport function captureregion(input: { runid: string; stepid: string; options: captureoptions; rect: regionrect; dataurl: string; at: number; id: string; name?: string; target?: string }): shotrecord {\n const ratio = input.options.pixelratio ?? 1;\n const scaled = scaledrect(input.rect, ratio);\n return {\n id: input.id,\n runid: input.runid,\n stepid: input.stepid,\n kind: \"shotregion\",\n format: input.options.format ?? \"png\",\n width: scaled.width,\n height: scaled.height,\n capturedat: input.at,\n bytes: input.dataurl,\n ...(input.name !== undefined ? { name: input.name } : {}),\n ...(input.options.annotate === true ? { annotated: true } : {}),\n ...(input.options.exporttarget !== undefined ? { exporttarget: input.options.exporttarget } : {}),\n ...(input.target !== undefined ? { target: input.target } : {}),\n };\n}\n\n/** Links a before and an after shot into one shotpair with the action context and the dom snapshot id of the same moment; a missing after shot skips the pair. */\nexport function pairstates(before: shotrecord | undefined, after: shotrecord | undefined, action: { kind: string; target?: string; domsnapshotid?: string }, at: number, id: string): { pair?: shotpair; skipped?: \"before\" | \"after\"; reason: string } {\n if (!before) return { skipped: \"before\", reason: \"The before shot was not captured, so no state pair exists.\" };\n if (!after) return { skipped: \"after\", reason: `The action of kind ${action.kind} failed before the after shot, so the state pair is skipped.` };\n return {\n pair: {\n id,\n beforeid: before.id,\n afterid: after.id,\n actionkind: action.kind,\n ...(action.target !== undefined ? { target: action.target } : {}),\n ...(action.domsnapshotid !== undefined ? { domsnapshotid: action.domsnapshotid } : {}),\n at,\n },\n reason: `Paired the before shot ${before.id} with the after shot ${after.id} around the ${action.kind} action.`,\n };\n}\n\n/** Applies the capture policy around one action: beforeafter pairs wrap the action, every other mode leaves the pair to the manual capture kinds. */\nexport function capturestates(input: { policy: string; before?: shotrecord | undefined; after?: shotrecord | undefined; actionkind: string; target?: string | undefined; domsnapshotid?: string | undefined; at: number; id: string }): { pair?: shotpair; skipped?: \"before\" | \"after\"; reason: string } {\n if (input.policy !== \"beforeafter\") return { reason: `The ${input.policy} capture policy takes no state pair around the ${input.actionkind} action.` };\n return pairstates(input.before, input.after, { kind: input.actionkind, ...(input.target !== undefined ? { target: input.target } : {}), ...(input.domsnapshotid !== undefined ? { domsnapshotid: input.domsnapshotid } : {}) }, input.at, input.id);\n}\n\n/** Builds the viewport tiling of one full page capture: a tile grid of scroll offsets with overlap rows; the last tile clamps to the page end. */\nexport function buildstitchplan(input: { scrollwidth: number; scrollheight: number; viewportwidth: number; viewportheight: number; overlap?: number }): stitchplan {\n const overlap = Math.max(0, Math.round(input.overlap ?? 0));\n const stepy = Math.max(1, input.viewportheight - overlap);\n const columns = Math.max(1, Math.ceil(input.scrollwidth / input.viewportwidth));\n const rows = input.scrollheight <= input.viewportheight ? 1 : Math.max(1, Math.ceil((input.scrollheight - overlap) / stepy));\n const tiles: Array<{ x: number; y: number }> = [];\n for (let column = 0; column < columns; column += 1) {\n for (let row = 0; row < rows; row += 1) {\n const x = Math.min(column * input.viewportwidth, Math.max(0, input.scrollwidth - input.viewportwidth));\n const y = rows === 1 ? 0 : Math.min(row * stepy, Math.max(0, input.scrollheight - input.viewportheight));\n tiles.push({ x: Math.round(x), y: Math.round(y) });\n }\n }\n return { columns, rows, tiles, overlap, scrollwidth: Math.round(input.scrollwidth), scrollheight: Math.round(input.scrollheight), viewportwidth: Math.round(input.viewportwidth), viewportheight: Math.round(input.viewportheight) };\n}\n\n/** Linear cross fade weights across one overlap band: the first row keeps the existing content, the last row adopts the new tile. */\nexport function seamweights(overlap: number): number[] {\n if (overlap <= 0) return [];\n const weights: number[] = [];\n for (let index = 0; index < overlap; index += 1) weights.push((index + 1) / (overlap + 1));\n return weights;\n}\n\n/** Blends one overlap band of equal length row arrays with the linear seam weights so tile seams never hard cut. */\nexport function blendrows(upper: number[], lower: number[]): number[] {\n const weights = seamweights(upper.length);\n return upper.map((value, index) => {\n const weight = weights[index] ?? 1;\n return value * (1 - weight) + (lower[index] ?? value) * weight;\n });\n}\n\n/** True when a tile band repeats the first tile band, so the stitcher skips it and fixed headers never repeat across tiles. */\nexport function fixedheadermatch(band: number[], firstband: number[]): boolean {\n if (band.length === 0 || band.length !== firstband.length) return false;\n return band.every((value, index) => value === firstband[index]);\n}\n\n/** Scales one css pixel rectangle by the reviewed pixel ratio; ratios of one, two and three scale every edge. */\nexport function scaledrect(rect: regionrect, pixelratio: number): regionrect {\n const ratio = pixelratio >= 1 ? pixelratio : 1;\n return { x: Math.round(rect.x * ratio), y: Math.round(rect.y * ratio), width: Math.round(rect.width * ratio), height: Math.round(rect.height * ratio) };\n}\n\n/** Clamps one rectangle to the visible part of the viewport, never returning negative geometry. */\nexport function croprect(rect: regionrect, viewport: { width: number; height: number }): regionrect {\n const x = Math.max(0, rect.x);\n const y = Math.max(0, rect.y);\n return { x: Math.round(x), y: Math.round(y), width: Math.round(Math.max(0, Math.min(rect.width, viewport.width - x))), height: Math.round(Math.max(0, Math.min(rect.height, viewport.height - y))) };\n}\n\n/** True when an element rectangle crosses any viewport edge and the capture falls back to tiled capture. */\nexport function crossesviewport(rect: regionrect, viewport: { width: number; height: number }): boolean {\n return rect.x < 0 || rect.y < 0 || rect.x + rect.width > viewport.width || rect.y + rect.height > viewport.height;\n}\n\n/** Scroll tops that walk a scrollable container in reviewed steps; every step clamps so the last window ends at the container end. */\nexport function regionsteps(containerheight: number, viewportstep: number): number[] {\n if (containerheight <= 0 || viewportstep <= 0) return [0];\n const steps: number[] = [];\n for (let top = 0; top < containerheight; top += viewportstep) {\n const clamped = Math.min(top, Math.max(0, containerheight - viewportstep));\n if (!steps.includes(clamped)) steps.push(clamped);\n }\n return steps;\n}\n\n/** One placed cell of a contact sheet grid with its caption stamped from the reviewed label style. */\nexport interface sheetcell {\n index: number;\n column: number;\n row: number;\n selector: string;\n label: string;\n caption: string;\n}\n\n/** Places the element captures of a contact sheet on a labeled grid; the cell count stays a user choice with no code ceiling. */\nexport function buildsheet(cells: Array<{ selector: string; label?: string }>, layout: sheetlayout): { columns: number; rows: number; cells: sheetcell[] } {\n const columns = Math.max(1, Math.round(layout.columns));\n const rows = Math.max(1, Math.ceil(cells.length / columns));\n const placed: sheetcell[] = cells.map((cell, index) => {\n const column = index % columns;\n const row = Math.floor(index / columns);\n const label = cell.label ?? \"\";\n const caption = layout.label === \"none\" ? \"\" : layout.label === \"index\" ? `${index + 1}` : layout.label === \"selector\" ? cell.selector : label ? `${index + 1} \u00B7 ${cell.selector} \u00B7 ${label}` : `${index + 1} \u00B7 ${cell.selector}`;\n return { index, column, row, selector: cell.selector, label, caption };\n });\n return { columns, rows, cells: placed };\n}\n\n/** Slugifies one capture name part into a filename safe lowercase form. */\nfunction capturepart(value: string): string {\n return value.replace(/[^a-z0-9-]+/gi, \"-\").replace(/^-+|-+$/g, \"\").toLowerCase() || \"capture\";\n}\n\n/** Builds one capture filename from the reviewed naming rule segments; the sequence counter keeps every name unique inside a run. */\nexport function buildname(rule: capturenaming, parts: { run: string; step: string; sequence: number; kind: string }, extension: string): string {\n const segments: string[] = [];\n if (rule.run) segments.push(capturepart(parts.run));\n if (rule.step) segments.push(capturepart(parts.step));\n if (rule.sequence) segments.push(String(Math.max(0, Math.round(parts.sequence))));\n if (rule.kind) segments.push(capturepart(parts.kind));\n const safeextension = extension.replace(/^\\.+/, \"\").toLowerCase() || \"png\";\n return `${(segments.length > 0 ? segments : [\"capture\"]).join(\"-\")}.${safeextension}`;\n}\n\n/** One annotation plan for a captured image: the step number marker, the optional target outline and the footer with capture time and page url. */\nexport interface annotationplan {\n marker: { x: number; y: number; number: number };\n outline?: regionrect;\n footer: string;\n}\n\n/** Plans the annotations of one capture: the step number marker position, the expanded target rect outline and the footer text with capture time and url. */\nexport function annotationplanof(input: { step: number; width: number; height: number; rect?: regionrect; url: string; at: number }): annotationplan {\n const inset = Math.min(24, Math.max(8, Math.round(Math.min(input.width, input.height) / 12)));\n const plan: annotationplan = {\n marker: { x: inset, y: inset, number: Math.max(1, Math.round(input.step)) },\n footer: `${new Date(input.at).toISOString()} \u00B7 ${input.url}`,\n };\n if (input.rect !== undefined) {\n const expansion = 2;\n plan.outline = { x: Math.round(input.rect.x - expansion), y: Math.round(input.rect.y - expansion), width: Math.round(input.rect.width + expansion * 2), height: Math.round(input.rect.height + expansion * 2) };\n }\n return plan;\n}\n", "import type { assetrecord, captureformat, capturenaming, convertdirective, imagefilter, imagedescriptor, mediadatum, pdfoptions, recordingoptions, recordingrecord, streamrecord, thumbdirective } from \"./types.js\";\nimport { buildname } from \"./capture.js\";\n\n/**\n * Media capture part two logics for the 1.1.41 family.\n * Every correlated rule for the derived pdf composition with reviewed paper sizes, margins and pagination break points, the recording records with their frame intervals and clean stops, the image filter matching with url deduplication and counter names, the lapse frame ordering, the conversion and thumbnail geometry and the raw media, asset and stream normalization lives in this file.\n */\n\n/** The media capture part two kinds, listed among the available capabilities of every proposal request. */\nexport const mediakinds: string[] = [\"capturepdf\", \"recordscreen\", \"captureaudio\", \"captureframe\", \"downloadimages\", \"shotcanvas\", \"probestream\", \"readmedia\", \"readassets\", \"timelapse\", \"convertimage\", \"makethumbs\"];\n\n/** Default paper size in inches when the reviewed options leave it open: us letter portrait. */\nconst defaultpaperwidth = 8.5;\nconst defaultpaperheight = 11;\n\n/** Default page margins in inches when the reviewed options leave them open. */\nconst defaultmargins = { top: 0.4, right: 0.4, bottom: 0.4, left: 0.4 };\n\n/** Points per paper inch of the pdf coordinate space. */\nconst pdfpointsperinch = 72;\n\n/** Base body font size in points that the reviewed scale multiplies. */\nconst basefontsize = 11;\n\n/** Normalizes reviewed pdf options with paper defaults; unknown fields stay ignored. */\nexport function pdfoptionsof(value: unknown): pdfoptions {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const options = value as Record<string, unknown>;\n const normalized: pdfoptions = {};\n if (typeof options.paperwidth === \"number\" && Number.isFinite(options.paperwidth)) normalized.paperwidth = options.paperwidth;\n if (typeof options.paperheight === \"number\" && Number.isFinite(options.paperheight)) normalized.paperheight = options.paperheight;\n if (options.margins && typeof options.margins === \"object\" && !Array.isArray(options.margins)) {\n const margins = options.margins as Record<string, unknown>;\n const top = typeof margins.top === \"number\" ? margins.top : defaultmargins.top;\n const right = typeof margins.right === \"number\" ? margins.right : defaultmargins.right;\n const bottom = typeof margins.bottom === \"number\" ? margins.bottom : defaultmargins.bottom;\n const left = typeof margins.left === \"number\" ? margins.left : defaultmargins.left;\n normalized.margins = { top, right, bottom, left };\n }\n if (typeof options.scale === \"number\" && Number.isFinite(options.scale)) normalized.scale = options.scale;\n if (typeof options.landscape === \"boolean\") normalized.landscape = options.landscape;\n if (typeof options.paginate === \"boolean\") normalized.paginate = options.paginate;\n return normalized;\n}\n\n/** Resolves the pdf page size in points after the landscape swap. */\nexport function pdfpagesize(options: pdfoptions): { width: number; height: number } {\n const width = (options.paperwidth ?? defaultpaperwidth) * pdfpointsperinch;\n const height = (options.paperheight ?? defaultpaperheight) * pdfpointsperinch;\n return options.landscape === true ? { width: height, height: width } : { width, height };\n}\n\n/** Resolves the reviewed margins in points. */\nfunction pdfmargins(options: pdfoptions): { top: number; right: number; bottom: number; left: number } {\n const margins = options.margins ?? defaultmargins;\n return { top: margins.top * pdfpointsperinch, right: margins.right * pdfpointsperinch, bottom: margins.bottom * pdfpointsperinch, left: margins.left * pdfpointsperinch };\n}\n\n/** Resolves the body font size in points from the reviewed scale with no code ceiling on the scale itself. */\nfunction pdffontsize(options: pdfoptions): number {\n return basefontsize * (options.scale ?? 1);\n}\n\n/** Wraps one text block into page lines for the reviewed geometry: word wrap at the average glyph width of the Helvetica body font. */\nexport function pdftextlayout(text: string, options: pdfoptions): string[] {\n const size = pdfpagesize(options);\n const margins = pdfmargins(options);\n const fontsize = pdffontsize(options);\n const leading = fontsize * 1.35;\n const linesperpage = Math.max(1, Math.floor((size.height - margins.top - margins.bottom) / leading));\n const columns = Math.max(1, Math.floor((size.width - margins.left - margins.right) / (fontsize * 0.5)));\n const wrapped: string[] = [];\n for (const paragraph of text.split(/\\r?\\n/)) {\n let line = \"\";\n for (const word of paragraph.split(/\\s+/).filter(Boolean)) {\n const candidate = line ? `${line} ${word}` : word;\n if (candidate.length <= columns) { line = candidate; continue; }\n if (line) wrapped.push(line);\n if (word.length <= columns) { line = word; continue; }\n for (let index = 0; index < word.length; index += columns) wrapped.push(word.slice(index, index + columns));\n line = \"\";\n }\n wrapped.push(line);\n if (wrapped.length >= linesperpage) break;\n }\n return wrapped.slice(0, linesperpage);\n}\n\n/** Splits the scroll height into report page segments at reviewed break point offsets; absent break points walk the height in viewport steps. */\nexport function pdfsegments(scrollheight: number, viewportheight: number, breaks: number[]): Array<{ top: number; height: number }> {\n if (scrollheight <= 0) return [];\n const step = viewportheight > 0 ? viewportheight : scrollheight;\n const cuts = [0, ...breaks.filter(top => Number.isFinite(top) && top > 0 && top < scrollheight).map(top => Math.round(top))].filter((top, index, list) => list.indexOf(top) === index).sort((left, right) => left - right);\n const segments: Array<{ top: number; height: number }> = [];\n let index = 0;\n let cursor = 0;\n while (cursor < scrollheight) {\n while (index < cuts.length && (cuts[index] ?? 0) <= cursor) index += 1;\n const nextcut = index < cuts.length ? cuts[index] : undefined;\n const next = nextcut !== undefined ? Math.min(nextcut, scrollheight) : Math.min(cursor + step, scrollheight);\n if (next <= cursor) break;\n segments.push({ top: cursor, height: next - cursor });\n cursor = next;\n }\n return segments.length > 0 ? segments : [{ top: 0, height: scrollheight }];\n}\n\n/** Escapes one pdf text string: parentheses and backslashes escape and characters outside latin one become honest question marks. */\nfunction pdfescape(text: string): string {\n let escaped = \"\";\n for (const character of text) {\n const code = character.charCodeAt(0);\n if (character === \"(\" || character === \")\" || character === \"\\\\\") escaped += `\\\\${character}`;\n else if (code >= 32 && code <= 255) escaped += character;\n else escaped += \"?\";\n }\n return escaped;\n}\n\n/** Composes one derived pdf document from the page text blocks with the reviewed paper size, margins, scale and landscape orientation; the byte size is the latin one document length. */\nexport function buildpdf(pages: string[], options: pdfoptions): { document: string; bytes: number; pages: number; pagewidth: number; pageheight: number } {\n const size = pdfpagesize(options);\n const margins = pdfmargins(options);\n const fontsize = pdffontsize(options);\n const leading = fontsize * 1.35;\n const laidout = (pages.length > 0 ? pages : [\"\"]).map(text => pdftextlayout(text, options));\n const objects: string[] = [];\n const kids = laidout.map((_, index) => `${4 + index * 2} 0 R`).join(\" \");\n objects.push(`<< /Type /Catalog /Pages 2 0 R >>`);\n objects.push(`<< /Type /Pages /Kids [${kids}] /Count ${laidout.length} >>`);\n objects.push(`<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>`);\n for (let pageindex = 0; pageindex < laidout.length; pageindex += 1) {\n const lines = laidout[pageindex] ?? [];\n const operators: string[] = [\"BT\", `/F1 ${fontsize} Tf`, `${leading.toFixed(2)} TL`, `${margins.left.toFixed(2)} ${(size.height - margins.top - fontsize).toFixed(2)} Td`];\n for (let lineindex = 0; lineindex < lines.length; lineindex += 1) {\n if (lineindex > 0) operators.push(\"T*\");\n operators.push(`(${pdfescape(lines[lineindex] ?? \"\")}) Tj`);\n }\n operators.push(\"ET\");\n const content = operators.join(\"\\n\");\n objects.push(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${size.width.toFixed(2)} ${size.height.toFixed(2)}] /Resources << /Font << /F1 3 0 R >> >> /Contents ${5 + pageindex * 2} 0 R >>`);\n objects.push(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`);\n }\n let document = \"%PDF-1.4\\n\";\n const offsets: number[] = [];\n for (let index = 0; index < objects.length; index += 1) {\n offsets.push(document.length);\n document += `${index + 1} 0 obj\\n${objects[index]}\\nendobj\\n`;\n }\n const xrefstart = document.length;\n document += `xref\\n0 ${objects.length + 1}\\n0000000000 65535 f \\n`;\n for (const offset of offsets) document += `${String(offset).padStart(10, \"0\")} 00000 n \\n`;\n document += `trailer\\n<< /Size ${objects.length + 1} /Root 1 0 R >>\\nstartxref\\n${xrefstart}\\n%%EOF\\n`;\n return { document, bytes: document.length, pages: laidout.length, pagewidth: Math.round(size.width), pageheight: Math.round(size.height) };\n}\n\n/** Normalizes reviewed recording options with the tab scope as the default. */\nexport function recordingoptionsof(value: unknown): recordingoptions {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const options = value as Record<string, unknown>;\n const normalized: recordingoptions = {};\n if (options.scope === \"tab\" || options.scope === \"run\") normalized.scope = options.scope;\n if (typeof options.fps === \"number\" && Number.isFinite(options.fps)) normalized.fps = options.fps;\n if (typeof options.bitrate === \"number\" && Number.isFinite(options.bitrate)) normalized.bitrate = options.bitrate;\n if (typeof options.audio === \"boolean\") normalized.audio = options.audio;\n return normalized;\n}\n\n/** Opens one recording record of user activity with the reviewed options applied. */\nexport function newrecording(input: { id: string; runid: string; stepid: string; tabid: number; kind: \"screen\" | \"audio\"; options: recordingoptions; at: number }): recordingrecord {\n return {\n id: input.id,\n runid: input.runid,\n stepid: input.stepid,\n tabid: input.tabid,\n kind: input.kind,\n scope: input.options.scope ?? \"tab\",\n format: input.kind === \"audio\" ? \"evidence\" : \"frames\",\n startedat: input.at,\n at: input.at,\n ...(input.options.fps !== undefined ? { fps: input.options.fps } : {}),\n ...(input.options.bitrate !== undefined ? { bitrate: input.options.bitrate } : {}),\n ...(input.options.audio !== undefined ? { audio: input.options.audio } : {}),\n frames: [],\n };\n}\n\n/** Closes one recording cleanly at the given time and stamps the duration. */\nexport function finishrecording(record: recordingrecord, endat: number): recordingrecord {\n return { ...record, endedat: endat, duration: Math.max(0, endat - record.startedat) };\n}\n\n/** Frame shoot interval in milliseconds of the reviewed fps; the fps itself carries no code ceiling. */\nexport function frameinterval(fps: number): number {\n if (!Number.isFinite(fps) || fps <= 0) return 1000;\n return Math.max(1, Math.round(1000 / fps));\n}\n\n/** Normalizes a reviewed image filter; unknown fields stay ignored. */\nexport function imagefilterof(value: unknown): imagefilter {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const options = value as Record<string, unknown>;\n const normalized: imagefilter = {};\n if (typeof options.selector === \"string\" && options.selector.trim()) normalized.selector = options.selector.trim();\n if (typeof options.minwidth === \"number\" && Number.isFinite(options.minwidth)) normalized.minwidth = options.minwidth;\n if (typeof options.minheight === \"number\" && Number.isFinite(options.minheight)) normalized.minheight = options.minheight;\n if (Array.isArray(options.formats) && options.formats.every(item => typeof item === \"string\" && item.trim())) normalized.formats = options.formats as string[];\n return normalized;\n}\n\n/** True when one observed image passes the reviewed filter: minimum dimensions and the format list; absent bounds never refuse. */\nexport function imagematches(image: imagedescriptor, filter: imagefilter): boolean {\n if (filter.minwidth !== undefined && image.width < filter.minwidth) return false;\n if (filter.minheight !== undefined && image.height < filter.minheight) return false;\n if (filter.formats !== undefined && filter.formats.length > 0) {\n const mime = image.mime.toLowerCase();\n const matches = filter.formats.some(format => {\n const wanted = format.toLowerCase().trim();\n return mime === wanted || mime === `image/${wanted}` || mime.endsWith(`/${wanted}`);\n });\n if (!matches) return false;\n }\n return true;\n}\n\n/** Deduplicates observed images by url before any download starts; the first observation of a url wins. */\nexport function dedupeimages(images: imagedescriptor[]): imagedescriptor[] {\n const seen = new Set<string>();\n const unique: imagedescriptor[] = [];\n for (const image of images) {\n if (seen.has(image.url)) continue;\n seen.add(image.url);\n unique.push(image);\n }\n return unique;\n}\n\n/** Stamps consistent image batch filenames from the reviewed naming rule with a per batch image counter. */\nexport function imagenames(rule: capturenaming, run: string, step: string, count: number, extension: string): string[] {\n const names: string[] = [];\n for (let index = 1; index <= Math.max(0, Math.round(count)); index += 1) names.push(buildname(rule, { run, step, sequence: index, kind: \"image\" }, extension));\n return names;\n}\n\n/** Normalizes a reviewed lapse plan; an absent format keeps png. */\nexport function lapseplanof(value: unknown): { interval: number; duration: number; format: captureformat } | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const options = value as Record<string, unknown>;\n if (typeof options.interval !== \"number\" || !Number.isFinite(options.interval)) return undefined;\n if (typeof options.duration !== \"number\" || !Number.isFinite(options.duration)) return undefined;\n const format = options.format === \"jpeg\" || options.format === \"webp\" ? options.format : \"png\";\n return { interval: options.interval, duration: options.duration, format };\n}\n\n/** Ordered lapse frame timestamps starting at zero and stepping the reviewed interval inside the reviewed duration. */\nexport function lapseframes(plan: { interval: number; duration: number }): number[] {\n if (!(plan.interval > 0) || !(plan.duration > 0)) return [];\n const frames: number[] = [];\n for (let time = 0; time < plan.duration; time += plan.interval) frames.push(Math.round(time));\n return frames;\n}\n\n/** Normalizes a reviewed conversion directive; an absent payload leaves the step without a directive. */\nexport function convertdirectiveof(value: unknown): convertdirective | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const options = value as Record<string, unknown>;\n if (options.target !== \"png\" && options.target !== \"jpeg\" && options.target !== \"webp\") return undefined;\n const normalized: convertdirective = { target: options.target };\n if (options.source === \"png\" || options.source === \"jpeg\" || options.source === \"webp\") normalized.source = options.source;\n if (typeof options.quality === \"number\" && Number.isFinite(options.quality)) normalized.quality = options.quality;\n return normalized;\n}\n\n/** Normalizes a reviewed thumbnail directive; an absent payload leaves the step without a directive. */\nexport function thumbdirectiveof(value: unknown): thumbdirective | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const options = value as Record<string, unknown>;\n if (typeof options.size !== \"number\" || !Number.isFinite(options.size) || options.size <= 0) return undefined;\n if (options.fit !== \"cover\" && options.fit !== \"contain\") return undefined;\n if (typeof options.suffix !== \"string\" || !options.suffix.trim()) return undefined;\n return { size: options.size, fit: options.fit, suffix: options.suffix.trim() };\n}\n\n/** Nine argument draw geometry of one thumbnail: cover crops to the square and fits inside, contain letterboxes the whole source. */\nexport function thumbgeometry(source: { width: number; height: number }, directive: thumbdirective): { sx: number; sy: number; sw: number; sh: number; dx: number; dy: number; dw: number; dh: number; width: number; height: number } {\n const size = Math.max(1, Math.round(directive.size));\n if (directive.fit === \"contain\") {\n const scale = Math.min(size / Math.max(1, source.width), size / Math.max(1, source.height));\n const dw = Math.max(1, Math.round(source.width * scale));\n const dh = Math.max(1, Math.round(source.height * scale));\n return { sx: 0, sy: 0, sw: source.width, sh: source.height, dx: Math.floor((size - dw) / 2), dy: Math.floor((size - dh) / 2), dw, dh, width: size, height: size };\n }\n const scale = Math.max(size / Math.max(1, source.width), size / Math.max(1, source.height));\n const sw = Math.min(source.width, Math.round(size / scale));\n const sh = Math.min(source.height, Math.round(size / scale));\n return { sx: Math.floor((source.width - sw) / 2), sy: Math.floor((source.height - sh) / 2), sw, sh, dx: 0, dy: 0, dw: size, dh: size, width: size, height: size };\n}\n\n/** Normalizes raw embedded media element entries into mediadatum records with duration, dimensions, codecs and track lists. */\nexport function mediaentries(raw: Array<Record<string, unknown>>): mediadatum[] {\n return raw.map(entry => ({\n url: typeof entry.url === \"string\" ? entry.url : \"\",\n mime: typeof entry.mime === \"string\" ? entry.mime : \"\",\n duration: typeof entry.duration === \"number\" && Number.isFinite(entry.duration) ? entry.duration : 0,\n width: typeof entry.width === \"number\" && Number.isFinite(entry.width) ? Math.round(entry.width) : 0,\n height: typeof entry.height === \"number\" && Number.isFinite(entry.height) ? Math.round(entry.height) : 0,\n codecs: typeof entry.codecs === \"string\" ? entry.codecs : \"\",\n tracks: Array.isArray(entry.tracks) ? entry.tracks.filter(item => typeof item === \"string\") : [],\n }));\n}\n\n/** Normalizes raw page asset entries into favicon or logo asset shapes with their byte sizes and declared sizes. */\nexport function assetentries(raw: Array<Record<string, unknown>>): Array<{ kind: assetrecord[\"kind\"]; url: string; bytes: number; sizes?: string }> {\n return raw.map(entry => ({\n kind: entry.kind === \"logo\" ? \"logo\" : \"favicon\",\n url: typeof entry.url === \"string\" ? entry.url : \"\",\n bytes: typeof entry.bytes === \"number\" && Number.isFinite(entry.bytes) ? entry.bytes : 0,\n ...(typeof entry.sizes === \"string\" && entry.sizes.trim() ? { sizes: entry.sizes.trim() } : {}),\n }));\n}\n\n/** Normalizes raw stream probe entries into stream summaries with track counts, labels, live states and track details. */\nexport function streamsummaries(raw: Array<Record<string, unknown>>): Array<Omit<streamrecord, \"id\" | \"runid\" | \"stepid\" | \"at\">> {\n return raw.map(entry => {\n const tracks = Array.isArray(entry.tracks) ? entry.tracks : [];\n return {\n kind: typeof entry.kind === \"string\" ? entry.kind : \"stream\",\n tracks: tracks.length,\n label: typeof entry.label === \"string\" ? entry.label : \"\",\n live: entry.live === true,\n detail: tracks.map(track => {\n const item = track as Record<string, unknown>;\n return {\n kind: typeof item.kind === \"string\" ? item.kind : \"\",\n label: typeof item.label === \"string\" ? item.label : \"\",\n ...(typeof item.width === \"number\" && Number.isFinite(item.width) ? { width: Math.round(item.width) } : {}),\n ...(typeof item.height === \"number\" && Number.isFinite(item.height) ? { height: Math.round(item.height) } : {}),\n ...(typeof item.framerate === \"number\" && Number.isFinite(item.framerate) ? { framerate: item.framerate } : {}),\n state: typeof item.state === \"string\" ? item.state : \"\",\n };\n }),\n };\n });\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 targetwindow = typeof options.window === \"number\" && Number.isFinite(options.window) ? options.window : undefined;\n const created = await chrome.tabs.create({ url: step.value, active: options.active !== false && options.background !== true, pinned: options.pinned === true, ...(targetwindow !== undefined ? { windowId: targetwindow } : {}) });\n return { ok: true, summary: `Opened a new tab for ${step.value}${options.background === true ? \" in the background without activating it\" : \"\"}.`, details: { tabid: created?.id ?? 0, ...(targetwindow !== undefined ? { windowid: targetwindow } : {}), ...(options.background === true ? { background: true } : {}) } };\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 bounds = [\"left\", \"top\", \"width\", \"height\"].filter(field => typeof options[field] === \"number\");\n const geometry = Object.fromEntries(bounds.map(field => [field, options[field]])) as Record<string, number>;\n const state = typeof options.state === \"string\" && [\"normal\", \"maximized\", \"minimized\", \"fullscreen\"].includes(options.state) ? options.state : undefined;\n const created = await chrome.windows.create({ url: step.value ?? \"about:blank\", ...(Object.keys(geometry).length > 0 ? geometry : {}), ...(state !== undefined ? { state: state as chrome.windows.WindowState } : {}) });\n return { ok: true, summary: `Opened a new window for ${step.value}.`, details: { windowid: created?.id ?? 0, ...(Object.keys(geometry).length > 0 ? { bounds: geometry } : {}), ...(state !== undefined ? { state } : {}) } };\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 { tabgrouprecord, tablayout, tabquery, tabwatchevent, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport { assigntasktab, tasktabs } from \"../progress.js\";\nimport type { planprogress } from \"../types.js\";\n\n/**\n * Tabs and windows command logics for reviewed steps.\n * Every correlated rule for tab queries, clone detection, group membership, layouts, snapshots, watchers, badges, discard candidates, switcher order, zoom steps and the task tab budget lives in this file.\n */\n\n/** One serializable live tab shape resolved against the browser tab set. */\nexport interface tabshape {\n tabid: number;\n url: string;\n title: string;\n index: number;\n windowid: number;\n active: boolean;\n pinned: boolean;\n audible: boolean;\n muted: boolean;\n discarded: boolean;\n}\n\n/** One serializable live window shape with bounds, state and profile kind. */\nexport interface windowshape {\n windowid: number;\n left: number;\n top: number;\n width: number;\n height: number;\n state: \"normal\" | \"maximized\" | \"minimized\" | \"fullscreen\";\n incognito: boolean;\n focused: boolean;\n}\n\n/** Reads the reviewed tabquery of a tabs and windows command step; null when the step reviews none. */\nexport function parsetabquery(step: toolstep): tabquery | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options.tabquery;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const query = value as Record<string, unknown>;\n return {\n ...(typeof query.url === \"string\" && query.url ? { url: query.url } : {}),\n ...(typeof query.title === \"string\" && query.title ? { title: query.title } : {}),\n ...(typeof query.id === \"number\" && Number.isInteger(query.id) && query.id >= 0 ? { id: query.id } : {}),\n ...(typeof query.pattern === \"string\" && query.pattern ? { pattern: query.pattern } : {}),\n };\n}\n\n/** Matches one reviewed wildcard pattern against a url; `*` spans one path segment and `**` spans any part. */\nexport function tabpatternmatches(pattern: string, url: string): boolean {\n const source = pattern.split(\"**\").map(part => part.split(\"*\").map(piece => piece.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"[^/]*\")).join(\".*\");\n return new RegExp(`^${source}$`).test(url);\n}\n\n/** Resolves one reviewed tabquery against the live tab set: every matcher that exists must hold. */\nexport function querymatches(query: tabquery, tabs: tabshape[]): tabshape[] {\n return tabs.filter(tab => {\n if (query.id !== undefined && tab.tabid !== query.id) return false;\n if (query.url !== undefined && tab.url !== query.url) return false;\n if (query.title !== undefined && !tab.title.toLowerCase().includes(query.title.toLowerCase())) return false;\n if (query.pattern !== undefined && !tabpatternmatches(query.pattern, tab.url)) return false;\n return true;\n });\n}\n\n/** Normalizes one url for clone comparison by dropping the fragment and trailing slashes. */\nexport function normalizedtaburl(url: string): string {\n let normalized = url;\n const hash = normalized.indexOf(\"#\");\n if (hash >= 0) normalized = normalized.slice(0, hash);\n while (normalized.length > 1 && normalized.endsWith(\"/\")) normalized = normalized.slice(0, -1);\n return normalized;\n}\n\n/** One clone warning: a normalized url shared by more than one open tab. */\nexport interface clonewarning {\n url: string;\n tabids: number[];\n}\n\n/** Detects duplicate tabs by normalized url comparison and returns every url held by more than one tab. */\nexport function clonetabs(tabs: tabshape[]): clonewarning[] {\n const groups = new Map<string, number[]>();\n for (const tab of tabs) {\n if (!tab.url) continue;\n const key = normalizedtaburl(tab.url);\n groups.set(key, [...(groups.get(key) ?? []), tab.tabid]);\n }\n return [...groups.entries()].filter(([, tabids]) => tabids.length > 1).map(([url, tabids]) => ({ url, tabids }));\n}\n\n/** Searches across open tabs by title and url, case insensitive, returning matches in live order. */\nexport function searchtabmatches(tabs: tabshape[], text: string): tabshape[] {\n const needle = text.trim().toLowerCase();\n if (!needle) return [];\n return tabs.filter(tab => tab.title.toLowerCase().includes(needle) || tab.url.toLowerCase().includes(needle));\n}\n\n/** Lists the tabs that are playing audio: audible or muted but still playing. */\nexport function audiotabs(tabs: tabshape[]): tabshape[] {\n return tabs.filter(tab => tab.audible || (tab.muted && tab.audible));\n}\n\n/** Returns the inactive, unpinned and not yet discarded tabs a discardtab step may release. */\nexport function discardcandidates(tabs: tabshape[]): tabshape[] {\n return tabs.filter(tab => !tab.active && !tab.pinned && !tab.discarded && tab.url.length > 0);\n}\n\n/** Restores discarded tabs on demand without losing their urls; every discarded tab keeps its url for reload. */\nexport function restorediscarded(tabs: tabshape[]): Array<{ tabid: number; url: string }> {\n return tabs.filter(tab => tab.discarded && tab.url.length > 0).map(tab => ({ tabid: tab.tabid, url: tab.url }));\n}\n\n/** Captures one tab layout with name, tabs, groups, positions and window bounds from the live browser state. */\nexport function buildlayout(name: string, tabs: tabshape[], windows: windowshape[], groups: tabgrouprecord[], scratchwindowids: number[], at: number): tablayout {\n return {\n name,\n tabs: tabs.map(tab => ({ url: tab.url, title: tab.title, pinned: tab.pinned, index: tab.index, windowid: tab.windowid })),\n groups: groups.map(group => ({ name: group.name, color: group.color, tabids: group.tabids.filter(tabid => tabs.some(tab => tab.tabid === tabid)), collapsed: group.collapsed })),\n windows: windows.map(item => ({ windowid: item.windowid, state: { bounds: { left: item.left, top: item.top, width: item.width, height: item.height }, maximized: item.state === \"maximized\", profile: item.incognito ? \"incognito\" : scratchwindowids.includes(item.windowid) ? \"scratch\" : \"normal\" } })),\n savedat: at,\n };\n}\n\n/** Plans the restore of one saved layout: only urls that are not already open come back, in layout order. */\nexport function layoutrestoreplan(layout: tablayout, openurls: string[]): string[] {\n const open = new Set(openurls.map(url => normalizedtaburl(url)));\n return layout.tabs.map(tab => tab.url).filter(url => url.length > 0 && !open.has(normalizedtaburl(url)));\n}\n\n/** Keeps tabgroup membership through moves: member ids survive, their order follows the live tab order and closed members drop out. */\nexport function regroupaftermoves(groups: tabgrouprecord[], tabs: tabshape[], at: number): tabgrouprecord[] {\n const order = new Map(tabs.map(tab => [tab.tabid, tab.index]));\n return groups.map(group => {\n const members = group.tabids.filter(tabid => order.has(tabid));\n if (members.length === 0) return group;\n const ordered = [...members].sort((left, right) => (order.get(left) ?? 0) - (order.get(right) ?? 0));\n return ordered.length === group.tabids.length && ordered.every((tabid, index) => tabid === group.tabids[index]) ? group : { ...group, tabids: ordered, savedat: at };\n });\n}\n\n/** Renames one stored tab group while keeping its color choice, member tabs and collapse state. */\nexport function renamegroup(groups: tabgrouprecord[], name: string, newname: string, at: number): tabgrouprecord[] {\n return groups.map(group => group.name === name ? { ...group, name: newname, savedat: at } : group);\n}\n\n/** Counts the task tabs that live inside one window so the close gate can demand review. */\nexport function tasktabsinwindow(tabs: tabshape[], windowid: number, tasktabids: number[]): number {\n const tasks = new Set(tasktabids);\n return tabs.filter(tab => tab.windowid === windowid && tasks.has(tab.tabid)).length;\n}\n\n/** Selects the tabs a reviewed closepattern may close; the session tab itself is always refused protection. */\nexport function closeselection(query: tabquery, tabs: tabshape[], sessiontabid: number): { targets: tabshape[]; refused: tabshape[] } {\n const matches = querymatches(query, tabs);\n return {\n targets: matches.filter(tab => tab.tabid !== sessiontabid),\n refused: matches.filter(tab => tab.tabid === sessiontabid),\n };\n}\n\n/** Applies one reviewed zoom step with no code ceiling; a step never crosses zero, so it keeps the current zoom instead. */\nexport function zoomstep(current: number, direction: \"in\" | \"out\", step: number): number {\n const next = direction === \"in\" ? current + step : current - step;\n return next > 0 ? Number(next.toFixed(4)) : current;\n}\n\n/** Resolves the neighbor tab index a switchtab step activates, wrapping at both ends of the window. */\nexport function switchtarget(tabs: tabshape[], direction: \"next\" | \"previous\", currentindex: number): number | undefined {\n if (tabs.length === 0) return undefined;\n const offset = direction === \"next\" ? 1 : -1;\n return (currentindex + offset + tabs.length) % tabs.length;\n}\n\n/** Orders the quick switcher list by recency with filter keys; unseen tabs follow in live index order. */\nexport function switcherlist(tabs: tabshape[], recency: Array<{ tabid: number; at: number }>, filter: string): tabshape[] {\n const needle = filter.trim().toLowerCase();\n const matches = needle ? tabs.filter(tab => tab.title.toLowerCase().includes(needle) || tab.url.toLowerCase().includes(needle)) : [...tabs];\n const lastrun = new Map(recency.map(entry => [entry.tabid, entry.at]));\n return [...matches].sort((left, right) => {\n const leftat = lastrun.get(left.tabid) ?? -1;\n const rightat = lastrun.get(right.tabid) ?? -1;\n if (leftat !== rightat) return rightat - leftat;\n return left.index - right.index;\n });\n}\n\n/** Dispatches the tab events of one watchtab registration into the step result, honoring the reviewed event filters. */\nexport function watchtabdispatch(events: tabwatchevent[], watchid: string, filters: string[]): tabwatchevent[] {\n const allowed = filters.length > 0 ? new Set(filters) : undefined;\n return events.filter(event => event.watchid === watchid && (allowed === undefined || allowed.has(event.event)));\n}\n\n/** Computes the per task badge from the live progress state of the task. */\nexport function badgefromprogress(completed: number, total: number): { label: string; done: boolean } {\n if (total <= 0) return { label: \"idle\", done: false };\n if (completed >= total) return { label: \"done\", done: true };\n return { label: `${completed}/${total}`, done: false };\n}\n\n/** Grades the concurrent task tab budget: a user configured ceiling refuses, an absent ceiling never refuses. */\nexport function tasktabgauge(used: number, ceiling: number | undefined): { used: number; ceiling: number | undefined; over: boolean } {\n return { used, ceiling, over: ceiling !== undefined && used > ceiling };\n}\n\n/** True when a window profile inherits the session origin grants; incognito windows stay separated. */\nexport function windowprofilegrants(profile: \"normal\" | \"incognito\" | \"scratch\"): boolean {\n return profile !== \"incognito\";\n}\n\n/** Assigns every task tab of the plan progress, used when tabmeta routing records a tab for the plan steps. */\nexport function assigntasktabs(progress: planprogress | undefined, planid: string, tabids: number[], now: number): planprogress {\n let next = progress;\n for (const tabid of tabids) next = assigntasktab(next, planid, tabid, now);\n return next ?? { planid, completedsteps: [], tasktabs: [], updatedat: now };\n}\n\n/** Returns the task tabs tracked by one plan progress, used for window close review and badge refresh. */\nexport function trackedtasktabs(progress: planprogress | undefined, planid: string): number[] {\n return tasktabs(progress, planid);\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 type { navtarget, toolstep, urlpattern, waitoverride, waitprofile } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\n\n/**\n * Page navigation logics for reviewed steps.\n * Every correlated rule for navigation targets, container resolution, wait profiles, url patterns, link following, spa routing, query rewriting, deep links and recent tabs lives in this file.\n */\n\n/** One link shape matched by followlink and spanav, serializable for fixtures. */\nexport interface linkshape {\n text: string;\n href: string;\n selector: string;\n}\n\n/** One collected load signal sample with the signals that held true at its time. */\nexport interface signalsample {\n at: number;\n signals: string[];\n}\n\n/** Resolved container plan of one navigation target across tabs, windows and private profiles. */\nexport interface containerplan {\n kind: \"current\" | \"tab\" | \"window\" | \"private\";\n incognito: boolean;\n windowid?: number;\n position: \"adjacent\" | \"end\";\n}\n\n/** Reads the reviewed navtarget of a navigation step; null when the step reviews none. */\nexport function parsenavtarget(step: toolstep): navtarget | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options.navtarget;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const target = value as Record<string, unknown>;\n if (typeof target.url !== \"string\" || !target.url) return null;\n const container = target.container === \"current\" || target.container === \"window\" || target.container === \"private\" ? target.container : \"tab\";\n return {\n url: target.url,\n container,\n ...(target.position === \"end\" ? { position: \"end\" } : { position: \"adjacent\" }),\n private: container === \"private\" || target.private === true,\n };\n}\n\n/** Resolves the container plan of one navigation target: the current task tab, a new tab, a new window or a private window profile separated from normal windows. */\nexport function resolvecontainer(target: navtarget, windows: Array<{ id: number; incognito: boolean; focused: boolean }>): containerplan {\n if (target.container === \"current\") return { kind: \"current\", incognito: false, position: target.position ?? \"adjacent\" };\n if (target.container === \"private\" || target.private) return { kind: \"private\", incognito: true, position: target.position ?? \"adjacent\" };\n if (target.container === \"window\") {\n const focused = windows.find(item => item.focused);\n return { kind: \"window\", incognito: false, ...(focused ? { windowid: focused.id } : {}), position: target.position ?? \"adjacent\" };\n }\n const normal = windows.find(item => !item.incognito && item.focused) ?? windows.find(item => !item.incognito);\n return { kind: \"tab\", incognito: false, ...(normal ? { windowid: normal.id } : {}), position: target.position ?? \"adjacent\" };\n}\n\n/** Reads the reviewed waitprofile of a navprofile step; null when the step reviews none. */\nexport function parsewaitprofile(step: toolstep): waitprofile | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options.waitprofile;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const profile = value as Record<string, unknown>;\n const signals = Array.isArray(profile.signals) ? profile.signals.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n if (signals.length === 0) return null;\n const overrides: waitoverride[] = [];\n if (Array.isArray(profile.overrides)) {\n for (const item of profile.overrides) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const override = item as Record<string, unknown>;\n if (typeof override.origin !== \"string\" || !override.origin) continue;\n const overridesignals = Array.isArray(override.signals) ? override.signals.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0) : undefined;\n overrides.push({\n origin: override.origin,\n ...(overridesignals && overridesignals.length > 0 ? { signals: overridesignals } : {}),\n ...(typeof override.idle === \"number\" && Number.isFinite(override.idle) && override.idle >= 0 ? { idle: override.idle } : {}),\n ...(typeof override.timeout === \"number\" && Number.isFinite(override.timeout) && override.timeout >= 0 ? { timeout: override.timeout } : {}),\n });\n }\n }\n return {\n signals,\n ...(typeof profile.idle === \"number\" && Number.isFinite(profile.idle) && profile.idle >= 0 ? { idle: profile.idle } : {}),\n ...(typeof profile.timeout === \"number\" && Number.isFinite(profile.timeout) && profile.timeout >= 0 ? { timeout: profile.timeout } : {}),\n ...(overrides.length > 0 ? { overrides } : {}),\n };\n}\n\n/** Resolves the effective signals and thresholds of one wait profile for an origin by folding the per origin overrides in. */\nexport function profilefororigin(profile: waitprofile, origin: string): { signals: string[]; idle: number; timeout: number } {\n let signals = [...profile.signals];\n let idle = profile.idle ?? 0;\n let timeout = profile.timeout ?? 0;\n for (const override of profile.overrides ?? []) {\n if (!override.origin || new URL(override.origin).origin !== origin) continue;\n if (override.signals && override.signals.length > 0) signals = [...override.signals];\n if (override.idle !== undefined) idle = override.idle;\n if (override.timeout !== undefined) timeout = override.timeout;\n }\n return { signals, idle, timeout };\n}\n\n/** Maps a document ready state onto the live navigation load phase. */\nexport function loadphase(readystate: string): \"loading\" | \"interactive\" | \"complete\" {\n if (readystate === \"interactive\") return \"interactive\";\n if (readystate === \"complete\") return \"complete\";\n return \"loading\";\n}\n\n/** Decides the wait outcome of a wait profile from collected load signal samples: every required signal must hold in the latest sample inside the timeout. */\nexport function evaluatesignals(required: string[], samples: signalsample[], timeout: number): { ok: boolean; satisfied: string[]; waited: number; samples: number } {\n const start = samples[0]?.at ?? 0;\n const last = samples[samples.length - 1];\n const waited = Math.max(0, (last?.at ?? 0) - start);\n const held = last?.signals ?? [];\n const satisfied = required.filter(signal => held.includes(signal));\n if (required.length > 0 && satisfied.length === required.length) return { ok: true, satisfied, waited, samples: samples.length };\n if (timeout > 0 && waited >= timeout) return { ok: false, satisfied, waited, samples: samples.length };\n return { ok: false, satisfied, waited, samples: samples.length };\n}\n\n/** Reads the reviewed urlpattern of a waiturl, spanav or spawait step; null when the step reviews none. */\nexport function parseurlpattern(step: toolstep, key: string = \"urlpattern\"): urlpattern | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options[key];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const pattern = value as Record<string, unknown>;\n if (typeof pattern.url !== \"string\" || !pattern.url) return null;\n const mode = pattern.mode === \"exact\" || pattern.mode === \"host\" || pattern.mode === \"pattern\" ? pattern.mode : \"prefix\";\n const query: Record<string, string> = {};\n if (pattern.query && typeof pattern.query === \"object\" && !Array.isArray(pattern.query)) {\n for (const [name, item] of Object.entries(pattern.query as Record<string, unknown>)) if (typeof item === \"string\") query[name] = item;\n }\n return {\n mode,\n url: pattern.url,\n ...(Object.keys(query).length > 0 ? { query } : {}),\n ...(typeof pattern.fragment === \"string\" && pattern.fragment ? { fragment: pattern.fragment } : {}),\n };\n}\n\n/** Matches a wildcard path segment against one url path segment. */\nfunction segmentmatches(pattern: string, actual: string): boolean {\n if (pattern === \"*\" || pattern === \"**\") return true;\n if (!pattern.includes(\"*\")) return pattern === actual;\n const parts = pattern.split(\"*\");\n let index = 0;\n for (let position = 0; position < parts.length; position += 1) {\n const part = parts[position] as string;\n if (part === \"\") continue;\n const found = actual.indexOf(part, index);\n if (found < 0) return false;\n if (position === 0 && found !== 0) return false;\n index = found + part.length;\n }\n const last = parts[parts.length - 1] as string;\n return last === \"\" || actual.endsWith(last);\n}\n\n/** Matches one url against a reviewed urlpattern by mode plus required query and fragment parts. */\nexport function urlmatches(url: string, pattern: urlpattern): boolean {\n let parsed: URL;\n try { parsed = new URL(url); } catch { return false; }\n let expected: URL;\n try { expected = new URL(pattern.url); } catch { return false; }\n if (pattern.mode === \"exact\" && parsed.toString() !== expected.toString()) return false;\n if (pattern.mode === \"prefix\" && !parsed.toString().startsWith(pattern.url)) return false;\n if (pattern.mode === \"host\" && parsed.origin !== expected.origin) return false;\n if (pattern.mode === \"pattern\") {\n if (parsed.origin !== expected.origin) return false;\n const expectedsegments = expected.pathname.split(\"/\").filter(segment => segment !== \"\");\n const actualsegments = parsed.pathname.split(\"/\").filter(segment => segment !== \"\");\n if (expectedsegments.includes(\"**\")) {\n const cut = expectedsegments.indexOf(\"**\");\n const head = expectedsegments.slice(0, cut);\n const tail = expectedsegments.slice(cut + 1);\n if (actualsegments.length < head.length + tail.length) return false;\n if (!head.every((segment, position) => segmentmatches(segment, actualsegments[position] ?? \"\"))) return false;\n if (!tail.every((segment, position) => segmentmatches(segment, actualsegments[actualsegments.length - tail.length + position] ?? \"\"))) return false;\n } else if (expectedsegments.length !== actualsegments.length || !expectedsegments.every((segment, position) => segmentmatches(segment, actualsegments[position] ?? \"\"))) return false;\n }\n const values = parsed.searchParams;\n for (const [name, value] of Object.entries(pattern.query ?? {})) {\n if (!values.has(name)) return false;\n if (value !== \"*\" && values.get(name) !== value) return false;\n }\n if (pattern.fragment !== undefined && parsed.hash.slice(1) !== pattern.fragment) return false;\n return true;\n}\n\n/** Reads the current query parameters of a url. */\nfunction readquery(url: string): Record<string, string> {\n const values: Record<string, string> = {};\n try {\n for (const [name, value] of new URL(url).searchParams.entries()) values[name] = value;\n } catch { /* an unparseable url has no readable parameters */ }\n return values;\n}\n\n/** Result of one query rewrite with the parameters read, written and the new url. */\nexport interface queryrewriteoutcome {\n url: string;\n before: Record<string, string>;\n after: Record<string, string>;\n set: string[];\n removed: string[];\n}\n\n/** Rewrites the query parameters of one url: reviewed values are set, reviewed names removed and the rest preserved. */\nexport function rewritequeryurl(url: string, set: Record<string, string>, remove: string[]): queryrewriteoutcome {\n const parsed = new URL(url);\n const before = readquery(url);\n for (const name of remove) parsed.searchParams.delete(name);\n for (const [name, value] of Object.entries(set)) parsed.searchParams.set(name, value);\n parsed.hash = \"\";\n return { url: parsed.toString(), before, after: readquery(parsed.toString()), set: Object.keys(set), removed: [...remove] };\n}\n\n/** Applies one reviewed fragment to a url, keeping every other part untouched. */\nexport function fragmenturl(url: string, fragment: string): string {\n const parsed = new URL(url);\n parsed.hash = fragment.replace(/^#/, \"\");\n return parsed.toString();\n}\n\n/** Matches links by their visible text, case insensitively, refusing ambiguity through multiple matches. */\nexport function matchlinktext(links: linkshape[], text: string): linkshape[] {\n const wanted = text.trim().toLowerCase();\n return links.filter(link => link.text.trim().toLowerCase() === wanted);\n}\n\n/** Matches links by their href fragment when the reviewed option asks for fragment resolution. */\nexport function matchlinkfragment(links: linkshape[], fragment: string): linkshape[] {\n const wanted = fragment.trim().replace(/^#/, \"\");\n return links.filter(link => {\n try { return new URL(link.href, \"https://example.invalid\").hash.replace(/^#/, \"\") === wanted; } catch { return false; }\n });\n}\n\n/** Builds a deep link into a common web app from a reviewed app pattern and its string params; unknown apps are refused. */\nexport function deeplinkurl(app: string, params: Record<string, string>): string | null {\n const value = (name: string): string | undefined => {\n const item = params[name];\n return typeof item === \"string\" && item.trim() ? item.trim() : undefined;\n };\n switch (app.trim().toLowerCase()) {\n case \"github\": {\n const owner = value(\"owner\");\n const repo = value(\"repo\");\n if (!owner || !repo) return null;\n const path = value(\"path\");\n return `https://github.com/${owner}/${repo}${path ? `/${path.replace(/^\\/+/, \"\")}` : \"\"}`;\n }\n case \"youtube\": {\n const id = value(\"id\");\n if (id) return `https://www.youtube.com/watch?v=${encodeURIComponent(id)}`;\n const search = value(\"search\");\n if (search) return `https://www.youtube.com/results?search_query=${encodeURIComponent(search)}`;\n return null;\n }\n case \"maps\": {\n const query = value(\"query\");\n if (!query) return null;\n return `https://www.google.com/maps/search/${encodeURIComponent(query)}`;\n }\n case \"wikipedia\": {\n const title = value(\"title\");\n if (!title) return null;\n const language = value(\"language\") ?? \"en\";\n return `https://${language}.wikipedia.org/wiki/${encodeURIComponent(title.replace(/\\s+/g, \"_\"))}`;\n }\n case \"amazon\": {\n const search = value(\"search\");\n if (!search) return null;\n return `https://www.amazon.com/s?k=${encodeURIComponent(search)}`;\n }\n case \"x\": {\n const user = value(\"user\");\n if (!user) return null;\n return `https://x.com/${user.replace(/^@/, \"\")}`;\n }\n default: return null;\n }\n}\n\n/** True when the current url of a single page app changed without a reload, keeping the origin. */\nexport function spauroutechanged(previousurl: string, currenturl: string): boolean {\n if (previousurl === currenturl) return false;\n try {\n return new URL(previousurl).origin === new URL(currenturl).origin;\n } catch { return false; }\n}\n\n/** Picks the most recently closed tab whose url is no longer open; null when every recent tab is already restored. */\nexport function pickrecenttab(recenttabs: Array<{ url: string; tabid: number; closedat: number }>, openurls: string[]): { url: string; tabid: number; closedat: number } | null {\n return recenttabs.find(tab => !openurls.includes(tab.url)) ?? null;\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise(resolve => window.setTimeout(resolve, ms));\n}\n\nfunction stepoptions(step: toolstep): Record<string, unknown> {\n try { return parseoptions(step); } catch { return {}; }\n}\n\nfunction collectlinks(root: Document): linkshape[] {\n return [...root.querySelectorAll(\"a[href]\")].map(element => ({\n text: element.textContent?.trim() ?? \"\",\n href: element instanceof HTMLAnchorElement ? element.href : element.getAttribute(\"href\") ?? \"\",\n selector: element.getAttribute(\"href\") ?? \"\",\n }));\n}\n\n/** Resolves the reviewed link of a followlink or spanav step by visible text or href fragment, refusing links outside the allowed origins. */\nfunction resolvelink(step: toolstep, root: Document): { ok: true; element: HTMLAnchorElement } | { ok: false; summary: string } {\n const options = stepoptions(step);\n const allowedorigins = Array.isArray(options.allowedorigins) ? options.allowedorigins.filter((item): item is string => typeof item === \"string\") : [];\n const links = collectlinks(root);\n const matches = options.fragment === true ? matchlinkfragment(links, step.value ?? \"\") : matchlinktext(links, step.value ?? \"\");\n if (matches.length === 0) return { ok: false, summary: `No link matches the reviewed reference \"${step.value ?? \"\"}\".` };\n if (matches.length > 1) return { ok: false, summary: `The reviewed link reference matched ${matches.length} links; review a unique one.` };\n const element = [...root.querySelectorAll(\"a[href]\")].find(candidate => (candidate instanceof HTMLAnchorElement ? candidate.href : candidate.getAttribute(\"href\") ?? \"\") === matches[0]?.href);\n if (!(element instanceof HTMLAnchorElement)) return { ok: false, summary: \"The reviewed link is no longer available.\" };\n if (allowedorigins.length > 0) {\n let origin = \"\";\n try { origin = new URL(element.href).origin; } catch { origin = \"\"; }\n if (!allowedorigins.includes(origin)) return { ok: false, summary: `The reviewed link leaves the session origin grants for ${origin}.` };\n }\n return { ok: true, element };\n}\n\n/** Waits for the page load event and reports the ready state and load phase. */\nasync function runwaitload(step: toolstep): Promise<stepresult> {\n const options = stepoptions(step);\n const timeout = typeof options.timeout === \"number\" && Number.isFinite(options.timeout) && options.timeout > 0 ? options.timeout : 0;\n const started = Date.now();\n for (;;) {\n const phase = loadphase(document.readyState);\n if (phase === \"complete\") return { ok: true, summary: `The page load event fired and the document is complete after ${Date.now() - started} milliseconds.`, details: { phase, readystate: document.readyState, waited: Date.now() - started } };\n if (timeout > 0 && Date.now() - started >= timeout) return { ok: false, summary: `The page did not reach the complete load phase within the reviewed timeout of ${timeout} milliseconds.`, details: { phase, readystate: document.readyState, waited: Date.now() - started } };\n await wait(50);\n }\n}\n\n/** Waits until the current url matches the reviewed urlpattern. */\nasync function runwaiturl(step: toolstep): Promise<stepresult> {\n const options = stepoptions(step);\n const pattern = parseurlpattern(step);\n if (!pattern) return { ok: false, summary: \"A reviewed urlpattern is required.\" };\n const timeout = typeof options.timeout === \"number\" && Number.isFinite(options.timeout) && options.timeout > 0 ? options.timeout : 0;\n const poll = typeof options.poll === \"number\" && Number.isFinite(options.poll) && options.poll > 0 ? options.poll : 100;\n const started = Date.now();\n for (;;) {\n if (urlmatches(location.href, pattern)) return { ok: true, summary: `The url matched the reviewed ${pattern.mode} pattern after ${Date.now() - started} milliseconds.`, details: { url: location.href, mode: pattern.mode, waited: Date.now() - started } };\n if (timeout > 0 && Date.now() - started >= timeout) return { ok: false, summary: `The url did not match the reviewed ${pattern.mode} pattern within the reviewed timeout of ${timeout} milliseconds.`, details: { url: location.href, mode: pattern.mode, waited: Date.now() - started } };\n await wait(poll);\n }\n}\n\n/** Follows one reviewed link, reporting the href travelled to. */\nasync function runfollowlink(step: toolstep, root: Document): Promise<stepresult> {\n const resolution = resolvelink(step, root);\n if (!resolution.ok) return { ok: false, summary: resolution.summary };\n const href = resolution.element.href;\n resolution.element.click();\n return { ok: true, summary: `Followed the reviewed link to ${href}.`, details: { href } };\n}\n\n/** Navigates a single page app by clicking the reviewed control and waiting for the route change without a reload. */\nasync function runspanav(step: toolstep, root: Document): Promise<stepresult> {\n const options = stepoptions(step);\n const resolution = resolvelink(step, root);\n if (!resolution.ok) return { ok: false, summary: resolution.summary };\n const timeout = typeof options.timeout === \"number\" && Number.isFinite(options.timeout) && options.timeout > 0 ? options.timeout : 0;\n const pattern = parseurlpattern(step, \"routepattern\");\n const before = location.href;\n resolution.element.click();\n const started = Date.now();\n for (;;) {\n const changed = spauroutechanged(before, location.href);\n const matched = pattern ? urlmatches(location.href, pattern) : changed;\n if (matched) return { ok: true, summary: `The single page app route changed to ${location.href} without a reload.`, details: { from: before, to: location.href, waited: Date.now() - started } };\n if (timeout > 0 && Date.now() - started >= timeout) return { ok: false, summary: `The single page app route did not change within the reviewed timeout of ${timeout} milliseconds.`, details: { from: before, to: location.href, waited: Date.now() - started } };\n await wait(50);\n }\n}\n\n/** Waits for a url change inside a single page app without a reload, through popstate, hashchange and history polling. */\nasync function runspawait(step: toolstep): Promise<stepresult> {\n const options = stepoptions(step);\n const timeout = typeof options.timeout === \"number\" && Number.isFinite(options.timeout) && options.timeout > 0 ? options.timeout : 0;\n const poll = typeof options.poll === \"number\" && Number.isFinite(options.poll) && options.poll > 0 ? options.poll : 100;\n const pattern = parseurlpattern(step);\n const before = location.href;\n const started = Date.now();\n let detected = false;\n const onroute = (): void => { if (spauroutechanged(before, location.href)) detected = true; };\n window.addEventListener(\"popstate\", onroute);\n window.addEventListener(\"hashchange\", onroute);\n try {\n for (;;) {\n if (pattern ? urlmatches(location.href, pattern) : detected || spauroutechanged(before, location.href)) {\n return { ok: true, summary: `The single page app url changed to ${location.href} without a reload.`, details: { from: before, to: location.href, waited: Date.now() - started } };\n }\n if (timeout > 0 && Date.now() - started >= timeout) return { ok: false, summary: `The single page app url did not change within the reviewed timeout of ${timeout} milliseconds.`, details: { from: before, to: location.href, waited: Date.now() - started } };\n await wait(poll);\n }\n } finally {\n window.removeEventListener(\"popstate\", onroute);\n window.removeEventListener(\"hashchange\", onroute);\n }\n}\n\n/** Reads and rewrites the query parameters of the current url with pushstate, reporting the parameters read and the new url. */\nfunction runrewritequery(step: toolstep): stepresult {\n const options = stepoptions(step);\n const set: Record<string, string> = {};\n if (options.set && typeof options.set === \"object\" && !Array.isArray(options.set)) {\n for (const [name, value] of Object.entries(options.set as Record<string, unknown>)) if (typeof value === \"string\") set[name] = value;\n }\n const remove = Array.isArray(options.remove) ? options.remove.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const outcome = rewritequeryurl(location.href, set, remove);\n history.pushState(history.state, document.title, outcome.url);\n return { ok: true, summary: `Rewrote ${outcome.set.length + outcome.removed.length} query parameter${outcome.set.length + outcome.removed.length === 1 ? \"\" : \"s\"}; the url is now ${outcome.url}.`, details: { url: outcome.url, before: outcome.before, after: outcome.after, set: outcome.set, removed: outcome.removed } };\n}\n\n/** Sets the reviewed url fragment and scrolls to its anchor with smooth behavior. */\nasync function runsetfragment(step: toolstep): Promise<stepresult> {\n const fragment = (step.value ?? \"\").replace(/^#/, \"\");\n if (!fragment) return { ok: false, summary: \"A reviewed fragment is required.\" };\n const url = fragmenturl(location.href, fragment);\n history.pushState(history.state, document.title, url);\n const anchor = document.getElementById(fragment);\n anchor?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n return { ok: true, summary: `Set the url fragment to ${fragment} and scrolled to its anchor.`, details: { url, fragment, anchored: Boolean(anchor) } };\n}\n\n/** Stops a pending navigation by halting the document load. */\nfunction runstopnav(): stepresult {\n window.stop();\n return { ok: true, summary: \"Stopped the pending navigation of the page.\" };\n}\n\n/** Prefetches the reviewed urls by injecting prefetch hints into the document head. */\nfunction runprefetch(step: toolstep): stepresult {\n const options = stepoptions(step);\n const urls = Array.isArray(options.urls) ? options.urls.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n if (urls.length === 0) return { ok: false, summary: \"A reviewed list of prefetch urls is required.\" };\n for (const url of urls) {\n const hint = document.createElement(\"link\");\n hint.rel = \"prefetch\";\n hint.href = url;\n document.head.append(hint);\n }\n return { ok: true, summary: `Queued ${urls.length} prefetch hint${urls.length === 1 ? \"\" : \"s\"}.`, details: { urls } };\n}\n\n/** Preconnects to the reviewed origins by injecting preconnect hints into the document head. */\nfunction runpreconnect(step: toolstep): stepresult {\n const options = stepoptions(step);\n const origins = Array.isArray(options.origins) ? options.origins.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n if (origins.length === 0) return { ok: false, summary: \"A reviewed list of preconnect origins is required.\" };\n for (const origin of origins) {\n const hint = document.createElement(\"link\");\n hint.rel = \"preconnect\";\n hint.href = origin;\n document.head.append(hint);\n }\n return { ok: true, summary: `Opened ${origins.length} preconnect hint${origins.length === 1 ? \"\" : \"s\"}.`, details: { origins } };\n}\n\n/** Prints the page through the browser print pipeline; the artifact routing happens in the background. */\nfunction runprintpdf(): stepresult {\n window.print();\n return { ok: true, summary: \"Sent the page to the browser print pipeline.\" };\n}\n\n/** Runs one reviewed page navigation kind inside the page world. */\nexport function runpagenav(step: toolstep, root: Document = document): stepresult | Promise<stepresult> {\n switch (step.kind) {\n case \"waitload\": return runwaitload(step);\n case \"waiturl\": return runwaiturl(step);\n case \"followlink\": return runfollowlink(step, root);\n case \"spanav\": return runspanav(step, root);\n case \"spawait\": return runspawait(step);\n case \"rewritequery\": return runrewritequery(step);\n case \"setfragment\": return runsetfragment(step);\n case \"stopnav\": return runstopnav();\n case \"prefetch\": return runprefetch(step);\n case \"preconnect\": return runpreconnect(step);\n case \"printpdf\": return runprintpdf();\n default: return { ok: false, summary: \"Unsupported navigation action.\" };\n }\n}\n", "import type { authrecord, curatedlink, redirectchain, redirecthop, ratelimit, ratelimitstate, safetyverdict, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\n\n/**\n * Navigation network state logics for reviewed steps.\n * Every correlated rule for redirect chain assembly, http error and interstitial classification, per domain rate limit windows, url safety verdicts, curated batch lists, prefetch verification, preconnect origins and basic auth credential gating lives in this file.\n */\n\n/** One navigation watch event as observed from browser navigation listeners, serializable for fixtures. */\nexport interface navwatchevent {\n event: \"beforenavigate\" | \"committed\" | \"completed\" | \"error\" | \"urlchange\";\n url: string;\n timestamp: number;\n status?: number;\n redirect?: boolean;\n error?: string;\n}\n\n/** Assembles one redirect chain from navigation watch events: successive url changes become hops with statuses and timing, and the chain closes on completion or error. */\nexport function buildredirectchain(events: navwatchevent[]): redirectchain {\n const hops: redirecthop[] = [];\n let startedat = 0;\n let endedat = 0;\n let open = false;\n for (const event of events) {\n if (event.event === \"beforenavigate\") {\n hops.length = 0;\n startedat = event.timestamp;\n endedat = event.timestamp;\n open = true;\n hops.push({ url: event.url, status: event.status ?? 0, at: event.timestamp });\n continue;\n }\n if (!open) continue;\n endedat = event.timestamp;\n if (event.event === \"urlchange\" || event.redirect || (event.event === \"committed\" && hops[hops.length - 1]?.url !== event.url)) {\n if (hops[hops.length - 1]?.url === event.url && typeof event.status === \"number\") hops[hops.length - 1] = { url: event.url, status: event.status, at: event.timestamp };\n else hops.push({ url: event.url, status: event.status ?? 0, at: event.timestamp });\n continue;\n }\n if (event.event === \"committed\" && typeof event.status === \"number\" && hops[hops.length - 1]) {\n hops[hops.length - 1] = { url: event.url, status: event.status, at: event.timestamp };\n continue;\n }\n if (event.event === \"completed\" || event.event === \"error\") {\n if (event.event === \"completed\" && hops[hops.length - 1] && hops[hops.length - 1]?.url !== event.url) hops.push({ url: event.url, status: event.status ?? 200, at: event.timestamp });\n if (event.event === \"completed\" && typeof event.status === \"number\" && hops[hops.length - 1]) hops[hops.length - 1] = { url: event.url, status: event.status, at: event.timestamp };\n open = false;\n }\n }\n return { hops, startedat, endedat: endedat || startedat };\n}\n\n/** Returns the final url of a redirect chain: the url of its last hop. */\nexport function finalurl(chain: redirectchain): string {\n return chain.hops[chain.hops.length - 1]?.url ?? \"\";\n}\n\n/** Counts the redirect hops of a chain, ignoring the first and the final urls when no intermediary hop exists. */\nexport function redirectcount(chain: redirectchain): number {\n return Math.max(0, chain.hops.length - 1);\n}\n\n/** Classifies a navigation url change: a full load, a spa route change without reload, a reload or no change. */\nexport function classifynavchange(previousurl: string, currenturl: string, status: string | undefined): \"load\" | \"route\" | \"reload\" | \"none\" {\n if (previousurl === currenturl) return status === \"loading\" ? \"reload\" : \"none\";\n try {\n if (new URL(previousurl).origin !== new URL(currenturl).origin) return \"load\";\n } catch { return \"load\"; }\n return status === \"loading\" ? \"load\" : \"route\";\n}\n\n/** One classified http state of a navigation: http error, offline and certificate interstitial flags with reasons. */\nexport interface httpstate {\n httperror: boolean;\n offline: boolean;\n certificate: boolean;\n reasons: string[];\n}\n\n/** Detects the http error, offline and certificate interstitial states from the offline flag, error strings and observed statuses. */\nexport function detecthttpstate(input: { offline: boolean; errors?: string[]; statuses?: number[] }): httpstate {\n const reasons: string[] = [];\n let httperror = false;\n let certificate = false;\n const errors = input.errors ?? [];\n const statuses = input.statuses ?? [];\n for (const error of errors) {\n if (/CERT|SSL|TLS|privacy bad|your connection is not private/i.test(error)) { certificate = true; httperror = true; reasons.push(`certificate interstitial: ${error}`); continue; }\n if (/ERR_NAME_NOT_RESOLVED|ERR_CONNECTION|ERR_TIMED_OUT|ERR_INTERNET_DISCONNECTED|ERR_ADDRESS_UNREACHABLE|ERR_NETWORK/i.test(error)) { httperror = true; reasons.push(`network error: ${error}`); continue; }\n httperror = true;\n reasons.push(`navigation error: ${error}`);\n }\n for (const status of statuses) {\n if (status >= 400 && status < 600) { httperror = true; reasons.push(`http status ${status}`); }\n }\n if (input.offline) reasons.push(\"browser reports offline\");\n return { httperror, offline: input.offline, certificate, reasons };\n}\n\n/** Applies the certificate interstitial policy: interstitials are reported for review, never bypassed. */\nexport function interstitialpolicy(state: httpstate): { interstitial: boolean; bypass: boolean; guidance: string } {\n if (state.certificate) return { interstitial: true, bypass: false, guidance: \"A certificate interstitial was detected; Devthink reports it for review and never bypasses it.\" };\n if (state.httperror) return { interstitial: true, bypass: false, guidance: \"An http error state was detected and is reported for review.\" };\n return { interstitial: false, bypass: false, guidance: \"No interstitial was detected.\" };\n}\n\n/** Reads the reviewed ratelimit of a navrate step; null when the step reviews none. */\nexport function parseratelimit(step: toolstep): ratelimit | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const value = options.ratelimit;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const limit = value as Record<string, unknown>;\n const window = typeof limit.window === \"number\" && Number.isFinite(limit.window) && limit.window > 0 ? limit.window : 0;\n const ceiling = typeof limit.ceiling === \"number\" && Number.isInteger(limit.ceiling) && limit.ceiling >= 1 ? limit.ceiling : 0;\n if (window <= 0 || ceiling < 1) return null;\n const domain = typeof limit.domain === \"string\" && limit.domain.trim() ? limit.domain.trim() : \"\";\n return { domain, window, ceiling };\n}\n\n/** Reads the domain of a url for rate limit accounting. */\nexport function domainof(url: string): string {\n try { return new URL(url).hostname; } catch { return \"\"; }\n}\n\n/** Returns the live rate limit window state of one domain, opening a fresh window when the reviewed window has elapsed. */\nexport function ratewindow(state: ratelimitstate | undefined, limit: ratelimit, now: number): ratelimitstate {\n if (state && state.domain === limit.domain && state.limit.window === limit.window && state.limit.ceiling === limit.ceiling && now < state.openedat + limit.window) return state;\n return { domain: limit.domain, limit, openedat: now, count: 0 };\n}\n\n/** Decides whether one more navigation fits inside the reviewed per domain rate limit window. */\nexport function rateallows(state: ratelimitstate, now: number): { allowed: boolean; remaining: number; retryafter: number } {\n const elapsed = now - state.openedat;\n const remaining = Math.max(0, state.limit.ceiling - state.count);\n const retryafter = Math.max(0, state.limit.window - elapsed);\n return { allowed: remaining > 0, remaining, retryafter };\n}\n\n/** Records one navigation hit inside the live rate limit window of a domain. */\nexport function recordratehit(state: ratelimitstate, now: number): ratelimitstate {\n return { ...state, count: state.count + 1, ...(state.count + 1 === 1 ? { openedat: now } : {}) };\n}\n\n/** Verifies one url for safety: HTTPS only, no embedded credentials and no private network or raw ip targets. */\nexport function checksafe(url: string): safetyverdict {\n const reasons: string[] = [];\n let safe = true;\n let parsed: URL;\n try { parsed = new URL(url); } catch { return { url, safe: false, reasons: [\"the url does not parse\"], at: 0 }; }\n if (parsed.protocol !== \"https:\") { safe = false; reasons.push(\"the url must use HTTPS\"); }\n if (parsed.username || parsed.password) { safe = false; reasons.push(\"the url carries embedded credentials\"); }\n const host = parsed.hostname.toLowerCase();\n const privatelist = [\"localhost\", \"127.0.0.1\", \"0.0.0.0\", \"::1\", \"[::1]\"];\n if (privatelist.includes(host) || /^10\\./.test(host) || /^192\\.168\\./.test(host) || /^172\\.(1[6-9]|2\\d|3[01])\\./.test(host) || /^169\\.254\\./.test(host)) { safe = false; reasons.push(`the host ${host} is a private network target`); }\n if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(host) || /^\\[?[0-9a-f:]+\\]?$/i.test(host)) { safe = false; reasons.push(`the host ${host} is a raw address without a domain`); }\n return { url, safe, reasons, at: 0 };\n}\n\n/** Builds the curated link list of a batchopen step from per url safety verdicts. */\nexport function curatelinks(urls: string[], verifier: (url: string) => safetyverdict): curatedlink[] {\n return urls.map(url => {\n const verdict = verifier(url);\n return { url, verdict: verdict.safe ? \"safe\" : \"unsafe\", reasons: verdict.reasons };\n });\n}\n\n/** Splits a curated link list into the urls batch opening may open and the unsafe ones it refuses. */\nexport function batchopenset(links: curatedlink[]): { open: string[]; refused: Array<{ url: string; reasons: string[] }> } {\n const open: string[] = [];\n const refused: Array<{ url: string; reasons: string[] }> = [];\n for (const link of links) {\n if (link.verdict === \"safe\") open.push(link.url);\n else refused.push({ url: link.url, reasons: link.reasons });\n }\n return { open, refused };\n}\n\n/** Verifies prefetch candidates against the session grants: only granted urls may be prefetched. */\nexport function prefetchcandidates(urls: string[], grants: string[]): { allowed: string[]; refused: string[] } {\n const allowed: string[] = [];\n const refused: string[] = [];\n for (const url of urls) {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { refused.push(url); continue; }\n if (grants.includes(origin)) allowed.push(url);\n else refused.push(url);\n }\n return { allowed, refused };\n}\n\n/** Deduplicates the preconnect origins of one preconnect step. */\nexport function preconnectorigins(origins: string[]): string[] {\n return [...new Set(origins.map(origin => origin.trim()).filter(Boolean))];\n}\n\n/** Finds the reviewed basic auth credentials of one origin; the auth flow refuses to run without them. */\nexport function authfor(auths: authrecord[], url: string): authrecord | undefined {\n let origin = \"\";\n try { origin = new URL(url).origin; } catch { return undefined; }\n return auths.find(record => record.origin === origin);\n}\n", "import type { fielderror, fieldkind, fieldmatch, formrecord, formentry, formreport, toolstep } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { clean, elementlabel as label, elementselector as selector } from \"./pageresolve.js\";\n\n/**\n * Form field logics for reviewed steps.\n * Every correlated rule for field matching, field kind classification, seeded value generation, native value fills, honeypot detection, login and template detection, error association and form record parsing lives in this file.\n */\n\n/** One serializable form field shape resolved against the page controls. */\nexport interface fieldshape {\n selector: string;\n tag: string;\n type: string;\n name: string;\n label: string;\n placeholder: string;\n arialabel: string;\n autocomplete: string;\n options?: string[];\n}\n\n/** One surveyed field shape carrying the visibility, geometry and timing evidence the honeypot detector reads. */\nexport interface fieldsurvey extends fieldshape {\n hidden: boolean;\n offscreen: boolean;\n createdat?: number;\n}\n\n/** One honeypot field flagged by hidden, offscreen or time trap evidence. */\nexport interface honeypotevidence {\n selector: string;\n reason: \"hidden\" | \"offscreen\" | \"timetrap\";\n}\n\n/** One surveyed field with the aria describedby ref and the sibling message texts the error reader associates. */\nexport interface errorcontext extends fieldshape {\n describedby?: string;\n siblings: string[];\n}\n\n/** Resolves controls by label, placeholder, aria label and name attributes; matches are case insensitive substrings. */\nexport function matchfield(fields: fieldshape[], match: fieldmatch): fieldshape[] {\n const key = match.mode === \"label\" ? \"label\" : match.mode === \"placeholder\" ? \"placeholder\" : match.mode === \"arialabel\" ? \"arialabel\" : \"name\";\n const needle = (match[key] ?? \"\").trim().toLowerCase();\n if (!needle) return [];\n return fields.filter(field => {\n const primary = (field[key] as string).toLowerCase();\n const secondary = match.mode === \"label\" || match.mode === \"name\" ? field.name.toLowerCase() : match.mode === \"placeholder\" ? field.arialabel.toLowerCase() : field.placeholder.toLowerCase();\n return primary.includes(needle) || secondary.includes(needle);\n });\n}\n\n/** Infers the field kind of one control from its input type, autocomplete hint and label text. */\nexport function classifyfield(input: { type: string; autocomplete: string; label: string }): fieldkind {\n const type = input.type.toLowerCase();\n const autocomplete = input.autocomplete.toLowerCase();\n const label = input.label.toLowerCase();\n if (type === \"password\") return \"password\";\n if (autocomplete.startsWith(\"cc-\") || label.includes(\"card number\") || label.includes(\"credit card\") || label.includes(\"cardholder\")) return \"card\";\n if (autocomplete.includes(\"one-time-code\") || autocomplete.includes(\"otp\") || label.includes(\"one time code\") || label.includes(\"verification code\") || label.includes(\"otp\")) return \"code\";\n if (type === \"email\" || autocomplete.includes(\"email\") || label.includes(\"email\")) return \"email\";\n if (type === \"tel\" || autocomplete.includes(\"tel\") || label.includes(\"phone\") || label.includes(\"telephone\")) return \"phone\";\n if (type === \"date\") return \"date\";\n if (type === \"number\") return \"number\";\n if (type === \"checkbox\") return \"check\";\n if (type === \"radio\") return \"radio\";\n if (type === \"file\") return \"file\";\n if (type === \"select\" || type === \"select-one\") return \"select\";\n return \"text\";\n}\n\nconst firstnames: Record<string, string[]> = { en: [\"alex\", \"jordan\", \"taylor\", \"morgan\", \"casey\"], pt: [\"ana\", \"bruno\", \"carla\", \"diego\", \"helena\"] };\nconst lastnames: Record<string, string[]> = { en: [\"brooks\", \"carter\", \"diaz\", \"evans\", \"reyes\"], pt: [\"alves\", \"costa\", \"lima\", \"souza\", \"moraes\"] };\n\nfunction localekey(locale: string): string {\n const normalized = locale.toLowerCase();\n if (normalized.startsWith(\"pt\")) return \"pt\";\n return \"en\";\n}\n\n/** Generates one realistic value for a field kind, deterministically seeded and locale aware for names, emails and phones. */\nexport function generatevalue(kind: fieldkind, rule: { locale?: string; seed?: number }): string {\n const seed = typeof rule.seed === \"number\" && Number.isFinite(rule.seed) ? Math.abs(Math.floor(rule.seed)) : 1;\n const names = firstnames[localekey(rule.locale ?? \"en\")] ?? firstnames.en ?? [\"alex\"];\n const surnames = lastnames[localekey(rule.locale ?? \"en\")] ?? lastnames.en ?? [\"brooks\"];\n let state = seed * 1103515245 + 12345;\n const next = (): number => { state = (state * 1103515245 + 12345) % 2147483648; return state / 2147483648; };\n const pick = <T>(items: T[]): T => items[Math.floor(next() * items.length) % items.length] ?? items[0] as T;\n const digits = (count: number): string => Array.from({ length: count }, () => String(Math.floor(next() * 10))).join(\"\");\n const person = `${pick(names)} ${pick(surnames)}`;\n switch (kind) {\n case \"email\": return `${person.replace(\" \", \".\")}${digits(2)}@example.com`;\n case \"phone\": return localekey(rule.locale ?? \"en\") === \"pt\" ? `+55 (11) 9${digits(4)}-${digits(4)}` : `+1 (555) 010-${digits(4)}`;\n case \"date\": return `${2024 + Math.floor(next() * 2)}-${String(1 + Math.floor(next() * 12)).padStart(2, \"0\")}-${String(1 + Math.floor(next() * 28)).padStart(2, \"0\")}`;\n case \"number\": return String(Math.floor(next() * 1000));\n case \"select\": return `option ${1 + Math.floor(next() * 5)}`;\n case \"check\": return next() > 0.5 ? \"true\" : \"false\";\n case \"radio\": return `choice ${1 + Math.floor(next() * 4)}`;\n case \"file\": return `sample${digits(2)}.pdf`;\n case \"password\": return `pw-${digits(6)}-${pick(names)}`;\n case \"card\": return `4111 ${digits(4)} ${digits(4)} ${digits(4)}`;\n case \"code\": return digits(6);\n default: return person;\n }\n}\n\n/** Builds a deterministic values hash of the reviewed field values a submission ticket records. */\nexport function valueshash(values: Array<{ label: string; value: string }>): string {\n const source = values.map(entry => `${entry.label}=${entry.value}`).join(\"|\");\n let hash = 5381;\n for (let index = 0; index < source.length; index += 1) hash = ((hash * 33) ^ source.charCodeAt(index)) >>> 0;\n return hash.toString(16);\n}\n\n/** Parses the reviewed structured form record of a step; null when the step reviews none or the shape is invalid. */\nexport function parseformrecord(value: unknown): formrecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const record = value as Record<string, unknown>;\n if (!Array.isArray(record.entries)) return null;\n const entries: formentry[] = [];\n for (const item of record.entries) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const entry = item as Record<string, unknown>;\n const match = entry.match;\n if (!match || typeof match !== \"object\" || Array.isArray(match)) continue;\n const shapes = match as Record<string, unknown>;\n if (typeof shapes.mode !== \"string\") continue;\n const fieldmatch: fieldmatch = {\n mode: shapes.mode as fieldmatch[\"mode\"],\n ...(typeof shapes.label === \"string\" ? { label: shapes.label } : {}),\n ...(typeof shapes.placeholder === \"string\" ? { placeholder: shapes.placeholder } : {}),\n ...(typeof shapes.arialabel === \"string\" ? { arialabel: shapes.arialabel } : {}),\n ...(typeof shapes.name === \"string\" ? { name: shapes.name } : {}),\n };\n if (typeof entry.kind !== \"string\" || typeof entry.value !== \"string\") continue;\n entries.push({ match: fieldmatch, kind: entry.kind as fieldkind, value: entry.value });\n }\n if (entries.length === 0) return null;\n return { ...(typeof record.form === \"string\" && record.form ? { form: record.form } : {}), entries };\n}\n\n/** Builds form record entries from reviewed label or placeholder value pairs. */\nexport function pairentries(pairs: Array<{ label?: string; placeholder?: string; value: string }>, mode: \"label\" | \"placeholder\"): formrecord {\n return { entries: pairs.map(pair => ({ match: mode === \"label\" ? { mode, label: pair.label ?? \"\" } : { mode, placeholder: pair.placeholder ?? \"\" }, kind: \"text\", value: pair.value })) };\n}\n\n/** One fill operation outcome: the entry, the matched control, the honeypot skip flag or the refusal reason. */\nexport interface filloutcome {\n entry: formentry;\n matched?: fieldshape;\n skipped?: boolean;\n reason?: string;\n}\n\n/** Resolves every entry of a form record against the surveyed fields, skipping honeypots and refusing unmatched or ambiguous entries. */\nexport function filloperations(record: formrecord, fields: fieldshape[], skippedselectors: string[] = []): filloutcome[] {\n return record.entries.map(entry => {\n const matches = matchfield(fields, entry.match);\n if (matches.length === 0) return { entry, reason: \"unmatched\" };\n if (matches.length > 1) return { entry, reason: \"ambiguous\" };\n const matched = matches[0] as fieldshape;\n if (skippedselectors.includes(matched.selector)) return { entry, matched, skipped: true };\n return { entry, matched };\n });\n}\n\n/** Masks one card segment so side panels can render card fills without exposing the full value. */\nexport function cardmask(value: string): string {\n const trimmed = value.trim();\n if (/^\\d[\\d\\s-]{11,18}$/.test(trimmed)) {\n const compact = trimmed.replace(/[\\s-]/g, \"\");\n const last = compact.slice(-4);\n return `${\"\u2022\".repeat(Math.max(0, compact.length - 4))}${last}`;\n }\n return \"\u2022\".repeat(trimmed.length);\n}\n\n/** Flags hidden, offscreen and time trap fields so fill steps skip them instead of tripping anti bot defenses. */\nexport function detecthoneypots(surveys: fieldsurvey[], loadedat: number): honeypotevidence[] {\n const traps: honeypotevidence[] = [];\n for (const field of surveys) {\n if (field.hidden) traps.push({ selector: field.selector, reason: \"hidden\" });\n else if (field.offscreen) traps.push({ selector: field.selector, reason: \"offscreen\" });\n else if (field.createdat !== undefined && loadedat > 0 && field.createdat > loadedat) traps.push({ selector: field.selector, reason: \"timetrap\" });\n }\n return traps;\n}\n\n/** Detects a login form: a password field plus an identifier field with session links nearby. */\nexport function detectlogin(fields: fieldshape[], links: string[]): { login: boolean; markers: string[] } {\n const markers: string[] = [];\n const password = fields.find(field => classifyfield(field) === \"password\");\n if (password) markers.push(\"password field\");\n const identifier = fields.find(field => {\n const kind = classifyfield(field);\n return kind === \"email\" || (kind === \"text\" && /user|login|account|identifier/i.test(`${field.name} ${field.label}`));\n });\n if (identifier) markers.push(\"identifier field\");\n const sessionlink = links.some(link => /sign in|log in|log on|forgot|create account|sign up/i.test(link));\n if (sessionlink) markers.push(\"session link\");\n return { login: Boolean(password && identifier && sessionlink), markers };\n}\n\nconst signupmarkers = [\"sign up\", \"create account\", \"register\", \"confirm password\", \"terms\"];\nconst checkoutmarkers = [\"checkout\", \"payment\", \"billing\", \"shipping\", \"card number\", \"place order\", \"cart\"];\n\n/** Detects signup and checkout templates by matching the field labels, autocompletes and page text against known markers. */\nexport function detecttemplate(fields: fieldshape[], text: string): { template: \"signup\" | \"checkout\" | \"unknown\"; markers: string[] } {\n const corpus = [text, ...fields.map(field => `${field.label} ${field.name} ${field.placeholder} ${field.arialabel} ${field.autocomplete}`)].join(\" \").toLowerCase();\n const signup = signupmarkers.filter(marker => corpus.includes(marker));\n const checkout = checkoutmarkers.filter(marker => corpus.includes(marker));\n if (signup.length >= 2 && signup.length >= checkout.length) return { template: \"signup\", markers: signup };\n if (checkout.length >= 2) return { template: \"checkout\", markers: checkout };\n return { template: \"unknown\", markers: [...signup, ...checkout] };\n}\n\n/** Associates validation messages with fields through aria describedby refs and the sibling text next to each field. */\nexport function associateerrors(contexts: errorcontext[], messages: Array<{ id?: string; text: string }>): fielderror[] {\n const errors: fielderror[] = [];\n for (const field of contexts) {\n const byref = field.describedby ? messages.find(message => message.id === field.describedby && message.text.trim()) : undefined;\n if (byref) { errors.push({ field: field.selector, message: byref.text.trim() }); continue; }\n const sibling = field.siblings.map(text => text.trim()).find(text => text.length > 0);\n if (sibling) errors.push({ field: field.selector, message: sibling });\n }\n return errors;\n}\n\n/** Resolves one reviewed artifact name against the run store before a file input is filled. */\nexport function attachplan(name: string, artifacts: Array<{ id: string; name: string; kind: string }>): { artifact?: { id: string; name: string; kind: string }; reason?: string } {\n const artifact = artifacts.find(item => item.name === name || item.id === name);\n if (!artifact) return { reason: \"The reviewed artifact name is not part of the run store.\" };\n return { artifact };\n}\n\n/** Selectors the captcha detector probes; a hit hands control back to the user instead of forcing the page. */\nexport const captchamarkers = ['iframe[src*=\"recaptcha\"]', 'iframe[title*=\"recaptcha\" i]', '.g-recaptcha', '[data-sitekey]', 'iframe[title*=\"captcha\" i]', '.h-captcha'];\n\n/** True when any captcha marker matched, so the plan pauses and hands control to the user. */\nexport function captchadetected(matched: string[]): boolean {\n return matched.length > 0;\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\n/** Fills one control through the native setter with input and change events; checks, radios and selects use their own grammar. */\nexport function fillcontrol(element: Element, entry: formentry): boolean {\n if (element instanceof HTMLInputElement && (entry.kind === \"check\" || element.type === \"checkbox\")) { element.checked = entry.value === \"true\" || entry.value === \"on\" || entry.value === \"checked\"; events(element); return true; }\n if (element instanceof HTMLInputElement && (entry.kind === \"radio\" || element.type === \"radio\")) { element.checked = true; events(element); return true; }\n if (element instanceof HTMLSelectElement) {\n const option = [...element.options].find(candidate => candidate.value === entry.value || candidate.textContent?.trim() === entry.value);\n if (!option) return false;\n element.value = option.value;\n events(element);\n return true;\n }\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n if (element instanceof HTMLInputElement && element.type === \"file\") return false;\n element.focus();\n const setter = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element), \"value\")?.set;\n if (setter) setter.call(element, entry.value); else element.value = entry.value;\n events(element);\n return true;\n }\n return false;\n}\n\nfunction controlshape(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): fieldshape {\n return {\n selector: selector(element),\n tag: element.tagName.toLowerCase(),\n type: element instanceof HTMLSelectElement ? \"select\" : element.getAttribute(\"type\") || \"text\",\n name: element.getAttribute(\"name\") || \"\",\n label: label(element),\n placeholder: element.getAttribute(\"placeholder\") || \"\",\n arialabel: element.getAttribute(\"aria-label\") || \"\",\n autocomplete: element.getAttribute(\"autocomplete\") || \"\",\n ...(element instanceof HTMLSelectElement ? { options: [...element.options].map(option => option.value) } : {}),\n };\n}\n\n/** Collects the serializable field shapes of one form scope; absent scopes survey the whole document. */\nfunction collectfields(root: Document, formscope?: string): Array<{ shape: fieldshape; element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement }> {\n const scope = formscope ? root.querySelector(formscope) : root;\n if (!scope) return [];\n const controls = [...scope.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\"input, select, textarea\")];\n return controls.filter(element => element.type !== \"hidden\").map(element => ({ shape: controlshape(element), element }));\n}\n\n/** Surveys the visibility and geometry evidence the honeypot detector reads for one form scope. */\nfunction surveyfields(root: Document, formscope?: string): Array<{ survey: fieldsurvey; element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement }> {\n const viewport = { left: 0, top: 0, right: window.innerWidth || 0, bottom: window.innerHeight || 0 };\n return collectfields(root, formscope).map(({ shape, element }) => {\n const rect = element.getBoundingClientRect();\n const hidden = element.getAttribute(\"aria-hidden\") === \"true\" || element.tabIndex < 0 && (element as HTMLElement).offsetParent === null || (element as HTMLElement).offsetParent === null && rect.width === 0 && rect.height === 0;\n const offscreen = rect.width > 0 && rect.height > 0 && (rect.bottom < viewport.top || rect.top > viewport.bottom || rect.right < viewport.left || rect.left > viewport.right);\n return { survey: { ...shape, hidden, offscreen }, element };\n });\n}\n\n/** Reads the error context of one form scope: describedby refs and the sibling texts after each field. */\nfunction collecterrorcontext(root: Document, formscope?: string): Array<{ context: errorcontext; element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement }> {\n return collectfields(root, formscope).map(({ shape, element }) => {\n const siblings: string[] = [];\n let neighbor = element.nextElementSibling;\n for (let index = 0; neighbor && index < 3; index += 1) {\n const text = clean(neighbor.textContent || \"\");\n if (text && text !== shape.label) siblings.push(text);\n neighbor = neighbor.nextElementSibling;\n }\n const describedby = element.getAttribute(\"aria-describedby\");\n return { context: { ...shape, ...(describedby ? { describedby } : {}), siblings }, element };\n });\n}\n\n/** Runs one reviewed forms and data step inside the page: fills, surveys, detects and reads errors without leaving the form scope. */\nexport function runpageform(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 const formscope = typeof options.form === \"string\" && options.form ? options.form : step.target;\n switch (step.kind) {\n case \"fillform\": {\n const record = parseformrecord(options.formrecord);\n if (!record) return { ok: false, summary: \"A reviewed form record with entries is required in options.\" };\n const surveys = surveyfields(root, record.form);\n const honeypots = detecthoneypots(surveys.map(entry => entry.survey), 0);\n const operations = filloperations(record, surveys.map(entry => entry.survey), honeypots.map(trap => trap.selector));\n let filled = 0;\n const skipped: string[] = [];\n const failures: string[] = [];\n const values: Array<{ label: string; value: string }> = [];\n for (const operation of operations) {\n if (operation.skipped && operation.matched) { skipped.push(operation.matched.selector); continue; }\n if (!operation.matched) { failures.push(`${operation.reason}: ${operation.entry.match.label ?? operation.entry.match.name ?? operation.entry.match.placeholder ?? \"field\"}`); continue; }\n const element = surveys.find(entry => entry.survey.selector === operation.matched?.selector)?.element;\n if (!element || !fillcontrol(element, operation.entry)) { failures.push(`unfillable: ${operation.matched.selector}`); continue; }\n filled += 1;\n values.push({ label: operation.matched.label || operation.matched.name, value: operation.entry.kind === \"password\" ? \"\" : operation.entry.value });\n }\n const report: formreport = { form: record.form ?? \"\", fields: operations.map(operation => ({ selector: operation.matched?.selector ?? \"\", label: operation.matched?.label ?? operation.entry.match.label ?? \"\", kind: operation.entry.kind, matched: Boolean(operation.matched) })) };\n return {\n ok: failures.length === 0,\n summary: failures.length === 0 ? `Filled ${filled} reviewed field${filled === 1 ? \"\" : \"s\"} from the structured record${skipped.length > 0 ? ` and skipped ${skipped.length} honeypot field${skipped.length === 1 ? \"\" : \"s\"}` : \"\"}.` : `Filled ${filled} of ${record.entries.length} reviewed fields; ${failures.length} refusals: ${failures.join(\"; \")}.`,\n details: { filled, skipped, failures, values, report },\n };\n }\n case \"filllabel\":\n case \"fillplaceholder\": {\n const mode = step.kind === \"filllabel\" ? \"label\" : \"placeholder\";\n const pairs = Array.isArray(options.fields) ? (options.fields as Array<Record<string, unknown>>).filter(item => item && typeof item === \"object\") : [];\n const record = pairentries(pairs.map(pair => ({ label: typeof pair.label === \"string\" ? pair.label : \"\", placeholder: typeof pair.placeholder === \"string\" ? pair.placeholder : \"\", value: typeof pair.value === \"string\" ? pair.value : \"\" })), mode);\n if (record.entries.length === 0) return { ok: false, summary: \"A reviewed non-empty list of field pairs is required in options.\" };\n const surveys = surveyfields(root, formscope);\n const honeypots = detecthoneypots(surveys.map(entry => entry.survey), 0);\n const operations = filloperations(record, surveys.map(entry => entry.survey), honeypots.map(trap => trap.selector));\n let filled = 0;\n const failures: string[] = [];\n for (const operation of operations) {\n if (operation.skipped) continue;\n if (!operation.matched) { failures.push(`${operation.reason}: ${mode === \"label\" ? operation.entry.match.label : operation.entry.match.placeholder}`); continue; }\n const element = surveys.find(entry => entry.survey.selector === operation.matched?.selector)?.element;\n const refined: formentry = { ...operation.entry, kind: classifyfield(operation.matched) };\n if (!element || !fillcontrol(element, refined)) { failures.push(`unfillable: ${operation.matched.selector}`); continue; }\n filled += 1;\n }\n return { ok: failures.length === 0, summary: failures.length === 0 ? `Filled ${filled} field${filled === 1 ? \"\" : \"s\"} matched by ${mode}.` : `Filled ${filled} of ${record.entries.length} fields matched by ${mode}; ${failures.join(\"; \")}.`, details: { filled, failures, mode } };\n }\n case \"detectfields\": {\n const collected = collectfields(root, formscope);\n const report: formreport = { form: formscope ?? \"\", fields: collected.map(entry => ({ selector: entry.shape.selector, label: entry.shape.label || entry.shape.name, kind: classifyfield(entry.shape), matched: Boolean(entry.shape.label || entry.shape.name) })) };\n return { ok: true, summary: `Detected ${collected.length} form field${collected.length === 1 ? \"\" : \"s\"} with their kinds.`, details: { report, count: collected.length } };\n }\n case \"generatevalues\": {\n const rule = options.valuegen && typeof options.valuegen === \"object\" && !Array.isArray(options.valuegen) ? options.valuegen as Record<string, unknown> : {};\n const locale = typeof rule.locale === \"string\" ? rule.locale : \"en\";\n const seed = typeof rule.seed === \"number\" && Number.isFinite(rule.seed) ? rule.seed : 1;\n const surveys = surveyfields(root, formscope);\n const honeypots = detecthoneypots(surveys.map(entry => entry.survey), 0);\n const skippedselectors = new Set(honeypots.map(trap => trap.selector));\n const candidates = surveys.filter(entry => !skippedselectors.has(entry.survey.selector));\n const values = candidates.map(entry => ({ label: entry.survey.label || entry.survey.name || entry.survey.selector, kind: classifyfield(entry.survey), value: generatevalue(classifyfield(entry.survey), { locale, seed }) }));\n const single = values.length === 0 && typeof rule.kind === \"string\" ? [{ label: rule.kind, kind: rule.kind, value: generatevalue(rule.kind as fieldkind, { locale, seed }) }] : values;\n return { ok: true, summary: `Generated ${single.length} realistic value${single.length === 1 ? \"\" : \"s\"} for the detected field kinds.`, details: { values: single, locale, seed } };\n }\n case \"readerrors\": {\n const contexts = collecterrorcontext(root, formscope);\n const messages = [...root.querySelectorAll<HTMLElement>(\"[id]\")].map(element => ({ id: element.id, text: clean(element.textContent || \"\") })).filter(message => message.text.length > 0);\n const errors = associateerrors(contexts.map(entry => entry.context), messages);\n return { ok: true, summary: errors.length === 0 ? \"No validation error was found next to the reviewed fields.\" : `Collected ${errors.length} inline validation message${errors.length === 1 ? \"\" : \"s\"}.`, details: { errors, form: formscope ?? \"\" } };\n }\n case \"skiphoneypot\": {\n const surveys = surveyfields(root, formscope);\n const traps = detecthoneypots(surveys.map(entry => entry.survey), 0);\n return { ok: true, summary: traps.length === 0 ? \"No honeypot field was detected.\" : `Skipped ${traps.length} honeypot field${traps.length === 1 ? \"\" : \"s\"}: ${traps.map(trap => `${trap.selector} (${trap.reason})`).join(\", \")}.`, details: { skipped: traps } };\n }\n case \"detectlogin\": {\n const collected = collectfields(root, formscope);\n const links = [...(formscope ? root.querySelectorAll(formscope) : [root] as unknown as Element[])].flatMap(scope => [...scope.querySelectorAll(\"a[href], button\")]).map(element => clean(element.textContent || \"\"));\n const detection = detectlogin(collected.map(entry => entry.shape), links);\n return { ok: true, summary: detection.login ? `Login form detected with ${detection.markers.join(\", \")}.` : \"No login form was detected.\", details: { login: detection.login, markers: detection.markers } };\n }\n case \"detecttemplate\": {\n const collected = collectfields(root, formscope);\n const text = clean(root.body?.innerText || \"\");\n const detection = detecttemplate(collected.map(entry => entry.shape), text);\n return { ok: true, summary: detection.template === \"unknown\" ? \"No signup or checkout template was detected.\" : `${detection.template} template detected with markers ${detection.markers.join(\", \")}.`, details: { template: detection.template, markers: detection.markers } };\n }\n case \"handoffcaptcha\": {\n const matched = captchamarkers.filter(marker => root.querySelector(marker) !== null);\n return { ok: true, summary: captchadetected(matched) ? `Captcha presence detected (${matched.join(\", \")}); control hands back to the user.` : \"No captcha was detected.\", details: { captcha: captchadetected(matched), markers: matched } };\n }\n case \"asksubmit\": {\n const collected = collectfields(root, step.value || undefined);\n const values = collected.map(entry => ({ label: entry.shape.label || entry.shape.name || entry.shape.selector, value: entry.element instanceof HTMLSelectElement ? entry.element.value : (entry.element as HTMLInputElement).value }));\n return { ok: true, summary: `Read ${values.length} field value${values.length === 1 ? \"\" : \"s\"} for the submission review.`, details: { values } };\n }\n case \"submitform\": {\n const form = target instanceof HTMLFormElement ? target : target instanceof HTMLElement ? target.closest(\"form\") : null;\n if (!form) return { ok: false, summary: \"No owning form was found for the reviewed submission.\" };\n form.requestSubmit();\n return { ok: true, summary: \"Form submitted programmatically through its owning form.\" };\n }\n case \"consentpassword\": {\n if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) return { ok: false, summary: \"The reviewed password target cannot receive text.\" };\n const entry: formentry = { match: { mode: \"name\", name: target.name || target.getAttribute(\"id\") || \"\" }, kind: \"password\", value: step.value ?? \"\" };\n if (!fillcontrol(target, entry)) return { ok: false, summary: \"The password field refused the native setter fill.\" };\n return { ok: true, summary: \"Password field filled after the reviewed consent; the value never appears in the audit trail.\" };\n }\n case \"attachfile\": {\n if (!(target instanceof HTMLInputElement) || target.type !== \"file\") return { ok: false, summary: \"The reviewed target is not a file input.\" };\n const artifactname = typeof options.artifactname === \"string\" && options.artifactname ? options.artifactname : \"artifact\";\n try {\n const file = new File([new Blob([\"devthink artifact\"], { type: \"application/octet-stream\" })], artifactname);\n const transfer = new DataTransfer();\n transfer.items.add(file);\n target.files = transfer.files;\n events(target);\n return { ok: true, summary: `Artifact ${artifactname} attached to the reviewed file input.`, details: { artifact: options.artifact, artifactname } };\n } catch {\n return { ok: false, summary: \"The reviewed file input refused the artifact attachment.\" };\n }\n }\n default: return { ok: false, summary: \"Unsupported forms and data action.\" };\n }\n}\n", "import type { toolstep, wizardstate } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { cardmask } from \"./pageforms.js\";\nimport { clean } from \"./pageresolve.js\";\n\n/**\n * Wizard, dependent control and payment field logics for reviewed steps.\n * Every correlated rule for wizard tracking, dependent option waits, typeahead picks, calendar navigation, card segment typing, one time code sources and submission retry backoff lives in this file.\n */\n\n/** Advances one wizard step, recording the completion signal of the executed step and the new step index. */\nexport function wizardadvance(state: wizardstate, completed: boolean, at: number): wizardstate {\n const flags = [...state.completed];\n while (flags.length < state.index + 1) flags.push(false);\n flags[state.index] = completed;\n return { ...state, index: Math.min(state.index + 1, state.steps), completed: flags, at };\n}\n\n/** True when the dependent child options finished loading after a parent selection changed their count. */\nexport function dependentloaded(previouscount: number, currentcount: number): boolean {\n return currentcount !== previouscount;\n}\n\n/** Picks the reviewed suggestion entry from a typeahead list, case insensitive; undefined when the entry is absent. */\nexport function typeaheadpick(suggestions: string[], pick: string): string | undefined {\n const needle = pick.trim().toLowerCase();\n return suggestions.find(suggestion => suggestion.trim().toLowerCase() === needle);\n}\n\n/** Parses one reviewed yyyy-mm-dd date into its year, month and day parts; null when the form is invalid. */\nexport function parsedateparts(value: string): { year: number; month: number; day: number } | null {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return null;\n const parts = value.split(\"-\").map(part => Number.parseInt(part, 10));\n const year = parts[0] ?? 0;\n const month = parts[1] ?? 0;\n const day = parts[2] ?? 0;\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n return { year, month, day };\n}\n\n/** Plans the calendar navigation to the reviewed date: the month delta and the day cell to click. */\nexport function calendarplan(view: { year: number; month: number }, date: { year: number; month: number; day: number }): { months: number; day: number } {\n return { months: (date.year - view.year) * 12 + (date.month - view.month), day: date.day };\n}\n\n/** Splits one card number into its typed groups so the filler pauses between groups. */\nexport function cardgroups(number: string): string[] {\n const groups = number.replace(/[-\\s]+/g, \" \").trim().split(\" \");\n return groups.filter(group => group.length > 0);\n}\n\n/** True when the reviewed one time code source is ready to deliver the code before typing. */\nexport function codeready(source: string, value: string | undefined): boolean {\n if (source === \"reviewed\") return typeof value === \"string\" && value.trim().length > 0;\n return false;\n}\n\n/** One reviewed retry backoff rule with an attempt count, a wait window and a growth factor, all user configured. */\nexport interface backoffrule {\n attempts: number;\n wait: number;\n factor: number;\n}\n\n/** Parses the reviewed backoff rule of a retryform step; null when the step reviews none. */\nexport function parsebackoff(step: toolstep): backoffrule | null {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const backoff = options.backoff;\n if (!backoff || typeof backoff !== \"object\" || Array.isArray(backoff)) return null;\n const rule = backoff as Record<string, unknown>;\n const wait = rule.wait;\n const factor = rule.factor;\n if (typeof wait !== \"number\" || !Number.isFinite(wait) || wait <= 0) return null;\n if (typeof factor !== \"number\" || !Number.isFinite(factor) || factor < 1) return null;\n const attempts = typeof options.attempts === \"number\" && Number.isInteger(options.attempts) && options.attempts >= 1 ? options.attempts : 2;\n return { attempts, wait, factor };\n}\n\n/** Computes the reviewed backoff windows between submission retries; no code ceiling applies. */\nexport function backoffwaits(attempts: number, wait: number, factor: number): number[] {\n const windows: number[] = [];\n let current = wait;\n for (let index = 1; index < attempts; index += 1) {\n windows.push(current);\n current *= factor;\n }\n return windows;\n}\n\nfunction wait(delay: number): Promise<void> {\n return new Promise(resolve => window.setTimeout(resolve, delay));\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 wizard or payment field step inside the page, from multi step wizards to card segments and one time codes. */\nexport function runpagewizard(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 \"runwizard\": {\n const scope = target instanceof HTMLElement ? target : root.body ?? root.documentElement;\n const steps = typeof options.steps === \"number\" && Number.isInteger(options.steps) && options.steps > 0 ? options.steps : 1;\n const state: wizardstate = { index: 0, steps, completed: [], at: Date.now() };\n const next = scope.querySelector<HTMLElement>(\"button[type=submit], button[name=next], [data-next]\");\n if (!next) return { ok: false, summary: \"No next step control was found inside the wizard scope.\", details: { wizard: state } };\n next.click();\n const advanced = wizardadvance(state, true, Date.now());\n return { ok: advanced.index >= steps, summary: `Wizard advanced to step ${advanced.index + 1} of ${steps}${advanced.index >= steps ? \" and completed\" : \"\"}.`, details: { wizard: advanced } };\n }\n case \"selectchain\": {\n if (!(target instanceof HTMLSelectElement)) return { ok: false, summary: \"The reviewed parent target is not a select element.\" };\n const childselector = typeof options.child === \"string\" ? options.child : \"\";\n const child = root.querySelector<HTMLSelectElement>(childselector);\n if (!child) return { ok: false, summary: \"The reviewed dependent child control was not found.\" };\n const previouscount = child.options.length;\n const option = [...target.options].find(candidate => candidate.value === step.value || candidate.textContent?.trim() === step.value);\n if (!option) return { ok: false, summary: \"The reviewed parent option is not part of the select element.\" };\n target.value = option.value;\n target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true }));\n const waitwindow = typeof options.wait === \"number\" && options.wait > 0 ? options.wait : 0;\n return pollfor(() => dependentloaded(previouscount, child.options.length), \"Dependent options of the child control\", waitwindow);\n }\n case \"picktypeahead\": {\n const field = target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement ? target : null;\n if (!field) return { ok: false, summary: \"The reviewed typeahead target cannot receive text.\" };\n const pick = typeof options.pick === \"string\" ? options.pick : \"\";\n const timeout = typeof options.timeout === \"number\" && options.timeout > 0 ? options.timeout : 0;\n field.focus();\n field.value = step.value ?? \"\";\n field.dispatchEvent(new Event(\"input\", { bubbles: true }));\n const list = root.querySelector<HTMLElement>('[role=listbox], .suggestions, ul.autocomplete, [data-typeahead]');\n const suggestions = list ? [...list.querySelectorAll<HTMLElement>(\"[role=option], li, .suggestion\")].map(entry => clean(entry.textContent || \"\")) : [];\n const chosen = typeaheadpick(suggestions, pick);\n if (chosen === undefined) return { ok: false, summary: `The reviewed suggestion \"${pick}\" is not part of the typeahead list.`, details: { suggestions } };\n const entry = [...(list?.querySelectorAll<HTMLElement>(\"[role=option], li, .suggestion\") ?? [])].find(item => clean(item.textContent || \"\").trim().toLowerCase() === chosen.trim().toLowerCase());\n entry?.click();\n field.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: Boolean(entry), summary: `Picked the reviewed typeahead entry \"${chosen}\".`, details: { pick: chosen, query: step.value ?? \"\" } };\n }\n case \"pickdate\": {\n const calendar = target instanceof HTMLElement ? target : root.body ?? root.documentElement;\n const date = parsedateparts(step.value ?? \"\");\n if (!date) return { ok: false, summary: \"The reviewed date must use the yyyy-mm-dd form.\" };\n const header = clean(calendar.querySelector<HTMLElement>(\"[data-calendar-title], .calendar-title, header\")?.textContent || \"\");\n const match = /(\\d{4})/.exec(header);\n const monthnames = [\"january\", \"february\", \"march\", \"april\", \"may\", \"june\", \"july\", \"august\", \"september\", \"october\", \"november\", \"december\"];\n const viewyear = match ? Number.parseInt(match[1] ?? \"0\", 10) : new Date().getFullYear();\n const viewmonth = monthnames.findIndex(name => header.toLowerCase().includes(name)) >= 0 ? monthnames.findIndex(name => header.toLowerCase().includes(name)) : new Date().getMonth() + 1;\n const plan = calendarplan({ year: viewyear, month: viewmonth }, date);\n const forward = plan.months >= 0;\n for (let index = 0; index < Math.abs(plan.months); index += 1) {\n calendar.querySelector<HTMLElement>(forward ? \"[data-next-month], .next-month, [aria-label=next]\" : \"[data-prev-month], .prev-month, [aria-label=previous]\")?.click();\n }\n const day = [...calendar.querySelectorAll<HTMLElement>(\"[role=gridcell], [data-day], td\")].find(cell => Number.parseInt(clean(cell.textContent || \"\"), 10) === plan.day);\n if (!day) return { ok: false, summary: `The reviewed day cell ${plan.day} was not found in the calendar widget.` };\n day.click();\n return { ok: true, summary: `Picked ${step.value} from the calendar widget after ${Math.abs(plan.months)} month navigation${Math.abs(plan.months) === 1 ? \"\" : \"s\"}.`, details: { months: plan.months, day: plan.day } };\n }\n case \"fillcard\": {\n const segments = Array.isArray(options.segments) ? (options.segments as Array<Record<string, unknown>>).filter(item => item && typeof item === \"object\") : [];\n if (segments.length === 0) return { ok: false, summary: \"A reviewed non-empty list of card segments is required in options.\" };\n const pause = typeof options.pause === \"number\" && options.pause > 0 ? options.pause : 0;\n const filled: Array<{ label: string; masked: string }> = [];\n const failures: string[] = [];\n const fillsegment = async (segment: Record<string, unknown>): Promise<void> => {\n const match = segment.match as Record<string, unknown> | undefined;\n const value = typeof segment.value === \"string\" ? segment.value : \"\";\n if (!match || typeof match !== \"object\") { failures.push(\"segment without a reviewed match\"); return; }\n const scope = root.body ?? root.documentElement;\n const candidates = [...scope.querySelectorAll<HTMLInputElement>(\"input, select\")];\n const key = match.mode === \"label\" ? \"label\" : match.mode === \"placeholder\" ? \"placeholder\" : match.mode === \"arialabel\" ? \"arialabel\" : \"name\";\n const needle = String(match[key] ?? \"\").toLowerCase();\n const element = candidates.find(input => (key === \"label\" ? input.name.toLowerCase() || input.getAttribute(\"aria-label\")?.toLowerCase() || \"\" : (input.getAttribute(key) ?? input.name).toLowerCase()).includes(needle) || (input.getAttribute(\"aria-label\") ?? \"\").toLowerCase().includes(needle));\n if (!element) { failures.push(`unmatched: ${needle}`); return; }\n element.focus();\n for (const group of cardgroups(value)) {\n element.value = group;\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n if (pause > 0) await wait(pause);\n }\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n filled.push({ label: String(match[key] ?? \"\"), masked: cardmask(value) });\n };\n return (async (): Promise<stepresult> => {\n for (const segment of segments) await fillsegment(segment);\n return {\n ok: failures.length === 0,\n summary: failures.length === 0 ? `Filled ${filled.length} card segment${filled.length === 1 ? \"\" : \"s\"} with pauses between card number groups.` : `Filled ${filled.length} of ${segments.length} card segments; ${failures.join(\"; \")}.`,\n details: { segments: filled, failures, pause },\n };\n })();\n }\n case \"fillcode\": {\n const field = target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement ? target : null;\n if (!field) return { ok: false, summary: \"The reviewed one time code target cannot receive text.\" };\n const source = typeof options.source === \"string\" ? options.source : \"\";\n const timeout = typeof options.timeout === \"number\" && options.timeout > 0 ? options.timeout : 0;\n const code = step.value ?? \"\";\n return pollfor(() => codeready(source, code), \"The reviewed one time code source\", timeout).then(result => {\n if (!codeready(source, code)) return { ok: false, summary: `The reviewed code source ${source} is not ready to deliver the code yet.` };\n field.focus();\n field.value = code;\n field.dispatchEvent(new Event(\"input\", { bubbles: true }));\n field.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return { ok: true, summary: `One time code typed from the reviewed source ${source}.`, details: { source } };\n });\n }\n default: return { ok: false, summary: \"Unsupported wizard action.\" };\n }\n}\n", "import type { columnspec, datasetrow, sourceref, toolstep, transformrule } from \"../types.js\";\nimport { parseoptions } from \"../policy.js\";\nimport type { stepresult } from \"./pageactions.js\";\nimport { clean, elementselector as selector } from \"./pageresolve.js\";\n\n/**\n * Table and dataset logics for reviewed steps.\n * Every correlated rule for header normalization, span expansion, nested table walking, pagination following, row hashing, transform expressions, dataset merging, row sampling and csv, json and excel serialization lives in this file.\n */\n\n/** One raw table cell with its text, header flag, span geometry and an optional nested table. */\nexport interface cellshape {\n text: string;\n header: boolean;\n rowspan: number;\n colspan: number;\n nested?: { selector: string; rows: rowshape[] };\n}\n\n/** One raw table row of span carrying cells. */\nexport interface rowshape {\n cells: cellshape[];\n header: boolean;\n}\n\n/** One nested child table linked to the body row it belongs to. */\nexport interface childtable {\n parentrow: number;\n selector: string;\n columns: columnspec[];\n rows: datasetrow[];\n}\n\n/** Result of the table reader: normalized column specs, keyed body rows and child datasets. */\nexport interface gridresult {\n columns: columnspec[];\n rows: datasetrow[];\n children: childtable[];\n}\n\n/** Trims, lowercases and slugifies one header cell into a stable column key. */\nexport function normalizeheader(label: string): string {\n const slug = label.trim().toLowerCase().replace(/[^\\p{L}\\p{N}]+/gu, \"-\").replace(/^-+|-+$/g, \"\");\n return slug || \"column\";\n}\n\n/** Builds one column spec from a header label with a unique stable key and the normalized name. */\nexport function columnspecof(label: string, used: Set<string> = new Set()): columnspec {\n const base = normalizeheader(label);\n let key = base;\n let suffix = 2;\n while (used.has(key)) {\n key = `${base}${suffix}`;\n suffix += 1;\n }\n used.add(key);\n return { key, label: label.trim(), kind: \"text\", normalized: label.trim().toLowerCase() };\n}\n\n/** Classifies a column as number only when every non-empty value parses as a number. */\nexport function classifycolumn(values: string[]): \"text\" | \"number\" {\n const present = values.filter(value => value.trim().length > 0);\n if (present.length === 0) return \"text\";\n return present.every(value => Number.isFinite(Number(value.replace(/,/g, \".\")))) ? \"number\" : \"text\";\n}\n\n/** Expands rowspan and colspan cells into a filled rectangular grid of values. */\nexport function expandspans(rows: rowshape[]): string[][] {\n const filled: Array<Array<string | undefined>> = [];\n const pending = new Map<string, string>();\n for (let index = 0; index < rows.length; index += 1) {\n const row: Array<string | undefined> = filled[index] ?? (filled[index] = []);\n let column = 0;\n for (const cell of rows[index]!.cells) {\n while (row[column] !== undefined || pending.has(`${index},${column}`)) {\n if (row[column] === undefined) row[column] = pending.get(`${index},${column}`);\n column += 1;\n }\n row[column] = cell.text;\n for (let spanrow = 0; spanrow < Math.max(1, cell.rowspan); spanrow += 1) {\n for (let spancol = 0; spancol < Math.max(1, cell.colspan); spancol += 1) {\n if (spanrow === 0 && spancol === 0) continue;\n pending.set(`${index + spanrow},${column + spancol}`, cell.text);\n }\n }\n column += Math.max(1, cell.colspan);\n }\n }\n for (const [key, value] of pending) {\n const [rowpart, columnpart] = key.split(\",\");\n const rowindex = Number.parseInt(rowpart ?? \"0\", 10);\n const columnindex = Number.parseInt(columnpart ?? \"0\", 10);\n const target = filled[rowindex] ?? (filled[rowindex] = []);\n if (target[columnindex] === undefined) target[columnindex] = value;\n }\n const width = filled.reduce((largest, row) => Math.max(largest, row.length), 0);\n return filled.map(row => Array.from({ length: width }, (_, column) => row[column] ?? \"\"));\n}\n\n/** Reads header and body rows into normalized column specs and keyed body rows, extracting nested tables into child datasets. */\nexport function readgrid(rows: rowshape[]): gridresult {\n const headerindex = rows.findIndex(row => row.header || (row.cells[0]?.header ?? false));\n const useheader = headerindex !== -1 ? headerindex : 0;\n const hasheader = headerindex !== -1 || rows.length > 0;\n const grid = expandspans(rows);\n const headercells = hasheader ? (grid[useheader] ?? []) : [];\n const used = new Set<string>();\n const columns = Array.from({ length: headercells.length || (grid[0]?.length ?? 0) }, (_, index) => columnspecof(headercells[index] ?? `column${index + 1}`, used));\n const bodyrows = grid.filter((_, index) => hasheader ? index !== useheader : true)\n .filter(line => line.some(value => value.trim().length > 0))\n .map(line => {\n const row: datasetrow = {};\n columns.forEach((column, index) => { row[column.key] = line[index] ?? \"\"; });\n return row;\n });\n for (const column of columns) column.kind = classifycolumn(bodyrows.map(row => row[column.key] ?? \"\"));\n const children: childtable[] = [];\n rows.forEach((row, rowindex) => {\n if (hasheader && rowindex === useheader) return;\n const parentrow = hasheader && rowindex > useheader ? rowindex - 1 : rowindex;\n row.cells.forEach(cell => {\n if (!cell.nested) return;\n const child = readgrid(cell.nested.rows);\n children.push({ parentrow, selector: cell.nested!.selector, columns: child.columns, rows: child.rows });\n });\n });\n return { columns, rows: bodyrows, children };\n}\n\n/** Resolves the next pagination control from numbered page entries: the entry after the current one or a next word control. */\nexport function nextcontrol(entries: Array<{ text: string; selector: string; current: boolean }>): string | undefined {\n const current = entries.findIndex(entry => entry.current);\n if (current !== -1 && current + 1 < entries.length) return entries[current + 1]?.selector;\n const nextwords = [\"next\", \"next page\", \">\", \">>\", \"\u203A\", \"\u00BB\", \"pr\u00F3xima\", \"seguinte\"];\n return entries.find(entry => nextwords.includes(entry.text.trim().toLowerCase()))?.selector;\n}\n\n/** True when the current row set contains at least one row the previous set did not carry. */\nexport function rowsfresh(previous: datasetrow[], current: datasetrow[]): boolean {\n if (current.length === 0) return false;\n const known = new Set(previous.map(row => JSON.stringify(row)));\n return current.some(row => !known.has(JSON.stringify(row)));\n}\n\n/** Computes a stable row hash over the reviewed keys; an empty key list hashes every column. */\nexport function rowhash(row: datasetrow, keys: string[]): string {\n const source = (keys.length > 0 ? keys : Object.keys(row).sort()).map(key => `${key}=${row[key] ?? \"\"}`).join(\"|\");\n let hash = 5381;\n for (let index = 0; index < source.length; index += 1) hash = ((hash * 33) ^ source.charCodeAt(index)) >>> 0;\n return hash.toString(16);\n}\n\n/** Deduplicates rows by reviewed keys, keeping the first occurrence of every key set. */\nexport function dedupebykeys(rows: datasetrow[], keys: string[]): { kept: datasetrow[]; removed: number } {\n const seen = new Set<string>();\n const kept: datasetrow[] = [];\n for (const row of rows) {\n const hash = rowhash(row, keys);\n if (seen.has(hash)) continue;\n seen.add(hash);\n kept.push(row);\n }\n return { kept, removed: rows.length - kept.length };\n}\n\n/** Applies one reviewed transform expression to a value; unsupported expressions are refused. */\nexport function applyexpression(value: string, expression: string): string {\n const split = expression.indexOf(\":\");\n const op = split === -1 ? expression : expression.slice(0, split);\n const argument = split === -1 ? undefined : expression.slice(split + 1);\n if (op === \"trim\") return value.trim();\n if (op === \"upper\") return value.toUpperCase();\n if (op === \"lower\") return value.toLowerCase();\n if (op === \"number\") return value.replace(/[^\\d.\\-]/g, \"\");\n if (op === \"prefix\") return `${argument ?? \"\"}${value}`;\n if (op === \"suffix\") return `${value}${argument ?? \"\"}`;\n if (op === \"replace\") {\n const separator = argument?.indexOf(\"=>\") ?? -1;\n if (separator === -1 || separator === 0) throw new Error(`The reviewed transform expression ${expression} needs the from=>to separator.`);\n const from = argument!.slice(0, separator);\n const to = argument!.slice(separator + 2);\n return value.split(from).join(to);\n }\n throw new Error(`The reviewed transform expression ${op} is not supported.`);\n}\n\n/** Applies reviewed transform rules to dataset rows, surfacing per rule errors and keeping the original values on failure. */\nexport function transformrows(rows: datasetrow[], rules: transformrule[]): { rows: datasetrow[]; errors: string[] } {\n const errors: string[] = [];\n const output = rows.map(row => ({ ...row }));\n for (const rule of rules) {\n const updated: datasetrow[] = [];\n try {\n for (const row of output) updated.push({ ...row, [rule.target]: applyexpression(rule.sources.map(source => row[source] ?? \"\").join(\" \"), rule.expression) });\n } catch (error) {\n errors.push(`${rule.target}: ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n output.splice(0, output.length, ...updated);\n }\n return { rows: output, errors };\n}\n\n/** Merges datasets across pages: columns align by key with gaps filled empty and rows concatenate in page order. */\nexport function mergedatasets(datasets: Array<{ columns: columnspec[]; rows: datasetrow[] }>): { columns: columnspec[]; rows: datasetrow[] } {\n const columns: columnspec[] = [];\n const seen = new Set<string>();\n for (const dataset of datasets) {\n for (const column of dataset.columns) {\n if (seen.has(column.key)) continue;\n seen.add(column.key);\n columns.push(column);\n }\n }\n const rows = datasets.flatMap(dataset => dataset.rows.map(row => {\n const merged: datasetrow = {};\n for (const column of columns) merged[column.key] = row[column.key] ?? \"\";\n return merged;\n }));\n return { columns, rows };\n}\n\n/** Attaches the source url, timestamp and step ref to every row and returns the matching source refs. */\nexport function samplerows(rows: datasetrow[], url: string, stepid: string, at: number): { rows: datasetrow[]; sources: sourceref[] } {\n const stamped = rows.map(row => ({ ...row, source: url, capturedat: String(at), step: stepid }));\n const sources = stamped.map((row, index) => ({ row: index, url, at, stepid }));\n return { rows: stamped, sources };\n}\n\n/** Escapes one csv field, wrapping values that carry the delimiter, quotes or line breaks. */\nfunction csvfield(value: string, delimiter: string): string {\n return value.includes(delimiter) || value.includes(\"\\\"\") || value.includes(\"\\n\") ? `\"${value.replace(/\"/g, \"\\\"\\\"\")}\"` : value;\n}\n\n/** Serializes columns and rows into csv text. */\nexport function tocsv(columns: columnspec[], rows: datasetrow[], delimiter = \",\"): string {\n const lines = [columns.map(column => csvfield(column.label || column.key, delimiter)).join(delimiter)];\n for (const row of rows) lines.push(columns.map(column => csvfield(row[column.key] ?? \"\", delimiter)).join(delimiter));\n return lines.join(\"\\n\");\n}\n\n/** Parses csv text into headers and raw rows, honoring quoted fields and escaped quotes. */\nexport function parsecsv(text: string, delimiter = \",\"): { headers: string[]; rows: string[][] } {\n const records: string[][] = [];\n let field = \"\";\n let record: string[] = [];\n let quoted = false;\n for (let index = 0; index < text.length; index += 1) {\n const character = text[index]!;\n if (quoted) {\n if (character === \"\\\"\") {\n if (text[index + 1] === \"\\\"\") { field += \"\\\"\"; index += 1; }\n else quoted = false;\n } else field += character;\n continue;\n }\n if (character === \"\\\"\") { quoted = true; continue; }\n if (character === delimiter) { record.push(field); field = \"\"; continue; }\n if (character === \"\\n\" || character === \"\\r\") {\n if (character === \"\\r\" && text[index + 1] === \"\\n\") index += 1;\n record.push(field);\n field = \"\";\n if (record.some(value => value.length > 0) || record.length > 1) records.push(record);\n record = [];\n continue;\n }\n field += character;\n }\n record.push(field);\n if (record.some(value => value.length > 0) || record.length > 1) records.push(record);\n const [headers = [], ...rows] = records;\n return { headers, rows };\n}\n\n/** Maps parsed csv headers onto dataset column specs through a reviewed mapping of csv names to target keys. */\nexport function mapcolumns(headers: string[], mapping: Record<string, string> = {}): columnspec[] {\n const used = new Set<string>();\n return headers.map(header => {\n const target = mapping[header] ?? mapping[normalizeheader(header)] ?? header;\n return columnspecof(target, used);\n });\n}\n\n/** Serializes columns and rows into a json dataset payload. */\nexport function tojson(columns: columnspec[], rows: datasetrow[]): string {\n return JSON.stringify({ columns, rows });\n}\n\n/** Escapes one xml text node. */\nfunction xmltext(value: string): string {\n return value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\");\n}\n\n/** Serializes columns and rows into an Excel SpreadsheetML 2003 workbook that Excel opens natively. */\nexport function toexcel(columns: columnspec[], rows: datasetrow[], name: string): string {\n const head = columns.map(column => `<Cell ss:StyleID=\"head\"><Data ss:Type=\"String\">${xmltext(column.label || column.key)}</Data></Cell>`).join(\"\");\n const body = rows.map(row => `<Row>${columns.map(column => {\n const value = row[column.key] ?? \"\";\n const numeric = column.kind === \"number\" && value.trim() !== \"\" && Number.isFinite(Number(value));\n return numeric ? `<Cell><Data ss:Type=\"Number\">${xmltext(value)}</Data></Cell>` : `<Cell><Data ss:Type=\"String\">${xmltext(value)}</Data></Cell>`;\n }).join(\"\")}</Row>`).join(\"\");\n return `<?xml version=\"1.0\"?><?mso-application progid=\"Excel.Sheet\"?><Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"><Styles><Style ss:ID=\"head\"><Font ss:Bold=\"1\"/></Style></Styles><Worksheet ss:Name=\"${xmltext(name || \"dataset\").slice(0, 31)}\"><Table><Row>${head}</Row>${body}</Table></Worksheet></Workbook>`;\n}\n\n/** Collects the raw span carrying row shapes of one html table, separating nested tables into cell refs. */\nfunction collectrowshapes(table: HTMLTableElement): rowshape[] {\n return [...table.rows].map(row => ({\n header: [...row.cells].every(cell => cell.tagName === \"TH\") && row.cells.length > 0,\n cells: [...row.cells].map(cell => {\n const nested = cell.querySelector(\"table\");\n return {\n text: clean(nested ? `${nested.rows.length} rows` : cell.textContent ?? \"\"),\n header: cell.tagName === \"TH\",\n rowspan: cell.rowSpan,\n colspan: cell.colSpan,\n ...(nested instanceof HTMLTableElement ? { nested: { selector: selector(nested), rows: collectrowshapes(nested) } } : {}),\n };\n }),\n }));\n}\n\n/** Reads the reviewed table element into a grid result. */\nfunction readtable(target: Element | null, root: Document, fallbackselector: string | undefined): gridresult | null {\n const table = target instanceof HTMLTableElement ? target : (fallbackselector ? root.querySelector<HTMLTableElement>(fallbackselector) : root.querySelector<HTMLTableElement>(\"table\"));\n if (!table) return null;\n return readgrid(collectrowshapes(table));\n}\n\n/** Reads the live pagination entries of a table container for the next control resolution. */\nfunction paginationentries(root: Document, scope: string | undefined): Array<{ text: string; selector: string; current: boolean }> {\n const container = scope ? root.querySelector(scope) : root;\n if (!container) return [];\n return [...container.querySelectorAll(\"a[href], button\")].map(element => ({\n text: clean(element.textContent ?? \"\"),\n selector: selector(element),\n current: element.getAttribute(\"aria-current\") === \"page\" || element.classList.contains(\"active\") || element.classList.contains(\"current\"),\n }));\n}\n\n/** Runs one reviewed data step on the page: table scraping into datasets and pagination following with fresh row waits. */\nexport async function runpagedata(step: toolstep, target: Element | null, root: Document = document): Promise<stepresult> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n if (step.kind === \"scrapetable\") {\n const grid = readtable(target, root, step.target);\n if (!grid) return { ok: false, summary: \"The reviewed table selector matches no table element.\" };\n const rowlimit = typeof options.rowlimit === \"number\" && Number.isInteger(options.rowlimit) && options.rowlimit > 0 ? options.rowlimit : grid.rows.length;\n const limited = grid.rows.slice(0, rowlimit);\n return {\n ok: true,\n summary: `Scraped ${limited.length} row${limited.length === 1 ? \"\" : \"s\"} into ${grid.columns.length} normalized column${grid.columns.length === 1 ? \"\" : \"s\"}${grid.children.length > 0 ? ` with ${grid.children.length} nested child table${grid.children.length === 1 ? \"\" : \"s\"}` : \"\"}.`,\n details: { grid: { columns: grid.columns, rows: limited, children: grid.children }, rows: limited.length, columns: grid.columns.length },\n };\n }\n if (step.kind === \"paginateextract\") {\n const nextselector = typeof options.next === \"string\" ? options.next : \"\";\n const pages = typeof options.pages === \"number\" && Number.isInteger(options.pages) && options.pages > 0 ? options.pages : 1;\n const wait = typeof options.wait === \"number\" && Number.isFinite(options.wait) && options.wait > 0 ? options.wait : 0;\n const cursor = typeof options.cursor === \"number\" && Number.isInteger(options.cursor) && options.cursor > 0 ? options.cursor : 0;\n const grids: gridresult[] = [];\n let previous: datasetrow[] = [];\n for (let page = 0; page < pages + cursor; page += 1) {\n if (page < cursor) {\n const control = root.querySelector<HTMLElement>(nextselector);\n if (!control) break;\n control.click();\n await new Promise(resolve => window.setTimeout(resolve, 0));\n continue;\n }\n if (page > cursor) {\n const control = root.querySelector<HTMLElement>(nextselector);\n if (!control) break;\n control.click();\n const deadline = Date.now() + wait;\n let fresh = false;\n while (!fresh && Date.now() < deadline) {\n await new Promise(resolve => window.setTimeout(resolve, Math.min(100, Math.max(16, deadline - Date.now()))));\n const probe = readtable(target, root, step.target);\n fresh = probe !== null && rowsfresh(previous, probe.rows);\n }\n }\n const grid = readtable(target, root, step.target);\n if (!grid) return { ok: false, summary: \"The reviewed table selector matches no table element.\" };\n grids.push(grid);\n previous = grid.rows;\n }\n const merged = mergedatasets(grids);\n const hasnext = Boolean(root.querySelector(nextselector));\n return {\n ok: grids.length > 0,\n summary: grids.length > 0 ? `Followed ${grids.length} page${grids.length === 1 ? \"\" : \"s\"} of the reviewed table into ${merged.rows.length} row${merged.rows.length === 1 ? \"\" : \"s\"}${hasnext ? \"; a next control remains\" : \"\"}.` : \"No page of the reviewed table was extracted.\",\n details: { grid: { columns: merged.columns, rows: merged.rows, children: grids.flatMap(grid => grid.children) }, pages: grids.length, rows: merged.rows.length, next: hasnext },\n };\n }\n return { ok: false, summary: \"Unsupported data step.\" };\n}\n\n/** Exposes the pagination entries of the current document so plan review can suggest next controls. */\nexport function pagepagination(root: Document = document): Array<{ text: string; selector: string; current: boolean }> {\n return paginationentries(root, undefined);\n}\n", "import type { artifactrecord, columnspec, dataset, datasetrow, exportedartifact, extractsession, provenancerecord, streamstate, toolstep, transformrule } from \"../types.js\";\nimport { tocsv, toexcel, tojson } from \"./pagedata.js\";\n\n/**\n * Dataset command logics for the background executors.\n * Every correlated rule for dataset records, artifact exports with checksums, chunked streaming with backpressure, extraction cursors, loop row variables, provenance records and artifact retention lives in this file.\n */\n\n/** Builds one dataset record from a scraped grid result. */\nexport function builddataset(id: string, name: string, grid: { columns: columnspec[]; rows: datasetrow[]; children?: Array<{ parentrow: number; selector: string; columns: columnspec[]; rows: datasetrow[] }> }, at: number): dataset {\n return { id, name: name || id, columns: grid.columns, rows: grid.rows, sources: [], at };\n}\n\n/** Computes the deterministic checksum of an exported artifact's content. */\nexport function checksum(value: string): string {\n let hash = 5381;\n for (let index = 0; index < value.length; index += 1) hash = ((hash * 33) ^ value.charCodeAt(index)) >>> 0;\n return `fnv1a-${hash.toString(16)}`;\n}\n\n/** Serializes one dataset into the reviewed export format. */\nexport function exportcontent(datasetvalue: dataset, format: \"csv\" | \"json\" | \"excel\", delimiter = \",\"): string {\n if (format === \"json\") return tojson(datasetvalue.columns, datasetvalue.rows);\n if (format === \"excel\") return toexcel(datasetvalue.columns, datasetvalue.rows, datasetvalue.name);\n return tocsv(datasetvalue.columns, datasetvalue.rows, delimiter);\n}\n\n/** Builds one exported artifact record with its content and checksum for the task artifact store. */\nexport function exportartifact(id: string, datasetvalue: dataset, format: \"csv\" | \"json\" | \"excel\", stepid: string, content: string, at: number): exportedartifact {\n const extension = format === \"excel\" ? \"xml\" : format;\n return { id, kind: format, name: `${datasetvalue.name || datasetvalue.id}.${extension}`, stepid, rowcount: datasetvalue.rows.length, content, checksum: checksum(content), at };\n}\n\n/** Converts one exported artifact into the artifact record shape the run store keeps. */\nexport function artifactrecordof(artifact: exportedartifact): artifactrecord {\n return { id: artifact.id, kind: artifact.kind, name: artifact.name, stepid: artifact.stepid, at: artifact.at };\n}\n\n/** Plans the chunk boundaries of a streaming export from a user configured chunk size with no code ceiling. */\nexport function chunkplan(rows: number, chunk: number): Array<{ index: number; from: number; to: number }> {\n const size = Math.max(1, Math.floor(chunk));\n const chunks: Array<{ index: number; from: number; to: number }> = [];\n for (let from = 0; from < rows || chunks.length === 0; from += size) {\n const to = Math.min(rows, from + size);\n chunks.push({ index: chunks.length, from, to });\n if (to >= rows) break;\n }\n return chunks;\n}\n\n/** True when the stream writer must wait for acknowledgements: pending writes reached the in-flight budget of one. */\nexport function backpressure(written: number, acknowledged: number): boolean {\n return written - acknowledged >= 1;\n}\n\n/** Advances one stream state by one acknowledged chunk of rows. */\nexport function advancestream(state: streamstate, chunk: { index: number; to: number }, at: number, done: boolean): streamstate {\n return { datasetid: state.datasetid, name: state.name, chunk: chunk.index + 1, chunks: state.chunks, written: chunk.to, ...(done ? { done: true } : {}), at };\n}\n\n/** Returns the first unwritten row index of a stream, starting a fresh stream at zero. */\nexport function streamfrom(state: streamstate | undefined, rows: number): number {\n if (!state || state.done) return 0;\n return Math.min(state.written, rows);\n}\n\n/** Builds the initial stream state of one dataset. */\nexport function newstream(datasetvalue: dataset, chunks: number, at: number): streamstate {\n return { datasetid: datasetvalue.id, name: datasetvalue.name, chunk: 0, chunks, written: 0, at };\n}\n\n/** Advances one extraction session by one extracted page with its row count. */\nexport function advancecursor(sessionvalue: extractsession, page: string, rows: number, at: number, done: boolean): extractsession {\n return {\n id: sessionvalue.id,\n datasetid: sessionvalue.datasetid,\n name: sessionvalue.name,\n target: sessionvalue.target,\n next: sessionvalue.next,\n planned: sessionvalue.planned,\n pages: [...sessionvalue.pages, page],\n rows: sessionvalue.rows + rows,\n cursor: sessionvalue.cursor + 1,\n ...(done || sessionvalue.cursor + 1 >= sessionvalue.planned ? { done: true } : {}),\n startedat: sessionvalue.startedat,\n updatedat: at,\n };\n}\n\n/** Builds the initial extraction session of one dataset extraction. */\nexport function newextractsession(id: string, datasetid: string, name: string, target: string, next: string, planned: number, at: number): extractsession {\n return { id, datasetid, name, target, next, planned, pages: [], rows: 0, cursor: 0, startedat: at, updatedat: at };\n}\n\n/** Returns the pages an interrupted extraction still owes after its stored cursor. */\nexport function remainingpages(sessionvalue: extractsession, planned: number): number {\n if (sessionvalue.done) return 0;\n return Math.max(0, Math.max(sessionvalue.planned, planned) - sessionvalue.cursor);\n}\n\n/** Builds one provenance record of an exported artifact with its source url, step ref, row range and checksum. */\nexport function provenancefor(artifact: { id: string; name: string; rowcount: number; checksum: string }, url: string, stepid: string, at: number): provenancerecord {\n return { artifact: artifact.id, name: artifact.name, url, stepid, rowstart: artifact.rowcount > 0 ? 1 : 0, rowend: artifact.rowcount, checksum: artifact.checksum, at };\n}\n\n/** Applies the user configured artifact retention to exported artifacts; an absent setting keeps everything. */\nexport function retainedexports<T>(records: T[], retention: number | undefined): T[] {\n return retention === undefined ? records : records.slice(0, retention);\n}\n\n/** Interpolates one text through the {{column}} tokens of a dataset row. */\nexport function interpolate(text: string, row: datasetrow): string {\n return text.replace(/\\{\\{([^}]+)\\}\\}/g, (_, key: string) => row[key.trim()] ?? \"\");\n}\n\n/** Substitutes the row variables of one looprows iteration into the target, value and options of the inner step. */\nexport function loopstep(step: toolstep, row: datasetrow): toolstep {\n return {\n ...step,\n ...(step.target !== undefined ? { target: interpolate(step.target, row) } : {}),\n ...(step.value !== undefined ? { value: interpolate(step.value, row) } : {}),\n ...(step.options !== undefined ? { options: interpolate(step.options, row) } : {}),\n };\n}\n\n/** Exposes one dataset row as the step variables of a looprows iteration. */\nexport function loopvariables(row: datasetrow): datasetrow {\n return { ...row };\n}\n\n/** Builds the grid preview of a dataset with its column order, total rows and sampled rows. */\nexport function gridpreview(datasetvalue: dataset, sample: number): { datasetid: string; columns: string[]; rows: number; sample: datasetrow[] } {\n return { datasetid: datasetvalue.id, columns: datasetvalue.columns.map(column => column.key), rows: datasetvalue.rows.length, sample: datasetvalue.rows.slice(0, Math.max(0, Math.floor(sample))) };\n}\n\n/** Sorts dataset rows by one column key in the reviewed direction with a stable fallback for equal values. */\nexport function sortrows(rows: datasetrow[], key: string, direction: \"asc\" | \"desc\"): datasetrow[] {\n const sign = direction === \"desc\" ? -1 : 1;\n return [...rows].sort((left, right) => {\n const a = left[key] ?? \"\";\n const b = right[key] ?? \"\";\n const numeric = Number(a);\n const numericb = Number(b);\n if (Number.isFinite(numeric) && Number.isFinite(numericb) && a.trim() !== \"\" && b.trim() !== \"\") return (numeric - numericb) * sign;\n return a.localeCompare(b) * sign;\n });\n}\n\n/** Builds the sheet push payload of one dataset for a reviewed sheet endpoint. */\nexport function sheetpayload(datasetvalue: dataset, sheet: string): { sheet: string; columns: string[]; rows: datasetrow[] } {\n return { sheet, columns: datasetvalue.columns.map(column => column.key), rows: datasetvalue.rows };\n}\n\n/** Merges reviewed transform rules and dedupe keys into the task rules record of one task. */\nexport function mergetaskrules(existing: { taskid: string; transforms: transformrule[]; dedupekeys: string[] } | undefined, taskid: string, transforms: transformrule[], dedupekeys: string[], at: number): { taskid: string; transforms: transformrule[]; dedupekeys: string[]; at: number } {\n return {\n taskid,\n transforms: transforms.length > 0 ? transforms : (existing?.transforms ?? []),\n dedupekeys: dedupekeys.length > 0 ? dedupekeys : (existing?.dedupekeys ?? []),\n at,\n };\n}\n", "import type { artifactinventoryentry, capturename, cleanuprule, clipentry, downloadrecord, downloadstate, mimefilter, netlogrecord, quarantineentry, scanverdict, toolstep } from \"../types.js\";\nimport { checksum } from \"./datacommand.js\";\n\n/**\n * Files, clipboard and downloads command logics for the background executors.\n * Every correlated rule for batch queue state transitions, filename conflicts, verification matching, mime interception with the deny default, netlog correlation and header redaction, clipboard entry hashing, quarantine paths and scan verdicts, capture naming counters and cleanup sweeps lives in this file.\n */\n\n/** Legal batch queue transitions between the download states. */\nconst downloadtransitions: Record<downloadstate, downloadstate[]> = {\n queued: [\"running\", \"complete\", \"failed\"],\n running: [\"paused\", \"complete\", \"failed\"],\n paused: [\"running\", \"failed\"],\n complete: [],\n failed: [],\n};\n\n/** True when the batch queue allows the transition between two download states. */\nexport function transitionallowed(from: downloadstate, to: downloadstate): boolean {\n return downloadtransitions[from].includes(to);\n}\n\n/** Applies one batch queue state transition with its path, bytes, checksum and browser download id evidence; impossible transitions leave the record untouched. */\nexport function advancedownload(record: downloadrecord, state: downloadstate, at: number, evidence?: { path?: string; bytes?: number; checksum?: string; downloadid?: number }): downloadrecord {\n if (!transitionallowed(record.state, state)) return record;\n return {\n ...record,\n state,\n ...(evidence?.path !== undefined ? { path: evidence.path } : record.path !== undefined ? { path: record.path } : {}),\n ...(evidence?.bytes !== undefined ? { bytes: evidence.bytes } : record.bytes !== undefined ? { bytes: record.bytes } : {}),\n ...(evidence?.checksum !== undefined ? { checksum: evidence.checksum } : record.checksum !== undefined ? { checksum: record.checksum } : {}),\n ...(evidence?.downloadid !== undefined ? { downloadid: evidence.downloadid } : record.downloadid !== undefined ? { downloadid: record.downloadid } : {}),\n updatedat: at,\n };\n}\n\n/** True when the batch queue may start another download under the user configured concurrent choice; an absent window never blocks. */\nexport function concurrentwindow(running: number, ceiling: number | undefined): boolean {\n return ceiling === undefined || running < ceiling;\n}\n\n/** Resolves a filename conflict with a sequence suffix while keeping the extension intact. */\nexport function conflictfree(filename: string, taken: string[]): string {\n if (!taken.includes(filename)) return filename;\n const dot = filename.lastIndexOf(\".\");\n const base = dot > 0 ? filename.slice(0, dot) : filename;\n const extension = dot > 0 ? filename.slice(dot) : \"\";\n let sequence = 2;\n while (taken.includes(`${base}-${sequence}${extension}`)) sequence += 1;\n return `${base}-${sequence}${extension}`;\n}\n\n/** Derives the download filename of one reviewed url from the spec filename rule or the url basename. */\nexport function downloadfilename(url: string, rule: string | undefined): string {\n if (rule && rule.trim()) return rule.trim();\n let name = \"\";\n try {\n const parsed = new URL(url);\n name = decodeURIComponent(parsed.pathname.split(\"/\").filter(Boolean).pop() ?? parsed.hostname);\n } catch { name = url; }\n return name || \"download\";\n}\n\n/** Verifies one completed download against the reviewed size and checksum expectations. */\nexport function verifybytes(record: downloadrecord, expected: { bytes?: number; checksum?: string }): { ok: boolean; summary: string; matches: { state: boolean; size: boolean; checksum: boolean } } {\n const statematch = record.state === \"complete\";\n const sizematch = expected.bytes === undefined ? true : record.bytes === expected.bytes;\n const checksummatch = expected.checksum === undefined ? true : record.checksum === expected.checksum;\n const ok = statematch && sizematch && checksummatch;\n const parts = [`state ${record.state}${statematch ? \" matches\" : \" does not match the completed expectation\"}`];\n if (expected.bytes !== undefined) parts.push(`size ${record.bytes ?? \"unknown\"} of ${expected.bytes} bytes ${sizematch ? \"matches\" : \"differs\"}`);\n if (expected.checksum !== undefined) parts.push(`checksum ${record.checksum ?? \"unknown\"} ${checksummatch ? \"matches\" : \"differs from\"} the reviewed ${expected.checksum}`);\n return { ok, summary: `${ok ? \"Verified\" : \"Failed to verify\"} the download of ${record.filename}: ${parts.join(\"; \")}.`, matches: { state: statematch, size: sizematch, checksum: checksummatch } };\n}\n\n/** Matches one reviewed mime pattern with a trailing * wildcard against a mime type. */\nfunction mimepatternmatches(pattern: string, mime: string): boolean {\n if (!pattern.endsWith(\"*\")) return pattern === mime;\n return mime.startsWith(pattern.slice(0, -1));\n}\n\n/** True when the mime type passes the reviewed filter: exclude wins, then include, then the default for unlisted mime types. */\nexport function mimeallowed(filter: mimefilter, mime: string): boolean {\n if (filter.exclude.some(pattern => mimepatternmatches(pattern, mime))) return false;\n if (filter.include.some(pattern => mimepatternmatches(pattern, mime))) return true;\n return filter.default === \"allow\";\n}\n\n/** Redacts every header value of a captured request so exported netlogs never leak them. */\nexport function redactheaders(headers: Record<string, string>): Record<string, string> {\n return Object.fromEntries(Object.entries(headers).map(([name]) => [name, \"[redacted]\"]));\n}\n\n/** Builds one netlog record correlated with its step through the request id. */\nexport function netlogentry(input: { url: string; method: string; status: number; timing: number; requestid: string; stepid: string; at: number }): netlogrecord {\n return { url: input.url, method: input.method, status: input.status, timing: input.timing, requestid: input.requestid, stepid: input.stepid, at: input.at };\n}\n\n/** Returns the netlog records of one step, oldest first, correlated through the request ids. */\nexport function netlogforstep(records: netlogrecord[], stepid: string): netlogrecord[] {\n return records.filter(record => record.stepid === stepid);\n}\n\n/** Builds one clipboard entry from the payload hash and length; the payload text itself never persists. */\nexport function clipentryof(kind: clipentry[\"kind\"], payload: { hash: string; length: number }, origin: string, stepid: string, at: number): clipentry {\n return { kind, hash: payload.hash, length: payload.length, origin, stepid, at };\n}\n\n/** Hashes one clipboard payload so audits and memory carry the hash only. */\nexport function cliphash(payload: string): string {\n return checksum(payload);\n}\n\n/** Routes a quarantined path outside the downloads folder until release. */\nexport function quarantinedpath(filename: string): string {\n return `devthink-quarantine/${filename.replace(/^\\/+/, \"\")}`;\n}\n\n/** Builds one quarantine entry outside the downloads folder with a pending scan verdict. */\nexport function newquarantine(id: string, filename: string, reason: string, at: number): quarantineentry {\n const path = quarantinedpath(filename);\n return { id, path, reason, scan: \"pending\", at, updatedat: at };\n}\n\n/** Applies one scan verdict to a quarantined entry; hook failures stay pending instead of releasing. */\nexport function scanresult(entry: quarantineentry, verdict: scanverdict, at: number): quarantineentry {\n return { ...entry, scan: verdict, updatedat: at };\n}\n\n/** Maps one scanning hook response to its verdict; absent or malformed responses stay pending as hook failures. */\nexport function scanverdictof(response: unknown): scanverdict {\n if (!response || typeof response !== \"object\") return \"pending\";\n const verdict = (response as Record<string, unknown>).verdict;\n if (verdict === \"clean\" || verdict === \"flagged\" || verdict === \"error\") return verdict;\n return \"pending\";\n}\n\n/** Stamps the release ref of one quarantined entry after the policy gate approved it. */\nexport function released(entry: quarantineentry, ref: string, at: number): quarantineentry {\n return { ...entry, release: ref, updatedat: at };\n}\n\n/** Normalizes one capture name part into a filename safe lowercase slug. */\nfunction capturepart(value: string): string {\n return value.replace(/[^a-z0-9-]+/gi, \"-\").replace(/^-+|-+$/g, \"\").toLowerCase() || \"capture\";\n}\n\n/** Builds one consistent capture filename from its task, step and sequence parts. */\nexport function capturefilename(name: capturename, extension: string): string {\n const safeextension = extension.replace(/^\\.+/, \"\").toLowerCase() || \"png\";\n return `${capturepart(name.task)}-${capturepart(name.step)}-${name.sequence}.${safeextension}`;\n}\n\n/** Advances the capture naming counter of one step base and returns the stamped sequence. */\nexport function advancecounter(counters: Record<string, number>, base: string): { sequence: number; counters: Record<string, number> } {\n const sequence = (counters[base] ?? 0) + 1;\n return { sequence, counters: { ...counters, [base]: sequence } };\n}\n\n/** Stamps consistent capture names for the steps of one task with per task counters. */\nexport function capturenames(counters: Record<string, number>, task: string, steps: string[], extension: string): { names: string[]; counters: Record<string, number> } {\n let current = { ...counters };\n const names = steps.map(step => {\n const advanced = advancecounter(current, step);\n current = advanced.counters;\n return capturefilename({ task, step, sequence: advanced.sequence }, extension);\n });\n return { names, counters: current };\n}\n\n/** Collects the artifact references of open review cards so the cleanup sweeper keeps them. */\nexport function referencedartifacts(plan: { steps: Array<{ id: string; kind: string; value?: string }> } | undefined, completed: string[]): string[] {\n if (!plan) return [];\n return plan.steps.filter(step => step.kind === \"attachfile\" && !completed.includes(step.id)).map(step => step.value ?? \"\").filter(value => value.trim().length > 0);\n}\n\n/** Plans one cleanup sweep by age and kind while keeping referenced artifacts and honoring the keep policies. */\nexport function sweepplan(entries: artifactinventoryentry[], rules: cleanuprule[], now: number, keeprefs: string[]): { remove: string[]; keep: string[] } {\n const remove = new Set<string>();\n for (const rule of rules) {\n const matching = entries.filter(entry => rule.kind === \"any\" || entry.kind === rule.kind);\n const aged = matching.filter(entry => now - entry.at >= rule.age);\n const kept: artifactinventoryentry[] = [];\n if (rule.keep === \"all\") kept.push(...aged);\n else if (rule.keep === \"latest\") {\n const newest = [...aged].sort((left, right) => right.at - left.at)[0];\n if (newest) kept.push(newest);\n }\n for (const entry of aged) {\n if (kept.some(item => item.id === entry.id)) continue;\n if (keeprefs.includes(entry.id) || keeprefs.includes(entry.name)) continue;\n remove.add(entry.id);\n }\n }\n return { remove: [...remove], keep: entries.filter(entry => !remove.has(entry.id)).map(entry => entry.id) };\n}\n\n/** Reads the step ids a namecaptures step should stamp from its options or the plan steps. */\nexport function capturesteps(options: Record<string, unknown>, plan: { steps: toolstep[] }): string[] {\n const listed = Array.isArray(options.steps) ? options.steps.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n return listed.length > 0 ? listed : plan.steps.map(step => step.id);\n}\n", "import { randomid, sessionmemory } from \"../memory.js\";\nimport { beforeafterwrapallowed, canexecute, canpreview, clipboardconsentgranted, exportgranted, generatedvalueallowed, hostpattern, iscapturekind, isdatasetkind, isfileskind, isformkind, islayoutkind, ismediakind, isrecordingkind, istabscommandkind, layoutmutationgranted, maskclipboard, mediagate, navigationgranted, normalizeendpoint, originverified, parseoptions, passwordconsentgranted, profilegrantgranted, quarantinereleasegranted, recordingconsentgranted, recordingwindow, requiredcapability, stitchbudgetallowed, tasktabceiling, validatecleanuprule, validatestep, windowclosegate } from \"../policy.js\";\nimport { assigntasktab, downloadshare, extractionshare, iscomplete, recordcapture, recorddownload, recordmedia, recordnaventry, recordoutcome, recordpair, recordstep, recordwatchcompletion, recordwizardstep, recordextraction, resetforplan, tasktabs, watchclosed, wizardcompletion } from \"../progress.js\";\nimport { capturereport, datasetresponse, downloadreport, errorreportresponse, extractionreport, formreportresponse, heldkeysreport, layoutreport, mapresponse, mediareport, navstateresponse, netlogreport, observationresponse, outcomeresponse, parseproposal, provenancereport, quarantinereport, requestbody, safetyresponse, signalsreport, trailreport, wizardreport } from \"../protocol.js\";\nimport type { a11ynode, agentplan, agentsession, artifactinventoryentry, artifactrecord, assetrecord, auditevent, authrecord, bannerreport, canvasrecord, capabilityreport, captchahandoff, captureexport, captureformat, capturenaming, captureoptions, capturepolicy, clipboardconsentrecord, cleanuprule, cleanuprun, clickablemap, closedtab, columnspec, controltabstate, curatedlink, curatedlist, dataset, datasetrow, derivedselector, detectionrecord, diagnosticreport, diffentry, dialogdecision, dialogpolicy, downloadrecord, downloadspec, downloadstate, errorreport, exportedartifact, extractsession, fielderror, fieldkind, focusevent, formprofile, formreport, framerecord, imagebatch, imagedescriptor, keyholdstate, mapentry, mediadatum, mediarecord, mimefilter, mutationevent, navcontrol, navintentrecord, navqueues, navrecord, navstate, observation, pagesignals, pdfrecord, provenancerecord, readerarticle, recordingconsentrecord, recordingoptions, recordingrecord, ratelimit, ratelimitstate, recenttab, regionrect, resolvedtarget, retryoutcome, retryrule, safetyverdict, scanhookconfig, scanverdict, selectorcandidate, sessionsnapshot, sheetendpoint, sheetlayout, shotpair, shotrecord, snapshotdiff, stepoutcome, streamrecord, streamstate, submitticket, tabbadge, tabgrouprecord, tablayout, tabmeta, tabreport, tabreportentry, tabwatchevent, taskrules, templateprofile, thumbdirective, toolstep, trailentry, transformrule, typeaheadpick, waitprofilerecord, watchregistration, wizardstate } from \"../types.js\";\nimport { annotationplanof, buildname, buildsheet, buildstitchplan, captureelement, capturekinds, captureoptionsof, captureregion, capturestates, capturestitched, capturevisible, croprect, fixedheadermatch, regionsteps, seamweights, type annotationplan } from \"../capture.js\";\nimport { assetentries, buildpdf, convertdirectiveof, dedupeimages, finishrecording, frameinterval, imagematches, imagefilterof, imagenames, lapseframes, lapseplanof, mediakinds, mediaentries, newrecording, pdfoptionsof, pdfsegments, recordingoptionsof, streamsummaries, thumbdirectiveof, thumbgeometry } from \"../media.js\";\nimport { isbrowserkind, readcapabilities, runbrowseraction } from \"./browsertabs.js\";\nimport { assigntasktabs, audiotabs, badgefromprogress, buildlayout, clonetabs, closeselection, discardcandidates, layoutrestoreplan, parsetabquery, querymatches, regroupaftermoves, restorediscarded, searchtabmatches, switchtarget, tasktabgauge, tasktabsinwindow, trackedtasktabs, watchtabdispatch, windowprofilegrants, zoomstep, type tabshape, type windowshape } from \"./tabscommand.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\";\nimport { deeplinkurl, parsenavtarget, parsewaitprofile, pickrecenttab, profilefororigin, resolvecontainer } from \"./pagenav.js\";\nimport { authfor, batchopenset, buildredirectchain, checksafe, classifynavchange, curatelinks, detecthttpstate, domainof, finalurl, interstitialpolicy, navwatchevent, parseratelimit, prefetchcandidates, preconnectorigins, rateallows, ratewindow, recordratehit } from \"./pagenet.js\";\nimport { generatevalue, parseformrecord, valueshash } from \"./pageforms.js\";\nimport { backoffwaits, parsebackoff } from \"./pagewizards.js\";\nimport { dedupebykeys, mapcolumns, mergedatasets, parsecsv, samplerows, transformrows, type gridresult } from \"./pagedata.js\";\nimport { advancecursor, advancestream, artifactrecordof, backpressure, builddataset, chunkplan, exportartifact, exportcontent, gridpreview, loopstep, loopvariables, mergetaskrules, newextractsession, newstream, provenancefor, remainingpages, sheetpayload, streamfrom } from \"./datacommand.js\";\nimport { advancedownload, advancecounter, capturenames, capturesteps, clipentryof, cliphash, concurrentwindow, conflictfree, downloadfilename, mimeallowed, netlogentry, netlogforstep, newquarantine, redactheaders, referencedartifacts, released, scanresult, scanverdictof, sweepplan, transitionallowed, verifybytes } from \"./filescommand.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\"]);\nconst navigationstepkinds: ReadonlySet<string> = new Set([\"openlink\", \"openprivate\", \"reloadcache\", \"stopnav\", \"waitload\", \"waiturl\", \"followlink\", \"spanav\", \"spawait\", \"rewritequery\", \"setfragment\", \"navlist\", \"navprofile\", \"detecthttp\", \"readredirects\", \"readfinalurl\", \"handleauth\", \"printpdf\", \"prefetch\", \"preconnect\", \"deeplink\", \"reopentab\", \"trailaudit\", \"pausenav\", \"navintent\", \"navrate\", \"openclipboard\", \"checksafe\", \"batchopen\"]);\nconst pausenavkinds: ReadonlySet<string> = new Set([\"openlink\", \"openprivate\", \"followlink\", \"spanav\", \"navlist\", \"openclipboard\", \"batchopen\", \"prefetch\", \"preconnect\", \"deeplink\", \"reopentab\"]);\nconst ratecheckedkinds: ReadonlySet<string> = new Set([\"openlink\", \"openprivate\", \"followlink\", \"spanav\", \"navlist\", \"openclipboard\", \"batchopen\", \"deeplink\", \"reopentab\"]);\nconst formfillkinds: ReadonlySet<string> = new Set([\"fillform\", \"filllabel\", \"fillplaceholder\", \"fillcard\", \"fillcode\", \"attachfile\", \"saveprofiles\", \"runwizard\", \"selectchain\", \"picktypeahead\", \"pickdate\"]);\n/** Internal evidence capture cadence for navigation records; not a policy cap on any reviewed value. */\nconst evidencepoll = 100;\n/** Internal evidence capture window used while a tab settles after a navigation; not a policy cap on any reviewed value. */\nconst evidencesettle = 5000;\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, listing the capture kinds among the available capabilities. */\nasync function refreshcapabilities(): Promise<capabilityreport> {\n const report = await readcapabilities();\n const withmedia: capabilityreport = { ...report, captures: [...capturekinds], media: [...mediakinds] };\n await memory.setcapabilities(withmedia);\n return withmedia;\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, diff, navigation and tabs command event families. */\nfunction stepauditkind(step: toolstep, ok: boolean): auditevent[\"kind\"] {\n if (isbrowserkind(step.kind)) return browserauditkind(step);\n if (istabscommandkind(step.kind)) {\n if (step.kind === \"grouptabs\" || step.kind === \"colorgroup\" || step.kind === \"collapsegroup\") return \"group\";\n if (step.kind === \"savelayout\" || step.kind === \"restorelayout\" || step.kind === \"snapshotsession\" || step.kind === \"reopenrun\") return \"layout\";\n if (step.kind === \"discardtab\") return \"discard\";\n if (step.kind === \"badgetab\") return \"badge\";\n if (step.kind === \"watchtab\") return \"watch\";\n if (step.kind === \"maximizewindow\" || step.kind === \"minimizewindow\" || step.kind === \"restorewindow\" || step.kind === \"focuswindow\" || step.kind === \"scratchwindow\" || step.kind === \"incognitowindow\") return \"window\";\n return \"tab\";\n }\n if (step.kind === \"dismissdialog\") return \"dialog\";\n if (step.kind === \"keyhold\" || step.kind === \"keyrelease\") return \"hold\";\n if (step.kind === \"retryaction\" || step.kind === \"retryform\") return \"retry\";\n if (step.kind === \"submitform\" || step.kind === \"asksubmit\") return \"submit\";\n if (step.kind === \"consentpassword\") return \"consent\";\n if (step.kind === \"handoffcaptcha\") return \"handoff\";\n if (iscapturekind(step.kind)) return \"capture\";\n if (ismediakind(step.kind)) return \"media\";\n if (isfileskind(step.kind)) {\n if (step.kind === \"interceptmime\") return \"intercept\";\n if (step.kind === \"readclipboard\" || step.kind === \"writeclipboard\" || step.kind === \"copyscreen\") return \"clipboard\";\n if (step.kind === \"quarantinedownload\" || step.kind === \"scanvirus\") return \"quarantine\";\n if (step.kind === \"cleanupartifacts\") return \"cleanup\";\n if (step.kind === \"verifydownload\" || step.kind === \"exportnetlog\" || step.kind === \"namecaptures\") return \"observation\";\n return \"download\";\n }\n if (isdatasetkind(step.kind)) {\n if (step.kind === \"exportcsv\" || step.kind === \"exportjson\" || step.kind === \"exportexcel\" || step.kind === \"copytable\" || step.kind === \"pushsheets\") return \"export\";\n if (step.kind === \"streamdisk\") return \"stream\";\n if (step.kind === \"resumeextract\") return \"resume\";\n if (step.kind === \"logprovenance\") return \"provenance\";\n return \"scrape\";\n }\n if (formfillkinds.has(step.kind)) return \"fill\";\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 (step.kind === \"readredirects\" || step.kind === \"readfinalurl\" || step.kind === \"detecthttp\") return \"redirect\";\n if (step.kind === \"handleauth\") return \"auth\";\n if (step.kind === \"prefetch\" || step.kind === \"preconnect\") return \"prefetch\";\n if (step.kind === \"navrate\") return \"rate\";\n if (navigationstepkinds.has(step.kind)) return \"navigation\";\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\n/** Live navigation watch buffers per tab, rebuilt on every new navigation of the tab. */\nconst navbuffers = new Map<number, navwatchevent[]>();\n/** Last known urls per tab so closed tabs can be remembered for reopentab steps. */\nconst lastknownurls = new Map<number, string>();\n\n/** Tracks one tab update into the navigation watch buffer, the spa route trail, the last known url and the live title memory. */\nasync function tracktabupdate(tabid: number, changeinfo: { url?: string; status?: string; title?: string }): Promise<void> {\n const now = Date.now();\n const url = typeof changeinfo.url === \"string\" ? changeinfo.url : undefined;\n const status = changeinfo.status;\n if (typeof changeinfo.title === \"string\" && changeinfo.title) {\n lastknowntitles.set(tabid, changeinfo.title);\n await recordtabwatchevent(\"title\", tabid, changeinfo.title);\n }\n const previous = lastknownurls.get(tabid);\n if (status === \"loading\" && url) {\n navbuffers.set(tabid, [{ event: \"beforenavigate\", url, timestamp: now }]);\n lastknownurls.set(tabid, url);\n return;\n }\n const buffer = navbuffers.get(tabid) ?? [];\n if (url) {\n const kind = classifynavchange(previous ?? url, url, status);\n buffer.push({ event: kind === \"route\" ? \"urlchange\" : \"committed\", url, timestamp: now, redirect: kind === \"route\" });\n if (kind === \"route\" && previous) {\n const session = await memory.getsession();\n if (session && !session.stoppedat && session.tabid === tabid) {\n await memory.addtrailentry(session.id, { url, title: \"\", at: now });\n }\n }\n lastknownurls.set(tabid, url);\n }\n if (status === \"complete\") buffer.push({ event: \"completed\", url: lastknownurls.get(tabid) ?? \"\", timestamp: now, status: 200 });\n navbuffers.set(tabid, buffer);\n}\n\nchrome.tabs.onUpdated.addListener((tabid, changeinfo) => { void tracktabupdate(tabid, changeinfo); });\n\n/** Records the activation of a tab into every live watchtab registration. */\nchrome.tabs.onActivated.addListener(activeinfo => { void recordtabwatchevent(\"activated\", activeinfo.tabId); });\n\n/** Remembers the last known url and title of a closed tab so restoretab and reopenrun can restore it. */\nchrome.tabs.onRemoved.addListener(tabid => {\n const url = lastknownurls.get(tabid);\n const title = lastknowntitles.get(tabid) ?? \"\";\n const windowid = 0;\n if (url) {\n void memory.addrecenttab({ url, tabid, closedat: Date.now() });\n void memory.addclosedtab({ url, title, tabid, windowid, closedat: Date.now() });\n }\n void recordtabwatchevent(\"closed\", tabid, url);\n lastknownurls.delete(tabid);\n lastknowntitles.delete(tabid);\n navbuffers.delete(tabid);\n});\n\n/** Records one completed navigation: the redirect chain from the watch buffer, the final url, the per tab state, the navigation trail entry and the correlated netlog records. */\nasync function recordnavigation(step: toolstep, session: agentsession | undefined, tabid: number): Promise<navrecord> {\n const started = Date.now();\n let tab = await chrome.tabs.get(tabid).catch(() => undefined);\n while (tab && tab.status !== \"complete\" && Date.now() - started < evidencesettle) {\n await new Promise(resolve => setTimeout(resolve, evidencepoll));\n tab = await chrome.tabs.get(tabid).catch(() => undefined);\n }\n const url = tab?.url ?? lastknownurls.get(tabid) ?? \"\";\n const title = tab?.title ?? \"\";\n const chain = buildredirectchain(navbuffers.get(tabid) ?? []);\n const record: navrecord = {\n stepid: step.id,\n ...(session ? { sessionid: session.id } : {}),\n origin: session?.origin ?? (url ? new URL(url).origin : \"\"),\n finalurl: finalurl(chain) || url,\n chain,\n at: Date.now(),\n };\n await memory.addnavrecord(record);\n await memory.setnavstate(tabid, record);\n if (session && url) await memory.addtrailentry(session.id, { url, title, stepid: step.id, at: Date.now() });\n await collectnetlog(tabid, step);\n return record;\n}\n\n/** Collects the network log of one recorded navigation from the tab watch buffer, correlating each request with the step through request ids. */\nasync function collectnetlog(tabid: number, step: toolstep): Promise<void> {\n const events = navbuffers.get(tabid) ?? [];\n if (events.length === 0) return;\n const first = events[0]?.timestamp ?? Date.now();\n for (const [index, event] of events.entries()) {\n const status = event.status ?? (event.event === \"completed\" ? 200 : event.event === \"error\" ? 0 : 0);\n await memory.addnetlog(netlogentry({ url: event.url, method: \"GET\", status, timing: Math.max(0, event.timestamp - first), requestid: `${step.id}-${index + 1}`, stepid: step.id, at: event.timestamp }));\n }\n}\n\n/** Appends the session origin grants to the options of a page navigation step so the bridge can refuse out-of-grant links. */\nfunction injectallowedorigins(step: toolstep, session: agentsession | undefined): toolstep {\n const allowedorigins = session?.grants ?? (session ? [session.origin] : []);\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n return { ...step, options: JSON.stringify({ ...options, allowedorigins }) };\n}\n\n/** Enforces the reviewed per domain navigation rate limit before one navigation runs. */\nasync function enforceratelimit(url: string, stepid: string, sessionid: string | undefined): Promise<void> {\n const domain = domainof(url);\n if (!domain) return;\n const states = await memory.getratestates();\n const stored = states.find(item => item.domain === domain);\n if (!stored) return;\n const live = ratewindow(stored, stored.limit, Date.now());\n const decision = rateallows(live, Date.now());\n if (!decision.allowed) {\n await audit(\"rate\", `The navigation rate limit of ${live.limit.ceiling} per ${live.limit.window} milliseconds for ${domain} was exceeded; the navigation was refused.`, { ...(sessionid ? { sessionid } : {}), stepid });\n throw new Error(`The navigation rate limit for ${domain} has been reached; retry after ${Math.ceil(decision.retryafter / 1000)} seconds.`);\n }\n await memory.setratestate(recordratehit(live, Date.now()));\n await audit(\"rate\", `Navigation to ${url} counted against the reviewed rate limit of ${live.limit.ceiling} per ${live.limit.window} milliseconds for ${domain}; ${decision.remaining - 1} remaining.`, { ...(sessionid ? { sessionid } : {}), stepid });\n}\n\n/** Refuses navigation while the reviewed navigation pause is armed for an open consent prompt. */\nasync function refusenavpause(step: toolstep): Promise<void> {\n if (!pausenavkinds.has(step.kind)) return;\n const control = await memory.getnavcontrol();\n if (control?.pausedat) throw new Error(control.reason ? `Navigation is paused: ${control.reason}` : \"Navigation is paused while a consent prompt is open; resume navigation first.\");\n}\n\n/** Opens one reviewed navigation target in its resolved container across tabs, windows and private profiles. */\nasync function opencontainer(step: toolstep, session: agentsession | undefined, url: string, container: \"current\" | \"tab\" | \"window\" | \"private\", position: \"adjacent\" | \"end\"): Promise<stepoutput> {\n const windows = await chrome.windows.getAll().catch(() => [] as Array<{ id?: number; incognito?: boolean; focused?: boolean }>);\n const plan = resolvecontainer({ url, container, position, private: container === \"private\" }, windows.map(item => ({ id: item.id ?? 0, incognito: item.incognito ?? false, focused: item.focused ?? false })));\n const extra = { ...(session ? { sessionid: session.id } : {}), stepid: step.id };\n if (plan.kind === \"current\" && session) {\n const tabid = session.tabid;\n await chrome.tabs.update(tabid, { url });\n const record = await recordnavigation(step, session, tabid);\n await audit(\"navigation\", `Navigated the task tab to ${url}.`, extra);\n return { ok: true, summary: `Navigated the task tab to ${url}.`, details: { container: plan.kind, url, finalurl: record.finalurl, hops: record.chain.hops.length } };\n }\n if (plan.kind === \"private\" || plan.kind === \"window\") {\n const created = await chrome.windows.create({ url, incognito: plan.incognito });\n await audit(\"navigation\", `Opened ${plan.kind === \"private\" ? \"a private window\" : \"a new window\"} for ${url}${plan.kind === \"private\" ? \" separated from normal windows\" : \"\"}.`, extra);\n return { ok: true, summary: `Opened ${plan.kind === \"private\" ? \"a private window\" : \"a new window\"} for ${url}.`, details: { container: plan.kind, url, windowid: created?.id ?? 0, incognito: plan.incognito } };\n }\n const created = await chrome.tabs.create({ url, ...(plan.windowid !== undefined ? { windowId: plan.windowid } : {}), active: true });\n await audit(\"navigation\", `Opened a new tab for ${url} without leaving the current page.`, extra);\n return { ok: true, summary: `Opened a new tab for ${url}.`, details: { container: \"tab\", url, tabid: created?.id ?? 0, position: plan.position } };\n}\n\n/** Verifies one url against the session grants and the stored checksafe verdicts before it opens. */\nasync function verifyopenurl(url: string, session: agentsession | undefined): Promise<void> {\n const grants = session?.grants ?? (session ? [session.origin] : []);\n const verified = originverified(url, grants, await memory.getsafeties());\n if (!verified.allowed) throw new Error(verified.reason);\n}\n\n/** Executes one reviewed openlink or openprivate step from its navtarget container. */\nasync function executeopenlink(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n const target = parsenavtarget(step);\n if (!target) throw new Error(\"A reviewed navtarget is required.\");\n await refusenavpause(step);\n await enforceratelimit(target.url, step.id, session?.id);\n await verifyopenurl(target.url, session);\n return opencontainer(step, session, target.url, target.container, target.position ?? \"adjacent\");\n}\n\n/** Executes one reviewed deeplink step by building the deep link and opening it in the reviewed container. */\nasync function executedeeplink(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const params: Record<string, string> = {};\n if (options.params && typeof options.params === \"object\" && !Array.isArray(options.params)) {\n for (const [name, value] of Object.entries(options.params as Record<string, unknown>)) if (typeof value === \"string\") params[name] = value;\n }\n const url = deeplinkurl(typeof options.app === \"string\" ? options.app : \"\", params);\n if (!url) throw new Error(\"The reviewed deep link pattern is not a known web app.\");\n await refusenavpause(step);\n await enforceratelimit(url, step.id, session?.id);\n await verifyopenurl(url, session);\n const target = parsenavtarget(step);\n const container = target?.container === \"window\" ? \"window\" : target?.container === \"private\" ? \"private\" : target?.container === \"current\" ? \"current\" : \"tab\";\n const output = await opencontainer(step, session, url, container, target?.position ?? \"adjacent\");\n return { ...output, details: { ...(output.details ?? {}), app: options.app, deeplink: url } };\n}\n\n/** Executes one reviewed reopentab step: the most recently closed tab url is restored in a new tab. */\nasync function executereopentab(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n await refusenavpause(step);\n let url = step.value;\n if (!url) {\n const tabs = await chrome.tabs.query({}).catch(() => [] as Array<{ url?: string }>);\n const openurls = tabs.map(tab => tab.url ?? \"\").filter(Boolean);\n const recent = pickrecenttab(await memory.getrecenttabs(), openurls);\n if (!recent) throw new Error(\"No recently closed tab is available to reopen.\");\n url = recent.url;\n }\n await enforceratelimit(url, step.id, session?.id);\n await verifyopenurl(url, session);\n const created = await chrome.tabs.create({ url, active: true });\n await audit(\"navigation\", `Reopened the recently closed tab ${url}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Reopened ${url} in a new tab.`, details: { url, tabid: created?.id ?? 0 } };\n}\n\n/** Waits until one tab reports the complete load status, bounded by the internal evidence window. */\nasync function waitforcomplete(tabid: number): Promise<boolean> {\n const started = Date.now();\n for (;;) {\n const tab = await chrome.tabs.get(tabid).catch(() => undefined);\n if (!tab) return false;\n if (tab.status === \"complete\") return true;\n if (Date.now() - started >= evidencesettle) return false;\n await new Promise(resolve => setTimeout(resolve, evidencepoll));\n }\n}\n\n/** Records one navlist entry completion in the plan progress. */\nasync function recordnaventryoutcome(step: toolstep, plan: agentplan, entry: { index: number; url: string; ok: boolean }): Promise<void> {\n const base = await memory.getprogress();\n await memory.setprogress(recordnaventry(base, plan.id, step.id, entry, Date.now()));\n}\n\n/** Executes one reviewed navlist step: the reviewed urls are navigated sequentially, each entry recorded as it completes. */\nasync function executenavlist(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const urls = Array.isArray(options.urls) ? options.urls.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n if (urls.length === 0) throw new Error(\"A reviewed list of navigation urls is required.\");\n await refusenavpause(step);\n let completed = 0;\n let failed = \"\";\n for (let index = 0; index < urls.length; index += 1) {\n const url = urls[index] as string;\n const entrygate = navigationgranted(session, url);\n if (!entrygate.allowed) {\n failed = entrygate.reason ?? \"The navigation list entry was refused.\";\n await recordnaventryoutcome(step, plan, { index, url, ok: false });\n break;\n }\n try {\n await enforceratelimit(url, step.id, session?.id);\n await refusenavpause(step);\n await chrome.tabs.update(tabid, { url });\n await waitforcomplete(tabid);\n await recordnavigation(step, session, tabid);\n completed += 1;\n await recordnaventryoutcome(step, plan, { index, url, ok: true });\n } catch (error) {\n failed = error instanceof Error ? error.message : String(error);\n await recordnaventryoutcome(step, plan, { index, url, ok: false });\n break;\n }\n }\n const remaining = urls.length - completed;\n const ok = failed === \"\" && completed === urls.length;\n return {\n ok,\n summary: ok\n ? `Navigated the reviewed list of ${urls.length} url${urls.length === 1 ? \"\" : \"s\"} sequentially.`\n : `The navigation list stopped after ${completed} of ${urls.length} entries: ${failed}`,\n details: { completed, remaining, urls },\n };\n}\n\n/** Applies one reviewed per site wait profile during navigation and stores it per origin for the following steps. */\nasync function executenavprofile(step: toolstep, session: agentsession | undefined, origin: string): Promise<stepoutput> {\n const profile = parsewaitprofile(step);\n if (!profile) throw new Error(\"A reviewed waitprofile is required.\");\n const record: waitprofilerecord = { origin, profile, at: Date.now() };\n await memory.setwaitprofile(record);\n const effective = profilefororigin(profile, origin);\n await audit(\"navigation\", `Wait profile applied for ${origin} with signals ${effective.signals.join(\", \")}${effective.idle > 0 ? `, idle ${effective.idle}ms` : \"\"}${effective.timeout > 0 ? ` and timeout ${effective.timeout}ms` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Applied the reviewed wait profile for ${origin} during navigation.`, details: { origin, signals: effective.signals, idle: effective.idle, timeout: effective.timeout, overrides: (profile.overrides ?? []).map(override => override.origin) } };\n}\n\n/** Detects the http error, offline and certificate interstitial states of the session tab. */\nasync function executedetecthttp(session: agentsession | undefined, tabid: number): Promise<stepoutput> {\n const records = await memory.getnavrecords();\n const buffer = navbuffers.get(tabid) ?? [];\n const errors = buffer.filter(event => event.error !== undefined).map(event => event.error as string);\n const statuses = (records[0]?.chain.hops ?? []).map(hop => hop.status).filter(status => status > 0);\n const state = detecthttpstate({ offline: !navigator.onLine, errors, statuses });\n const policy = interstitialpolicy(state);\n return {\n ok: true,\n summary: state.httperror || state.offline\n ? `Detected ${state.reasons.length} navigation problem${state.reasons.length === 1 ? \"\" : \"s\"}: ${state.reasons.join(\"; \")}.`\n : \"No http error, offline state or certificate interstitial was detected.\",\n details: { httperror: state.httperror, offline: state.offline, certificate: state.certificate, reasons: state.reasons, interstitial: policy.interstitial, bypass: policy.bypass, guidance: policy.guidance },\n };\n}\n\n/** Returns the redirect chain of the latest navigation step with its statuses and timing. */\nasync function executereadredirects(session: agentsession | undefined): Promise<stepoutput> {\n const record = (await memory.getnavrecords()).find(item => !session || item.sessionid === session.id);\n if (!record) return { ok: false, summary: \"No navigation has been recorded yet.\", details: { chain: { hops: [], startedat: 0, endedat: 0 } } };\n return { ok: true, summary: `The latest navigation travelled ${Math.max(0, record.chain.hops.length - 1)} redirect${record.chain.hops.length - 1 === 1 ? \"\" : \"s\"} to ${record.finalurl}.`, details: { chain: record.chain, finalurl: record.finalurl, duration: record.chain.endedat - record.chain.startedat } };\n}\n\n/** Captures the final url after redirects of the latest navigation step. */\nasync function executereadfinalurl(session: agentsession | undefined): Promise<stepoutput> {\n const record = (await memory.getnavrecords()).find(item => !session || item.sessionid === session.id);\n if (!record) return { ok: false, summary: \"No navigation has been recorded yet.\", details: { finalurl: \"\" } };\n return { ok: true, summary: `The final url after redirects is ${record.finalurl}.`, details: { finalurl: record.finalurl, hops: record.chain.hops } };\n}\n\n/** Answers a basic auth prompt from stored reviewed credentials; the flow refuses to run without them. */\nasync function executehandleauth(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n const auths = await memory.getauths();\n const record = authfor(auths, step.value ?? \"\");\n if (!record) throw new Error(`No reviewed basic auth credentials are stored for ${step.value ?? \"\"}; store them from the side panel first.`);\n await audit(\"auth\", `Basic auth credentials for ${record.origin} reviewed as ${record.username} were armed for the auth prompt; the password stays out of every step detail.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Armed the reviewed basic auth credentials of ${record.username} for ${record.origin}.`, details: { origin: record.origin, username: record.username, reviewedat: record.reviewedat, armed: true } };\n}\n\n/** Prints the page through the browser print pipeline and routes the artifact record into the task artifact store. */\nasync function executeprintpdf(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const name = typeof options.name === \"string\" && options.name ? options.name : `${step.id}.pdf`;\n const artifact: artifactrecord = { id: randomid(), kind: \"printpdf\", name, stepid: step.id, at: Date.now() };\n await memory.addartifact(artifact);\n await audit(\"navigation\", `Printed the page to pdf through the browser print pipeline and routed the artifact ${name} into the task artifact store.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: output?.ok ?? false, summary: output?.summary ?? \"The print pipeline returned no result.\", details: { ...(output?.details ?? {}), artifact } };\n}\n\n/** Verifies the prefetch candidates against the session grants and queues the granted ones as page hints. */\nasync function executeprefetch(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const urls = Array.isArray(options.urls) ? options.urls.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const grants = session?.grants ?? (session ? [session.origin] : []);\n const verdict = prefetchcandidates(urls, grants);\n if (verdict.allowed.length === 0) throw new Error(\"No prefetch candidate is covered by the session grants.\");\n await refusenavpause(step);\n const derived: toolstep = { ...step, options: JSON.stringify({ ...options, urls: verdict.allowed }) };\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n await memory.setnavqueues({ prefetch: verdict.allowed.length, batchopen: (await memory.getnavqueues())?.batchopen ?? 0, updatedat: Date.now() });\n await refreshbadge();\n await audit(\"prefetch\", `Prefetched ${verdict.allowed.length} predicted next page${verdict.allowed.length === 1 ? \"\" : \"s\"} verified against the session grants${verdict.refused.length > 0 ? ` and refused ${verdict.refused.length} candidate${verdict.refused.length === 1 ? \"\" : \"s\"} outside the grants` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The prefetch step returned no result.\", details: { ...(output?.details ?? {}), allowed: verdict.allowed, refused: verdict.refused } };\n}\n\n/** Preconnects to the reviewed expected origins. */\nasync function executepreconnect(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const origins = preconnectorigins(Array.isArray(options.origins) ? options.origins.filter((item): item is string => typeof item === \"string\") : []);\n await refusenavpause(step);\n const output = await dispatchpagestep({ ...step, options: JSON.stringify({ ...options, origins }) }, tabid, origin, plan);\n await audit(\"prefetch\", `Preconnected to ${origins.length} expected origin${origins.length === 1 ? \"\" : \"s\"}: ${origins.join(\", \")}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The preconnect step returned no result.\", details: { ...(output?.details ?? {}), origins } };\n}\n\n/** Opens a url read from the clipboard on the explicit consent of the approved step. */\nasync function executeopenclipboard(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n await refusenavpause(step);\n const text = await navigator.clipboard.readText();\n let url = \"\";\n try { url = new URL(text.trim()).toString(); } catch { throw new Error(\"The clipboard does not hold a valid url.\"); }\n if (!url.startsWith(\"https://\")) throw new Error(\"The clipboard url must use HTTPS.\");\n await enforceratelimit(url, step.id, session?.id);\n await verifyopenurl(url, session);\n const output = await opencontainer(step, session, url, \"tab\", \"adjacent\");\n await audit(\"navigation\", `Opened the clipboard url ${url} on the explicit consent of the reviewed step.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ...output, details: { ...(output.details ?? {}), url } };\n}\n\n/** Verifies one url for safety and stores the verdict for review. */\nasync function executechecksafe(step: toolstep, session: agentsession | undefined, planid: string | undefined): Promise<stepoutput> {\n const verdict = { ...checksafe(step.value ?? \"\"), at: Date.now() };\n await memory.addsafety(verdict);\n await audit(\"navigation\", `Safety check of ${verdict.url} returned ${verdict.safe ? \"safe\" : \"unsafe\"}${verdict.reasons.length > 0 ? `: ${verdict.reasons.join(\"; \")}` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}), ...(planid ? { planid } : {}), stepid: step.id });\n return { ok: true, summary: verdict.safe ? `The url ${verdict.url} passed every safety check.` : `The url ${verdict.url} is unsafe: ${verdict.reasons.join(\"; \")}.`, details: { verdict } };\n}\n\n/** Opens one curated link list with per url safety checks; any unsafe url refuses the whole batch. */\nasync function executebatchopen(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n const urls = Array.isArray(options.urls) ? options.urls.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const links: curatedlink[] = curatelinks(urls, url => ({ ...checksafe(url), at: Date.now() }));\n const curated: curatedlist = { id: randomid(), links, at: Date.now() };\n await memory.addcurated(curated);\n const set = batchopenset(links);\n if (set.refused.length > 0) {\n await memory.setnavqueues({ prefetch: (await memory.getnavqueues())?.prefetch ?? 0, batchopen: set.refused.length, updatedat: Date.now() });\n await refreshbadge();\n await audit(\"navigation\", `Batch open refused for ${set.refused.length} unsafe url${set.refused.length === 1 ? \"\" : \"s\"}; the curated list waits for review.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: false, summary: `The batch was refused because ${set.refused.length} of ${links.length} urls are unsafe; review the curated list before opening.`, details: { curated, refused: set.refused } };\n }\n await refusenavpause(step);\n const opened: number[] = [];\n for (const url of set.open) {\n await enforceratelimit(url, step.id, session?.id);\n const created = await chrome.tabs.create({ url, active: opened.length === 0 });\n opened.push(created?.id ?? 0);\n if (session) await memory.addtrailentry(session.id, { url, title: \"\", stepid: step.id, at: Date.now() });\n }\n await memory.addcurated({ ...curated, reviewedat: Date.now() });\n await memory.setnavqueues({ prefetch: (await memory.getnavqueues())?.prefetch ?? 0, batchopen: 0, updatedat: Date.now() });\n await refreshbadge();\n await audit(\"navigation\", `Batch opened ${set.open.length} curated url${set.open.length === 1 ? \"\" : \"s\"} after per url safety checks.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Opened ${set.open.length} curated url${set.open.length === 1 ? \"\" : \"s\"} after per url safety checks.`, details: { curated, tabids: opened } };\n}\n\n/** Toggles the navigation pause that holds navigation while a consent prompt is open. */\nasync function executepausenav(step: toolstep, session: agentsession | undefined): Promise<stepoutput> {\n const control = await memory.getnavcontrol();\n let options: Record<string, unknown> = {};\n try { options = parseoptions(step); } catch { options = {}; }\n if (control?.pausedat) {\n await memory.setnavcontrol({ updatedat: Date.now() });\n await audit(\"resume\", `Navigation resumed after ${Date.now() - control.pausedat} milliseconds of pause.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: \"Navigation resumed; reviewed navigation steps can run again.\", details: { paused: false } };\n }\n const reason = typeof options.reason === \"string\" && options.reason ? options.reason : \"a consent prompt is open\";\n await memory.setnavcontrol({ pausedat: Date.now(), reason, updatedat: Date.now() });\n await audit(\"pause\", `Navigation paused while ${reason}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Navigation paused while ${reason}.`, details: { paused: true, reason } };\n}\n\n/** Records the navigation intent detected from the plan for audit review. */\nasync function executenavintent(step: toolstep, session: agentsession | undefined, origin: string): Promise<stepoutput> {\n const record: navintentrecord = { id: randomid(), intent: step.value ?? \"\", origin, ...(session ? { sessionid: session.id } : {}), stepid: step.id, at: Date.now() };\n await memory.addnavintent(record);\n await audit(\"navigation\", `Navigation intent \"${record.intent}\" recorded for ${origin}.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Recorded the navigation intent \"${record.intent}\".`, details: { intent: record.intent, origin, at: record.at } };\n}\n\n/** Applies the reviewed per domain navigation rate limit and reports the live window state. */\nasync function executenavrate(step: toolstep, session: agentsession | undefined, origin: string): Promise<stepoutput> {\n const limit = parseratelimit(step);\n if (!limit) throw new Error(\"A reviewed ratelimit is required.\");\n if (!limit.domain) limit.domain = domainof(origin) || origin;\n const states = await memory.getratestates();\n const stored = states.find(item => item.domain === limit.domain);\n const live = ratewindow(stored, limit, Date.now());\n const decision = rateallows(live, Date.now());\n await memory.setratestate(live);\n await audit(\"rate\", `Navigation rate limit of ${limit.ceiling} per ${limit.window} milliseconds applied for ${limit.domain}; ${decision.remaining} navigation${decision.remaining === 1 ? \"\" : \"s\"} remaining in the window.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: `Applied the reviewed navigation rate limit for ${limit.domain}.`, details: { domain: limit.domain, window: limit.window, ceiling: limit.ceiling, count: live.count, remaining: decision.remaining, retryafter: decision.retryafter } };\n}\n\n/** Restores the navigation trail of the session for audit. */\nasync function executetrailaudit(session: agentsession | undefined): Promise<stepoutput> {\n if (!session) throw new Error(\"No active browser session exists.\");\n const trail = await memory.gettrail(session.id);\n return { ok: true, summary: `The navigation trail of the session holds ${trail.length} visited url${trail.length === 1 ? \"\" : \"s\"}.`, details: { trail } };\n}\n\n/** Dispatches one reviewed navigation kind: page world steps go through the bridge, container and state steps stay in the background. */\nasync function executenavigationkind(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n switch (step.kind) {\n case \"openlink\": return executeopenlink(step, session);\n case \"openprivate\": return executeopenlink(step, session);\n case \"deeplink\": return executedeeplink(step, session);\n case \"reopentab\": return executereopentab(step, session);\n case \"reloadcache\": {\n await refusenavpause(step);\n await chrome.tabs.reload(tabid, { bypassCache: true });\n const record = await recordnavigation(step, session, tabid);\n await audit(\"navigation\", `Reloaded the page bypassing the cache.`, { ...(session ? { sessionid: session.id } : {}), stepid: step.id });\n return { ok: true, summary: \"Reloaded the page bypassing the cache.\", details: { bypasscache: true, finalurl: record.finalurl } };\n }\n case \"navlist\": return executenavlist(step, session, plan, tabid);\n case \"navprofile\": return executenavprofile(step, session, origin);\n case \"detecthttp\": return executedetecthttp(session, tabid);\n case \"readredirects\": return executereadredirects(session);\n case \"readfinalurl\": return executereadfinalurl(session);\n case \"handleauth\": return executehandleauth(step, session);\n case \"printpdf\": return executeprintpdf(step, session, plan, tabid, origin);\n case \"prefetch\": return executeprefetch(step, session, plan, tabid, origin);\n case \"preconnect\": return executepreconnect(step, session, plan, tabid, origin);\n case \"checksafe\": return executechecksafe(step, session, plan.id);\n case \"batchopen\": return executebatchopen(step, session);\n case \"pausenav\": return executepausenav(step, session);\n case \"navintent\": return executenavintent(step, session, origin);\n case \"navrate\": return executenavrate(step, session, origin);\n case \"trailaudit\": return executetrailaudit(session);\n case \"openclipboard\": return executeopenclipboard(step, session);\n default: {\n await refusenavpause(step);\n if (ratecheckedkinds.has(step.kind)) await enforceratelimit(origin, step.id, session?.id);\n const derived = injectallowedorigins(step, session);\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n if (step.kind === \"followlink\" || step.kind === \"spanav\") {\n const record = await recordnavigation(step, session, tabid);\n return { ...(output ?? { ok: false, summary: \"The navigation step returned no result.\" }), details: { ...((output ?? {}).details ?? {}), finalurl: record.finalurl, hops: record.chain.hops.length } };\n }\n return output ?? { ok: false, summary: \"The navigation step returned no result.\" };\n }\n }\n}\n\n/** Live tab set of the whole browser resolved into the serializable tabshape contract. */\nasync function livetabs(): Promise<tabshape[]> {\n const tabs = await chrome.tabs.query({}).catch(() => [] as chrome.tabs.Tab[]);\n return tabs.map(tab => ({\n tabid: tab.id ?? 0,\n url: tab.url ?? \"\",\n title: tab.title ?? \"\",\n index: tab.index,\n windowid: tab.windowId ?? 0,\n active: tab.active,\n pinned: tab.pinned,\n audible: tab.audible ?? false,\n muted: tab.mutedInfo?.muted ?? false,\n discarded: tab.discarded ?? false,\n }));\n}\n\n/** Live window set resolved into the serializable windowshape contract. */\nasync function livewindows(): Promise<windowshape[]> {\n const windows = await chrome.windows.getAll().catch(() => [] as chrome.windows.Window[]);\n return windows.map(item => ({\n windowid: item.id ?? 0,\n left: item.left ?? 0,\n top: item.top ?? 0,\n width: item.width ?? 0,\n height: item.height ?? 0,\n state: item.state === \"maximized\" || item.state === \"minimized\" || item.state === \"fullscreen\" ? item.state : \"normal\",\n incognito: item.incognito ?? false,\n focused: item.focused,\n }));\n}\n\n/** Live watchtab event buffers per watch id, filled by the tab event listeners and read by the step executor. */\nconst tabwatchbuffers = new Map<string, tabwatchevent[]>();\n/** Last known titles per tab so closed tabs keep their title inside the closed tab history. */\nconst lastknowntitles = new Map<number, string>();\n\n/** Records one tab event into every live watchtab registration and its step stream buffer. */\nasync function recordtabwatchevent(event: \"title\" | \"activated\" | \"closed\", tabid: number, detail?: string): Promise<void> {\n const now = Date.now();\n for (const watch of await memory.getwatches()) {\n if (watch.closedat !== undefined || watch.kind !== \"watchtab\") continue;\n if (watchclosed(watch.startedat, watch.lifetime, now)) continue;\n if (watch.events.length > 0 && !watch.events.includes(event)) continue;\n const record: tabwatchevent = { watchid: watch.watchid, event, tabid, ...(detail !== undefined ? { detail } : {}), at: now };\n await memory.addtabwatchevent(record);\n tabwatchbuffers.set(watch.watchid, [...(tabwatchbuffers.get(watch.watchid) ?? []), record]);\n }\n}\n\n/** Builds one tab report with matched tabs carrying audio state and metadata, the group registry and the badge states. */\nasync function buildtabreport(matches: tabshape[]): Promise<tabreport> {\n const [groups, badges, metas] = await Promise.all([memory.gettabgroups(), memory.getbadges(), memory.gettabmetas()]);\n const metabytab = new Map(metas.map(meta => [meta.tabid, meta]));\n const entries: tabreportentry[] = matches.map(tab => ({\n tabid: tab.tabid,\n url: tab.url,\n title: tab.title,\n index: tab.index,\n windowid: tab.windowid,\n active: tab.active,\n pinned: tab.pinned,\n audible: tab.audible,\n muted: tab.muted,\n discarded: tab.discarded,\n ...(metabytab.has(tab.tabid) ? { meta: metabytab.get(tab.tabid) as tabmeta } : {}),\n }));\n return { matches: entries, groups: groups.map(group => ({ name: group.name, color: group.color, tabids: group.tabids, collapsed: group.collapsed })), badges };\n}\n\n/** Reads the numeric tab ids a reviewed tabs and windows command step addresses, from the value or the reviewed list. */\nfunction commandtabids(step: toolstep, options: Record<string, unknown>): number[] {\n const listed = Array.isArray(options.tabs) ? options.tabs.filter((item): item is number => typeof item === \"number\" && Number.isInteger(item) && item >= 0) : [];\n const single = step.value && /^\\d+$/.test(step.value) ? [Number.parseInt(step.value, 10)] : [];\n return listed.length > 0 ? listed : single;\n}\n\n/** Executes one reviewed tabs and windows command kind against the live browser surface with persistence and audits. */\nasync function executetabscommand(step: toolstep, session: agentsession | undefined, plan: agentplan, sessiontabid: number): Promise<stepoutput> {\n const options = stepoptions(step);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n const windowid = step.value && /^\\d+$/.test(step.value) ? Number.parseInt(step.value, 10) : 0;\n const layoutgate = layoutmutationgranted(session, Date.now());\n if (islayoutkind(step.kind) && !layoutgate.allowed) throw new Error(layoutgate.reason ?? \"Group and layout mutations stay inside the active session.\");\n switch (step.kind) {\n case \"querytabs\": {\n const query = parsetabquery(step);\n if (!query) throw new Error(\"A reviewed tabquery is required.\");\n const matches = querymatches(query, await livetabs());\n const report = await buildtabreport(matches);\n await audit(\"tab\", `Queried the live tab set and matched ${matches.length} tab${matches.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Matched ${matches.length} open tab${matches.length === 1 ? \"\" : \"s\"} by the reviewed tabquery.`, details: { report, matches: matches.length } };\n }\n case \"duplicatetab\": {\n const source = Number.parseInt(step.value ?? \"\", 10);\n const created = await chrome.tabs.duplicate(source);\n await audit(\"tab\", `Duplicated tab ${source} with its history into tab ${created?.id ?? 0}.`, extra);\n return { ok: true, summary: `Duplicated tab ${source} with its history.`, details: { sourcetab: source, tabid: created?.id ?? 0 } };\n }\n case \"closepattern\": {\n const query = parsetabquery(step);\n if (!query) throw new Error(\"A reviewed tabquery is required.\");\n const tabs = await livetabs();\n const selection = closeselection(query, tabs, session?.tabid ?? sessiontabid);\n if (selection.refused.length > 0) throw new Error(\"The close pattern matches the session tab itself; review the pattern so the session tab survives.\");\n if (selection.targets.length === 0) return { ok: true, summary: \"The reviewed close pattern matched no tab outside the session tab.\", details: { closed: 0 } };\n for (const target of selection.targets) await chrome.tabs.remove(target.tabid).catch(() => undefined);\n await audit(\"tab\", `Closed ${selection.targets.length} tab${selection.targets.length === 1 ? \"\" : \"s\"} matching the reviewed close pattern.`, extra);\n return { ok: true, summary: `Closed ${selection.targets.length} tab${selection.targets.length === 1 ? \"\" : \"s\"} matching the reviewed pattern.`, details: { closed: selection.targets.length, urls: selection.targets.map(tab => tab.url) } };\n }\n case \"pintab\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n await chrome.tabs.update(target, { pinned: options.pinned === true });\n await audit(\"tab\", `${options.pinned === true ? \"Pinned\" : \"Unpinned\"} tab ${target} by the reviewed flag.`, extra);\n return { ok: true, summary: `${options.pinned === true ? \"Pinned\" : \"Unpinned\"} tab ${target}.`, details: { tabid: target, pinned: options.pinned === true } };\n }\n case \"mutetab\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n await chrome.tabs.update(target, { muted: options.muted === true });\n await audit(\"tab\", `${options.muted === true ? \"Muted\" : \"Unmuted\"} tab ${target} by the reviewed flag.`, extra);\n return { ok: true, summary: `${options.muted === true ? \"Muted\" : \"Unmuted\"} tab ${target}.`, details: { tabid: target, muted: options.muted === true } };\n }\n case \"movetab\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n await chrome.tabs.move(target, { index: options.index as number });\n const groups = regroupaftermoves(await memory.gettabgroups(), await livetabs(), Date.now());\n for (const group of groups) await memory.settabgroup(group);\n await audit(\"tab\", `Moved tab ${target} to index ${options.index} inside its window; group membership is kept.`, extra);\n return { ok: true, summary: `Moved tab ${target} to index ${options.index}.`, details: { tabid: target, index: options.index } };\n }\n case \"movetabwindow\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n await chrome.tabs.move(target, { windowId: options.windowid as number, index: -1 });\n const groups = regroupaftermoves(await memory.gettabgroups(), await livetabs(), Date.now());\n for (const group of groups) await memory.settabgroup(group);\n await audit(\"tab\", `Moved tab ${target} across windows into window ${options.windowid}; group membership is kept.`, extra);\n return { ok: true, summary: `Moved tab ${target} into window ${options.windowid}.`, details: { tabid: target, windowid: options.windowid } };\n }\n case \"grouptabs\": {\n const group = options.group as { name?: unknown; color?: unknown; tabids?: unknown };\n const record: tabgrouprecord = { groupid: randomid(), name: String(group.name ?? \"\"), color: String(group.color ?? \"grey\"), tabids: Array.isArray(group.tabids) ? group.tabids.filter((item): item is number => typeof item === \"number\") : [], collapsed: false, savedat: Date.now() };\n await memory.settabgroup(record);\n await audit(\"group\", `Grouped ${record.tabids.length} tab${record.tabids.length === 1 ? \"\" : \"s\"} under the reviewed name ${record.name} with color ${record.color}; membership lives in the Devthink group registry.`, extra);\n return { ok: true, summary: `Grouped ${record.tabids.length} tab${record.tabids.length === 1 ? \"\" : \"s\"} under ${record.name}.`, details: { group: record } };\n }\n case \"colorgroup\": {\n const groups = await memory.gettabgroups();\n const target = groups.find(group => group.name === options.name);\n if (!target) throw new Error(`No tab group named ${options.name} is stored yet.`);\n const updated: tabgrouprecord = { ...target, color: String(options.color), savedat: Date.now() };\n await memory.settabgroup(updated);\n await audit(\"group\", `Set the color of tab group ${updated.name} to ${updated.color}.`, extra);\n return { ok: true, summary: `Set the color of group ${updated.name} to ${updated.color}.`, details: { group: updated } };\n }\n case \"collapsegroup\": {\n const groups = await memory.gettabgroups();\n const target = groups.find(group => group.name === options.name);\n if (!target) throw new Error(`No tab group named ${options.name} is stored yet.`);\n const updated: tabgrouprecord = { ...target, collapsed: options.collapsed === true, savedat: Date.now() };\n await memory.settabgroup(updated);\n await audit(\"group\", `${updated.collapsed ? \"Collapsed\" : \"Expanded\"} tab group ${updated.name}.`, extra);\n return { ok: true, summary: `${updated.collapsed ? \"Collapsed\" : \"Expanded\"} group ${updated.name}.`, details: { group: updated } };\n }\n case \"discardtab\": {\n const ids = commandtabids(step, options);\n if (ids.length === 0) throw new Error(\"A numeric tab id or a reviewed list of tab ids is required.\");\n const candidates = discardcandidates(await livetabs()).filter(tab => ids.includes(tab.tabid));\n const discarded: number[] = [];\n const urls: Array<{ tabid: number; url: string }> = [];\n for (const candidate of candidates) {\n const result = await chrome.tabs.discard(candidate.tabid).catch(() => undefined);\n if (result) { discarded.push(candidate.tabid); urls.push({ tabid: candidate.tabid, url: candidate.url }); }\n }\n await audit(\"discard\", `Discarded ${discarded.length} inactive tab${discarded.length === 1 ? \"\" : \"s\"} to save memory; the urls survive for on demand restore.`, extra);\n return { ok: discarded.length > 0, summary: `Discarded ${discarded.length} inactive tab${discarded.length === 1 ? \"\" : \"s\"}; their urls stay available for restore.`, details: { discarded, urls, refused: ids.filter(id => !discarded.includes(id)) } };\n }\n case \"reloadtabs\": {\n const ids = commandtabids(step, options);\n if (ids.length === 0) throw new Error(\"A numeric tab id or a reviewed list of tab ids is required.\");\n for (const id of ids) await chrome.tabs.reload(id).catch(() => undefined);\n await audit(\"tab\", `Reloaded ${ids.length} reviewed tab${ids.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Reloaded ${ids.length} tab${ids.length === 1 ? \"\" : \"s\"}.`, details: { tabs: ids } };\n }\n case \"zoomin\":\n case \"zoomout\": {\n const target = step.value && /^\\d+$/.test(step.value) ? Number.parseInt(step.value, 10) : sessiontabid;\n const current = await chrome.tabs.getZoom(target);\n const next = zoomstep(current, step.kind === \"zoomin\" ? \"in\" : \"out\", typeof options.step === \"number\" && options.step > 0 ? options.step : 0.1);\n await chrome.tabs.setZoom(target, next);\n await audit(\"tab\", `Zoomed tab ${target} ${step.kind === \"zoomin\" ? \"in\" : \"out\"} from ${current} to ${next} by the reviewed step.`, extra);\n return { ok: true, summary: `Zoomed tab ${target} ${step.kind === \"zoomin\" ? \"in\" : \"out\"} to ${next}.`, details: { tabid: target, from: current, to: next, step: typeof options.step === \"number\" ? options.step : 0.1 } };\n }\n case \"switchtab\": {\n const direction = options.direction === \"previous\" ? \"previous\" : \"next\";\n const focusedwindow = (await livewindows()).find(item => item.focused)?.windowid ?? 0;\n const windowtabs = (await livetabs()).filter(tab => tab.windowid === focusedwindow);\n const active = windowtabs.find(tab => tab.active);\n const target = switchtarget(windowtabs, direction, active?.index ?? 0);\n const totab = windowtabs.find(tab => tab.index === target);\n if (!totab) throw new Error(\"No neighbor tab is available to switch to.\");\n await chrome.tabs.update(totab.tabid, { active: true });\n await audit(\"tab\", `Switched to the ${direction} tab ${totab.tabid}.`, extra);\n return { ok: true, summary: `Switched to the ${direction} tab.`, details: { tabid: totab.tabid, direction } };\n }\n case \"maximizewindow\": {\n await chrome.windows.update(windowid, { state: \"maximized\" });\n await audit(\"window\", `Maximized window ${windowid}.`, extra);\n return { ok: true, summary: `Maximized window ${windowid}.`, details: { windowid, state: \"maximized\" } };\n }\n case \"minimizewindow\": {\n await chrome.windows.update(windowid, { state: \"minimized\" });\n await audit(\"window\", `Minimized window ${windowid}.`, extra);\n return { ok: true, summary: `Minimized window ${windowid}.`, details: { windowid, state: \"minimized\" } };\n }\n case \"restorewindow\": {\n const bounds = options.bounds as { left?: number; top?: number; width?: number; height?: number } | undefined;\n await chrome.windows.update(windowid, { state: \"normal\", ...(bounds && typeof bounds.left === \"number\" ? { left: bounds.left } : {}), ...(bounds && typeof bounds.top === \"number\" ? { top: bounds.top } : {}), ...(bounds && typeof bounds.width === \"number\" ? { width: bounds.width } : {}), ...(bounds && typeof bounds.height === \"number\" ? { height: bounds.height } : {}) });\n await audit(\"window\", `Restored window ${windowid} to its reviewed bounds.`, extra);\n return { ok: true, summary: `Restored window ${windowid} to its reviewed bounds.`, details: { windowid, bounds: bounds ?? null } };\n }\n case \"focuswindow\": {\n await chrome.windows.update(windowid, { focused: true });\n await audit(\"window\", `Focused window ${windowid}.`, extra);\n return { ok: true, summary: `Focused window ${windowid}.`, details: { windowid } };\n }\n case \"scratchwindow\": {\n const url = typeof step.value === \"string\" && step.value ? step.value : \"about:blank\";\n const created = await chrome.windows.create({ url });\n const window = created?.id ?? 0;\n await memory.setscratchwindows([...(await memory.getscratchwindows()), window]);\n await audit(\"window\", `Opened a scratch window ${window} for split work.`, extra);\n return { ok: true, summary: `Opened a scratch window for split work.`, details: { windowid: window, url } };\n }\n case \"incognitowindow\": {\n const created = await chrome.windows.create({ url: step.value ?? \"\", incognito: true });\n await audit(\"window\", `Opened an incognito window ${created?.id ?? 0} for ${step.value} on the explicit reviewed request; the window stays separated from the session grant inheritance.`, extra);\n return { ok: true, summary: `Opened an incognito window for ${step.value} on explicit request.`, details: { windowid: created?.id ?? 0, url: step.value, grantsinherited: windowprofilegrants(\"incognito\") } };\n }\n case \"restoretab\": {\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n let url = step.value && /^https:\\/\\//.test(step.value) ? step.value : undefined;\n if (!url) {\n const closed = (await memory.getclosedtabs()).find(entry => !open.includes(entry.url));\n if (!closed) throw new Error(\"No closed tab is available to restore from the session history.\");\n url = closed.url;\n }\n const created = await chrome.tabs.create({ url, active: true });\n await audit(\"tab\", `Restored the closed tab ${url} from the session history.`, extra);\n return { ok: true, summary: `Restored ${url} from the closed tab history.`, details: { url, tabid: created?.id ?? 0 } };\n }\n case \"savelayout\": {\n const name = typeof options.name === \"string\" ? options.name : \"\";\n const [tabs, windows, groups, scratch] = await Promise.all([livetabs(), livewindows(), memory.gettabgroups(), memory.getscratchwindows()]);\n const layout = buildlayout(name, tabs, windows, groups, scratch, Date.now());\n await memory.setlayout(layout);\n await audit(\"layout\", `Saved the tab layout ${name} with ${layout.tabs.length} tab${layout.tabs.length === 1 ? \"\" : \"s\"}, ${layout.groups.length} group${layout.groups.length === 1 ? \"\" : \"s\"} and ${layout.windows.length} window bound${layout.windows.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Saved the tab layout ${name}.`, details: { layout } };\n }\n case \"restorelayout\": {\n const name = typeof options.name === \"string\" ? options.name : \"\";\n const layout = await memory.getlayout(name);\n if (!layout) throw new Error(`No tab layout named ${name} is stored yet.`);\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n const urls = layoutrestoreplan(layout, open);\n const created: number[] = [];\n for (const url of urls) {\n const tab = await chrome.tabs.create({ url, active: created.length === 0 });\n created.push(tab?.id ?? 0);\n }\n await audit(\"layout\", `Restored the tab layout ${name}: ${created.length} tab${created.length === 1 ? \"\" : \"s\"} reopened, ${layout.tabs.length - created.length} already open.`, extra);\n return { ok: true, summary: `Restored the tab layout ${name}.`, details: { name, reopened: created.length, alreadyopen: layout.tabs.length - created.length, tabs: created } };\n }\n case \"findclones\": {\n const clones = clonetabs(await livetabs());\n await audit(\"tab\", `Detected ${clones.length} duplicate url group${clones.length === 1 ? \"\" : \"s\"} across the open tabs.`, extra);\n return { ok: true, summary: clones.length === 0 ? \"No duplicate tab was detected by normalized url comparison.\" : `Detected ${clones.length} duplicate url group${clones.length === 1 ? \"\" : \"s\"}.`, details: { clones } };\n }\n case \"searchtabs\": {\n const matches = searchtabmatches(await livetabs(), step.value ?? \"\");\n await audit(\"tab\", `Searched the open tabs and matched ${matches.length} tab${matches.length === 1 ? \"\" : \"s\"} for \"${step.value}\".`, extra);\n return { ok: true, summary: `Matched ${matches.length} open tab${matches.length === 1 ? \"\" : \"s\"} for \"${step.value}\".`, details: { matches } };\n }\n case \"badgetab\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n const badge: tabbadge = { tabid: target, taskid: typeof options.taskid === \"string\" && options.taskid ? options.taskid : plan.id, label: typeof options.label === \"string\" ? options.label : \"\", setat: Date.now() };\n await memory.setbadge(badge);\n await refreshbadge();\n await audit(\"badge\", `Set the task badge of tab ${target} to ${badge.label} for task ${badge.taskid}.`, extra);\n return { ok: true, summary: `Set the badge of tab ${target} to ${badge.label}.`, details: { badge } };\n }\n case \"attachmeta\": {\n const target = Number.parseInt(step.value ?? \"\", 10);\n const meta: tabmeta = {\n tabid: target,\n taskrefs: Array.isArray(options.taskrefs) ? options.taskrefs.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [],\n provenance: typeof options.provenance === \"string\" && options.provenance ? options.provenance : \"plan step\",\n labels: Array.isArray(options.labels) ? options.labels.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [],\n at: Date.now(),\n };\n await memory.settabmeta(meta);\n await memory.setprogress(assigntasktab(await memory.getprogress(), plan.id, target, Date.now()));\n await audit(\"tab\", `Attached metadata to tab ${target} with ${meta.labels.length} label${meta.labels.length === 1 ? \"\" : \"s\"} and ${meta.taskrefs.length} task ref${meta.taskrefs.length === 1 ? \"\" : \"s\"}; the tab joins the task progress.`, extra);\n return { ok: true, summary: `Attached metadata to tab ${target} for task routing.`, details: { meta } };\n }\n case \"listaudio\": {\n const playing = audiotabs(await livetabs());\n await audit(\"tab\", `Listed ${playing.length} tab${playing.length === 1 ? \"\" : \"s\"} that are playing audio.`, extra);\n return { ok: true, summary: `${playing.length} tab${playing.length === 1 ? \" is\" : \"s are\"} playing audio.`, details: { audio: playing } };\n }\n case \"reopenrun\": {\n const run = typeof options.run === \"string\" ? options.run : \"\";\n const snapshots = await memory.getsnapshots();\n const snapshot = snapshots.find(item => item.sessionid === run) ?? snapshots.find(item => item.id === run);\n if (!snapshot) throw new Error(`No stored session snapshot exists for the run ${run}.`);\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n const urls = layoutrestoreplan(snapshot.layout, open);\n const created: number[] = [];\n for (const url of urls) {\n const tab = await chrome.tabs.create({ url, active: created.length === 0 });\n created.push(tab?.id ?? 0);\n }\n await audit(\"layout\", `Reopened ${created.length} tab${created.length === 1 ? \"\" : \"s\"} of the previous run ${run}.`, extra);\n return { ok: true, summary: `Reopened ${created.length} tab${created.length === 1 ? \"\" : \"s\"} of the previous run.`, details: { run, reopened: created.length, tabs: created } };\n }\n case \"snapshotsession\": {\n const [tabs, windows, groups, scratch] = await Promise.all([livetabs(), livewindows(), memory.gettabgroups(), memory.getscratchwindows()]);\n const layout = buildlayout(`session ${new Date().toISOString()}`, tabs, windows, groups, scratch, Date.now());\n const snapshot: sessionsnapshot = { id: randomid(), ...(session ? { sessionid: session.id } : {}), layout, capturedat: Date.now() };\n await memory.addsnapshot(snapshot);\n await audit(\"layout\", `Captured the full session snapshot with ${layout.tabs.length} tab${layout.tabs.length === 1 ? \"\" : \"s\"} and ${layout.windows.length} window${layout.windows.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Captured the session snapshot of ${layout.tabs.length} tabs and ${layout.windows.length} windows.`, details: { snapshot } };\n }\n case \"watchtab\": {\n const lifetime = typeof options.lifetime === \"number\" && Number.isFinite(options.lifetime) && options.lifetime > 0 ? options.lifetime : 0;\n if (lifetime <= 0) throw new Error(\"A reviewed watch lifetime window in milliseconds is required in options.\");\n const events = Array.isArray(options.events) ? options.events.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const watchid = typeof options.watchid === \"string\" && options.watchid.trim() ? options.watchid : randomid();\n const watch: watchregistration = { watchid, kind: \"watchtab\", stepid: step.id, sessionid: session?.id ?? plan.id, origin: session?.origin ?? plan.origin, scopes: [], events, startedat: Date.now(), lifetime };\n await memory.addwatch(watch);\n await audit(\"watch\", `Watchtab registered under id ${watchid} for the reviewed lifetime of ${lifetime} milliseconds${events.length > 0 ? ` over events ${events.join(\", \")}` : \" over title, activation and closure events\"}.`, extra);\n await new Promise(resolve => setTimeout(resolve, lifetime));\n const observed = watchtabdispatch(tabwatchbuffers.get(watchid) ?? [], watchid, events);\n await memory.closewatch(watchid, Date.now());\n tabwatchbuffers.delete(watchid);\n await audit(\"watch\", `Watchtab ${watchid} closed after its reviewed lifetime of ${lifetime} milliseconds with ${observed.length} observed event${observed.length === 1 ? \"\" : \"s\"}.`, extra);\n return { ok: true, summary: `Observed ${observed.length} tab event${observed.length === 1 ? \"\" : \"s\"} inside the reviewed lifetime.`, details: { watchid, events: observed } };\n }\n default: return { ok: false, summary: \"Unsupported tabs and windows command.\" };\n }\n}\n\n/** Stores one reviewed form profile under its name behind the origin grants; password entries are refused by the form record grammar. */\nasync function executesaveprofiles(step: toolstep, session: agentsession | undefined, origin: string): Promise<stepoutput> {\n const options = stepoptions(step);\n const record = parseformrecord(options.formrecord);\n const name = typeof options.name === \"string\" ? options.name : \"\";\n if (!name || !record) throw new Error(\"A reviewed profile name and form record are required.\");\n const grants = session?.grants ?? (session ? [session.origin] : [origin]);\n const profile: formprofile = { name, fields: record.entries, grants, savedat: Date.now() };\n await memory.setprofile(profile);\n await audit(\"fill\", `Form profile ${name} stored locally with ${profile.fields.length} field entries behind the origin grants of ${grants.join(\", \")}; password entries are refused.`, { ...(session ? { sessionid: session.id } : {}) });\n return { ok: true, summary: `Stored the form profile ${name} locally with ${profile.fields.length} field entries.`, details: { profile: { name: profile.name, fields: profile.fields.length, grants: profile.grants } } };\n}\n\n/** Opens one asksubmit prompt through the sidepanel approval surface and records the submission ticket with the values hash. */\nasync function executeasksubmit(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const values = Array.isArray(output?.details?.values) ? output?.details?.values as Array<{ label: string; value: string }> : [];\n const ticket: submitticket = { id: randomid(), form: step.value ?? \"\", valueshash: valueshash(values), consentref: step.id, at: Date.now() };\n await memory.setticket(ticket);\n await audit(\"submit\", `Asksubmit prompt opened for form ${ticket.form || \"the reviewed form\"} with the values hash ${ticket.valueshash}; the submission waits for the user approval.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n await refreshbadge();\n return { ok: true, summary: `Asksubmit prompt opened for form ${ticket.form || \"the reviewed form\"}; the submission waits for your approval.`, details: { ticket, values } };\n}\n\n/** Submits one reviewed form through its owning form; the consent ref must match an approved asksubmit ticket. */\nasync function executesubmitform(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const consentref = typeof stepoptions(step).consentref === \"string\" ? stepoptions(step).consentref as string : \"\";\n const ticket = (await memory.gettickets()).find(item => item.approved === true && (item.consentref === consentref || item.id === consentref));\n if (!ticket) throw new Error(\"No approved asksubmit ticket matches the reviewed consent ref; approve the submission in the review panel first.\");\n const output = await dispatchpagestep(step, tabid, origin, plan) ?? { ok: false, summary: \"The form submission returned no result.\" };\n await audit(\"submit\", `Form ${ticket.form || \"the reviewed form\"} submitted through its owning form under ticket ${ticket.id} with values hash ${ticket.valueshash} and outcome ${output.ok ? \"delivered\" : \"refused\"}.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ...output, details: { ...(output.details ?? {}), ticket: { id: ticket.id, valueshash: ticket.valueshash, consentref: ticket.consentref } } };\n}\n\n/** Retries a failed submission with the reviewed backoff windows; every retry resubmits through the owning form. */\nasync function executeretryform(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const rule = parsebackoff(step);\n if (!rule) throw new Error(\"A reviewed backoff rule with wait and factor is required.\");\n const windows = backoffwaits(rule.attempts, rule.wait, rule.factor);\n let attempts = 0;\n let output: stepoutput | undefined;\n while (attempts < rule.attempts) {\n attempts += 1;\n output = await dispatchpagestep(step, tabid, origin, plan) ?? { ok: false, summary: \"The retried submission returned no result.\" };\n if (output.ok) break;\n const waitwindow = windows[attempts - 1];\n if (waitwindow !== undefined && attempts < rule.attempts) await new Promise(resolve => setTimeout(resolve, waitwindow));\n }\n await audit(\"retry\", `Form submission retried ${attempts} time${attempts === 1 ? \"\" : \"s\"} with the reviewed backoff windows ${windows.join(\", \") || \"none\"} milliseconds; outcome ${output?.ok ? \"delivered\" : \"refused\"}.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The retried submission returned no result.\", details: { attempts, windows, ok: Boolean(output?.ok) } };\n}\n\n/** Fills one password field after explicit consent; the reviewed consent ref is required and the password never appears in the audit trail. */\nasync function executeconsentpassword(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const consentref = typeof stepoptions(step).consentref === \"string\" ? stepoptions(step).consentref as string : \"\";\n const gate = passwordconsentgranted(step);\n if (!gate.allowed) throw new Error(gate.reason ?? \"A password fill requires a reviewed consent ref.\");\n const output = await dispatchpagestep(step, tabid, origin, plan);\n await audit(\"consent\", `Password field filled after the explicit consent ref ${consentref}; the value never appears in the audit trail.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return output ?? { ok: false, summary: \"The password fill returned no result.\" };\n}\n\n/** Attaches one generated artifact from the run store to a reviewed file input inside the form submission. */\nasync function executeattachfile(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const name = step.value ?? \"\";\n const artifacts = await memory.getartifacts();\n const artifact = artifacts.find(item => item.name === name || item.id === name);\n if (!artifact) throw new Error(`No generated artifact named ${name} exists in the run store yet.`);\n const derived: toolstep = { ...step, options: JSON.stringify({ ...stepoptions(step), artifact: artifact.id, artifactname: artifact.name }) };\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n await audit(\"fill\", `Artifact ${artifact.name} of kind ${artifact.kind} attached to the reviewed file input inside the form submission.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return { ...output ?? { ok: false, summary: \"The artifact attachment returned no result.\" }, details: { ...(output?.details ?? {}), artifact } };\n}\n\n/** Reads captcha presence, hands control back to the user and pauses the plan while the captcha handoff stays open. */\nasync function executecaptchahandoff(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const output = await dispatchpagestep(step, tabid, origin, plan) ?? { ok: false, summary: \"The captcha probe returned no result.\" };\n if (output.details?.captcha !== true) return { ok: true, summary: \"No captcha was detected; the plan continues.\", details: { captcha: false } };\n const handoff: captchahandoff = { id: randomid(), origin, resolved: false, openedat: Date.now() };\n await memory.addcaptcha(handoff);\n if (session && !session.pausedat && !session.stoppedat) await memory.setsession({ ...session, pausedat: Date.now() });\n await audit(\"handoff\", `Captcha detected on ${origin}; control handed back to the user and the plan pauses until the handoff ${handoff.id} resolves.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n await refreshbadge();\n return { ok: true, summary: \"Captcha detected; control is yours and the plan waits until you resolve the handoff.\", details: { captcha: true, handoff } };\n}\n\n/** Executes one reviewed forms and data kind: profile storage, submission tickets, retries, consent fills and artifact attachments stay in the background, page work dispatches through the bridge. */\nasync function executeformstep(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n switch (step.kind) {\n case \"saveprofiles\": return executesaveprofiles(step, session, origin);\n case \"asksubmit\": return executeasksubmit(step, session, plan, tabid, origin);\n case \"submitform\": return executesubmitform(step, session, plan, tabid, origin);\n case \"retryform\": return executeretryform(step, session, plan, tabid, origin);\n case \"consentpassword\": return executeconsentpassword(step, session, plan, tabid, origin);\n case \"attachfile\": return executeattachfile(step, session, plan, tabid, origin);\n case \"handoffcaptcha\": return executecaptchahandoff(step, session, plan, tabid, origin);\n case \"fillcode\": {\n const stored = await memory.getcodevalue();\n const source = typeof stepoptions(step).source === \"string\" ? stepoptions(step).source as string : \"\";\n const derived: toolstep = stored !== undefined && source === \"reviewed\" ? { ...step, value: stored } : step;\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n await audit(\"fill\", `One time code typed from the reviewed source ${source}${stored !== undefined ? \" through the consent gated code entry\" : \"\"}.`, { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id });\n return output ?? { ok: false, summary: \"The one time code fill returned no result.\" };\n }\n default: {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n if (step.kind === \"runwizard\" && output?.details?.wizard && typeof output.details.wizard === \"object\") {\n const state = output.details.wizard as wizardstate;\n await memory.addwizard(state);\n await memory.setprogress(recordwizardstep(await memory.getprogress(), plan.id, step.id, state, Date.now()));\n await audit(\"fill\", `Wizard advanced to step ${Math.min(state.index, state.steps)} of ${state.steps} with a completion share of ${Math.round(wizardcompletion(state) * 100)} percent.`, extra);\n }\n if (step.kind === \"picktypeahead\" && typeof output?.details?.pick === \"string\") {\n const pick: typeaheadpick = { field: step.target ?? \"\", query: step.value ?? \"\", pick: output.details.pick, at: Date.now() };\n await memory.addpick(pick);\n }\n if (step.kind === \"readerrors\" && Array.isArray(output?.details?.errors)) {\n const report: errorreport = { form: step.target ?? \"\", errors: output?.details?.errors as fielderror[], at: Date.now() };\n await memory.adderrorreport(report);\n await audit(\"fill\", `Collected ${report.errors.length} inline validation message${report.errors.length === 1 ? \"\" : \"s\"} for the correction loop.`, extra);\n }\n if ((step.kind === \"detectlogin\" || step.kind === \"detecttemplate\") && output?.ok) {\n const detected = step.kind === \"detectlogin\" ? output.details?.login === true : output.details?.template === \"signup\" || output.details?.template === \"checkout\";\n if (detected) {\n const kind = step.kind === \"detectlogin\" ? \"login\" : output.details?.template === \"checkout\" ? \"checkout\" : \"signup\";\n const markers = Array.isArray(output.details?.markers) ? output.details?.markers as string[] : [];\n const record: detectionrecord = { origin, kind, markers, at: Date.now() };\n await memory.adddetection(record);\n await audit(\"fill\", `${kind} shape detected on ${origin} with markers ${markers.join(\", \") || \"none\"}; sensitive work stays behind the consent gates.`, extra);\n }\n }\n if (step.kind === \"skiphoneypot\" && Array.isArray(output?.details?.skipped)) {\n await audit(\"fill\", `Honeypot survey flagged ${output.details.skipped.length} field${output.details.skipped.length === 1 ? \"\" : \"s\"} as skipped so fills never trip them.`, extra);\n }\n if (step.kind === \"fillform\" || step.kind === \"filllabel\" || step.kind === \"fillplaceholder\") {\n const filled = typeof output?.details?.filled === \"number\" ? output.details.filled : 0;\n const skipped = Array.isArray(output?.details?.skipped) ? output.details.skipped.length : 0;\n await audit(\"fill\", `Filled ${filled} reviewed field${filled === 1 ? \"\" : \"s\"}${skipped > 0 ? ` and skipped ${skipped} honeypot field${skipped === 1 ? \"\" : \"s\"}` : \"\"}.`, extra);\n }\n if (step.kind === \"generatevalues\") {\n const count = Array.isArray(output?.details?.values) ? output.details.values.length : 0;\n await audit(\"fill\", `Generated ${count} realistic value${count === 1 ? \"\" : \"s\"} with the reviewed seed and locale; real looking card numbers and personal identifiers are refused.`, extra);\n }\n return output ?? { ok: false, summary: \"The forms and data step returned no result.\" };\n }\n }\n}\n\n/** Loads one reviewed dataset by id, refusing when it has not been scraped or imported yet. */\nasync function loaddataset(datasetid: string): Promise<dataset> {\n const record = await memory.getdataset(datasetid);\n if (!record) throw new Error(`No dataset ${datasetid} exists yet; scrape or import it first.`);\n return record;\n}\n\n/** Reads the grid result of one dispatched page step, refusing when the page returned none. */\nfunction readgridoutput(output: stepoutput | undefined): gridresult | null {\n const grid = output?.details?.grid;\n if (!grid || typeof grid !== \"object\") return null;\n return grid as gridresult;\n}\n\n/** Writes one exported artifact into the task artifact store and records its provenance with the row range and checksum. */\nasync function storeexport(stepid: string, datasetvalue: dataset, format: \"csv\" | \"json\" | \"excel\", delimiter: string, session: agentsession | undefined, planid: string, origin: string): Promise<exportedartifact> {\n const content = exportcontent(datasetvalue, format, delimiter);\n const artifact = exportartifact(randomid(), datasetvalue, format, stepid, content, Date.now());\n await memory.addexport(artifact);\n await memory.addartifact(artifactrecordof(artifact));\n await memory.addprovenance(provenancefor(artifact, datasetvalue.sources[0]?.url ?? origin, stepid, Date.now()));\n await audit(\"export\", `Exported ${artifact.rowcount} row${artifact.rowcount === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} into the ${format} artifact ${artifact.name} with checksum ${artifact.checksum}; the provenance record keeps the source url, step ref and row range.`, { ...(session ? { sessionid: session.id } : {}), planid, stepid });\n await refreshbadge();\n return artifact;\n}\n\n/** Executes one reviewed forms and data part two kind: scraping, pagination, transforms, dedupe, merge, sampling, imports, loops, exports, streaming, resume and provenance stay in the background while page work dispatches through the bridge. */\nasync function executedatastep(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const options = stepoptions(step);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n switch (step.kind) {\n case \"scrapetable\": {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const grid = readgridoutput(output);\n if (!output?.ok || !grid) return output ?? { ok: false, summary: \"The table scrape returned no result.\" };\n const id = randomid();\n const name = typeof options.name === \"string\" && options.name ? options.name : `dataset-${step.id}`;\n const datasetvalue = builddataset(id, name, grid, Date.now());\n await memory.setdataset(datasetvalue);\n const extract = advancecursor(newextractsession(randomid(), id, name, step.target ?? \"\", \"\", 1, Date.now()), origin, datasetvalue.rows.length, Date.now(), true);\n await memory.setextractsession(extract);\n await memory.setprogress(recordextraction(await memory.getprogress(), plan.id, step.id, { page: 1, rows: datasetvalue.rows.length, cursor: 1 }, Date.now()));\n await refreshbadge();\n return { ok: true, summary: output.summary, details: { ...(output.details ?? {}), dataset: { id, name, rows: datasetvalue.rows.length, columns: grid.columns.length } } };\n }\n case \"paginateextract\": {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const grid = readgridoutput(output);\n if (!output?.ok || !grid) return output ?? { ok: false, summary: \"The paginated extraction returned no result.\" };\n const id = randomid();\n const name = typeof options.name === \"string\" && options.name ? options.name : `dataset-${step.id}`;\n const datasetvalue = builddataset(id, name, grid, Date.now());\n await memory.setdataset(datasetvalue);\n const planned = typeof options.pages === \"number\" && Number.isInteger(options.pages) && options.pages > 0 ? options.pages : Number(output.details?.pages ?? 1);\n const next = output.details?.next === true;\n const extract = advancecursor(newextractsession(randomid(), id, name, step.target ?? \"\", typeof options.next === \"string\" ? options.next : \"\", planned, Date.now()), origin, datasetvalue.rows.length, Date.now(), !next);\n await memory.setextractsession(extract);\n await memory.setprogress(recordextraction(await memory.getprogress(), plan.id, step.id, { page: extract.cursor, rows: datasetvalue.rows.length, cursor: extract.cursor }, Date.now()));\n await refreshbadge();\n const extractedpages = Number(output.details?.pages ?? 1);\n const estimated = Math.max(1, Math.round(datasetvalue.rows.length / Math.max(1, extractedpages) * planned));\n return { ok: true, summary: output.summary, details: { ...(output.details ?? {}), dataset: { id, name, rows: datasetvalue.rows.length, columns: grid.columns.length }, extractsession: { id: extract.id, cursor: extract.cursor, planned, done: extract.done === true }, progressshare: extractionshare(datasetvalue.rows.length, estimated) } };\n }\n case \"resumeextract\": {\n const sessionid = typeof options.session === \"string\" ? options.session : \"\";\n const extract = (await memory.getextractsessions()).find(item => item.id === sessionid);\n if (!extract) throw new Error(`No extract session ${sessionid} is stored yet.`);\n if (extract.done) return { ok: true, summary: `Extraction ${extract.name} already completed at cursor ${extract.cursor}.`, details: { cursor: extract.cursor, done: true } };\n const datasetvalue = await loaddataset(extract.datasetid);\n const remaining = remainingpages(extract, extract.planned);\n const derived: toolstep = { id: step.id, kind: \"paginateextract\", target: extract.target, summary: step.summary, risk: \"sensitive\", options: JSON.stringify({ next: extract.next, pages: remaining, cursor: extract.cursor, name: extract.name }) };\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n const grid = readgridoutput(output);\n if (!output?.ok || !grid) return output ?? { ok: false, summary: \"The resumed extraction returned no result.\" };\n const merged = mergedatasets([{ columns: datasetvalue.columns, rows: datasetvalue.rows }, { columns: grid.columns, rows: grid.rows }]);\n const updated: dataset = { ...datasetvalue, columns: merged.columns, rows: merged.rows, at: Date.now() };\n await memory.setdataset(updated);\n const next = output.details?.next === true;\n const resumed = advancecursor({ ...extract, updatedat: Date.now() }, origin, grid.rows.length, Date.now(), !next);\n await memory.setextractsession(resumed);\n await memory.setprogress(recordextraction(await memory.getprogress(), plan.id, step.id, { page: resumed.cursor, rows: grid.rows.length, cursor: resumed.cursor }, Date.now()));\n await audit(\"resume\", `Extraction ${extract.name} resumed from cursor ${extract.cursor} and collected ${grid.rows.length} further row${grid.rows.length === 1 ? \"\" : \"s\"} across ${Number(output.details?.pages ?? 1)} page${Number(output.details?.pages ?? 1) === 1 ? \"\" : \"s\"}; the dataset now holds ${updated.rows.length} rows.`, extra);\n return { ok: true, summary: `Resumed extraction ${extract.name} from cursor ${extract.cursor}; the dataset now holds ${updated.rows.length} rows.`, details: { dataset: { id: updated.id, rows: updated.rows.length }, extractsession: { id: resumed.id, cursor: resumed.cursor, planned: resumed.planned, done: resumed.done === true } } };\n }\n case \"mergepages\": {\n const ids = Array.isArray(options.datasets) ? options.datasets.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const records: dataset[] = [];\n for (const id of ids) records.push(await loaddataset(id));\n const merged = mergedatasets(records);\n const id = randomid();\n const datasetvalue: dataset = { id, name: typeof options.name === \"string\" && options.name ? options.name : `merged-${step.id}`, columns: merged.columns, rows: merged.rows, sources: records.flatMap(record => record.sources), at: Date.now() };\n await memory.setdataset(datasetvalue);\n await refreshbadge();\n return { ok: true, summary: `Merged ${records.length} dataset${records.length === 1 ? \"\" : \"s\"} into ${datasetvalue.name} with ${merged.columns.length} aligned column${merged.columns.length === 1 ? \"\" : \"s\"} and ${merged.rows.length} row${merged.rows.length === 1 ? \"\" : \"s\"}.`, details: { dataset: { id, name: datasetvalue.name, rows: merged.rows.length, columns: merged.columns.length }, merged: records.map(record => record.id) } };\n }\n case \"transformvalues\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const rules = (Array.isArray(options.rules) ? options.rules : []).filter((item): item is transformrule => Boolean(item) && typeof item === \"object\" && !Array.isArray(item));\n const applied = transformrows(datasetvalue.rows, rules);\n await memory.setdataset({ ...datasetvalue, rows: applied.rows, at: Date.now() });\n const existing = (await memory.gettaskrules()).find(item => item.taskid === plan.id);\n await memory.settaskrules(mergetaskrules(existing, plan.id, rules, [], Date.now()));\n if (applied.errors.length > 0) return { ok: false, summary: `Transform rules surfaced ${applied.errors.length} error${applied.errors.length === 1 ? \"\" : \"s\"}: ${applied.errors.join(\"; \")}.`, details: { errors: applied.errors, rules: rules.length } };\n return { ok: true, summary: `Applied ${rules.length} reviewed transform rule${rules.length === 1 ? \"\" : \"s\"} to ${applied.rows.length} row${applied.rows.length === 1 ? \"\" : \"s\"}.`, details: { rules: rules.length, rows: applied.rows.length } };\n }\n case \"deduperows\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const keys = Array.isArray(options.keys) ? options.keys.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const result = dedupebykeys(datasetvalue.rows, keys);\n await memory.setdataset({ ...datasetvalue, rows: result.kept, at: Date.now() });\n const existing = (await memory.gettaskrules()).find(item => item.taskid === plan.id);\n await memory.settaskrules(mergetaskrules(existing, plan.id, [], keys, Date.now()));\n return { ok: true, summary: `Deduplicated ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} by ${keys.join(\", \")}: removed ${result.removed} duplicate${result.removed === 1 ? \"\" : \"s\"}, kept ${result.kept.length}.`, details: { dedupe: { removed: result.removed, kept: result.kept.length, keys } } };\n }\n case \"stamplerows\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const url = typeof options.url === \"string\" && options.url ? options.url : origin;\n const stamped = samplerows(datasetvalue.rows, url, step.id, Date.now());\n await memory.setdataset({ ...datasetvalue, rows: stamped.rows, sources: stamped.sources, at: Date.now() });\n return { ok: true, summary: `Stamped ${stamped.rows.length} row${stamped.rows.length === 1 ? \"\" : \"s\"} with the source url, timestamp and step ref.`, details: { rows: stamped.rows.length, url } };\n }\n case \"previewgrid\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const sample = typeof options.sample === \"number\" && Number.isInteger(options.sample) && options.sample > 0 ? options.sample : 10;\n const preview = gridpreview(datasetvalue, sample);\n return { ok: true, summary: `Previewed ${preview.rows} row${preview.rows === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} in the grid with ${preview.columns.length} column${preview.columns.length === 1 ? \"\" : \"s\"}.`, details: { preview } };\n }\n case \"importcsv\": {\n const csv = typeof options.csv === \"string\" ? options.csv : \"\";\n const parsed = parsecsv(csv, typeof options.delimiter === \"string\" && options.delimiter.length === 1 ? options.delimiter : \",\");\n const mapping = options.mapping && typeof options.mapping === \"object\" && !Array.isArray(options.mapping) ? options.mapping as Record<string, string> : {};\n const columns = mapcolumns(parsed.headers, mapping);\n const rows = parsed.rows.map(line => {\n const row: datasetrow = {};\n columns.forEach((column, index) => { row[column.key] = line[index] ?? \"\"; });\n return row;\n });\n const id = randomid();\n const datasetvalue: dataset = { id, name: typeof options.name === \"string\" && options.name ? options.name : `import-${step.id}`, columns, rows, sources: [], at: Date.now() };\n await memory.addimport(datasetvalue);\n await refreshbadge();\n return { ok: true, summary: `Imported ${rows.length} row${rows.length === 1 ? \"\" : \"s\"} and ${columns.length} mapped column${columns.length === 1 ? \"\" : \"s\"} from the reviewed csv for fill loops.`, details: { dataset: { id, name: datasetvalue.name, rows: rows.length, columns: columns.length } } };\n }\n case \"looprows\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const inner = resolvedinnerstep(step, plan);\n if (!inner) throw new Error(\"A reviewed inner step or step id is required in options.\");\n const variable = typeof options.variable === \"string\" && options.variable ? options.variable : \"row\";\n let completed = 0;\n let failed = 0;\n for (const [index, row] of datasetvalue.rows.entries()) {\n const derived = loopstep(inner, row);\n const output = await dispatchpagestep(derived, tabid, origin, plan);\n if (output?.ok) completed += 1; else failed += 1;\n await memory.setprogress(recordoutcome(await memory.getprogress(), plan.id, { stepid: step.id, ok: Boolean(output?.ok), summary: `Iteration ${index + 1} of ${datasetvalue.rows.length}: ${output?.summary ?? \"no result\"}`, details: { iteration: index + 1, variable, variables: loopvariables(row) }, at: Date.now() }, Date.now()));\n }\n return { ok: failed === 0, summary: `Looped ${datasetvalue.rows.length} dataset row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} as ${variable} variables: ${completed} iteration${completed === 1 ? \"\" : \"s\"} completed${failed > 0 ? `, ${failed} failed` : \"\"}.`, details: { iterations: datasetvalue.rows.length, completed, failed, variable } };\n }\n case \"exportcsv\":\n case \"exportjson\":\n case \"exportexcel\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const format = step.kind === \"exportcsv\" ? \"csv\" : step.kind === \"exportjson\" ? \"json\" : \"excel\";\n const delimiter = typeof options.delimiter === \"string\" && options.delimiter.length === 1 ? options.delimiter : \",\";\n const artifact = await storeexport(step.id, { ...datasetvalue, ...(typeof options.name === \"string\" && options.name ? { name: options.name } : {}) }, format, delimiter, session, plan.id, origin);\n return { ok: true, summary: `Exported ${artifact.rowcount} row${artifact.rowcount === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} to ${artifact.name} with checksum ${artifact.checksum}.`, details: { artifact: { id: artifact.id, name: artifact.name, kind: artifact.kind, checksum: artifact.checksum, rowcount: artifact.rowcount } } };\n }\n case \"copytable\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const content = exportcontent(datasetvalue, \"csv\", typeof options.delimiter === \"string\" && options.delimiter.length === 1 ? options.delimiter : \",\");\n await navigator.clipboard.writeText(content);\n await audit(\"export\", `Copied ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} to the clipboard under the clipboardWrite capability.`, extra);\n return { ok: true, summary: `Copied ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} to the clipboard.`, details: { rows: datasetvalue.rows.length } };\n }\n case \"pushsheets\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const sheet = typeof options.sheet === \"string\" ? options.sheet : \"\";\n const config = (await memory.getsheetendpoints()).find(item => item.endpoint === sheet || item.origin === new URL(sheet).origin);\n if (!config) throw new Error(`The reviewed sheet endpoint has not been configured; configure ${sheet} from the review panel first.`);\n const granted = await chrome.permissions.contains({ origins: [hostpattern(config.origin)] } as chrome.permissions.Permissions);\n if (!granted) throw new Error(`The sheet endpoint origin ${config.origin} has not received optional permission.`);\n const payload = sheetpayload(datasetvalue, sheet);\n const response = await fetch(config.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify(payload) });\n await audit(\"export\", `Pushed ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} to the reviewed sheet endpoint ${config.origin} with response ${response.status}.`, extra);\n return { ok: response.ok, summary: response.ok ? `Pushed ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} to the reviewed sheet endpoint ${config.origin}.` : `The reviewed sheet endpoint answered ${response.status}; the push failed.`, details: { endpoint: config.endpoint, status: response.status, rows: datasetvalue.rows.length } };\n }\n case \"streamdisk\": {\n const datasetvalue = await loaddataset(typeof options.dataset === \"string\" ? options.dataset : \"\");\n const chunk = typeof options.chunk === \"number\" && Number.isInteger(options.chunk) && options.chunk > 0 ? options.chunk : datasetvalue.rows.length || 1;\n const planchunks = chunkplan(datasetvalue.rows.length, chunk);\n const previous = (await memory.getstreams()).find(item => item.datasetid === datasetvalue.id && item.done !== true);\n let state = previous && previous.chunks === planchunks.length ? previous : newstream(datasetvalue, planchunks.length, Date.now());\n let written = 0;\n let acknowledged = 0;\n for (const part of planchunks.slice(state.chunk)) {\n written += 1;\n if (backpressure(written, acknowledged)) await new Promise(resolve => setTimeout(resolve, 0));\n state = advancestream(state, part, Date.now(), part.to >= datasetvalue.rows.length);\n await memory.setstream(state);\n acknowledged += 1;\n }\n const artifact = await storeexport(step.id, datasetvalue, \"csv\", \",\", session, plan.id, origin);\n await audit(\"stream\", `Streamed ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} of dataset ${datasetvalue.name} to disk in ${planchunks.length} reviewed chunk${planchunks.length === 1 ? \"\" : \"s\"} of ${chunk} row${chunk === 1 ? \"\" : \"s\"} with backpressure; the stream state stays persisted for resume.`, extra);\n return { ok: true, summary: `Streamed ${datasetvalue.rows.length} row${datasetvalue.rows.length === 1 ? \"\" : \"s\"} to disk in ${planchunks.length} chunk${planchunks.length === 1 ? \"\" : \"s\"} and landed the artifact ${artifact.name}.`, details: { chunks: planchunks.length, chunk, rows: datasetvalue.rows.length, artifact: { id: artifact.id, name: artifact.name, checksum: artifact.checksum } } };\n }\n case \"logprovenance\": {\n const reference = typeof options.artifact === \"string\" ? options.artifact : \"\";\n const artifact = (await memory.getexports()).find(item => item.id === reference || item.name === reference);\n if (!artifact) throw new Error(`No exported artifact ${reference} exists yet.`);\n const record = provenancefor(artifact, origin, step.id, Date.now());\n await memory.addprovenance(record);\n await audit(\"provenance\", `Provenance of artifact ${artifact.name}: rows ${record.rowstart} to ${record.rowend}, checksum ${record.checksum}, source ${record.url}.`, extra);\n return { ok: true, summary: `Logged the provenance of ${artifact.name} for audit: rows ${record.rowstart} to ${record.rowend} with checksum ${record.checksum}.`, details: { provenance: record } };\n }\n default: return { ok: false, summary: \"Unsupported forms and data step.\" };\n }\n}\n\n/** Loads one batch download record by id, filename or url, refusing when it is not stored yet. */\nasync function loadownload(reference: string): Promise<downloadrecord | undefined> {\n const records = await memory.getdownloads();\n return records.find(item => item.id === reference || item.filename === reference || item.url === reference);\n}\n\n/** Waits until one browser download settles inside the internal evidence window, keeping unfinished downloads in the running state. */\nasync function settlesdownload(record: downloadrecord): Promise<{ state: downloadstate; evidence?: { path?: string; bytes?: number } }> {\n const started = Date.now();\n for (;;) {\n const items = record.downloadid === undefined ? [] : await chrome.downloads.search({ id: record.downloadid }).catch(() => []);\n const item = items[0];\n if (item?.state === \"complete\") return { state: \"complete\", evidence: { path: item.filename, bytes: item.fileSize ?? item.totalBytes ?? 0 } };\n if (item?.state === \"interrupted\") return { state: \"failed\" };\n if (Date.now() - started >= evidencesettle) return { state: \"running\" };\n await new Promise(resolve => setTimeout(resolve, evidencepoll));\n }\n}\n\n/** Pauses one running batch download through the downloads api and persists the paused record. */\nasync function pauseonerecord(record: downloadrecord, extra: Partial<auditevent>): Promise<stepoutput> {\n if (!transitionallowed(record.state, \"paused\")) throw new Error(`A ${record.state} download cannot pause.`);\n if (record.downloadid !== undefined) await chrome.downloads.pause(record.downloadid).catch(() => undefined);\n const paused = advancedownload(record, \"paused\", Date.now());\n await memory.setdownload(paused);\n await audit(\"download\", `Paused the download of ${record.filename} from ${record.url}.`, extra);\n return { ok: true, summary: `Paused the download of ${record.filename}.`, details: { download: paused } };\n}\n\n/** Resumes one paused batch download through the downloads api and persists the running record. */\nasync function resumeonerecord(record: downloadrecord, extra: Partial<auditevent>): Promise<stepoutput> {\n if (!transitionallowed(record.state, \"running\")) throw new Error(`A ${record.state} download cannot resume.`);\n if (record.downloadid !== undefined) await chrome.downloads.resume(record.downloadid).catch(() => undefined);\n const resumed = advancedownload(record, \"running\", Date.now());\n await memory.setdownload(resumed);\n await audit(\"download\", `Resumed the paused download of ${record.filename} from ${record.url}.`, extra);\n return { ok: true, summary: `Resumed the download of ${record.filename}.`, details: { download: resumed } };\n}\n\n/** Verifies one completed download against the reviewed size and checksum expectations. */\nasync function verifyonerecord(record: downloadrecord, expected: { bytes?: number; checksum?: string }, extra: Partial<auditevent>): Promise<stepoutput> {\n const verification = verifybytes(record, expected);\n await audit(\"observation\", `Verified the download of ${record.filename}: ${verification.summary}`, extra);\n return { ok: verification.ok, summary: verification.summary, details: { verification: { ...verification.matches, state: record.state, path: record.path, checksum: record.checksum, bytes: record.bytes } } };\n}\n\n/** Executes one reviewed files, clipboard and downloads kind: batch queues, verification, interception, netlog export, consented clipboard work, quarantine, scan hooks, capture naming and cleanup sweeps stay in the background while clipboard writes dispatch through the bridge. */\nasync function executefilesstep(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const options = stepoptions(step);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n switch (step.kind) {\n case \"batchdownload\": {\n const spec = options.downloadspec as downloadspec | undefined;\n const urls = Array.isArray(spec?.urls) ? (spec?.urls as unknown[]).filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const concurrent = typeof options.concurrent === \"number\" && Number.isInteger(options.concurrent) && options.concurrent > 0 ? options.concurrent : undefined;\n const taken = (await memory.getdownloads()).map(record => record.filename);\n const records: downloadrecord[] = urls.map(url => {\n const filename = conflictfree(downloadfilename(url, spec?.filename), taken);\n taken.push(filename);\n return { id: randomid(), url, filename, state: \"queued\" as const, at: Date.now(), updatedat: Date.now() };\n });\n let completed = 0;\n let failed = 0;\n let queued = 0;\n let index = 0;\n while (index < records.length) {\n const wave: downloadrecord[] = [];\n while (index < records.length && concurrentwindow(wave.length, concurrent)) {\n const record = records[index] as downloadrecord;\n index += 1;\n const downloadid = await chrome.downloads.download({ url: record.url, filename: record.filename }).catch(() => undefined);\n const started = downloadid === undefined ? advancedownload(record, \"failed\", Date.now()) : advancedownload(record, \"running\", Date.now(), { downloadid });\n await memory.setdownload(started);\n wave.push(started);\n }\n for (const started of wave) {\n if (started.state === \"failed\") { failed += 1; continue; }\n const settled = await settlesdownload(started);\n const final = advancedownload(started, settled.state, Date.now(), settled.evidence);\n await memory.setdownload(final);\n if (final.state === \"complete\") completed += 1; else if (final.state === \"failed\") failed += 1; else queued += 1;\n await memory.setprogress(recorddownload(await memory.getprogress(), plan.id, step.id, { index: records.indexOf(started), url: started.url, state: final.state }, Date.now()));\n }\n }\n await refreshbadge();\n await audit(\"download\", `Batch downloaded ${records.length} reviewed file${records.length === 1 ? \"\" : \"s\"}${concurrent !== undefined ? ` under the user configured concurrent window of ${concurrent}` : \"\"}: ${completed} completed, ${failed} failed${queued > 0 ? `, ${queued} still running` : \"\"}.`, extra);\n return { ok: failed === 0, summary: `Batch downloaded ${records.length} file${records.length === 1 ? \"\" : \"s\"}: ${completed} completed, ${failed} failed${queued > 0 ? `, ${queued} still running` : \"\"}.`, details: { downloads: records, completed, failed, running: queued, total: records.length, share: downloadshare(completed, records.length), concurrent } };\n }\n case \"pausedownload\": {\n const record = await loadownload(step.value ?? \"\");\n if (!record) throw new Error(`No stored download matches ${step.value ?? \"\"}.`);\n return pauseonerecord(record, extra);\n }\n case \"resumedownload\": {\n const record = await loadownload(step.value ?? \"\");\n if (!record) throw new Error(`No stored download matches ${step.value ?? \"\"}.`);\n return resumeonerecord(record, extra);\n }\n case \"verifydownload\": {\n const record = await loadownload(step.value ?? \"\");\n if (!record) throw new Error(`No stored download matches ${step.value ?? \"\"}.`);\n return verifyonerecord(record, { ...(typeof options.bytes === \"number\" ? { bytes: options.bytes } : {}), ...(typeof options.checksum === \"string\" ? { checksum: options.checksum } : {}) }, extra);\n }\n case \"interceptmime\": {\n const filter = options.mimefilter as mimefilter | undefined;\n if (!filter) throw new Error(\"A reviewed mimefilter is required in options.\");\n const filters = await memory.getmimefilters();\n await memory.setmimefilters([filter, ...filters]);\n armedmimefilter = filter;\n installmimelistener();\n await audit(\"intercept\", `Armed the reviewed mime interception filter: include ${filter.include.join(\", \")}, exclude ${filter.exclude.join(\", \") || \"none\"} and the ${filter.default} default for unlisted mime types; matching downloads reroute into quarantine.`, extra);\n return { ok: true, summary: `Armed the mime interception filter with the ${filter.default} default for unlisted mime types.`, details: { mimefilter: filter } };\n }\n case \"exportnetlog\": {\n const records = await memory.getnetlog();\n const stepfilter = typeof options.stepid === \"string\" && options.stepid ? options.stepid : undefined;\n const filtered = (stepfilter ? netlogforstep(records, stepfilter) : records).map(record => ({ ...record, headers: redactheaders(record.headers ?? {}) }));\n await audit(\"observation\", `Exported ${filtered.length} netlog record${filtered.length === 1 ? \"\" : \"s\"} of the run${stepfilter ? ` correlated with step ${stepfilter}` : \"\"} with every header value redacted.`, extra);\n return { ok: true, summary: `Exported ${filtered.length} netlog record${filtered.length === 1 ? \"\" : \"s\"} with header values redacted.`, details: { netlog: filtered, count: filtered.length, redacted: true, redaction: \"every header value is redacted from exported netlogs\" } };\n }\n case \"readclipboard\": {\n const consentref = typeof options.consentref === \"string\" ? options.consentref : \"\";\n const consents = await memory.getclipconsents();\n const consent = consents.find(item => item.id === consentref && item.approved === true && item.usedat === undefined);\n if (!consent) {\n const pending: clipboardconsentrecord = { id: consentref || randomid(), prompt: typeof options.prompt === \"string\" && options.prompt ? options.prompt : step.summary, origin, stepid: step.id, at: Date.now() };\n await memory.setclipconsent(pending);\n await refreshbadge();\n await audit(\"clipboard\", `Clipboard read consent prompt ${pending.id} opened for step ${step.id} on ${origin}; the read waits for the user approval and every read needs its own prompt.`, extra);\n return { ok: false, summary: `The clipboard read waits for your consent approval${consentref ? ` under ref ${consentref}` : \"\"}; approve it in the review panel and run the step again.`, details: { consent: { id: pending.id, prompt: pending.prompt, origin, stepid: step.id, approved: false } } };\n }\n const text = await navigator.clipboard.readText();\n const entry = clipentryof(\"read\", { hash: cliphash(text), length: text.length }, origin, step.id, Date.now());\n await memory.addclip(entry);\n await memory.setclipconsent({ ...consent, usedat: Date.now() });\n await refreshbadge();\n await audit(\"clipboard\", `Read ${entry.length} clipboard character${entry.length === 1 ? \"\" : \"s\"} on the approved consent ${consent.id} with payload hash ${entry.hash}; the payload text never appears in logs or memory.`, extra);\n return { ok: true, summary: `Read ${entry.length} clipboard character${entry.length === 1 ? \"\" : \"s\"} on the approved consent ${consent.id} with payload hash ${entry.hash}.`, details: { clip: entry, masked: maskclipboard(text) } };\n }\n case \"writeclipboard\": {\n const output = await dispatchpagestep(step, tabid, origin, plan);\n const hash = typeof output?.details?.hash === \"string\" ? output.details.hash : cliphash(step.value ?? \"\");\n const length = typeof output?.details?.length === \"number\" ? output.details.length : (step.value ?? \"\").length;\n const entry = clipentryof(\"write\", { hash, length }, origin, step.id, Date.now());\n await memory.addclip(entry);\n await audit(\"clipboard\", `Wrote ${length} reviewed character${length === 1 ? \"\" : \"s\"} to the clipboard with payload hash ${hash}; the payload text never appears in logs or memory.`, extra);\n return { ok: Boolean(output?.ok), summary: output?.summary ?? \"The clipboard write returned no result.\", details: { ...(output?.details ?? {}), clip: entry } };\n }\n case \"copyscreen\": {\n const windowid = chrome.windows.WINDOW_ID_CURRENT;\n const shot = await chrome.tabs.captureVisibleTab(windowid, { format: \"png\" });\n let destination = \"clipboard\";\n try {\n const blob = await (await fetch(shot)).blob();\n await navigator.clipboard.write([new ClipboardItem({ \"image/png\": blob })]);\n } catch { destination = \"clipboard unavailable\"; }\n const entry = clipentryof(\"screen\", { hash: cliphash(shot), length: shot.length }, origin, step.id, Date.now());\n await memory.addclip(entry);\n await audit(\"clipboard\", `Copied a screenshot of the visible tab (${entry.length} characters of png data) to the clipboard with payload hash ${entry.hash}; destination ${destination}.`, extra);\n return { ok: destination === \"clipboard\", summary: `Copied the visible tab screenshot with payload hash ${entry.hash} to the clipboard.`, details: { clip: entry, destination } };\n }\n case \"quarantinedownload\": {\n const record = await loadownload(step.value ?? \"\");\n if (!record) throw new Error(`No stored download matches ${step.value ?? \"\"}.`);\n const reason = typeof options.reason === \"string\" && options.reason ? options.reason : `moved from ${record.url} by the reviewed quarantine step`;\n const entry = newquarantine(randomid(), record.path ?? record.filename, reason, Date.now());\n await memory.setquarantine(entry);\n await refreshbadge();\n await audit(\"quarantine\", `Quarantined the download ${record.filename} outside the downloads folder at ${entry.path} with reason ${reason}; the file stays there until a clean scan verdict releases it.`, extra);\n return { ok: true, summary: `Quarantined ${record.filename} at ${entry.path} with a pending scan verdict.`, details: { quarantine: entry } };\n }\n case \"scanvirus\": {\n const reference = step.value ?? \"\";\n const entry = (await memory.getquarantines()).find(item => item.id === reference || item.path === reference);\n if (!entry) throw new Error(`No quarantined file matches ${reference}.`);\n const scanner = typeof options.scanner === \"string\" && options.scanner ? options.scanner : undefined;\n const hooks = await memory.getscanhooks();\n const hook = scanner ? hooks.find(item => item.scanner === scanner) : hooks[0];\n let verdict: scanverdict = \"pending\";\n if (hook) {\n const granted = await chrome.permissions.contains({ origins: [hostpattern(hook.origin)] } as chrome.permissions.Permissions).catch(() => false);\n if (granted) {\n try {\n const response = await fetch(hook.endpoint, { method: \"POST\", headers: { \"content-type\": \"application/json\" }, credentials: \"omit\", body: JSON.stringify({ quarantine: entry.id, path: entry.path, reason: entry.reason }) });\n verdict = scanverdictof(await response.json().catch(() => undefined));\n } catch { verdict = \"pending\"; }\n }\n }\n const scanned = scanresult(entry, verdict, Date.now());\n await memory.setquarantine(scanned);\n await refreshbadge();\n await audit(\"quarantine\", `Scan hook ${hook ? hook.scanner : scanner ?? \"none configured\"} ${hook ? `returned the ${verdict} verdict` : \"is not configured or granted; the verdict stays pending\"} for the quarantined file ${entry.path}; hook failures never release a file.`, extra);\n return { ok: true, summary: `Scan verdict ${verdict} recorded for ${entry.path}.`, details: { quarantine: scanned, verdict } };\n }\n case \"namecaptures\": {\n const task = typeof options.task === \"string\" && options.task ? options.task : plan.id;\n const steps = capturesteps(options, plan);\n const extension = typeof options.extension === \"string\" && options.extension ? options.extension : \"png\";\n const existing = (await memory.getcapturecounters()).find(item => item.taskid === task);\n const stamped = capturenames(existing?.counters ?? {}, task, steps, extension);\n await memory.setcapturecounter({ taskid: task, counters: stamped.counters, at: Date.now() });\n await audit(\"observation\", `Stamped ${stamped.names.length} consistent capture name${stamped.names.length === 1 ? \"\" : \"s\"} for task ${task} from task, step and sequence parts.`, extra);\n return { ok: true, summary: `Stamped ${stamped.names.length} capture name${stamped.names.length === 1 ? \"\" : \"s\"} for task ${task}.`, details: { task, names: stamped.names, counters: stamped.counters } };\n }\n case \"cleanupartifacts\": {\n const inlinrules = (Array.isArray(options.rules) ? options.rules : []).filter((item): item is cleanuprule => Boolean(item) && typeof item === \"object\" && !Array.isArray(item));\n const rules = inlinrules.length > 0 ? inlinrules : await memory.getcleanuprules();\n if (rules.length === 0) throw new Error(\"No reviewed cleanup rules are present; pass rules in options or store a rule set from the review panel.\");\n if (inlinrules.length > 0) await memory.setcleanuprules(inlinrules);\n const exportrecords = await memory.getexports();\n const artifacts = await memory.getartifacts();\n const inventory: artifactinventoryentry[] = [\n ...exportrecords.map(artifact => ({ id: artifact.id, kind: `export-${artifact.kind}`, name: artifact.name, size: artifact.content.length, at: artifact.at })),\n ...artifacts.map(artifact => ({ id: artifact.id, kind: artifact.kind, name: artifact.name, size: 0, at: artifact.at })),\n ];\n await memory.setinventory(inventory);\n const progress = await memory.getprogress();\n const keeprefs = referencedartifacts(plan, progress?.planid === plan.id ? progress.completedsteps : []);\n const sweep = sweepplan(inventory, rules, Date.now(), keeprefs);\n let removed = 0;\n for (const id of sweep.remove) {\n if (await memory.removeexport(id)) removed += 1;\n else if (await memory.removeartifact(id)) removed += 1;\n }\n const run: cleanuprun = { id: randomid(), rules: rules.length, removed, kept: sweep.keep.length, at: Date.now() };\n await memory.addcleanuprun(run);\n await refreshbadge();\n await audit(\"cleanup\", `Cleanup sweep applied ${rules.length} reviewed rule${rules.length === 1 ? \"\" : \"s\"} by age and kind: removed ${removed} artifact${removed === 1 ? \"\" : \"s\"}, kept ${sweep.keep.length}${keeprefs.length > 0 ? ` while holding every artifact referenced by open review cards` : \"\"}.`, extra);\n return { ok: true, summary: `Cleanup sweep removed ${removed} artifact${removed === 1 ? \"\" : \"s\"} and kept ${sweep.keep.length} under the reviewed rules.`, details: { run: { id: run.id, rules: run.rules, removed: run.removed, kept: run.kept }, remove: sweep.remove, inventory: inventory.length } };\n }\n default: return { ok: false, summary: \"Unsupported files, clipboard and downloads step.\" };\n }\n}\n\n/** Live mime interception filter cached for the synchronous filename determination listener. */\nlet armedmimefilter: mimefilter | undefined;\n/** Guards the one time installation of the download interception listener behind the optional downloads capability. */\nlet mimelistenerinstalled = false;\n\n/** Installs the download interception listener once, after the optional downloads capability exists. */\nfunction installmimelistener(): void {\n if (mimelistenerinstalled || typeof chrome.downloads?.onDeterminingFilename?.addListener !== \"function\") return;\n mimelistenerinstalled = true;\n chrome.downloads.onDeterminingFilename.addListener((item, suggest) => {\n const filter = armedmimefilter;\n if (!filter || item.byExtensionId === chrome.runtime.id) { suggest({ filename: item.filename, conflictAction: \"uniquify\" }); return; }\n const mime = item.mime ?? \"\";\n if (mimeallowed(filter, mime)) {\n suggest({ filename: `devthink-quarantine/${item.filename}`, conflictAction: \"uniquify\" });\n void memory.setquarantine(newquarantine(randomid(), item.filename, `mime ${mime || \"unknown\"} matched the reviewed include patterns`, Date.now())).then(() => audit(\"intercept\", `Intercepted the download of ${item.filename} (${mime || \"unknown mime\"}) into quarantine under the reviewed mime filter.`, {})).catch(() => undefined);\n return;\n }\n if (filter.default === \"deny\") {\n void chrome.downloads.cancel(item.id).catch(() => undefined);\n void audit(\"intercept\", `Denied the unlisted download of ${item.filename} (${mime || \"unknown mime\"}) under the deny default of the reviewed mime filter.`, {}).catch(() => undefined);\n }\n suggest({ filename: item.filename, conflictAction: \"uniquify\" });\n });\n}\n\ninstallmimelistener();\n\n/** Re-arms the reviewed mime interception filter after a service worker restart. */\nasync function reconcilmimefilter(): Promise<void> {\n const filters = await memory.getmimefilters();\n armedmimefilter = filters[0];\n installmimelistener();\n}\n\nreconcilmimefilter().catch(() => { /* a failing storage read leaves interception disarmed; the reviewed step re-arms it */ });\n\n/** Live stitch progress of running full page captures, refreshed per tile and exposed to the side panel context. */\nconst stitchprogress = new Map<string, { stepid: string; done: number; total: number }>();\n\n/** Reads the reviewed capture options of one capture step with the defaults applied. */\nfunction stepcaptureoptions(step: toolstep): captureoptions {\n return captureoptionsof(stepoptions(step).capture);\n}\n\n/** Converts one blob into a data url inside the service worker without a FileReader dependency. */\nasync function blobtodataurl(blob: Blob): Promise<string> {\n const buffer = new Uint8Array(await blob.arrayBuffer());\n let binary = \"\";\n const chunk = 0x8000;\n for (let index = 0; index < buffer.length; index += chunk) binary += String.fromCharCode(...buffer.subarray(index, index + chunk));\n return `data:${blob.type};base64,${btoa(binary)}`;\n}\n\n/** Captures the visible viewport of the active tab in the reviewed format and quality; the png shot is the raw seam for jpeg and webp re-encodes. */\nasync function tabshot(format: captureformat, quality: number | undefined): Promise<string> {\n const shot: { format: \"png\" | \"jpeg\"; quality?: number } = { format: format === \"jpeg\" ? \"jpeg\" : \"png\" };\n if (format === \"jpeg\" && quality !== undefined) shot.quality = Math.max(0, Math.min(100, Math.round(quality)));\n return chrome.tabs.captureVisibleTab(chrome.windows.WINDOW_ID_CURRENT, shot);\n}\n\n/** Calls one page bridge capture seam function inside the active tab after ensuring the bridge is present. */\nasync function bridgecall<T>(tabid: number, name: string, ...args: unknown[]): Promise<T> {\n await chrome.scripting.executeScript({ target: { tabId: tabid }, files: [\"pagebridge.js\"] });\n const result = await chrome.scripting.executeScript({ target: { tabId: tabid }, func: (bridgeName: string, bridgeArgs: unknown[]) => {\n const bridge = (globalThis as typeof globalThis & { devthinkbridge?: Record<string, (...fnargs: unknown[]) => unknown> }).devthinkbridge;\n if (!bridge) throw new Error(\"Devthink page bridge is unavailable.\");\n const seam = bridge[bridgeName];\n if (typeof seam !== \"function\") throw new Error(`The page bridge has no ${bridgeName} capture seam.`);\n return seam(...bridgeArgs);\n }, args: [name, args] });\n return result[0]?.result as T;\n}\n\n/** One decoded capture tile placed at its scroll offset with the first of column flag for seam blending. */\ninterface capturetile {\n bitmap: ImageBitmap;\n x: number;\n y: number;\n firstofcolumn: boolean;\n}\n\n/** Samples the top band of one tile into comparable pixel values so repeated fixed headers never stitch twice. */\nfunction tileband(bitmap: ImageBitmap, rows: number): number[] {\n if (rows <= 0 || bitmap.height <= 0) return [];\n const canvas = new OffscreenCanvas(bitmap.width, Math.min(rows, bitmap.height));\n const context = canvas.getContext(\"2d\");\n if (!context) return [];\n context.drawImage(bitmap, 0, 0);\n const data = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const band: number[] = [];\n const pixels = canvas.width * canvas.height;\n const stride = Math.max(1, Math.floor(pixels / 64));\n for (let pixel = 0; pixel < pixels; pixel += stride) {\n const index = pixel * 4;\n band.push((data[index] ?? 0) + (data[index + 1] ?? 0) * 256 + (data[index + 2] ?? 0) * 65536 + (data[index + 3] ?? 0) * 16777216);\n }\n return band;\n}\n\n/** Draws the reviewed annotations onto one capture: the step number marker, the target rect outline and the footer with capture time and page url. */\nfunction drawannotations(context: OffscreenCanvasRenderingContext2D, plan: annotationplan, width: number, height: number, ratio: number): void {\n context.save();\n context.scale(ratio, ratio);\n context.fillStyle = \"rgba(47,128,237,.92)\";\n context.beginPath();\n context.arc(plan.marker.x, plan.marker.y, 14, 0, Math.PI * 2);\n context.fill();\n context.fillStyle = \"#ffffff\";\n context.font = \"bold 14px sans-serif\";\n context.textBaseline = \"middle\";\n context.textAlign = \"center\";\n context.fillText(String(plan.marker.number), plan.marker.x, plan.marker.y);\n if (plan.outline !== undefined) {\n context.strokeStyle = \"#2f80ed\";\n context.lineWidth = 2;\n context.strokeRect(plan.outline.x, plan.outline.y, plan.outline.width, plan.outline.height);\n }\n const footery = Math.max(12, height - 22);\n context.fillStyle = \"rgba(23,32,44,.86)\";\n context.fillRect(0, footery, width, 22);\n context.fillStyle = \"#ffffff\";\n context.font = \"12px sans-serif\";\n context.textAlign = \"left\";\n context.fillText(plan.footer.slice(0, 160), 8, footery + 11);\n context.restore();\n}\n\n/** Encodes one composed canvas into the reviewed format and quality as a data url. */\nasync function canvasdataurl(canvas: OffscreenCanvas, format: captureformat, quality: number | undefined): Promise<string> {\n const type = format === \"jpeg\" ? \"image/jpeg\" : format === \"webp\" ? \"image/webp\" : \"image/png\";\n const encoded = format === \"png\" ? await canvas.convertToBlob({ type }) : await canvas.convertToBlob({ type, quality: Math.max(0, Math.min(1, (quality ?? 100) / 100)) });\n return blobtodataurl(encoded);\n}\n\n/** Composes capture tiles on an offscreencanvas inside the service worker: overlap rows blend with the linear seam weights and repeated fixed header bands never stitch twice. */\nasync function composestitched(tiles: capturetile[], width: number, height: number, overlap: number, ratio: number, options: { format: captureformat; quality?: number | undefined; annotate?: annotationplan | undefined }): Promise<string> {\n const canvas = new OffscreenCanvas(Math.max(1, Math.round(width * ratio)), Math.max(1, Math.round(height * ratio)));\n const context = canvas.getContext(\"2d\");\n if (!context) throw new Error(\"The stitcher could not create a canvas context.\");\n const weights = seamweights(overlap);\n const firstband = overlap > 0 && tiles[0] ? tileband(tiles[0].bitmap, overlap) : [];\n for (const tile of tiles) {\n const band = overlap > 0 ? tileband(tile.bitmap, overlap) : [];\n const repeated = overlap > 0 && !tile.firstofcolumn && fixedheadermatch(band, firstband);\n if (repeated) {\n const skipped = Math.min(overlap, tile.bitmap.height);\n context.drawImage(tile.bitmap, 0, skipped, tile.bitmap.width, tile.bitmap.height - skipped, tile.x, tile.y + skipped, tile.bitmap.width, tile.bitmap.height - skipped);\n continue;\n }\n if (weights.length > 0 && !tile.firstofcolumn) {\n for (let row = 0; row < weights.length && row < tile.bitmap.height; row += 1) {\n context.globalAlpha = weights[row] ?? 1;\n context.drawImage(tile.bitmap, 0, row, tile.bitmap.width, 1, tile.x, tile.y + row, tile.bitmap.width, 1);\n }\n context.globalAlpha = 1;\n const below = Math.min(overlap, tile.bitmap.height);\n context.drawImage(tile.bitmap, 0, below, tile.bitmap.width, tile.bitmap.height - below, tile.x, tile.y + below, tile.bitmap.width, tile.bitmap.height - below);\n continue;\n }\n context.drawImage(tile.bitmap, tile.x, tile.y);\n }\n if (options.annotate) drawannotations(context, options.annotate, width, height, ratio);\n return canvasdataurl(canvas, options.format, options.quality);\n}\n\n/** Decodes one shot data url into a placed tile bitmap. */\nasync function decodeTile(dataurl: string, x: number, y: number, firstofcolumn: boolean): Promise<capturetile> {\n const blob = await (await fetch(dataurl)).blob();\n return { bitmap: await createImageBitmap(blob), x, y, firstofcolumn };\n}\n\n/** Crops one reviewed rectangle out of a viewport shot, scaling to the reviewed pixel ratio and drawing the reviewed annotations. */\nasync function croptoRect(dataurl: string, rect: regionrect, ratio: number, options: { format: captureformat; quality?: number | undefined; annotate?: annotationplan | undefined }): Promise<string> {\n const blob = await (await fetch(dataurl)).blob();\n const bitmap = await createImageBitmap(blob);\n const canvas = new OffscreenCanvas(Math.max(1, Math.round(rect.width * ratio)), Math.max(1, Math.round(rect.height * ratio)));\n const context = canvas.getContext(\"2d\");\n if (!context) throw new Error(\"The crop could not create a canvas context.\");\n context.drawImage(bitmap, rect.x, rect.y, rect.width, rect.height, 0, 0, canvas.width, canvas.height);\n if (options.annotate) drawannotations(context, options.annotate, rect.width, rect.height, ratio);\n return canvasdataurl(canvas, options.format, options.quality);\n}\n\n/** Builds one capture canvas of explicit pixel geometry, used by the pixel ratio scaling and the contact sheet grid. */\nasync function encodecanvas(width: number, height: number, draw: (context: OffscreenCanvasRenderingContext2D) => Promise<void> | void, options: { format: captureformat; quality?: number | undefined; annotate?: annotationplan | undefined; annotateratio?: number | undefined }): Promise<string> {\n const canvas = new OffscreenCanvas(Math.max(1, Math.round(width)), Math.max(1, Math.round(height)));\n const context = canvas.getContext(\"2d\");\n if (!context) throw new Error(\"The capture canvas could not create a context.\");\n await draw(context);\n if (options.annotate) drawannotations(context, options.annotate, canvas.width / (options.annotateratio ?? 1), canvas.height / (options.annotateratio ?? 1), options.annotateratio ?? 1);\n return canvasdataurl(canvas, options.format, options.quality);\n}\n\n/** Stamps one unique capture filename inside a run through the per task sequence counter and the reviewed naming rule. */\nasync function capturenamefor(step: toolstep, plan: agentplan, kind: string, format: string): Promise<string> {\n const naming = stepoptions(step).naming;\n const rule: capturenaming = naming && typeof naming === \"object\" && !Array.isArray(naming) ? naming as capturenaming : { run: true, step: true, sequence: true, kind: true };\n const counters = (await memory.getcapturecounters()).find(item => item.taskid === plan.id);\n const advanced = advancecounter(counters?.counters ?? {}, step.id);\n await memory.setcapturecounter({ taskid: plan.id, counters: advanced.counters, at: Date.now() });\n return buildname(rule, { run: plan.id, step: step.id, sequence: advanced.sequence, kind }, format);\n}\n\n/** Routes one capture record to its reviewed export target: memory keeps the bytes, clipboard needs clipboardwrite and download runs through the reviewed download flow. */\nasync function routecapture(record: shotrecord, session: agentsession | undefined, plan: agentplan, step: toolstep, origin: string): Promise<{ target: captureexport; destination: string }> {\n const target = record.exporttarget ?? \"memory\";\n if (target === \"clipboard\") {\n const granted = await chrome.permissions.contains({ permissions: [\"clipboardWrite\"] } as chrome.permissions.Permissions).catch(() => false);\n if (!granted) throw new Error(\"The clipboard capture export needs the clipboardwrite capability; request it from the review panel.\");\n const blob = await (await fetch(record.bytes ?? \"\")).blob();\n await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })]);\n await memory.addclip(clipentryof(\"screen\", { hash: cliphash(record.bytes ?? \"\"), length: (record.bytes ?? \"\").length }, origin, step.id, Date.now()));\n void session;\n void plan;\n return { target, destination: \"clipboard\" };\n }\n if (target === \"download\") {\n const granted = await chrome.permissions.contains({ permissions: [\"downloads\"] } as chrome.permissions.Permissions).catch(() => false);\n if (!granted) throw new Error(\"The download capture export needs the downloads capability; request it from the review panel.\");\n await chrome.downloads.download({ url: record.bytes ?? \"\", filename: record.name ?? `capture.${record.format}` });\n return { target, destination: \"reviewed download flow\" };\n }\n return { target, destination: \"session memory\" };\n}\n\n/** Resolves the capture policy of the run from the user settings. */\nasync function runcapturepolicy(): Promise<capturepolicy> {\n return (await memory.getsettings())?.capturepolicy ?? \"manual\";\n}\n\n/** Grabs one state shot for beforeafter pairing, storing the record without export routing. */\nasync function grabstateshot(step: toolstep, session: agentsession, plan: agentplan, tabid: number, phase: \"before\" | \"after\"): Promise<shotrecord> {\n const options = stepcaptureoptions(step);\n const format = options.format ?? \"png\";\n const shot = await tabshot(format, options.quality);\n const measured = await bridgecall<{ viewportwidth: number; viewportheight: number }>(tabid, \"measurepage\");\n const record = capturevisible({ runid: plan.id, stepid: step.id, options: { ...options, annotate: options.annotate ?? true }, viewport: { width: measured.viewportwidth, height: measured.viewportheight }, dataurl: shot, at: Date.now(), id: randomid(), name: `${phase}-${await capturenamefor(step, plan, \"state\", format)}` });\n await memory.addcapture(record);\n return record;\n}\n\n/** Stores one finished capture record, routes its export target and records the progress evidence. */\nasync function storecapture(record: shotrecord, session: agentsession | undefined, plan: agentplan, step: toolstep, origin: string): Promise<{ record: shotrecord; routed: { target: captureexport; destination: string } }> {\n await memory.addcapture(record);\n const routed = await routecapture(record, session, plan, step, origin);\n await memory.setprogress(recordcapture(await memory.getprogress(), plan.id, step.id, record, Date.now()));\n await refreshbadge();\n return { record, routed };\n}\n\n/** Runs the media capture executors: viewport, stitched full page, element, region and contact sheet shots. */\nasync function executecapturestep(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const options = stepcaptureoptions(step);\n const format = options.format ?? \"png\";\n const ratio = options.pixelratio ?? 1;\n const runpolicy = await runcapturepolicy();\n const annotate = options.annotate ?? runpolicy === \"annotated\";\n const stepnumber = plan.steps.findIndex(candidate => candidate.id === step.id) + 1;\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n const pageurl = await chrome.tabs.get(tabid).then(tab => tab.url ?? origin).catch(() => origin);\n if (step.kind === \"shotview\") {\n const measured = await bridgecall<{ viewportwidth: number; viewportheight: number; pixelratio: number }>(tabid, \"measurepage\");\n const raw = await tabshot(format, options.quality);\n const marker = annotate ? annotationplanof({ step: Math.max(1, stepnumber), width: measured.viewportwidth, height: measured.viewportheight, url: pageurl, at: Date.now() }) : undefined;\n const dataurl = format === \"png\" && ratio === 1 && !marker ? raw : await encodecanvas(measured.viewportwidth * ratio, measured.viewportheight * ratio, async context => {\n const bitmap = await createImageBitmap(await (await fetch(raw)).blob());\n context.drawImage(bitmap, 0, 0, context.canvas.width, context.canvas.height);\n }, { format, quality: options.quality, annotate: marker, annotateratio: ratio });\n const record = capturevisible({ runid: plan.id, stepid: step.id, options: { ...options, ...(annotate ? { annotate: true } : {}) }, viewport: { width: measured.viewportwidth, height: measured.viewportheight }, dataurl, at: Date.now(), id: randomid(), name: await capturenamefor(step, plan, \"shotview\", format) });\n const stored = await storecapture(record, session, plan, step, origin);\n await audit(\"capture\", `Captured the visible viewport at ${record.width} by ${record.height} pixels in ${format} for step ${step.id}, routed to ${stored.routed.destination}.`, extra);\n return { ok: true, summary: `Captured the visible viewport at ${record.width} by ${record.height} pixels.`, details: { capture: { id: record.id, kind: record.kind, format: record.format, width: record.width, height: record.height, bytes: (record.bytes ?? \"\").length, exporttarget: stored.routed.target } } };\n }\n if (step.kind === \"shotfullpage\") {\n const rawoptions = stepoptions(step);\n const settle = typeof rawoptions.settle === \"number\" ? rawoptions.settle : 150;\n const overlap = typeof rawoptions.overlap === \"number\" ? rawoptions.overlap : 0;\n const wait = typeof rawoptions.wait === \"number\" ? rawoptions.wait : undefined;\n const state = await bridgecall<{ scrollx: number; scrolly: number }>(tabid, \"preparecapture\");\n try {\n const measured = await bridgecall<{ scrollwidth: number; scrollheight: number; viewportwidth: number; viewportheight: number }>(tabid, \"measurepage\");\n const stitch = buildstitchplan({ scrollwidth: measured.scrollwidth, scrollheight: measured.scrollheight, viewportwidth: measured.viewportwidth, viewportheight: measured.viewportheight, overlap });\n if (wait !== undefined) {\n const budget = stitchbudgetallowed(stitch.tiles.length, settle, wait);\n if (!budget.allowed) throw new Error(budget.reason ?? \"The stitching scroll budget exceeds the reviewed wait window.\");\n }\n const tiles: capturetile[] = [];\n let done = 0;\n for (let index = 0; index < stitch.tiles.length; index += 1) {\n const tile = stitch.tiles[index];\n if (!tile) continue;\n await bridgecall(tabid, \"scrollcapture\", tile.x, tile.y);\n await bridgecall(tabid, \"waitsettle\", settle);\n const shot = await tabshot(\"png\", undefined);\n tiles.push(await decodeTile(shot, tile.x, tile.y, index % stitch.rows === 0));\n done += 1;\n stitchprogress.set(step.id, { stepid: step.id, done, total: stitch.tiles.length });\n }\n const annotation = annotate ? annotationplanof({ step: Math.max(1, stepnumber), width: stitch.scrollwidth, height: stitch.scrollheight, url: pageurl, at: Date.now() }) : undefined;\n const dataurl = await composestitched(tiles, stitch.scrollwidth, stitch.scrollheight, overlap, ratio, { format, quality: options.quality, annotate: annotation });\n const record = capturestitched({ runid: plan.id, stepid: step.id, options: { ...options, ...(annotate ? { annotate: true } : {}) }, plan: stitch, dataurl, at: Date.now(), id: randomid(), name: await capturenamefor(step, plan, \"shotfullpage\", format) });\n const stored = await storecapture(record, session, plan, step, origin);\n await audit(\"capture\", `Captured the full page of ${stitch.scrollwidth} by ${stitch.scrollheight} css pixels from ${stitch.tiles.length} stitched tile${stitch.tiles.length === 1 ? \"\" : \"s\"} with ${overlap} overlap row${overlap === 1 ? \"\" : \"s\"}, routed to ${stored.routed.destination}.`, extra);\n return { ok: true, summary: `Captured the full page from ${stitch.tiles.length} stitched tiles.`, details: { capture: { id: record.id, kind: record.kind, format: record.format, width: record.width, height: record.height, bytes: (record.bytes ?? \"\").length, exporttarget: stored.routed.target }, tiles: stitch.tiles.length, columns: stitch.columns, rows: stitch.rows, overlap } };\n } finally {\n stitchprogress.delete(step.id);\n await bridgecall(tabid, \"restorecapture\", state).catch(() => undefined);\n }\n }\n if (step.kind === \"shotelement\") {\n const selector = step.target ?? \"\";\n const settle = typeof stepoptions(step).settle === \"number\" ? stepoptions(step).settle as number : 150;\n const measured = await bridgecall<{ viewportwidth: number; viewportheight: number }>(tabid, \"measurepage\");\n const targetinfo = await bridgecall<{ ok: boolean; rect?: regionrect; crossesviewport?: boolean; summary: string }>(tabid, \"elementrect\", selector);\n if (!targetinfo.ok || !targetinfo.rect) throw new Error(targetinfo.summary);\n const rect = targetinfo.rect;\n const crossing = targetinfo.crossesviewport === true;\n const state = await bridgecall<{ scrollx: number; scrolly: number }>(tabid, \"preparecapture\");\n try {\n let dataurl = \"\";\n if (!crossing) {\n const scrollto = Math.max(0, rect.y - Math.floor((measured.viewportheight - rect.height) / 2));\n await bridgecall(tabid, \"scrollcapture\", 0, scrollto);\n await bridgecall(tabid, \"waitsettle\", settle);\n const shot = await tabshot(\"png\", undefined);\n const crop = croprect({ x: rect.x, y: rect.y - scrollto, width: rect.width, height: rect.height }, { width: measured.viewportwidth, height: measured.viewportheight });\n const annotation = annotate ? annotationplanof({ step: Math.max(1, stepnumber), width: crop.width, height: crop.height, rect: { x: 0, y: 0, width: crop.width, height: crop.height }, url: pageurl, at: Date.now() }) : undefined;\n dataurl = await croptoRect(shot, crop, ratio, { format, quality: options.quality, annotate: annotation });\n } else {\n const tops = regionsteps(rect.height, measured.viewportheight);\n const slices: capturetile[] = [];\n for (let index = 0; index < tops.length; index += 1) {\n const top = tops[index] ?? 0;\n await bridgecall(tabid, \"scrollcapture\", 0, rect.y + top);\n await bridgecall(tabid, \"waitsettle\", settle);\n const shot = await tabshot(\"png\", undefined);\n const crop = croprect({ x: rect.x, y: 0, width: rect.width, height: Math.min(measured.viewportheight, rect.height - top) }, { width: measured.viewportwidth, height: measured.viewportheight });\n const slicedata = await croptoRect(shot, crop, 1, { format: \"png\" });\n slices.push(await decodeTile(slicedata, 0, top, index === 0));\n }\n const annotation = annotate ? annotationplanof({ step: Math.max(1, stepnumber), width: Math.min(rect.width, measured.viewportwidth), height: rect.height, rect: { x: 0, y: 0, width: Math.min(rect.width, measured.viewportwidth), height: rect.height }, url: pageurl, at: Date.now() }) : undefined;\n dataurl = await composestitched(slices, Math.min(rect.width, measured.viewportwidth), rect.height, 0, ratio, { format, quality: options.quality, annotate: annotation });\n }\n const record = captureelement({ runid: plan.id, stepid: step.id, options: { ...options, ...(annotate ? { annotate: true } : {}) }, rect, dataurl, at: Date.now(), id: randomid(), name: await capturenamefor(step, plan, \"shotelement\", format), target: selector });\n const stored = await storecapture(record, session, plan, step, origin);\n await audit(\"capture\", `Captured the element ${selector} at ${rect.width} by ${rect.height} css pixels${crossing ? \" through the tiled fallback\" : \"\"}, routed to ${stored.routed.destination}.`, extra);\n return { ok: true, summary: `Captured the element ${selector}.`, details: { capture: { id: record.id, kind: record.kind, format: record.format, width: record.width, height: record.height, bytes: (record.bytes ?? \"\").length, exporttarget: stored.routed.target }, rect, tiledfallback: crossing, target: selector } };\n } finally {\n await bridgecall(tabid, \"restorecapture\", state).catch(() => undefined);\n }\n }\n if (step.kind === \"shotregion\") {\n const rawoptions = stepoptions(step);\n const rect = rawoptions.regionrect as regionrect | undefined;\n if (!rect) throw new Error(\"A reviewed regionrect is required in options.\");\n const container = typeof rawoptions.container === \"string\" ? rawoptions.container : undefined;\n const measured = await bridgecall<{ viewportwidth: number; viewportheight: number }>(tabid, \"measurepage\");\n const state = await bridgecall<{ scrollx: number; scrolly: number }>(tabid, \"preparecapture\");\n try {\n let dataurl = \"\";\n let captured: regionrect = rect;\n if (container) {\n const info = await bridgecall<{ ok: boolean; height?: number; viewportheight?: number; summary: string }>(tabid, \"scrollcontainercapture\", container, 0);\n if (!info.ok || info.height === undefined || info.viewportheight === undefined) throw new Error(info.summary);\n const steps = regionsteps(info.height, info.viewportheight);\n const strips: capturetile[] = [];\n for (let index = 0; index < steps.length; index += 1) {\n await bridgecall(tabid, \"scrollcontainercapture\", container, steps[index] ?? 0);\n await bridgecall(tabid, \"waitsettle\", typeof rawoptions.settle === \"number\" ? rawoptions.settle as number : 150);\n const shot = await tabshot(\"png\", undefined);\n strips.push(await decodeTile(shot, 0, steps[index] ?? 0, index === 0));\n }\n const annotation = annotate ? annotationplanof({ step: Math.max(1, stepnumber), width: rect.width, height: info.height, rect, url: pageurl, at: Date.now() }) : undefined;\n dataurl = await composestitched(strips, rect.width, info.height, 0, ratio, { format, quality: options.quality, annotate: annotation });\n captured = { x: rect.x, y: rect.y, width: rect.width, height: info.height };\n } else {\n await bridgecall(tabid, \"scrollcapture\", 0, Math.max(0, rect.y - Math.floor((measured.viewportheight - rect.height) / 2)));\n await bridgecall(tabid, \"waitsettle\", typeof rawoptions.settle === \"number\" ? rawoptions.settle as number : 150);\n const shot = await tabshot(\"png\", undefined);\n const crop = croprect({ x: rect.x, y: rect.y - Math.max(0, rect.y - Math.floor((measured.viewportheight - rect.height) / 2)), width: rect.width, height: rect.height }, { width: measured.viewportwidth, height: measured.viewportheight });\n const annotation = annotate ? annotationplanof({ step: Math.max(1, stepnumber), width: crop.width, height: crop.height, rect: { x: 0, y: 0, width: crop.width, height: crop.height }, url: pageurl, at: Date.now() }) : undefined;\n dataurl = await croptoRect(shot, crop, ratio, { format, quality: options.quality, annotate: annotation });\n captured = crop;\n }\n const record = captureregion({ runid: plan.id, stepid: step.id, options: { ...options, ...(annotate ? { annotate: true } : {}) }, rect: captured, dataurl, at: Date.now(), id: randomid(), name: await capturenamefor(step, plan, \"shotregion\", format), ...(container ? { target: container } : {}) });\n const stored = await storecapture(record, session, plan, step, origin);\n await audit(\"capture\", `Captured the reviewed region at ${captured.width} by ${captured.height} css pixels${container ? ` of the scrollable container ${container}` : \"\"}, routed to ${stored.routed.destination}.`, extra);\n return { ok: true, summary: `Captured the reviewed region${container ? ` of container ${container}` : \"\"}.`, details: { capture: { id: record.id, kind: record.kind, format: record.format, width: record.width, height: record.height, bytes: (record.bytes ?? \"\").length, exporttarget: stored.routed.target }, rect: captured, ...(container ? { container } : {}) } };\n } finally {\n await bridgecall(tabid, \"restorecapture\", state).catch(() => undefined);\n }\n }\n if (step.kind === \"contactsheet\") {\n const rawoptions = stepoptions(step);\n const elements = (Array.isArray(rawoptions.elements) ? rawoptions.elements : []).filter((item): item is string => typeof item === \"string\" && item.trim().length > 0);\n const layout: sheetlayout = rawoptions.sheet && typeof rawoptions.sheet === \"object\" && !Array.isArray(rawoptions.sheet) ? rawoptions.sheet as sheetlayout : { cellsize: 240, columns: 3, label: \"both\" };\n const measured = await bridgecall<{ viewportwidth: number; viewportheight: number }>(tabid, \"measurepage\");\n const state = await bridgecall<{ scrollx: number; scrolly: number }>(tabid, \"preparecapture\");\n try {\n const cells: Array<{ selector: string; dataurl: string; width: number; height: number }> = [];\n for (const selector of elements) {\n const targetinfo = await bridgecall<{ ok: boolean; rect?: regionrect; summary: string }>(tabid, \"elementrect\", selector);\n if (!targetinfo.ok || !targetinfo.rect) throw new Error(targetinfo.summary);\n await bridgecall(tabid, \"scrollcapture\", 0, Math.max(0, targetinfo.rect.y - Math.floor((measured.viewportheight - targetinfo.rect.height) / 2)));\n await bridgecall(tabid, \"waitsettle\", typeof rawoptions.settle === \"number\" ? rawoptions.settle as number : 150);\n const shot = await tabshot(\"png\", undefined);\n const crop = croprect({ x: 0, y: targetinfo.rect.y - Math.max(0, targetinfo.rect.y - Math.floor((measured.viewportheight - targetinfo.rect.height) / 2)), width: targetinfo.rect.width, height: targetinfo.rect.height }, { width: measured.viewportwidth, height: measured.viewportheight });\n const celldata = await croptoRect(shot, crop, 1, { format: \"png\" });\n cells.push({ selector, dataurl: celldata, width: crop.width, height: crop.height });\n }\n const placed = buildsheet(cells.map(cell => ({ selector: cell.selector })), layout);\n const width = placed.columns * layout.cellsize;\n const rows = placed.rows;\n const height = rows * (layout.cellsize + 28);\n const annotation = annotate ? annotationplanof({ step: Math.max(1, stepnumber), width, height, url: pageurl, at: Date.now() }) : undefined;\n const dataurl = await encodecanvas(width * ratio, height * ratio, async context => {\n context.scale(ratio, ratio);\n for (let index = 0; index < cells.length; index += 1) {\n const cell = cells[index];\n const place = placed.cells[index];\n if (!cell || !place) continue;\n const bitmap = await createImageBitmap(await (await fetch(cell.dataurl)).blob());\n const scaled = Math.min(layout.cellsize / Math.max(1, bitmap.width), layout.cellsize / Math.max(1, bitmap.height));\n const drawwidth = Math.max(1, Math.round(bitmap.width * scaled));\n const drawheight = Math.max(1, Math.round(bitmap.height * scaled));\n context.drawImage(bitmap, place.column * layout.cellsize + Math.floor((layout.cellsize - drawwidth) / 2), place.row * (layout.cellsize + 28) + Math.floor((layout.cellsize - drawheight) / 2), drawwidth, drawheight);\n if (place.caption) {\n context.fillStyle = \"rgba(23,32,44,.86)\";\n context.fillRect(place.column * layout.cellsize, place.row * (layout.cellsize + 28) + layout.cellsize, layout.cellsize, 28);\n context.fillStyle = \"#ffffff\";\n context.font = \"12px sans-serif\";\n context.textAlign = \"left\";\n context.textBaseline = \"middle\";\n context.fillText(place.caption.slice(0, Math.floor(layout.cellsize / 7)), place.column * layout.cellsize + 6, place.row * (layout.cellsize + 28) + layout.cellsize + 14);\n }\n }\n }, { format, quality: options.quality, annotate: annotation, annotateratio: ratio });\n const record: shotrecord = { id: randomid(), runid: plan.id, stepid: step.id, kind: \"contactsheet\", format, width: Math.round(width * ratio), height: Math.round(height * ratio), capturedat: Date.now(), bytes: dataurl, name: await capturenamefor(step, plan, \"contactsheet\", format), ...(annotate ? { annotated: true } : {}), ...(options.exporttarget !== undefined ? { exporttarget: options.exporttarget } : {}) };\n const stored = await storecapture(record, session, plan, step, origin);\n await audit(\"capture\", `Tiled ${cells.length} element capture${cells.length === 1 ? \"\" : \"s\"} into one labeled ${placed.columns} column contact sheet, routed to ${stored.routed.destination}.`, extra);\n return { ok: true, summary: `Tiled ${cells.length} element captures into one contact sheet.`, details: { capture: { id: record.id, kind: record.kind, format: record.format, width: record.width, height: record.height, bytes: (record.bytes ?? \"\").length, exporttarget: stored.routed.target }, cells: placed.cells, columns: placed.columns, rows: placed.rows } };\n } finally {\n await bridgecall(tabid, \"restorecapture\", state).catch(() => undefined);\n }\n }\n throw new Error(\"Unsupported capture kind.\");\n}\n\n\n/** Active recordings of the run with their stop deadlines; run scoped recordings stop cleanly when the run completes. */\nconst activerecordings = new Map<string, { record: recordingrecord; tabid: number; stopat: number }>();\n\n/** Stops every active recording of one run cleanly and closes the recording state. */\nasync function stoprecordingsforrun(runid: string): Promise<void> {\n for (const [id, active] of [...activerecordings.entries()]) {\n if (active.record.runid !== runid) continue;\n const finished = finishrecording(active.record, Date.now());\n await memory.addmedia(finished);\n activerecordings.delete(id);\n await audit(\"media\", `Recording ${finished.id} of kind ${finished.kind} stopped cleanly at run end after ${finished.duration ?? 0} milliseconds.`, { planid: runid, stepid: finished.stepid });\n }\n}\n\n/** Stores one finished recording artifact through the reviewed download flow behind the optional downloads capability; the derived manifest carries the frame index and the honest derivation note. */\nasync function recordingwriter(record: recordingrecord, exporttarget: \"memory\" | \"download\"): Promise<{ written: boolean; file: string; bytes: number }> {\n const manifest = {\n id: record.id,\n runid: record.runid,\n stepid: record.stepid,\n kind: record.kind,\n scope: record.scope,\n fps: record.fps,\n bitrate: record.bitrate,\n startedat: record.startedat,\n endedat: record.endedat,\n duration: record.duration,\n derivation: \"tab screencast apis stay outside the reviewed manifest, so recordscreen derives an ordered frame sequence from viewport captures and captureaudio derives audio element evidence; no encoded video or audio bytes exist\",\n frames: (record.frames ?? []).map(id => ({ id })),\n };\n const file = `${(record.file ?? record.id).replace(/\\.[a-z0-9]+$/i, \"\")}.json`;\n const bytes = JSON.stringify(manifest).length;\n if (exporttarget === \"download\") {\n const granted = await chrome.permissions.contains({ permissions: [\"downloads\"] } as chrome.permissions.Permissions).catch(() => false);\n if (!granted) throw new Error(\"The recording download needs the downloads capability; request it from the review panel.\");\n await chrome.downloads.download({ url: `data:application/json;base64,${btoa(JSON.stringify(manifest))}`, filename: file });\n }\n return { written: exporttarget === \"download\", file, bytes };\n}\n\n/** Converts one stored capture to the reviewed target format with the reviewed quality and stores the derived record. */\nasync function convertonecapture(source: shotrecord, directive: { target: captureformat; quality?: number }, plan: agentplan, step: toolstep): Promise<shotrecord> {\n if (!source.bytes) throw new Error(`The capture bytes of ${source.id} expired from the retention window; conversions need live bytes.`);\n const blob = await (await fetch(source.bytes)).blob();\n const bitmap = await createImageBitmap(blob);\n const dataurl = await encodecanvas(bitmap.width, bitmap.height, context => { context.drawImage(bitmap, 0, 0); }, { format: directive.target, quality: directive.quality });\n const name = await capturenamefor(step, plan, \"convertimage\", directive.target);\n return { id: randomid(), runid: plan.id, stepid: step.id, kind: \"convertimage\", format: directive.target, width: bitmap.width, height: bitmap.height, capturedat: Date.now(), bytes: dataurl, name, target: source.id };\n}\n\n/** Thumbnails one stored capture with the reviewed size, fit and suffix and stores the derived record. */\nasync function thumbonecapture(source: shotrecord, directive: thumbdirective, plan: agentplan, step: toolstep): Promise<shotrecord> {\n if (!source.bytes) throw new Error(`The capture bytes of ${source.id} expired from the retention window; thumbnails need live bytes.`);\n const blob = await (await fetch(source.bytes)).blob();\n const bitmap = await createImageBitmap(blob);\n const geometry = thumbgeometry({ width: bitmap.width, height: bitmap.height }, directive);\n const format = source.format === \"jpeg\" || source.format === \"webp\" ? source.format : \"png\";\n const dataurl = await encodecanvas(geometry.width, geometry.height, context => { context.drawImage(bitmap, geometry.sx, geometry.sy, geometry.sw, geometry.sh, geometry.dx, geometry.dy, geometry.dw, geometry.dh); }, { format });\n const name = (await capturenamefor(step, plan, \"makethumbs\", format)).replace(/(\\.[a-z0-9]+)?$/, `-${directive.suffix}$1`);\n return { id: randomid(), runid: plan.id, stepid: step.id, kind: \"makethumbs\", format, width: geometry.width, height: geometry.height, capturedat: Date.now(), bytes: dataurl, name, target: source.id };\n}\n\n/** Runs the media capture part two executors: pdf reports, recordings, video frames, image batches, canvas reads, stream probes, media metadata, assets, lapses, conversions and thumbnails. */\nasync function executemediastep(step: toolstep, session: agentsession | undefined, plan: agentplan, tabid: number, origin: string): Promise<stepoutput> {\n const options = stepoptions(step);\n const extra = { ...(session ? { sessionid: session.id } : {}), planid: plan.id, stepid: step.id };\n const gate = mediagate(session, tabid, origin, Date.now());\n if (!gate.allowed) throw new Error(gate.reason ?? \"The media capture needs the active session tab grant.\");\n if (step.kind === \"capturepdf\") {\n const pdfoptions = pdfoptionsof(options.pdf);\n const paginate = pdfoptions.paginate === true;\n const measured = await bridgecall<{ scrollwidth: number; scrollheight: number; viewportwidth: number; viewportheight: number }>(tabid, \"measurepage\");\n const breakpoints = (Array.isArray(options.breakpoints) ? options.breakpoints : []).filter((item): item is string => typeof item === \"string\" && item.trim().length > 0);\n const resolvedbreaks = breakpoints.length > 0 ? (await bridgecall<Array<{ selector: string; top: number }>>(tabid, \"pdfbreaks\", breakpoints)).map(entry => entry.top) : [];\n const segments = paginate ? pdfsegments(measured.scrollheight, measured.viewportheight, resolvedbreaks) : [{ top: 0, height: measured.scrollheight }];\n const texts: string[] = [];\n for (const segment of segments) {\n const collected = await bridgecall<{ ok: boolean; text: string; summary: string }>(tabid, \"pdfsegment\", segment.top, segment.height);\n if (!collected.ok) throw new Error(collected.summary);\n texts.push(collected.text || \" \");\n }\n const composed = buildpdf(texts, pdfoptions);\n const dataurl = `data:application/pdf;base64,${btoa(composed.document)}`;\n const name = await capturenamefor(step, plan, \"capturepdf\", \"pdf\");\n const record: pdfrecord = { id: randomid(), runid: plan.id, stepid: step.id, pages: composed.pages, pagewidth: composed.pagewidth, pageheight: composed.pageheight, margins: pdfoptions.margins ?? { top: 0.4, right: 0.4, bottom: 0.4, left: 0.4 }, landscape: pdfoptions.landscape === true, scale: pdfoptions.scale ?? 1, bytes: composed.bytes, at: Date.now(), dataurl, name };\n await memory.addmedia(record);\n await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: record.id, kind: \"pdf\", scope: \"tab\", bytes: record.bytes }, Date.now()));\n const exporttarget = options.exporttarget === \"download\" ? \"download\" : \"memory\";\n if (exporttarget === \"download\") {\n const granted = await chrome.permissions.contains({ permissions: [\"downloads\"] } as chrome.permissions.Permissions).catch(() => false);\n if (!granted) throw new Error(\"The pdf download export needs the downloads capability; request it from the review panel.\");\n await chrome.downloads.download({ url: dataurl, filename: name });\n }\n await refreshbadge();\n await audit(\"media\", `Composed a derived pdf report of ${record.pages} page${record.pages === 1 ? \"\" : \"s\"} at ${record.pagewidth} by ${record.pageheight} points from ${segments.length} report segment${segments.length === 1 ? \"\" : \"s\"}, routed to ${exporttarget === \"download\" ? \"the reviewed download flow\" : \"session memory\"}.`, extra);\n return { ok: true, summary: `Composed a derived pdf report of ${record.pages} page${record.pages === 1 ? \"\" : \"s\"}.`, details: { media: { id: record.id, kind: \"pdf\", bytes: record.bytes }, pages: record.pages, pagewidth: record.pagewidth, pageheight: record.pageheight, landscape: record.landscape, scale: record.scale, segments: segments.length, exporttarget, derivation: \"the pdf is a text layer composed from the page segments because browser print apis stay outside the reviewed manifest\" } };\n }\n if (step.kind === \"recordscreen\" || step.kind === \"captureaudio\") {\n const recordingoptions = recordingoptionsof(options.recording);\n const consentref = typeof options.consentref === \"string\" ? options.consentref : \"\";\n const consents = await memory.getrecordingconsents();\n const consent = consents.find(item => item.id === consentref && item.approved === true && item.usedat === undefined);\n if (!consent) {\n const pending: recordingconsentrecord = { id: consentref || randomid(), prompt: typeof options.prompt === \"string\" && options.prompt ? options.prompt : step.summary, origin, stepid: step.id, at: Date.now() };\n await memory.setrecordingconsent(pending);\n await refreshbadge();\n await audit(\"media\", `Recording consent prompt ${pending.id} opened for step ${step.id} on ${origin}; the recording waits for the user approval and every start needs its own prompt.`, extra);\n return { ok: false, summary: `The ${step.kind} waits for your recording consent approval${consentref ? ` under ref ${consentref}` : \"\"}; approve it in the review panel and run the step again.`, details: { consent: { id: pending.id, prompt: pending.prompt, origin, stepid: step.id, approved: false } } };\n }\n await memory.setrecordingconsent({ ...consent, usedat: Date.now() });\n const duration = typeof options.duration === \"number\" ? options.duration : recordingwindow(await memory.getsettings());\n if (duration === undefined) throw new Error(\"The recording needs a reviewed duration window in options or the user configured recording window before it starts.\");\n const kind = step.kind === \"recordscreen\" ? \"screen\" : \"audio\";\n const recordoptions: recordingoptions = { ...recordingoptions };\n if (kind === \"audio\" && recordoptions.audio === undefined) recordoptions.audio = true;\n const record = newrecording({ id: randomid(), runid: plan.id, stepid: step.id, tabid, kind, options: recordoptions, at: Date.now() });\n activerecordings.set(record.id, { record, tabid, stopat: Date.now() + duration });\n const interval = frameinterval(recordingoptions.fps ?? 1);\n const frames: string[] = [];\n let missed = 0;\n const deadline = Date.now() + duration;\n try {\n while (Date.now() < deadline && activerecordings.has(record.id) && Date.now() < (activerecordings.get(record.id)?.stopat ?? deadline)) {\n if (kind === \"screen\") {\n try {\n const shot = await tabshot(\"png\", undefined);\n const measured = await bridgecall<{ viewportwidth: number; viewportheight: number }>(tabid, \"measurepage\");\n const frame: shotrecord = { id: randomid(), runid: plan.id, stepid: step.id, kind: \"recordscreen\", format: \"png\", width: measured.viewportwidth, height: measured.viewportheight, capturedat: Date.now(), bytes: shot, name: await capturenamefor(step, plan, \"recordscreen\", \"png\") };\n await memory.addcapture(frame);\n frames.push(frame.id);\n } catch { missed += 1; }\n } else {\n const elementstate = await bridgecall<Array<Record<string, unknown>>>(tabid, \"mediaelements\").catch(() => []);\n frames.push(`${Date.now()}:${elementstate.length}`);\n }\n await new Promise(resolve => setTimeout(resolve, interval));\n }\n const finished = finishrecording({ ...record, frames }, Date.now());\n const written = await recordingwriter(finished, options.exporttarget === \"download\" ? \"download\" : \"memory\");\n const stored: recordingrecord = { ...finished, file: written.file, bytes: written.bytes };\n await memory.addmedia(stored);\n await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: stored.id, kind: stored.kind === \"screen\" ? \"recording\" : \"audio\", scope: stored.scope, bytes: stored.bytes ?? 0 }, Date.now()));\n await refreshbadge();\n await audit(\"media\", `Recorded ${stored.duration ?? 0} milliseconds of ${stored.kind} activity of ${stored.scope} scope with ${frames.length - missed} frame${frames.length - missed === 1 ? \"\" : \"s\"}${missed > 0 ? ` and ${missed} missed capture${missed === 1 ? \"\" : \"s\"}` : \"\"} at ${stored.fps ?? 1} fps, stored as derived evidence with ${stored.bytes ?? 0} manifest bytes.`, extra);\n return { ok: true, summary: `Recorded ${stored.duration ?? 0} milliseconds of ${stored.kind} activity with ${frames.length - missed} frames.`, details: { media: { id: stored.id, kind: stored.kind === \"screen\" ? \"recording\" : \"audio\", bytes: stored.bytes ?? 0 }, recording: { id: stored.id, duration: stored.duration, scope: stored.scope, fps: stored.fps }, frames: frames.length, missed, derivation: \"tab screencast stays outside the reviewed manifest, so the recording derives an ordered frame sequence and an honest manifest instead of encoded media bytes\" } };\n } finally {\n activerecordings.delete(record.id);\n }\n }\n if (step.kind === \"captureframe\") {\n const timestamp = typeof options.timestamp === \"number\" ? options.timestamp : undefined;\n const poster = options.poster === true;\n const grabbed = await bridgecall<{ ok: boolean; dataurl?: string; width?: number; height?: number; summary: string }>(tabid, \"videoframe\", step.target ?? \"\", timestamp, poster);\n if (!grabbed.ok || !grabbed.dataurl) throw new Error(grabbed.summary);\n const capture = captureoptionsof(options.capture);\n const format = capture.format ?? \"png\";\n const record: framerecord = { id: randomid(), runid: plan.id, stepid: step.id, source: step.target ?? \"\", timestamp: timestamp ?? 0, poster, format, width: grabbed.width ?? 0, height: grabbed.height ?? 0, at: Date.now(), dataurl: grabbed.dataurl, name: await capturenamefor(step, plan, \"captureframe\", format) };\n await memory.addmedia(record);\n await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: record.id, kind: \"frame\", scope: step.target ?? \"\", bytes: (record.dataurl ?? \"\").length }, Date.now()));\n await refreshbadge();\n await audit(\"media\", `Grabbed a video frame of ${record.width} by ${record.height} pixels at ${record.timestamp} seconds from ${step.target ?? \"the video element\"}${poster ? \" as the poster frame\" : \"\"}.`, extra);\n return { ok: true, summary: `Grabbed the video frame at ${record.timestamp} seconds.`, details: { media: { id: record.id, kind: \"frame\", bytes: (record.dataurl ?? \"\").length }, source: record.source, timestamp: record.timestamp, poster, width: record.width, height: record.height } };\n }\n if (step.kind === \"downloadimages\") {\n const filter = imagefilterof(options.imagefilter);\n const observed = await bridgecall<Array<Record<string, unknown>>>(tabid, \"pageimages\", filter.selector);\n const descriptors = observed.map(entry => ({ url: typeof entry.url === \"string\" ? entry.url : \"\", alt: typeof entry.alt === \"string\" ? entry.alt : \"\", width: typeof entry.width === \"number\" ? entry.width : 0, height: typeof entry.height === \"number\" ? entry.height : 0, bytes: typeof entry.bytes === \"number\" ? entry.bytes : 0, mime: typeof entry.mime === \"string\" ? entry.mime : \"\" })) as imagedescriptor[];\n const matched = descriptors.filter(image => imagematches(image, filter));\n const unique = dedupeimages(matched);\n const naming = options.naming && typeof options.naming === \"object\" && !Array.isArray(options.naming) ? options.naming as capturenaming : { run: true, step: true, sequence: true, kind: true };\n const names = imagenames(naming, plan.id, step.id, unique.length, \"png\");\n let downloaded = 0;\n for (let index = 0; index < unique.length; index += 1) {\n const image = unique[index];\n if (!image) continue;\n const rawextension = image.url.split(\"?\")[0]?.split(\".\").pop()?.toLowerCase() ?? \"\";\n const extension = /^[a-z0-9]{2,5}$/.test(rawextension) ? rawextension : \"png\";\n const name = `${(names[index] ?? `image-${index + 1}`).replace(/\\.[a-z0-9]+$/i, \"\")}.${extension}`;\n const downloadid = await chrome.downloads.download({ url: image.url, filename: name }).catch(() => undefined);\n if (downloadid !== undefined) downloaded += 1;\n }\n const batch: imagebatch = { id: randomid(), runid: plan.id, stepid: step.id, images: descriptors, matched: matched.length, downloaded, at: Date.now() };\n await memory.addimagebatch(batch);\n await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: batch.id, kind: \"images\", scope: filter.selector ?? \"page\", bytes: descriptors.reduce((total, image) => total + image.bytes, 0) }, Date.now()));\n await refreshbadge();\n await audit(\"media\", `Detected ${descriptors.length} image${descriptors.length === 1 ? \"\" : \"s\"} on the page, matched ${matched.length} against the reviewed filter, deduplicated to ${unique.length} urls and downloaded ${downloaded} through the reviewed download flow.`, extra);\n return { ok: true, summary: `Downloaded ${downloaded} of ${unique.length} deduplicated matching images.`, details: { media: { id: batch.id, kind: \"images\", bytes: descriptors.reduce((total, image) => total + image.bytes, 0) }, observed: descriptors.length, matched: matched.length, unique: unique.length, downloaded, filter } };\n }\n if (step.kind === \"shotcanvas\") {\n const read = await bridgecall<{ ok: boolean; context: \"2d\" | \"webgl\"; dataurl?: string; width?: number; height?: number; preserved?: boolean; summary: string }>(tabid, \"canvasdata\", step.target ?? \"\");\n if (!read.ok || !read.dataurl) throw new Error(read.summary);\n const capture = captureoptionsof(options.capture);\n const format = capture.format ?? \"png\";\n const record: canvasrecord = { id: randomid(), runid: plan.id, stepid: step.id, element: step.target ?? \"\", context: read.context, width: read.width ?? 0, height: read.height ?? 0, format, at: Date.now(), dataurl: read.dataurl, name: await capturenamefor(step, plan, \"shotcanvas\", format) };\n await memory.addmedia(record);\n await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: record.id, kind: \"canvas\", scope: record.element, bytes: (record.dataurl ?? \"\").length }, Date.now()));\n await refreshbadge();\n await audit(\"media\", `Read the ${record.context} canvas buffer of ${step.target ?? \"the canvas\"} at ${record.width} by ${record.height} pixels${read.preserved === true ? \" through a preserved readPixels pass\" : \"\"}.`, extra);\n return { ok: true, summary: `Captured the ${record.context} canvas content.`, details: { media: { id: record.id, kind: \"canvas\", bytes: (record.dataurl ?? \"\").length }, context: record.context, preserved: read.preserved === true, element: record.element, width: record.width, height: record.height } };\n }\n if (step.kind === \"probestream\") {\n const selector = typeof options.selector === \"string\" && options.selector ? options.selector : undefined;\n const raw = await bridgecall<Array<Record<string, unknown>>>(tabid, \"streamelements\", selector);\n const summaries = streamsummaries(raw);\n const records: streamrecord[] = summaries.map(summary => ({ id: randomid(), runid: plan.id, stepid: step.id, kind: summary.kind, tracks: summary.tracks, label: summary.label, live: summary.live, at: Date.now(), ...(summary.detail !== undefined ? { detail: summary.detail } : {}) }));\n for (const record of records) await memory.addmedia(record);\n if (records.length > 0) await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: records[0]?.id ?? \"\", kind: \"stream\", scope: selector ?? \"page\", bytes: 0 }, Date.now()));\n await refreshbadge();\n await audit(\"media\", `Probed ${records.length} media stream${records.length === 1 ? \"\" : \"s\"} of the page with ${records.reduce((total, record) => total + record.tracks, 0)} tracks; peer connection statistics stay outside the isolated world bridge.`, extra);\n return { ok: true, summary: `Probed ${records.length} media stream${records.length === 1 ? \"\" : \"s\"} with track details.`, details: { media: { id: records[0]?.id ?? \"\", kind: \"stream\", bytes: 0 }, streams: records, note: \"peer connection statistics such as round trip time and frame drops need main world access that stays outside the reviewed bridge\" } };\n }\n if (step.kind === \"readmedia\") {\n const raw = await bridgecall<Array<Record<string, unknown>>>(tabid, \"mediaelements\");\n const media = mediaentries(raw);\n await audit(\"media\", `Read ${media.length} embedded media source${media.length === 1 ? \"\" : \"s\"} with formats, durations, dimensions, codecs and track lists.`, extra);\n return { ok: true, summary: `Read ${media.length} embedded media source${media.length === 1 ? \"\" : \"s\"}.`, details: { media: { id: step.id, kind: \"media\", bytes: 0 }, sources: media } };\n }\n if (step.kind === \"readassets\") {\n const raw = await bridgecall<Array<Record<string, unknown>>>(tabid, \"pageassets\");\n const entries = assetentries(raw);\n const records: assetrecord[] = entries.map(entry => ({ id: randomid(), runid: plan.id, stepid: step.id, kind: entry.kind, url: entry.url, bytes: entry.bytes, at: Date.now(), ...(entry.sizes !== undefined ? { sizes: entry.sizes } : {}) }));\n for (const record of records) await memory.addmedia(record);\n if (records.length > 0) await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: records[0]?.id ?? \"\", kind: \"asset\", scope: \"page\", bytes: 0 }, Date.now()));\n await refreshbadge();\n await audit(\"media\", `Collected ${records.length} page asset${records.length === 1 ? \"\" : \"s\"}: ${records.filter(record => record.kind === \"favicon\").length} favicon and ${records.filter(record => record.kind === \"logo\").length} logo entries with declared icon sizes.`, extra);\n return { ok: true, summary: `Collected ${records.length} page asset${records.length === 1 ? \"\" : \"s\"}.`, details: { media: { id: records[0]?.id ?? \"\", kind: \"asset\", bytes: 0 }, assets: records } };\n }\n if (step.kind === \"timelapse\") {\n const lapse = lapseplanof(options.lapse);\n if (!lapse) throw new Error(\"A reviewed lapse plan with interval, duration and format is required in options.\");\n const timestamps = lapseframes(lapse);\n const capture = captureoptionsof(options.capture);\n const format = lapse.format ?? capture.format ?? \"png\";\n const frameids: string[] = [];\n for (let index = 0; index < timestamps.length; index += 1) {\n if (index > 0) await new Promise(resolve => setTimeout(resolve, lapse.interval));\n const shot = await tabshot(format === \"png\" || format === \"jpeg\" ? format : \"png\", capture.quality);\n const measured = await bridgecall<{ viewportwidth: number; viewportheight: number }>(tabid, \"measurepage\");\n const frame: shotrecord = { id: randomid(), runid: plan.id, stepid: step.id, kind: \"timelapse\", format, width: measured.viewportwidth, height: measured.viewportheight, capturedat: Date.now(), bytes: shot, name: await capturenamefor(step, plan, \"timelapse\", format), target: `frame-${index + 1}` };\n await memory.addcapture(frame);\n frameids.push(frame.id);\n }\n await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: frameids[0] ?? \"\", kind: \"timelapse\", scope: \"page\", bytes: 0 }, Date.now()));\n await refreshbadge();\n await audit(\"media\", `Captured a time lapse of ${frameids.length} frame${frameids.length === 1 ? \"\" : \"s\"} at ${lapse.interval} millisecond intervals over ${lapse.duration} milliseconds in ${format}.`, extra);\n return { ok: true, summary: `Captured a time lapse of ${frameids.length} frames.`, details: { media: { id: frameids[0] ?? \"\", kind: \"timelapse\", bytes: 0 }, frames: frameids, interval: lapse.interval, duration: lapse.duration, format } };\n }\n if (step.kind === \"convertimage\" || step.kind === \"makethumbs\") {\n const single = typeof options.capture === \"string\" ? options.capture : undefined;\n const list = Array.isArray(options.captures) ? options.captures.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0) : [];\n const ids = single !== undefined ? [single] : list;\n const converted: Array<{ id: string; format: string; width: number; height: number; name: string }> = [];\n for (const id of ids) {\n const source = await memory.getcapture(id);\n if (!source) throw new Error(`No stored capture matches ${id}.`);\n if (step.kind === \"convertimage\") {\n const directive = convertdirectiveof(options.convert);\n if (!directive) throw new Error(\"A reviewed convert directive with a target format is required in options.\");\n const record = await convertonecapture(source, directive, plan, step);\n await memory.addcapture(record);\n converted.push({ id: record.id, format: record.format, width: record.width, height: record.height, name: record.name ?? \"\" });\n } else {\n const directive = thumbdirectiveof(options.thumb);\n if (!directive) throw new Error(\"A reviewed thumb directive with size, fit and suffix is required in options.\");\n const record = await thumbonecapture(source, directive, plan, step);\n await memory.addcapture(record);\n converted.push({ id: record.id, format: record.format, width: record.width, height: record.height, name: record.name ?? \"\" });\n }\n }\n await memory.setprogress(recordmedia(await memory.getprogress(), plan.id, step.id, { id: converted[0]?.id ?? \"\", kind: step.kind === \"convertimage\" ? \"convert\" : \"thumb\", scope: \"store\", bytes: 0 }, Date.now()));\n await refreshbadge();\n await audit(\"media\", `${step.kind === \"convertimage\" ? \"Converted\" : \"Thumbnailed\"} ${converted.length} stored capture${converted.length === 1 ? \"\" : \"s\"} into new derived capture records.`, extra);\n return { ok: true, summary: `${step.kind === \"convertimage\" ? \"Converted\" : \"Thumbnailed\"} ${converted.length} stored capture${converted.length === 1 ? \"\" : \"s\"}.`, details: { media: { id: converted[0]?.id ?? \"\", kind: step.kind === \"convertimage\" ? \"convert\" : \"thumb\", bytes: 0 }, converted } };\n }\n throw new Error(\"Unsupported media kind.\");\n}\n\n/** Enforces the reviewed window close: a window that holds more than one task tab needs the explicit reviewed flag. */\nasync function enforcewindowreview(step: toolstep, session: agentsession | undefined, plan: agentplan | undefined): Promise<void> {\n const windowid = step.value && /^\\d+$/.test(step.value) ? Number.parseInt(step.value, 10) : 0;\n const progress = plan ? await memory.getprogress() : undefined;\n const tasktabids = plan ? trackedtasktabs(progress, plan.id) : [];\n const count = tasktabsinwindow(await livetabs(), windowid, tasktabids);\n const gate = windowclosegate(count, stepoptions(step).reviewed === true);\n if (!gate.allowed) throw new Error(gate.reason ?? \"The window close needs explicit review.\");\n if (session && count > 0) await audit(\"window\", `Window ${windowid} closes while holding ${count} task tab${count === 1 ? \"\" : \"s\"} under the explicit reviewed flag.`, { ...(session ? { sessionid: session.id } : {}), ...(plan ? { planid: plan.id } : {}), stepid: step.id });\n}\n\n/** Refreshes the per task badges from the live progress state of each task tab. */\nasync function updatetaskbadges(plan: agentplan | undefined, progress: Awaited<ReturnType<typeof memory.getprogress>>): Promise<void> {\n if (!plan || !progress || progress.planid !== plan.id) return;\n const state = badgefromprogress(progress.completedsteps.length, plan.steps.length);\n for (const tabid of tasktabs(progress, plan.id)) {\n await memory.setbadge({ tabid, taskid: plan.id, label: state.label, setat: Date.now() });\n }\n}\n\n/** Opens or closes the pinned control tab with the live task feed when the user enables it. */\nasync function togglecontroltab(enabled: boolean): Promise<controltabstate> {\n const current = await memory.getcontroltab();\n if (current && current.tabid) await chrome.tabs.remove(current.tabid).catch(() => undefined);\n if (!enabled) {\n const closed: controltabstate = { tabid: 0, enabled: false, updatedat: Date.now() };\n await memory.setcontroltab(closed);\n await audit(\"tab\", \"The pinned control tab was closed.\");\n return closed;\n }\n const created = await chrome.tabs.create({ url: chrome.runtime.getURL(\"sidepanel.html\"), pinned: true, active: false });\n const state: controltabstate = { tabid: created?.id ?? 0, enabled: true, updatedat: Date.now() };\n await memory.setcontroltab(state);\n await audit(\"tab\", `The pinned control tab ${state.tabid} was opened with the live task feed.`);\n return state;\n}\n\n/** Refreshes the popup badge with the queued prefetch and batch open target counts, the tabs with active tasks, the open asksubmit and clipboard consent prompts, the datasets collected in the session, the quarantined files awaiting scan verdicts and the captures of the run. */\nasync function refreshbadge(): Promise<void> {\n const queues = await memory.getnavqueues();\n const badges = await memory.getbadges();\n const prompts = (await memory.gettickets()).filter(ticket => ticket.approved === undefined).length;\n const consents = (await memory.getclipconsents()).filter(record => record.approved === undefined).length;\n const quarantined = (await memory.getquarantines()).filter(entry => entry.scan === \"pending\").length;\n const datasets = (await memory.getdatasets()).length;\n const captures = (await memory.getcaptures()).length;\n const media = (await memory.getmediarecords()).length + (await memory.getimagebatches()).length;\n const recordingprompts = (await memory.getrecordingconsents()).filter(record => record.approved === undefined).length;\n const tasktabs = new Set(badges.map(badge => badge.tabid)).size;\n const total = (queues?.prefetch ?? 0) + (queues?.batchopen ?? 0) + tasktabs + prompts + consents + quarantined + datasets + captures + media + recordingprompts;\n await chrome.action.setBadgeText({ text: total > 0 ? String(total) : \"\" }).catch(() => { /* the badge is cosmetic and may be unavailable */ });\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, verdicts: await memory.getsafeties() });\n if (!gate.allowed) throw new Error(gate.reason);\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 let output: stepoutput | undefined;\n let watchwindow: { startedat: number; lifetime: number } | undefined;\n /** Runs the reviewed dispatch chain of one step through the page, browser and command executors. */\n const dispatchreviewedstep = async (): Promise<stepoutput | undefined> => {\n if (step.kind === \"windowclose\") {\n await enforcewindowreview(step, session, plan);\n }\n if (istabscommandkind(step.kind)) {\n output = await executetabscommand(step, session, plan as agentplan, tab.id as number);\n } else if (isdatasetkind(step.kind)) {\n output = await executedatastep(step, session, plan as agentplan, tab.id as number, origin);\n } else if (isfileskind(step.kind)) {\n output = await executefilesstep(step, session, plan as agentplan, tab.id as number, origin);\n } else if (isformkind(step.kind)) {\n output = await executeformstep(step, session, plan as agentplan, tab.id as number, origin);\n } else if (isbrowserkind(step.kind)) {\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 if (navigationstepkinds.has(step.kind)) {\n output = await executenavigationkind(step, session, plan as agentplan, tab.id as number, origin);\n } else if (iscapturekind(step.kind)) {\n output = await executecapturestep(step, session, plan as agentplan, tab.id as number, origin);\n } else if (ismediakind(step.kind)) {\n output = await executemediastep(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 return output;\n };\n const runplan = plan as agentplan;\n const capturepolicystate = await runcapturepolicy();\n if (capturepolicystate === \"beforeafter\" && session && step.risk !== \"read\" && beforeafterwrapallowed(step.kind)) {\n const before = await grabstateshot(step, session, runplan, tab.id as number, \"before\");\n output = await dispatchreviewedstep();\n if (output?.ok) {\n const after = await grabstateshot(step, session, runplan, tab.id as number, \"after\");\n const domversion = await memory.getobservationversion();\n const paired = capturestates({ policy: \"beforeafter\", before, after, actionkind: step.kind, ...(step.target ? { target: step.target } : {}), ...(domversion !== undefined ? { domsnapshotid: String(domversion) } : {}), at: Date.now(), id: randomid() });\n if (paired.pair) {\n await memory.addpair(paired.pair);\n await memory.setprogress(recordpair(await memory.getprogress(), runplan.id, step.id, paired.pair, Date.now()));\n await audit(\"capture\", `Paired the before shot ${paired.pair.beforeid} with the after shot ${paired.pair.afterid} around the ${step.kind} action${paired.pair.domsnapshotid !== undefined ? ` with dom snapshot ${paired.pair.domsnapshotid}` : \"\"}.`, { sessionid: session.id, planid: runplan.id, stepid: step.id });\n }\n }\n } else {\n output = await dispatchreviewedstep();\n }\n if ([\"navigate\", \"back\", \"forward\"].includes(step.kind)) await recordnavigation(step, session, tab.id as number);\n await recordevidence(step, output, session, plan, origin);\n if (output?.ok && plan && typeof output.details?.tabid === \"number\") {\n await memory.setprogress(assigntasktab(await memory.getprogress(), plan.id, output.details.tabid as number, Date.now()));\n }\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 await updatetaskbadges(plan, tracked);\n await refreshbadge();\n if (iscomplete(tracked, plan) && plan.state === \"approved\") {\n await stoprecordingsforrun(plan.id).catch(() => { /* a failed recording stop retries through the panel stop control */ });\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 if (permission === \"downloads\") installmimelistener();\n await audit(\"capability\", `Capability ${permission} granted by the user.`);\n return refreshcapabilities();\n}\n\n/** Builds the extraction progress envelope of every stored extract session. */\nasync function extractionreportValue() {\n return extractionreport({ sessions: await memory.getextractsessions() });\n}\n\n/** Builds the provenance envelope of every exported artifact. */\nasync function provenancereportValue() {\n return provenancereport({ records: await memory.getprovenances() });\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 const trail = session ? await memory.gettrail(session.id) : [];\n const navrecords = await memory.getnavrecords();\n const ratestates = await memory.getratestates();\n const safeties = await memory.getsafeties();\n const curated = await memory.getcurateds();\n const waitprofiles = await memory.getwaitprofiles();\n const auths = (await memory.getauths()).map(record => ({ origin: record.origin, username: record.username, reviewedat: record.reviewedat }));\n const navcontrol = await memory.getnavcontrol();\n const navqueues = await memory.getnavqueues();\n const artifacts = await memory.getartifacts();\n const tabs = await livetabs().catch(() => [] as tabshape[]);\n const windows = await livewindows().catch(() => [] as windowshape[]);\n const layouts = await memory.getlayouts();\n const tabgroups = await memory.gettabgroups();\n const tabmetas = await memory.gettabmetas();\n const badges = await memory.getbadges();\n const snapshots = await memory.getsnapshots();\n const closedtabs = await memory.getclosedtabs();\n const controltab = await memory.getcontroltab();\n const tabwatchevents = await memory.gettabwatchevents();\n const profiles = await memory.getprofiles();\n const tickets = await memory.gettickets();\n const wizards = await memory.getwizards();\n const picks = await memory.getpicks();\n const errorreports = await memory.geterrorreports();\n const captchas = await memory.getcaptchas();\n const detections = await memory.getdetections();\n const codeentry = await memory.getcodevalue();\n const datasets = await memory.getdatasets();\n const imports = await memory.getimports();\n const extractsessions = await memory.getextractsessions();\n const streams = await memory.getstreams();\n const exports = (await memory.getexports()).map(artifact => ({ id: artifact.id, kind: artifact.kind, name: artifact.name, stepid: artifact.stepid, rowcount: artifact.rowcount, checksum: artifact.checksum, at: artifact.at }));\n const provenances = await memory.getprovenances();\n const taskrules = await memory.gettaskrules();\n const sheetendpoints: sheetendpoint[] = await memory.getsheetendpoints();\n const sheetgrants: Array<{ endpoint: string; origin: string; configuredat: number; granted: boolean }> = [];\n for (const config of sheetendpoints) {\n sheetgrants.push({ ...config, granted: await chrome.permissions.contains({ origins: [hostpattern(config.origin)] } as chrome.permissions.Permissions).catch(() => false) });\n }\n const downloads = await memory.getdownloads();\n const netlogs = await memory.getnetlog();\n const clipconsents = await memory.getclipconsents();\n const clips = await memory.getclips();\n const quarantines = await memory.getquarantines();\n const cleanuprules = await memory.getcleanuprules();\n const cleanupruns = await memory.getcleanupruns();\n const capturecounters = await memory.getcapturecounters();\n const inventory = await memory.getinventory();\n const mimefilters = await memory.getmimefilters();\n const capturemetadata = (await memory.getcaptures()).map(record => { const { bytes, ...meta } = record; void bytes; return meta; });\n const capturepairs = await memory.getpairs();\n const mediarecords = (await memory.getmediarecords()).map(record => { const { dataurl, ...meta } = record as mediarecord & { dataurl?: string }; void dataurl; return meta; });\n const imagebatches = await memory.getimagebatches();\n const recordingconsents = await memory.getrecordingconsents();\n const runsettings = await memory.getsettings();\n const scanhooks: Array<{ scanner: string; endpoint: string; origin: string; configuredat: number; granted: boolean }> = [];\n for (const hook of await memory.getscanhooks()) {\n scanhooks.push({ ...hook, granted: await chrome.permissions.contains({ origins: [hostpattern(hook.origin)] } as chrome.permissions.Permissions).catch(() => false) });\n }\n const clones = clonetabs(tabs);\n const taskgauge = tasktabgauge(tabs.filter(tab => badges.some(badge => badge.tabid === tab.tabid)).length, tasktabceiling(await memory.getsettings()));\n const report: tabreport = await buildtabreport(tabs);\n const livetab = session ? await chrome.tabs.get(session.tabid).catch(() => undefined) : undefined;\n const waitprofile = session ? waitprofiles.find(record => record.origin === session.origin) : undefined;\n const livestate: navstate = { phase: livetab?.status === \"loading\" ? \"loading\" : \"complete\", ...(navrecords[0] ? { finalurl: navrecords[0].finalurl, redirects: navrecords[0].chain } : {}) };\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 } : {}), trail: trailreport({ ...(session ? { sessionid: session.id } : {}), trail }), navrecords, ratestates, safeties, curated, waitprofiles, auths, navcontrol, navqueues, artifacts, navstate: livestate, ...(waitprofile ? { waitprofile } : {}), offline: !navigator.onLine, tabs, windows, layouts: layoutreport({ layouts }), tabgroups, tabmetas, badges, snapshots, closedtabs, tabwatchevents, clones, tasktabgauge: taskgauge, ...(controltab ? { controltab } : {}), tabreport: report, profiles, tickets, wizards: wizardreport({ ...(session ? { sessionid: session.id } : {}), wizards, picks }), picks, errorreports, captchas, detections, ...(codeentry !== undefined ? { codeentry: true } : {}), datasets, imports, extractsessions, streams, exports, provenances, taskrules, sheetendpoints: sheetgrants, downloads, netlogs, clipconsents, clips, quarantines, cleanuprules, cleanupruns, capturecounters, inventory, mimefilters, scanhooks, captures: capturemetadata, capturepairs, capturepolicy: runsettings?.capturepolicy ?? \"manual\", media: mediarecords, imagebatches, recordingconsents, recordingactive: [...activerecordings.values()].map(active => ({ id: active.record.id, kind: active.record.kind, scope: active.record.scope, startedat: active.record.startedat, stopat: active.stopat })), recordingwindow: runsettings?.recordingwindow, ...(stitchprogress.size > 0 ? { stitchprogress: [...stitchprogress.values()] } : {}) };\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 const capture = outcome.details?.capture as { id: string; format: string; bytes: number } | undefined;\n const media = outcome.details?.media as { id: string; kind: string; bytes: number } | undefined;\n return JSON.parse(outcomeresponse({ outcome, plan, ...(resolved ? { resolvedtarget: resolved } : {}), ...(capture ? { capture } : {}), ...(media ? { media } : {}) }));\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 \"storeauth\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Basic auth credentials are stored only behind the consent gate of an active session.\");\n const inputauth = message as { origin?: string; username?: string; password?: string };\n const origin = new URL(inputauth.origin ?? \"\").origin;\n if (!origin.startsWith(\"https://\")) throw new Error(\"Basic auth credentials need an HTTPS origin.\");\n if (!inputauth.username?.trim() || !inputauth.password) throw new Error(\"Basic auth credentials need a username and a password.\");\n const record: authrecord = { origin, username: inputauth.username.trim(), password: inputauth.password, reviewedat: Date.now() };\n await memory.setauth(record);\n await audit(\"auth\", `Basic auth credentials for ${origin} stored after explicit review; the password never leaves local storage.`, { sessionid: session.id });\n return { origin: record.origin, username: record.username, reviewedat: record.reviewedat };\n }\n case \"checksafe\": {\n const inputurl = message as { url?: string };\n const verdict = { ...checksafe(inputurl.url ?? \"\"), at: Date.now() };\n await memory.addsafety(verdict);\n const session = await memory.getsession();\n await audit(\"navigation\", `Safety check of ${verdict.url} returned ${verdict.safe ? \"safe\" : \"unsafe\"}${verdict.reasons.length > 0 ? `: ${verdict.reasons.join(\"; \")}` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}) });\n return verdict;\n }\n case \"navstate\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a navstate envelope.\");\n const record = (await memory.getnavrecords())[0];\n const session = await memory.getsession();\n const livetab = session ? await chrome.tabs.get(session.tabid).catch(() => undefined) : undefined;\n const state: navstate = { phase: livetab?.status === \"loading\" ? \"loading\" : \"complete\", ...(record ? { finalurl: record.finalurl, redirects: record.chain } : {}) };\n return JSON.parse(navstateresponse({ navstate: state, plan }));\n }\n case \"safeties\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a safety envelope.\");\n return JSON.parse(safetyresponse({ verdicts: await memory.getsafeties(), plan }));\n }\n case \"jumptotab\": {\n const inputtab = message as { tabid?: number };\n if (typeof inputtab.tabid !== \"number\") throw new Error(\"A numeric tab id is required to jump.\");\n await chrome.tabs.update(inputtab.tabid, { active: true }).catch(() => { throw new Error(\"The tab to jump to is no longer open.\"); });\n await audit(\"tab\", `The review panel jumped to tab ${inputtab.tabid}.`);\n return { tabid: inputtab.tabid };\n }\n case \"tabsearch\": {\n const inputsearch = message as { text?: string };\n const granted = await chrome.permissions.contains({ permissions: [\"tabs\"] } as chrome.permissions.Permissions);\n if (!granted) throw new Error(\"The tabs capability has not been granted; request it from the review panel.\");\n const matches = searchtabmatches(await livetabs(), inputsearch.text ?? \"\");\n await audit(\"tab\", `The review panel searched the open tabs for \"${inputsearch.text ?? \"\"}\" and matched ${matches.length} tab${matches.length === 1 ? \"\" : \"s\"}.`);\n return { matches };\n }\n case \"savelayout\": {\n const session = await memory.getsession();\n const gate = layoutmutationgranted(session, Date.now());\n if (!gate.allowed) throw new Error(gate.reason);\n const inputlayout = message as { name?: string };\n if (!inputlayout.name?.trim()) throw new Error(\"A layout name is required.\");\n const [tabs, windows, groups, scratch] = await Promise.all([livetabs(), livewindows(), memory.gettabgroups(), memory.getscratchwindows()]);\n const layout = buildlayout(inputlayout.name.trim(), tabs, windows, groups, scratch, Date.now());\n await memory.setlayout(layout);\n await audit(\"layout\", `The review panel saved the tab layout ${layout.name} with ${layout.tabs.length} tabs and ${layout.windows.length} window bounds.`, { ...(session ? { sessionid: session.id } : {}) });\n return layout;\n }\n case \"restorelayout\": {\n const session = await memory.getsession();\n const gate = layoutmutationgranted(session, Date.now());\n if (!gate.allowed) throw new Error(gate.reason);\n const inputlayout = message as { name?: string };\n const layout = await memory.getlayout(inputlayout.name ?? \"\");\n if (!layout) throw new Error(`No tab layout named ${inputlayout.name ?? \"\"} is stored yet.`);\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n const urls = layoutrestoreplan(layout, open);\n const opened: number[] = [];\n for (const url of urls) {\n const created = await chrome.tabs.create({ url, active: opened.length === 0 });\n opened.push(created?.id ?? 0);\n }\n await audit(\"layout\", `The review panel restored the tab layout ${layout.name}: ${opened.length} tab${opened.length === 1 ? \"\" : \"s\"} reopened.`, { ...(session ? { sessionid: session.id } : {}) });\n return { name: layout.name, reopened: opened.length };\n }\n case \"restoresnapshot\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Snapshot restore stays behind the consent gate of an active session.\");\n const inputsnapshot = message as { id?: string };\n const snapshot = (await memory.getsnapshots()).find(item => item.id === inputsnapshot.id);\n if (!snapshot) throw new Error(\"No stored session snapshot matches the requested id.\");\n const open = (await livetabs()).map(tab => tab.url).filter(Boolean);\n const urls = layoutrestoreplan(snapshot.layout, open);\n const opened: number[] = [];\n for (const url of urls) {\n const created = await chrome.tabs.create({ url, active: opened.length === 0 });\n opened.push(created?.id ?? 0);\n }\n await audit(\"layout\", `The review panel restored the session snapshot ${snapshot.id}: ${opened.length} tab${opened.length === 1 ? \"\" : \"s\"} reopened.`, { sessionid: session.id });\n return { id: snapshot.id, reopened: opened.length };\n }\n case \"controltab\": {\n const inputcontrol = message as { enabled?: boolean };\n const state = await togglecontroltab(inputcontrol.enabled === true);\n const settings = await memory.getsettings();\n await memory.setsettings({ ...settings, controltab: state.enabled });\n return state;\n }\n case \"settasktabceiling\": {\n const inputceiling = message as { ceiling?: number };\n const settings = await memory.getsettings();\n const ceiling = typeof inputceiling.ceiling === \"number\" && Number.isFinite(inputceiling.ceiling) && inputceiling.ceiling >= 0 ? inputceiling.ceiling : undefined;\n await memory.setsettings({ ...settings, ...(ceiling !== undefined ? { tasktabceiling: ceiling } : {}) });\n await audit(\"configure\", `The user set the concurrent task tab ceiling to ${ceiling === undefined ? \"no ceiling\" : ceiling}; the value stays a user choice with no code cap.`);\n return { tasktabceiling: ceiling };\n }\n case \"windowstate\": {\n const inputwindow = message as { windowid?: number; state?: string };\n if (typeof inputwindow.windowid !== \"number\" || !inputwindow.state || ![\"normal\", \"maximized\", \"minimized\", \"fullscreen\"].includes(inputwindow.state)) throw new Error(\"A numeric window id and a known window state are required.\");\n await chrome.windows.update(inputwindow.windowid, { state: inputwindow.state as chrome.windows.WindowState });\n await audit(\"window\", `The popup set window ${inputwindow.windowid} to the ${inputwindow.state} state.`);\n return { windowid: inputwindow.windowid, state: inputwindow.state };\n }\n case \"closewindow\": {\n const inputclose = message as { windowid?: number; reviewed?: boolean };\n if (typeof inputclose.windowid !== \"number\") throw new Error(\"A numeric window id is required.\");\n const session = await memory.getsession();\n const plan = await memory.getplan();\n const progress = plan ? await memory.getprogress() : undefined;\n const tasktabids = plan && progress ? trackedtasktabs(progress, plan.id) : [];\n const count = tasktabsinwindow(await livetabs(), inputclose.windowid, tasktabids);\n const gate = windowclosegate(count, inputclose.reviewed === true);\n if (!gate.allowed) throw new Error(gate.reason);\n await chrome.windows.remove(inputclose.windowid);\n await audit(\"window\", `The review panel closed window ${inputclose.windowid}${count > 0 ? ` while holding ${count} task tab${count === 1 ? \"\" : \"s\"} under explicit review` : \"\"}.`, { ...(session ? { sessionid: session.id } : {}) });\n return { windowid: inputclose.windowid, closed: true };\n }\n case \"applyprofile\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Profile application stays inside the consent gate of an active session.\");\n const inputprofile = message as { name?: string };\n const profile = await memory.getprofile(inputprofile.name ?? \"\");\n if (!profile) throw new Error(`No form profile named ${inputprofile.name ?? \"\"} is stored yet.`);\n const gate = profilegrantgranted(profile, session.origin);\n if (!gate.allowed) throw new Error(gate.reason);\n await audit(\"fill\", `Form profile ${profile.name} applied as the reviewed field map for ${session.origin} under its origin grants.`, { sessionid: session.id });\n return { profile: { name: profile.name, fields: profile.fields, grants: profile.grants } };\n }\n case \"approvesubmit\": {\n const inputticket = message as { id?: string; approved?: boolean };\n const tickets = await memory.gettickets();\n const ticket = tickets.find(item => item.id === inputticket.id);\n if (!ticket) throw new Error(\"No submission ticket matches the requested id.\");\n const updated = { ...ticket, approved: inputticket.approved !== false };\n await memory.setticket(updated);\n const session = await memory.getsession();\n await audit(\"submit\", `Submission ticket ${ticket.id} for form ${ticket.form} ${updated.approved ? \"approved\" : \"declined\"} by the user with values hash ${ticket.valueshash}.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return updated;\n }\n case \"resolvecaptcha\": {\n const open = (await memory.getcaptchas()).find(item => !item.resolved);\n if (!open) throw new Error(\"No open captcha handoff exists.\");\n await memory.resolvecaptcha(open.id, Date.now());\n const session = await memory.getsession();\n if (session?.pausedat && !session.stoppedat) {\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 }\n await audit(\"handoff\", `Captcha handoff ${open.id} resolved by the user after ${Date.now() - open.openedat} milliseconds; the plan continues.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return { resolved: true, id: open.id };\n }\n case \"storecode\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"The one time code entry stays behind the consent gate of an active session.\");\n const inputcode = message as { code?: string };\n if (!inputcode.code?.trim()) throw new Error(\"A non-empty one time code is required.\");\n await memory.setcodevalue(inputcode.code.trim());\n await audit(\"consent\", `A one time code was stored behind the consent gate of the active session; the value never appears in the audit trail.`, { sessionid: session.id });\n return { stored: true };\n }\n case \"regeneratevalue\": {\n const inputvalue = message as { field?: string; locale?: string; seed?: number };\n if (typeof inputvalue.field !== \"string\" || !inputvalue.field) throw new Error(\"A field kind is required to regenerate a value.\");\n const rule: { locale?: string; seed?: number } = {};\n if (typeof inputvalue.locale === \"string\" && inputvalue.locale) rule.locale = inputvalue.locale;\n if (typeof inputvalue.seed === \"number\" && Number.isFinite(inputvalue.seed)) rule.seed = inputvalue.seed;\n const value = generatevalue(inputvalue.field as fieldkind, rule);\n const verdict = generatedvalueallowed(value);\n if (!verdict.allowed) throw new Error(verdict.reason ?? \"The regenerated value was refused.\");\n return { kind: inputvalue.field, value, locale: rule.locale ?? \"en\", seed: rule.seed ?? 1 };\n }\n case \"removeprofile\": {\n const inputprofile = message as { name?: string };\n const profile = await memory.getprofile(inputprofile.name ?? \"\");\n if (!profile) throw new Error(`No form profile named ${inputprofile.name ?? \"\"} is stored yet.`);\n await memory.removeprofile(profile.name);\n const session = await memory.getsession();\n await audit(\"fill\", `Form profile ${profile.name} removed from local memory by the user.`, { ...(session ? { sessionid: session.id } : {}) });\n return { removed: true, name: profile.name };\n }\n case \"formreport\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a form report envelope.\");\n const outcome = (await memory.getoutcomes()).find(candidate => plan.steps.some(step => step.id === candidate.stepid && step.kind === \"detectfields\"));\n const report = outcome?.details?.report;\n if (!report) throw new Error(\"No form report has been captured yet.\");\n return JSON.parse(formreportresponse({ report: report as formreport, plan }));\n }\n case \"errorreport\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for an error report envelope.\");\n const report = (await memory.geterrorreports())[0];\n if (!report) throw new Error(\"No error report has been collected yet.\");\n return JSON.parse(errorreportresponse({ report, plan }));\n }\n case \"configuresheet\": {\n const inputsheet = message as { endpoint?: string };\n const config = normalizeendpoint(inputsheet.endpoint ?? \"\");\n const granted = await chrome.permissions.contains({ origins: [hostpattern(config.origin)] });\n if (!granted) throw new Error(\"The sheet endpoint origin has not received optional permission.\");\n const record: sheetendpoint = { endpoint: config.endpoint, origin: config.origin, configuredat: Date.now() };\n await memory.setsheetendpoint(record);\n await audit(\"configure\", `Configured the reviewed sheet endpoint ${config.origin} for data pushes; pushes need the explicit reviewed flag.`);\n return record;\n }\n case \"exportdataset\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Data exports stay behind the consent gate of an active session.\");\n const { tab, origin } = await activecontext();\n const gate = exportgranted(session, origin);\n if (!gate.allowed) throw new Error(gate.reason);\n const inputexport = message as { datasetid?: string; format?: string; name?: string };\n const format = inputexport.format === \"json\" ? \"json\" : inputexport.format === \"excel\" ? \"excel\" : \"csv\";\n const datasetvalue = await loaddataset(inputexport.datasetid ?? \"\");\n const artifact = await storeexport(\"panel\", { ...datasetvalue, ...(inputexport.name?.trim() ? { name: inputexport.name.trim() } : {}) }, format, \",\", session, \"\", origin);\n void tab;\n return { id: artifact.id, kind: artifact.kind, name: artifact.name, rowcount: artifact.rowcount, checksum: artifact.checksum, at: artifact.at };\n }\n case \"importcsv\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Csv imports stay behind the consent gate of an active session.\");\n const inputimport = message as { csv?: string; name?: string; mapping?: Record<string, string> };\n const parsed = parsecsv(inputimport.csv ?? \"\");\n if (parsed.headers.length === 0) throw new Error(\"The reviewed csv needs a header line.\");\n const columns = mapcolumns(parsed.headers, inputimport.mapping ?? {});\n const rows = parsed.rows.map(line => {\n const row: datasetrow = {};\n columns.forEach((column, index) => { row[column.key] = line[index] ?? \"\"; });\n return row;\n });\n const datasetvalue: dataset = { id: randomid(), name: inputimport.name?.trim() || `import-${Date.now()}`, columns, rows, sources: [], at: Date.now() };\n await memory.addimport(datasetvalue);\n await audit(\"scrape\", `The review panel imported ${rows.length} row${rows.length === 1 ? \"\" : \"s\"} from the reviewed csv as dataset ${datasetvalue.name} for fill loops.`, { sessionid: session.id });\n await refreshbadge();\n return { id: datasetvalue.id, name: datasetvalue.name, rows: rows.length, columns: columns.length };\n }\n case \"dataset\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a dataset envelope.\");\n const inputdataset = message as { datasetid?: string; sample?: number };\n const datasetvalue = await memory.getdataset(inputdataset.datasetid ?? \"\");\n if (!datasetvalue) throw new Error(\"No dataset has been captured yet.\");\n return JSON.parse(datasetresponse({ dataset: datasetvalue, plan, ...(typeof inputdataset.sample === \"number\" ? { sample: inputdataset.sample } : {}) }));\n }\n case \"extraction\": return extractionreportValue();\n case \"provenance\": return provenancereportValue();\n case \"downloadreport\": {\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for a download report envelope.\");\n return JSON.parse(downloadreport({ downloads: await memory.getdownloads(), plan }));\n }\n case \"quarantine\": return quarantinereport({ entries: await memory.getquarantines() });\n case \"netlog\": return netlogreport({ records: await memory.getnetlog() });\n case \"downloadaction\": {\n const inputdownload = message as { id?: string; action?: string };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Download actions stay behind the consent gate of an active session.\");\n const record = await loadownload(inputdownload.id ?? \"\");\n if (!record) throw new Error(`No stored download matches ${inputdownload.id ?? \"\"}.`);\n const extra = { sessionid: session.id };\n if (inputdownload.action === \"pause\") return pauseonerecord(record, extra);\n if (inputdownload.action === \"resume\") return resumeonerecord(record, extra);\n if (inputdownload.action === \"verify\") return verifyonerecord(record, {}, extra);\n throw new Error(\"A pause, resume or verify action is required.\");\n }\n case \"approveclipconsent\": {\n const inputconsent = message as { id?: string; approved?: boolean };\n const record = (await memory.getclipconsents()).find(item => item.id === inputconsent.id);\n if (!record) throw new Error(\"No clipboard consent prompt matches the requested id.\");\n await memory.setclipconsent({ ...record, approved: inputconsent.approved !== false });\n const session = await memory.getsession();\n await audit(\"clipboard\", `Clipboard consent prompt ${record.id} for step ${record.stepid} on ${record.origin} ${inputconsent.approved !== false ? \"approved\" : \"declined\"} by the user; every read consumes its own prompt.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return { id: record.id, approved: inputconsent.approved !== false };\n }\n case \"releasequarantine\": {\n const inputquarantine = message as { id?: string };\n const entry = (await memory.getquarantines()).find(item => item.id === inputquarantine.id);\n if (!entry) throw new Error(\"No quarantined file matches the requested id.\");\n if (entry.release !== undefined) throw new Error(`The quarantined file ${entry.path} was already released.`);\n const gate = quarantinereleasegranted(entry);\n if (!gate.allowed) throw new Error(gate.reason);\n const releasedentry = released(entry, `user-${Date.now()}`, Date.now());\n await memory.setquarantine(releasedentry);\n const session = await memory.getsession();\n await audit(\"quarantine\", `Quarantine release of ${entry.path} approved with the ${entry.scan} scan verdict under ref ${releasedentry.release}; every release is audited with its verdict.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return releasedentry;\n }\n case \"setcleanuprules\": {\n const inputrules = message as { rules?: unknown[] };\n const rules = (Array.isArray(inputrules.rules) ? inputrules.rules : []).filter((item): item is cleanuprule => Boolean(item) && typeof item === \"object\" && !Array.isArray(item));\n for (const rule of rules) {\n const gate = validatecleanuprule(rule);\n if (!gate.allowed) throw new Error(gate.reason);\n }\n await memory.setcleanuprules(rules);\n const session = await memory.getsession();\n await audit(\"cleanup\", `The review panel stored ${rules.length} reviewed cleanup rule${rules.length === 1 ? \"\" : \"s\"} with age windows and keep policies; ages stay user configured with no code ceiling.`, { ...(session ? { sessionid: session.id } : {}) });\n return { rules: rules.length };\n }\n case \"configurescanhook\": {\n const inputhook = message as { scanner?: string; endpoint?: string };\n const config = normalizeendpoint(inputhook.endpoint ?? \"\");\n const granted = await chrome.permissions.contains({ origins: [hostpattern(config.origin)] });\n if (!granted) throw new Error(\"The scan hook origin has not received optional permission.\");\n if (!inputhook.scanner?.trim()) throw new Error(\"A scanner name is required for the scan hook.\");\n const hook: scanhookconfig = { scanner: inputhook.scanner.trim(), endpoint: config.endpoint, origin: config.origin, configuredat: Date.now() };\n await memory.setscanhook(hook);\n await audit(\"quarantine\", `Configured the virus scanning hook ${hook.scanner} at ${hook.origin}; scan verdicts arrive from the endpoint and hook failures stay pending verdicts.`, {});\n return hook;\n }\n case \"exportnetlog\": {\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Netlog exports stay behind the consent gate of an active session.\");\n const records = (await memory.getnetlog()).map(record => ({ ...record, headers: redactheaders(record.headers ?? {}) }));\n await audit(\"observation\", `The review panel exported ${records.length} netlog record${records.length === 1 ? \"\" : \"s\"} of the run with every header value redacted.`, { sessionid: session.id });\n return { records, redacted: true, redaction: \"every header value is redacted from exported netlogs\" };\n }\n case \"capturebytes\": {\n const inputcapture = message as { id?: string };\n const record = await memory.getcapture(inputcapture.id ?? \"\");\n if (!record) throw new Error(\"No stored capture matches the requested id.\");\n if (!record.bytes) throw new Error(\"The capture bytes expired from the retention window; the metadata stays for the audit trail.\");\n return { id: record.id, runid: record.runid, kind: record.kind, format: record.format, width: record.width, height: record.height, capturedat: record.capturedat, name: record.name, annotated: record.annotated === true, bytes: record.bytes };\n }\n case \"capturereport\": return capturereport({ records: await memory.getcaptures(), pairs: await memory.getpairs() });\n case \"copycapture\": {\n const inputcopy = message as { id?: string };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Capture clipboard copies stay behind the consent gate of an active session.\");\n const record = await memory.getcapture(inputcopy.id ?? \"\");\n if (!record) throw new Error(\"No stored capture matches the requested id.\");\n if (!record.bytes) throw new Error(\"The capture bytes expired from the retention window; the metadata stays for the audit trail.\");\n const granted = await chrome.permissions.contains({ permissions: [\"clipboardWrite\"] } as chrome.permissions.Permissions).catch(() => false);\n if (!granted) throw new Error(\"The capture copy needs the clipboardwrite capability; request it from the review panel.\");\n const blob = await (await fetch(record.bytes)).blob();\n await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })]);\n await memory.addclip(clipentryof(\"screen\", { hash: cliphash(record.bytes), length: record.bytes.length }, session.origin, record.stepid, Date.now()));\n await audit(\"capture\", `The review panel copied capture ${record.id} of kind ${record.kind} to the clipboard with payload hash ${cliphash(record.bytes)}.`, { sessionid: session.id });\n return { id: record.id, copied: true };\n }\n case \"downloadcapture\": {\n const inputdownloadcapture = message as { id?: string };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Capture downloads stay behind the consent gate of an active session.\");\n const record = await memory.getcapture(inputdownloadcapture.id ?? \"\");\n if (!record) throw new Error(\"No stored capture matches the requested id.\");\n if (!record.bytes) throw new Error(\"The capture bytes expired from the retention window; the metadata stays for the audit trail.\");\n const granted = await chrome.permissions.contains({ permissions: [\"downloads\"] } as chrome.permissions.Permissions).catch(() => false);\n if (!granted) throw new Error(\"The capture download needs the downloads capability; request it from the review panel.\");\n await chrome.downloads.download({ url: record.bytes, filename: record.name ?? `capture.${record.format}` });\n await audit(\"capture\", `The review panel downloaded capture ${record.id} of kind ${record.kind} through the reviewed download flow.`, { sessionid: session.id });\n return { id: record.id, downloaded: true };\n }\n case \"setcapturepolicy\": {\n const inputpolicy = message as { mode?: string };\n const mode = inputpolicy.mode === \"off\" || inputpolicy.mode === \"manual\" || inputpolicy.mode === \"annotated\" || inputpolicy.mode === \"beforeafter\" ? inputpolicy.mode : undefined;\n if (!mode) throw new Error(\"The capture policy must be off, manual, annotated or beforeafter.\");\n const settings = await memory.getsettings();\n await memory.setsettings({ ...settings, capturepolicy: mode });\n await audit(\"configure\", `The user set the capture policy of the run to ${mode}; beforeafter wraps page moving actions with state pairs.`);\n await refreshbadge();\n return { capturepolicy: mode };\n }\n case \"mediareport\": {\n const records = (await memory.getmediarecords()).map(record => { const { dataurl, ...meta } = record as mediarecord & { dataurl?: string }; void dataurl; return meta; });\n return mediareport({ records, images: await memory.getimagebatches() });\n }\n case \"mediabytes\": {\n const inputmedia = message as { id?: string };\n const record = await memory.getmediarecord(inputmedia.id ?? \"\");\n if (!record) throw new Error(\"No stored media record matches the requested id.\");\n const bytes = \"dataurl\" in record ? (record as { dataurl?: string }).dataurl : undefined;\n if (!bytes) throw new Error(\"The media bytes expired from the retention window; the metadata stays for the audit trail.\");\n const kind = \"pages\" in record ? \"pdf\" : \"timestamp\" in record ? \"frame\" : \"canvas\";\n return { id: record.id, kind, bytes };\n }\n case \"downloadmedia\": {\n const inputmedia = message as { id?: string };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Media downloads stay behind the consent gate of an active session.\");\n const record = await memory.getmediarecord(inputmedia.id ?? \"\");\n if (!record) throw new Error(\"No stored media record matches the requested id.\");\n const bytes = \"dataurl\" in record ? (record as { dataurl?: string }).dataurl : undefined;\n if (!bytes) throw new Error(\"The media bytes expired from the retention window; the metadata stays for the audit trail.\");\n const granted = await chrome.permissions.contains({ permissions: [\"downloads\"] } as chrome.permissions.Permissions).catch(() => false);\n if (!granted) throw new Error(\"The media download needs the downloads capability; request it from the review panel.\");\n const name = \"name\" in record ? (record as { name?: string }).name ?? `media-${record.id}` : `media-${record.id}`;\n await chrome.downloads.download({ url: bytes, filename: name });\n await audit(\"media\", `The review panel downloaded media record ${record.id} through the reviewed download flow.`, { sessionid: session.id });\n return { id: record.id, downloaded: true };\n }\n case \"approverecordingconsent\": {\n const inputrecordingconsent = message as { id?: string; approved?: boolean };\n const record = (await memory.getrecordingconsents()).find(item => item.id === inputrecordingconsent.id);\n if (!record) throw new Error(\"No recording consent prompt matches the requested id.\");\n await memory.setrecordingconsent({ ...record, approved: inputrecordingconsent.approved !== false });\n const session = await memory.getsession();\n await audit(\"media\", `Recording consent prompt ${record.id} for step ${record.stepid} on ${record.origin} ${inputrecordingconsent.approved !== false ? \"approved\" : \"declined\"} by the user; every recording start consumes its own prompt.`, { ...(session ? { sessionid: session.id } : {}) });\n await refreshbadge();\n return { id: record.id, approved: inputrecordingconsent.approved !== false };\n }\n case \"stoprecording\": {\n const inputstop = message as { id?: string };\n const active = activerecordings.get(inputstop.id ?? \"\");\n if (!active) throw new Error(\"No active recording matches the requested id.\");\n active.stopat = Date.now();\n const session = await memory.getsession();\n await audit(\"media\", `The review panel requested a clean stop of recording ${active.record.id} of kind ${active.record.kind}.`, { ...(session ? { sessionid: session.id } : {}) });\n return { id: active.record.id, stopping: true };\n }\n case \"recordingframes\": {\n const inputframes = message as { id?: string };\n const record = await memory.getrecording(inputframes.id ?? \"\");\n if (!record) throw new Error(\"No stored recording matches the requested id.\");\n return { id: record.id, kind: record.kind, frames: record.frames ?? [], interval: frameinterval(record.fps ?? 1), scope: record.scope, duration: record.duration };\n }\n case \"downloadrecording\": {\n const inputrecording = message as { id?: string };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Recording downloads stay behind the consent gate of an active session.\");\n const record = await memory.getrecording(inputrecording.id ?? \"\");\n if (!record) throw new Error(\"No stored recording matches the requested id.\");\n const written = await recordingwriter(record, \"download\");\n await memory.addmedia({ ...record, file: written.file, bytes: written.bytes });\n await audit(\"media\", `The review panel downloaded the recording manifest ${record.id} of kind ${record.kind} through the reviewed download flow.`, { sessionid: session.id });\n return { id: record.id, downloaded: true, file: written.file };\n }\n case \"deleterecording\": {\n const inputdelete = message as { id?: string };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Recording deletion stays behind the consent gate of an active session.\");\n const record = await memory.getrecording(inputdelete.id ?? \"\");\n if (!record) throw new Error(\"No stored recording matches the requested id.\");\n await memory.removemedia(record.id);\n await audit(\"media\", `The review panel deleted the recording ${record.id} of kind ${record.kind}; the outcome evidence stays in the audit trail.`, { sessionid: session.id });\n await refreshbadge();\n return { id: record.id, deleted: true };\n }\n case \"convertcapture\": {\n const inputconvert = message as { id?: string; target?: string; quality?: number };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Capture conversions stay behind the consent gate of an active session.\");\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for the capture conversion.\");\n const source = await memory.getcapture(inputconvert.id ?? \"\");\n if (!source) throw new Error(\"No stored capture matches the requested id.\");\n if (inputconvert.target !== \"png\" && inputconvert.target !== \"jpeg\" && inputconvert.target !== \"webp\") throw new Error(\"The conversion target must be png, jpeg or webp.\");\n const record = await convertonecapture(source, { target: inputconvert.target, ...(typeof inputconvert.quality === \"number\" ? { quality: inputconvert.quality } : {}) }, plan, { id: `panel-${source.id}`, kind: \"convertimage\", summary: `Panel conversion of capture ${source.id}.`, risk: \"read\" });\n await memory.addcapture(record);\n await audit(\"media\", `The review panel converted capture ${source.id} from ${source.format} to ${record.format}.`, { sessionid: session.id });\n await refreshbadge();\n return { id: record.id, format: record.format, name: record.name };\n }\n case \"thumbcapture\": {\n const inputthumb = message as { id?: string; size?: number; fit?: string; suffix?: string };\n const session = await memory.getsession();\n if (!session || session.stoppedat || session.expiresat <= Date.now()) throw new Error(\"Capture thumbnails stay behind the consent gate of an active session.\");\n const plan = await memory.getplan();\n if (!plan) throw new Error(\"No plan is available for the capture thumbnail.\");\n const source = await memory.getcapture(inputthumb.id ?? \"\");\n if (!source) throw new Error(\"No stored capture matches the requested id.\");\n const directive = thumbdirectiveof({ size: inputthumb.size, fit: inputthumb.fit, suffix: inputthumb.suffix });\n if (!directive) throw new Error(\"The thumbnail needs a reviewed size, a cover or contain fit and a naming suffix.\");\n const record = await thumbonecapture(source, directive, plan, { id: `panel-${source.id}`, kind: \"makethumbs\", summary: `Panel thumbnail of capture ${source.id}.`, risk: \"read\" });\n await memory.addcapture(record);\n await audit(\"media\", `The review panel thumbnailed capture ${source.id} to ${record.width} by ${record.height} pixels with the ${directive.fit} fit.`, { sessionid: session.id });\n await refreshbadge();\n return { id: record.id, width: record.width, height: record.height, name: record.name };\n }\n case \"setrecordingwindow\": {\n const inputwindow = message as { window?: number };\n const window = inputwindow.window;\n if (typeof window !== \"number\" || !Number.isFinite(window) || window <= 0) throw new Error(\"The recording window must be a positive number of milliseconds with no code ceiling.\");\n const settings = await memory.getsettings();\n await memory.setsettings({ ...settings, recordingwindow: window });\n await audit(\"configure\", `The user set the recording duration window of the run to ${window} milliseconds; recordings never run past it.`);\n return { recordingwindow: window };\n }\n case \"stop\": {\n const session = await memory.getsession();\n for (const [id, active] of [...activerecordings.entries()]) {\n const finished = finishrecording(active.record, Date.now());\n await memory.addmedia(finished).catch(() => { /* a failing store keeps the stop decision */ });\n activerecordings.delete(id);\n }\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", "tabid", "snapshot", "tabid", "settle", "record", "tabid", "window", "snapshot", "tabid", "text", "index", "document", "record", "scale", "text", "tabid", "record", "text", "released", "tabid", "window", "record", "record", "text", "record", "text", "record", "capturepart", "stepoptions", "tabid", "record", "created", "text", "window", "snapshot", "id", "settle", "tasktabs"]
|
|
7
7
|
}
|