diegosouzapw/OmniRoute · error · Error

Claude Web browser interception target changed

Error message

Claude Web browser interception target changed

What it means

Playwright route-interception guard in captureCompletion: a request matched the page.route() glob but failed the strict re-check (method POST plus exact /organizations/{org}/chat_conversations/{id}/completion path). It means the interceptor caught a request whose actual URL or method differs from the prepared conversation target — e.g. claude.ai issued a redirect or auxiliary API call that fell inside the route pattern.

Solutions

  1. Tighten the page.route() pattern so only the exact completion endpoint is intercepted
  2. Retry the turn: transient auxiliary requests during page warmup can hit the broad route; a fresh capture usually intercepts the right POST
  3. If persistent, capture and log outgoing.url() to identify which claude.ai request is colliding
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at open-sse/executors/claude-web/browserTransport.ts:383 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of diegosouzapw/OmniRoute@a179ffed5b (2026-08-25). Data as JSON: /api/errors/7f4c79ef9fee32a5. Report an issue: GitHub.

Appendix: source

Thrown at open-sse/executors/claude-web/browserTransport.ts:383

      segments[1] !== "organizations" ||
      segments[3] !== "chat_conversations" ||
      !segments[4] ||
      segments[5] !== "completion"
    ) {
      return false;
    }
    try {
      return decodeURIComponent(segments[2]) === request.organizationId;
    } catch {
      return false;
    }
  };

  await page.route(matchesPreparedRoute, async (route) => {
    try {
      const outgoing = route.request();
      if (outgoing.method() !== "POST" || !matchesPreparedRoute(new URL(outgoing.url()))) {
        throw new Error("Claude Web browser interception target changed");
      }
      const rawPayload = outgoing.postData();
      if (!rawPayload) throw new Error("Claude Web browser request body is missing");
      const uiPayload = JSON.parse(rawPayload) as unknown;
      if (!uiPayload || typeof uiPayload !== "object" || Array.isArray(uiPayload)) {
        throw new Error("Claude Web browser request body is invalid");
      }
      const capturedHeaders = await outgoing.allHeaders();
      const template = extractBrowserTemplate(uiPayload as Record<string, unknown>);
      const merged = mergeClaudeWebBrowserPayload(
        uiPayload as Record<string, unknown>,
        request.payload
      );
      await route.abort();
      rememberBrowserTemplate(poolKey, template, context);
      resolveInterception?.(makeBrowserFetchInput(request, merged, capturedHeaders));
    } catch {
      await route.abort().catch(() => {});

View on GitHub (pinned to a179ffed5b)