mirror of
https://github.com/morluto/rea.git
synced 2026-11-10 08:47:00 +00:00
Deliver complete Evidence directly through MCP with required nullable analysis profiles and immutable per-server delivery settings. Bind selected environments at construction and require typed cleanup outcomes with retained retry ownership. Remove test-only routing, duplicate session and snapshot metadata, producer-field repairs, and ambiguous provider arguments. Separate artifact byte identity from occurrence classification and retain typed source-map and partial native facts across CLI, MCP, and verifier consumers. BREAKING CHANGE: obsolete Evidence envelopes, session aliases, incomplete snapshots, and missing normalized producer facts are no longer accepted.
109 lines
3.9 KiB
TypeScript
109 lines
3.9 KiB
TypeScript
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
import type {
|
|
OptionalObservationProviders,
|
|
OptionalProviderLoadFailure,
|
|
OptionalProviderLoadResult,
|
|
} from "../application/OptionalObservationProviders.js";
|
|
import {
|
|
CDP_BROWSER_PROVIDER_IDENTITY,
|
|
PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY,
|
|
CDP_ELECTRON_PROVIDER_IDENTITY,
|
|
PLAYWRIGHT_ELECTRON_ACTIVE_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. */
|
|
export type OptionalObservationFactories = {
|
|
readonly [Port in keyof OptionalObservationProviders]-?: () => Promise<
|
|
NonNullable<OptionalObservationProviders[Port]>
|
|
>;
|
|
};
|
|
|
|
/** Bind optional provider construction to one caller-selected process environment. */
|
|
export const createOptionalObservationFactories = (
|
|
selectedEnvironment: Readonly<Record<string, string | undefined>>,
|
|
): OptionalObservationFactories => {
|
|
const environment = snapshotEnvironment(selectedEnvironment);
|
|
return {
|
|
browserObservation: async () =>
|
|
(
|
|
await import("./browserObservation.js")
|
|
).createBrowserObservationProvider(),
|
|
browserScenarioCapture: async () =>
|
|
(await import("./browserScenario.js")).createBrowserScenarioProvider(
|
|
environment,
|
|
),
|
|
electronObservation: async () =>
|
|
(
|
|
await import("./electronObservation.js")
|
|
).createElectronObservationProvider(),
|
|
electronActiveObservation: async () =>
|
|
(await import("./electronScenario.js")).createElectronScenarioProvider(
|
|
environment,
|
|
),
|
|
javascriptRuntimeObservation: async () =>
|
|
(
|
|
await import("./javascriptRuntimeObservation.js")
|
|
).createJavaScriptRuntimeObservationProvider(),
|
|
};
|
|
};
|
|
|
|
const loadPort = async <Port>(
|
|
factory: () => Promise<Port>,
|
|
providerId: string,
|
|
): Promise<Result<Port, OptionalProviderLoadFailure>> => {
|
|
try {
|
|
return ok(await factory());
|
|
} catch (cause: unknown) {
|
|
return err({
|
|
providerId,
|
|
reason: cause instanceof Error ? cause.message : String(cause),
|
|
});
|
|
}
|
|
};
|
|
|
|
/** Load each adapter independently, retaining healthy peers and exact failures. */
|
|
export const loadOptionalObservationProviders = async (
|
|
factories: OptionalObservationFactories,
|
|
): Promise<OptionalProviderLoadResult> => {
|
|
const [browser, scenario, electron, electronActive, runtime] =
|
|
await Promise.all([
|
|
loadPort(factories.browserObservation, CDP_BROWSER_PROVIDER_IDENTITY.id),
|
|
loadPort(
|
|
factories.browserScenarioCapture,
|
|
PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id,
|
|
),
|
|
loadPort(
|
|
factories.electronObservation,
|
|
CDP_ELECTRON_PROVIDER_IDENTITY.id,
|
|
),
|
|
loadPort(
|
|
factories.electronActiveObservation,
|
|
PLAYWRIGHT_ELECTRON_ACTIVE_PROVIDER_IDENTITY.id,
|
|
),
|
|
loadPort(
|
|
factories.javascriptRuntimeObservation,
|
|
V8_INSPECTOR_PROVIDER_IDENTITY.id,
|
|
),
|
|
]);
|
|
return {
|
|
...(browser.ok ? { browserObservation: browser.value } : {}),
|
|
...(scenario.ok ? { browserScenarioCapture: scenario.value } : {}),
|
|
...(electron.ok ? { electronObservation: electron.value } : {}),
|
|
...(electronActive.ok
|
|
? { electronActiveObservation: electronActive.value }
|
|
: {}),
|
|
...(runtime.ok ? { javascriptRuntimeObservation: runtime.value } : {}),
|
|
optionalProviderLoadFailures: {
|
|
...(browser.ok ? {} : { browserObservation: browser.error }),
|
|
...(scenario.ok ? {} : { browserScenarioCapture: scenario.error }),
|
|
...(electron.ok ? {} : { electronObservation: electron.error }),
|
|
...(electronActive.ok
|
|
? {}
|
|
: { electronActiveObservation: electronActive.error }),
|
|
...(runtime.ok ? {} : { javascriptRuntimeObservation: runtime.error }),
|
|
},
|
|
};
|
|
};
|