Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## 2026-07-17

### Changes
- Research is significantly faster on pages where the AI picks an imprecise container selector. Previously, if more than 80% of the researched locators failed validation, Explorbot threw away the finished UI map and regenerated it from scratch — roughly doubling the time spent on the page. Because a single bad container marks all of its child elements broken, this triggered easily, and the re-research usually just corrected the container anyway. Broken locators now go straight to the repair step that fixes them in place, cutting research on affected pages by about a third.
- Fixed startup failing with `AI connection failed: Invalid 'max_output_tokens'` on models that reject a one-token response. The check that verifies your AI credentials at startup no longer caps the reply length, so it works with every provider regardless of their minimum.

## 2026-07-10
Expand Down
8 changes: 0 additions & 8 deletions src/ai/researcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,14 +226,6 @@ export class Researcher extends ResearcherBase implements Agent {

const toTest = result.locators.filter((l) => l.valid === null);
await this.testLocators(toTest);

const brokenCount = result.locators.filter((l) => l.valid === false).length;
const brokenRatio = result.locators.length > 0 ? brokenCount / result.locators.length : 0;
if (brokenRatio > 0.8 && retriesLeft > 0) {
tag('warning').log(`${Math.round(brokenRatio * 100)}% locators broken, waiting 3s and retrying research (${maxRetries - retriesLeft + 1}/${maxRetries})...`);
await new Promise((r) => setTimeout(r, 3000));
return this.research(state, { ...opts, force: true, _retriesLeft: retriesLeft - 1 } as any);
}
}

// Stage 3: Fix broken sections via AI conversation continuation
Expand Down
Loading