perf(mcp): keep Playwright and type-only imports off MCP startup (#1691)

* fix(build): emit no runtime imports for type-only bindings

Under verbatimModuleSyntax, an import whose specifiers all carry inline
`type` modifiers compiles to `import {} from "..."`, a side-effect import
that still resolves and evaluates the module. 78 compiled modules carried
one, including `import {} from "playwright-core"` in the browser scenario
session, which loaded Playwright's module graph at MCP startup.

Use top-level `import type` for these bindings and enable oxlint's
typescript/no-import-type-side-effects rule so the pattern cannot return.

Refs #1685

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* perf(mcp): load Playwright when a scenario launches, not at startup

The browser scenario and Electron active providers are constructed before
the stdio server serves, and both bound Playwright's launchers at module
load. Resolve `chromium` and `_electron` from playwright-core when a
capture opens instead, as the web module resolver already does.

MCP startup now resolves 1,312 modules (4,902 resolutions) instead of
1,598 (6,076) before reading the first request, and no longer loads
playwright-core. Provider construction, the tool catalog, and capability
inventory are unchanged.

A boundary test spawns the stdio server, initializes, lists tools, and
asserts playwright-core and isomorphic-git were not resolved; the CLI
probe now exercises the real launch path to prove detection.

Closes #1685

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Kaoru0822
2026-10-10 21:04:05 -07:00
committed by GitHub
co-authored by Claude Opus 5.5
parent a56f7bb668
commit 0ecf3f2438
89 changed files with 197 additions and 160 deletions
+2 -1
View File
@@ -22,7 +22,8 @@
], ],
"max-params": ["warn", 4], "max-params": ["warn", 4],
"no-var": "warn", "no-var": "warn",
"no-var-requires": "error" "no-var-requires": "error",
"typescript/no-import-type-side-effects": "error"
}, },
"overrides": [ "overrides": [
{ {
+1 -1
View File
@@ -4,7 +4,7 @@ import type {
AnalysisOperationPort, AnalysisOperationPort,
} from "./AnalysisProvider.js"; } from "./AnalysisProvider.js";
import { AnalysisOutputError } from "../domain/analysisErrorCore.js"; import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import type { JsonValue } from "../domain/jsonValue.js"; import type { JsonValue } from "../domain/jsonValue.js";
import { analysisBookmarkSchema } from "../domain/hopperValues.js"; import { analysisBookmarkSchema } from "../domain/hopperValues.js";
import { resolveAnalysisDocument } from "./AnalysisDocument.js"; import { resolveAnalysisDocument } from "./AnalysisDocument.js";
+1 -1
View File
@@ -12,7 +12,7 @@ import type {
CompareWebScreenshotsInput, CompareWebScreenshotsInput,
} from "../domain/webScreenshot.js"; } from "../domain/webScreenshot.js";
import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js"; import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
import type { ExecutionOptions } from "./AnalysisProvider.js"; import type { ExecutionOptions } from "./AnalysisProvider.js";
import type { BrowserObservationPort } from "./BrowserObservationPort.js"; import type { BrowserObservationPort } from "./BrowserObservationPort.js";
@@ -2,7 +2,7 @@ import type { ExecutionOptions } from "./AnalysisProvider.js";
import type { BrowserScenarioCapturePort } from "./BrowserScenarioCapturePort.js"; import type { BrowserScenarioCapturePort } from "./BrowserScenarioCapturePort.js";
import { createBrowserScenarioEvidence } from "./BrowserScenarioEvidence.js"; import { createBrowserScenarioEvidence } from "./BrowserScenarioEvidence.js";
import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js"; import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import type { Evidence } from "../domain/evidence.js"; import type { Evidence } from "../domain/evidence.js";
import type { BrowserScenario } from "../domain/browserScenario.js"; import type { BrowserScenario } from "../domain/browserScenario.js";
import { err, type Result } from "../domain/result.js"; import { err, type Result } from "../domain/result.js";
+1 -1
View File
@@ -1,6 +1,6 @@
import type { AnalysisOperation } from "./AnalysisProvider.js"; import type { AnalysisOperation } from "./AnalysisProvider.js";
import { projectAnalysisError } from "../domain/analysisErrorProjection.js"; import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { parseRelatedAddresses } from "../domain/hopperValues.js"; import { parseRelatedAddresses } from "../domain/hopperValues.js";
import type { JsonValue } from "../domain/jsonValue.js"; import type { JsonValue } from "../domain/jsonValue.js";
import { ok, type Result } from "../domain/result.js"; import { ok, type Result } from "../domain/result.js";
+1 -1
View File
@@ -18,7 +18,7 @@ import {
} from "../contracts/managed/managedToolContracts.js"; } from "../contracts/managed/managedToolContracts.js";
import { EvidenceIntegrityError } from "../domain/evidenceErrors.js"; import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
import { projectAnalysisError } from "../domain/analysisErrorProjection.js"; import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { access } from "node:fs/promises"; import { access } from "node:fs/promises";
import { import {
readAnalysisSnapshot, readAnalysisSnapshot,
+1 -1
View File
@@ -1,7 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import type { AnalysisOperation } from "./AnalysisProvider.js"; import type { AnalysisOperation } from "./AnalysisProvider.js";
import { AnalysisOutputError } from "../domain/analysisErrorCore.js"; import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import type { JsonValue } from "../domain/jsonValue.js"; import type { JsonValue } from "../domain/jsonValue.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
import type { import type {
+1 -1
View File
@@ -1,7 +1,7 @@
import type { z } from "zod"; import type { z } from "zod";
import { AnalysisInputError } from "../domain/analysisErrorCore.js"; import { AnalysisInputError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import type { JsonValue } from "../domain/jsonValue.js"; import type { JsonValue } from "../domain/jsonValue.js";
import { err, type Result } from "../domain/result.js"; import { err, type Result } from "../domain/result.js";
import { import {
+1 -1
View File
@@ -12,7 +12,7 @@ import {
AnalysisOutputError, AnalysisOutputError,
} from "../domain/analysisErrorCore.js"; } from "../domain/analysisErrorCore.js";
import { projectAnalysisError } from "../domain/analysisErrorProjection.js"; import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { import {
addressDistance, addressDistance,
functionDossierSchema, functionDossierSchema,
+1 -1
View File
@@ -1,5 +1,5 @@
import { EvidenceIntegrityError } from "../domain/evidenceErrors.js"; import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import type { EvidenceBundle } from "../domain/evidenceBundle.js"; import type { EvidenceBundle } from "../domain/evidenceBundle.js";
import type { JsonValue } from "../domain/jsonValue.js"; import type { JsonValue } from "../domain/jsonValue.js";
import { jsonValueSchema } from "../domain/jsonValue.js"; import { jsonValueSchema } from "../domain/jsonValue.js";
@@ -1,7 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import { AnalysisProtocolError } from "../domain/analysisErrorCore.js"; import { AnalysisProtocolError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { import {
createEvidence, createEvidence,
type Evidence, type Evidence,
@@ -2,7 +2,7 @@ import { z } from "zod";
import { reconstructionCoverageEvaluationInputSchema } from "../domain/reconstructionCoverageInput.js"; import { reconstructionCoverageEvaluationInputSchema } from "../domain/reconstructionCoverageInput.js";
import { AnalysisInputError } from "../domain/analysisErrorCore.js"; import { AnalysisInputError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { evaluateReconstructionClosure } from "../domain/reconstructionCoverage.js"; import { evaluateReconstructionClosure } from "../domain/reconstructionCoverage.js";
import { jsonValueSchema, type JsonValue } from "../domain/jsonValue.js"; import { jsonValueSchema, type JsonValue } from "../domain/jsonValue.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
@@ -1,7 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import { AnalysisProtocolError } from "../domain/analysisErrorCore.js"; import { AnalysisProtocolError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { createEvidence, type Evidence } from "../domain/evidence.js"; import { createEvidence, type Evidence } from "../domain/evidence.js";
import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js"; import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
import { import {
+3 -3
View File
@@ -18,9 +18,9 @@ import type {
} from "../reference/ReferenceSourceReaderTypes.js"; } from "../reference/ReferenceSourceReaderTypes.js";
import { parseReferenceSourceEntries } from "./ReferenceSourceImportEntries.js"; import { parseReferenceSourceEntries } from "./ReferenceSourceImportEntries.js";
import { readReferenceSourceVcs } from "./ReferenceSourceVcsAdapter.js"; import { readReferenceSourceVcs } from "./ReferenceSourceVcsAdapter.js";
import { import type {
type ReferenceSourceImportError, ReferenceSourceImportError,
type ReferenceSourceImportOptions, ReferenceSourceImportOptions,
} from "./ReferenceSourceImportTypes.js"; } from "./ReferenceSourceImportTypes.js";
import { import {
prepareReferenceSourceImport, prepareReferenceSourceImport,
+6 -6
View File
@@ -1,10 +1,10 @@
import { skillDestinations } from "./SetupSkill.js"; import { skillDestinations } from "./SetupSkill.js";
import { import type {
type ClientConfigurationInspection, ClientConfigurationInspection,
type ClientConfigurationResult, ClientConfigurationResult,
type SetupHost, SetupHost,
type SetupOptions, SetupOptions,
type SetupProviderEnvironment, SetupProviderEnvironment,
} from "./SetupTypes.js"; } from "./SetupTypes.js";
import type { SetupClient } from "./SupportedClients.js"; import type { SetupClient } from "./SupportedClients.js";
import type { SetupHopperInstallResult } from "./SetupInstallFailure.js"; import type { SetupHopperInstallResult } from "./SetupInstallFailure.js";
@@ -7,7 +7,7 @@ import {
AnalysisSnapshotMismatchError, AnalysisSnapshotMismatchError,
} from "../../domain/evidenceErrors.js"; } from "../../domain/evidenceErrors.js";
import { NoBinaryOpenError } from "../../domain/configurationErrors.js"; import { NoBinaryOpenError } from "../../domain/configurationErrors.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../../domain/result.js"; import { err, ok, type Result } from "../../domain/result.js";
import { import {
analysisQueryId, analysisQueryId,
+1 -1
View File
@@ -6,7 +6,7 @@ import {
type AnalysisProfileCommitment, type AnalysisProfileCommitment,
} from "../../domain/analysisProfile.js"; } from "../../domain/analysisProfile.js";
import { AnalysisCancelledError } from "../../domain/analysisErrorCore.js"; import { AnalysisCancelledError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../../domain/result.js"; import { err, ok, type Result } from "../../domain/result.js";
import type { JsonValue } from "../../domain/jsonValue.js"; import type { JsonValue } from "../../domain/jsonValue.js";
import { createEvidence } from "../../domain/evidence.js"; import { createEvidence } from "../../domain/evidence.js";
@@ -3,7 +3,7 @@ import type { BinaryTarget } from "../../domain/binaryTargetTypes.js";
import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js"; import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
import { NoBinaryOpenError } from "../../domain/configurationErrors.js"; import { NoBinaryOpenError } from "../../domain/configurationErrors.js";
import { ProviderAdapterError } from "../../domain/providerAdapterError.js"; import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import type { JsonValue } from "../../domain/jsonValue.js"; import type { JsonValue } from "../../domain/jsonValue.js";
import type { EvidenceSubjectTarget } from "../../domain/evidence.js"; import type { EvidenceSubjectTarget } from "../../domain/evidence.js";
import { err, ok, type Result } from "../../domain/result.js"; import { err, ok, type Result } from "../../domain/result.js";
+2 -2
View File
@@ -8,12 +8,12 @@ import {
} from "../../domain/analysisSnapshot.js"; } from "../../domain/analysisSnapshot.js";
import type { AnalysisSnapshot } from "../../domain/analysisSnapshot.js"; import type { AnalysisSnapshot } from "../../domain/analysisSnapshot.js";
import { parseBinaryTarget } from "../BinaryTargetResolver.js"; import { parseBinaryTarget } from "../BinaryTargetResolver.js";
import { type BinaryTarget } from "../../domain/binaryTargetTypes.js"; import type { BinaryTarget } from "../../domain/binaryTargetTypes.js";
import { import {
EvidenceIntegrityError, EvidenceIntegrityError,
AnalysisSnapshotMismatchError, AnalysisSnapshotMismatchError,
} from "../../domain/evidenceErrors.js"; } from "../../domain/evidenceErrors.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { err, type Result } from "../../domain/result.js"; import { err, type Result } from "../../domain/result.js";
import type { SessionProviderRoute } from "./SessionProviderRouter.js"; import type { SessionProviderRoute } from "./SessionProviderRouter.js";
import { SessionProviderRouter } from "./SessionProviderRouter.js"; import { SessionProviderRouter } from "./SessionProviderRouter.js";
@@ -9,8 +9,8 @@ import {
EvidenceIntegrityError, EvidenceIntegrityError,
AnalysisSnapshotMismatchError, AnalysisSnapshotMismatchError,
} from "../../domain/evidenceErrors.js"; } from "../../domain/evidenceErrors.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { type UnknownRegistryError } from "../../domain/unknownRegistryError.js"; import type { UnknownRegistryError } from "../../domain/unknownRegistryError.js";
import type { import type {
RecordUnknownInput, RecordUnknownInput,
ResidualUnknown, ResidualUnknown,
@@ -3,7 +3,7 @@ import type { AnalysisProfileCommitment } from "../../domain/analysisProfile.js"
import type { BinaryTarget } from "../../domain/binaryTargetTypes.js"; import type { BinaryTarget } from "../../domain/binaryTargetTypes.js";
import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js"; import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
import { ProviderSelectionError } from "../../domain/providerSelectionError.js"; import { ProviderSelectionError } from "../../domain/providerSelectionError.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../../domain/result.js"; import { err, ok, type Result } from "../../domain/result.js";
import type { import type {
AnalysisClient, AnalysisClient,
@@ -7,7 +7,7 @@ import {
AnalysisCapabilityUnavailableError, AnalysisCapabilityUnavailableError,
AnalysisInputError, AnalysisInputError,
} from "../../domain/analysisErrorCore.js"; } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import type { Evidence } from "../../domain/evidence.js"; import type { Evidence } from "../../domain/evidence.js";
import type { ElectronActiveObservationInput } from "../../domain/javascript/electronActiveObservation.js"; import type { ElectronActiveObservationInput } from "../../domain/javascript/electronActiveObservation.js";
import { err, type Result } from "../../domain/result.js"; import { err, type Result } from "../../domain/result.js";
@@ -6,7 +6,7 @@ import type {
ListElectronTargetsInput, ListElectronTargetsInput,
} from "../../domain/javascript/electronObservation.js"; } from "../../domain/javascript/electronObservation.js";
import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js"; import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../../domain/result.js"; import { err, ok, type Result } from "../../domain/result.js";
import { createElectronEvidence } from "./ElectronEvidence.js"; import { createElectronEvidence } from "./ElectronEvidence.js";
@@ -1,7 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js"; import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import type { Evidence } from "../../domain/evidence.js"; import type { Evidence } from "../../domain/evidence.js";
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js"; import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
import { compareJavaScriptApplicationVersions } from "../../domain/javascript/javascriptApplicationVersionComparison.js"; import { compareJavaScriptApplicationVersions } from "../../domain/javascript/javascriptApplicationVersionComparison.js";
@@ -6,7 +6,7 @@ import {
AnalysisCancelledError, AnalysisCancelledError,
AnalysisCapabilityUnavailableError, AnalysisCapabilityUnavailableError,
} from "../../domain/analysisErrorCore.js"; } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import type { import type {
ListJavaScriptRuntimeTargetsInput, ListJavaScriptRuntimeTargetsInput,
ObserveJavaScriptRuntimeInput, ObserveJavaScriptRuntimeInput,
@@ -2,7 +2,7 @@ import { resolve } from "node:path";
import { z } from "zod"; import { z } from "zod";
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js"; import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import type { Evidence } from "../../domain/evidence.js"; import type { Evidence } from "../../domain/evidence.js";
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js"; import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
import { import {
@@ -4,7 +4,7 @@ import {
AnalysisInputError, AnalysisInputError,
AnalysisProtocolError, AnalysisProtocolError,
} from "../../domain/analysisErrorCore.js"; } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { import {
applicationGraphEvidenceInputError, applicationGraphEvidenceInputError,
parseApplicationGraphEvidence, parseApplicationGraphEvidence,
@@ -1,7 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js"; import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { import {
createEvidence, createEvidence,
type Evidence, type Evidence,
@@ -11,7 +11,7 @@ import {
import { parseManagedMemberEvidence } from "../../domain/managed/managedMemberComparisonMatch.js"; import { parseManagedMemberEvidence } from "../../domain/managed/managedMemberComparisonMatch.js";
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js"; import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js"; import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { createEvidence, type Evidence } from "../../domain/evidence.js"; import { createEvidence, type Evidence } from "../../domain/evidence.js";
import { jsonValueSchema } from "../../domain/jsonValue.js"; import { jsonValueSchema } from "../../domain/jsonValue.js";
import { parseBinaryTarget } from "../BinaryTargetResolver.js"; import { parseBinaryTarget } from "../BinaryTargetResolver.js";
@@ -1,7 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js"; import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { createEvidence, type Evidence } from "../../domain/evidence.js"; import { createEvidence, type Evidence } from "../../domain/evidence.js";
import { jsonValueSchema } from "../../domain/jsonValue.js"; import { jsonValueSchema } from "../../domain/jsonValue.js";
import { import {
@@ -1,7 +1,7 @@
import { z } from "zod"; import { z } from "zod";
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js"; import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { createEvidence, type Evidence } from "../../domain/evidence.js"; import { createEvidence, type Evidence } from "../../domain/evidence.js";
import { jsonValueSchema } from "../../domain/jsonValue.js"; import { jsonValueSchema } from "../../domain/jsonValue.js";
import { import {
+1 -1
View File
@@ -28,7 +28,7 @@ import {
AnalysisUnsupportedTargetError, AnalysisUnsupportedTargetError,
} from "../domain/analysisErrorCore.js"; } from "../domain/analysisErrorCore.js";
import { ArtifactOperationError } from "../domain/artifactOperationError.js"; import { ArtifactOperationError } from "../domain/artifactOperationError.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import type { JsonValue } from "../domain/jsonValue.js"; import type { JsonValue } from "../domain/jsonValue.js";
import { interfaceBuilderLimitsSchema } from "../domain/apple/interfaceBuilderGraph.js"; import { interfaceBuilderLimitsSchema } from "../domain/apple/interfaceBuilderGraph.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
@@ -27,9 +27,9 @@ import {
type IntegrityContradiction, type IntegrityContradiction,
} from "../../domain/artifactGraph.js"; } from "../../domain/artifactGraph.js";
import { AnalysisUnsupportedTargetError } from "../../domain/analysisErrorCore.js"; import { AnalysisUnsupportedTargetError } from "../../domain/analysisErrorCore.js";
import { import type {
type ArtifactResourceOwner, ArtifactResourceOwner,
type ArtifactResourceScope, ArtifactResourceScope,
} from "../ArtifactResourceScope.js"; } from "../ArtifactResourceScope.js";
import type { BinaryTarget } from "../../domain/binaryTargetTypes.js"; import type { BinaryTarget } from "../../domain/binaryTargetTypes.js";
import type { ArtifactInventorySnapshot } from "../../domain/artifactInventorySnapshot.js"; import type { ArtifactInventorySnapshot } from "../../domain/artifactInventorySnapshot.js";
+1 -1
View File
@@ -12,7 +12,7 @@ import {
zipPackageFormatForPath, zipPackageFormatForPath,
} from "../../domain/zipPackageFormat.js"; } from "../../domain/zipPackageFormat.js";
import { ArtifactReaderFailure } from "../ArtifactReader.js"; import { ArtifactReaderFailure } from "../ArtifactReader.js";
import { type ArtifactResourceOwner } from "../ArtifactResourceScope.js"; import type { ArtifactResourceOwner } from "../ArtifactResourceScope.js";
import type { HashResult } from "../ArtifactHash.js"; import type { HashResult } from "../ArtifactHash.js";
import { import {
hashStableRootArtifactHandle, hashStableRootArtifactHandle,
+1 -1
View File
@@ -34,7 +34,7 @@ import {
artifactManifestId, artifactManifestId,
} from "../../domain/artifactIdentity.js"; } from "../../domain/artifactIdentity.js";
import { classifyAndHashRootForInventory } from "./classify.js"; import { classifyAndHashRootForInventory } from "./classify.js";
import { type HashResult } from "../ArtifactHash.js"; import type { HashResult } from "../ArtifactHash.js";
import { import {
hashStableRootArtifact, hashStableRootArtifact,
hashStableRootArtifactHandle, hashStableRootArtifactHandle,
+1 -1
View File
@@ -46,7 +46,7 @@ import { AnalysisError } from "../domain/analysisErrorBase.js";
import { AnalysisInputError } from "../domain/analysisErrorCore.js"; import { AnalysisInputError } from "../domain/analysisErrorCore.js";
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import { ProviderAdapterError } from "../domain/providerAdapterError.js"; import { ProviderAdapterError } from "../domain/providerAdapterError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
import { import {
discoverCdpEndpoint, discoverCdpEndpoint,
+1 -1
View File
@@ -1,6 +1,6 @@
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js"; import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { sanitizeBrowserUrl } from "../domain/browserObservation.js"; import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
import { createWebTextArtifact } from "../domain/webContentArtifact.js"; import { createWebTextArtifact } from "../domain/webContentArtifact.js";
+1 -1
View File
@@ -4,7 +4,7 @@ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
import { AnalysisError } from "../domain/analysisErrorBase.js"; import { AnalysisError } from "../domain/analysisErrorBase.js";
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import { CdpCommandRejection } from "./CdpCommandRejection.js"; import { CdpCommandRejection } from "./CdpCommandRejection.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { safeParseJson } from "../domain/safeJson.js"; import { safeParseJson } from "../domain/safeJson.js";
import { WEB_RUNTIME_LIMITS } from "../domain/webRuntime.js"; import { WEB_RUNTIME_LIMITS } from "../domain/webRuntime.js";
+1 -1
View File
@@ -14,7 +14,7 @@ import {
import { AnalysisError } from "../domain/analysisErrorBase.js"; import { AnalysisError } from "../domain/analysisErrorBase.js";
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import { ProviderAdapterError } from "../domain/providerAdapterError.js"; import { ProviderAdapterError } from "../domain/providerAdapterError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
import { import {
discoverCdpEndpoint, discoverCdpEndpoint,
+1 -1
View File
@@ -5,7 +5,7 @@ import { z } from "zod";
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js"; import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
import { AnalysisError } from "../domain/analysisErrorBase.js"; import { AnalysisError } from "../domain/analysisErrorBase.js";
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { sanitizeBrowserUrl } from "../domain/browserObservation.js"; import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
import { safeParseJson } from "../domain/safeJson.js"; import { safeParseJson } from "../domain/safeJson.js";
+1 -1
View File
@@ -2,7 +2,7 @@ import type { InspectWebPageInput } from "../domain/browserObservation.js";
import type { WebPageInspection } from "../domain/browserObservationSchemas.js"; import type { WebPageInspection } from "../domain/browserObservationSchemas.js";
import type { ProgressReporter } from "../application/ProgressReporter.js"; import type { ProgressReporter } from "../application/ProgressReporter.js";
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { stableWebResources } from "../domain/webInventory.js"; import { stableWebResources } from "../domain/webInventory.js";
import type { CdpEndpointDiscovery, CdpEndpointTarget } from "./CdpEndpoint.js"; import type { CdpEndpointDiscovery, CdpEndpointTarget } from "./CdpEndpoint.js";
import { CdpConnection } from "./CdpConnection.js"; import { CdpConnection } from "./CdpConnection.js";
+1 -1
View File
@@ -1,5 +1,5 @@
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { CdpConnection } from "./CdpConnection.js"; import { CdpConnection } from "./CdpConnection.js";
import { import {
cdpTargetWebSocket, cdpTargetWebSocket,
@@ -3,7 +3,7 @@ import { dirname } from "node:path";
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
import { _electron as electron } from "playwright-core"; import type { _electron as electron } from "playwright-core";
import type { import type {
ExecutionOptions, ExecutionOptions,
@@ -60,8 +60,9 @@ type ElectronPaths = {
export class PlaywrightElectronActiveProvider implements ElectronActiveObservationPort { export class PlaywrightElectronActiveProvider implements ElectronActiveObservationPort {
constructor( constructor(
private readonly environment: Readonly<Record<string, string | undefined>>, private readonly environment: Readonly<Record<string, string | undefined>>,
private readonly launch: typeof electron.launch = (options) => // Load Playwright only when a capture launches; MCP startup stays off its module graph.
electron.launch(options), private readonly launch: typeof electron.launch = async (options) =>
(await import("playwright-core"))._electron.launch(options),
) {} ) {}
identity(): ProviderIdentity { identity(): ProviderIdentity {
+4 -7
View File
@@ -2,12 +2,7 @@ import { chmod, mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join, resolve } from "node:path"; import { join, resolve } from "node:path";
import { import type { Browser, BrowserContext, Page, chromium } from "playwright-core";
chromium,
type Browser,
type BrowserContext,
type Page,
} from "playwright-core";
import type { BrowserScenario } from "../domain/browserScenario.js"; import type { BrowserScenario } from "../domain/browserScenario.js";
import { AnalysisError } from "../domain/analysisErrorBase.js"; import { AnalysisError } from "../domain/analysisErrorBase.js";
@@ -479,7 +474,9 @@ export const openPlaywrightScenarioBrowser = async (
readonly retainCleanup?: (close: () => Promise<unknown>) => void; readonly retainCleanup?: (close: () => Promise<unknown>) => void;
} = {}, } = {},
): Promise<OpenedScenarioBrowser> => { ): Promise<OpenedScenarioBrowser> => {
const launcher = options.launcher ?? chromium; // Load Playwright only when a scenario opens; MCP startup stays off its module graph.
const launcher =
options.launcher ?? (await import("playwright-core")).chromium;
if (scenario.browser.mode === "connect") if (scenario.browser.mode === "connect")
return openAttachedScenarioBrowser( return openAttachedScenarioBrowser(
scenario.browser, scenario.browser,
+1 -1
View File
@@ -1,4 +1,4 @@
import { type BrowserContext, type Page } from "playwright-core"; import type { BrowserContext, Page } from "playwright-core";
import type { BrowserScenario } from "../domain/browserScenario.js"; import type { BrowserScenario } from "../domain/browserScenario.js";
import type { BrowserScenarioAction } from "../domain/browserScenarioValues.js"; import type { BrowserScenarioAction } from "../domain/browserScenarioValues.js";
+1 -1
View File
@@ -16,7 +16,7 @@ import { CLI_COMMANDS } from "../cliCommandNames.js";
import { parseCliJsonInput } from "../cliJsonInput.js"; import { parseCliJsonInput } from "../cliJsonInput.js";
import { logCliCommand } from "../cliLogging.js"; import { logCliCommand } from "../cliLogging.js";
import { projectAnalysisError } from "../domain/analysisErrorProjection.js"; import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { androidApplicationProjectionInputSchema } from "../domain/android/androidApplication.js"; import { androidApplicationProjectionInputSchema } from "../domain/android/androidApplication.js";
import { appleApplicationProjectionInputSchema } from "../domain/apple/appleApplication.js"; import { appleApplicationProjectionInputSchema } from "../domain/apple/appleApplication.js";
import { jsonValueSchema, type JsonValue } from "../domain/jsonValue.js"; import { jsonValueSchema, type JsonValue } from "../domain/jsonValue.js";
+1 -1
View File
@@ -1,5 +1,5 @@
import { constants } from "node:buffer"; import { constants } from "node:buffer";
import { type Writable } from "node:stream"; import type { Writable } from "node:stream";
import { Cli, Filter } from "incur"; import { Cli, Filter } from "incur";
+1 -1
View File
@@ -10,7 +10,7 @@ import type { Logger } from "pino";
import { CLI_COMMANDS } from "./cliCommandNames.js"; import { CLI_COMMANDS } from "./cliCommandNames.js";
import type { JsonValue } from "./domain/jsonValue.js"; import type { JsonValue } from "./domain/jsonValue.js";
import { projectAnalysisError } from "./domain/analysisErrorProjection.js"; import { projectAnalysisError } from "./domain/analysisErrorProjection.js";
import { type AnalysisError } from "./domain/analysisErrorBase.js"; import type { AnalysisError } from "./domain/analysisErrorBase.js";
/** Register caller-path Evidence commands. */ /** Register caller-path Evidence commands. */
export const registerEvidenceCommands = ( export const registerEvidenceCommands = (
+2 -5
View File
@@ -27,11 +27,8 @@ import {
import { ProviderSelectionError } from "./providerSelectionError.js"; import { ProviderSelectionError } from "./providerSelectionError.js";
import { UnknownRegistryError } from "./unknownRegistryError.js"; import { UnknownRegistryError } from "./unknownRegistryError.js";
import { providerRetryAction } from "./providerOperationHealth.js"; import { providerRetryAction } from "./providerOperationHealth.js";
import { import type { AnalysisError, AnalysisErrorTag } from "./analysisErrorBase.js";
type AnalysisError, import type { AnalysisErrorProjection } from "./analysisErrorProjection.js";
type AnalysisErrorTag,
} from "./analysisErrorBase.js";
import { type AnalysisErrorProjection } from "./analysisErrorProjection.js";
export const analysisErrorRemediationAction = ( export const analysisErrorRemediationAction = (
error: AnalysisError, error: AnalysisError,
+1 -4
View File
@@ -40,10 +40,7 @@ import { ProviderAdapterError } from "./providerAdapterError.js";
import { ProviderSelectionError } from "./providerSelectionError.js"; import { ProviderSelectionError } from "./providerSelectionError.js";
import { UnknownRegistryError } from "./unknownRegistryError.js"; import { UnknownRegistryError } from "./unknownRegistryError.js";
import { providerRetryAction } from "./providerOperationHealth.js"; import { providerRetryAction } from "./providerOperationHealth.js";
import { import type { AnalysisError, AnalysisErrorTag } from "./analysisErrorBase.js";
type AnalysisError,
type AnalysisErrorTag,
} from "./analysisErrorBase.js";
/** Project expected failures into exhaustive, secret-safe caller fields. */ /** Project expected failures into exhaustive, secret-safe caller fields. */
export const projectAnalysisError = ( export const projectAnalysisError = (
+4 -4
View File
@@ -1,10 +1,10 @@
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js"; import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
import { z } from "zod"; import { z } from "zod";
import { import type {
type ArtifactInventoryResult, ArtifactInventoryResult,
type ArtifactNode, ArtifactNode,
type ArtifactOccurrence, ArtifactOccurrence,
} from "./artifactGraph.js"; } from "./artifactGraph.js";
import { evidenceSchema } from "./evidence.js"; import { evidenceSchema } from "./evidence.js";
import { import {
@@ -1,8 +1,8 @@
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js"; import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
import type { Evidence } from "../evidence.js"; import type { Evidence } from "../evidence.js";
import { import type {
type ApplicationEdge, ApplicationEdge,
type ApplicationNode, ApplicationNode,
} from "./javascriptApplicationGraphSchemas.js"; } from "./javascriptApplicationGraphSchemas.js";
import type { ApplicationFeatureTraceResult } from "./javascriptFeatureTraceSchemas.js"; import type { ApplicationFeatureTraceResult } from "./javascriptFeatureTraceSchemas.js";
@@ -1,4 +1,4 @@
import { type JavaScriptApplicationGraph } from "./javascriptApplicationGraph.js"; import type { JavaScriptApplicationGraph } from "./javascriptApplicationGraph.js";
import { digestCanonicalValue } from "../canonicalDigest.js"; import { digestCanonicalValue } from "../canonicalDigest.js";
import { uniqueSorted } from "../canonicalOrdering.js"; import { uniqueSorted } from "../canonicalOrdering.js";
import type { StaticLoadStateProjection } from "./javascriptRuntimeLoadState.js"; import type { StaticLoadStateProjection } from "./javascriptRuntimeLoadState.js";
@@ -8,10 +8,10 @@ import type { ApplicationNode } from "../javascript/javascriptApplicationGraphSc
import { managedSourceCoverage } from "./managedApplicationGraphCoverage.js"; import { managedSourceCoverage } from "./managedApplicationGraphCoverage.js";
import type { Evidence } from "../evidence.js"; import type { Evidence } from "../evidence.js";
import { managedTokenScopesMatch } from "./managedInspectionEvidence.js"; import { managedTokenScopesMatch } from "./managedInspectionEvidence.js";
import { import type {
type ManagedArtifactInspection, ManagedArtifactInspection,
type ManagedMemberInspection, ManagedMemberInspection,
type ManagedNativeBoundaryInspection, ManagedNativeBoundaryInspection,
} from "./managedArtifact.js"; } from "./managedArtifact.js";
import type { import type {
GraphBuildState, GraphBuildState,
+1 -1
View File
@@ -7,7 +7,7 @@ import type { ProcessCapture } from "./processCaptureParsing.js";
import { comparableTerminalFrame } from "./processObservation.js"; import { comparableTerminalFrame } from "./processObservation.js";
import { AnalysisInputError } from "../analysisErrorCore.js"; import { AnalysisInputError } from "../analysisErrorCore.js";
import { jsonValueSchema } from "../jsonValue.js"; import { jsonValueSchema } from "../jsonValue.js";
import { type ProcessTraceSpecification } from "./processTraceSpecification.js"; import type { ProcessTraceSpecification } from "./processTraceSpecification.js";
import { processTraceComparisonResultSchema } from "./processTraceEvaluation.js"; import { processTraceComparisonResultSchema } from "./processTraceEvaluation.js";
import { import {
dimensionsForTraceSources, dimensionsForTraceSources,
@@ -4,7 +4,7 @@ import {
parseProcessCapture, parseProcessCapture,
type ProcessCapture, type ProcessCapture,
} from "./processCaptureParsing.js"; } from "./processCaptureParsing.js";
import { type ProcessTraceSpecification } from "./processTraceSpecification.js"; import type { ProcessTraceSpecification } from "./processTraceSpecification.js";
export const emptyCapture = parseProcessCapture(EMPTY_PROCESS_CAPTURE_EXAMPLE); export const emptyCapture = parseProcessCapture(EMPTY_PROCESS_CAPTURE_EXAMPLE);
export const terminal = { sequence: 0, at_ms: 900, data: "Ready" }; export const terminal = { sequence: 0, at_ms: 900, data: "Ready" };
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { parseProcessCapture } from "./processCaptureParsing.js"; import { parseProcessCapture } from "./processCaptureParsing.js";
import { type ProcessTraceSpecification } from "./processTraceSpecification.js"; import type { ProcessTraceSpecification } from "./processTraceSpecification.js";
import { processTraceComparisonResultSchema } from "./processTraceEvaluation.js"; import { processTraceComparisonResultSchema } from "./processTraceEvaluation.js";
import { import {
capture, capture,
+3 -3
View File
@@ -7,9 +7,9 @@ import type {
ManagedMemberInspection, ManagedMemberInspection,
ManagedParseIssue, ManagedParseIssue,
} from "../domain/managed/managedArtifact.js"; } from "../domain/managed/managedArtifact.js";
import { import type {
type ManagedMetadataLayout, ManagedMetadataLayout,
type MetadataTableLayout, MetadataTableLayout,
} from "./ManagedMetadataLayout.js"; } from "./ManagedMetadataLayout.js";
import { import {
metadataRowCursor, metadataRowCursor,
+1 -1
View File
@@ -8,7 +8,7 @@ import {
type ManagedNativeBoundaryInspection, type ManagedNativeBoundaryInspection,
type ManagedParseIssue, type ManagedParseIssue,
} from "../domain/managed/managedArtifact.js"; } from "../domain/managed/managedArtifact.js";
import { type ManagedMetadataLayout } from "./ManagedMetadataLayout.js"; import type { ManagedMetadataLayout } from "./ManagedMetadataLayout.js";
import { import {
metadataRowCursor, metadataRowCursor,
metadataCodedToken, metadataCodedToken,
+1 -1
View File
@@ -10,7 +10,7 @@ import {
AnalysisUnsupportedTargetError, AnalysisUnsupportedTargetError,
} from "../domain/analysisErrorCore.js"; } from "../domain/analysisErrorCore.js";
import { ProviderAdapterError } from "../domain/providerAdapterError.js"; import { ProviderAdapterError } from "../domain/providerAdapterError.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
import type { GhidraInstallationInspection } from "./GhidraInstallation.js"; import type { GhidraInstallationInspection } from "./GhidraInstallation.js";
import { import {
+1 -1
View File
@@ -13,7 +13,7 @@ import {
attestGhidraDosComLoadImage, attestGhidraDosComLoadImage,
attestGhidraDosLoadImage, attestGhidraDosLoadImage,
} from "./GhidraLoadImageValues.js"; } from "./GhidraLoadImageValues.js";
import { type NativeAotPeResult } from "../domain/native/nativeAotPe.js"; import type { NativeAotPeResult } from "../domain/native/nativeAotPe.js";
import type { GhidraTargetSnapshot } from "./GhidraClient.js"; import type { GhidraTargetSnapshot } from "./GhidraClient.js";
import type { GhidraSessionError } from "./GhidraSessionError.js"; import type { GhidraSessionError } from "./GhidraSessionError.js";
+9 -9
View File
@@ -1,13 +1,13 @@
import { snapshotEnvironment } from "../process/snapshotEnvironment.js"; import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
import { import type {
type AnalysisClient, AnalysisClient,
type AnalysisClientContext, AnalysisClientContext,
type AnalysisProfileResolutionOptions, AnalysisProfileResolutionOptions,
type AnalysisProviderCandidate, AnalysisProviderCandidate,
type CapabilityDescriptor, CapabilityDescriptor,
type ProviderAvailability, ProviderAvailability,
type ProviderIdentity, ProviderIdentity,
type ProviderTargetSupport, ProviderTargetSupport,
} from "../application/AnalysisProvider.js"; } from "../application/AnalysisProvider.js";
import type { AppConfig } from "../config/types.js"; import type { AppConfig } from "../config/types.js";
import { import {
+1 -1
View File
@@ -28,7 +28,7 @@ import {
AnalysisResourceConstraintError, AnalysisResourceConstraintError,
AnalysisTimeoutError, AnalysisTimeoutError,
} from "../domain/analysisErrorCore.js"; } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { jsonValueSchema, type JsonValue } from "../domain/jsonValue.js"; import { jsonValueSchema, type JsonValue } from "../domain/jsonValue.js";
import { ProviderAdapterError } from "../domain/providerAdapterError.js"; import { ProviderAdapterError } from "../domain/providerAdapterError.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
+1 -1
View File
@@ -14,7 +14,7 @@ import {
} from "../domain/analysisErrorCore.js"; } from "../domain/analysisErrorCore.js";
import { BinaryTargetError } from "../domain/configurationErrors.js"; import { BinaryTargetError } from "../domain/configurationErrors.js";
import { ProviderAdapterError } from "../domain/providerAdapterError.js"; import { ProviderAdapterError } from "../domain/providerAdapterError.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
import { import {
+1 -1
View File
@@ -17,7 +17,7 @@ import {
HopperStartError, HopperStartError,
HopperTimeoutError, HopperTimeoutError,
} from "../domain/hopperErrors.js"; } from "../domain/hopperErrors.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { import {
hopperStartupFailure, hopperStartupFailure,
type HopperStartupFailureDiagnostic, type HopperStartupFailureDiagnostic,
+1 -1
View File
@@ -5,7 +5,7 @@ import type {
JavaScriptRuntimeTargetLocation, JavaScriptRuntimeTargetLocation,
} from "../domain/javascript/javascriptRuntimeObservation.js"; } from "../domain/javascript/javascriptRuntimeObservation.js";
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { parseCdpEndpointValue, readCdpJson } from "../browser/CdpEndpoint.js"; import { parseCdpEndpointValue, readCdpJson } from "../browser/CdpEndpoint.js";
const versionSchema = z const versionSchema = z
+1 -1
View File
@@ -15,7 +15,7 @@ import { AnalysisError } from "../domain/analysisErrorBase.js";
import { BrowserObservationError } from "../domain/browserObservationError.js"; import { BrowserObservationError } from "../domain/browserObservationError.js";
import type { AnalysisPartialObservation } from "../domain/analysisErrorBase.js"; import type { AnalysisPartialObservation } from "../domain/analysisErrorBase.js";
import { ProviderAdapterError } from "../domain/providerAdapterError.js"; import { ProviderAdapterError } from "../domain/providerAdapterError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js"; import type { BrowserObservationOperation } from "../domain/browserObservationErrors.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
import { import {
numberValue, numberValue,
+3 -3
View File
@@ -2,9 +2,9 @@ import { mkdir, mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os"; import { tmpdir } from "node:os";
import { join } from "node:path"; import { join } from "node:path";
import type { JavaScriptRecoveryPort } from "../../application/javascript/JavaScriptRecoveryPort.js"; import type { JavaScriptRecoveryPort } from "../../application/javascript/JavaScriptRecoveryPort.js";
import { import type {
type AnalysisExecution, AnalysisExecution,
type ExecutionOptions, ExecutionOptions,
} from "../../application/AnalysisProvider.js"; } from "../../application/AnalysisProvider.js";
import { SafeOutputTree } from "../../artifacts/SafeOutputTree.js"; import { SafeOutputTree } from "../../artifacts/SafeOutputTree.js";
import { SafeOutputTreeCreationFailure } from "../../artifacts/SafeOutputTreeCreationFailure.js"; import { SafeOutputTreeCreationFailure } from "../../artifacts/SafeOutputTreeCreationFailure.js";
+1 -1
View File
@@ -13,7 +13,7 @@ import {
AnalysisInputError, AnalysisInputError,
} from "../domain/analysisErrorCore.js"; } from "../domain/analysisErrorCore.js";
import { ProviderAdapterError } from "../domain/providerAdapterError.js"; import { ProviderAdapterError } from "../domain/providerAdapterError.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
import { import {
createNativeUiHelperRuntime, createNativeUiHelperRuntime,
+1 -1
View File
@@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest"; import { describe, expect, it, vi } from "vitest";
import { type ProcessOwnershipHost } from "./ProcessOwnership.js"; import type { ProcessOwnershipHost } from "./ProcessOwnership.js";
import { observeOwnedProcessLineage } from "./ProcessOwnershipObservation.js"; import { observeOwnedProcessLineage } from "./ProcessOwnershipObservation.js";
const ownership = { const ownership = {
runId: "run-token", runId: "run-token",
@@ -5,7 +5,7 @@ import { buildCaptureResult } from "./ProcessCaptureLifecycle.js";
import { isInitializedPtyRoot, readLinuxChildren } from "./ProcessSampling.js"; import { isInitializedPtyRoot, readLinuxChildren } from "./ProcessSampling.js";
import { TerminalRenderer } from "./TerminalRenderer.js"; import { TerminalRenderer } from "./TerminalRenderer.js";
import { parseProcessScenario } from "../../domain/process/processScenario.js"; import { parseProcessScenario } from "../../domain/process/processScenario.js";
import { type ProcessCapture } from "../../domain/process/processCaptureParsing.js"; import type { ProcessCapture } from "../../domain/process/processCaptureParsing.js";
import type { ProcessCaptureTruncationDetails } from "../../domain/process/processCaptureCoverage.js"; import type { ProcessCaptureTruncationDetails } from "../../domain/process/processCaptureCoverage.js";
import { emptyProcessCapture as emptyCapture } from "../../domain/process/processCapture.fixture.js"; import { emptyProcessCapture as emptyCapture } from "../../domain/process/processCapture.fixture.js";
+1 -1
View File
@@ -5,7 +5,7 @@ import type { ProcessScenario } from "../../domain/process/processScenario.js";
import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js"; import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js";
import { err, ok, type Result } from "../../domain/result.js"; import { err, ok, type Result } from "../../domain/result.js";
import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js"; import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { import {
describeProcessCaptureExecutionFailure, describeProcessCaptureExecutionFailure,
ProcessCaptureError, ProcessCaptureError,
+5 -5
View File
@@ -3,11 +3,11 @@ import { err, ok } from "../domain/result.js";
import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js"; import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
import type { ArtifactResourceScope } from "../artifacts/ArtifactResourceScope.js"; import type { ArtifactResourceScope } from "../artifacts/ArtifactResourceScope.js";
import { traverseDirectory } from "./ReferenceSourceReaderEntries.js"; import { traverseDirectory } from "./ReferenceSourceReaderEntries.js";
import { import type {
type ReferenceSourceReaderOptions, ReferenceSourceReaderOptions,
type ReferenceSourceRead, ReferenceSourceRead,
type ReferenceSourceResult, ReferenceSourceResult,
type TraversalState, TraversalState,
} from "./ReferenceSourceReaderTypes.js"; } from "./ReferenceSourceReaderTypes.js";
import { import {
isAborted, isAborted,
@@ -22,12 +22,12 @@ import {
validateDirectory, validateDirectory,
bigLstat, bigLstat,
} from "./ReferenceSourceReaderValidate.js"; } from "./ReferenceSourceReaderValidate.js";
import { import type {
type PendingDirectory, PendingDirectory,
type ReferenceSourceEntry, ReferenceSourceEntry,
type ReferenceSourceEntryKind, ReferenceSourceEntryKind,
type ReferenceSourceResult, ReferenceSourceResult,
type TraversalState, TraversalState,
} from "./ReferenceSourceReaderTypes.js"; } from "./ReferenceSourceReaderTypes.js";
export const traverseDirectory = async ( export const traverseDirectory = async (
+4 -4
View File
@@ -1,7 +1,7 @@
import { import type {
type ReferenceSourceEntry, ReferenceSourceEntry,
type ReferenceSourceFailureCode, ReferenceSourceFailureCode,
type ReferenceSourceReaderError, ReferenceSourceReaderError,
} from "./ReferenceSourceReaderTypes.js"; } from "./ReferenceSourceReaderTypes.js";
export const failure = ( export const failure = (
+3 -3
View File
@@ -21,9 +21,9 @@ import {
sameFile, sameFile,
validateDirectory, validateDirectory,
} from "./ReferenceSourceReaderValidate.js"; } from "./ReferenceSourceReaderValidate.js";
import { import type {
type ReferenceSourceEntry, ReferenceSourceEntry,
type StableFileRequest, StableFileRequest,
} from "./ReferenceSourceReaderTypes.js"; } from "./ReferenceSourceReaderTypes.js";
const READ_CHUNK_BYTES = 64 * 1024; const READ_CHUNK_BYTES = 64 * 1024;
+2 -2
View File
@@ -1,6 +1,6 @@
import { type BigIntStats } from "node:fs"; import type { BigIntStats } from "node:fs";
import { type Result } from "../domain/result.js"; import type { Result } from "../domain/result.js";
import type { AnalysisCleanupObservation } from "../domain/analysisErrorBase.js"; import type { AnalysisCleanupObservation } from "../domain/analysisErrorBase.js";
import type { ArtifactResourceScope } from "../artifacts/ArtifactResourceScope.js"; import type { ArtifactResourceScope } from "../artifacts/ArtifactResourceScope.js";
@@ -10,9 +10,9 @@ import {
rootFilesystemFailure, rootFilesystemFailure,
} from "./ReferenceSourceReaderErrors.js"; } from "./ReferenceSourceReaderErrors.js";
import { isPathWithinRoot } from "../domain/localPath.js"; import { isPathWithinRoot } from "../domain/localPath.js";
import { import type {
type ReferenceSourceFailureCode, ReferenceSourceFailureCode,
type ReferenceSourceResult, ReferenceSourceResult,
} from "./ReferenceSourceReaderTypes.js"; } from "./ReferenceSourceReaderTypes.js";
export const bigLstat = (path: string): Promise<BigIntStats> => export const bigLstat = (path: string): Promise<BigIntStats> =>
@@ -1,7 +1,7 @@
import type { BinarySessionPort } from "../../application/binary/BinarySessionPort.js"; import type { BinarySessionPort } from "../../application/binary/BinarySessionPort.js";
import type { Evidence } from "../../domain/evidence.js"; import type { Evidence } from "../../domain/evidence.js";
import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js"; import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js"; import type { AnalysisError } from "../../domain/analysisErrorBase.js";
import { err, ok, type Result } from "../../domain/result.js"; import { err, ok, type Result } from "../../domain/result.js";
import { recordDerivedEvidence } from "../recordDerivedEvidence.js"; import { recordDerivedEvidence } from "../recordDerivedEvidence.js";
import type { WorkflowUnknownInput } from "./types.js"; import type { WorkflowUnknownInput } from "./types.js";
+1 -1
View File
@@ -3,7 +3,7 @@ import type { EvidenceMcpServer } from "./EvidenceMcpServer.js";
import type { BinarySessionPort } from "../application/binary/BinarySessionPort.js"; import type { BinarySessionPort } from "../application/binary/BinarySessionPort.js";
import { toolContract } from "../contracts/toolContracts.js"; import { toolContract } from "../contracts/toolContracts.js";
import { AnalysisInputError } from "../domain/analysisErrorCore.js"; import { AnalysisInputError } from "../domain/analysisErrorCore.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import { describeValidationFailure } from "../domain/evidenceBundle.js"; import { describeValidationFailure } from "../domain/evidenceBundle.js";
import { EvidenceIntegrityError } from "../domain/evidenceErrors.js"; import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
import { import {
+1 -1
View File
@@ -13,7 +13,7 @@ import { ProcessCaptureError } from "../process/capture/ProcessCaptureError.js";
import { toolContract } from "../contracts/toolContracts.js"; import { toolContract } from "../contracts/toolContracts.js";
import type { AnalysisSnapshot } from "../domain/analysisSnapshot.js"; import type { AnalysisSnapshot } from "../domain/analysisSnapshot.js";
import { UnknownRegistryError } from "../domain/unknownRegistryError.js"; import { UnknownRegistryError } from "../domain/unknownRegistryError.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import type { Evidence } from "../domain/evidence.js"; import type { Evidence } from "../domain/evidence.js";
import type { ProcessCapture } from "../domain/process/processCaptureParsing.js"; import type { ProcessCapture } from "../domain/process/processCaptureParsing.js";
import { err, ok, type Result } from "../domain/result.js"; import { err, ok, type Result } from "../domain/result.js";
+1 -1
View File
@@ -7,7 +7,7 @@ import {
projectAnalysisError, projectAnalysisError,
type AnalysisErrorProjection, type AnalysisErrorProjection,
} from "../domain/analysisErrorProjection.js"; } from "../domain/analysisErrorProjection.js";
import { type AnalysisError } from "../domain/analysisErrorBase.js"; import type { AnalysisError } from "../domain/analysisErrorBase.js";
import type { JsonValue } from "../domain/jsonValue.js"; import type { JsonValue } from "../domain/jsonValue.js";
import type { Result } from "../domain/result.js"; import type { Result } from "../domain/result.js";
import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js"; import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js";
+51 -7
View File
@@ -1,3 +1,5 @@
import { Client } from "@modelcontextprotocol/client";
import { StdioClientTransport } from "@modelcontextprotocol/client/stdio";
import { execFile } from "node:child_process"; import { execFile } from "node:child_process";
import { mkdir, writeFile } from "node:fs/promises"; import { mkdir, writeFile } from "node:fs/promises";
import { join } from "node:path"; import { join } from "node:path";
@@ -42,6 +44,14 @@ registerHooks({
}); });
`)}`; `)}`;
const resolvedMarkers = (stderr: string): ReadonlySet<string> =>
new Set(
stderr
.split("\n")
.filter((line) => line.startsWith(MARKER))
.map((line) => line.slice(MARKER.length)),
);
const resolvedPackages = async ( const resolvedPackages = async (
arguments_: readonly string[], arguments_: readonly string[],
): Promise<ReadonlySet<string>> => { ): Promise<ReadonlySet<string>> => {
@@ -50,12 +60,7 @@ const resolvedPackages = async (
[`--import=${RESOLUTION_HOOK}`, ...arguments_], [`--import=${RESOLUTION_HOOK}`, ...arguments_],
{ cwd: process.cwd(), maxBuffer: 16 * 1_024 * 1_024 }, { cwd: process.cwd(), maxBuffer: 16 * 1_024 * 1_024 },
); );
return new Set( return resolvedMarkers(stderr);
stderr
.split("\n")
.filter((line) => line.startsWith(MARKER))
.map((line) => line.slice(MARKER.length)),
);
}; };
const evaluate = (source: string): readonly string[] => [ const evaluate = (source: string): readonly string[] => [
@@ -66,9 +71,19 @@ const evaluate = (source: string): readonly string[] => [
describe("CLI startup imports", () => { describe("CLI startup imports", () => {
it("detects each deferred package when its command code loads", async () => { it("detects each deferred package when its command code loads", async () => {
const missingBrowser = join(
await createTestTempDirectory("rea-startup-browser-"),
"missing-browser",
);
const scenario = {
browser: { mode: "launch", executable_path: missingBrowser },
environment: { viewport: { width: 1, height: 1 } },
};
await expect( await expect(
resolvedPackages( resolvedPackages(
evaluate('await import("./dist/composition/browserScenario.js");'), evaluate(
`const { openPlaywrightScenarioBrowser } = await import("./dist/browser/PlaywrightScenarioBrowser.js"); await openPlaywrightScenarioBrowser(${JSON.stringify(scenario)}, {}).catch(() => undefined);`,
),
), ),
).resolves.toContain("playwright-core"); ).resolves.toContain("playwright-core");
const source = await createTestTempDirectory("rea-startup-imports-"); const source = await createTestTempDirectory("rea-startup-imports-");
@@ -124,3 +139,32 @@ describe("CLI startup imports", () => {
).resolves.toContain("binary-composition"); ).resolves.toContain("binary-composition");
}); });
}); });
describe("MCP startup imports", () => {
it("does not load command-specific dependencies to initialize and list tools", async () => {
const transport = new StdioClientTransport({
command: process.execPath,
args: [`--import=${RESOLUTION_HOOK}`, "scripts/rea.mjs", "mcp"],
cwd: process.cwd(),
env: { PATH: process.env.PATH ?? "" },
stderr: "pipe",
});
let stderr = "";
transport.stderr?.on("data", (chunk: Buffer) => {
stderr += chunk.toString("utf8");
});
const client = new Client({ name: "rea-startup-imports", version: "1" });
try {
await client.connect(transport);
const { tools } = await client.listTools();
expect(tools.map((tool) => tool.name)).toContain(
"capture_browser_scenario",
);
} finally {
await client.close();
}
const resolved = resolvedMarkers(stderr);
expect(resolved).not.toContain("playwright-core");
expect(resolved).not.toContain("isomorphic-git");
});
});
@@ -4,7 +4,7 @@ import { buffer } from "node:stream/consumers";
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { type ArtifactEntry } from "../../../src/artifacts/ArtifactReader.js"; import type { ArtifactEntry } from "../../../src/artifacts/ArtifactReader.js";
import { DirectoryArtifactReader } from "../../../src/artifacts/DirectoryArtifactReader.js"; import { DirectoryArtifactReader } from "../../../src/artifacts/DirectoryArtifactReader.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js"; import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
@@ -11,9 +11,9 @@ import {
readJavaScriptArtifactFiles, readJavaScriptArtifactFiles,
} from "../../support/javascriptApplicationScope.js"; } from "../../support/javascriptApplicationScope.js";
import { scanArtifactInventory } from "../../fixtures/artifactInventory.js"; import { scanArtifactInventory } from "../../fixtures/artifactInventory.js";
import { import type {
type ArtifactEntry, ArtifactEntry,
type ArtifactReader, ArtifactReader,
} from "../../../src/artifacts/ArtifactReader.js"; } from "../../../src/artifacts/ArtifactReader.js";
import { writeJavaScriptArtifactFixture } from "../../fixtures/javascriptArtifactApplication.js"; import { writeJavaScriptArtifactFixture } from "../../fixtures/javascriptArtifactApplication.js";
@@ -7,7 +7,7 @@ import { MANAGED_WORKFLOW_TOOL_CONTRACTS } from "../../../src/contracts/managed/
import { ENHANCED_TOOL_CONTRACTS } from "../../../src/contracts/enhancedToolContracts.js"; import { ENHANCED_TOOL_CONTRACTS } from "../../../src/contracts/enhancedToolContracts.js";
import { SESSION_TOOL_CONTRACTS } from "../../../src/contracts/sessionToolContracts.js"; import { SESSION_TOOL_CONTRACTS } from "../../../src/contracts/sessionToolContracts.js";
import { TOOL_CONTRACTS } from "../../../src/contracts/toolContracts.js"; import { TOOL_CONTRACTS } from "../../../src/contracts/toolContracts.js";
import {} from "../../../src/domain/jsonValue.js"; import type {} from "../../../src/domain/jsonValue.js";
import { createServer } from "../../../src/server/createServer.js"; import { createServer } from "../../../src/server/createServer.js";
import { observed as ok } from "../../fixtures/analysisExecution.js"; import { observed as ok } from "../../fixtures/analysisExecution.js";
import { createAnalysisExecution } from "../../../src/application/AnalysisProvider.js"; import { createAnalysisExecution } from "../../../src/application/AnalysisProvider.js";
@@ -23,7 +23,7 @@ import {
} from "../../../src/process/capture/ProcessCaptureLifecycle.js"; } from "../../../src/process/capture/ProcessCaptureLifecycle.js";
import { parseProcessScenario } from "../../../src/domain/process/processScenario.js"; import { parseProcessScenario } from "../../../src/domain/process/processScenario.js";
import { emptyProcessCapture } from "../../../src/domain/process/processCapture.fixture.js"; import { emptyProcessCapture } from "../../../src/domain/process/processCapture.fixture.js";
import { type ProcessCapture } from "../../../src/domain/process/processCaptureParsing.js"; import type { ProcessCapture } from "../../../src/domain/process/processCaptureParsing.js";
const processFixture = fileURLToPath( const processFixture = fileURLToPath(
new URL("../../fixtures/processFidelity.mjs", import.meta.url), new URL("../../fixtures/processFidelity.mjs", import.meta.url),
@@ -7,7 +7,7 @@ import { EvidenceFileError } from "../../../src/domain/evidenceErrors.js";
import { HopperRemoteError } from "../../../src/domain/hopperErrors.js"; import { HopperRemoteError } from "../../../src/domain/hopperErrors.js";
import { UnknownRegistryError } from "../../../src/domain/unknownRegistryError.js"; import { UnknownRegistryError } from "../../../src/domain/unknownRegistryError.js";
import { projectAnalysisError } from "../../../src/domain/analysisErrorProjection.js"; import { projectAnalysisError } from "../../../src/domain/analysisErrorProjection.js";
import { type AnalysisError } from "../../../src/domain/analysisErrorBase.js"; import type { AnalysisError } from "../../../src/domain/analysisErrorBase.js";
describe("analysis error projection contract", () => { describe("analysis error projection contract", () => {
it("accepts every closed error-reason variant", () => { it("accepts every closed error-reason variant", () => {
+1 -1
View File
@@ -1,4 +1,4 @@
import { type WebSocket } from "ws"; import type { WebSocket } from "ws";
import type { FakeCdpCommand, FakeOptions } from "./fakeCdpBrowserTypes.js"; import type { FakeCdpCommand, FakeOptions } from "./fakeCdpBrowserTypes.js";