refactor(javascript): parse runtime evidence into one verified owner

This commit is contained in:
morluto
2026-10-10 03:30:58 +08:00
parent 415145d04f
commit 006b295f1d
15 changed files with 839 additions and 512 deletions
@@ -1,14 +1,15 @@
import { resolve } from "node:path";
import { z } from "zod";
import {
AnalysisInputError,
AnalysisProtocolError,
} from "../../domain/analysisErrorCore.js";
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
import { type AnalysisError } from "../../domain/analysisErrorBase.js";
import type { Evidence } from "../../domain/evidence.js";
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
import { reconcileJavaScriptRuntime } from "../../domain/javascript/javascriptRuntimeReconciliation.js";
import {
parseRuntimeReconciliationInput,
reconcileJavaScriptRuntime,
type ParsedRuntimeReconciliationInput,
} from "../../domain/javascript/javascriptRuntimeReconciliation.js";
import { reconcileJavaScriptRuntimeInputSchema } from "../../domain/javascript/javascriptRuntimeReconciliationSchemas.js";
import { err, ok, type Result } from "../../domain/result.js";
import { createJavaScriptRuntimeReconciliationEvidence } from "./JavaScriptRuntimeReconciliationEvidence.js";
@@ -31,26 +32,30 @@ export const reconcileJavaScriptRuntimeEvidence = (
export const reconcileJavaScriptRuntimeEvidenceValidated = (
parsedInput: z.output<typeof reconcileJavaScriptRuntimeInputSchema>,
): Result<Evidence, AnalysisError> => {
let parsed: ParsedRuntimeReconciliationInput;
try {
const input = reconcileJavaScriptRuntimeInputSchema.parse(
parsed = parseRuntimeReconciliationInput(
normalizeRuntimeMappingRoots(parsedInput),
);
const result = reconcileJavaScriptRuntime(input);
return ok(createJavaScriptRuntimeReconciliationEvidence(input, result));
} catch (cause: unknown) {
if (cause instanceof z.ZodError)
return err(
analysisInputErrorFromIssues(OPERATION, cause.issues, parsedInput),
);
if (
cause instanceof TypeError &&
SAFE_RECONCILIATION_INPUT_CONSTRAINTS.has(cause.message)
)
return err(
new AnalysisInputError(OPERATION, undefined, [
{ path: [], reason: "invalid_value", message: cause.message },
]),
);
return err(
new AnalysisProtocolError(
"JavaScript runtime reconciliation input parsing failed",
{ cause },
),
);
}
try {
const result = reconcileJavaScriptRuntime(parsed);
return ok(
createJavaScriptRuntimeReconciliationEvidence(parsed.input, result),
);
} catch (cause: unknown) {
return err(
new AnalysisProtocolError(
"JavaScript runtime reconciliation produced an invalid result",
@@ -83,23 +88,3 @@ const isPortableAbsolutePath = (path: string): boolean =>
path.startsWith("/") ||
/^[a-z]:[\\/]/iu.test(path) ||
/^(?:\\\\|\/\/)[^\\/]+[\\/][^\\/]+(?:[\\/]|$)/u.test(path);
const SAFE_RECONCILIATION_INPUT_CONSTRAINTS = new Set([
"JavaScript application Evidence subject disagrees with its result",
"Runtime reconciliation requires inspect_web_page, inspect_electron_page, observe_javascript_runtime, or capture_electron_scenario Evidence",
"Runtime Evidence target or declared role disagrees with its result",
"Runtime Evidence contains an invalid builtin location",
"Runtime Evidence target disagrees with its captured result",
"Browser Evidence target is outside its recorded origin scope",
"Runtime Evidence contains source without source-capture selection",
"Active Electron Evidence application path disagrees with its configured root",
...[
"inspect_web_page",
"inspect_electron_page",
"observe_javascript_runtime",
"capture_electron_scenario",
].map(
(operation) =>
`Evidence does not match the supported ${operation} contract`,
),
]);