mirror of
https://github.com/morluto/rea.git
synced 2026-11-03 05:16:16 +00:00
* fix(browser): report cancellation after cleanup and source-map abort An interrupt during CDP cleanup could still publish the captured page, and a source-map download abort was wrapped as a provider failure. Both now return AnalysisCancelledError for the requested operation. * fix(setup): keep Devin configuration JSON-formatted The empty DSH_HOME fix also changed Devin's declared format to "devin", which is not a configuration format and stops the typecheck. Devin still writes mcp_config.json. * test(browser): keep cleanup cancellation coverage in its own suite The added interrupt cases made the existing lifecycle suite exceed the function-length lint limit. * test(ghidra): drop the duplicated path join import The inventory MCP test imported join twice, which fails lint on current main. * test(cli): type the retained skill directory pairs noUncheckedIndexedAccess treats the unlabeled pair list as an open array, so the directory passed to join was string or undefined. * fix(browser): preserve source-map cancellation results * style(test): format the partial Frida load cancellation fixture Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: REA Maintenance <rea-maintenance@users.noreply.github.com> Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
132 lines
5.1 KiB
TypeScript
132 lines
5.1 KiB
TypeScript
import type { JsonValue } from "../../src/domain/jsonValue.js";
|
|
export interface FakeCdpCommand {
|
|
readonly id: number;
|
|
readonly method: string;
|
|
readonly params: Readonly<Record<string, unknown>>;
|
|
readonly sessionId?: string;
|
|
}
|
|
|
|
export interface FakeCdpBrowser {
|
|
readonly endpoint: string;
|
|
readonly browserWebSocketUrl: string;
|
|
readonly allowedOrigin: string;
|
|
readonly commands: readonly FakeCdpCommand[];
|
|
/** Actual WebSocket connections still held by the wire fixture. */
|
|
activeConnectionCount(): number;
|
|
/** WebSocket upgrades accepted over the fixture's lifetime. */
|
|
openedConnectionCount(): number;
|
|
/** Deliver actual malformed wire data without bypassing the production transport parser. */
|
|
emitRawMessage(message: string): void;
|
|
emitEvent(event: {
|
|
readonly method: string;
|
|
readonly params: unknown;
|
|
readonly sessionId?: string;
|
|
}): void;
|
|
readonly httpRequests: readonly {
|
|
readonly url: string;
|
|
readonly authorization: string | undefined;
|
|
readonly cookie: string | undefined;
|
|
readonly referer: string | undefined;
|
|
}[];
|
|
close(): Promise<void>;
|
|
}
|
|
|
|
export interface FakeOptions {
|
|
/** Send these commands' producer events before acknowledging completion, as a wire barrier. */
|
|
readonly eventsBeforeReply?: readonly string[];
|
|
/** Return a native-shaped command rejection through the actual wire parser. */
|
|
readonly commandError?: (
|
|
command: FakeCdpCommand,
|
|
) => { readonly code: number; readonly message: string } | undefined;
|
|
/** Producer reply seam preserves the real HTTP/WebSocket transport and command parser. */
|
|
readonly commandResult?: (
|
|
command: FakeCdpCommand,
|
|
origin: string,
|
|
frameReads: number,
|
|
) => Readonly<Record<string, unknown>> | undefined;
|
|
/** Return undefined to use the stock producer events; an empty array suppresses them. */
|
|
readonly commandEvents?: (
|
|
command: FakeCdpCommand,
|
|
origin: string,
|
|
) =>
|
|
| readonly {
|
|
readonly method: string;
|
|
readonly params: unknown;
|
|
readonly sessionId?: string;
|
|
}[]
|
|
| undefined;
|
|
readonly malformedDiscovery?: boolean;
|
|
readonly oversizedDiscovery?: boolean;
|
|
readonly invalidBrowserWebSocket?: boolean;
|
|
readonly pageScopedVersionWebSocket?: boolean;
|
|
readonly omitTargetWebSocket?: boolean;
|
|
readonly additionalPageWithWebSocket?: boolean;
|
|
readonly additionalPageWithoutWebSocket?: boolean;
|
|
readonly additionalPageCount?: number;
|
|
readonly additionalElectronPageCount?: number;
|
|
readonly invalidAttachedSession?: boolean;
|
|
readonly malformedMessageOnMethod?: string;
|
|
readonly malformedEventOnMethod?: string;
|
|
readonly malformedEventShapeOnMethod?: string;
|
|
readonly closeOnMethod?: string;
|
|
readonly hangOnMethod?: string;
|
|
readonly unsupportedMethods?: readonly string[];
|
|
readonly transitionalFrameReads?: number;
|
|
readonly attachedFrameUrl?: string;
|
|
readonly frameUrlAfterFirstRead?: string;
|
|
readonly navigateDuringObservationUrl?: string;
|
|
readonly navigateDuringCaptureUrl?: string;
|
|
readonly navigateDuringScreenshotUrl?: string;
|
|
readonly screenshotDocumentLoader?: string;
|
|
readonly extraCollections?: boolean;
|
|
readonly indexedDbDateKeys?: boolean;
|
|
readonly foreignSessionEvents?: boolean;
|
|
readonly redirectToDisallowedOrigin?: boolean;
|
|
readonly redirectFromDisallowedOrigin?: boolean;
|
|
readonly redirectWithinOrigin?: boolean;
|
|
readonly malformedRedirectResponse?: boolean;
|
|
readonly omitRedirectResponse?: boolean;
|
|
readonly redirectResponseUrl?: string;
|
|
readonly redirectResponseEnvelope?: unknown;
|
|
readonly responseAfterMalformedUrl?: string;
|
|
readonly unrelatedWorker?: boolean;
|
|
readonly binaryWebSocketEvent?: boolean;
|
|
/** Emit an allowed WebSocket creation without any frames in the capture window. */
|
|
readonly webSocketWithoutFrames?: boolean;
|
|
readonly invalidBinaryWebSocketEvent?: boolean;
|
|
readonly sourceMapBody?: string;
|
|
/** Accept a source-map request and leave the response open. */
|
|
readonly hangSourceMap?: boolean;
|
|
readonly sourceMapRedirect?: string;
|
|
readonly sessionTimeline?:
|
|
| "same_origin"
|
|
| "outside_policy"
|
|
| "target_detached";
|
|
readonly sessionTimelineEventCount?: number;
|
|
readonly sessionRedirectResourceType?: "Document" | "Fetch" | "Script";
|
|
readonly closeAfterMethod?: string;
|
|
readonly sensitiveShapes?: boolean;
|
|
readonly cachedResponseBody?: string;
|
|
readonly invalidResponseBodyBase64?: boolean;
|
|
readonly webMcpTools?: boolean;
|
|
readonly webMcpConsequential?: JsonValue;
|
|
readonly webMcpSameUrlRegistrations?: "retain" | "remove-second";
|
|
readonly webMcpFrameCount?: number;
|
|
readonly webMcpSchemaPropertyCount?: number;
|
|
readonly webMcpInputSchema?: JsonValue;
|
|
readonly webMcpChildLeavesScope?: boolean;
|
|
readonly webMcpChildTransientBlank?: boolean;
|
|
readonly webMcpChildRecoversAfterTransient?: boolean;
|
|
readonly webMcpChildNavigatesAllowed?: boolean;
|
|
readonly electronFileUrl?: string;
|
|
/** Omit attached from the Electron page's HTTP discovery target. */
|
|
readonly omitElectronTargetAttachmentState?: boolean;
|
|
readonly duplicateElectronInventory?: boolean;
|
|
readonly electronInventoryCount?: number;
|
|
readonly urlShapedAllowedTitle?:
|
|
| boolean
|
|
| "host-path"
|
|
| "root-relative"
|
|
| "prefixed";
|
|
}
|