Files
oh-my-pi/packages/coding-agent/src/tools/browser/tab-protocol.ts
T
can1357 92fba8d486 fix: addressed model-aware image handling for tool image WebP filtering
- Added model-aware session image normalization by passing active model.
- Propagated model-derived WebP exclusion into browser snapshot capture and resizing.
- Applied model-derived WebP exclusion to eval, fetch, read, and inspect image paths.
2026-06-13 16:17:56 +02:00

108 lines
2.8 KiB
TypeScript

import type { ImageContent, TextContent } from "@oh-my-pi/pi-ai";
export type Transferable = Bun.Transferable;
export interface ObservationEntry {
id: number;
role: string;
name?: string;
value?: string | number;
description?: string;
keyshortcuts?: string;
states: string[];
}
export interface Observation {
url: string;
title?: string;
viewport: { width: number; height: number; deviceScaleFactor?: number };
scroll: {
x: number;
y: number;
width: number;
height: number;
scrollWidth: number;
scrollHeight: number;
};
elements: ObservationEntry[];
}
export interface ScreenshotResult {
dest: string;
mimeType: string;
bytes: number;
width: number;
height: number;
}
export interface SessionSnapshot {
cwd: string;
browserScreenshotDir?: string;
/** Force non-WebP screenshot encoding (e.g. for Ollama). Unset honors `OMP_NO_WEBP`. */
excludeWebP?: boolean;
}
export type WorkerInitPayload =
| {
mode: "headless";
browserWSEndpoint: string;
safeDir: string;
viewport?: { width: number; height: number; deviceScaleFactor?: number };
dialogs?: "accept" | "dismiss";
url?: string;
waitUntil?: "load" | "domcontentloaded" | "networkidle0" | "networkidle2";
timeoutMs: number;
}
| {
mode: "attach";
browserWSEndpoint: string;
safeDir: string;
targetId: string;
dialogs?: "accept" | "dismiss";
};
export type ToolReply = { ok: true; value: unknown } | { ok: false; error: RunErrorPayload };
export type WorkerInbound =
| { type: "init"; payload: WorkerInitPayload }
| { type: "run"; id: string; name: string; code: string; timeoutMs: number; session: SessionSnapshot }
| { type: "abort"; id: string }
| { type: "tool-reply"; id: string; reply: ToolReply }
| { type: "close" };
export interface ReadyInfo {
url: string;
title?: string;
viewport: { width: number; height: number; deviceScaleFactor?: number };
targetId: string;
}
export interface RunResultOk {
displays: Array<TextContent | ImageContent>;
returnValue: unknown;
screenshots: ScreenshotResult[];
}
export interface RunErrorPayload {
name: string;
message: string;
stack?: string;
isToolError: boolean;
isAbort: boolean;
}
export type WorkerOutbound =
| { type: "ready"; info: ReadyInfo }
| { type: "init-failed"; error: RunErrorPayload }
| { type: "result"; id: string; ok: true; payload: RunResultOk }
| { type: "result"; id: string; ok: false; error: RunErrorPayload }
| { type: "tool-call"; id: string; runId: string; name: string; args: unknown }
| { type: "log"; level: "debug" | "warn" | "error"; msg: string; meta?: Record<string, unknown> }
| { type: "closed" };
export interface Transport {
send(msg: WorkerOutbound | WorkerInbound, transferList?: Transferable[]): void;
onMessage(handler: (msg: WorkerOutbound | WorkerInbound) => void): () => void;
close(): void;
}