rea-agents 6.1.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 +24 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +7 -7
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- 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 +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- 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 +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- 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 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- 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 +220 -71
- 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 +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -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/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- 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/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/filesystem/RegularFile.js +41 -0
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +105 -36
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +4 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +32 -41
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +19 -19
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
package/dist/domain/callPath.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { callPathInputSchema, callPathResultSchema, parseCallPathAddress, } from "./callPathSchemas.js";
|
|
2
2
|
import { parseFunctionEvidence, } from "./functionDossierEvidence.js";
|
|
3
|
-
|
|
3
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
4
4
|
/** Minimal directed caller-to-callee adjacency for call-path search. */
|
|
5
5
|
class CallGraph {
|
|
6
6
|
successors = new Map();
|
|
@@ -77,7 +77,7 @@ export const buildCallPath = (input) => {
|
|
|
77
77
|
goal: parsed.goal.address,
|
|
78
78
|
explored: summarizeSearch(graph, search.reached),
|
|
79
79
|
evidence_links: uniqueEvidence(snapshots.values()),
|
|
80
|
-
limitations: [...new Set(limitations)].sort(
|
|
80
|
+
limitations: [...new Set(limitations)].sort(compareUnicodeCodePoints),
|
|
81
81
|
};
|
|
82
82
|
const searchScope = { exhaustive };
|
|
83
83
|
if (found)
|
|
@@ -112,9 +112,9 @@ const parseSnapshots = (groups) => {
|
|
|
112
112
|
const snapshots = new Map();
|
|
113
113
|
for (const group of groups) {
|
|
114
114
|
const snapshot = parseFunctionEvidence(group);
|
|
115
|
-
const address =
|
|
116
|
-
for (const callee of snapshot.
|
|
117
|
-
|
|
115
|
+
const address = parseCallPathAddress(snapshot.dossier.procedure.address);
|
|
116
|
+
for (const callee of snapshot.dossier.callees)
|
|
117
|
+
parseCallPathAddress(callee.address);
|
|
118
118
|
if (snapshots.has(address))
|
|
119
119
|
throw new TypeError(`Duplicate function Evidence for ${address}`);
|
|
120
120
|
snapshots.set(address, snapshot);
|
|
@@ -131,9 +131,9 @@ const assertCompatible = (snapshots) => {
|
|
|
131
131
|
snapshot.subject.format !== first.subject.format ||
|
|
132
132
|
snapshot.subject.architecture !== first.subject.architecture)
|
|
133
133
|
throw new TypeError("Call-path Evidence mixes artifact subjects");
|
|
134
|
-
if (snapshot.provider.id !== first.provider.id ||
|
|
135
|
-
snapshot.provider.name !== first.provider.name ||
|
|
136
|
-
snapshot.provider.version !== first.provider.version)
|
|
134
|
+
if (snapshot.evidence.provider.id !== first.evidence.provider.id ||
|
|
135
|
+
snapshot.evidence.provider.name !== first.evidence.provider.name ||
|
|
136
|
+
snapshot.evidence.provider.version !== first.evidence.provider.version)
|
|
137
137
|
throw new TypeError("Call-path Evidence mixes providers");
|
|
138
138
|
}
|
|
139
139
|
};
|
|
@@ -141,8 +141,8 @@ const createGraph = (snapshots) => {
|
|
|
141
141
|
const graph = new CallGraph();
|
|
142
142
|
for (const [address, snapshot] of snapshots) {
|
|
143
143
|
graph.mergeNode(address);
|
|
144
|
-
for (const callee of snapshot.
|
|
145
|
-
const calleeAddress =
|
|
144
|
+
for (const callee of snapshot.dossier.callees) {
|
|
145
|
+
const calleeAddress = parseCallPathAddress(callee.address);
|
|
146
146
|
graph.mergeNode(calleeAddress);
|
|
147
147
|
graph.mergeDirectedEdge(address, calleeAddress);
|
|
148
148
|
}
|
|
@@ -175,9 +175,7 @@ const inspectSearch = ({ graph, snapshots, start, goal, }) => {
|
|
|
175
175
|
limitations.push(`No analyze_function Evidence covers reachable function ${node}`);
|
|
176
176
|
continue;
|
|
177
177
|
}
|
|
178
|
-
const neighbors = graph
|
|
179
|
-
.outNeighbors(node)
|
|
180
|
-
.sort((left, right) => left.localeCompare(right));
|
|
178
|
+
const neighbors = graph.outNeighbors(node).sort(compareUnicodeCodePoints);
|
|
181
179
|
for (const neighbor of neighbors)
|
|
182
180
|
if (!reached.has(neighbor)) {
|
|
183
181
|
reached.set(neighbor, depth + 1);
|
|
@@ -204,7 +202,7 @@ const enumeratePaths = ({ graph, start, goal, goalDistances, }) => {
|
|
|
204
202
|
.outNeighbors(node)
|
|
205
203
|
.filter((neighbor) => distance !== undefined &&
|
|
206
204
|
goalDistances.get(neighbor) === distance - 1)
|
|
207
|
-
.sort(
|
|
205
|
+
.sort(compareUnicodeCodePoints);
|
|
208
206
|
neighbors.set(node, candidates);
|
|
209
207
|
}
|
|
210
208
|
return { neighbors: candidates, nextIndex: 0 };
|
|
@@ -249,7 +247,7 @@ const citePath = (addresses, snapshots) => {
|
|
|
249
247
|
(index > 0 ? snapshots.get(addresses[index - 1] ?? "") : undefined);
|
|
250
248
|
return {
|
|
251
249
|
address,
|
|
252
|
-
name: snapshot?.procedure.name ?? null,
|
|
250
|
+
name: snapshot?.dossier.procedure.name ?? null,
|
|
253
251
|
evidence_links: snapshotLinks(supporting),
|
|
254
252
|
};
|
|
255
253
|
});
|
|
@@ -267,9 +265,8 @@ const citePath = (addresses, snapshots) => {
|
|
|
267
265
|
const snapshotLinks = (snapshot) => {
|
|
268
266
|
if (snapshot === undefined)
|
|
269
267
|
throw new TypeError("Every call-path claim requires supporting Evidence");
|
|
270
|
-
return snapshot.evidence.
|
|
268
|
+
return [snapshot.evidence.evidence_id];
|
|
271
269
|
};
|
|
272
270
|
const uniqueEvidence = (snapshots) => [
|
|
273
271
|
...new Set([...snapshots].flatMap((snapshot) => snapshotLinks(snapshot))),
|
|
274
|
-
].sort(
|
|
275
|
-
const normalizeAddress = (input) => parseCallPathAddress(input);
|
|
272
|
+
].sort(compareUnicodeCodePoints);
|
|
@@ -4,10 +4,10 @@ import { evidenceSchema } from "./evidence.js";
|
|
|
4
4
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
5
|
const addressSchema = z
|
|
6
6
|
.string()
|
|
7
|
-
.regex(/^(?:(?:[A-Za-z0-9._
|
|
7
|
+
.regex(/^(?:(?:[A-Za-z0-9._~\x2d]|%[0-9A-F]{2})+:)?0x(?:0|[1-9a-f][0-9a-f]*)$/u);
|
|
8
8
|
const inputAddressSchema = z
|
|
9
9
|
.string()
|
|
10
|
-
.regex(/^(?:(?:[A-Za-z0-9._
|
|
10
|
+
.regex(/^(?:(?:[A-Za-z0-9._~\x2d]|%[0-9a-fA-F]{2})+:)?0[xX][0-9a-fA-F]+$/u)
|
|
11
11
|
.transform((address) => {
|
|
12
12
|
const separator = address.lastIndexOf(":") + 1;
|
|
13
13
|
const space = address
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Streaming SHA-256 over canonical JSON. Hashing owner (avoids assembling
|
|
4
|
+
* aggregate strings); `comparisonSemantics.canonicalJson` (canonicalize lib)
|
|
5
|
+
* is the string-comparison owner. JSON object keys follow RFC 8785's UTF-16
|
|
6
|
+
* code-unit order in both; entity-list ordering is a separate concern.
|
|
7
|
+
*/
|
|
3
8
|
export const digestCanonicalValue = (value, context = "Comparison") => {
|
|
4
9
|
const hash = createHash("sha256");
|
|
5
10
|
// Batch small emitted parts to cut hash.update crossings.
|
|
@@ -54,6 +59,7 @@ const emitCanonical = (value, emit, ancestors) => {
|
|
|
54
59
|
else {
|
|
55
60
|
emit("{");
|
|
56
61
|
let first = true;
|
|
62
|
+
// Match canonicalize/RFC 8785, including supplementary-plane keys.
|
|
57
63
|
for (const key of Object.keys(value).sort()) {
|
|
58
64
|
if (Reflect.get(value, key) === undefined ||
|
|
59
65
|
typeof Reflect.get(value, key) === "symbol")
|
|
@@ -1,15 +1,3 @@
|
|
|
1
1
|
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
2
|
-
/**
|
|
3
|
-
* Canonical code-point ordering shared across domain and application layers.
|
|
4
|
-
*
|
|
5
|
-
* Compares strings by Unicode code point so graph ordering, fingerprints, and
|
|
6
|
-
* deterministic tie-breaks stay stable regardless of locale. Prefer this over
|
|
7
|
-
* `String.prototype.localeCompare`, which is locale-dependent.
|
|
8
|
-
*
|
|
9
|
-
* Ordering by code point differs from ordering by UTF-16 code unit for astral
|
|
10
|
-
* code points (above U+FFFF), whose lead surrogate is numerically below the
|
|
11
|
-
* BMP tail U+E000-U+FFFF.
|
|
12
|
-
*/
|
|
13
|
-
export const compareCodePoints = (left, right) => compareUnicodeCodePoints(left, right);
|
|
14
2
|
/** Deduplicate and sort strings with canonical code-point ordering. */
|
|
15
|
-
export const uniqueSorted = (values) => [...new Set(values)].sort(
|
|
3
|
+
export const uniqueSorted = (values) => [...new Set(values)].sort(compareUnicodeCodePoints);
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { artifactComparisonResultSchema } from "./artifactComparison.js";
|
|
3
3
|
import { uniqueSorted } from "./canonicalOrdering.js";
|
|
4
|
+
import { compositeKey, compareUnicodeCodePoints, } from "./unicodeCodePointOrder.js";
|
|
4
5
|
import { comparisonSourceEvidenceIds } from "./comparisonSourceEvidence.js";
|
|
5
6
|
import { evidenceSchema, parseEvidence } from "./evidence.js";
|
|
6
|
-
import { functionComparisonResultSchema } from "./
|
|
7
|
+
import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
|
|
7
8
|
import { PROCESS_PROVIDER, isProcessEvidenceProvider, } from "./process/processEvidenceProvider.js";
|
|
8
|
-
import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/
|
|
9
|
+
import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/processComparison.js";
|
|
9
10
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
10
11
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
11
12
|
/** Input for aggregating existing comparison Evidence. */
|
|
@@ -209,7 +210,7 @@ const functionFindings = (evidence) => {
|
|
|
209
210
|
dimension: dimension.dimension,
|
|
210
211
|
scope: "static_candidate",
|
|
211
212
|
status: dimension.status,
|
|
212
|
-
classification: dimension.status === "unknown"
|
|
213
|
+
classification: dimension.status === "unknown"
|
|
213
214
|
? "unresolved_branch"
|
|
214
215
|
: dimension.conclusion_kind,
|
|
215
216
|
limitations: dimension.limitations,
|
|
@@ -274,9 +275,7 @@ const behaviorStatus = (statuses) => {
|
|
|
274
275
|
const isChange = (status) => status === "added" || status === "removed" || status === "changed";
|
|
275
276
|
const count = (findings, classification) => findings.filter((finding) => finding.classification === classification)
|
|
276
277
|
.length;
|
|
277
|
-
const compareFindings = (left, right) => [left.scope, left.dimension, left.source_comparison_id]
|
|
278
|
-
.join("\0")
|
|
279
|
-
.localeCompare([right.scope, right.dimension, right.source_comparison_id].join("\0"), "en");
|
|
278
|
+
const compareFindings = (left, right) => compareUnicodeCodePoints(compositeKey([left.scope, left.dimension, left.source_comparison_id]), compositeKey([right.scope, right.dimension, right.source_comparison_id]));
|
|
280
279
|
const assertUnique = (values, label) => {
|
|
281
280
|
if (new Set(values).size !== values.length)
|
|
282
281
|
throw new TypeError(`Changed-behavior analysis rejects duplicate ${label}`);
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import canonicalize from "canonicalize";
|
|
2
|
-
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
3
2
|
/** Whether an inventory can support a claim that an item is absent. */
|
|
4
3
|
export const absenceClaimable = (coverage) => coverage.status === "complete" &&
|
|
5
4
|
coverage.truncated !== true &&
|
|
6
5
|
(coverage.omitted_count === undefined || coverage.omitted_count === 0);
|
|
7
|
-
/** SHA-256 of canonical JSON for stable, provider-neutral comparison IDs. */
|
|
8
|
-
export const canonicalDigest = (value, context = "Comparison") => {
|
|
9
|
-
return digestCanonicalValue(value, context);
|
|
10
|
-
};
|
|
11
6
|
/** Canonical JSON used for deterministic tie breaking and stable digests. */
|
|
12
7
|
export const canonicalJson = (value, context = "Comparison") => {
|
|
13
8
|
const encoded = canonicalize(value);
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
4
5
|
import { createEvidenceCompletionLedger, evidenceCompletionRecordSchema, } from "./evidenceCompletionLedger.js";
|
|
5
6
|
import { digestSchema } from "./../domain/digests.js";
|
|
6
7
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
7
|
-
const identifierSchema = z.string().regex(
|
|
8
|
+
const identifierSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
8
9
|
const identitySchema = z.strictObject({
|
|
9
10
|
id: identifierSchema,
|
|
10
11
|
version: z.string().min(1),
|
|
@@ -2,6 +2,11 @@ import { AnalysisError, } from "./analysisErrorBase.js";
|
|
|
2
2
|
/** Runtime configuration could not be parsed safely. */
|
|
3
3
|
export class ConfigurationError extends AnalysisError {
|
|
4
4
|
_tag = "ConfigurationError";
|
|
5
|
+
settings;
|
|
6
|
+
constructor(message, options) {
|
|
7
|
+
super(message, options);
|
|
8
|
+
this.settings = (options?.settings ?? []).map(({ setting, constraint }) => ({ setting, constraint }));
|
|
9
|
+
}
|
|
5
10
|
}
|
|
6
11
|
/** No app or binary session exists for an analysis request. */
|
|
7
12
|
export class NoBinaryOpenError extends AnalysisError {
|
|
@@ -16,10 +21,17 @@ export class BinaryTargetError extends AnalysisError {
|
|
|
16
21
|
reason;
|
|
17
22
|
_tag = "BinaryTargetError";
|
|
18
23
|
constraint;
|
|
24
|
+
/** The OS read-permission code of the cause, when the host denied access. */
|
|
25
|
+
systemCode;
|
|
19
26
|
constructor(path, reason, options) {
|
|
20
27
|
super(`Cannot open artifact: ${reason}`, options);
|
|
21
28
|
this.path = path;
|
|
22
29
|
this.reason = reason;
|
|
23
30
|
this.constraint = options?.constraint;
|
|
31
|
+
this.systemCode = readPermissionCode(options?.cause);
|
|
24
32
|
}
|
|
25
33
|
}
|
|
34
|
+
const readPermissionCode = (cause) => {
|
|
35
|
+
const code = cause instanceof Error ? Reflect.get(cause, "code") : undefined;
|
|
36
|
+
return code === "EACCES" || code === "EPERM" ? code : undefined;
|
|
37
|
+
};
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
4
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
5
|
+
import { evidenceSchema } from "./evidence.js";
|
|
5
6
|
import { evidenceBundleSchema } from "./evidenceBundle.js";
|
|
6
7
|
import { err, ok } from "./result.js";
|
|
7
8
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
8
9
|
const conformancePackageIdSchema = prefixedDigestSchema("cp");
|
|
9
|
-
const scenarioIdSchema = z.string().regex(
|
|
10
|
+
const scenarioIdSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
10
11
|
const scenarioManifestSchema = z.strictObject({
|
|
11
12
|
scenario_id: scenarioIdSchema,
|
|
12
13
|
name: z.string().min(1),
|
|
@@ -45,7 +46,7 @@ const shimPlanSchema = z.strictObject({
|
|
|
45
46
|
const expectedEvidenceSchema = z.strictObject({
|
|
46
47
|
scenario_id: scenarioIdSchema,
|
|
47
48
|
/** Expected evidence envelopes. */
|
|
48
|
-
envelopes: z.array(
|
|
49
|
+
envelopes: z.array(evidenceSchema),
|
|
49
50
|
/** Expected evidence bundle. */
|
|
50
51
|
bundle: evidenceBundleSchema.nullable(),
|
|
51
52
|
/** Required dimensions that must be present in the evidence. */
|
package/dist/domain/digests.js
CHANGED
|
@@ -25,6 +25,3 @@ export const prefixedDigestSchema = (prefix) => z
|
|
|
25
25
|
.regex(new RegExp(`^${prefix}_[a-f0-9]{64}$`, "u"), `Expected a ${prefix}_ prefixed lowercase sha256 digest`);
|
|
26
26
|
/** True when `value` is a bare digest. */
|
|
27
27
|
export const isDigest = (value) => typeof value === "string" && SHA256_PATTERN.test(value);
|
|
28
|
-
/** True when `value` is a digest carrying `prefix`. */
|
|
29
|
-
export const isPrefixedDigest = (value, prefix) => typeof value === "string" &&
|
|
30
|
-
prefixedDigestSchema(prefix).safeParse(value).success;
|
package/dist/domain/evidence.js
CHANGED
|
@@ -79,6 +79,7 @@ const evidenceBaseSchema = z
|
|
|
79
79
|
evidence_id: prefixedDigestSchema("ev"),
|
|
80
80
|
subject: subjectSchema.nullable(),
|
|
81
81
|
provider: providerSchema,
|
|
82
|
+
analysis_profile: analysisProfileSchema.nullable(),
|
|
82
83
|
predicate_type: z.string().min(1),
|
|
83
84
|
operation: z.string().min(1),
|
|
84
85
|
parameters: jsonObjectSchema,
|
|
@@ -92,13 +93,10 @@ const evidenceBaseSchema = z
|
|
|
92
93
|
evidence_links: z.array(prefixedDigestSchema("ev")),
|
|
93
94
|
})
|
|
94
95
|
.strict();
|
|
95
|
-
/**
|
|
96
|
-
export const
|
|
97
|
-
analysis_profile: analysisProfileSchema.optional(),
|
|
98
|
-
});
|
|
99
|
-
const validateAnalysisProfileProvider = (evidence, context) => {
|
|
96
|
+
/** Require a reported analysis profile to identify the observation provider. */
|
|
97
|
+
export const validateAnalysisProfileProvider = (evidence, context) => {
|
|
100
98
|
const profile = evidence.analysis_profile;
|
|
101
|
-
if (profile !==
|
|
99
|
+
if (profile !== null &&
|
|
102
100
|
(profile.provider.id !== evidence.provider.id ||
|
|
103
101
|
profile.provider.name !== evidence.provider.name ||
|
|
104
102
|
profile.provider.version !== evidence.provider.version))
|
|
@@ -109,15 +107,16 @@ const validateAnalysisProfileProvider = (evidence, context) => {
|
|
|
109
107
|
});
|
|
110
108
|
};
|
|
111
109
|
/** Strict, provider-neutral record for one successful public observation. */
|
|
112
|
-
export const evidenceSchema =
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
110
|
+
export const evidenceSchema = evidenceBaseSchema.superRefine(validateAnalysisProfileProvider);
|
|
111
|
+
const authenticatedEvidenceSchema = evidenceSchema.superRefine((evidence, context) => {
|
|
112
|
+
const { evidence_id: evidenceId, ...withoutId } = evidence;
|
|
113
|
+
if (computeEvidenceId(withoutId) !== evidenceId)
|
|
114
|
+
context.addIssue({
|
|
115
|
+
code: "custom",
|
|
116
|
+
path: ["evidence_id"],
|
|
117
|
+
message: "Evidence semantic identifier does not match its record",
|
|
118
|
+
});
|
|
119
|
+
});
|
|
121
120
|
const immutableEvidenceSnapshots = new WeakMap();
|
|
122
121
|
const immutableResultSchema = z
|
|
123
122
|
.custom(isImmutableJsonSnapshot)
|
|
@@ -135,9 +134,7 @@ const semanticProjection = (evidence) => ({
|
|
|
135
134
|
architecture: evidence.subject.architecture,
|
|
136
135
|
},
|
|
137
136
|
provider: evidence.provider,
|
|
138
|
-
|
|
139
|
-
? {}
|
|
140
|
-
: { analysis_profile: evidence.analysis_profile }),
|
|
137
|
+
analysis_profile: evidence.analysis_profile,
|
|
141
138
|
predicate_type: evidence.predicate_type,
|
|
142
139
|
operation: evidence.operation,
|
|
143
140
|
parameters: evidence.parameters,
|
|
@@ -159,17 +156,7 @@ export const parseEvidence = (input) => {
|
|
|
159
156
|
: undefined;
|
|
160
157
|
if (immutable !== undefined)
|
|
161
158
|
return immutable;
|
|
162
|
-
|
|
163
|
-
// record cannot satisfy the required-profile branch, whose failed parse
|
|
164
|
-
// would otherwise clone the entire normalized result before trying legacy.
|
|
165
|
-
const schema = typeof input === "object" && input !== null && "analysis_profile" in input
|
|
166
|
-
? profiledEvidenceSchema
|
|
167
|
-
: evidenceBaseSchema;
|
|
168
|
-
const evidence = schema.parse(input);
|
|
169
|
-
const { evidence_id: evidenceId, ...withoutId } = evidence;
|
|
170
|
-
if (computeEvidenceId(withoutId) !== evidenceId)
|
|
171
|
-
throw new TypeError("Evidence semantic identifier does not match its record");
|
|
172
|
-
return evidence;
|
|
159
|
+
return authenticatedEvidenceSchema.parse(input);
|
|
173
160
|
};
|
|
174
161
|
/** Authenticate and seal a ledger-owned snapshot; external mutable values are copied first. */
|
|
175
162
|
export const immutableEvidence = (input) => rememberImmutableEvidence(parseEvidence(input));
|
|
@@ -226,9 +213,7 @@ const normalizeEvidenceObservation = (target, provider, observation) => {
|
|
|
226
213
|
name: provider.name,
|
|
227
214
|
version: provider.version,
|
|
228
215
|
},
|
|
229
|
-
|
|
230
|
-
? {}
|
|
231
|
-
: { analysis_profile: observation.analysisProfile }),
|
|
216
|
+
analysis_profile: observation.analysisProfile ?? null,
|
|
232
217
|
predicate_type: observation.predicateType ?? "rea.analysis",
|
|
233
218
|
operation: observation.operation,
|
|
234
219
|
parameters: observation.parameters,
|
|
@@ -249,18 +234,12 @@ const normalizeEvidenceObservation = (target, provider, observation) => {
|
|
|
249
234
|
locations: [...(observation.locations ?? [])],
|
|
250
235
|
evidence_links: [...(observation.evidenceLinks ?? [])],
|
|
251
236
|
};
|
|
252
|
-
// Select the known envelope before parsing. A union otherwise traverses and
|
|
253
|
-
// clones a legacy result for the profiled branch before rejecting its absent
|
|
254
|
-
// profile and trying the legacy branch.
|
|
255
|
-
const schema = observation.analysisProfile === undefined
|
|
256
|
-
? evidenceBaseSchema
|
|
257
|
-
: profiledEvidenceSchema;
|
|
258
237
|
const sharedResult = typeof observation.result === "object" &&
|
|
259
238
|
observation.result !== null &&
|
|
260
239
|
isImmutableJsonSnapshot(observation.result);
|
|
261
240
|
const selectedSchema = sharedResult
|
|
262
|
-
?
|
|
263
|
-
:
|
|
241
|
+
? evidenceSchema.safeExtend({ normalized_result: immutableResultSchema })
|
|
242
|
+
: evidenceSchema;
|
|
264
243
|
const normalized = selectedSchema.parse({
|
|
265
244
|
...semantic,
|
|
266
245
|
evidence_id: `ev_${"0".repeat(64)}`,
|
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
import {
|
|
3
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
4
|
+
import { evidenceSchema, immutableEvidence, parseEvidence, providerSchema, } from "./evidence.js";
|
|
4
5
|
import { residualUnknownSchema, } from "./residualUnknown.js";
|
|
5
6
|
import { freezeJsonSnapshot } from "./immutableJson.js";
|
|
6
|
-
const artifactManifestSchema =
|
|
7
|
-
.unwrap()
|
|
8
|
-
.pick({
|
|
7
|
+
const artifactManifestSchema = evidenceSchema.shape.subject.unwrap().pick({
|
|
9
8
|
digest: true,
|
|
10
9
|
format: true,
|
|
11
10
|
architecture: true,
|
|
12
11
|
});
|
|
13
12
|
const providerManifestSchema = providerSchema;
|
|
14
|
-
const environmentManifestSchema =
|
|
13
|
+
const environmentManifestSchema = evidenceSchema.shape.environment.unwrap();
|
|
15
14
|
const scenarioManifestSchema = z.object({
|
|
16
|
-
evidence_id:
|
|
15
|
+
evidence_id: evidenceSchema.shape.evidence_id,
|
|
17
16
|
operation: z.string().min(1),
|
|
18
17
|
authority: z.literal("controlled-replay"),
|
|
19
18
|
});
|
|
20
19
|
const captureManifestSchema = z.object({
|
|
21
|
-
evidence_id:
|
|
20
|
+
evidence_id: evidenceSchema.shape.evidence_id,
|
|
22
21
|
predicate_type: z.string().min(1),
|
|
23
22
|
});
|
|
24
23
|
export const evidenceBundleSchema = z.object({
|
|
@@ -28,7 +27,7 @@ export const evidenceBundleSchema = z.object({
|
|
|
28
27
|
scenarios: z.array(scenarioManifestSchema),
|
|
29
28
|
captures: z.array(captureManifestSchema),
|
|
30
29
|
unknowns: z.array(residualUnknownSchema),
|
|
31
|
-
records: z.array(
|
|
30
|
+
records: z.array(evidenceSchema),
|
|
32
31
|
});
|
|
33
32
|
const immutableBundles = new WeakMap();
|
|
34
33
|
/** Build and authenticate a sealed bundle while reusing immutable Evidence records. */
|
|
@@ -45,7 +44,7 @@ export const createImmutableEvidenceBundle = (records, unknowns = []) => {
|
|
|
45
44
|
};
|
|
46
45
|
/** Project records into a deterministic bundle whose order has no semantics. */
|
|
47
46
|
export const createEvidenceBundle = (records, unknowns = []) => {
|
|
48
|
-
const sortedRecords = [...records].sort((left, right) => left.evidence_id
|
|
47
|
+
const sortedRecords = [...records].sort((left, right) => compareUnicodeCodePoints(left.evidence_id, right.evidence_id));
|
|
49
48
|
return {
|
|
50
49
|
artifacts: uniqueSorted(sortedRecords.flatMap(({ subject }) => subject === null
|
|
51
50
|
? []
|
|
@@ -75,55 +74,60 @@ export const createEvidenceBundle = (records, unknowns = []) => {
|
|
|
75
74
|
},
|
|
76
75
|
]
|
|
77
76
|
: []),
|
|
78
|
-
unknowns: [...unknowns].sort((left, right) => left.unknown_id
|
|
77
|
+
unknowns: [...unknowns].sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id) ||
|
|
79
78
|
left.revision - right.revision),
|
|
80
79
|
records: sortedRecords,
|
|
81
80
|
};
|
|
82
81
|
};
|
|
83
|
-
/**
|
|
82
|
+
/** Retain target records and eligible complete unknown histories with their mutation evidence. */
|
|
84
83
|
export const evidenceBundleForTarget = (bundle, sha256) => {
|
|
85
84
|
const recordsById = new Map(bundle.records.map((record) => [record.evidence_id, record]));
|
|
86
|
-
const
|
|
85
|
+
const histories = new Map();
|
|
86
|
+
for (const unknown of bundle.unknowns) {
|
|
87
|
+
const history = histories.get(unknown.unknown_id) ?? [];
|
|
88
|
+
history.push(unknown);
|
|
89
|
+
histories.set(unknown.unknown_id, history);
|
|
90
|
+
}
|
|
87
91
|
const retained = new Set();
|
|
88
|
-
const revisionsById = new Map();
|
|
89
92
|
const dependents = new Map();
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
93
|
+
const relationships = new Map();
|
|
94
|
+
for (const [id, history] of histories) {
|
|
95
|
+
const eligible = history.every((unknown) => {
|
|
96
|
+
if (unknown.scope_digest !== sha256)
|
|
97
|
+
return false;
|
|
98
|
+
const mutationEvidenceIds = new Set(unknown.mutation_evidence_ids);
|
|
99
|
+
return referencedEvidenceIds(unknown).every((evidenceId) => {
|
|
100
|
+
const record = recordsById.get(evidenceId);
|
|
101
|
+
// Mutation subjects record the target active at the time of an edit,
|
|
102
|
+
// which need not be the question's immutable investigation scope.
|
|
103
|
+
return (record?.subject?.digest.sha256 === sha256 ||
|
|
104
|
+
(mutationEvidenceIds.has(evidenceId) &&
|
|
105
|
+
record?.predicate_type === "rea.residual-unknown-mutation"));
|
|
106
|
+
});
|
|
98
107
|
});
|
|
99
|
-
if (!
|
|
108
|
+
if (!eligible)
|
|
100
109
|
continue;
|
|
101
|
-
retained.add(
|
|
102
|
-
|
|
103
|
-
|
|
110
|
+
retained.add(id);
|
|
111
|
+
const relatedIds = new Set(history.flatMap((unknown) => unknown.relationships.map(({ unknown_id }) => unknown_id)));
|
|
112
|
+
relationships.set(id, relatedIds);
|
|
113
|
+
for (const relatedId of relatedIds) {
|
|
104
114
|
const references = dependents.get(relatedId) ?? new Set();
|
|
105
|
-
references.add(
|
|
115
|
+
references.add(id);
|
|
106
116
|
dependents.set(relatedId, references);
|
|
107
117
|
}
|
|
108
118
|
}
|
|
109
119
|
const pending = [];
|
|
110
|
-
for (const
|
|
111
|
-
if (
|
|
112
|
-
pending.push(
|
|
120
|
+
for (const [id, relatedIds] of relationships)
|
|
121
|
+
if ([...relatedIds].some((relatedId) => !retained.has(relatedId)))
|
|
122
|
+
pending.push(id);
|
|
113
123
|
for (let index = 0; index < pending.length; index += 1) {
|
|
114
|
-
const
|
|
115
|
-
if (
|
|
124
|
+
const id = pending[index];
|
|
125
|
+
if (id === undefined || !retained.delete(id))
|
|
116
126
|
continue;
|
|
117
|
-
const
|
|
118
|
-
if (remaining > 0) {
|
|
119
|
-
revisionsById.set(unknown.unknown_id, remaining);
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
revisionsById.delete(unknown.unknown_id);
|
|
123
|
-
for (const dependent of dependents.get(unknown.unknown_id) ?? [])
|
|
127
|
+
for (const dependent of dependents.get(id) ?? [])
|
|
124
128
|
pending.push(dependent);
|
|
125
129
|
}
|
|
126
|
-
const unknowns =
|
|
130
|
+
const unknowns = bundle.unknowns.filter((unknown) => retained.has(unknown.unknown_id));
|
|
127
131
|
const mutationIds = new Set(unknowns.flatMap(({ mutation_evidence_ids: ids }) => ids));
|
|
128
132
|
return createEvidenceBundle(bundle.records.filter((record) => record.subject?.digest.sha256 === sha256 ||
|
|
129
133
|
mutationIds.has(record.evidence_id)), unknowns);
|
|
@@ -139,7 +143,7 @@ const referencedEvidenceIds = (unknown) => [
|
|
|
139
143
|
* Evidence record, such as one command result, is not a bundle.
|
|
140
144
|
*/
|
|
141
145
|
export const describeEvidenceBundleFailure = (input, cause) => {
|
|
142
|
-
const record =
|
|
146
|
+
const record = evidenceSchema.safeParse(input);
|
|
143
147
|
if (record.success)
|
|
144
148
|
return `Expected an Evidence bundle with records and manifest arrays, but this JSON is one Evidence record (${record.data.evidence_id}). Export a session bundle with the MCP export_evidence_bundle tool and supply that file.`;
|
|
145
149
|
return cause instanceof z.ZodError
|
|
@@ -168,7 +172,19 @@ export const parseEvidenceBundle = (input) => {
|
|
|
168
172
|
if (new Set(recordIds).size !== recordIds.length)
|
|
169
173
|
throw new TypeError("Evidence bundle contains duplicate record IDs");
|
|
170
174
|
validateUnknownGraph(parsed.unknowns, parsed.records);
|
|
171
|
-
const canonical = createEvidenceBundle(parsed.records.map(
|
|
175
|
+
const canonical = createEvidenceBundle(parsed.records.map((record, index) => {
|
|
176
|
+
try {
|
|
177
|
+
return parseEvidence(record);
|
|
178
|
+
}
|
|
179
|
+
catch (cause) {
|
|
180
|
+
if (cause instanceof z.ZodError)
|
|
181
|
+
throw new z.ZodError(cause.issues.map((issue) => ({
|
|
182
|
+
...issue,
|
|
183
|
+
path: ["records", index, ...issue.path],
|
|
184
|
+
})));
|
|
185
|
+
throw cause;
|
|
186
|
+
}
|
|
187
|
+
}), parsed.unknowns);
|
|
172
188
|
if (JSON.stringify(parsed) !== JSON.stringify(canonical))
|
|
173
189
|
throw new TypeError("Evidence bundle manifests are not canonical");
|
|
174
190
|
return canonical;
|
|
@@ -366,6 +382,6 @@ const uniqueSorted = (values) => {
|
|
|
366
382
|
for (const value of values)
|
|
367
383
|
unique.set(JSON.stringify(value), value);
|
|
368
384
|
return [...unique.entries()]
|
|
369
|
-
.sort(([left], [right]) => left
|
|
385
|
+
.sort(([left], [right]) => compareUnicodeCodePoints(left, right))
|
|
370
386
|
.map(([, value]) => value);
|
|
371
387
|
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
+
import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
|
|
4
5
|
import { prefixedDigestSchema } from "./../domain/digests.js";
|
|
5
6
|
const evidenceIdSchema = prefixedDigestSchema("ev");
|
|
6
|
-
const claimIdSchema = z.string().regex(
|
|
7
|
+
const claimIdSchema = z.string().regex(IDENTIFIER_PATTERN);
|
|
7
8
|
/** Terminal outcome recorded for one verifier claim. */
|
|
8
9
|
export const evidenceCompletionStatusSchema = z.enum([
|
|
9
10
|
"pass",
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { isAbsolute } from "node:path";
|
|
2
3
|
import { digestSchema } from "../digests.js";
|
|
3
4
|
import { jsonValueSchema } from "../jsonValue.js";
|
|
4
|
-
import {
|
|
5
|
+
import { localPathStringSchema } from "../localPath.js";
|
|
5
6
|
const bytes = z.number().int().min(0).max(Number.MAX_SAFE_INTEGER);
|
|
6
7
|
const range = z.strictObject({ offset: bytes, length: bytes.positive() });
|
|
7
8
|
const target = {
|
|
8
9
|
path: localPathStringSchema
|
|
9
|
-
.refine(
|
|
10
|
+
.refine(isAbsolute, {
|
|
10
11
|
message: "path must be an absolute local filesystem path (for example /tmp/firmware.bin or C:\\firmware\\firmware.bin)",
|
|
11
12
|
})
|
|
12
13
|
.describe("Absolute local firmware file; never executed. Relative paths are rejected."),
|
|
@@ -17,7 +18,7 @@ export const firmwareInputSchemas = {
|
|
|
17
18
|
extract_firmware: z.strictObject({
|
|
18
19
|
...target,
|
|
19
20
|
output_directory: localPathStringSchema
|
|
20
|
-
.refine(
|
|
21
|
+
.refine(isAbsolute, {
|
|
21
22
|
message: "output_directory must be an absolute local filesystem path",
|
|
22
23
|
})
|
|
23
24
|
.describe("Absolute, absent output directory; parent must exist"),
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { canonicalJson } from "./comparisonSemantics.js";
|
|
2
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
2
3
|
import { parseFunctionEvidence } from "./functionDossierEvidence.js";
|
|
3
4
|
import { functionMatch } from "./functionComparisonNormalization.js";
|
|
4
5
|
import { functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
|
|
5
6
|
import { overallStatus, summarize } from "./functionComparisonResults.js";
|
|
6
7
|
import { compareDimensions } from "./functionComparisonDimensions.js";
|
|
7
|
-
export { functionComparisonInputSchema, functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
|
|
8
8
|
/** Compare two complete function Evidence records without fuzzy matching. */
|
|
9
9
|
export const compareFunctions = (leftInput, rightInput) => {
|
|
10
10
|
const left = parseFunctionEvidence(leftInput);
|
|
11
11
|
const right = parseFunctionEvidence(rightInput);
|
|
12
|
-
const links = [left.evidence
|
|
13
|
-
const providersDiffer = canonicalJson(left.provider, "Function comparison") !==
|
|
14
|
-
canonicalJson(right.provider, "Function comparison");
|
|
15
|
-
const dimensions = compareDimensions(left, right, links, providersDiffer);
|
|
12
|
+
const links = [left.evidence.evidence_id, right.evidence.evidence_id];
|
|
13
|
+
const providersDiffer = canonicalJson(left.evidence.provider, "Function comparison") !==
|
|
14
|
+
canonicalJson(right.evidence.provider, "Function comparison");
|
|
15
|
+
const dimensions = compareDimensions(left, right, { links, providersDiffer });
|
|
16
16
|
const match = functionMatch(left, right);
|
|
17
17
|
const changes = dimensions.filter(({ status }) => status !== "unchanged");
|
|
18
18
|
return functionComparisonResultSchema.parse({
|
|
@@ -33,6 +33,6 @@ export const compareFunctions = (leftInput, rightInput) => {
|
|
|
33
33
|
]
|
|
34
34
|
: []),
|
|
35
35
|
]),
|
|
36
|
-
].sort((a, b) => a
|
|
36
|
+
].sort((a, b) => compareUnicodeCodePoints(a, b)),
|
|
37
37
|
});
|
|
38
38
|
};
|