From 021ba690b07eab4b990be47f90946db9f70e0fc0 Mon Sep 17 00:00:00 2001
From: ysopwnable <161784452+N0zoM1z0@users.noreply.github.com>
Date: Wed, 7 Oct 2026 13:53:25 +0800
Subject: [PATCH] refactor: give Inspector its own capability directory (#869)
---
AGENTS.md | 4 ++--
docs/architecture.mermaid | 4 ++++
docs/capability-migration.md | 18 ++++++++++++++++++
docs/testing.md | 9 +++++++++
package.json | 2 +-
scripts/lib/catalog-core.mjs | 2 +-
scripts/lib/module-boundaries.mjs | 1 +
.../inspector/runtime-observation.mjs} | 6 ++----
src/browser/providerIdentities.ts | 7 -------
.../javascriptRuntimeObservation.ts | 2 +-
.../optionalObservationProviders.ts | 2 +-
.../JavaScriptRuntimeScope.test.ts | 0
.../JavaScriptRuntimeScope.ts | 2 +-
.../V8InspectorCaptureProjection.ts | 0
.../V8InspectorEndpoint.ts | 2 +-
.../V8InspectorProvider.cleanup.test.ts | 0
.../V8InspectorProvider.ts | 8 ++++----
src/inspector/providerIdentity.ts | 8 ++++++++
.../javascriptRuntimeObservationCli.test.ts | 4 ++--
tests/boundary/cli/productCatalog.test.ts | 2 +-
.../javascriptRuntimeObservation.test.ts | 6 +++---
.../javascriptRuntimeTargetLocations.test.ts | 4 ++--
.../javascriptRuntimeUnresolvedTarget.test.ts | 4 ++--
.../javascriptRuntimeObservationMcp.test.ts | 4 ++--
.../node-target.mjs | 0
tests/evaluation/moduleBoundaries.test.ts | 5 ++++-
.../{ => inspector}/fakeV8Inspector.ts | 0
tests/fixtures/optionalObservationProviders.ts | 6 ++----
vitest.config.ts | 2 +-
29 files changed, 73 insertions(+), 41 deletions(-)
rename scripts/{verify-real-javascript-runtime-observation.mjs => verify/inspector/runtime-observation.mjs} (98%)
rename src/{browser => inspector}/JavaScriptRuntimeScope.test.ts (100%)
rename src/{browser => inspector}/JavaScriptRuntimeScope.ts (98%)
rename src/{browser => inspector}/V8InspectorCaptureProjection.ts (100%)
rename src/{browser => inspector}/V8InspectorEndpoint.ts (97%)
rename src/{browser => inspector}/V8InspectorProvider.cleanup.test.ts (100%)
rename src/{browser => inspector}/V8InspectorProvider.ts (99%)
create mode 100644 src/inspector/providerIdentity.ts
rename tests/boundary/{browser => inspector}/javascriptRuntimeObservation.test.ts (98%)
rename tests/boundary/{browser => inspector}/javascriptRuntimeTargetLocations.test.ts (97%)
rename tests/{composition/runtime-observation => boundary/inspector}/javascriptRuntimeUnresolvedTarget.test.ts (94%)
rename tests/conformance/{runtime-inspector => inspector}/node-target.mjs (100%)
rename tests/fixtures/{ => inspector}/fakeV8Inspector.ts (100%)
diff --git a/AGENTS.md b/AGENTS.md
index d7f7ed3df7..a3f3e35e4a 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -20,10 +20,10 @@ REA is a local-only tool. Preserve caller-selected inputs, captured output, URLs
REA is a layered ESM TypeScript application. Dependencies flow inward from pure domain logic through contracts, providers, application workflows, and CLI/MCP adapters. See [docs/architecture.mermaid](docs/architecture.mermaid) for the component map.
- `src/domain/` owns pure provider-neutral semantics; `src/contracts/` owns caller-visible schemas and the canonical tool inventory.
-- `src/hopper/`, `src/ghidra/`, `src/ida/`, `src/browser/`, `src/native/`, `src/artifacts/`, and `src/dotnet/` own provider-specific boundaries. Keep provider protocols out of domain and application code.
+- `src/hopper/`, `src/ghidra/`, `src/ida/`, `src/browser/`, `src/inspector/`, `src/native/`, `src/artifacts/`, and `src/dotnet/` own provider-specific boundaries. Keep provider protocols out of domain and application code.
- `src/application/` composes shared CLI/MCP workflows; `src/server/` translates MCP requests; `src/cli.ts` and `src/main.ts` are the CLI and MCP entry points.
- `src/process/` owns shared process lifecycle primitives, not provider wire protocols. `bridge/` contains provider-side adapters.
-- `tests/` contains unit, composition, boundary, acceptance, and conformance tests. `scripts/verify-*` contains real-toolchain checks.
+- `tests/` contains unit, composition, boundary, acceptance, and conformance tests. `scripts/verify-*` and capability directories under `scripts/verify/` contain real-toolchain checks.
- `docs/product-catalog.json` is generated. Update its source contracts and regenerate it; do not edit it directly.
## Build, Test, and Development Commands
diff --git a/docs/architecture.mermaid b/docs/architecture.mermaid
index badf1a25c2..41f723bec2 100644
--- a/docs/architecture.mermaid
+++ b/docs/architecture.mermaid
@@ -28,6 +28,7 @@ graph TD
IDA_MCP["External ida-pro-mcp
GUI proxy or database supervisor
upstream installation and engine lifecycle"]
AUX["src/artifacts/ + src/native/
disjoint artifact and native capabilities"]
BROWSER["src/browser/
CDP / Playwright capture
captured script adapters and publication"]
+ INSPECTOR["src/inspector/
passive V8 Inspector discovery and capture
script and target locations"]
DOTNET["src/dotnet/
Managed static metadata provider
PE/CLI metadata inventory, members, IL"]
FIRMWARE["src/firmware/
Binwalk / Unblob adapters
owned processes, report normalization, private extraction"]
ANDROID["src/android/
Static APK adapter
owned SDK stdio, pinned headless JADX, normalization"]
@@ -94,6 +95,9 @@ graph TD
SERVER --> CONTRACTS
SERVER --> APP
APP --> BROWSER
+ APP -->|runtime observation port| INSPECTOR
+ INSPECTOR -->|shared CDP and file-location helpers| BROWSER
+ INSPECTOR --> DOMAIN
APP --> DOTNET
DOTNET --> DOMAIN
HOPPER --> HOPPER_BRIDGE
diff --git a/docs/capability-migration.md b/docs/capability-migration.md
index c5d29f3dbf..5287ccbab6 100644
--- a/docs/capability-migration.md
+++ b/docs/capability-migration.md
@@ -167,6 +167,24 @@ behavior. Snapshots still require an active target and concrete analysis profile
extracting investigation ownership does not make them a target-free record store.
#721 remains responsible for any future lifetime-policy change.
+## Inspector adapter ownership
+
+`src/inspector/` owns V8 Inspector discovery, passive capture, script/target
+location interpretation and its lightweight provider identity. The composition
+factory and optional loader use this owner. Browser CDP connection, endpoint/value
+and Electron file-location helpers remain deliberate shared adapter utilities at
+their existing paths; no provider wire protocol moves into domain or process.
+
+Loopback fixtures and producer boundaries now live under
+`tests/fixtures/inspector/` and `tests/boundary/inspector/`. The socket-backed
+unresolved-target reconciliation test moves from composition into the forked
+boundary lane with its original assertions. Adapter tests retain fork isolation.
+`npm run verify:inspector` keeps its public development entrypoint and delegates
+to `scripts/verify/inspector/runtime-observation.mjs`, using the real Node fixture
+under `tests/conformance/inspector/`. Catalog imports, source guards and test
+discovery follow the new paths. Observation authority, lifecycle, producer
+interpretation and caller-visible contracts stay unchanged.
+
## Auxiliary source declaration pilot
Artifact, macOS native and managed static metadata now belongs to each adapter's
diff --git a/docs/testing.md b/docs/testing.md
index d052d47110..70f2634d2f 100644
--- a/docs/testing.md
+++ b/docs/testing.md
@@ -171,6 +171,15 @@ the CLI and stdio MCP, including special filenames, unresolved discovery
locations, and independently resolved loaded scripts. Double-quote filenames
are tested on POSIX only because Windows does not support them.
+Inspector adapters live in `src/inspector/`, with loopback fixtures under
+`tests/fixtures/inspector/` and forked producer boundaries under
+`tests/boundary/inspector/`. The real lane is owned by
+`scripts/verify/inspector/runtime-observation.mjs` and
+`tests/conformance/inspector/`. Browser and Inspector deliberately share the
+existing browser CDP transport/value and file-location helpers. Node fixture
+success proves this Inspector workflow on the tested host; it does not prove
+Electron GUI behavior or another engine.
+
## Android APK analysis
`npm run verify:android` requires an existing Java 17+ and an explicit
diff --git a/package.json b/package.json
index da4ab2edae..979aaa38f8 100644
--- a/package.json
+++ b/package.json
@@ -135,7 +135,7 @@
"verify:browser:dom": "node scripts/verify-browser-dom-destinations.mjs",
"verify:browser:network": "npm run build:cached && node scripts/verify-browser-network.mjs",
"verify:electron": "npm run build:cached && node scripts/verify-real-electron.mjs",
- "verify:inspector": "npm run build:cached && node scripts/verify-real-javascript-runtime-observation.mjs",
+ "verify:inspector": "npm run build:cached && node scripts/verify/inspector/runtime-observation.mjs",
"verify:javascript-runtime": "npm run build:cached && node scripts/verify-local-javascript-runtime.mjs",
"verify:javascript:digests": "npm run build:cached && node scripts/verify-large-javascript-digests.mjs",
"verify:application-workflows": "npm run build:cached && node scripts/verify-local-application-workflows.mjs",
diff --git a/scripts/lib/catalog-core.mjs b/scripts/lib/catalog-core.mjs
index 9c2a40e1d3..2ef9a72a3c 100644
--- a/scripts/lib/catalog-core.mjs
+++ b/scripts/lib/catalog-core.mjs
@@ -68,7 +68,7 @@ const SOURCE_PATHS = {
browserScenarioProvider: "dist/browser/PlaywrightBrowserScenarioProvider.js",
electronProvider: "dist/browser/CdpElectronProvider.js",
electronActiveProvider: "dist/browser/PlaywrightElectronActiveProvider.js",
- v8InspectorProvider: "dist/browser/V8InspectorProvider.js",
+ v8InspectorProvider: "dist/inspector/V8InspectorProvider.js",
evidence: "dist/domain/evidence.js",
evidenceBundle: "dist/domain/evidenceBundle.js",
evidenceCompletion: "dist/domain/evidenceCompletionLedger.js",
diff --git a/scripts/lib/module-boundaries.mjs b/scripts/lib/module-boundaries.mjs
index e5c93b43ef..64967db5b7 100644
--- a/scripts/lib/module-boundaries.mjs
+++ b/scripts/lib/module-boundaries.mjs
@@ -10,6 +10,7 @@ const MIGRATED_PROVIDER_ROOTS = new Set([
"ghidra",
"hopper",
"ida",
+ "inspector",
"javascript",
]);
diff --git a/scripts/verify-real-javascript-runtime-observation.mjs b/scripts/verify/inspector/runtime-observation.mjs
similarity index 98%
rename from scripts/verify-real-javascript-runtime-observation.mjs
rename to scripts/verify/inspector/runtime-observation.mjs
index 46d9048f83..ebd8a20003 100644
--- a/scripts/verify-real-javascript-runtime-observation.mjs
+++ b/scripts/verify/inspector/runtime-observation.mjs
@@ -11,7 +11,7 @@ import { Client } from "@modelcontextprotocol/client";
import { StdioClientTransport } from "@modelcontextprotocol/client/stdio";
const execute = promisify(execFile);
-const repository = resolve(dirname(fileURLToPath(import.meta.url)), "..");
+const repository = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
const root = await realpath(await mkdtemp(join(tmpdir(), "rea-inspector-")));
const environment = {
...process.env,
@@ -43,9 +43,7 @@ try {
for (const name of names) {
const targetPath =
name === "node-target.mjs"
- ? await realpath(
- join(repository, "tests/conformance/runtime-inspector", name),
- )
+ ? await realpath(join(repository, "tests/conformance/inspector", name))
: join(root, name);
if (name !== "node-target.mjs")
await writeFile(targetPath, "setInterval(() => {}, 1000);\n");
diff --git a/src/browser/providerIdentities.ts b/src/browser/providerIdentities.ts
index 7ae4a8b53e..4dbbaf0094 100644
--- a/src/browser/providerIdentities.ts
+++ b/src/browser/providerIdentities.ts
@@ -29,10 +29,3 @@ export const PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY: ProviderIdentity =
name: "REA Playwright active Electron observation provider",
version: "1",
});
-
-/** Identity available without loading the V8InspectorProvider implementation. */
-export const V8_INSPECTOR_PROVIDER_IDENTITY: ProviderIdentity = Object.freeze({
- id: "rea-v8-inspector",
- name: "REA passive Node/Electron V8 Inspector provider",
- version: "1",
-});
diff --git a/src/composition/javascriptRuntimeObservation.ts b/src/composition/javascriptRuntimeObservation.ts
index 80579b7038..454d36a814 100644
--- a/src/composition/javascriptRuntimeObservation.ts
+++ b/src/composition/javascriptRuntimeObservation.ts
@@ -1,5 +1,5 @@
import type { JavaScriptRuntimeObservationPort } from "../application/JavaScriptRuntimeObservationPort.js";
-import { V8InspectorProvider } from "../browser/V8InspectorProvider.js";
+import { V8InspectorProvider } from "../inspector/V8InspectorProvider.js";
/** Construct a fresh provider without opening a target or acquiring an engine. */
export const createJavaScriptRuntimeObservationProvider =
diff --git a/src/composition/optionalObservationProviders.ts b/src/composition/optionalObservationProviders.ts
index 5b48ce8f5a..2f4d194af0 100644
--- a/src/composition/optionalObservationProviders.ts
+++ b/src/composition/optionalObservationProviders.ts
@@ -8,8 +8,8 @@ import {
PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY,
CDP_ELECTRON_PROVIDER_IDENTITY,
PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY,
- V8_INSPECTOR_PROVIDER_IDENTITY,
} from "../browser/providerIdentities.js";
+import { V8_INSPECTOR_PROVIDER_IDENTITY } from "../inspector/providerIdentity.js";
import { err, ok, type Result } from "../domain/result.js";
/** Precisely typed startup factories for the five existing observation ports. */
diff --git a/src/browser/JavaScriptRuntimeScope.test.ts b/src/inspector/JavaScriptRuntimeScope.test.ts
similarity index 100%
rename from src/browser/JavaScriptRuntimeScope.test.ts
rename to src/inspector/JavaScriptRuntimeScope.test.ts
diff --git a/src/browser/JavaScriptRuntimeScope.ts b/src/inspector/JavaScriptRuntimeScope.ts
similarity index 98%
rename from src/browser/JavaScriptRuntimeScope.ts
rename to src/inspector/JavaScriptRuntimeScope.ts
index da4d0f9175..0b13b78040 100644
--- a/src/browser/JavaScriptRuntimeScope.ts
+++ b/src/inspector/JavaScriptRuntimeScope.ts
@@ -9,7 +9,7 @@ import type {
JavaScriptRuntimeLocation,
JavaScriptRuntimeTargetLocation,
} from "../domain/javascriptRuntimeObservation.js";
-import { authorizedElectronFile } from "./ElectronFileScope.js";
+import { authorizedElectronFile } from "../browser/ElectronFileScope.js";
export type RuntimeLocationDecision =
| { readonly allowed: true; readonly location: JavaScriptRuntimeLocation }
diff --git a/src/browser/V8InspectorCaptureProjection.ts b/src/inspector/V8InspectorCaptureProjection.ts
similarity index 100%
rename from src/browser/V8InspectorCaptureProjection.ts
rename to src/inspector/V8InspectorCaptureProjection.ts
diff --git a/src/browser/V8InspectorEndpoint.ts b/src/inspector/V8InspectorEndpoint.ts
similarity index 97%
rename from src/browser/V8InspectorEndpoint.ts
rename to src/inspector/V8InspectorEndpoint.ts
index 481cc15945..384b6e2165 100644
--- a/src/browser/V8InspectorEndpoint.ts
+++ b/src/inspector/V8InspectorEndpoint.ts
@@ -6,7 +6,7 @@ import type {
} from "../domain/javascriptRuntimeObservation.js";
import { BrowserObservationError } from "../domain/browserObservationError.js";
import { type BrowserObservationOperation } from "../domain/browserObservationErrors.js";
-import { parseCdpEndpointValue, readCdpJson } from "./CdpEndpoint.js";
+import { parseCdpEndpointValue, readCdpJson } from "../browser/CdpEndpoint.js";
const versionSchema = z
.object({
diff --git a/src/browser/V8InspectorProvider.cleanup.test.ts b/src/inspector/V8InspectorProvider.cleanup.test.ts
similarity index 100%
rename from src/browser/V8InspectorProvider.cleanup.test.ts
rename to src/inspector/V8InspectorProvider.cleanup.test.ts
diff --git a/src/browser/V8InspectorProvider.ts b/src/inspector/V8InspectorProvider.ts
similarity index 99%
rename from src/browser/V8InspectorProvider.ts
rename to src/inspector/V8InspectorProvider.ts
index ef0a3fb563..bc25631897 100644
--- a/src/browser/V8InspectorProvider.ts
+++ b/src/inspector/V8InspectorProvider.ts
@@ -21,8 +21,8 @@ import {
recordValue,
cdpStringValue,
delayWithCancellation,
-} from "./CdpCaptureValues.js";
-import { CdpConnection, type CdpEvent } from "./CdpConnection.js";
+} from "../browser/CdpCaptureValues.js";
+import { CdpConnection, type CdpEvent } from "../browser/CdpConnection.js";
import {
authorizeRuntimeTargetLocation,
inspectorExclusionKey,
@@ -39,8 +39,8 @@ import {
} from "./V8InspectorEndpoint.js";
/** Public identity committed by passive V8 Inspector observations. */
-export { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentities.js";
-import { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentities.js";
+export { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentity.js";
+import { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentity.js";
export interface ScriptDraft {
readonly rawUrl: string;
diff --git a/src/inspector/providerIdentity.ts b/src/inspector/providerIdentity.ts
new file mode 100644
index 0000000000..b8d8fadf81
--- /dev/null
+++ b/src/inspector/providerIdentity.ts
@@ -0,0 +1,8 @@
+import type { ProviderIdentity } from "../application/AnalysisProvider.js";
+
+/** Identity available without loading the V8InspectorProvider implementation. */
+export const V8_INSPECTOR_PROVIDER_IDENTITY: ProviderIdentity = Object.freeze({
+ id: "rea-v8-inspector",
+ name: "REA passive Node/Electron V8 Inspector provider",
+ version: "1",
+});
diff --git a/tests/boundary/cli/javascriptRuntimeObservationCli.test.ts b/tests/boundary/cli/javascriptRuntimeObservationCli.test.ts
index e45a58c113..76a1e554dc 100644
--- a/tests/boundary/cli/javascriptRuntimeObservationCli.test.ts
+++ b/tests/boundary/cli/javascriptRuntimeObservationCli.test.ts
@@ -7,9 +7,9 @@ import { promisify } from "node:util";
import { afterEach, describe, expect, test } from "vitest";
import { observeJavaScriptRuntime } from "../../../src/application/JavaScriptRuntimeObservationService.js";
-import { V8InspectorProvider } from "../../../src/browser/V8InspectorProvider.js";
+import { V8InspectorProvider } from "../../../src/inspector/V8InspectorProvider.js";
import { observeJavaScriptRuntimeInputSchema } from "../../../src/domain/javascriptRuntimeObservation.js";
-import { startFakeV8Inspector } from "../../fixtures/fakeV8Inspector.js";
+import { startFakeV8Inspector } from "../../fixtures/inspector/fakeV8Inspector.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
const execute = promisify(execFile);
diff --git a/tests/boundary/cli/productCatalog.test.ts b/tests/boundary/cli/productCatalog.test.ts
index 6de9dc5f08..d981278809 100644
--- a/tests/boundary/cli/productCatalog.test.ts
+++ b/tests/boundary/cli/productCatalog.test.ts
@@ -22,7 +22,7 @@ import { CDP_BROWSER_PROVIDER_IDENTITY } from "../../../src/browser/CdpBrowserPr
import { CDP_ELECTRON_PROVIDER_IDENTITY } from "../../../src/browser/CdpElectronProvider.js";
import { PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY } from "../../../src/browser/PlaywrightElectronActiveProvider.js";
import { PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY } from "../../../src/browser/PlaywrightBrowserScenarioProvider.js";
-import { V8_INSPECTOR_PROVIDER_IDENTITY } from "../../../src/browser/V8InspectorProvider.js";
+import { V8_INSPECTOR_PROVIDER_IDENTITY } from "../../../src/inspector/V8InspectorProvider.js";
import { CLI_COMMAND_NAMES } from "../../../src/cliCommandNames.js";
import { createCli } from "../../../src/cli.js";
import {
diff --git a/tests/boundary/browser/javascriptRuntimeObservation.test.ts b/tests/boundary/inspector/javascriptRuntimeObservation.test.ts
similarity index 98%
rename from tests/boundary/browser/javascriptRuntimeObservation.test.ts
rename to tests/boundary/inspector/javascriptRuntimeObservation.test.ts
index 8b87876ef1..3ccadf8e60 100644
--- a/tests/boundary/browser/javascriptRuntimeObservation.test.ts
+++ b/tests/boundary/inspector/javascriptRuntimeObservation.test.ts
@@ -10,8 +10,8 @@ import {
observeJavaScriptRuntime,
} from "../../../src/application/JavaScriptRuntimeObservationService.js";
import { reconcileJavaScriptRuntimeEvidence } from "../../../src/application/JavaScriptRuntimeReconciliationService.js";
-import { V8_INSPECTOR_PROVIDER_IDENTITY } from "../../../src/browser/V8InspectorProvider.js";
-import { V8InspectorProvider } from "../../../src/browser/V8InspectorProvider.js";
+import { V8_INSPECTOR_PROVIDER_IDENTITY } from "../../../src/inspector/V8InspectorProvider.js";
+import { V8InspectorProvider } from "../../../src/inspector/V8InspectorProvider.js";
import { JAVASCRIPT_RUNTIME_RECONCILIATION_EXAMPLE } from "../../../src/contracts/javascriptRuntimeReconciliationExample.js";
import type {
JavaScriptRuntimeObservation,
@@ -19,7 +19,7 @@ import type {
} from "../../../src/domain/javascriptRuntimeObservation.js";
import { observeJavaScriptRuntimeInputSchema } from "../../../src/domain/javascriptRuntimeObservation.js";
import { javascriptRuntimeReconciliationResultSchema } from "../../../src/domain/javascriptRuntimeReconciliationSchemas.js";
-import { startFakeV8Inspector } from "../../fixtures/fakeV8Inspector.js";
+import { startFakeV8Inspector } from "../../fixtures/inspector/fakeV8Inspector.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
describe("passive V8 Inspector provider", () => {
diff --git a/tests/boundary/browser/javascriptRuntimeTargetLocations.test.ts b/tests/boundary/inspector/javascriptRuntimeTargetLocations.test.ts
similarity index 97%
rename from tests/boundary/browser/javascriptRuntimeTargetLocations.test.ts
rename to tests/boundary/inspector/javascriptRuntimeTargetLocations.test.ts
index 69f86b4dad..8ca85e3421 100644
--- a/tests/boundary/browser/javascriptRuntimeTargetLocations.test.ts
+++ b/tests/boundary/inspector/javascriptRuntimeTargetLocations.test.ts
@@ -4,8 +4,8 @@ import { pathToFileURL } from "node:url";
import { afterEach, expect, test } from "vitest";
-import { V8InspectorProvider } from "../../../src/browser/V8InspectorProvider.js";
-import { startFakeV8Inspector } from "../../fixtures/fakeV8Inspector.js";
+import { V8InspectorProvider } from "../../../src/inspector/V8InspectorProvider.js";
+import { startFakeV8Inspector } from "../../fixtures/inspector/fakeV8Inspector.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
const roots: string[] = [];
diff --git a/tests/composition/runtime-observation/javascriptRuntimeUnresolvedTarget.test.ts b/tests/boundary/inspector/javascriptRuntimeUnresolvedTarget.test.ts
similarity index 94%
rename from tests/composition/runtime-observation/javascriptRuntimeUnresolvedTarget.test.ts
rename to tests/boundary/inspector/javascriptRuntimeUnresolvedTarget.test.ts
index 1066e527fa..85c3a44ee8 100644
--- a/tests/composition/runtime-observation/javascriptRuntimeUnresolvedTarget.test.ts
+++ b/tests/boundary/inspector/javascriptRuntimeUnresolvedTarget.test.ts
@@ -6,9 +6,9 @@ import { expect, test } from "vitest";
import { analyzeJavaScriptApplication } from "../../../src/application/JavaScriptApplicationService.js";
import { createJavaScriptRuntimeObservationEvidence } from "../../../src/application/JavaScriptRuntimeObservationEvidence.js";
-import { V8InspectorProvider } from "../../../src/browser/V8InspectorProvider.js";
+import { V8InspectorProvider } from "../../../src/inspector/V8InspectorProvider.js";
import { reconcileJavaScriptRuntime } from "../../../src/domain/javascriptRuntimeReconciliation.js";
-import { startFakeV8Inspector } from "../../fixtures/fakeV8Inspector.js";
+import { startFakeV8Inspector } from "../../fixtures/inspector/fakeV8Inspector.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
test("keeps unresolved target identity unknown while matching verified loaded scripts", async () => {
diff --git a/tests/boundary/mcp/javascriptRuntimeObservationMcp.test.ts b/tests/boundary/mcp/javascriptRuntimeObservationMcp.test.ts
index a1de452057..d6ab4ae570 100644
--- a/tests/boundary/mcp/javascriptRuntimeObservationMcp.test.ts
+++ b/tests/boundary/mcp/javascriptRuntimeObservationMcp.test.ts
@@ -7,7 +7,7 @@ import { afterEach, describe, expect, test } from "vitest";
import { createTestBinarySession } from "../../fixtures/binarySession.js";
import { observeJavaScriptRuntime } from "../../../src/application/JavaScriptRuntimeObservationService.js";
-import { V8InspectorProvider } from "../../../src/browser/V8InspectorProvider.js";
+import { V8InspectorProvider } from "../../../src/inspector/V8InspectorProvider.js";
import {
javascriptRuntimeObservationSchema,
javascriptRuntimeTargetListSchema,
@@ -15,7 +15,7 @@ import {
} from "../../../src/domain/javascriptRuntimeObservation.js";
import { createServer } from "../../../src/server/createServer.js";
import { observed } from "../../fixtures/analysisExecution.js";
-import { startFakeV8Inspector } from "../../fixtures/fakeV8Inspector.js";
+import { startFakeV8Inspector } from "../../fixtures/inspector/fakeV8Inspector.js";
import { createTestTempDirectory } from "../../fixtures/temporaryDirectory.js";
describe("JavaScript runtime observation MCP tools", () => {
diff --git a/tests/conformance/runtime-inspector/node-target.mjs b/tests/conformance/inspector/node-target.mjs
similarity index 100%
rename from tests/conformance/runtime-inspector/node-target.mjs
rename to tests/conformance/inspector/node-target.mjs
diff --git a/tests/evaluation/moduleBoundaries.test.ts b/tests/evaluation/moduleBoundaries.test.ts
index 720a51c11d..31fb07b017 100644
--- a/tests/evaluation/moduleBoundaries.test.ts
+++ b/tests/evaluation/moduleBoundaries.test.ts
@@ -23,7 +23,9 @@ describe("incremental module import boundaries", () => {
["src/application/probe.ts", "../composition/android.js", false],
["src/server/probe.ts", "../firmware/FirmwareProvider.js", false],
["src/server/probe.ts", "../browser/CdpBrowserProvider.js", false],
- ["src/application/probe.ts", "../browser/V8InspectorProvider.js", false],
+ ["src/application/probe.ts", "../inspector/V8InspectorProvider.js", false],
+ ["src/server/probe.ts", "../inspector/V8InspectorEndpoint.js", false],
+ ["src/composition/probe.ts", "../inspector/V8InspectorProvider.js", true],
["src/composition/probe.ts", "../browser/CdpBrowserProvider.js", true],
[
"src/application/probe.ts",
@@ -40,6 +42,7 @@ describe("incremental module import boundaries", () => {
["src/composition/probe.ts", "../firmware/FirmwareProvider.js", true],
["src/domain/android/probe.ts", "./types.js", true],
["src/domain/javascript/probe.ts", "./types.js", true],
+ ["src/domain/inspector/probe.ts", "./types.js", true],
["src/domain/firmware/probe.ts", "../android/types.js", true],
["src/domain/android/probe.ts", "../../android/JadxProvider.js", false],
["src/application/android/probe.ts", "../../domain/android/types.js", true],
diff --git a/tests/fixtures/fakeV8Inspector.ts b/tests/fixtures/inspector/fakeV8Inspector.ts
similarity index 100%
rename from tests/fixtures/fakeV8Inspector.ts
rename to tests/fixtures/inspector/fakeV8Inspector.ts
diff --git a/tests/fixtures/optionalObservationProviders.ts b/tests/fixtures/optionalObservationProviders.ts
index 2122380c13..b215b8f3d2 100644
--- a/tests/fixtures/optionalObservationProviders.ts
+++ b/tests/fixtures/optionalObservationProviders.ts
@@ -1,9 +1,7 @@
import type { BrowserObservationPort } from "../../src/application/BrowserObservationPort.js";
import type { JavaScriptRuntimeObservationPort } from "../../src/application/JavaScriptRuntimeObservationPort.js";
-import {
- CDP_BROWSER_PROVIDER_IDENTITY,
- V8_INSPECTOR_PROVIDER_IDENTITY,
-} from "../../src/browser/providerIdentities.js";
+import { CDP_BROWSER_PROVIDER_IDENTITY } from "../../src/browser/providerIdentities.js";
+import { V8_INSPECTOR_PROVIDER_IDENTITY } from "../../src/inspector/providerIdentity.js";
import { createBrowserScenarioProvider } from "../../src/composition/browserScenario.js";
import { createElectronObservationProvider } from "../../src/composition/electronObservation.js";
import { createElectronScenarioProvider } from "../../src/composition/electronScenario.js";
diff --git a/vitest.config.ts b/vitest.config.ts
index c6aad260f4..f882022154 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -37,7 +37,7 @@ const TEST_PROJECTS = [
name: "adapters",
include: [
"src/*.test.ts",
- "src/{artifacts,browser,dotnet,firmware,ghidra,hopper,ida,javascript,native,process,reference,server,windows}/**/*.test.ts",
+ "src/{artifacts,browser,dotnet,firmware,ghidra,hopper,ida,inspector,javascript,native,process,reference,server,windows}/**/*.test.ts",
],
pool: "forks" as const,
maxWorkers: MAX_TEST_WORKERS,