@wenathlan/extension 1.1.32 → 1.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,9 +6,27 @@ var diagnosticbutton = document.querySelector("#diagnostic");
6
6
  var planroot = document.querySelector("#plan");
7
7
  var auditroot = document.querySelector("#audit");
8
8
  var diagnosticroot = document.querySelector("#diagnostics");
9
+ var maproot = document.querySelector("#map");
10
+ var a11yroot = document.querySelector("#a11y");
11
+ var readerroot = document.querySelector("#reader");
12
+ var detectionsroot = document.querySelector("#detections");
13
+ var streamroot = document.querySelector("#stream");
14
+ var diffsroot = document.querySelector("#diffs");
15
+ var bannersroot = document.querySelector("#banners");
16
+ var selectorsroot = document.querySelector("#selectors");
9
17
  var statusnode = document.querySelector("#status");
10
18
  var progressnode = document.querySelector("#planprogress");
11
19
  var capabilitiestext = document.querySelector("#capabilitiestext");
20
+ var previews = /* @__PURE__ */ new Map();
21
+ function options(step) {
22
+ if (!step.options) return {};
23
+ try {
24
+ const parsed = JSON.parse(step.options);
25
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
26
+ } catch {
27
+ return {};
28
+ }
29
+ }
12
30
  function status(message, error = false) {
13
31
  if (statusnode) {
14
32
  statusnode.textContent = message;
@@ -28,7 +46,23 @@ function button(label, action, disabled = false) {
28
46
  element.addEventListener("click", () => action().catch((error) => status(error instanceof Error ? error.message : String(error), true)));
29
47
  return element;
30
48
  }
31
- var previewkinds = ["focus", "inspect", "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"];
49
+ var previewkinds = ["focus", "inspect", "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", "clickpoint", "clicktext", "clickaria", "clickname", "resolvexpath", "deriveselector", "fingerprintsection"];
50
+ var topictags = [
51
+ { topic: "pointer", kinds: ["movepointer", "clickpoint", "shiftclick", "clicktext", "clickaria", "clickname", "pierceshadow"] },
52
+ { topic: "typing", kinds: ["typetime", "appendtext", "setvalue", "typeedit", "submitsearch"] },
53
+ { topic: "keys", kinds: ["keyhold", "keyrelease"] },
54
+ { topic: "controls", kinds: ["selectmulti", "chooseradio", "setslider", "setdate", "setcolor", "expanddetails"] },
55
+ { topic: "dialogs", kinds: ["dismissdialog"] },
56
+ { topic: "frames", kinds: ["enterframe"] },
57
+ { topic: "retry", kinds: ["retryaction"] },
58
+ { topic: "reads", kinds: ["mapclicks", "verifyvisible", "verifyenabled", "resolvexpath"] },
59
+ { topic: "observation", kinds: ["a11ytree", "readvisible", "readertree", "readoutline", "readselection", "readopengraph", "readlang", "detectlanguage", "listshadow", "listframes", "readscrollpos"] },
60
+ { topic: "detection", kinds: ["detectlists", "detecttables", "detectinfinitescroll", "detectvirtual", "detectlazy", "detectsticky", "detectscrolllock", "countpages", "classifypage", "fingerprintsection"] },
61
+ { topic: "watch", kinds: ["watchmutate", "watchbanner", "watchfocus", "waitquiet", "readjson", "diffsnapshots", "deriveselector"] }
62
+ ];
63
+ function steptopic(kind) {
64
+ return topictags.find((tag) => tag.kinds.includes(kind))?.topic;
65
+ }
32
66
  function renderprogress(plan, completed) {
33
67
  if (!progressnode) return;
34
68
  const total = plan.steps.length || 1;
@@ -51,35 +85,109 @@ function renderoutcome(step, outcomes) {
51
85
  }
52
86
  return node;
53
87
  }
54
- function steplist(plan, steps, completed, outcomes, risk) {
88
+ function holddetail(step) {
89
+ if (step.kind === "keyhold") {
90
+ const holdid = options(step).holdid;
91
+ return typeof holdid === "string" && holdid ? ` \xB7 hold id ${holdid}` : "";
92
+ }
93
+ if (step.kind === "keyrelease") return step.value ? ` \xB7 releases hold id ${step.value}` : "";
94
+ return "";
95
+ }
96
+ function retrydetail(step, retries) {
97
+ const latest = [...retries].reverse().find((item) => item.stepid === step.id);
98
+ if (!latest) return null;
99
+ const node = document.createElement("p");
100
+ node.className = "timeline";
101
+ node.textContent = `retry timeline: ${latest.attempts} attempt${latest.attempts === 1 ? "" : "s"} \xB7 ${latest.movement.toFixed(1)} px movement \xB7 ${latest.ok ? "succeeded" : "failed"}`;
102
+ return node;
103
+ }
104
+ function quietdetail(step, outcomes) {
105
+ if (step.kind !== "waitquiet") return null;
106
+ const latest = [...outcomes].reverse().find((outcome) => outcome.stepid === step.id);
107
+ if (!latest) return null;
108
+ const samples = Array.isArray(latest.details?.samples) ? latest.details?.samples : [];
109
+ const idle = typeof latest.details?.idle === "number" ? latest.details?.idle : 0;
110
+ const last = samples[samples.length - 1];
111
+ const node = document.createElement("p");
112
+ node.className = "timeline";
113
+ node.textContent = `network quiet: ${samples.length} sample${samples.length === 1 ? "" : "s"} \xB7 quiet for ${Math.round(last?.quietfor ?? 0)} ms \xB7 idle threshold ${idle} ms \xB7 ${latest.ok ? "quiet reached" : "still busy"}`;
114
+ return node;
115
+ }
116
+ function renderpreview(step) {
117
+ const preview = previews.get(step.id);
118
+ if (!preview) return null;
119
+ const node = document.createElement("details");
120
+ node.className = "outcome";
121
+ const summary = document.createElement("summary");
122
+ summary.textContent = `preview: ${preview.summary}`;
123
+ node.append(summary);
124
+ if (preview.resolvedtarget) {
125
+ const payload = document.createElement("pre");
126
+ payload.textContent = JSON.stringify(preview.resolvedtarget, null, 2);
127
+ node.append(payload);
128
+ }
129
+ if (preview.candidates && preview.candidates.length > 1) {
130
+ const chooser = document.createElement("p");
131
+ chooser.textContent = "Ambiguous resolution; choose one candidate as the target hint:";
132
+ node.append(chooser);
133
+ for (const candidate of preview.candidates) {
134
+ node.append(" ", button(`Choose "${candidate}"`, async () => {
135
+ pickhint(`target hint: ${candidate}`);
136
+ }));
137
+ }
138
+ }
139
+ return node;
140
+ }
141
+ function stepitem(plan, step, completed, outcomes, retries) {
142
+ const item = document.createElement("li");
143
+ const done = completed.includes(step.id);
144
+ item.textContent = `${done ? "\u2713" : ""} ${step.summary}${holddetail(step)}`;
145
+ const outcome = renderoutcome(step, outcomes);
146
+ if (outcome) item.append(outcome);
147
+ const timeline = step.kind === "retryaction" ? retrydetail(step, retries) : quietdetail(step, outcomes);
148
+ if (timeline) item.append(timeline);
149
+ const preview = renderpreview(step);
150
+ if (preview) item.append(preview);
151
+ const hastarget = Boolean(step.target) || options(step).targetref !== void 0;
152
+ if (!done && hastarget && previewkinds.includes(step.kind) && ["pending", "approved"].includes(plan.state)) item.append(" ", button("Preview current target", async () => {
153
+ const result = await request({ kind: "preview", stepid: step.id });
154
+ previews.set(step.id, result);
155
+ status(result.summary);
156
+ await refresh();
157
+ }));
158
+ if (!done && plan.state === "approved") item.append(" ", button("Run this reviewed step", async () => {
159
+ const result = await request({ kind: "execute", stepid: step.id });
160
+ status(result.summary);
161
+ await refresh();
162
+ }));
163
+ return item;
164
+ }
165
+ function steplist(plan, steps, completed, outcomes, retries, risk) {
55
166
  const group = steps.filter((step) => step.risk === risk);
56
167
  if (group.length === 0) return null;
57
168
  const section = document.createElement("section");
58
169
  const heading = document.createElement("h3");
59
170
  heading.textContent = `${risk} steps`;
60
171
  section.append(heading);
61
- const list = document.createElement("ol");
62
- for (const step of group) {
63
- const item = document.createElement("li");
64
- const done = completed.includes(step.id);
65
- item.textContent = `${done ? "\u2713" : ""} ${step.summary}`;
66
- const outcome = renderoutcome(step, outcomes);
67
- if (outcome) item.append(outcome);
68
- if (!done && step.target && previewkinds.includes(step.kind) && ["pending", "approved"].includes(plan.state)) item.append(" ", button("Preview current target", async () => {
69
- const result = await request({ kind: "preview", stepid: step.id });
70
- status(result.summary);
71
- }));
72
- if (!done && plan.state === "approved") item.append(" ", button("Run this reviewed step", async () => {
73
- const result = await request({ kind: "execute", stepid: step.id });
74
- status(result.summary);
75
- await refresh();
76
- }));
77
- list.append(item);
172
+ const general = group.filter((step) => steptopic(step.kind) === void 0);
173
+ if (general.length > 0) {
174
+ const list = document.createElement("ol");
175
+ for (const step of general) list.append(stepitem(plan, step, completed, outcomes, retries));
176
+ section.append(list);
177
+ }
178
+ for (const tag of topictags) {
179
+ const tagged = group.filter((step) => steptopic(step.kind) === tag.topic);
180
+ if (tagged.length === 0) continue;
181
+ const row = document.createElement("h4");
182
+ row.textContent = `${tag.topic} steps`;
183
+ section.append(row);
184
+ const list = document.createElement("ol");
185
+ for (const step of tagged) list.append(stepitem(plan, step, completed, outcomes, retries));
186
+ section.append(list);
78
187
  }
79
- section.append(list);
80
188
  return section;
81
189
  }
82
- function renderplan(plan, progress, outcomes = []) {
190
+ function renderplan(plan, progress, outcomes = [], retries = []) {
83
191
  if (!planroot) return;
84
192
  planroot.replaceChildren();
85
193
  if (!plan) {
@@ -92,9 +200,9 @@ function renderplan(plan, progress, outcomes = []) {
92
200
  planroot.append(title);
93
201
  const completed = progress?.planid === plan.id ? progress.completedsteps : [];
94
202
  renderprogress(plan, completed);
95
- const sensitive = steplist(plan, plan.steps, completed, outcomes, "sensitive");
96
- const interaction = steplist(plan, plan.steps, completed, outcomes, "interaction");
97
- const read = steplist(plan, plan.steps, completed, outcomes, "read");
203
+ const sensitive = steplist(plan, plan.steps, completed, outcomes, retries, "sensitive");
204
+ const interaction = steplist(plan, plan.steps, completed, outcomes, retries, "interaction");
205
+ const read = steplist(plan, plan.steps, completed, outcomes, retries, "read");
98
206
  for (const group of [sensitive, interaction, read]) if (group) planroot.append(group);
99
207
  if (plan.state === "pending") {
100
208
  planroot.append(button("Approve reviewed plan", async () => {
@@ -111,6 +219,187 @@ function renderplan(plan, progress, outcomes = []) {
111
219
  planroot.append(note);
112
220
  }
113
221
  }
222
+ function pickhint(hint) {
223
+ if (objective) objective.value = objective.value ? `${objective.value}
224
+ ${hint}` : hint;
225
+ status(`${hint} recorded as the target hint for the next plan.`);
226
+ }
227
+ function rendermap(map) {
228
+ if (!maproot) return;
229
+ maproot.replaceChildren();
230
+ if (!map || map.entries.length === 0) {
231
+ maproot.textContent = "Run a mapclicks step to number every clickable element on the page.";
232
+ return;
233
+ }
234
+ for (const entry of map.entries) {
235
+ const item = document.createElement("li");
236
+ const pick = document.createElement("button");
237
+ pick.type = "button";
238
+ pick.textContent = `${entry.number}. ${entry.label || entry.selector} (${entry.role})`;
239
+ pick.addEventListener("click", () => pickhint(`target hint: ${entry.selector} (map entry ${entry.number}, ${entry.label || entry.role})`));
240
+ item.append(pick);
241
+ maproot.append(item);
242
+ }
243
+ }
244
+ function rendera11y(capture) {
245
+ if (!a11yroot) return;
246
+ a11yroot.replaceChildren();
247
+ if (!capture) {
248
+ a11yroot.textContent = "Run an a11ytree step to capture the accessibility tree beside the dom snapshot.";
249
+ return;
250
+ }
251
+ const lines = [];
252
+ const walk = (node, depth) => {
253
+ if (lines.length >= 80) return;
254
+ const states = node.states.length > 0 ? ` [${node.states.join(", ")}]` : "";
255
+ const value = node.value !== void 0 ? ` = ${node.value}` : "";
256
+ lines.push(`${"\xB7 ".repeat(depth)}${node.role}: ${node.name || "(unnamed)"}${states}${value}`);
257
+ for (const child of node.children) walk(child, depth + 1);
258
+ };
259
+ walk(capture.tree, 0);
260
+ const payload = document.createElement("pre");
261
+ payload.textContent = lines.join("\n");
262
+ a11yroot.append(payload);
263
+ }
264
+ function renderreader(capture) {
265
+ if (!readerroot) return;
266
+ readerroot.replaceChildren();
267
+ if (!capture) {
268
+ readerroot.textContent = "Run a readertree step to extract the reader view.";
269
+ return;
270
+ }
271
+ const title = document.createElement("p");
272
+ title.textContent = `${capture.article.title || "Untitled"}${capture.article.byline ? ` \xB7 ${capture.article.byline}` : ""} \xB7 ${capture.article.words} words \xB7 ${capture.article.blocks.length} blocks`;
273
+ readerroot.append(title);
274
+ for (const block of capture.article.blocks.slice(0, 40)) {
275
+ const line = document.createElement("p");
276
+ line.className = /^h\d$/.test(block.kind) ? "readerblock heading" : "readerblock";
277
+ line.textContent = `${block.kind}: ${block.text.slice(0, 200)}`;
278
+ readerroot.append(line);
279
+ }
280
+ }
281
+ function renderdetections(plan, outcomes) {
282
+ if (!detectionsroot) return;
283
+ detectionsroot.replaceChildren();
284
+ if (!plan) {
285
+ detectionsroot.textContent = "Detection steps list their detected lists, tables and pagination shapes here as suggestions.";
286
+ return;
287
+ }
288
+ const kindof = (stepid) => plan.steps.find((step) => step.id === stepid)?.kind;
289
+ const latest = (kind) => [...outcomes].reverse().find((outcome) => outcome.ok && kindof(outcome.stepid) === kind);
290
+ let shown = 0;
291
+ const listoutcome = latest("detectlists");
292
+ const lists = Array.isArray(listoutcome?.details?.lists) ? listoutcome?.details?.lists : [];
293
+ for (const pattern of lists.slice(0, 6)) {
294
+ const item = document.createElement("li");
295
+ const pick = document.createElement("button");
296
+ pick.type = "button";
297
+ pick.textContent = `list of ${pattern.repeat} items \xB7 ${pattern.itemselector}`;
298
+ pick.addEventListener("click", () => pickhint(`target hint: ${pattern.itemselector} (repeated list item of ${pattern.container})`));
299
+ item.append(pick);
300
+ detectionsroot.append(item);
301
+ shown += 1;
302
+ }
303
+ const tableoutcome = latest("detecttables");
304
+ const tables = Array.isArray(tableoutcome?.details?.tables) ? tableoutcome?.details?.tables : [];
305
+ for (const table of tables.slice(0, 6)) {
306
+ const item = document.createElement("li");
307
+ const pick = document.createElement("button");
308
+ pick.type = "button";
309
+ pick.textContent = `table of ${table.rows} rows \xB7 ${table.columns.length} columns \xB7 ${table.selector}`;
310
+ pick.addEventListener("click", () => pickhint(`target hint: ${table.selector} (detected data table)`));
311
+ item.append(pick);
312
+ detectionsroot.append(item);
313
+ shown += 1;
314
+ }
315
+ const paginationoutcome = latest("countpages");
316
+ if (paginationoutcome) {
317
+ const item = document.createElement("li");
318
+ const current = typeof paginationoutcome.details?.current === "number" ? paginationoutcome.details?.current : 0;
319
+ const total = typeof paginationoutcome.details?.total === "number" ? paginationoutcome.details?.total : 0;
320
+ const text = document.createElement("span");
321
+ text.textContent = `pagination: current page ${current} \xB7 estimated total ${total}`;
322
+ item.append(text);
323
+ detectionsroot.append(item);
324
+ shown += 1;
325
+ }
326
+ if (shown === 0) detectionsroot.textContent = "Detected lists, tables and pagination shapes appear here as plan suggestions.";
327
+ }
328
+ function renderstream(mutationevents, focusevents) {
329
+ if (!streamroot) return;
330
+ streamroot.replaceChildren();
331
+ if (mutationevents.length === 0 && focusevents.length === 0) {
332
+ streamroot.textContent = "Watched steps stream their mutation and focus events here.";
333
+ return;
334
+ }
335
+ for (const event of mutationevents.slice(0, 6)) {
336
+ const item = document.createElement("li");
337
+ item.textContent = `${new Date(event.at).toLocaleTimeString()} \xB7 mutation ${event.event} \xB7 ${event.targetpath}`;
338
+ streamroot.append(item);
339
+ }
340
+ for (const event of focusevents.slice(0, 6)) {
341
+ const item = document.createElement("li");
342
+ item.textContent = `${new Date(event.at).toLocaleTimeString()} \xB7 focus ${event.kind} \xB7 ${event.targetpath}`;
343
+ streamroot.append(item);
344
+ }
345
+ }
346
+ function renderdiffs(diffs) {
347
+ if (!diffsroot) return;
348
+ diffsroot.replaceChildren();
349
+ const latest = diffs[0];
350
+ if (!latest) {
351
+ diffsroot.textContent = "Diff two captured observation versions with a diffsnapshots step.";
352
+ return;
353
+ }
354
+ const heading = document.createElement("p");
355
+ heading.textContent = `version ${latest.baseversion} \u2192 ${latest.targetversion}: ${latest.added.length} added \xB7 ${latest.removed.length} removed \xB7 ${latest.changed.length} changed`;
356
+ diffsroot.append(heading);
357
+ const list = document.createElement("ul");
358
+ for (const entry of [...latest.added, ...latest.removed, ...latest.changed].slice(0, 12)) {
359
+ const item = document.createElement("li");
360
+ item.className = `diffrow ${entry.kind}`;
361
+ item.textContent = `${entry.kind} \xB7 ${entry.selector} \xB7 ${entry.summary}`;
362
+ list.append(item);
363
+ }
364
+ diffsroot.append(list);
365
+ }
366
+ function renderbanners(banners) {
367
+ if (!bannersroot) return;
368
+ bannersroot.replaceChildren();
369
+ if (banners.length === 0) {
370
+ bannersroot.textContent = "No consent banner has been observed yet.";
371
+ return;
372
+ }
373
+ for (const banner of banners.slice(0, 3)) {
374
+ const card = document.createElement("div");
375
+ card.className = "bannercard";
376
+ const title = document.createElement("p");
377
+ title.textContent = `${banner.kind} banner detected \u2014 review it before any interaction.`;
378
+ const text = document.createElement("p");
379
+ text.textContent = banner.text.slice(0, 160) || "(no banner text)";
380
+ const controls = document.createElement("p");
381
+ controls.textContent = `controls: ${banner.controls.length > 0 ? banner.controls.join(", ") : "none"}`;
382
+ card.append(title, text, controls);
383
+ bannersroot.append(card);
384
+ }
385
+ }
386
+ function renderselectors(selectors) {
387
+ if (!selectorsroot) return;
388
+ selectorsroot.replaceChildren();
389
+ if (selectors.length === 0) {
390
+ selectorsroot.textContent = "Run a deriveselector step to rank stable selectors.";
391
+ return;
392
+ }
393
+ for (const record of selectors.slice(0, 8)) {
394
+ const item = document.createElement("li");
395
+ const pick = document.createElement("button");
396
+ pick.type = "button";
397
+ pick.textContent = `${record.selector} (${record.strategy} \xB7 stability ${record.score})`;
398
+ pick.addEventListener("click", () => pickhint(`target hint: ${record.selector} (derived ${record.strategy} selector)`));
399
+ item.append(pick);
400
+ selectorsroot.append(item);
401
+ }
402
+ }
114
403
  function rendercapabilities(report) {
115
404
  if (!capabilitiestext) return;
116
405
  if (!report) {
@@ -144,8 +433,16 @@ function renderdiagnostic(report) {
144
433
  }
145
434
  async function refresh() {
146
435
  const context = await request({ kind: "context" });
147
- renderplan(context.plan, context.progress, context.outcomes ?? []);
436
+ renderplan(context.plan, context.progress, context.outcomes ?? [], context.retries ?? []);
148
437
  renderdiagnostic(context.diagnostic);
438
+ rendermap(context.map);
439
+ rendera11y(context.a11y);
440
+ renderreader(context.reader);
441
+ renderdetections(context.plan, context.outcomes ?? []);
442
+ renderstream(context.mutationevents ?? [], context.focusevents ?? []);
443
+ renderdiffs(context.diffs ?? []);
444
+ renderbanners(context.banners ?? []);
445
+ renderselectors(context.selectors ?? []);
149
446
  renderaudit(context.audit);
150
447
  rendercapabilities(context.capabilities);
151
448
  if (context.session?.pausedat) status("Session paused. Reviewed actions are blocked until resume.");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../sidepanel.ts"],
4
- "sourcesContent": ["import type { agentplan, auditevent, capabilityreport, diagnosticreport, planprogress, stepoutcome, toolstep } from \"../types.js\";\n\nconst objective = document.querySelector<HTMLTextAreaElement>(\"#objective\");\nconst localbutton = document.querySelector<HTMLButtonElement>(\"#localplan\");\nconst remotebutton = document.querySelector<HTMLButtonElement>(\"#remoteplan\");\nconst diagnosticbutton = document.querySelector<HTMLButtonElement>(\"#diagnostic\");\nconst planroot = document.querySelector<HTMLElement>(\"#plan\");\nconst auditroot = document.querySelector<HTMLElement>(\"#audit\");\nconst diagnosticroot = document.querySelector<HTMLElement>(\"#diagnostics\");\nconst statusnode = document.querySelector<HTMLElement>(\"#status\");\nconst progressnode = document.querySelector<HTMLProgressElement>(\"#planprogress\");\nconst capabilitiestext = document.querySelector<HTMLElement>(\"#capabilitiestext\");\n\nfunction status(message: string, error = false): void { if (statusnode) { statusnode.textContent = message; statusnode.dataset.state = error ? \"error\" : \"ready\"; } }\nasync function request(message: unknown): Promise<unknown> { const response = await chrome.runtime.sendMessage(message) as { ok: boolean; value?: unknown; error?: string }; if (!response.ok) throw new Error(response.error); return response.value; }\nfunction button(label: string, action: () => Promise<void>, disabled = false): HTMLButtonElement { const element = document.createElement(\"button\"); element.type = \"button\"; element.textContent = label; element.disabled = disabled; element.addEventListener(\"click\", () => action().catch(error => status(error instanceof Error ? error.message : String(error), true))); return element; }\nconst previewkinds = [\"focus\", \"inspect\", \"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\"];\n\n/** Renders plan completion as a live progress ratio. */\nfunction renderprogress(plan: agentplan, completed: string[]): void {\n if (!progressnode) return;\n const total = plan.steps.length || 1;\n progressnode.max = total;\n progressnode.value = completed.length;\n progressnode.textContent = `${completed.length} of ${plan.steps.length} reviewed steps executed`;\n}\n\n/** Renders the latest structured outcome of one step beside its review entry. */\nfunction renderoutcome(step: toolstep, outcomes: stepoutcome[]): HTMLElement | null {\n const outcome = [...outcomes].reverse().find(item => item.stepid === step.id && item.ok) ?? [...outcomes].reverse().find(item => item.stepid === step.id);\n if (!outcome) return null;\n const node = document.createElement(\"details\");\n node.className = \"outcome\";\n const summary = document.createElement(\"summary\");\n summary.textContent = `${outcome.ok ? \"result\" : \"failure\"}: ${outcome.summary}`;\n node.append(summary);\n if (outcome.details && Object.keys(outcome.details).length > 0) {\n const payload = document.createElement(\"pre\");\n payload.textContent = JSON.stringify(outcome.details, null, 2).slice(0, 4000);\n node.append(payload);\n }\n return node;\n}\n\nfunction steplist(plan: agentplan, steps: toolstep[], completed: string[], outcomes: stepoutcome[], risk: toolstep[\"risk\"]): HTMLElement | null {\n const group = steps.filter(step => step.risk === risk);\n if (group.length === 0) return null;\n const section = document.createElement(\"section\");\n const heading = document.createElement(\"h3\");\n heading.textContent = `${risk} steps`;\n section.append(heading);\n const list = document.createElement(\"ol\");\n for (const step of group) {\n const item = document.createElement(\"li\");\n const done = completed.includes(step.id);\n item.textContent = `${done ? \"\u2713\" : \"\"} ${step.summary}`;\n const outcome = renderoutcome(step, outcomes);\n if (outcome) item.append(outcome);\n if (!done && step.target && previewkinds.includes(step.kind) && [\"pending\", \"approved\"].includes(plan.state)) item.append(\" \", button(\"Preview current target\", async () => { const result = await request({ kind: \"preview\", stepid: step.id }) as { summary: string }; status(result.summary); }));\n if (!done && plan.state === \"approved\") item.append(\" \", button(\"Run this reviewed step\", async () => { const result = await request({ kind: \"execute\", stepid: step.id }) as { summary: string }; status(result.summary); await refresh(); }));\n list.append(item);\n }\n section.append(list);\n return section;\n}\n\nfunction renderplan(plan?: agentplan, progress?: planprogress, outcomes: stepoutcome[] = []): void {\n if (!planroot) return;\n planroot.replaceChildren();\n if (!plan) { planroot.textContent = \"Start a session, then request a local or endpoint plan. No task runs before review.\"; if (progressnode) progressnode.value = 0; return; }\n const title = document.createElement(\"h2\"); title.textContent = `${plan.state}: ${plan.objective}`; planroot.append(title);\n const completed = progress?.planid === plan.id ? progress.completedsteps : [];\n renderprogress(plan, completed);\n const sensitive = steplist(plan, plan.steps, completed, outcomes, \"sensitive\");\n const interaction = steplist(plan, plan.steps, completed, outcomes, \"interaction\");\n const read = steplist(plan, plan.steps, completed, outcomes, \"read\");\n for (const group of [sensitive, interaction, read]) if (group) planroot.append(group);\n if (plan.state === \"pending\") { planroot.append(button(\"Approve reviewed plan\", async () => { await request({ kind: \"approve\" }); await refresh(); }), button(\"Reject plan\", async () => { await request({ kind: \"reject\" }); await refresh(); })); }\n if (plan.state === \"completed\" && plan.completedat) { const note = document.createElement(\"p\"); note.textContent = \"Every reviewed step has executed and the plan is closed.\"; planroot.append(note); }\n}\n\nfunction rendercapabilities(report?: capabilityreport): void {\n if (!capabilitiestext) return;\n if (!report) { capabilitiestext.textContent = \"Optional capabilities unknown.\"; return; }\n capabilitiestext.textContent = `tabs ${report.tabs ? \"granted\" : \"absent\"} \u00B7 downloads ${report.downloads ? \"granted\" : \"absent\"} \u00B7 clipboard read ${report.clipboardread ? \"granted\" : \"absent\"} \u00B7 clipboard write ${report.clipboardwrite ? \"granted\" : \"absent\"}`;\n}\n\nfunction renderaudit(events: auditevent[]): void { if (!auditroot) return; auditroot.replaceChildren(); for (const event of events.slice(0, 12)) { const item = document.createElement(\"li\"); item.textContent = `${new Date(event.at).toLocaleTimeString()} \u00B7 ${event.kind} \u00B7 ${event.summary}`; auditroot.append(item); } }\nfunction renderdiagnostic(report?: diagnosticreport): void { if (!diagnosticroot) return; diagnosticroot.replaceChildren(); if (!report) { diagnosticroot.textContent = \"Run a local diagnostic after starting a session to record bridge and page-shape health.\"; return; } const values = [`origin: ${report.origin}`, `title: ${report.title || \"untitled\"}`, `interactive elements: ${report.interactivecount}`, `forms: ${report.formcount}`, `page text length: ${report.textlength}`, `bridge available: ${report.bridgeavailable ? \"yes\" : \"no\"}`]; for (const value of values) { const item = document.createElement(\"li\"); item.textContent = value; diagnosticroot.append(item); } }\nasync function refresh(): Promise<void> { const context = await request({ kind: \"context\" }) as { plan?: agentplan; progress?: planprogress; diagnostic?: diagnosticreport; audit: auditevent[]; outcomes?: stepoutcome[]; capabilities?: capabilityreport; session?: { id: string; pausedat?: number } }; renderplan(context.plan, context.progress, context.outcomes ?? []); renderdiagnostic(context.diagnostic); renderaudit(context.audit); rendercapabilities(context.capabilities); if (context.session?.pausedat) status(\"Session paused. Reviewed actions are blocked until resume.\"); else status(context.session ? \"Active session is visible. The extension is waiting for review.\" : \"No active browser session.\"); }\nasync function create(kind: \"proposelocal\" | \"proposeremote\"): Promise<void> { await request({ kind, objective: objective?.value ?? \"\" }); await refresh(); }\nlocalbutton?.addEventListener(\"click\", () => create(\"proposelocal\").catch(error => status(error instanceof Error ? error.message : String(error), true)));\nremotebutton?.addEventListener(\"click\", () => create(\"proposeremote\").catch(error => status(error instanceof Error ? error.message : String(error), true)));\ndiagnosticbutton?.addEventListener(\"click\", () => request({ kind: \"diagnostic\" }).then(() => refresh()).catch(error => status(error instanceof Error ? error.message : String(error), true)));\nrefresh().catch(error => status(error instanceof Error ? error.message : String(error), true));\n"],
5
- "mappings": ";AAEA,IAAM,YAAY,SAAS,cAAmC,YAAY;AAC1E,IAAM,cAAc,SAAS,cAAiC,YAAY;AAC1E,IAAM,eAAe,SAAS,cAAiC,aAAa;AAC5E,IAAM,mBAAmB,SAAS,cAAiC,aAAa;AAChF,IAAM,WAAW,SAAS,cAA2B,OAAO;AAC5D,IAAM,YAAY,SAAS,cAA2B,QAAQ;AAC9D,IAAM,iBAAiB,SAAS,cAA2B,cAAc;AACzE,IAAM,aAAa,SAAS,cAA2B,SAAS;AAChE,IAAM,eAAe,SAAS,cAAmC,eAAe;AAChF,IAAM,mBAAmB,SAAS,cAA2B,mBAAmB;AAEhF,SAAS,OAAO,SAAiB,QAAQ,OAAa;AAAE,MAAI,YAAY;AAAE,eAAW,cAAc;AAAS,eAAW,QAAQ,QAAQ,QAAQ,UAAU;AAAA,EAAS;AAAE;AACpK,eAAe,QAAQ,SAAoC;AAAE,QAAM,WAAW,MAAM,OAAO,QAAQ,YAAY,OAAO;AAAuD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,SAAS,KAAK;AAAG,SAAO,SAAS;AAAO;AACvP,SAAS,OAAO,OAAe,QAA6B,WAAW,OAA0B;AAAE,QAAM,UAAU,SAAS,cAAc,QAAQ;AAAG,UAAQ,OAAO;AAAU,UAAQ,cAAc;AAAO,UAAQ,WAAW;AAAU,UAAQ,iBAAiB,SAAS,MAAM,OAAO,EAAE,MAAM,WAAS,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC;AAAG,SAAO;AAAS;AAChY,IAAM,eAAe,CAAC,SAAS,WAAW,SAAS,QAAQ,UAAU,UAAU,SAAS,aAAa,cAAc,eAAe,QAAQ,QAAQ,UAAU,SAAS,SAAS,WAAW,UAAU,UAAU,iBAAiB,aAAa,gBAAgB,aAAa,YAAY,YAAY,iBAAiB,aAAa,aAAa,gBAAgB,mBAAmB,SAAS;AAGvX,SAAS,eAAe,MAAiB,WAA2B;AAClE,MAAI,CAAC,aAAc;AACnB,QAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,eAAa,MAAM;AACnB,eAAa,QAAQ,UAAU;AAC/B,eAAa,cAAc,GAAG,UAAU,MAAM,OAAO,KAAK,MAAM,MAAM;AACxE;AAGA,SAAS,cAAc,MAAgB,UAA6C;AAClF,QAAM,UAAU,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,UAAQ,KAAK,WAAW,KAAK,MAAM,KAAK,EAAE,KAAK,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,UAAQ,KAAK,WAAW,KAAK,EAAE;AACxJ,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,OAAO,SAAS,cAAc,SAAS;AAC7C,OAAK,YAAY;AACjB,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,cAAc,GAAG,QAAQ,KAAK,WAAW,SAAS,KAAK,QAAQ,OAAO;AAC9E,OAAK,OAAO,OAAO;AACnB,MAAI,QAAQ,WAAW,OAAO,KAAK,QAAQ,OAAO,EAAE,SAAS,GAAG;AAC9D,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,cAAc,KAAK,UAAU,QAAQ,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,GAAI;AAC5E,SAAK,OAAO,OAAO;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAiB,OAAmB,WAAqB,UAAyB,MAA4C;AAC9I,QAAM,QAAQ,MAAM,OAAO,UAAQ,KAAK,SAAS,IAAI;AACrD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,cAAc,GAAG,IAAI;AAC7B,UAAQ,OAAO,OAAO;AACtB,QAAM,OAAO,SAAS,cAAc,IAAI;AACxC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,UAAM,OAAO,UAAU,SAAS,KAAK,EAAE;AACvC,SAAK,cAAc,GAAG,OAAO,WAAM,EAAE,IAAI,KAAK,OAAO;AACrD,UAAM,UAAU,cAAc,MAAM,QAAQ;AAC5C,QAAI,QAAS,MAAK,OAAO,OAAO;AAChC,QAAI,CAAC,QAAQ,KAAK,UAAU,aAAa,SAAS,KAAK,IAAI,KAAK,CAAC,WAAW,UAAU,EAAE,SAAS,KAAK,KAAK,EAAG,MAAK,OAAO,KAAK,OAAO,0BAA0B,YAAY;AAAE,YAAM,SAAS,MAAM,QAAQ,EAAE,MAAM,WAAW,QAAQ,KAAK,GAAG,CAAC;AAA0B,aAAO,OAAO,OAAO;AAAA,IAAG,CAAC,CAAC;AACnS,QAAI,CAAC,QAAQ,KAAK,UAAU,WAAY,MAAK,OAAO,KAAK,OAAO,0BAA0B,YAAY;AAAE,YAAM,SAAS,MAAM,QAAQ,EAAE,MAAM,WAAW,QAAQ,KAAK,GAAG,CAAC;AAA0B,aAAO,OAAO,OAAO;AAAG,YAAM,QAAQ;AAAA,IAAG,CAAC,CAAC;AAC9O,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,UAAQ,OAAO,IAAI;AACnB,SAAO;AACT;AAEA,SAAS,WAAW,MAAkB,UAAyB,WAA0B,CAAC,GAAS;AACjG,MAAI,CAAC,SAAU;AACf,WAAS,gBAAgB;AACzB,MAAI,CAAC,MAAM;AAAE,aAAS,cAAc;AAAuF,QAAI,aAAc,cAAa,QAAQ;AAAG;AAAA,EAAQ;AAC7K,QAAM,QAAQ,SAAS,cAAc,IAAI;AAAG,QAAM,cAAc,GAAG,KAAK,KAAK,KAAK,KAAK,SAAS;AAAI,WAAS,OAAO,KAAK;AACzH,QAAM,YAAY,UAAU,WAAW,KAAK,KAAK,SAAS,iBAAiB,CAAC;AAC5E,iBAAe,MAAM,SAAS;AAC9B,QAAM,YAAY,SAAS,MAAM,KAAK,OAAO,WAAW,UAAU,WAAW;AAC7E,QAAM,cAAc,SAAS,MAAM,KAAK,OAAO,WAAW,UAAU,aAAa;AACjF,QAAM,OAAO,SAAS,MAAM,KAAK,OAAO,WAAW,UAAU,MAAM;AACnE,aAAW,SAAS,CAAC,WAAW,aAAa,IAAI,EAAG,KAAI,MAAO,UAAS,OAAO,KAAK;AACpF,MAAI,KAAK,UAAU,WAAW;AAAE,aAAS,OAAO,OAAO,yBAAyB,YAAY;AAAE,YAAM,QAAQ,EAAE,MAAM,UAAU,CAAC;AAAG,YAAM,QAAQ;AAAA,IAAG,CAAC,GAAG,OAAO,eAAe,YAAY;AAAE,YAAM,QAAQ,EAAE,MAAM,SAAS,CAAC;AAAG,YAAM,QAAQ;AAAA,IAAG,CAAC,CAAC;AAAA,EAAG;AACpP,MAAI,KAAK,UAAU,eAAe,KAAK,aAAa;AAAE,UAAM,OAAO,SAAS,cAAc,GAAG;AAAG,SAAK,cAAc;AAA4D,aAAS,OAAO,IAAI;AAAA,EAAG;AACxM;AAEA,SAAS,mBAAmB,QAAiC;AAC3D,MAAI,CAAC,iBAAkB;AACvB,MAAI,CAAC,QAAQ;AAAE,qBAAiB,cAAc;AAAkC;AAAA,EAAQ;AACxF,mBAAiB,cAAc,QAAQ,OAAO,OAAO,YAAY,QAAQ,mBAAgB,OAAO,YAAY,YAAY,QAAQ,wBAAqB,OAAO,gBAAgB,YAAY,QAAQ,yBAAsB,OAAO,iBAAiB,YAAY,QAAQ;AACpQ;AAEA,SAAS,YAAY,QAA4B;AAAE,MAAI,CAAC,UAAW;AAAQ,YAAU,gBAAgB;AAAG,aAAW,SAAS,OAAO,MAAM,GAAG,EAAE,GAAG;AAAE,UAAM,OAAO,SAAS,cAAc,IAAI;AAAG,SAAK,cAAc,GAAG,IAAI,KAAK,MAAM,EAAE,EAAE,mBAAmB,CAAC,SAAM,MAAM,IAAI,SAAM,MAAM,OAAO;AAAI,cAAU,OAAO,IAAI;AAAA,EAAG;AAAE;AAC5T,SAAS,iBAAiB,QAAiC;AAAE,MAAI,CAAC,eAAgB;AAAQ,iBAAe,gBAAgB;AAAG,MAAI,CAAC,QAAQ;AAAE,mBAAe,cAAc;AAA2F;AAAA,EAAQ;AAAE,QAAM,SAAS,CAAC,WAAW,OAAO,MAAM,IAAI,UAAU,OAAO,SAAS,UAAU,IAAI,yBAAyB,OAAO,gBAAgB,IAAI,UAAU,OAAO,SAAS,IAAI,qBAAqB,OAAO,UAAU,IAAI,qBAAqB,OAAO,kBAAkB,QAAQ,IAAI,EAAE;AAAG,aAAW,SAAS,QAAQ;AAAE,UAAM,OAAO,SAAS,cAAc,IAAI;AAAG,SAAK,cAAc;AAAO,mBAAe,OAAO,IAAI;AAAA,EAAG;AAAE;AAC9pB,eAAe,UAAyB;AAAE,QAAM,UAAU,MAAM,QAAQ,EAAE,MAAM,UAAU,CAAC;AAAgN,aAAW,QAAQ,MAAM,QAAQ,UAAU,QAAQ,YAAY,CAAC,CAAC;AAAG,mBAAiB,QAAQ,UAAU;AAAG,cAAY,QAAQ,KAAK;AAAG,qBAAmB,QAAQ,YAAY;AAAG,MAAI,QAAQ,SAAS,SAAU,QAAO,4DAA4D;AAAA,MAAQ,QAAO,QAAQ,UAAU,oEAAoE,4BAA4B;AAAG;AACjsB,eAAe,OAAO,MAAuD;AAAE,QAAM,QAAQ,EAAE,MAAM,WAAW,WAAW,SAAS,GAAG,CAAC;AAAG,QAAM,QAAQ;AAAG;AAC5J,aAAa,iBAAiB,SAAS,MAAM,OAAO,cAAc,EAAE,MAAM,WAAS,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC;AACxJ,cAAc,iBAAiB,SAAS,MAAM,OAAO,eAAe,EAAE,MAAM,WAAS,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC;AAC1J,kBAAkB,iBAAiB,SAAS,MAAM,QAAQ,EAAE,MAAM,aAAa,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC,EAAE,MAAM,WAAS,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC;AAC5L,QAAQ,EAAE,MAAM,WAAS,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,IAAI,CAAC;",
4
+ "sourcesContent": ["import type { a11ycapture, a11ynode, agentplan, auditevent, bannerreport, capabilityreport, clickablemap, derivedselector, diagnosticreport, focusevent, listpattern, mutationevent, planprogress, readercapture, resolvedtarget, retryoutcome, snapshotdiff, stepoutcome, tableshape, toolstep } from \"../types.js\";\n\nconst objective = document.querySelector<HTMLTextAreaElement>(\"#objective\");\nconst localbutton = document.querySelector<HTMLButtonElement>(\"#localplan\");\nconst remotebutton = document.querySelector<HTMLButtonElement>(\"#remoteplan\");\nconst diagnosticbutton = document.querySelector<HTMLButtonElement>(\"#diagnostic\");\nconst planroot = document.querySelector<HTMLElement>(\"#plan\");\nconst auditroot = document.querySelector<HTMLElement>(\"#audit\");\nconst diagnosticroot = document.querySelector<HTMLElement>(\"#diagnostics\");\nconst maproot = document.querySelector<HTMLElement>(\"#map\");\nconst a11yroot = document.querySelector<HTMLElement>(\"#a11y\");\nconst readerroot = document.querySelector<HTMLElement>(\"#reader\");\nconst detectionsroot = document.querySelector<HTMLElement>(\"#detections\");\nconst streamroot = document.querySelector<HTMLElement>(\"#stream\");\nconst diffsroot = document.querySelector<HTMLElement>(\"#diffs\");\nconst bannersroot = document.querySelector<HTMLElement>(\"#banners\");\nconst selectorsroot = document.querySelector<HTMLElement>(\"#selectors\");\nconst statusnode = document.querySelector<HTMLElement>(\"#status\");\nconst progressnode = document.querySelector<HTMLProgressElement>(\"#planprogress\");\nconst capabilitiestext = document.querySelector<HTMLElement>(\"#capabilitiestext\");\n\ntype previewresult = { ok: boolean; summary: string; resolvedtarget?: resolvedtarget; candidates?: string[] };\nconst previews = new Map<string, previewresult>();\n\n/** Safely reads the reviewed options object of one step. */\nfunction options(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 status(message: string, error = false): void { if (statusnode) { statusnode.textContent = message; statusnode.dataset.state = error ? \"error\" : \"ready\"; } }\nasync function request(message: unknown): Promise<unknown> { const response = await chrome.runtime.sendMessage(message) as { ok: boolean; value?: unknown; error?: string }; if (!response.ok) throw new Error(response.error); return response.value; }\nfunction button(label: string, action: () => Promise<void>, disabled = false): HTMLButtonElement { const element = document.createElement(\"button\"); element.type = \"button\"; element.textContent = label; element.disabled = disabled; element.addEventListener(\"click\", () => action().catch(error => status(error instanceof Error ? error.message : String(error), true))); return element; }\n\n/** Kinds addressable by a css target or a reviewed targetref; only these can be previewed. */\nconst previewkinds = [\"focus\", \"inspect\", \"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\", \"clickpoint\", \"clicktext\", \"clickaria\", \"clickname\", \"resolvexpath\", \"deriveselector\", \"fingerprintsection\"];\n\n/** Topic rows that group the new interaction and observation kinds inside each risk class. */\nconst topictags: Array<{ topic: string; kinds: string[] }> = [\n { topic: \"pointer\", kinds: [\"movepointer\", \"clickpoint\", \"shiftclick\", \"clicktext\", \"clickaria\", \"clickname\", \"pierceshadow\"] },\n { topic: \"typing\", kinds: [\"typetime\", \"appendtext\", \"setvalue\", \"typeedit\", \"submitsearch\"] },\n { topic: \"keys\", kinds: [\"keyhold\", \"keyrelease\"] },\n { topic: \"controls\", kinds: [\"selectmulti\", \"chooseradio\", \"setslider\", \"setdate\", \"setcolor\", \"expanddetails\"] },\n { topic: \"dialogs\", kinds: [\"dismissdialog\"] },\n { topic: \"frames\", kinds: [\"enterframe\"] },\n { topic: \"retry\", kinds: [\"retryaction\"] },\n { topic: \"reads\", kinds: [\"mapclicks\", \"verifyvisible\", \"verifyenabled\", \"resolvexpath\"] },\n { topic: \"observation\", kinds: [\"a11ytree\", \"readvisible\", \"readertree\", \"readoutline\", \"readselection\", \"readopengraph\", \"readlang\", \"detectlanguage\", \"listshadow\", \"listframes\", \"readscrollpos\"] },\n { topic: \"detection\", kinds: [\"detectlists\", \"detecttables\", \"detectinfinitescroll\", \"detectvirtual\", \"detectlazy\", \"detectsticky\", \"detectscrolllock\", \"countpages\", \"classifypage\", \"fingerprintsection\"] },\n { topic: \"watch\", kinds: [\"watchmutate\", \"watchbanner\", \"watchfocus\", \"waitquiet\", \"readjson\", \"diffsnapshots\", \"deriveselector\"] },\n];\n\nfunction steptopic(kind: string): string | undefined {\n return topictags.find(tag => tag.kinds.includes(kind))?.topic;\n}\n\n/** Renders plan completion as a live progress ratio. */\nfunction renderprogress(plan: agentplan, completed: string[]): void {\n if (!progressnode) return;\n const total = plan.steps.length || 1;\n progressnode.max = total;\n progressnode.value = completed.length;\n progressnode.textContent = `${completed.length} of ${plan.steps.length} reviewed steps executed`;\n}\n\n/** Renders the latest structured outcome of one step beside its review entry. */\nfunction renderoutcome(step: toolstep, outcomes: stepoutcome[]): HTMLElement | null {\n const outcome = [...outcomes].reverse().find(item => item.stepid === step.id && item.ok) ?? [...outcomes].reverse().find(item => item.stepid === step.id);\n if (!outcome) return null;\n const node = document.createElement(\"details\");\n node.className = \"outcome\";\n const summary = document.createElement(\"summary\");\n summary.textContent = `${outcome.ok ? \"result\" : \"failure\"}: ${outcome.summary}`;\n node.append(summary);\n if (outcome.details && Object.keys(outcome.details).length > 0) {\n const payload = document.createElement(\"pre\");\n payload.textContent = JSON.stringify(outcome.details, null, 2).slice(0, 4000);\n node.append(payload);\n }\n return node;\n}\n\n/** Renders the hold id of a key hold or release step beside its summary. */\nfunction holddetail(step: toolstep): string {\n if (step.kind === \"keyhold\") {\n const holdid = options(step).holdid;\n return typeof holdid === \"string\" && holdid ? ` \u00B7 hold id ${holdid}` : \"\";\n }\n if (step.kind === \"keyrelease\") return step.value ? ` \u00B7 releases hold id ${step.value}` : \"\";\n return \"\";\n}\n\n/** Renders the retry attempts of one retry step on the step timeline. */\nfunction retrydetail(step: toolstep, retries: retryoutcome[]): HTMLElement | null {\n const latest = [...retries].reverse().find(item => item.stepid === step.id);\n if (!latest) return null;\n const node = document.createElement(\"p\");\n node.className = \"timeline\";\n node.textContent = `retry timeline: ${latest.attempts} attempt${latest.attempts === 1 ? \"\" : \"s\"} \u00B7 ${latest.movement.toFixed(1)} px movement \u00B7 ${latest.ok ? \"succeeded\" : \"failed\"}`;\n return node;\n}\n\n/** Renders the network quiet progress of one waitquiet step from its outcome evidence. */\nfunction quietdetail(step: toolstep, outcomes: stepoutcome[]): HTMLElement | null {\n if (step.kind !== \"waitquiet\") return null;\n const latest = [...outcomes].reverse().find(outcome => outcome.stepid === step.id);\n if (!latest) return null;\n const samples = Array.isArray(latest.details?.samples) ? latest.details?.samples as Array<{ at: number; quietfor: number }> : [];\n const idle = typeof latest.details?.idle === \"number\" ? latest.details?.idle : 0;\n const last = samples[samples.length - 1];\n const node = document.createElement(\"p\");\n node.className = \"timeline\";\n node.textContent = `network quiet: ${samples.length} sample${samples.length === 1 ? \"\" : \"s\"} \u00B7 quiet for ${Math.round(last?.quietfor ?? 0)} ms \u00B7 idle threshold ${idle} ms \u00B7 ${latest.ok ? \"quiet reached\" : \"still busy\"}`;\n return node;\n}\n\n/** Renders the resolved target details of one previewed interaction step before approval. */\nfunction renderpreview(step: toolstep): HTMLElement | null {\n const preview = previews.get(step.id);\n if (!preview) return null;\n const node = document.createElement(\"details\");\n node.className = \"outcome\";\n const summary = document.createElement(\"summary\");\n summary.textContent = `preview: ${preview.summary}`;\n node.append(summary);\n if (preview.resolvedtarget) {\n const payload = document.createElement(\"pre\");\n payload.textContent = JSON.stringify(preview.resolvedtarget, null, 2);\n node.append(payload);\n }\n if (preview.candidates && preview.candidates.length > 1) {\n const chooser = document.createElement(\"p\");\n chooser.textContent = \"Ambiguous resolution; choose one candidate as the target hint:\";\n node.append(chooser);\n for (const candidate of preview.candidates) {\n node.append(\" \", button(`Choose \"${candidate}\"`, async () => { pickhint(`target hint: ${candidate}`); }));\n }\n }\n return node;\n}\n\nfunction stepitem(plan: agentplan, step: toolstep, completed: string[], outcomes: stepoutcome[], retries: retryoutcome[]): HTMLLIElement {\n const item = document.createElement(\"li\");\n const done = completed.includes(step.id);\n item.textContent = `${done ? \"\u2713\" : \"\"} ${step.summary}${holddetail(step)}`;\n const outcome = renderoutcome(step, outcomes);\n if (outcome) item.append(outcome);\n const timeline = step.kind === \"retryaction\" ? retrydetail(step, retries) : quietdetail(step, outcomes);\n if (timeline) item.append(timeline);\n const preview = renderpreview(step);\n if (preview) item.append(preview);\n const hastarget = Boolean(step.target) || options(step).targetref !== undefined;\n if (!done && hastarget && previewkinds.includes(step.kind) && [\"pending\", \"approved\"].includes(plan.state)) item.append(\" \", button(\"Preview current target\", async () => { const result = await request({ kind: \"preview\", stepid: step.id }) as previewresult; previews.set(step.id, result); status(result.summary); await refresh(); }));\n if (!done && plan.state === \"approved\") item.append(\" \", button(\"Run this reviewed step\", async () => { const result = await request({ kind: \"execute\", stepid: step.id }) as { summary: string }; status(result.summary); await refresh(); }));\n return item;\n}\n\nfunction steplist(plan: agentplan, steps: toolstep[], completed: string[], outcomes: stepoutcome[], retries: retryoutcome[], risk: toolstep[\"risk\"]): HTMLElement | null {\n const group = steps.filter(step => step.risk === risk);\n if (group.length === 0) return null;\n const section = document.createElement(\"section\");\n const heading = document.createElement(\"h3\");\n heading.textContent = `${risk} steps`;\n section.append(heading);\n const general = group.filter(step => steptopic(step.kind) === undefined);\n if (general.length > 0) {\n const list = document.createElement(\"ol\");\n for (const step of general) list.append(stepitem(plan, step, completed, outcomes, retries));\n section.append(list);\n }\n for (const tag of topictags) {\n const tagged = group.filter(step => steptopic(step.kind) === tag.topic);\n if (tagged.length === 0) continue;\n const row = document.createElement(\"h4\");\n row.textContent = `${tag.topic} steps`;\n section.append(row);\n const list = document.createElement(\"ol\");\n for (const step of tagged) list.append(stepitem(plan, step, completed, outcomes, retries));\n section.append(list);\n }\n return section;\n}\n\nfunction renderplan(plan?: agentplan, progress?: planprogress, outcomes: stepoutcome[] = [], retries: retryoutcome[] = []): void {\n if (!planroot) return;\n planroot.replaceChildren();\n if (!plan) { planroot.textContent = \"Start a session, then request a local or endpoint plan. No task runs before review.\"; if (progressnode) progressnode.value = 0; return; }\n const title = document.createElement(\"h2\"); title.textContent = `${plan.state}: ${plan.objective}`; planroot.append(title);\n const completed = progress?.planid === plan.id ? progress.completedsteps : [];\n renderprogress(plan, completed);\n const sensitive = steplist(plan, plan.steps, completed, outcomes, retries, \"sensitive\");\n const interaction = steplist(plan, plan.steps, completed, outcomes, retries, \"interaction\");\n const read = steplist(plan, plan.steps, completed, outcomes, retries, \"read\");\n for (const group of [sensitive, interaction, read]) if (group) planroot.append(group);\n if (plan.state === \"pending\") { planroot.append(button(\"Approve reviewed plan\", async () => { await request({ kind: \"approve\" }); await refresh(); }), button(\"Reject plan\", async () => { await request({ kind: \"reject\" }); await refresh(); })); }\n if (plan.state === \"completed\" && plan.completedat) { const note = document.createElement(\"p\"); note.textContent = \"Every reviewed step has executed and the plan is closed.\"; planroot.append(note); }\n}\n\n/** Records one clickable map entry or candidate as the target hint for the next plan. */\nfunction pickhint(hint: string): void {\n if (objective) objective.value = objective.value ? `${objective.value}\\n${hint}` : hint;\n status(`${hint} recorded as the target hint for the next plan.`);\n}\n\n/** Renders the clickable map as a numbered list beside the plan and lets the user pick entries. */\nfunction rendermap(map?: clickablemap): void {\n if (!maproot) return;\n maproot.replaceChildren();\n if (!map || map.entries.length === 0) { maproot.textContent = \"Run a mapclicks step to number every clickable element on the page.\"; return; }\n for (const entry of map.entries) {\n const item = document.createElement(\"li\");\n const pick = document.createElement(\"button\");\n pick.type = \"button\";\n pick.textContent = `${entry.number}. ${entry.label || entry.selector} (${entry.role})`;\n pick.addEventListener(\"click\", () => pickhint(`target hint: ${entry.selector} (map entry ${entry.number}, ${entry.label || entry.role})`));\n item.append(pick);\n maproot.append(item);\n }\n}\n\n/** Renders the latest accessibility tree beside the dom snapshot as indented role lines. */\nfunction rendera11y(capture?: a11ycapture): void {\n if (!a11yroot) return;\n a11yroot.replaceChildren();\n if (!capture) { a11yroot.textContent = \"Run an a11ytree step to capture the accessibility tree beside the dom snapshot.\"; return; }\n const lines: string[] = [];\n const walk = (node: a11ynode, depth: number): void => {\n if (lines.length >= 80) return;\n const states = node.states.length > 0 ? ` [${node.states.join(\", \")}]` : \"\";\n const value = node.value !== undefined ? ` = ${node.value}` : \"\";\n lines.push(`${\"\u00B7 \".repeat(depth)}${node.role}: ${node.name || \"(unnamed)\"}${states}${value}`);\n for (const child of node.children) walk(child, depth + 1);\n };\n walk(capture.tree, 0);\n const payload = document.createElement(\"pre\");\n payload.textContent = lines.join(\"\\n\");\n a11yroot.append(payload);\n}\n\n/** Renders the latest reader view text with heading blocks highlighted. */\nfunction renderreader(capture?: readercapture): void {\n if (!readerroot) return;\n readerroot.replaceChildren();\n if (!capture) { readerroot.textContent = \"Run a readertree step to extract the reader view.\"; return; }\n const title = document.createElement(\"p\");\n title.textContent = `${capture.article.title || \"Untitled\"}${capture.article.byline ? ` \u00B7 ${capture.article.byline}` : \"\"} \u00B7 ${capture.article.words} words \u00B7 ${capture.article.blocks.length} blocks`;\n readerroot.append(title);\n for (const block of capture.article.blocks.slice(0, 40)) {\n const line = document.createElement(\"p\");\n line.className = /^h\\d$/.test(block.kind) ? \"readerblock heading\" : \"readerblock\";\n line.textContent = `${block.kind}: ${block.text.slice(0, 200)}`;\n readerroot.append(line);\n }\n}\n\n/** Shows detected lists, tables and pagination shapes as plan suggestions the user can pick. */\nfunction renderdetections(plan: agentplan | undefined, outcomes: stepoutcome[]): void {\n if (!detectionsroot) return;\n detectionsroot.replaceChildren();\n if (!plan) { detectionsroot.textContent = \"Detection steps list their detected lists, tables and pagination shapes here as suggestions.\"; return; }\n const kindof = (stepid: string): string | undefined => plan.steps.find(step => step.id === stepid)?.kind;\n const latest = (kind: string): stepoutcome | undefined => [...outcomes].reverse().find(outcome => outcome.ok && kindof(outcome.stepid) === kind);\n let shown = 0;\n const listoutcome = latest(\"detectlists\");\n const lists = Array.isArray(listoutcome?.details?.lists) ? listoutcome?.details?.lists as listpattern[] : [];\n for (const pattern of lists.slice(0, 6)) {\n const item = document.createElement(\"li\");\n const pick = document.createElement(\"button\");\n pick.type = \"button\";\n pick.textContent = `list of ${pattern.repeat} items \u00B7 ${pattern.itemselector}`;\n pick.addEventListener(\"click\", () => pickhint(`target hint: ${pattern.itemselector} (repeated list item of ${pattern.container})`));\n item.append(pick);\n detectionsroot.append(item);\n shown += 1;\n }\n const tableoutcome = latest(\"detecttables\");\n const tables = Array.isArray(tableoutcome?.details?.tables) ? tableoutcome?.details?.tables as tableshape[] : [];\n for (const table of tables.slice(0, 6)) {\n const item = document.createElement(\"li\");\n const pick = document.createElement(\"button\");\n pick.type = \"button\";\n pick.textContent = `table of ${table.rows} rows \u00B7 ${table.columns.length} columns \u00B7 ${table.selector}`;\n pick.addEventListener(\"click\", () => pickhint(`target hint: ${table.selector} (detected data table)`));\n item.append(pick);\n detectionsroot.append(item);\n shown += 1;\n }\n const paginationoutcome = latest(\"countpages\");\n if (paginationoutcome) {\n const item = document.createElement(\"li\");\n const current = typeof paginationoutcome.details?.current === \"number\" ? paginationoutcome.details?.current : 0;\n const total = typeof paginationoutcome.details?.total === \"number\" ? paginationoutcome.details?.total : 0;\n const text = document.createElement(\"span\");\n text.textContent = `pagination: current page ${current} \u00B7 estimated total ${total}`;\n item.append(text);\n detectionsroot.append(item);\n shown += 1;\n }\n if (shown === 0) detectionsroot.textContent = \"Detected lists, tables and pagination shapes appear here as plan suggestions.\";\n}\n\n/** Shows the live mutation and focus stream observed during watched steps. */\nfunction renderstream(mutationevents: mutationevent[], focusevents: focusevent[]): void {\n if (!streamroot) return;\n streamroot.replaceChildren();\n if (mutationevents.length === 0 && focusevents.length === 0) { streamroot.textContent = \"Watched steps stream their mutation and focus events here.\"; return; }\n for (const event of mutationevents.slice(0, 6)) {\n const item = document.createElement(\"li\");\n item.textContent = `${new Date(event.at).toLocaleTimeString()} \u00B7 mutation ${event.event} \u00B7 ${event.targetpath}`;\n streamroot.append(item);\n }\n for (const event of focusevents.slice(0, 6)) {\n const item = document.createElement(\"li\");\n item.textContent = `${new Date(event.at).toLocaleTimeString()} \u00B7 focus ${event.kind} \u00B7 ${event.targetpath}`;\n streamroot.append(item);\n }\n}\n\n/** Renders the latest snapshot diff with added, removed and changed rows. */\nfunction renderdiffs(diffs: snapshotdiff[]): void {\n if (!diffsroot) return;\n diffsroot.replaceChildren();\n const latest = diffs[0];\n if (!latest) { diffsroot.textContent = \"Diff two captured observation versions with a diffsnapshots step.\"; return; }\n const heading = document.createElement(\"p\");\n heading.textContent = `version ${latest.baseversion} \u2192 ${latest.targetversion}: ${latest.added.length} added \u00B7 ${latest.removed.length} removed \u00B7 ${latest.changed.length} changed`;\n diffsroot.append(heading);\n const list = document.createElement(\"ul\");\n for (const entry of [...latest.added, ...latest.removed, ...latest.changed].slice(0, 12)) {\n const item = document.createElement(\"li\");\n item.className = `diffrow ${entry.kind}`;\n item.textContent = `${entry.kind} \u00B7 ${entry.selector} \u00B7 ${entry.summary}`;\n list.append(item);\n }\n diffsroot.append(list);\n}\n\n/** Flags consent banners with a review card before any interaction. */\nfunction renderbanners(banners: bannerreport[]): void {\n if (!bannersroot) return;\n bannersroot.replaceChildren();\n if (banners.length === 0) { bannersroot.textContent = \"No consent banner has been observed yet.\"; return; }\n for (const banner of banners.slice(0, 3)) {\n const card = document.createElement(\"div\");\n card.className = \"bannercard\";\n const title = document.createElement(\"p\");\n title.textContent = `${banner.kind} banner detected \u2014 review it before any interaction.`;\n const text = document.createElement(\"p\");\n text.textContent = banner.text.slice(0, 160) || \"(no banner text)\";\n const controls = document.createElement(\"p\");\n controls.textContent = `controls: ${banner.controls.length > 0 ? banner.controls.join(\", \") : \"none\"}`;\n card.append(title, text, controls);\n bannersroot.append(card);\n }\n}\n\n/** Shows derived selector candidates with their stability scores for reuse. */\nfunction renderselectors(selectors: derivedselector[]): void {\n if (!selectorsroot) return;\n selectorsroot.replaceChildren();\n if (selectors.length === 0) { selectorsroot.textContent = \"Run a deriveselector step to rank stable selectors.\"; return; }\n for (const record of selectors.slice(0, 8)) {\n const item = document.createElement(\"li\");\n const pick = document.createElement(\"button\");\n pick.type = \"button\";\n pick.textContent = `${record.selector} (${record.strategy} \u00B7 stability ${record.score})`;\n pick.addEventListener(\"click\", () => pickhint(`target hint: ${record.selector} (derived ${record.strategy} selector)`));\n item.append(pick);\n selectorsroot.append(item);\n }\n}\n\nfunction rendercapabilities(report?: capabilityreport): void {\n if (!capabilitiestext) return;\n if (!report) { capabilitiestext.textContent = \"Optional capabilities unknown.\"; return; }\n capabilitiestext.textContent = `tabs ${report.tabs ? \"granted\" : \"absent\"} \u00B7 downloads ${report.downloads ? \"granted\" : \"absent\"} \u00B7 clipboard read ${report.clipboardread ? \"granted\" : \"absent\"} \u00B7 clipboard write ${report.clipboardwrite ? \"granted\" : \"absent\"}`;\n}\n\nfunction renderaudit(events: auditevent[]): void { if (!auditroot) return; auditroot.replaceChildren(); for (const event of events.slice(0, 12)) { const item = document.createElement(\"li\"); item.textContent = `${new Date(event.at).toLocaleTimeString()} \u00B7 ${event.kind} \u00B7 ${event.summary}`; auditroot.append(item); } }\nfunction renderdiagnostic(report?: diagnosticreport): void { if (!diagnosticroot) return; diagnosticroot.replaceChildren(); if (!report) { diagnosticroot.textContent = \"Run a local diagnostic after starting a session to record bridge and page-shape health.\"; return; } const values = [`origin: ${report.origin}`, `title: ${report.title || \"untitled\"}`, `interactive elements: ${report.interactivecount}`, `forms: ${report.formcount}`, `page text length: ${report.textlength}`, `bridge available: ${report.bridgeavailable ? \"yes\" : \"no\"}`]; for (const value of values) { const item = document.createElement(\"li\"); item.textContent = value; diagnosticroot.append(item); } }\nasync function refresh(): Promise<void> { const context = await request({ kind: \"context\" }) as { plan?: agentplan; progress?: planprogress; diagnostic?: diagnosticreport; audit: auditevent[]; outcomes?: stepoutcome[]; capabilities?: capabilityreport; session?: { id: string; pausedat?: number }; map?: clickablemap; retries?: retryoutcome[]; a11y?: a11ycapture; reader?: readercapture; banners?: bannerreport[]; mutationevents?: mutationevent[]; focusevents?: focusevent[]; diffs?: snapshotdiff[]; selectors?: derivedselector[] }; renderplan(context.plan, context.progress, context.outcomes ?? [], context.retries ?? []); renderdiagnostic(context.diagnostic); rendermap(context.map); rendera11y(context.a11y); renderreader(context.reader); renderdetections(context.plan, context.outcomes ?? []); renderstream(context.mutationevents ?? [], context.focusevents ?? []); renderdiffs(context.diffs ?? []); renderbanners(context.banners ?? []); renderselectors(context.selectors ?? []); renderaudit(context.audit); rendercapabilities(context.capabilities); if (context.session?.pausedat) status(\"Session paused. Reviewed actions are blocked until resume.\"); else status(context.session ? \"Active session is visible. The extension is waiting for review.\" : \"No active browser session.\"); }\nasync function create(kind: \"proposelocal\" | \"proposeremote\"): Promise<void> { await request({ kind, objective: objective?.value ?? \"\" }); await refresh(); }\nlocalbutton?.addEventListener(\"click\", () => create(\"proposelocal\").catch(error => status(error instanceof Error ? error.message : String(error), true)));\nremotebutton?.addEventListener(\"click\", () => create(\"proposeremote\").catch(error => status(error instanceof Error ? error.message : String(error), true)));\ndiagnosticbutton?.addEventListener(\"click\", () => request({ kind: \"diagnostic\" }).then(() => refresh()).catch(error => status(error instanceof Error ? error.message : String(error), true)));\nrefresh().catch(error => status(error instanceof Error ? error.message : String(error), true));\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -7,4 +7,5 @@ label { display: block; font-size: 12px; color: var(--muted); margin: 14px 0 6px
7
7
  button { min-height: 40px; margin-top: 10px; border: 1px solid transparent; border-radius: 9px; padding: 0 12px; color: #06120f; background: var(--accent); font-weight: 750; cursor: pointer; } button:focus-visible, input:focus-visible, textarea:focus-visible { outline: 3px solid #8fb9ff; outline-offset: 2px; } button:disabled { cursor: not-allowed; opacity: .5; } button.secondary { background: transparent; color: var(--text); border-color: var(--line); } button.danger { background: transparent; color: var(--danger); border-color: color-mix(in srgb, var(--danger) 50%, transparent); }
8
8
  .actions { display: flex; flex-wrap: wrap; gap: 8px; } .actions button { flex: 1 1 135px; } #status { min-height: 44px; border-left: 3px solid var(--accent); padding-left: 10px; font-size: 13px; } #status[data-state="error"] { border-color: var(--danger); color: #ffc2cc; }
9
9
  section { margin-top: 20px; } .panel, .audit { margin: 0; border: 1px solid var(--line); background: color-mix(in srgb, var(--panel) 88%, transparent); border-radius: 12px; padding: 14px; } ol { padding-left: 24px; } li { color: var(--muted); line-height: 1.5; margin-bottom: 11px; } li button { margin-left: 7px; min-height: 32px; font-size: 12px; } .audit { list-style: none; padding-left: 14px; }
10
- .muted { color: var(--muted); font-size: 12px; margin: 8px 0 0; } #planprogress { width: 100%; height: 8px; margin-bottom: 10px; accent-color: var(--accent); } details.outcome { margin: 6px 0 0; font-size: 12px; } details.outcome summary { color: var(--accent); cursor: pointer; } details.outcome pre { margin: 6px 0 0; padding: 8px; border: 1px solid var(--line); border-radius: 8px; background: #0c1321; color: var(--muted); overflow-x: auto; max-height: 220px; overflow-y: auto; font-size: 11px; } section h3 { font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin: 14px 0 6px; }
10
+ .muted { color: var(--muted); font-size: 12px; margin: 8px 0 0; } #planprogress { width: 100%; height: 8px; margin-bottom: 10px; accent-color: var(--accent); } details.outcome { margin: 6px 0 0; font-size: 12px; } details.outcome summary { color: var(--accent); cursor: pointer; } details.outcome pre { margin: 6px 0 0; padding: 8px; border: 1px solid var(--line); border-radius: 8px; background: #0c1321; color: var(--muted); overflow-x: auto; max-height: 220px; overflow-y: auto; font-size: 11px; } section h3 { font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin: 14px 0 6px; } section h4 { font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--accent); margin: 12px 0 4px; } p.timeline { margin: 4px 0 0; font-size: 11px; color: var(--accent); } ol.maplist li { margin-bottom: 4px; } ol.maplist li button { margin: 0; min-height: 28px; font-size: 11px; font-weight: 600; background: transparent; color: var(--text); border-color: var(--line); text-align: left; } ol.maplist li span { color: var(--muted); font-size: 12px; }
11
+ #a11y pre { margin: 0; padding: 8px; border: 1px solid var(--line); border-radius: 8px; background: #0c1321; color: var(--muted); overflow-x: auto; max-height: 240px; overflow-y: auto; font-size: 11px; white-space: pre-wrap; } #reader p { margin: 4px 0; font-size: 12px; } p.readerblock { color: var(--muted); } p.readerblock.heading { color: var(--accent); font-weight: 700; } .diffrow.added { color: #9ae6b4; } .diffrow.removed { color: var(--danger); } .diffrow.changed { color: var(--accent); } #diffs ul { list-style: none; padding-left: 0; } #diffs li { font-size: 12px; margin-bottom: 4px; } .bannercard { border: 1px solid color-mix(in srgb, var(--danger) 45%, transparent); border-radius: 10px; padding: 10px; margin-bottom: 8px; } .bannercard p:first-child { color: var(--danger); font-weight: 700; margin: 0 0 4px; } .bannercard p { margin: 2px 0; font-size: 12px; }
@@ -2,7 +2,7 @@
2
2
  "manifest_version": 3,
3
3
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnOEjO8Z0PDgQyfvawGcaO2j+o0GLCFTLNj7TkYC/Avo9l2NenMRq7gp90Nfd7E9MViv/OMcCKSYZ5unv12QPRtv31C+a5UQWDFAOP/cH5mwMd6hsayElrSoW8ta+FwFqmr9dIFkn7cQEU3YhZr4Gcbs+ycUHOxVgDA4NBKB0rQ6e9VW5LvTw0isRYUrqM+M72vKxHk9zUIYYn/LGPvottKBYi2GLr0PHSeC2UE+Shmq7vcFIXj6hDjvD4kLJ5sKoUllEcZ1TPuBcnHUQ9ndKA5iktXDQOIJCUJmi7a0YJ2PGg7fvpYfT9k0ai/qZ+pIoRfoOEwE01bPoDn7NjeYnNQIDAQAB",
4
4
  "name": "Devthink",
5
- "version": "1.1.32",
5
+ "version": "1.1.34",
6
6
  "description": "A consent-first bridge for reviewed browser-agent tasks.",
7
7
  "permissions": [
8
8
  "activeTab",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wenathlan/extension",
3
- "version": "1.1.32",
3
+ "version": "1.1.34",
4
4
  "description": "Consent-first browser agent bridge and Manifest V3 extension.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-only",