jackwener/OpenCLI · error · CommandExecutionError
Failed to detect GeoGebra applet: ${err?.message || err}
Error message
Failed to detect GeoGebra applet: ${err?.message || err} What it means
ensureApplet() first checks whether an active GeoGebra page already has a usable ggbApplet. If the page.evaluate probe itself throws (page crashed, closed, navigation in progress, script blocked), it rethrows as CommandExecutionError 'Failed to detect GeoGebra applet: ...' wrapping the underlying browser error message.
Source
Thrown at clis/geogebra/utils.js:85
/**
* Navigate to GeoGebra Geometry (if not already there) and wait for
* the ggbApplet API to become available.
*/
export async function ensureApplet(page) {
let currentUrl = '';
try {
currentUrl = await page.getCurrentUrl();
} catch {
currentUrl = '';
}
// If already on the geometry page, check if applet is ready without re-navigating
if (currentUrl?.includes('geogebra.org/geometry')) {
try {
const ready = unwrapBridgeEnvelope(await page.evaluate(`typeof ggbApplet !== 'undefined' && typeof ggbApplet.evalCommand === 'function'`));
if (ready) return;
} catch (err) {
throw new CommandExecutionError(`Failed to detect GeoGebra applet: ${err?.message || err}`);
}
}
// Navigate to GeoGebra Geometry
try {
await page.goto(GEOGEBRA_URL);
} catch (err) {
throw new CommandExecutionError(`Failed to load GeoGebra Geometry: ${err?.message || err}`);
}
let ready;
try {
ready = unwrapBridgeEnvelope(await page.evaluate(`
(async () => {
const deadline = Date.now() + ${APPLET_WAIT_MS};
while (Date.now() < deadline) {
if (typeof ggbApplet !== 'undefined' && typeof ggbApplet.evalCommand === 'function') {
return true;
}View on GitHub (pinned to 49907e53dc)
Solutions
- Check the wrapped err message (err?.message || err) for the root cause: 'Target closed' means re-open/reconnect the browser/page.
- Re-navigate: close the stale page, open a fresh page at the GeoGebra Geometry URL, then retry the tool.
- Verify network access to geogebra.org and that no extension/CSP blocks inline script evaluation.
- Add a guard that catches page-destroyed states and recreates the page before calling tools.
Example fix
// before
await drawPolygon(page, '1,2;3,4;5,0'); // throws if page was closed
// after
if (page.isClosed()) { page = await browser.newPage(); }
await ensureApplet(page);
await drawPolygon(page, '1,2;3,4;5,0'); Defensive patterns
Strategy: try-catch
Validate before calling
if (!page || page.isClosed()) { page = await browser.newPage(); } Type guard
null
Try / catch
try { await ensureApplet(page); } catch (e) { if (String(e.message).includes('Failed to detect')) { page = await browser.newPage(); await ensureApplet(page); } else throw e; } Prevention
- Check page.isClosed() before each tool call in long sessions.
- Recreate the page after any browser crash or target-closed event.
- Avoid navigating the shared tab while geometry tools run.
- Test with extensions disabled if detection fails intermittently.
When it happens
Trigger: Calling any geometry tool while the page context is destroyed: tab closed, browser crashed, a navigation interrupted the evaluate, CSP or an extension blocked the evalCommand existence check, or the 'geogebra.org/geometry' URL matches but the document is about:blank/broken.
Common situations: Long-lived MCP/browser sessions where the tab was closed by the user, headless browser OOM crashes, flaky network leaving a partially loaded page, or corporate proxies blocking geogebra.org scripts.
Related errors
- Failed to execute GeoGebra command: ${err?.message || err}
- ggbApplet not available after waiting. Make sure the GeoGebr
- GeoGebra command returned malformed result
- Unexpected Claude probe: ${JSON.stringify(result)}
- Failed to send message
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/797869c88d903ea0.
Report an issue: GitHub.