From 0ecf3f2438ec96a6b543942869808018e8d84452 Mon Sep 17 00:00:00 2001 From: Kaoru0822 Date: Sat, 10 Oct 2026 21:04:05 -0700 Subject: [PATCH] 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 * 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 --------- Co-authored-by: Claude Opus 5.5 --- .oxlintrc.json | 3 +- src/application/AnalysisContextQueries.ts | 2 +- src/application/BrowserObservationService.ts | 2 +- .../BrowserScenarioCaptureService.ts | 2 +- src/application/CallPathTracing.ts | 2 +- src/application/DirectAnalysis.ts | 2 +- src/application/EnhancedLiteralTracing.ts | 2 +- src/application/EnhancedToolTypes.ts | 2 +- src/application/EnhancedTools.ts | 2 +- src/application/EvidenceBundleCommands.ts | 2 +- .../InventoryProjectionEvidence.ts | 2 +- .../ReconstructionCoverageService.ts | 2 +- .../ReconstructionObligationLedgerService.ts | 2 +- src/application/ReferenceSourceImport.ts | 6 +- src/application/Setup.fixture.ts | 12 ++-- .../binary/AnalysisSnapshotCache.ts | 2 +- src/application/binary/BinarySession.ts | 2 +- .../binary/BinarySessionExecution.ts | 2 +- src/application/binary/BinarySessionOpen.ts | 4 +- .../binary/BinarySessionRecords.ts | 4 +- .../binary/SessionProviderRouter.ts | 2 +- .../ElectronActiveObservationService.ts | 2 +- .../javascript/ElectronObservationService.ts | 2 +- .../JavaScriptApplicationWorkflowService.ts | 2 +- .../JavaScriptRuntimeObservationService.ts | 2 +- .../JavaScriptRuntimeReconciliationService.ts | 2 +- .../JavaScriptSemanticTraceService.ts | 2 +- .../managed/ManagedApplicationGraphService.ts | 2 +- .../managed/ManagedMemberComparisonService.ts | 2 +- .../ManagedNativeVerificationService.ts | 2 +- .../managed/ManagedReconstructionService.ts | 2 +- src/artifacts/ArtifactProvider.ts | 2 +- .../extraction/ArtifactExtraction.ts | 6 +- src/artifacts/inventory/classify.ts | 2 +- src/artifacts/inventory/scanCanonical.ts | 2 +- src/browser/CdpBrowserProvider.ts | 2 +- src/browser/CdpCaptureValues.ts | 2 +- src/browser/CdpConnection.ts | 2 +- src/browser/CdpElectronProvider.ts | 2 +- src/browser/CdpEndpoint.ts | 2 +- src/browser/CdpPageCapture.ts | 2 +- src/browser/CdpTargetSession.ts | 2 +- .../PlaywrightElectronActiveProvider.ts | 7 ++- src/browser/PlaywrightScenarioBrowser.ts | 11 ++-- src/browser/PlaywrightScenarioSession.ts | 2 +- src/cli/applicationCommands.ts | 2 +- src/cli/streamedJsonOutput.ts | 2 +- src/cliEvidenceCommands.ts | 2 +- src/domain/analysisErrorPresentation.ts | 7 +-- src/domain/analysisErrorProjection.ts | 5 +- src/domain/artifactComparison.ts | 8 +-- .../javascript/javascriptNativeHandoff.ts | 6 +- .../javascriptRuntimeReconciliationResult.ts | 2 +- .../managed/managedApplicationGraphNodes.ts | 8 +-- src/domain/process/processComparison.ts | 2 +- .../process/processTraceComparison.fixture.ts | 2 +- .../process/processTraceComparison.test.ts | 2 +- src/dotnet/ManagedMemberInspectorCore.ts | 6 +- src/dotnet/ManagedNativeBoundaryHelpers.ts | 2 +- src/ghidra/GhidraAnalysisProfile.ts | 2 +- src/ghidra/GhidraLoadImageAttest.ts | 2 +- src/ghidra/GhidraProvider.ts | 18 +++--- src/ghidra/GhidraProviderClient.ts | 2 +- src/hopper/HopperAnalysisProfile.ts | 2 +- src/hopper/HopperClient.ts | 2 +- src/inspector/V8InspectorEndpoint.ts | 2 +- src/inspector/V8InspectorProvider.ts | 2 +- src/javascript/recovery/WakaruProvider.ts | 6 +- src/native/NativeUiObservation.ts | 2 +- src/process/ProcessOwnership.part3.test.ts | 2 +- .../capture/ProcessCaptureObservation.test.ts | 2 +- src/process/capture/ProcessHarness.ts | 2 +- src/reference/ReferenceSourceReader.ts | 10 ++-- src/reference/ReferenceSourceReaderEntries.ts | 12 ++-- src/reference/ReferenceSourceReaderErrors.ts | 8 +-- src/reference/ReferenceSourceReaderFile.ts | 6 +- src/reference/ReferenceSourceReaderTypes.ts | 4 +- .../ReferenceSourceReaderValidate.ts | 6 +- .../registerInvestigationTools/helpers.ts | 2 +- src/server/registerProcessComparisonTool.ts | 2 +- src/server/registerSessionTools.ts | 2 +- src/server/toolResult.ts | 2 +- tests/boundary/cli/cliStartupImports.test.ts | 58 ++++++++++++++++--- .../directoryArtifactReaderOpen.test.ts | 2 +- .../javascriptArtifactReconstruction.test.ts | 6 +- ....01-lists-the-complete-target-open.test.ts | 2 +- .../process/processCaptureLifecycle.test.ts | 2 +- .../contracts/analysisErrorProjection.test.ts | 2 +- tests/fixtures/fakeCdpBrowserEvents.ts | 2 +- 89 files changed, 197 insertions(+), 160 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 2da0945d6..a4618ad11 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -22,7 +22,8 @@ ], "max-params": ["warn", 4], "no-var": "warn", - "no-var-requires": "error" + "no-var-requires": "error", + "typescript/no-import-type-side-effects": "error" }, "overrides": [ { diff --git a/src/application/AnalysisContextQueries.ts b/src/application/AnalysisContextQueries.ts index b82ef410a..cdb008e1f 100644 --- a/src/application/AnalysisContextQueries.ts +++ b/src/application/AnalysisContextQueries.ts @@ -4,7 +4,7 @@ import type { AnalysisOperationPort, } from "./AnalysisProvider.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 { analysisBookmarkSchema } from "../domain/hopperValues.js"; import { resolveAnalysisDocument } from "./AnalysisDocument.js"; diff --git a/src/application/BrowserObservationService.ts b/src/application/BrowserObservationService.ts index 1852dab26..a080f1ef8 100644 --- a/src/application/BrowserObservationService.ts +++ b/src/application/BrowserObservationService.ts @@ -12,7 +12,7 @@ import type { CompareWebScreenshotsInput, } from "../domain/webScreenshot.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 type { ExecutionOptions } from "./AnalysisProvider.js"; import type { BrowserObservationPort } from "./BrowserObservationPort.js"; diff --git a/src/application/BrowserScenarioCaptureService.ts b/src/application/BrowserScenarioCaptureService.ts index ae3500625..3dbd488c6 100644 --- a/src/application/BrowserScenarioCaptureService.ts +++ b/src/application/BrowserScenarioCaptureService.ts @@ -2,7 +2,7 @@ import type { ExecutionOptions } from "./AnalysisProvider.js"; import type { BrowserScenarioCapturePort } from "./BrowserScenarioCapturePort.js"; import { createBrowserScenarioEvidence } from "./BrowserScenarioEvidence.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 { BrowserScenario } from "../domain/browserScenario.js"; import { err, type Result } from "../domain/result.js"; diff --git a/src/application/CallPathTracing.ts b/src/application/CallPathTracing.ts index 7d24a3382..b6e9eb339 100644 --- a/src/application/CallPathTracing.ts +++ b/src/application/CallPathTracing.ts @@ -1,6 +1,6 @@ import type { AnalysisOperation } from "./AnalysisProvider.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 type { JsonValue } from "../domain/jsonValue.js"; import { ok, type Result } from "../domain/result.js"; diff --git a/src/application/DirectAnalysis.ts b/src/application/DirectAnalysis.ts index fe9580793..c8108e614 100644 --- a/src/application/DirectAnalysis.ts +++ b/src/application/DirectAnalysis.ts @@ -18,7 +18,7 @@ import { } from "../contracts/managed/managedToolContracts.js"; import { EvidenceIntegrityError } from "../domain/evidenceErrors.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 { readAnalysisSnapshot, diff --git a/src/application/EnhancedLiteralTracing.ts b/src/application/EnhancedLiteralTracing.ts index 927838150..9c86781bc 100644 --- a/src/application/EnhancedLiteralTracing.ts +++ b/src/application/EnhancedLiteralTracing.ts @@ -1,7 +1,7 @@ import { z } from "zod"; import type { AnalysisOperation } from "./AnalysisProvider.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 { err, ok, type Result } from "../domain/result.js"; import type { diff --git a/src/application/EnhancedToolTypes.ts b/src/application/EnhancedToolTypes.ts index 05cad4303..740e29ac4 100644 --- a/src/application/EnhancedToolTypes.ts +++ b/src/application/EnhancedToolTypes.ts @@ -1,7 +1,7 @@ import type { z } from "zod"; 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 { err, type Result } from "../domain/result.js"; import { diff --git a/src/application/EnhancedTools.ts b/src/application/EnhancedTools.ts index d24fbceef..c4ec83c6c 100644 --- a/src/application/EnhancedTools.ts +++ b/src/application/EnhancedTools.ts @@ -12,7 +12,7 @@ import { AnalysisOutputError, } from "../domain/analysisErrorCore.js"; import { projectAnalysisError } from "../domain/analysisErrorProjection.js"; -import { type AnalysisError } from "../domain/analysisErrorBase.js"; +import type { AnalysisError } from "../domain/analysisErrorBase.js"; import { addressDistance, functionDossierSchema, diff --git a/src/application/EvidenceBundleCommands.ts b/src/application/EvidenceBundleCommands.ts index 5f220e3a1..7b91c05c3 100644 --- a/src/application/EvidenceBundleCommands.ts +++ b/src/application/EvidenceBundleCommands.ts @@ -1,5 +1,5 @@ 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 { JsonValue } from "../domain/jsonValue.js"; import { jsonValueSchema } from "../domain/jsonValue.js"; diff --git a/src/application/InventoryProjectionEvidence.ts b/src/application/InventoryProjectionEvidence.ts index bded3a721..eefc4a9d9 100644 --- a/src/application/InventoryProjectionEvidence.ts +++ b/src/application/InventoryProjectionEvidence.ts @@ -1,7 +1,7 @@ import { z } from "zod"; import { AnalysisProtocolError } from "../domain/analysisErrorCore.js"; -import { type AnalysisError } from "../domain/analysisErrorBase.js"; +import type { AnalysisError } from "../domain/analysisErrorBase.js"; import { createEvidence, type Evidence, diff --git a/src/application/ReconstructionCoverageService.ts b/src/application/ReconstructionCoverageService.ts index 66cad4e76..bd17cf0ca 100644 --- a/src/application/ReconstructionCoverageService.ts +++ b/src/application/ReconstructionCoverageService.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { reconstructionCoverageEvaluationInputSchema } from "../domain/reconstructionCoverageInput.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 { jsonValueSchema, type JsonValue } from "../domain/jsonValue.js"; import { err, ok, type Result } from "../domain/result.js"; diff --git a/src/application/ReconstructionObligationLedgerService.ts b/src/application/ReconstructionObligationLedgerService.ts index 8314bff3b..e0b1f160a 100644 --- a/src/application/ReconstructionObligationLedgerService.ts +++ b/src/application/ReconstructionObligationLedgerService.ts @@ -1,7 +1,7 @@ import { z } from "zod"; 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 { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js"; import { diff --git a/src/application/ReferenceSourceImport.ts b/src/application/ReferenceSourceImport.ts index 3b8ace1e7..769f8bb8c 100644 --- a/src/application/ReferenceSourceImport.ts +++ b/src/application/ReferenceSourceImport.ts @@ -18,9 +18,9 @@ import type { } from "../reference/ReferenceSourceReaderTypes.js"; import { parseReferenceSourceEntries } from "./ReferenceSourceImportEntries.js"; import { readReferenceSourceVcs } from "./ReferenceSourceVcsAdapter.js"; -import { - type ReferenceSourceImportError, - type ReferenceSourceImportOptions, +import type { + ReferenceSourceImportError, + ReferenceSourceImportOptions, } from "./ReferenceSourceImportTypes.js"; import { prepareReferenceSourceImport, diff --git a/src/application/Setup.fixture.ts b/src/application/Setup.fixture.ts index bf9a97810..1fae2d931 100644 --- a/src/application/Setup.fixture.ts +++ b/src/application/Setup.fixture.ts @@ -1,10 +1,10 @@ import { skillDestinations } from "./SetupSkill.js"; -import { - type ClientConfigurationInspection, - type ClientConfigurationResult, - type SetupHost, - type SetupOptions, - type SetupProviderEnvironment, +import type { + ClientConfigurationInspection, + ClientConfigurationResult, + SetupHost, + SetupOptions, + SetupProviderEnvironment, } from "./SetupTypes.js"; import type { SetupClient } from "./SupportedClients.js"; import type { SetupHopperInstallResult } from "./SetupInstallFailure.js"; diff --git a/src/application/binary/AnalysisSnapshotCache.ts b/src/application/binary/AnalysisSnapshotCache.ts index 7d807065c..295b21636 100644 --- a/src/application/binary/AnalysisSnapshotCache.ts +++ b/src/application/binary/AnalysisSnapshotCache.ts @@ -7,7 +7,7 @@ import { AnalysisSnapshotMismatchError, } from "../../domain/evidenceErrors.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 { analysisQueryId, diff --git a/src/application/binary/BinarySession.ts b/src/application/binary/BinarySession.ts index bcf4da184..d64e04f89 100644 --- a/src/application/binary/BinarySession.ts +++ b/src/application/binary/BinarySession.ts @@ -6,7 +6,7 @@ import { type AnalysisProfileCommitment, } from "../../domain/analysisProfile.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 type { JsonValue } from "../../domain/jsonValue.js"; import { createEvidence } from "../../domain/evidence.js"; diff --git a/src/application/binary/BinarySessionExecution.ts b/src/application/binary/BinarySessionExecution.ts index 6893308c3..996749aae 100644 --- a/src/application/binary/BinarySessionExecution.ts +++ b/src/application/binary/BinarySessionExecution.ts @@ -3,7 +3,7 @@ import type { BinaryTarget } from "../../domain/binaryTargetTypes.js"; import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js"; import { NoBinaryOpenError } from "../../domain/configurationErrors.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 { EvidenceSubjectTarget } from "../../domain/evidence.js"; import { err, ok, type Result } from "../../domain/result.js"; diff --git a/src/application/binary/BinarySessionOpen.ts b/src/application/binary/BinarySessionOpen.ts index 1a7f635bc..714bed804 100644 --- a/src/application/binary/BinarySessionOpen.ts +++ b/src/application/binary/BinarySessionOpen.ts @@ -8,12 +8,12 @@ import { } from "../../domain/analysisSnapshot.js"; import type { AnalysisSnapshot } from "../../domain/analysisSnapshot.js"; import { parseBinaryTarget } from "../BinaryTargetResolver.js"; -import { type BinaryTarget } from "../../domain/binaryTargetTypes.js"; +import type { BinaryTarget } from "../../domain/binaryTargetTypes.js"; import { EvidenceIntegrityError, AnalysisSnapshotMismatchError, } 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 type { SessionProviderRoute } from "./SessionProviderRouter.js"; import { SessionProviderRouter } from "./SessionProviderRouter.js"; diff --git a/src/application/binary/BinarySessionRecords.ts b/src/application/binary/BinarySessionRecords.ts index 884c02ff3..1f94dcdfd 100644 --- a/src/application/binary/BinarySessionRecords.ts +++ b/src/application/binary/BinarySessionRecords.ts @@ -9,8 +9,8 @@ import { EvidenceIntegrityError, AnalysisSnapshotMismatchError, } from "../../domain/evidenceErrors.js"; -import { type AnalysisError } from "../../domain/analysisErrorBase.js"; -import { type UnknownRegistryError } from "../../domain/unknownRegistryError.js"; +import type { AnalysisError } from "../../domain/analysisErrorBase.js"; +import type { UnknownRegistryError } from "../../domain/unknownRegistryError.js"; import type { RecordUnknownInput, ResidualUnknown, diff --git a/src/application/binary/SessionProviderRouter.ts b/src/application/binary/SessionProviderRouter.ts index 03bb028a4..dac5c183e 100644 --- a/src/application/binary/SessionProviderRouter.ts +++ b/src/application/binary/SessionProviderRouter.ts @@ -3,7 +3,7 @@ import type { AnalysisProfileCommitment } from "../../domain/analysisProfile.js" import type { BinaryTarget } from "../../domain/binaryTargetTypes.js"; import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.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 type { AnalysisClient, diff --git a/src/application/javascript/ElectronActiveObservationService.ts b/src/application/javascript/ElectronActiveObservationService.ts index 276dc5c17..5a4a84e1d 100644 --- a/src/application/javascript/ElectronActiveObservationService.ts +++ b/src/application/javascript/ElectronActiveObservationService.ts @@ -7,7 +7,7 @@ import { AnalysisCapabilityUnavailableError, AnalysisInputError, } 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 { ElectronActiveObservationInput } from "../../domain/javascript/electronActiveObservation.js"; import { err, type Result } from "../../domain/result.js"; diff --git a/src/application/javascript/ElectronObservationService.ts b/src/application/javascript/ElectronObservationService.ts index 4149db187..307738a0f 100644 --- a/src/application/javascript/ElectronObservationService.ts +++ b/src/application/javascript/ElectronObservationService.ts @@ -6,7 +6,7 @@ import type { ListElectronTargetsInput, } from "../../domain/javascript/electronObservation.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 { createElectronEvidence } from "./ElectronEvidence.js"; diff --git a/src/application/javascript/JavaScriptApplicationWorkflowService.ts b/src/application/javascript/JavaScriptApplicationWorkflowService.ts index cdee1f893..b76259801 100644 --- a/src/application/javascript/JavaScriptApplicationWorkflowService.ts +++ b/src/application/javascript/JavaScriptApplicationWorkflowService.ts @@ -1,7 +1,7 @@ import { z } from "zod"; 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 { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js"; import { compareJavaScriptApplicationVersions } from "../../domain/javascript/javascriptApplicationVersionComparison.js"; diff --git a/src/application/javascript/JavaScriptRuntimeObservationService.ts b/src/application/javascript/JavaScriptRuntimeObservationService.ts index beb9c3142..e1192a441 100644 --- a/src/application/javascript/JavaScriptRuntimeObservationService.ts +++ b/src/application/javascript/JavaScriptRuntimeObservationService.ts @@ -6,7 +6,7 @@ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, } from "../../domain/analysisErrorCore.js"; -import { type AnalysisError } from "../../domain/analysisErrorBase.js"; +import type { AnalysisError } from "../../domain/analysisErrorBase.js"; import type { ListJavaScriptRuntimeTargetsInput, ObserveJavaScriptRuntimeInput, diff --git a/src/application/javascript/JavaScriptRuntimeReconciliationService.ts b/src/application/javascript/JavaScriptRuntimeReconciliationService.ts index ca96d81bc..6c2d0dbcf 100644 --- a/src/application/javascript/JavaScriptRuntimeReconciliationService.ts +++ b/src/application/javascript/JavaScriptRuntimeReconciliationService.ts @@ -2,7 +2,7 @@ import { resolve } from "node:path"; import { z } from "zod"; 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 { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js"; import { diff --git a/src/application/javascript/JavaScriptSemanticTraceService.ts b/src/application/javascript/JavaScriptSemanticTraceService.ts index 24413df43..0a51a9398 100644 --- a/src/application/javascript/JavaScriptSemanticTraceService.ts +++ b/src/application/javascript/JavaScriptSemanticTraceService.ts @@ -4,7 +4,7 @@ import { AnalysisInputError, AnalysisProtocolError, } from "../../domain/analysisErrorCore.js"; -import { type AnalysisError } from "../../domain/analysisErrorBase.js"; +import type { AnalysisError } from "../../domain/analysisErrorBase.js"; import { applicationGraphEvidenceInputError, parseApplicationGraphEvidence, diff --git a/src/application/managed/ManagedApplicationGraphService.ts b/src/application/managed/ManagedApplicationGraphService.ts index 5144cc897..c1a2c8f8c 100644 --- a/src/application/managed/ManagedApplicationGraphService.ts +++ b/src/application/managed/ManagedApplicationGraphService.ts @@ -1,7 +1,7 @@ import { z } from "zod"; import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js"; -import { type AnalysisError } from "../../domain/analysisErrorBase.js"; +import type { AnalysisError } from "../../domain/analysisErrorBase.js"; import { createEvidence, type Evidence, diff --git a/src/application/managed/ManagedMemberComparisonService.ts b/src/application/managed/ManagedMemberComparisonService.ts index 7f7ac75f6..1c0ac8456 100644 --- a/src/application/managed/ManagedMemberComparisonService.ts +++ b/src/application/managed/ManagedMemberComparisonService.ts @@ -11,7 +11,7 @@ import { import { parseManagedMemberEvidence } from "../../domain/managed/managedMemberComparisonMatch.js"; import { AnalysisProtocolError } from "../../domain/analysisErrorCore.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 { jsonValueSchema } from "../../domain/jsonValue.js"; import { parseBinaryTarget } from "../BinaryTargetResolver.js"; diff --git a/src/application/managed/ManagedNativeVerificationService.ts b/src/application/managed/ManagedNativeVerificationService.ts index 7615bd098..09929198e 100644 --- a/src/application/managed/ManagedNativeVerificationService.ts +++ b/src/application/managed/ManagedNativeVerificationService.ts @@ -1,7 +1,7 @@ import { z } from "zod"; 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 { jsonValueSchema } from "../../domain/jsonValue.js"; import { diff --git a/src/application/managed/ManagedReconstructionService.ts b/src/application/managed/ManagedReconstructionService.ts index 0fec81e13..3ac088319 100644 --- a/src/application/managed/ManagedReconstructionService.ts +++ b/src/application/managed/ManagedReconstructionService.ts @@ -1,7 +1,7 @@ import { z } from "zod"; 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 { jsonValueSchema } from "../../domain/jsonValue.js"; import { diff --git a/src/artifacts/ArtifactProvider.ts b/src/artifacts/ArtifactProvider.ts index acf4eeedb..c51bd7f13 100644 --- a/src/artifacts/ArtifactProvider.ts +++ b/src/artifacts/ArtifactProvider.ts @@ -28,7 +28,7 @@ import { AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.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 { interfaceBuilderLimitsSchema } from "../domain/apple/interfaceBuilderGraph.js"; import { err, ok, type Result } from "../domain/result.js"; diff --git a/src/artifacts/extraction/ArtifactExtraction.ts b/src/artifacts/extraction/ArtifactExtraction.ts index f38f601c1..7dd23bcac 100644 --- a/src/artifacts/extraction/ArtifactExtraction.ts +++ b/src/artifacts/extraction/ArtifactExtraction.ts @@ -27,9 +27,9 @@ import { type IntegrityContradiction, } from "../../domain/artifactGraph.js"; import { AnalysisUnsupportedTargetError } from "../../domain/analysisErrorCore.js"; -import { - type ArtifactResourceOwner, - type ArtifactResourceScope, +import type { + ArtifactResourceOwner, + ArtifactResourceScope, } from "../ArtifactResourceScope.js"; import type { BinaryTarget } from "../../domain/binaryTargetTypes.js"; import type { ArtifactInventorySnapshot } from "../../domain/artifactInventorySnapshot.js"; diff --git a/src/artifacts/inventory/classify.ts b/src/artifacts/inventory/classify.ts index 6534fcfdf..c6c3fb353 100644 --- a/src/artifacts/inventory/classify.ts +++ b/src/artifacts/inventory/classify.ts @@ -12,7 +12,7 @@ import { zipPackageFormatForPath, } from "../../domain/zipPackageFormat.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 { hashStableRootArtifactHandle, diff --git a/src/artifacts/inventory/scanCanonical.ts b/src/artifacts/inventory/scanCanonical.ts index 098577311..1eb3a74d2 100644 --- a/src/artifacts/inventory/scanCanonical.ts +++ b/src/artifacts/inventory/scanCanonical.ts @@ -34,7 +34,7 @@ import { artifactManifestId, } from "../../domain/artifactIdentity.js"; import { classifyAndHashRootForInventory } from "./classify.js"; -import { type HashResult } from "../ArtifactHash.js"; +import type { HashResult } from "../ArtifactHash.js"; import { hashStableRootArtifact, hashStableRootArtifactHandle, diff --git a/src/browser/CdpBrowserProvider.ts b/src/browser/CdpBrowserProvider.ts index 72838626d..713871077 100644 --- a/src/browser/CdpBrowserProvider.ts +++ b/src/browser/CdpBrowserProvider.ts @@ -46,7 +46,7 @@ import { AnalysisError } from "../domain/analysisErrorBase.js"; import { AnalysisInputError } from "../domain/analysisErrorCore.js"; import { BrowserObservationError } from "../domain/browserObservationError.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 { discoverCdpEndpoint, diff --git a/src/browser/CdpCaptureValues.ts b/src/browser/CdpCaptureValues.ts index 734d5e832..6d639a454 100644 --- a/src/browser/CdpCaptureValues.ts +++ b/src/browser/CdpCaptureValues.ts @@ -1,6 +1,6 @@ import { AnalysisCancelledError } from "../domain/analysisErrorCore.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 { createWebTextArtifact } from "../domain/webContentArtifact.js"; diff --git a/src/browser/CdpConnection.ts b/src/browser/CdpConnection.ts index 2f6a3f04a..3c7e5e86a 100644 --- a/src/browser/CdpConnection.ts +++ b/src/browser/CdpConnection.ts @@ -4,7 +4,7 @@ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js"; import { AnalysisError } from "../domain/analysisErrorBase.js"; import { BrowserObservationError } from "../domain/browserObservationError.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 { WEB_RUNTIME_LIMITS } from "../domain/webRuntime.js"; diff --git a/src/browser/CdpElectronProvider.ts b/src/browser/CdpElectronProvider.ts index 8191a8ec2..7d42682cb 100644 --- a/src/browser/CdpElectronProvider.ts +++ b/src/browser/CdpElectronProvider.ts @@ -14,7 +14,7 @@ import { import { AnalysisError } from "../domain/analysisErrorBase.js"; import { BrowserObservationError } from "../domain/browserObservationError.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 { discoverCdpEndpoint, diff --git a/src/browser/CdpEndpoint.ts b/src/browser/CdpEndpoint.ts index 178ebc65b..1d1b8c14b 100644 --- a/src/browser/CdpEndpoint.ts +++ b/src/browser/CdpEndpoint.ts @@ -5,7 +5,7 @@ import { z } from "zod"; import { AnalysisCancelledError } from "../domain/analysisErrorCore.js"; import { AnalysisError } from "../domain/analysisErrorBase.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 { safeParseJson } from "../domain/safeJson.js"; diff --git a/src/browser/CdpPageCapture.ts b/src/browser/CdpPageCapture.ts index fdbc81fb4..2e3fa11af 100644 --- a/src/browser/CdpPageCapture.ts +++ b/src/browser/CdpPageCapture.ts @@ -2,7 +2,7 @@ import type { InspectWebPageInput } from "../domain/browserObservation.js"; import type { WebPageInspection } from "../domain/browserObservationSchemas.js"; import type { ProgressReporter } from "../application/ProgressReporter.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 type { CdpEndpointDiscovery, CdpEndpointTarget } from "./CdpEndpoint.js"; import { CdpConnection } from "./CdpConnection.js"; diff --git a/src/browser/CdpTargetSession.ts b/src/browser/CdpTargetSession.ts index 0c2b5b24f..3e1f6eb43 100644 --- a/src/browser/CdpTargetSession.ts +++ b/src/browser/CdpTargetSession.ts @@ -1,5 +1,5 @@ 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 { cdpTargetWebSocket, diff --git a/src/browser/PlaywrightElectronActiveProvider.ts b/src/browser/PlaywrightElectronActiveProvider.ts index 5c730e2fd..9c05465c8 100644 --- a/src/browser/PlaywrightElectronActiveProvider.ts +++ b/src/browser/PlaywrightElectronActiveProvider.ts @@ -3,7 +3,7 @@ import { dirname } from "node:path"; import { randomUUID } from "node:crypto"; import { fileURLToPath } from "node:url"; -import { _electron as electron } from "playwright-core"; +import type { _electron as electron } from "playwright-core"; import type { ExecutionOptions, @@ -60,8 +60,9 @@ type ElectronPaths = { export class PlaywrightElectronActiveProvider implements ElectronActiveObservationPort { constructor( private readonly environment: Readonly>, - private readonly launch: typeof electron.launch = (options) => - electron.launch(options), + // Load Playwright only when a capture launches; MCP startup stays off its module graph. + private readonly launch: typeof electron.launch = async (options) => + (await import("playwright-core"))._electron.launch(options), ) {} identity(): ProviderIdentity { diff --git a/src/browser/PlaywrightScenarioBrowser.ts b/src/browser/PlaywrightScenarioBrowser.ts index 54291e5e4..615ad055e 100644 --- a/src/browser/PlaywrightScenarioBrowser.ts +++ b/src/browser/PlaywrightScenarioBrowser.ts @@ -2,12 +2,7 @@ import { chmod, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join, resolve } from "node:path"; -import { - chromium, - type Browser, - type BrowserContext, - type Page, -} from "playwright-core"; +import type { Browser, BrowserContext, Page, chromium } from "playwright-core"; import type { BrowserScenario } from "../domain/browserScenario.js"; import { AnalysisError } from "../domain/analysisErrorBase.js"; @@ -479,7 +474,9 @@ export const openPlaywrightScenarioBrowser = async ( readonly retainCleanup?: (close: () => Promise) => void; } = {}, ): Promise => { - 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") return openAttachedScenarioBrowser( scenario.browser, diff --git a/src/browser/PlaywrightScenarioSession.ts b/src/browser/PlaywrightScenarioSession.ts index cfb8979db..745561574 100644 --- a/src/browser/PlaywrightScenarioSession.ts +++ b/src/browser/PlaywrightScenarioSession.ts @@ -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 { BrowserScenarioAction } from "../domain/browserScenarioValues.js"; diff --git a/src/cli/applicationCommands.ts b/src/cli/applicationCommands.ts index ac13007f6..929e9064d 100644 --- a/src/cli/applicationCommands.ts +++ b/src/cli/applicationCommands.ts @@ -16,7 +16,7 @@ import { CLI_COMMANDS } from "../cliCommandNames.js"; import { parseCliJsonInput } from "../cliJsonInput.js"; import { logCliCommand } from "../cliLogging.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 { appleApplicationProjectionInputSchema } from "../domain/apple/appleApplication.js"; import { jsonValueSchema, type JsonValue } from "../domain/jsonValue.js"; diff --git a/src/cli/streamedJsonOutput.ts b/src/cli/streamedJsonOutput.ts index 64977c22d..9d21eec0f 100644 --- a/src/cli/streamedJsonOutput.ts +++ b/src/cli/streamedJsonOutput.ts @@ -1,5 +1,5 @@ import { constants } from "node:buffer"; -import { type Writable } from "node:stream"; +import type { Writable } from "node:stream"; import { Cli, Filter } from "incur"; diff --git a/src/cliEvidenceCommands.ts b/src/cliEvidenceCommands.ts index 11a01be8c..308a793ec 100644 --- a/src/cliEvidenceCommands.ts +++ b/src/cliEvidenceCommands.ts @@ -10,7 +10,7 @@ import type { Logger } from "pino"; import { CLI_COMMANDS } from "./cliCommandNames.js"; import type { JsonValue } from "./domain/jsonValue.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. */ export const registerEvidenceCommands = ( diff --git a/src/domain/analysisErrorPresentation.ts b/src/domain/analysisErrorPresentation.ts index dd40bfbe6..07b226947 100644 --- a/src/domain/analysisErrorPresentation.ts +++ b/src/domain/analysisErrorPresentation.ts @@ -27,11 +27,8 @@ import { import { ProviderSelectionError } from "./providerSelectionError.js"; import { UnknownRegistryError } from "./unknownRegistryError.js"; import { providerRetryAction } from "./providerOperationHealth.js"; -import { - type AnalysisError, - type AnalysisErrorTag, -} from "./analysisErrorBase.js"; -import { type AnalysisErrorProjection } from "./analysisErrorProjection.js"; +import type { AnalysisError, AnalysisErrorTag } from "./analysisErrorBase.js"; +import type { AnalysisErrorProjection } from "./analysisErrorProjection.js"; export const analysisErrorRemediationAction = ( error: AnalysisError, diff --git a/src/domain/analysisErrorProjection.ts b/src/domain/analysisErrorProjection.ts index be7b431b6..2ab2a6c5c 100644 --- a/src/domain/analysisErrorProjection.ts +++ b/src/domain/analysisErrorProjection.ts @@ -40,10 +40,7 @@ import { ProviderAdapterError } from "./providerAdapterError.js"; import { ProviderSelectionError } from "./providerSelectionError.js"; import { UnknownRegistryError } from "./unknownRegistryError.js"; import { providerRetryAction } from "./providerOperationHealth.js"; -import { - type AnalysisError, - type AnalysisErrorTag, -} from "./analysisErrorBase.js"; +import type { AnalysisError, AnalysisErrorTag } from "./analysisErrorBase.js"; /** Project expected failures into exhaustive, secret-safe caller fields. */ export const projectAnalysisError = ( diff --git a/src/domain/artifactComparison.ts b/src/domain/artifactComparison.ts index 7cdd419d2..f7c27cdcf 100644 --- a/src/domain/artifactComparison.ts +++ b/src/domain/artifactComparison.ts @@ -1,10 +1,10 @@ import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js"; import { z } from "zod"; -import { - type ArtifactInventoryResult, - type ArtifactNode, - type ArtifactOccurrence, +import type { + ArtifactInventoryResult, + ArtifactNode, + ArtifactOccurrence, } from "./artifactGraph.js"; import { evidenceSchema } from "./evidence.js"; import { diff --git a/src/domain/javascript/javascriptNativeHandoff.ts b/src/domain/javascript/javascriptNativeHandoff.ts index daf224572..7d2f7dfb0 100644 --- a/src/domain/javascript/javascriptNativeHandoff.ts +++ b/src/domain/javascript/javascriptNativeHandoff.ts @@ -1,8 +1,8 @@ import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js"; import type { Evidence } from "../evidence.js"; -import { - type ApplicationEdge, - type ApplicationNode, +import type { + ApplicationEdge, + ApplicationNode, } from "./javascriptApplicationGraphSchemas.js"; import type { ApplicationFeatureTraceResult } from "./javascriptFeatureTraceSchemas.js"; diff --git a/src/domain/javascript/javascriptRuntimeReconciliationResult.ts b/src/domain/javascript/javascriptRuntimeReconciliationResult.ts index 19226f27c..4483a46fd 100644 --- a/src/domain/javascript/javascriptRuntimeReconciliationResult.ts +++ b/src/domain/javascript/javascriptRuntimeReconciliationResult.ts @@ -1,4 +1,4 @@ -import { type JavaScriptApplicationGraph } from "./javascriptApplicationGraph.js"; +import type { JavaScriptApplicationGraph } from "./javascriptApplicationGraph.js"; import { digestCanonicalValue } from "../canonicalDigest.js"; import { uniqueSorted } from "../canonicalOrdering.js"; import type { StaticLoadStateProjection } from "./javascriptRuntimeLoadState.js"; diff --git a/src/domain/managed/managedApplicationGraphNodes.ts b/src/domain/managed/managedApplicationGraphNodes.ts index ff186cecc..064b6f951 100644 --- a/src/domain/managed/managedApplicationGraphNodes.ts +++ b/src/domain/managed/managedApplicationGraphNodes.ts @@ -8,10 +8,10 @@ import type { ApplicationNode } from "../javascript/javascriptApplicationGraphSc import { managedSourceCoverage } from "./managedApplicationGraphCoverage.js"; import type { Evidence } from "../evidence.js"; import { managedTokenScopesMatch } from "./managedInspectionEvidence.js"; -import { - type ManagedArtifactInspection, - type ManagedMemberInspection, - type ManagedNativeBoundaryInspection, +import type { + ManagedArtifactInspection, + ManagedMemberInspection, + ManagedNativeBoundaryInspection, } from "./managedArtifact.js"; import type { GraphBuildState, diff --git a/src/domain/process/processComparison.ts b/src/domain/process/processComparison.ts index 9db90cfb7..21c7bd80b 100644 --- a/src/domain/process/processComparison.ts +++ b/src/domain/process/processComparison.ts @@ -7,7 +7,7 @@ import type { ProcessCapture } from "./processCaptureParsing.js"; import { comparableTerminalFrame } from "./processObservation.js"; import { AnalysisInputError } from "../analysisErrorCore.js"; import { jsonValueSchema } from "../jsonValue.js"; -import { type ProcessTraceSpecification } from "./processTraceSpecification.js"; +import type { ProcessTraceSpecification } from "./processTraceSpecification.js"; import { processTraceComparisonResultSchema } from "./processTraceEvaluation.js"; import { dimensionsForTraceSources, diff --git a/src/domain/process/processTraceComparison.fixture.ts b/src/domain/process/processTraceComparison.fixture.ts index b63f7e6c7..9da69cc84 100644 --- a/src/domain/process/processTraceComparison.fixture.ts +++ b/src/domain/process/processTraceComparison.fixture.ts @@ -4,7 +4,7 @@ import { parseProcessCapture, type ProcessCapture, } 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 terminal = { sequence: 0, at_ms: 900, data: "Ready" }; diff --git a/src/domain/process/processTraceComparison.test.ts b/src/domain/process/processTraceComparison.test.ts index 952bb9758..caeaf7999 100644 --- a/src/domain/process/processTraceComparison.test.ts +++ b/src/domain/process/processTraceComparison.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { parseProcessCapture } from "./processCaptureParsing.js"; -import { type ProcessTraceSpecification } from "./processTraceSpecification.js"; +import type { ProcessTraceSpecification } from "./processTraceSpecification.js"; import { processTraceComparisonResultSchema } from "./processTraceEvaluation.js"; import { capture, diff --git a/src/dotnet/ManagedMemberInspectorCore.ts b/src/dotnet/ManagedMemberInspectorCore.ts index f867bbd02..0c5b4b3ab 100644 --- a/src/dotnet/ManagedMemberInspectorCore.ts +++ b/src/dotnet/ManagedMemberInspectorCore.ts @@ -7,9 +7,9 @@ import type { ManagedMemberInspection, ManagedParseIssue, } from "../domain/managed/managedArtifact.js"; -import { - type ManagedMetadataLayout, - type MetadataTableLayout, +import type { + ManagedMetadataLayout, + MetadataTableLayout, } from "./ManagedMetadataLayout.js"; import { metadataRowCursor, diff --git a/src/dotnet/ManagedNativeBoundaryHelpers.ts b/src/dotnet/ManagedNativeBoundaryHelpers.ts index 4c7498a1b..fb81e1d28 100644 --- a/src/dotnet/ManagedNativeBoundaryHelpers.ts +++ b/src/dotnet/ManagedNativeBoundaryHelpers.ts @@ -8,7 +8,7 @@ import { type ManagedNativeBoundaryInspection, type ManagedParseIssue, } from "../domain/managed/managedArtifact.js"; -import { type ManagedMetadataLayout } from "./ManagedMetadataLayout.js"; +import type { ManagedMetadataLayout } from "./ManagedMetadataLayout.js"; import { metadataRowCursor, metadataCodedToken, diff --git a/src/ghidra/GhidraAnalysisProfile.ts b/src/ghidra/GhidraAnalysisProfile.ts index fa5015dfc..4177a8495 100644 --- a/src/ghidra/GhidraAnalysisProfile.ts +++ b/src/ghidra/GhidraAnalysisProfile.ts @@ -10,7 +10,7 @@ import { AnalysisUnsupportedTargetError, } from "../domain/analysisErrorCore.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 type { GhidraInstallationInspection } from "./GhidraInstallation.js"; import { diff --git a/src/ghidra/GhidraLoadImageAttest.ts b/src/ghidra/GhidraLoadImageAttest.ts index 956f570fa..5034cec43 100644 --- a/src/ghidra/GhidraLoadImageAttest.ts +++ b/src/ghidra/GhidraLoadImageAttest.ts @@ -13,7 +13,7 @@ import { attestGhidraDosComLoadImage, attestGhidraDosLoadImage, } 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 { GhidraSessionError } from "./GhidraSessionError.js"; diff --git a/src/ghidra/GhidraProvider.ts b/src/ghidra/GhidraProvider.ts index 58501bc2a..3ee9a6210 100644 --- a/src/ghidra/GhidraProvider.ts +++ b/src/ghidra/GhidraProvider.ts @@ -1,13 +1,13 @@ import { snapshotEnvironment } from "../process/snapshotEnvironment.js"; -import { - type AnalysisClient, - type AnalysisClientContext, - type AnalysisProfileResolutionOptions, - type AnalysisProviderCandidate, - type CapabilityDescriptor, - type ProviderAvailability, - type ProviderIdentity, - type ProviderTargetSupport, +import type { + AnalysisClient, + AnalysisClientContext, + AnalysisProfileResolutionOptions, + AnalysisProviderCandidate, + CapabilityDescriptor, + ProviderAvailability, + ProviderIdentity, + ProviderTargetSupport, } from "../application/AnalysisProvider.js"; import type { AppConfig } from "../config/types.js"; import { diff --git a/src/ghidra/GhidraProviderClient.ts b/src/ghidra/GhidraProviderClient.ts index f024ab422..15eb5dbd9 100644 --- a/src/ghidra/GhidraProviderClient.ts +++ b/src/ghidra/GhidraProviderClient.ts @@ -28,7 +28,7 @@ import { AnalysisResourceConstraintError, AnalysisTimeoutError, } 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 { ProviderAdapterError } from "../domain/providerAdapterError.js"; import { err, ok, type Result } from "../domain/result.js"; diff --git a/src/hopper/HopperAnalysisProfile.ts b/src/hopper/HopperAnalysisProfile.ts index 3ac7640df..9c1f40a1a 100644 --- a/src/hopper/HopperAnalysisProfile.ts +++ b/src/hopper/HopperAnalysisProfile.ts @@ -14,7 +14,7 @@ import { } from "../domain/analysisErrorCore.js"; import { BinaryTargetError } from "../domain/configurationErrors.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 { diff --git a/src/hopper/HopperClient.ts b/src/hopper/HopperClient.ts index c001c3e5e..0db051556 100644 --- a/src/hopper/HopperClient.ts +++ b/src/hopper/HopperClient.ts @@ -17,7 +17,7 @@ import { HopperStartError, HopperTimeoutError, } from "../domain/hopperErrors.js"; -import { type AnalysisError } from "../domain/analysisErrorBase.js"; +import type { AnalysisError } from "../domain/analysisErrorBase.js"; import { hopperStartupFailure, type HopperStartupFailureDiagnostic, diff --git a/src/inspector/V8InspectorEndpoint.ts b/src/inspector/V8InspectorEndpoint.ts index 24146d469..fdb172591 100644 --- a/src/inspector/V8InspectorEndpoint.ts +++ b/src/inspector/V8InspectorEndpoint.ts @@ -5,7 +5,7 @@ import type { JavaScriptRuntimeTargetLocation, } from "../domain/javascript/javascriptRuntimeObservation.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"; const versionSchema = z diff --git a/src/inspector/V8InspectorProvider.ts b/src/inspector/V8InspectorProvider.ts index 78a22fe10..33a011651 100644 --- a/src/inspector/V8InspectorProvider.ts +++ b/src/inspector/V8InspectorProvider.ts @@ -15,7 +15,7 @@ import { AnalysisError } from "../domain/analysisErrorBase.js"; import { BrowserObservationError } from "../domain/browserObservationError.js"; import type { AnalysisPartialObservation } from "../domain/analysisErrorBase.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 { numberValue, diff --git a/src/javascript/recovery/WakaruProvider.ts b/src/javascript/recovery/WakaruProvider.ts index 008f48096..2838738d0 100644 --- a/src/javascript/recovery/WakaruProvider.ts +++ b/src/javascript/recovery/WakaruProvider.ts @@ -2,9 +2,9 @@ import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import type { JavaScriptRecoveryPort } from "../../application/javascript/JavaScriptRecoveryPort.js"; -import { - type AnalysisExecution, - type ExecutionOptions, +import type { + AnalysisExecution, + ExecutionOptions, } from "../../application/AnalysisProvider.js"; import { SafeOutputTree } from "../../artifacts/SafeOutputTree.js"; import { SafeOutputTreeCreationFailure } from "../../artifacts/SafeOutputTreeCreationFailure.js"; diff --git a/src/native/NativeUiObservation.ts b/src/native/NativeUiObservation.ts index 9dc337189..021e0d132 100644 --- a/src/native/NativeUiObservation.ts +++ b/src/native/NativeUiObservation.ts @@ -13,7 +13,7 @@ import { AnalysisInputError, } from "../domain/analysisErrorCore.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 { createNativeUiHelperRuntime, diff --git a/src/process/ProcessOwnership.part3.test.ts b/src/process/ProcessOwnership.part3.test.ts index b782c6f77..bab43d7a9 100644 --- a/src/process/ProcessOwnership.part3.test.ts +++ b/src/process/ProcessOwnership.part3.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { type ProcessOwnershipHost } from "./ProcessOwnership.js"; +import type { ProcessOwnershipHost } from "./ProcessOwnership.js"; import { observeOwnedProcessLineage } from "./ProcessOwnershipObservation.js"; const ownership = { runId: "run-token", diff --git a/src/process/capture/ProcessCaptureObservation.test.ts b/src/process/capture/ProcessCaptureObservation.test.ts index 7bd54a124..ddf0ffd42 100644 --- a/src/process/capture/ProcessCaptureObservation.test.ts +++ b/src/process/capture/ProcessCaptureObservation.test.ts @@ -5,7 +5,7 @@ import { buildCaptureResult } from "./ProcessCaptureLifecycle.js"; import { isInitializedPtyRoot, readLinuxChildren } from "./ProcessSampling.js"; import { TerminalRenderer } from "./TerminalRenderer.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 { emptyProcessCapture as emptyCapture } from "../../domain/process/processCapture.fixture.js"; diff --git a/src/process/capture/ProcessHarness.ts b/src/process/capture/ProcessHarness.ts index 10275a7e3..352b13ba9 100644 --- a/src/process/capture/ProcessHarness.ts +++ b/src/process/capture/ProcessHarness.ts @@ -5,7 +5,7 @@ import type { ProcessScenario } from "../../domain/process/processScenario.js"; import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js"; import { err, ok, type Result } from "../../domain/result.js"; import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js"; -import { type AnalysisError } from "../../domain/analysisErrorBase.js"; +import type { AnalysisError } from "../../domain/analysisErrorBase.js"; import { describeProcessCaptureExecutionFailure, ProcessCaptureError, diff --git a/src/reference/ReferenceSourceReader.ts b/src/reference/ReferenceSourceReader.ts index aa1e3b1d4..e8e8650a1 100644 --- a/src/reference/ReferenceSourceReader.ts +++ b/src/reference/ReferenceSourceReader.ts @@ -3,11 +3,11 @@ import { err, ok } from "../domain/result.js"; import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js"; import type { ArtifactResourceScope } from "../artifacts/ArtifactResourceScope.js"; import { traverseDirectory } from "./ReferenceSourceReaderEntries.js"; -import { - type ReferenceSourceReaderOptions, - type ReferenceSourceRead, - type ReferenceSourceResult, - type TraversalState, +import type { + ReferenceSourceReaderOptions, + ReferenceSourceRead, + ReferenceSourceResult, + TraversalState, } from "./ReferenceSourceReaderTypes.js"; import { isAborted, diff --git a/src/reference/ReferenceSourceReaderEntries.ts b/src/reference/ReferenceSourceReaderEntries.ts index cad5b7864..a746c01e4 100644 --- a/src/reference/ReferenceSourceReaderEntries.ts +++ b/src/reference/ReferenceSourceReaderEntries.ts @@ -22,12 +22,12 @@ import { validateDirectory, bigLstat, } from "./ReferenceSourceReaderValidate.js"; -import { - type PendingDirectory, - type ReferenceSourceEntry, - type ReferenceSourceEntryKind, - type ReferenceSourceResult, - type TraversalState, +import type { + PendingDirectory, + ReferenceSourceEntry, + ReferenceSourceEntryKind, + ReferenceSourceResult, + TraversalState, } from "./ReferenceSourceReaderTypes.js"; export const traverseDirectory = async ( diff --git a/src/reference/ReferenceSourceReaderErrors.ts b/src/reference/ReferenceSourceReaderErrors.ts index 49877be72..6ddd02a3f 100644 --- a/src/reference/ReferenceSourceReaderErrors.ts +++ b/src/reference/ReferenceSourceReaderErrors.ts @@ -1,7 +1,7 @@ -import { - type ReferenceSourceEntry, - type ReferenceSourceFailureCode, - type ReferenceSourceReaderError, +import type { + ReferenceSourceEntry, + ReferenceSourceFailureCode, + ReferenceSourceReaderError, } from "./ReferenceSourceReaderTypes.js"; export const failure = ( diff --git a/src/reference/ReferenceSourceReaderFile.ts b/src/reference/ReferenceSourceReaderFile.ts index 27b5c37ef..e8cabdaeb 100644 --- a/src/reference/ReferenceSourceReaderFile.ts +++ b/src/reference/ReferenceSourceReaderFile.ts @@ -21,9 +21,9 @@ import { sameFile, validateDirectory, } from "./ReferenceSourceReaderValidate.js"; -import { - type ReferenceSourceEntry, - type StableFileRequest, +import type { + ReferenceSourceEntry, + StableFileRequest, } from "./ReferenceSourceReaderTypes.js"; const READ_CHUNK_BYTES = 64 * 1024; diff --git a/src/reference/ReferenceSourceReaderTypes.ts b/src/reference/ReferenceSourceReaderTypes.ts index 76096ef71..3b0a368b5 100644 --- a/src/reference/ReferenceSourceReaderTypes.ts +++ b/src/reference/ReferenceSourceReaderTypes.ts @@ -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 { ArtifactResourceScope } from "../artifacts/ArtifactResourceScope.js"; diff --git a/src/reference/ReferenceSourceReaderValidate.ts b/src/reference/ReferenceSourceReaderValidate.ts index 750426e1a..33cfbf668 100644 --- a/src/reference/ReferenceSourceReaderValidate.ts +++ b/src/reference/ReferenceSourceReaderValidate.ts @@ -10,9 +10,9 @@ import { rootFilesystemFailure, } from "./ReferenceSourceReaderErrors.js"; import { isPathWithinRoot } from "../domain/localPath.js"; -import { - type ReferenceSourceFailureCode, - type ReferenceSourceResult, +import type { + ReferenceSourceFailureCode, + ReferenceSourceResult, } from "./ReferenceSourceReaderTypes.js"; export const bigLstat = (path: string): Promise => diff --git a/src/server/registerInvestigationTools/helpers.ts b/src/server/registerInvestigationTools/helpers.ts index ed5ab8334..1d342c0b5 100644 --- a/src/server/registerInvestigationTools/helpers.ts +++ b/src/server/registerInvestigationTools/helpers.ts @@ -1,7 +1,7 @@ import type { BinarySessionPort } from "../../application/binary/BinarySessionPort.js"; import type { Evidence } from "../../domain/evidence.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 { recordDerivedEvidence } from "../recordDerivedEvidence.js"; import type { WorkflowUnknownInput } from "./types.js"; diff --git a/src/server/registerProcessComparisonTool.ts b/src/server/registerProcessComparisonTool.ts index ce5feb597..3123f0e4b 100644 --- a/src/server/registerProcessComparisonTool.ts +++ b/src/server/registerProcessComparisonTool.ts @@ -3,7 +3,7 @@ import type { EvidenceMcpServer } from "./EvidenceMcpServer.js"; import type { BinarySessionPort } from "../application/binary/BinarySessionPort.js"; import { toolContract } from "../contracts/toolContracts.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 { EvidenceIntegrityError } from "../domain/evidenceErrors.js"; import { diff --git a/src/server/registerSessionTools.ts b/src/server/registerSessionTools.ts index 3541af850..b716d96f5 100644 --- a/src/server/registerSessionTools.ts +++ b/src/server/registerSessionTools.ts @@ -13,7 +13,7 @@ import { ProcessCaptureError } from "../process/capture/ProcessCaptureError.js"; import { toolContract } from "../contracts/toolContracts.js"; import type { AnalysisSnapshot } from "../domain/analysisSnapshot.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 { ProcessCapture } from "../domain/process/processCaptureParsing.js"; import { err, ok, type Result } from "../domain/result.js"; diff --git a/src/server/toolResult.ts b/src/server/toolResult.ts index 6daddc695..e1d4b775f 100644 --- a/src/server/toolResult.ts +++ b/src/server/toolResult.ts @@ -7,7 +7,7 @@ import { projectAnalysisError, type AnalysisErrorProjection, } 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 { Result } from "../domain/result.js"; import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js"; diff --git a/tests/boundary/cli/cliStartupImports.test.ts b/tests/boundary/cli/cliStartupImports.test.ts index c5511cf6d..2b8bf9359 100644 --- a/tests/boundary/cli/cliStartupImports.test.ts +++ b/tests/boundary/cli/cliStartupImports.test.ts @@ -1,3 +1,5 @@ +import { Client } from "@modelcontextprotocol/client"; +import { StdioClientTransport } from "@modelcontextprotocol/client/stdio"; import { execFile } from "node:child_process"; import { mkdir, writeFile } from "node:fs/promises"; import { join } from "node:path"; @@ -42,6 +44,14 @@ registerHooks({ }); `)}`; +const resolvedMarkers = (stderr: string): ReadonlySet => + new Set( + stderr + .split("\n") + .filter((line) => line.startsWith(MARKER)) + .map((line) => line.slice(MARKER.length)), + ); + const resolvedPackages = async ( arguments_: readonly string[], ): Promise> => { @@ -50,12 +60,7 @@ const resolvedPackages = async ( [`--import=${RESOLUTION_HOOK}`, ...arguments_], { cwd: process.cwd(), maxBuffer: 16 * 1_024 * 1_024 }, ); - return new Set( - stderr - .split("\n") - .filter((line) => line.startsWith(MARKER)) - .map((line) => line.slice(MARKER.length)), - ); + return resolvedMarkers(stderr); }; const evaluate = (source: string): readonly string[] => [ @@ -66,9 +71,19 @@ const evaluate = (source: string): readonly string[] => [ describe("CLI startup imports", () => { 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( 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"); const source = await createTestTempDirectory("rea-startup-imports-"); @@ -124,3 +139,32 @@ describe("CLI startup imports", () => { ).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"); + }); +}); diff --git a/tests/boundary/filesystem/directoryArtifactReaderOpen.test.ts b/tests/boundary/filesystem/directoryArtifactReaderOpen.test.ts index 387eced40..b8124dcf2 100644 --- a/tests/boundary/filesystem/directoryArtifactReaderOpen.test.ts +++ b/tests/boundary/filesystem/directoryArtifactReaderOpen.test.ts @@ -4,7 +4,7 @@ import { buffer } from "node:stream/consumers"; 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 { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js"; diff --git a/tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts b/tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts index 27b953ef9..b1c6952ba 100644 --- a/tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts +++ b/tests/boundary/filesystem/javascriptArtifactReconstruction.test.ts @@ -11,9 +11,9 @@ import { readJavaScriptArtifactFiles, } from "../../support/javascriptApplicationScope.js"; import { scanArtifactInventory } from "../../fixtures/artifactInventory.js"; -import { - type ArtifactEntry, - type ArtifactReader, +import type { + ArtifactEntry, + ArtifactReader, } from "../../../src/artifacts/ArtifactReader.js"; import { writeJavaScriptArtifactFixture } from "../../fixtures/javascriptArtifactApplication.js"; diff --git a/tests/boundary/mcp/enhancedTools.01-lists-the-complete-target-open.test.ts b/tests/boundary/mcp/enhancedTools.01-lists-the-complete-target-open.test.ts index 0da86dfc5..5d031b940 100644 --- a/tests/boundary/mcp/enhancedTools.01-lists-the-complete-target-open.test.ts +++ b/tests/boundary/mcp/enhancedTools.01-lists-the-complete-target-open.test.ts @@ -7,7 +7,7 @@ import { MANAGED_WORKFLOW_TOOL_CONTRACTS } from "../../../src/contracts/managed/ import { ENHANCED_TOOL_CONTRACTS } from "../../../src/contracts/enhancedToolContracts.js"; import { SESSION_TOOL_CONTRACTS } from "../../../src/contracts/sessionToolContracts.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 { observed as ok } from "../../fixtures/analysisExecution.js"; import { createAnalysisExecution } from "../../../src/application/AnalysisProvider.js"; diff --git a/tests/boundary/process/processCaptureLifecycle.test.ts b/tests/boundary/process/processCaptureLifecycle.test.ts index 24563c883..b64b13078 100644 --- a/tests/boundary/process/processCaptureLifecycle.test.ts +++ b/tests/boundary/process/processCaptureLifecycle.test.ts @@ -23,7 +23,7 @@ import { } from "../../../src/process/capture/ProcessCaptureLifecycle.js"; import { parseProcessScenario } from "../../../src/domain/process/processScenario.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( new URL("../../fixtures/processFidelity.mjs", import.meta.url), diff --git a/tests/conformance/contracts/analysisErrorProjection.test.ts b/tests/conformance/contracts/analysisErrorProjection.test.ts index e98804bc0..bb7014dde 100644 --- a/tests/conformance/contracts/analysisErrorProjection.test.ts +++ b/tests/conformance/contracts/analysisErrorProjection.test.ts @@ -7,7 +7,7 @@ import { EvidenceFileError } from "../../../src/domain/evidenceErrors.js"; import { HopperRemoteError } from "../../../src/domain/hopperErrors.js"; import { UnknownRegistryError } from "../../../src/domain/unknownRegistryError.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", () => { it("accepts every closed error-reason variant", () => { diff --git a/tests/fixtures/fakeCdpBrowserEvents.ts b/tests/fixtures/fakeCdpBrowserEvents.ts index 536cc8b72..1d1dd5fe3 100644 --- a/tests/fixtures/fakeCdpBrowserEvents.ts +++ b/tests/fixtures/fakeCdpBrowserEvents.ts @@ -1,4 +1,4 @@ -import { type WebSocket } from "ws"; +import type { WebSocket } from "ws"; import type { FakeCdpCommand, FakeOptions } from "./fakeCdpBrowserTypes.js";