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

  1. Check the wrapped err message (err?.message || err) for the root cause: 'Target closed' means re-open/reconnect the browser/page.
  2. Re-navigate: close the stale page, open a fresh page at the GeoGebra Geometry URL, then retry the tool.
  3. Verify network access to geogebra.org and that no extension/CSP blocks inline script evaluation.
  4. 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

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


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/797869c88d903ea0. Report an issue: GitHub.