/** * Typed error union for the harness layer. * * Adapted from t3code's typed error pattern. Drivers return `Effect` * so callers get exhaustive error matching at the type level instead of `try { } catch (e: unknown)`. */ import type { HarnessId, SessionId, TurnId } from "./ids.js"; export type HarnessErrorTag = "HarnessAuthError" | "HarnessRateLimitError" | "HarnessTimeoutError" | "HarnessCancelledError" | "HarnessSubprocessError" | "HarnessProtocolError" | "HarnessConfigError" | "HarnessUnknownError"; export interface HarnessErrorBase { readonly _tag: HarnessErrorTag; readonly harnessId: HarnessId; readonly sessionId?: SessionId; readonly turnId?: TurnId; readonly message: string; readonly cause?: unknown; } export interface HarnessAuthError extends HarnessErrorBase { readonly _tag: "HarnessAuthError"; readonly authStatus: "missing" | "expired" | "needs_login" | "forbidden"; } export interface HarnessRateLimitError extends HarnessErrorBase { readonly _tag: "HarnessRateLimitError"; readonly retryAfterMs?: number; readonly remainingTokens?: number; } export interface HarnessTimeoutError extends HarnessErrorBase { readonly _tag: "HarnessTimeoutError"; readonly timeoutMs: number; } export interface HarnessCancelledError extends HarnessErrorBase { readonly _tag: "HarnessCancelledError"; readonly reason: "user" | "parent-cancelled" | "system-shutdown"; } export interface HarnessSubprocessError extends HarnessErrorBase { readonly _tag: "HarnessSubprocessError"; readonly exitCode: number | null; readonly signal?: NodeJS.Signals | null; readonly stderrTail?: string; } export interface HarnessProtocolError extends HarnessErrorBase { readonly _tag: "HarnessProtocolError"; readonly receivedShape?: string; } export interface HarnessConfigError extends HarnessErrorBase { readonly _tag: "HarnessConfigError"; readonly configKey?: string; } export interface HarnessUnknownError extends HarnessErrorBase { readonly _tag: "HarnessUnknownError"; } export type HarnessError = HarnessAuthError | HarnessRateLimitError | HarnessTimeoutError | HarnessCancelledError | HarnessSubprocessError | HarnessProtocolError | HarnessConfigError | HarnessUnknownError; export declare function isHarnessError(value: unknown): value is HarnessError; export declare function harnessAuthError(args: Omit): HarnessAuthError; export declare function harnessRateLimitError(args: Omit): HarnessRateLimitError; export declare function harnessTimeoutError(args: Omit): HarnessTimeoutError; export declare function harnessCancelledError(args: Omit): HarnessCancelledError; export declare function harnessSubprocessError(args: Omit): HarnessSubprocessError; export declare function harnessProtocolError(args: Omit): HarnessProtocolError; export declare function harnessConfigError(args: Omit): HarnessConfigError; export declare function harnessUnknownError(args: Omit): HarnessUnknownError; export declare function fromUnknown(unknown: unknown, ctx: { harnessId: HarnessId; sessionId?: SessionId; turnId?: TurnId; }): HarnessError;