Skip to content

Commit 4f1d997

Browse files
committed
Refine highlight pagination and enforce explicit confirmations
1 parent e678e7a commit 4f1d997

File tree

9 files changed

+373
-539
lines changed

9 files changed

+373
-539
lines changed

AGENTS.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,7 @@ OpenBrowser uses Jinja2 templates for agent prompts, enabling dynamic content in
169169
- Model profile is resolved from session metadata and exposed to prompt rendering as `model_profile` / `small_model`; see `server/agent/manager.py` and `server/agent/tools/prompt_context.py`
170170
- Tool prompt variants are split by model profile under `server/agent/prompts/small_model/` and `server/agent/prompts/big_model/`
171171
- Small-model browser guidance intentionally avoids `keywords` fallback and leans harder on same-mode highlight pagination when dense UI may be split across collision-aware pages
172-
- Observation rendering also differs by model profile: large models keep clickable highlights compact (`... and N clickable elements`), while small models include clickable element HTML in the LLM-visible observation text for extra semantic grounding
173-
- The small-model clickable-observation branch is implemented in `server/agent/tools/base.py`; the per-conversation `small_model` flag is attached in `server/agent/tools/browser_executor.py`
172+
- Observation rendering now includes clickable element HTML for all model profiles; prompt differences still vary by model profile
174173

175174
### Keyword Discipline
176175
- Highlight pagination remains the default discovery flow for controls and dense UI

bug_report_highlight_any_scrollable.md

Lines changed: 0 additions & 66 deletions
This file was deleted.

extension/src/background/index.ts

Lines changed: 29 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ import {
4545
} from '../commands/label-constants';
4646
import { getOrCreateUUID } from '../uuid/uuidGenerator';
4747
import {
48-
selectCollisionFreePage,
49-
calculateTotalPages,
48+
paginateCollisionFreeElements,
5049
sortElementsByVisualOrder,
5150
} from '../utils/collision-detection';
5251
import {
@@ -161,35 +160,25 @@ async function runRawScreenshotPrime(options: {
161160

162161
function buildStoredHighlightPages(options: {
163162
filteredElements: InteractiveElement[];
164-
totalPages: number;
165163
viewportWidth: number;
166164
viewportHeight: number;
167165
keywordMode: boolean;
168166
}): InteractiveElement[][] {
169-
const {
170-
filteredElements,
171-
totalPages,
172-
viewportWidth,
173-
viewportHeight,
174-
keywordMode,
175-
} = options;
167+
const { filteredElements, viewportWidth, viewportHeight, keywordMode } =
168+
options;
176169

177170
if (keywordMode) {
178171
return [sortElementsByVisualOrder(filteredElements)];
179172
}
180173

181-
const pages: InteractiveElement[][] = [];
182-
for (let page = 1; page <= totalPages; page++) {
183-
const pageElements = selectCollisionFreePage(
184-
filteredElements,
185-
page,
186-
viewportWidth,
187-
viewportHeight,
188-
);
189-
pages.push(sortElementsByVisualOrder(pageElements));
190-
}
191-
192-
return pages;
174+
const collisionFreePages = paginateCollisionFreeElements(
175+
filteredElements,
176+
viewportWidth,
177+
viewportHeight,
178+
);
179+
return collisionFreePages.map((collisionFreePage) =>
180+
sortElementsByVisualOrder(collisionFreePage),
181+
);
193182
}
194183

195184
function buildHighlightConsistencyScript(
@@ -389,38 +378,39 @@ async function captureHighlightedPageState(
389378
`⏱️ [HighlightTrace] background keyword-filter ${Date.now() - keywordFilterStart}ms (keywords=${keywordList.length}, kept=${filteredElements.length}/${allElements.length})`,
390379
);
391380

381+
let storedPages: InteractiveElement[][];
392382
let paginatedElements: InteractiveElement[];
393383
let totalPages: number;
394384
let currentPage = page;
395385

396386
if (keywordList.length > 0) {
397-
paginatedElements = filteredElements;
398-
totalPages = 1;
387+
storedPages = buildStoredHighlightPages({
388+
filteredElements,
389+
viewportWidth: detectedViewportWidth,
390+
viewportHeight: detectedViewportHeight,
391+
keywordMode: true,
392+
});
393+
paginatedElements = storedPages[0] ?? [];
394+
totalPages = storedPages.length || 1;
399395
currentPage = 1;
400396
console.log(
401397
`🔍 [${logLabel}] Keywords [${keywordList.join(', ')}] matched ${paginatedElements.length} elements (no pagination)`,
402398
);
403399
} else {
404-
const paginationSelectionStart = Date.now();
405-
paginatedElements = selectCollisionFreePage(
400+
const paginationBuildStart = Date.now();
401+
storedPages = buildStoredHighlightPages({
406402
filteredElements,
407-
page,
408-
detectedViewportWidth,
409-
detectedViewportHeight,
410-
);
411-
const paginationSelectionMs = Date.now() - paginationSelectionStart;
412-
const totalPagesStart = Date.now();
413-
totalPages = calculateTotalPages(
414-
filteredElements,
415-
detectedViewportWidth,
416-
detectedViewportHeight,
417-
);
418-
const totalPagesMs = Date.now() - totalPagesStart;
403+
viewportWidth: detectedViewportWidth,
404+
viewportHeight: detectedViewportHeight,
405+
keywordMode: false,
406+
});
407+
paginatedElements = storedPages[Math.max(0, page - 1)] ?? [];
408+
totalPages = storedPages.length;
419409
console.log(
420410
`📄 [${logLabel}] Page ${page}/${totalPages}, showing ${paginatedElements.length} of ${filteredElements.length} elements`,
421411
);
422412
console.log(
423-
`⏱️ [HighlightTrace] background pagination select=${paginationSelectionMs}ms totalPages=${totalPagesMs}ms (page=${page}, viewport=${detectedViewportWidth}x${detectedViewportHeight})`,
413+
`⏱️ [HighlightTrace] background pagination build-pages=${Date.now() - paginationBuildStart}ms (page=${page}, viewport=${detectedViewportWidth}x${detectedViewportHeight})`,
424414
);
425415
}
426416

@@ -515,13 +505,6 @@ async function captureHighlightedPageState(
515505
);
516506
}
517507

518-
const storedPages = buildStoredHighlightPages({
519-
filteredElements,
520-
totalPages,
521-
viewportWidth: detectedViewportWidth,
522-
viewportHeight: detectedViewportHeight,
523-
keywordMode: keywordList.length > 0,
524-
});
525508
const displayOrderedElements = storedPages[currentPage - 1] ?? [];
526509

527510
const cacheStoreStart = Date.now();

0 commit comments

Comments
 (0)