rea-agents 6.2.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -20
- package/bridge/hopper_bridge.py +2 -0
- package/dist/android/JadxProvider.js +8 -2
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +63 -17
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/ClientConfigurationDocument.js +28 -0
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +12 -6
- package/dist/application/DirectAnalysisCleanup.js +0 -1
- package/dist/application/DirectAnalysisStatus.js +2 -5
- package/dist/application/Doctor.js +25 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/InvestigationProviders.js +4 -4
- package/dist/application/JsonFiles.js +15 -15
- package/dist/application/LinuxHopper.js +2 -1
- package/dist/application/ReconstructionObligationCandidates.js +9 -2
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +18 -7
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +6 -4
- package/dist/application/SetupPlan.js +19 -15
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +18 -2
- package/dist/application/UpdateMaintenance.js +6 -2
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +13 -6
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +16 -0
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +0 -6
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +8 -18
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +34 -26
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +44 -12
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +6 -3
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +5 -17
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +10 -7
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/artifacts/ArtifactProvider.js +14 -16
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +152 -67
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +54 -46
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +29 -11
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +7 -8
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/scanCanonical.js +28 -22
- package/dist/artifacts/inventory/scanReader.js +7 -11
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/CdpBrowserProvider.js +4 -3
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +6 -6
- package/dist/browser/PlaywrightScenarioBrowser.js +145 -42
- package/dist/browser/PlaywrightScenarioSession.js +3 -11
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +13 -9
- package/dist/cli/electronCommands.js +9 -10
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +2 -4
- package/dist/cli.js +5 -2
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +4 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +2 -3
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/inputSchemaPresentation.js +94 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -1
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +3 -2
- package/dist/contracts/sessionToolSchemas.js +3 -2
- package/dist/contracts/toolOutputSchemaGroups.js +2 -2
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorPresentation.js +4 -2
- package/dist/domain/analysisSnapshot.js +3 -1
- package/dist/domain/analysisView/analysisView.js +1 -3
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apple/dylibResolution.js +1 -1
- package/dist/domain/artifactComparison.js +4 -4
- package/dist/domain/artifactGraph.js +1 -1
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- package/dist/domain/artifactInventoryEvidence.js +5 -5
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +10 -5
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +2 -2
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +9 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +5 -3
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +15 -13
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +45 -34
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +7 -7
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptNativeHandoff.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -6
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +200 -8
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +142 -35
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +497 -113
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +41 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +2 -6
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +20 -14
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturns.js +23 -27
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +135 -24
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/process/processCapture.js +11 -10
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +43 -0
- package/dist/domain/process/processCaptureValidation.js +4 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +3 -3
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +7 -7
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -29
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- package/dist/dotnet/ManagedStaticProvider.js +10 -7
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/filesystem/RegularFile.js +41 -0
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraClient.js +14 -4
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraLauncher.js +43 -19
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/ida/IdaOperationRunner.js +2 -0
- package/dist/ida/IdaSessionClient.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +10 -5
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/process/ProcessOwnershipObservation.js +9 -13
- package/dist/process/capture/FilesystemSnapshot.js +88 -18
- package/dist/process/capture/ProcessCaptureLifecycle.js +13 -27
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +8 -21
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +22 -23
- package/dist/server/registerApplicationTools/compareExportShapes.js +2 -1
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerCloseLifecycleTool.js +6 -4
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerSessionTools.js +9 -3
- package/native/windows/build/manifest.json +1 -1
- package/package.json +6 -3
- package/skills/reverse-engineer-anything/SKILL.md +5 -5
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { uniqueSorted } from "../canonicalOrdering.js";
|
|
2
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
2
3
|
import { canonicalExportShapeValue, digestExportShapeValue, } from "./javascriptExportShapeComparisonIdentity.js";
|
|
3
4
|
import { javaScriptExportShapeComparisonResultSchema, } from "./javascriptExportShapeComparisonSchemas.js";
|
|
4
5
|
import { retainJavaScriptExportShapes, selectJavaScriptExport, } from "./javascriptExportShapeSelection.js";
|
|
@@ -65,7 +66,7 @@ const sortChanges = (changes) => changes
|
|
|
65
66
|
change_id: change.change_id,
|
|
66
67
|
}),
|
|
67
68
|
}))
|
|
68
|
-
.sort((left, right) =>
|
|
69
|
+
.sort((left, right) => compareUnicodeCodePoints(left.sortKey, right.sortKey) ||
|
|
69
70
|
left.index - right.index)
|
|
70
71
|
.map(({ change }) => change);
|
|
71
72
|
const comparisonCoverage = (context) => {
|
|
@@ -5,7 +5,6 @@ const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
|
5
5
|
const graphIdSchema = prefixedDigestSchema("jag");
|
|
6
6
|
const nodeIdSchema = prefixedDigestSchema("jag_node");
|
|
7
7
|
const textSchema = z.string().min(1);
|
|
8
|
-
const selectorTextSchema = textSchema;
|
|
9
8
|
const semanticPrimitiveSchema = z.union([
|
|
10
9
|
z.string(),
|
|
11
10
|
z.number().finite(),
|
|
@@ -49,24 +48,34 @@ const sourceRangeSchema = z
|
|
|
49
48
|
message: "Source range end must not precede its start",
|
|
50
49
|
});
|
|
51
50
|
});
|
|
52
|
-
/**
|
|
53
|
-
|
|
54
|
-
.strictObject({
|
|
55
|
-
left: evidenceSchema,
|
|
56
|
-
right: evidenceSchema,
|
|
57
|
-
left_module_path: selectorTextSchema,
|
|
58
|
-
left_export_name: selectorTextSchema,
|
|
59
|
-
right_module_path: selectorTextSchema,
|
|
60
|
-
right_export_name: selectorTextSchema,
|
|
61
|
-
})
|
|
62
|
-
.superRefine((input, context) => {
|
|
51
|
+
/** Check that export-shape comparisons bind distinct source Evidence. */
|
|
52
|
+
const validateJavaScriptExportShapeIdentities = (input, context) => {
|
|
63
53
|
if (input.left.evidence_id === input.right.evidence_id)
|
|
64
54
|
context.addIssue({
|
|
65
55
|
code: "custom",
|
|
66
56
|
path: ["right"],
|
|
67
57
|
message: "JavaScript export shape Evidence must be distinct",
|
|
68
58
|
});
|
|
69
|
-
}
|
|
59
|
+
};
|
|
60
|
+
const evidenceIdentitySchema = z.object({ evidence_id: evidenceIdSchema });
|
|
61
|
+
/** Validate export-shape identities without capturing complete source graphs. */
|
|
62
|
+
export const javaScriptExportShapeIdentitiesSchema = z
|
|
63
|
+
.object({
|
|
64
|
+
left: evidenceIdentitySchema,
|
|
65
|
+
right: evidenceIdentitySchema,
|
|
66
|
+
})
|
|
67
|
+
.superRefine(validateJavaScriptExportShapeIdentities);
|
|
68
|
+
/** Two authenticated application graphs and exact export selectors. */
|
|
69
|
+
export const compareJavaScriptExportShapesInputSchema = z
|
|
70
|
+
.strictObject({
|
|
71
|
+
left: evidenceSchema,
|
|
72
|
+
right: evidenceSchema,
|
|
73
|
+
left_module_path: textSchema,
|
|
74
|
+
left_export_name: textSchema,
|
|
75
|
+
right_module_path: textSchema,
|
|
76
|
+
right_export_name: textSchema,
|
|
77
|
+
})
|
|
78
|
+
.superRefine(validateJavaScriptExportShapeIdentities);
|
|
70
79
|
const projectedReturnFieldShape = {
|
|
71
80
|
path: jsonPointerSchema,
|
|
72
81
|
presence: z.enum(["present", "absent", "unknown-coverage"]),
|
|
@@ -138,8 +147,8 @@ const projectedReturnShapeSchema = z
|
|
|
138
147
|
export const projectedExportReturnShapesSchema = z
|
|
139
148
|
.strictObject({
|
|
140
149
|
semantic_role: z.literal("export-return-shapes"),
|
|
141
|
-
module_path:
|
|
142
|
-
exported_name:
|
|
150
|
+
module_path: textSchema,
|
|
151
|
+
exported_name: textSchema,
|
|
143
152
|
callable_id: textSchema,
|
|
144
153
|
callable_kind: z.enum(["function", "class", "method"]),
|
|
145
154
|
static_return_shapes: z.array(projectedReturnShapeSchema),
|
|
@@ -163,16 +172,16 @@ export const projectedExportReturnShapesSchema = z
|
|
|
163
172
|
});
|
|
164
173
|
const exportCandidateSchema = z.strictObject({
|
|
165
174
|
node_id: nodeIdSchema,
|
|
166
|
-
module_path:
|
|
167
|
-
export_name:
|
|
175
|
+
module_path: textSchema,
|
|
176
|
+
export_name: textSchema,
|
|
168
177
|
matches_requested_module: z.boolean(),
|
|
169
178
|
matches_requested_export: z.boolean(),
|
|
170
179
|
});
|
|
171
180
|
const selectorResultShape = {
|
|
172
181
|
evidence_id: evidenceIdSchema,
|
|
173
182
|
graph_id: graphIdSchema,
|
|
174
|
-
requested_module_path:
|
|
175
|
-
requested_export_name:
|
|
183
|
+
requested_module_path: textSchema,
|
|
184
|
+
requested_export_name: textSchema,
|
|
176
185
|
candidates: z.array(exportCandidateSchema),
|
|
177
186
|
omitted_candidates: z.number().int().min(0),
|
|
178
187
|
};
|
|
@@ -217,7 +226,8 @@ const propertyPresenceSchema = z.enum([
|
|
|
217
226
|
"absent",
|
|
218
227
|
"unknown-coverage",
|
|
219
228
|
]);
|
|
220
|
-
|
|
229
|
+
/** One change row; presence is required even when values stay unknown. */
|
|
230
|
+
export const javaScriptExportShapeComparisonChangeSchema = z.strictObject({
|
|
221
231
|
change_id: prefixedDigestSchema("jesc_change"),
|
|
222
232
|
status: z.enum(["added", "removed", "changed", "unknown"]),
|
|
223
233
|
path: jsonPointerSchema,
|
|
@@ -233,8 +243,6 @@ const comparisonChangeSchema = z.strictObject({
|
|
|
233
243
|
evidence_links: z.array(evidenceIdSchema).length(2),
|
|
234
244
|
limitations: z.array(textSchema),
|
|
235
245
|
});
|
|
236
|
-
/** One change row; presence is required even when values stay unknown. */
|
|
237
|
-
export const javaScriptExportShapeComparisonChangeSchema = comparisonChangeSchema;
|
|
238
246
|
const inventoryPropertyCoverageSchema = z.strictObject({
|
|
239
247
|
path: jsonPointerSchema,
|
|
240
248
|
status: z.enum(["complete", "partial"]),
|
|
@@ -260,7 +268,7 @@ export const javaScriptExportShapeComparisonResultSchema = z.strictObject({
|
|
|
260
268
|
changed: z.number().int().min(0),
|
|
261
269
|
unknown: z.number().int().min(0),
|
|
262
270
|
}),
|
|
263
|
-
changes: z.array(
|
|
271
|
+
changes: z.array(javaScriptExportShapeComparisonChangeSchema),
|
|
264
272
|
coverage: z.strictObject({
|
|
265
273
|
status: z.enum(["complete-within-inputs", "partial", "truncated"]),
|
|
266
274
|
left_graph_status: z.enum([
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { projectedExportReturnShapesSchema, } from "./javascriptExportShapeComparisonSchemas.js";
|
|
2
|
-
import {
|
|
2
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
3
3
|
/** Select one exact trusted export and its exact static return-shape observation. */
|
|
4
4
|
export const selectJavaScriptExport = (side) => {
|
|
5
5
|
const candidates = exportCandidates(side.graph);
|
|
@@ -90,7 +90,7 @@ const exportCandidates = (graph) => {
|
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
-
return [...candidates.values()].sort((left, right) =>
|
|
93
|
+
return [...candidates.values()].sort((left, right) => compareUnicodeCodePoints(candidateKey(left), candidateKey(right)));
|
|
94
94
|
};
|
|
95
95
|
const candidateKey = (candidate) => `${candidate.modulePath}\0${candidate.exportName}\0${candidate.node.node_id}`;
|
|
96
96
|
const returnShapeFor = (node, side) => {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { canonicalExportShapeValue, digestExportShapeValue, } from "./javascriptExportShapeComparisonIdentity.js";
|
|
2
|
-
import {
|
|
2
|
+
import { uniqueSorted } from "../canonicalOrdering.js";
|
|
3
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
3
4
|
const UNKNOWN_COVERAGE_PRESENCE = {
|
|
4
5
|
left: "unknown-coverage",
|
|
5
6
|
right: "unknown-coverage",
|
|
@@ -139,7 +140,7 @@ const addTarget = (map, source, target) => {
|
|
|
139
140
|
map.set(source, values);
|
|
140
141
|
};
|
|
141
142
|
const indexesNotIn = (shapes, paired) => shapes.map((_, index) => index).filter((index) => !paired.has(index));
|
|
142
|
-
const compareDiscriminants = (left, right) =>
|
|
143
|
+
const compareDiscriminants = (left, right) => compareUnicodeCodePoints(canonicalExportShapeValue(left), canonicalExportShapeValue(right));
|
|
143
144
|
const selectionUnknownChange = (input) => changeWithId({
|
|
144
145
|
status: "unknown",
|
|
145
146
|
path: "",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
2
2
|
import { featureSeedMatchMode, } from "./javascriptFeatureTraceSchemas.js";
|
|
3
3
|
/** Locate every graph node matching a typed literal seed without regex execution. */
|
|
4
4
|
export const findApplicationFeatureSeeds = (nodes, seed) => nodes
|
|
5
5
|
.flatMap((node) => seedMatch(node, seed))
|
|
6
|
-
.sort((left, right) =>
|
|
6
|
+
.sort((left, right) => compareUnicodeCodePoints(`${left.node_id}\0${left.basis}\0${left.field}`, `${right.node_id}\0${right.basis}\0${right.field}`));
|
|
7
7
|
const seedMatch = (node, seed) => {
|
|
8
8
|
if (seed.kind === "node-id")
|
|
9
9
|
return node.node_id === seed.value
|
|
@@ -171,7 +171,9 @@ const propertyFields = (value, prefix) => {
|
|
|
171
171
|
continue;
|
|
172
172
|
}
|
|
173
173
|
if (current !== null && typeof current === "object") {
|
|
174
|
-
for (const key of Object.keys(current)
|
|
174
|
+
for (const key of Object.keys(current)
|
|
175
|
+
.sort(compareUnicodeCodePoints)
|
|
176
|
+
.reverse())
|
|
175
177
|
pending.push({
|
|
176
178
|
current: current[key] ?? null,
|
|
177
179
|
path: `${path}.${key}`,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { digestCanonicalValue } from "../canonicalDigest.js";
|
|
2
|
+
import { uniqueSorted } from "../canonicalOrdering.js";
|
|
3
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
3
4
|
import { createJavaScriptApplicationGraph, } from "./javascriptApplicationGraph.js";
|
|
4
5
|
import { applicationFeatureTraceResultSchema, } from "./javascriptFeatureTraceSchemas.js";
|
|
5
6
|
import { findApplicationFeatureSeeds, } from "./javascriptFeatureSeed.js";
|
|
@@ -46,7 +47,7 @@ export const traceApplicationFeature = (input) => {
|
|
|
46
47
|
};
|
|
47
48
|
return applicationFeatureTraceResultSchema.parse({
|
|
48
49
|
...semantic,
|
|
49
|
-
trace_id: `jatr_${
|
|
50
|
+
trace_id: `jatr_${digestCanonicalValue(semantic, "Feature trace")}`,
|
|
50
51
|
});
|
|
51
52
|
};
|
|
52
53
|
const noMatchResult = (input) => {
|
|
@@ -83,7 +84,7 @@ const noMatchResult = (input) => {
|
|
|
83
84
|
};
|
|
84
85
|
return applicationFeatureTraceResultSchema.parse({
|
|
85
86
|
...semantic,
|
|
86
|
-
trace_id: `jatr_${
|
|
87
|
+
trace_id: `jatr_${digestCanonicalValue(semantic, "Feature trace")}`,
|
|
87
88
|
});
|
|
88
89
|
};
|
|
89
90
|
const traceGraph = (input, seedMatches, traversal) => {
|
|
@@ -112,7 +113,7 @@ const terminalPaths = (traversal, seeds) => {
|
|
|
112
113
|
(!seedIds.has(node.node_id) || traversal.nodes.length === 1))
|
|
113
114
|
.map((node) => pathTo(node, traversal.predecessors, edgeById))
|
|
114
115
|
.filter((path) => path !== null)
|
|
115
|
-
.sort((left, right) =>
|
|
116
|
+
.sort((left, right) => compareUnicodeCodePoints(left.path_id, right.path_id));
|
|
116
117
|
};
|
|
117
118
|
const pathTo = (node, predecessors, edgeById) => {
|
|
118
119
|
const nodeIds = [node.node_id];
|
|
@@ -144,7 +145,7 @@ const pathTo = (node, predecessors, edgeById) => {
|
|
|
144
145
|
};
|
|
145
146
|
return {
|
|
146
147
|
...semantic,
|
|
147
|
-
path_id: `jatp_${
|
|
148
|
+
path_id: `jatp_${digestCanonicalValue(semantic, "Feature trace")}`,
|
|
148
149
|
};
|
|
149
150
|
};
|
|
150
151
|
const isTerminal = (node) => ["endpoint", "storage", "native-addon", "native-export", "unknown"].includes(node.kind);
|
|
@@ -36,6 +36,22 @@ const applicationFeatureSeedSchema = z.union([
|
|
|
36
36
|
case_sensitive: z.boolean().default(false),
|
|
37
37
|
}),
|
|
38
38
|
]);
|
|
39
|
+
/** Check unique native identities before projecting an application trace. */
|
|
40
|
+
const validateApplicationTraceIdentities = (input, context) => {
|
|
41
|
+
const ids = input.native_observations.map(({ evidence_id: id }) => id);
|
|
42
|
+
if (new Set(ids).size !== ids.length)
|
|
43
|
+
context.addIssue({
|
|
44
|
+
code: "custom",
|
|
45
|
+
path: ["native_observations"],
|
|
46
|
+
message: "Native observations must be unique",
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
/** Validate native trace identities without capturing their complete Evidence. */
|
|
50
|
+
export const applicationTraceIdentitiesSchema = z
|
|
51
|
+
.object({
|
|
52
|
+
native_observations: z.array(z.object({ evidence_id: evidenceIdSchema })),
|
|
53
|
+
})
|
|
54
|
+
.superRefine(validateApplicationTraceIdentities);
|
|
39
55
|
/** Evidence-backed application graph and feature seed. */
|
|
40
56
|
export const traceApplicationFeatureInputSchema = z
|
|
41
57
|
.strictObject({
|
|
@@ -44,15 +60,7 @@ export const traceApplicationFeatureInputSchema = z
|
|
|
44
60
|
seed: applicationFeatureSeedSchema,
|
|
45
61
|
direction: z.enum(["outgoing", "incoming", "both"]).default("both"),
|
|
46
62
|
})
|
|
47
|
-
.superRefine(
|
|
48
|
-
const ids = input.native_observations.map(({ evidence_id: id }) => id);
|
|
49
|
-
if (new Set(ids).size !== ids.length)
|
|
50
|
-
context.addIssue({
|
|
51
|
-
code: "custom",
|
|
52
|
-
path: ["native_observations"],
|
|
53
|
-
message: "Native observations must be unique",
|
|
54
|
-
});
|
|
55
|
-
});
|
|
63
|
+
.superRefine(validateApplicationTraceIdentities);
|
|
56
64
|
const seedMatchSchema = z.strictObject({
|
|
57
65
|
node_id: nodeIdSchema,
|
|
58
66
|
kind: z.string().min(1),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
2
2
|
/** Traverse a JAG without treating edge inference as observed reachability. */
|
|
3
3
|
export const traverseApplicationFeature = (graph, seedNodeIds, direction) => {
|
|
4
4
|
const nodeById = new Map(graph.nodes.map((node) => [node.node_id, node]));
|
|
@@ -29,8 +29,8 @@ export const traverseApplicationFeature = (graph, seedNodeIds, direction) => {
|
|
|
29
29
|
nodes: [...visited]
|
|
30
30
|
.map((nodeId) => nodeById.get(nodeId))
|
|
31
31
|
.filter((node) => node !== undefined)
|
|
32
|
-
.sort((left, right) =>
|
|
33
|
-
edges: [...retainedEdges.values()].sort((left, right) =>
|
|
32
|
+
.sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id)),
|
|
33
|
+
edges: [...retainedEdges.values()].sort((left, right) => compareUnicodeCodePoints(left.edge_id, right.edge_id)),
|
|
34
34
|
predecessors,
|
|
35
35
|
};
|
|
36
36
|
};
|
|
@@ -49,7 +49,7 @@ const buildAdjacency = (edges, direction) => {
|
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
for (const entries of adjacency.values())
|
|
52
|
-
entries.sort((left, right) =>
|
|
52
|
+
entries.sort((left, right) => compareUnicodeCodePoints(`${left.edge.edge_id}\0${left.nextNodeId}`, `${right.edge.edge_id}\0${right.nextNodeId}`));
|
|
53
53
|
return adjacency;
|
|
54
54
|
};
|
|
55
55
|
const addAdjacency = (adjacency, nodeId, entry) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { compareUnicodeCodePoints } from "../unicodeCodePointOrder.js";
|
|
2
2
|
import {} from "./javascriptApplicationGraphSchemas.js";
|
|
3
3
|
/** Build provider-neutral addon targets and link exact-subject native Evidence. */
|
|
4
4
|
export const buildJavaScriptNativeHandoffs = (nodes, edges, nativeEvidence) => {
|
|
@@ -24,7 +24,7 @@ export const buildJavaScriptNativeHandoffs = (nodes, edges, nativeEvidence) => {
|
|
|
24
24
|
providers: uniqueProviders(linked),
|
|
25
25
|
evidence_ids: linked
|
|
26
26
|
.map(({ evidence_id: id }) => id)
|
|
27
|
-
.sort(
|
|
27
|
+
.sort(compareUnicodeCodePoints),
|
|
28
28
|
recommended_tools: [
|
|
29
29
|
"open_binary",
|
|
30
30
|
"binary_overview",
|
|
@@ -35,7 +35,7 @@ export const buildJavaScriptNativeHandoffs = (nodes, edges, nativeEvidence) => {
|
|
|
35
35
|
},
|
|
36
36
|
];
|
|
37
37
|
})
|
|
38
|
-
.sort((left, right) =>
|
|
38
|
+
.sort((left, right) => compareUnicodeCodePoints(left.native_node_id, right.native_node_id));
|
|
39
39
|
};
|
|
40
40
|
const artifactDigest = (node) => {
|
|
41
41
|
if (node.identity.strategy === "content-digest")
|
|
@@ -65,7 +65,7 @@ const nativeExportNodes = (addon, edges, nodeById) => {
|
|
|
65
65
|
return [...new Set(ids)]
|
|
66
66
|
.map((id) => nodeById.get(id))
|
|
67
67
|
.filter((node) => node?.kind === "native-export")
|
|
68
|
-
.sort((left, right) =>
|
|
68
|
+
.sort((left, right) => compareUnicodeCodePoints(left.node_id, right.node_id));
|
|
69
69
|
};
|
|
70
70
|
const requestedExports = (nodes) => {
|
|
71
71
|
const values = nodes.flatMap((node) => node.observations.flatMap((observation) => [
|
|
@@ -73,7 +73,7 @@ const requestedExports = (nodes) => {
|
|
|
73
73
|
...stringArray(observation.properties.requested_members),
|
|
74
74
|
...stringArray(observation.properties.members),
|
|
75
75
|
]));
|
|
76
|
-
return [...new Set(values)].sort(
|
|
76
|
+
return [...new Set(values)].sort(compareUnicodeCodePoints);
|
|
77
77
|
};
|
|
78
78
|
const stringArray = (value) => Array.isArray(value)
|
|
79
79
|
? value.filter((item) => typeof item === "string")
|
|
@@ -83,4 +83,4 @@ const uniqueProviders = (evidence) => [
|
|
|
83
83
|
`${provider.id}\0${provider.name}\0${provider.version ?? ""}`,
|
|
84
84
|
provider,
|
|
85
85
|
])).values(),
|
|
86
|
-
].sort((left, right) =>
|
|
86
|
+
].sort((left, right) => compareUnicodeCodePoints(`${left.id}\0${left.name}\0${left.version ?? ""}`, `${right.id}\0${right.name}\0${right.version ?? ""}`));
|
|
@@ -16,7 +16,6 @@ export const javascriptRuntimeKindSchema = z.enum([
|
|
|
16
16
|
"electron-renderer",
|
|
17
17
|
]);
|
|
18
18
|
const observedJavaScriptRuntimeKindSchema = javascriptRuntimeKindSchema.or(z.literal("unknown"));
|
|
19
|
-
/** Input for one bounded, attach-only V8 Inspector observation. */
|
|
20
19
|
/** Input for one passive attach-only V8 Inspector observation. */
|
|
21
20
|
export const observeJavaScriptRuntimeInputSchema = z.strictObject({
|
|
22
21
|
...runtimeEndpoint,
|
|
@@ -33,7 +32,6 @@ export const javascriptRuntimeLocationSchema = z.discriminatedUnion("kind", [
|
|
|
33
32
|
z.strictObject({
|
|
34
33
|
kind: z.literal("file"),
|
|
35
34
|
file_path: z.string().min(1),
|
|
36
|
-
authority: z.literal("scope-fallback").optional(),
|
|
37
35
|
}),
|
|
38
36
|
z.strictObject({
|
|
39
37
|
kind: z.literal("url"),
|
|
@@ -48,8 +46,13 @@ export const javascriptRuntimeLocationSchema = z.discriminatedUnion("kind", [
|
|
|
48
46
|
/** Discovery metadata can identify an endpoint target without verifying its file location. */
|
|
49
47
|
export const javascriptRuntimeUnresolvedLocationSchema = z.strictObject({
|
|
50
48
|
kind: z.literal("unresolved"),
|
|
51
|
-
reported_url: z
|
|
52
|
-
|
|
49
|
+
reported_url: z
|
|
50
|
+
.string()
|
|
51
|
+
.describe("Raw Inspector URL, which may be empty for anonymous or evaluated code."),
|
|
52
|
+
reason: z.enum([
|
|
53
|
+
"unverifiable-file-location",
|
|
54
|
+
"location-authorization-not-attempted",
|
|
55
|
+
]),
|
|
53
56
|
});
|
|
54
57
|
/** Verified locations and explicitly unresolved discovery metadata. */
|
|
55
58
|
export const javascriptRuntimeTargetLocationSchema = z.union([
|
|
@@ -74,7 +77,7 @@ export const javascriptRuntimeTargetListSchema = z.strictObject({
|
|
|
74
77
|
});
|
|
75
78
|
const javascriptRuntimeScriptSchema = z.strictObject({
|
|
76
79
|
script_key: prefixedDigestSchema("v8_script"),
|
|
77
|
-
location:
|
|
80
|
+
location: javascriptRuntimeTargetLocationSchema,
|
|
78
81
|
execution_context_key: z.string().nullable(),
|
|
79
82
|
cdp_hash: z.string().nullable(),
|
|
80
83
|
length: z
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { classifyStaticLoadStates } from "./javascriptRuntimeLoadState.js";
|
|
2
2
|
import { buildReconciledApplicationGraph } from "./javascriptRuntimeReconciliationGraph.js";
|
|
3
3
|
import { reconcileRuntimeEntities } from "./javascriptRuntimeReconciliationMatching.js";
|
|
4
|
-
import {
|
|
4
|
+
import { parseStaticLayers, } from "./javascriptRuntimeReconciliationParsing.js";
|
|
5
|
+
import { parseRuntimeCaptures, } from "./javascriptRuntimeReconciliationCaptureParsing.js";
|
|
5
6
|
import { createJavaScriptRuntimeReconciliationResult } from "./javascriptRuntimeReconciliationResult.js";
|
|
6
|
-
import { reconcileJavaScriptRuntimeInputSchema } from "./javascriptRuntimeReconciliationSchemas.js";
|
|
7
7
|
import { projectRuntimeCaptures } from "./javascriptRuntimeReconciliationRuntime.js";
|
|
8
8
|
import { collectStaticRuntimeCandidates } from "./javascriptRuntimeStaticCandidates.js";
|
|
9
|
+
/** Parse caller Evidence once into the owner consumed by reconciliation. */
|
|
10
|
+
export const parseRuntimeReconciliationInput = (input) => ({
|
|
11
|
+
input,
|
|
12
|
+
layers: parseStaticLayers(input.static_layers, ["static_layers"]),
|
|
13
|
+
captures: parseRuntimeCaptures(input.runtime_observations, [
|
|
14
|
+
"runtime_observations",
|
|
15
|
+
]),
|
|
16
|
+
});
|
|
9
17
|
/** Reconcile static JAG layers with authorized passive CDP Evidence. */
|
|
10
|
-
export const reconcileJavaScriptRuntime = (
|
|
11
|
-
const
|
|
12
|
-
const layers = parseStaticLayers(parsed.static_layers);
|
|
13
|
-
const captures = parseRuntimeCaptures(parsed.runtime_observations);
|
|
18
|
+
export const reconcileJavaScriptRuntime = (parsed) => {
|
|
19
|
+
const { layers, captures } = parsed;
|
|
14
20
|
const runtime = projectRuntimeCaptures(captures);
|
|
15
21
|
const candidates = collectStaticRuntimeCandidates(layers);
|
|
16
22
|
const matching = reconcileRuntimeEntities({
|
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
import { isAbsolute } from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { digestCanonicalValue } from "../canonicalDigest.js";
|
|
3
3
|
import { isPathWithinRoot } from "../localPath.js";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
+
import { invalidInput, parseAtPath, } from "./javascriptRuntimeReconciliationInputValidation.js";
|
|
5
6
|
import { classifyBrowserCompleteness, } from "../browserCompleteness.js";
|
|
6
7
|
import { electronActiveObservationResultSchema, } from "./electronActiveObservation.js";
|
|
7
8
|
/** Parse active Electron Evidence as a bounded, target-only runtime capture. */
|
|
8
9
|
export const parseActiveElectronCapture = (evidence) => {
|
|
9
10
|
assertIdentity(evidence);
|
|
10
|
-
const result = electronActiveObservationResultSchema.parse(evidence.normalized_result);
|
|
11
|
-
const parameters = z
|
|
11
|
+
const result = parseAtPath((value) => electronActiveObservationResultSchema.parse(value), evidence.normalized_result, ["normalized_result"]);
|
|
12
|
+
const parameters = parseAtPath((value) => z
|
|
12
13
|
.object({
|
|
13
14
|
application_path: absolutePathSchema,
|
|
14
15
|
application_root: absolutePathSchema,
|
|
15
16
|
})
|
|
16
17
|
.passthrough()
|
|
17
|
-
.parse(evidence.parameters);
|
|
18
|
+
.parse(value), evidence.parameters, ["parameters"]);
|
|
18
19
|
if (result.application.application_path !== parameters.application_path ||
|
|
19
20
|
!isPathWithinRoot(parameters.application_root, result.application.application_path))
|
|
20
|
-
throw
|
|
21
|
+
throw invalidInput(["normalized_result", "application", "application_path"], "Active Electron Evidence application path disagrees with its configured root");
|
|
21
22
|
return {
|
|
22
23
|
kind: "electron-active",
|
|
23
24
|
evidence,
|
|
24
25
|
inspection: normalizeInspection(result),
|
|
25
|
-
captureSha256:
|
|
26
|
+
captureSha256: digestCanonicalValue(result, "Runtime reconciliation"),
|
|
26
27
|
scriptsCompleteWithinScope: false,
|
|
27
28
|
};
|
|
28
29
|
};
|
|
@@ -36,11 +37,11 @@ const assertIdentity = (evidence) => {
|
|
|
36
37
|
evidence.provider.version !== "1" ||
|
|
37
38
|
evidence.authority !== "controlled-replay" ||
|
|
38
39
|
evidence.confidence !== "observed")
|
|
39
|
-
throw
|
|
40
|
+
throw invalidInput([], "Evidence does not match the supported capture_electron_scenario contract");
|
|
40
41
|
};
|
|
41
42
|
const normalizeInspection = (result) => ({
|
|
42
43
|
target: {
|
|
43
|
-
target_id: `electron-active:${
|
|
44
|
+
target_id: `electron-active:${digestCanonicalValue(result.application.application_path, "Runtime reconciliation").slice(0, 32)}`,
|
|
44
45
|
type: "electron-application",
|
|
45
46
|
title: result.application.application_path,
|
|
46
47
|
attached: true,
|