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

  1. Re-open the tab so the worker is fully initialized before issuing commands
  2. Check that the browser could be launched/connected (browser binary installed, CDP URL reachable)
  3. Inspect worker logs sent as { type: 'log' } messages for earlier init failures
  4. 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

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


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/64d5842b393e1ffa. Report an issue: GitHub.