can1357/oh-my-pi · error · ToolError
Tab worker is not initialized
Error message
Tab worker is not initialized
What it means
#requirePage() is the internal guard for all operations that need the worker's Playwright Page. The tab worker process exists but never finished initialization (no page was attached), so any operation requiring the page throws this ToolError instead of dereferencing undefined.
Source
Thrown at packages/coding-agent/src/tools/browser/tab-worker.ts:2200
error: error instanceof Error ? error.message : String(error),
});
}
}
async #close(): Promise<void> {
this.#unsub();
this.#uninstallRejectionGuard();
this.#clearElementCache();
const page = this.#page;
if (this.#dialogHandler && page && !page.isClosed()) page.off("dialog", this.#dialogHandler);
if (this.#mode === "headless" && page && !page.isClosed()) await page.close().catch(() => undefined);
if (this.#browser?.connected) this.#browser.disconnect();
this.#transport.send({ type: "closed" });
this.#transport.close();
}
#requirePage(): Page {
if (!this.#page) throw new ToolError("Tab worker is not initialized");
return this.#page;
}
#requireBrowser(): Browser {
if (!this.#browser) throw new ToolError("Tab worker is not initialized");
return this.#browser;
}
#log(level: "debug" | "warn" | "error", msg: string, meta?: Record<string, unknown>): void {
this.#transport.send({ type: "log", level, msg, meta });
}
}
View on GitHub (pinned to 9690622007)
Solutions
- Re-open the tab so the worker is fully initialized before issuing commands
- Check that the browser could be launched/connected (browser binary installed, CDP URL reachable)
- Inspect worker logs sent as { type: 'log' } messages for earlier init failures
- Retry the operation after waiting for the worker's ready/initialized signal
Defensive patterns
Strategy: retry
Validate before calling
// Ensure the worker initialized before sending commands await waitForWorkerReady(worker); // wait for init/'closed'-free state if (!pageKnownInitialized(tab)) await reopenTab(name);
Try / catch
try {
await send({ type: 'navigate', url });
} catch (err) {
if (err instanceof ToolError && /not initialized/.test(err.message)) {
await reopenTab(name); // full re-init
await send({ type: 'navigate', url });
} else throw err;
} Prevention
- Wait for worker ready signal before first command
- Verify browser binary/CDP endpoint availability at startup
- Treat this error as fatal for the tab: reopen rather than retry in place
- Monitor worker log messages for init failures
When it happens
Trigger: Sending a worker request (navigate, snapshot, observe, act) before the worker's init/connect sequence created the page; the worker was spawned but browser connection failed silently; calling #requirePage-dependent methods after a failed open.
Common situations: Race between worker spawn and first command; browser connect failed (missing browser binary, CDP endpoint down) leaving the page unset; worker reused after a crash that skipped re-initialization.
Related errors
- No active model on agent
- No model configured
- blob broker worker requires ${BLOB_BROKER_SOCKET_ENV} and ${
- JS eval worker smoke fell back from the isolated subprocess
- No session - local:// unavailable
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/64d5842b393e1ffa.
Report an issue: GitHub.