rea-agents 6.2.0 → 6.4.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 -23
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/bridge/hopper_bridge.py +2 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +59 -21
- package/dist/android/JadxSession.js +51 -9
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +85 -19
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +98 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +75 -27
- package/dist/application/DirectAnalysis.js +14 -8
- package/dist/application/DirectAnalysisCleanup.js +1 -2
- package/dist/application/DirectAnalysisStatus.js +3 -6
- package/dist/application/Doctor.js +27 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +10 -4
- package/dist/application/JsonFiles.js +16 -15
- package/dist/application/JsonInputFile.js +252 -0
- package/dist/application/LinuxHopper.js +6 -13
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +16 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +103 -0
- package/dist/application/Setup.js +69 -10
- package/dist/application/SetupClientConfiguration.js +134 -23
- package/dist/application/SetupHost.js +102 -22
- package/dist/application/SetupPlan.js +18 -17
- package/dist/application/SetupSkill.js +81 -13
- package/dist/application/SupportedClients.js +305 -37
- package/dist/application/Uninstall.js +172 -8
- package/dist/application/UpdateMaintenance.js +23 -23
- package/dist/application/Utf8JsonInput.js +71 -0
- package/dist/application/WebScriptExportService.js +130 -57
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +18 -1
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +34 -31
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +218 -80
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +87 -25
- package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +73 -30
- package/dist/artifacts/inventory/scanReader.js +43 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +9 -3
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +48 -23
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
- package/dist/browser/PlaywrightScenarioSession.js +130 -65
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +35 -9
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +12 -13
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +14 -10
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +19 -13
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +12 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +68 -22
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +11 -2
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +7 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +14 -7
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +104 -13
- package/dist/contracts/javascript/electronToolContracts.js +16 -3
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +5 -4
- package/dist/contracts/sessionToolSchemas.js +9 -4
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +7 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -4
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +5 -2
- package/dist/domain/analysisView/analysisView.js +53 -5
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +3 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +39 -11
- package/dist/domain/artifactGraph.js +6 -4
- package/dist/domain/artifactIdentity.js +37 -9
- package/dist/domain/artifactInspection.js +10 -50
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +16 -17
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserObservationSchemas.js +8 -4
- 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/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +12 -6
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/evidenceRecordSummary.js +144 -0
- 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/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
- package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
- package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
- package/dist/domain/javascript/javascriptAstValues.js +54 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -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/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- 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 +12 -6
- 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 +15 -17
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- 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/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
- package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
- package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +69 -31
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +47 -6
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +102 -11
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +67 -0
- package/dist/domain/process/processCaptureValidation.js +83 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +62 -10
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/propertyListKeys.js +3 -1
- 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 +32 -23
- package/dist/domain/referenceSourceImportParsing.js +40 -48
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- 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 +23 -3
- package/dist/domain/webCaptureDiff.js +170 -30
- 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/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +65 -31
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +73 -0
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +90 -8
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +123 -58
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +10 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +7 -3
- package/dist/ida/IdaWorkspace.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/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- 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 +100 -20
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +104 -51
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +116 -22
- package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +202 -47
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +118 -47
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +36 -5
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +58 -21
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +38 -7
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -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,6 +1,7 @@
|
|
|
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
7
|
import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
|
|
@@ -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}`);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
2
|
+
/** Retain short exact string keys or commit their value in a reserved digest namespace. */
|
|
3
|
+
export const compactStringIdentityKey = (value) => {
|
|
4
|
+
const prefix = "value-sha256:";
|
|
5
|
+
const digestKey = `${prefix}${digestCanonicalValue(value, "String identity")}`;
|
|
6
|
+
return value.length <= digestKey.length && !value.startsWith(prefix)
|
|
7
|
+
? value
|
|
8
|
+
: digestKey;
|
|
9
|
+
};
|
|
@@ -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);
|
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
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
3
3
|
import { canonicalJsonDigestSteps } from "./canonicalJsonDigestSteps.js";
|
|
4
4
|
import { analysisProfileSchema, } from "./analysisProfile.js";
|
|
5
|
+
import { BINARY_ARCHITECTURES, } from "./binaryTargetTypes.js";
|
|
5
6
|
import { jsonObjectSchema, jsonValueSchema, jsonValueValidationIssue, jsonValueValidationSteps, } from "./jsonValue.js";
|
|
6
7
|
import { freezeJsonSnapshot, isImmutableJsonSnapshot, } from "./immutableJson.js";
|
|
7
8
|
import { digestSchema } from "./../domain/digests.js";
|
|
@@ -41,7 +42,7 @@ const subjectSchema = z.object({
|
|
|
41
42
|
"javascript-bundle",
|
|
42
43
|
"entitlements",
|
|
43
44
|
]),
|
|
44
|
-
architecture: z.enum(
|
|
45
|
+
architecture: z.enum(BINARY_ARCHITECTURES).nullable(),
|
|
45
46
|
local_path: z.string(),
|
|
46
47
|
});
|
|
47
48
|
/** Source location attached to an evidence observation. */
|
|
@@ -108,6 +109,15 @@ export const validateAnalysisProfileProvider = (evidence, context) => {
|
|
|
108
109
|
};
|
|
109
110
|
/** Strict, provider-neutral record for one successful public observation. */
|
|
110
111
|
export const evidenceSchema = evidenceBaseSchema.superRefine(validateAnalysisProfileProvider);
|
|
112
|
+
const authenticatedEvidenceSchema = evidenceSchema.superRefine((evidence, context) => {
|
|
113
|
+
const { evidence_id: evidenceId, ...withoutId } = evidence;
|
|
114
|
+
if (computeEvidenceId(withoutId) !== evidenceId)
|
|
115
|
+
context.addIssue({
|
|
116
|
+
code: "custom",
|
|
117
|
+
path: ["evidence_id"],
|
|
118
|
+
message: "Evidence semantic identifier does not match its record",
|
|
119
|
+
});
|
|
120
|
+
});
|
|
111
121
|
const immutableEvidenceSnapshots = new WeakMap();
|
|
112
122
|
const immutableResultSchema = z
|
|
113
123
|
.custom(isImmutableJsonSnapshot)
|
|
@@ -147,11 +157,7 @@ export const parseEvidence = (input) => {
|
|
|
147
157
|
: undefined;
|
|
148
158
|
if (immutable !== undefined)
|
|
149
159
|
return immutable;
|
|
150
|
-
|
|
151
|
-
const { evidence_id: evidenceId, ...withoutId } = evidence;
|
|
152
|
-
if (computeEvidenceId(withoutId) !== evidenceId)
|
|
153
|
-
throw new TypeError("Evidence semantic identifier does not match its record");
|
|
154
|
-
return evidence;
|
|
160
|
+
return authenticatedEvidenceSchema.parse(input);
|
|
155
161
|
};
|
|
156
162
|
/** Authenticate and seal a ledger-owned snapshot; external mutable values are copied first. */
|
|
157
163
|
export const immutableEvidence = (input) => rememberImmutableEvidence(parseEvidence(input));
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
3
4
|
import { evidenceSchema, immutableEvidence, parseEvidence, providerSchema, } from "./evidence.js";
|
|
4
5
|
import { residualUnknownSchema, } from "./residualUnknown.js";
|
|
5
6
|
import { freezeJsonSnapshot } from "./immutableJson.js";
|
|
@@ -43,7 +44,7 @@ export const createImmutableEvidenceBundle = (records, unknowns = []) => {
|
|
|
43
44
|
};
|
|
44
45
|
/** Project records into a deterministic bundle whose order has no semantics. */
|
|
45
46
|
export const createEvidenceBundle = (records, unknowns = []) => {
|
|
46
|
-
const sortedRecords = [...records].sort((left, right) => left.evidence_id
|
|
47
|
+
const sortedRecords = [...records].sort((left, right) => compareUnicodeCodePoints(left.evidence_id, right.evidence_id));
|
|
47
48
|
return {
|
|
48
49
|
artifacts: uniqueSorted(sortedRecords.flatMap(({ subject }) => subject === null
|
|
49
50
|
? []
|
|
@@ -73,55 +74,60 @@ export const createEvidenceBundle = (records, unknowns = []) => {
|
|
|
73
74
|
},
|
|
74
75
|
]
|
|
75
76
|
: []),
|
|
76
|
-
unknowns: [...unknowns].sort((left, right) => left.unknown_id
|
|
77
|
+
unknowns: [...unknowns].sort((left, right) => compareUnicodeCodePoints(left.unknown_id, right.unknown_id) ||
|
|
77
78
|
left.revision - right.revision),
|
|
78
79
|
records: sortedRecords,
|
|
79
80
|
};
|
|
80
81
|
};
|
|
81
|
-
/**
|
|
82
|
+
/** Retain target records and eligible complete unknown histories with their mutation evidence. */
|
|
82
83
|
export const evidenceBundleForTarget = (bundle, sha256) => {
|
|
83
84
|
const recordsById = new Map(bundle.records.map((record) => [record.evidence_id, record]));
|
|
84
|
-
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
|
+
}
|
|
85
91
|
const retained = new Set();
|
|
86
|
-
const revisionsById = new Map();
|
|
87
92
|
const dependents = new Map();
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
+
});
|
|
96
107
|
});
|
|
97
|
-
if (!
|
|
108
|
+
if (!eligible)
|
|
98
109
|
continue;
|
|
99
|
-
retained.add(
|
|
100
|
-
|
|
101
|
-
|
|
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) {
|
|
102
114
|
const references = dependents.get(relatedId) ?? new Set();
|
|
103
|
-
references.add(
|
|
115
|
+
references.add(id);
|
|
104
116
|
dependents.set(relatedId, references);
|
|
105
117
|
}
|
|
106
118
|
}
|
|
107
119
|
const pending = [];
|
|
108
|
-
for (const
|
|
109
|
-
if (
|
|
110
|
-
pending.push(
|
|
120
|
+
for (const [id, relatedIds] of relationships)
|
|
121
|
+
if ([...relatedIds].some((relatedId) => !retained.has(relatedId)))
|
|
122
|
+
pending.push(id);
|
|
111
123
|
for (let index = 0; index < pending.length; index += 1) {
|
|
112
|
-
const
|
|
113
|
-
if (
|
|
124
|
+
const id = pending[index];
|
|
125
|
+
if (id === undefined || !retained.delete(id))
|
|
114
126
|
continue;
|
|
115
|
-
const
|
|
116
|
-
if (remaining > 0) {
|
|
117
|
-
revisionsById.set(unknown.unknown_id, remaining);
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
revisionsById.delete(unknown.unknown_id);
|
|
121
|
-
for (const dependent of dependents.get(unknown.unknown_id) ?? [])
|
|
127
|
+
for (const dependent of dependents.get(id) ?? [])
|
|
122
128
|
pending.push(dependent);
|
|
123
129
|
}
|
|
124
|
-
const unknowns =
|
|
130
|
+
const unknowns = bundle.unknowns.filter((unknown) => retained.has(unknown.unknown_id));
|
|
125
131
|
const mutationIds = new Set(unknowns.flatMap(({ mutation_evidence_ids: ids }) => ids));
|
|
126
132
|
return createEvidenceBundle(bundle.records.filter((record) => record.subject?.digest.sha256 === sha256 ||
|
|
127
133
|
mutationIds.has(record.evidence_id)), unknowns);
|
|
@@ -166,7 +172,19 @@ export const parseEvidenceBundle = (input) => {
|
|
|
166
172
|
if (new Set(recordIds).size !== recordIds.length)
|
|
167
173
|
throw new TypeError("Evidence bundle contains duplicate record IDs");
|
|
168
174
|
validateUnknownGraph(parsed.unknowns, parsed.records);
|
|
169
|
-
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);
|
|
170
188
|
if (JSON.stringify(parsed) !== JSON.stringify(canonical))
|
|
171
189
|
throw new TypeError("Evidence bundle manifests are not canonical");
|
|
172
190
|
return canonical;
|
|
@@ -364,6 +382,6 @@ const uniqueSorted = (values) => {
|
|
|
364
382
|
for (const value of values)
|
|
365
383
|
unique.set(JSON.stringify(value), value);
|
|
366
384
|
return [...unique.entries()]
|
|
367
|
-
.sort(([left], [right]) => left
|
|
385
|
+
.sort(([left], [right]) => compareUnicodeCodePoints(left, right))
|
|
368
386
|
.map(([, value]) => value);
|
|
369
387
|
};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { digestSchema, prefixedDigestSchema } from "./digests.js";
|
|
3
|
+
import { evidenceSchema } from "./evidence.js";
|
|
4
|
+
/** Exact retained-record selectors; selection never resolves a provider address. */
|
|
5
|
+
export const evidenceRecordFiltersSchema = z.strictObject({
|
|
6
|
+
evidence_id: prefixedDigestSchema("ev").optional(),
|
|
7
|
+
operation: z.string().min(1).optional(),
|
|
8
|
+
target_sha256: digestSchema.optional(),
|
|
9
|
+
analysis_profile_digest: digestSchema.optional(),
|
|
10
|
+
procedure_address: z.string().min(1).optional(),
|
|
11
|
+
});
|
|
12
|
+
const countSchema = z.number().int().nonnegative();
|
|
13
|
+
const nativeMetadataSchema = z.object({
|
|
14
|
+
procedure: z.object({ address: z.string(), name: z.string().nullish() }),
|
|
15
|
+
native_value_flow: z.unknown().optional(),
|
|
16
|
+
});
|
|
17
|
+
const valueFlowMetadataSchema = z.union([
|
|
18
|
+
z.object({
|
|
19
|
+
available: z.literal(true),
|
|
20
|
+
truncated: z.boolean(),
|
|
21
|
+
omitted_operations_lower_bound: countSchema.optional(),
|
|
22
|
+
known_omitted_inputs: countSchema.optional(),
|
|
23
|
+
known_omitted_edges: countSchema.optional(),
|
|
24
|
+
}),
|
|
25
|
+
z.object({ available: z.literal(false), reason: z.string() }),
|
|
26
|
+
]);
|
|
27
|
+
const nativeSummarySchema = z.discriminatedUnion("available", [
|
|
28
|
+
z.strictObject({
|
|
29
|
+
available: z.literal(true),
|
|
30
|
+
procedure_address: z.string(),
|
|
31
|
+
procedure_name: z.string().nullable(),
|
|
32
|
+
value_flow: z.discriminatedUnion("status", [
|
|
33
|
+
z.strictObject({
|
|
34
|
+
status: z.literal("observed"),
|
|
35
|
+
truncated: z.boolean(),
|
|
36
|
+
omitted_operations_lower_bound: countSchema.nullable(),
|
|
37
|
+
known_omitted_inputs: countSchema.nullable(),
|
|
38
|
+
known_omitted_edges: countSchema.nullable(),
|
|
39
|
+
}),
|
|
40
|
+
z.strictObject({ status: z.literal("unavailable"), reason: z.string() }),
|
|
41
|
+
z.strictObject({ status: z.literal("not-recorded") }),
|
|
42
|
+
z.strictObject({ status: z.literal("unknown"), reason: z.string() }),
|
|
43
|
+
]),
|
|
44
|
+
}),
|
|
45
|
+
z.strictObject({
|
|
46
|
+
available: z.literal(false),
|
|
47
|
+
reason: z.enum(["different-operation", "not-recorded-or-incompatible"]),
|
|
48
|
+
}),
|
|
49
|
+
]);
|
|
50
|
+
/** Metadata for complete retained records, independent of analysis completeness. */
|
|
51
|
+
export const evidenceBundleSummarySchema = z.strictObject({
|
|
52
|
+
kind: z.literal("evidence-bundle-summary"),
|
|
53
|
+
filters: z.record(z.string(), z.string()),
|
|
54
|
+
total_retained_records: countSchema,
|
|
55
|
+
matching_records: countSchema,
|
|
56
|
+
unknown_revisions: countSchema,
|
|
57
|
+
records: z.array(z.strictObject({
|
|
58
|
+
evidence_id: evidenceSchema.shape.evidence_id,
|
|
59
|
+
subject: evidenceSchema.shape.subject,
|
|
60
|
+
provider: evidenceSchema.shape.provider,
|
|
61
|
+
operation: evidenceSchema.shape.operation,
|
|
62
|
+
confidence: evidenceSchema.shape.confidence,
|
|
63
|
+
authority: evidenceSchema.shape.authority,
|
|
64
|
+
analysis_profile_digest: digestSchema.nullable(),
|
|
65
|
+
retention: z.literal("complete-record"),
|
|
66
|
+
limitation_count: countSchema,
|
|
67
|
+
native_dossier: nativeSummarySchema,
|
|
68
|
+
})),
|
|
69
|
+
});
|
|
70
|
+
const nativeSummary = (evidence) => {
|
|
71
|
+
if (evidence.operation !== "analyze_function")
|
|
72
|
+
return { available: false, reason: "different-operation" };
|
|
73
|
+
// Read only producer metadata. Parsing the full dossier would allocate every
|
|
74
|
+
// large collection merely to discover its already authenticated parent ID.
|
|
75
|
+
const parsed = nativeMetadataSchema.safeParse(evidence.normalized_result);
|
|
76
|
+
if (!parsed.success)
|
|
77
|
+
return { available: false, reason: "not-recorded-or-incompatible" };
|
|
78
|
+
const flow = valueFlowMetadataSchema.safeParse(parsed.data.native_value_flow);
|
|
79
|
+
return {
|
|
80
|
+
available: true,
|
|
81
|
+
procedure_address: parsed.data.procedure.address,
|
|
82
|
+
procedure_name: parsed.data.procedure.name ?? null,
|
|
83
|
+
value_flow: parsed.data.native_value_flow == null
|
|
84
|
+
? { status: "not-recorded" }
|
|
85
|
+
: !flow.success
|
|
86
|
+
? {
|
|
87
|
+
status: "unknown",
|
|
88
|
+
reason: "Value-flow metadata has an incompatible representation.",
|
|
89
|
+
}
|
|
90
|
+
: flow.data.available
|
|
91
|
+
? {
|
|
92
|
+
status: "observed",
|
|
93
|
+
truncated: flow.data.truncated,
|
|
94
|
+
omitted_operations_lower_bound: flow.data.omitted_operations_lower_bound ?? null,
|
|
95
|
+
known_omitted_inputs: flow.data.known_omitted_inputs ?? null,
|
|
96
|
+
known_omitted_edges: flow.data.known_omitted_edges ?? null,
|
|
97
|
+
}
|
|
98
|
+
: { status: "unavailable", reason: flow.data.reason },
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
/** Discover retained Evidence without reading or copying its complete payloads. */
|
|
102
|
+
export const summarizeEvidenceBundle = (bundle, filters = {}) => {
|
|
103
|
+
const selectedFilters = {};
|
|
104
|
+
for (const [field, value] of Object.entries(filters))
|
|
105
|
+
if (value !== undefined)
|
|
106
|
+
selectedFilters[field] = value;
|
|
107
|
+
const records = [];
|
|
108
|
+
for (const evidence of bundle.records) {
|
|
109
|
+
if ((filters.evidence_id !== undefined &&
|
|
110
|
+
filters.evidence_id !== evidence.evidence_id) ||
|
|
111
|
+
(filters.operation !== undefined &&
|
|
112
|
+
filters.operation !== evidence.operation) ||
|
|
113
|
+
(filters.target_sha256 !== undefined &&
|
|
114
|
+
filters.target_sha256 !== evidence.subject?.digest.sha256) ||
|
|
115
|
+
(filters.analysis_profile_digest !== undefined &&
|
|
116
|
+
filters.analysis_profile_digest !== evidence.analysis_profile?.digest))
|
|
117
|
+
continue;
|
|
118
|
+
const native = nativeSummary(evidence);
|
|
119
|
+
if (filters.procedure_address !== undefined &&
|
|
120
|
+
(!native.available ||
|
|
121
|
+
filters.procedure_address !== native.procedure_address))
|
|
122
|
+
continue;
|
|
123
|
+
records.push({
|
|
124
|
+
evidence_id: evidence.evidence_id,
|
|
125
|
+
subject: evidence.subject,
|
|
126
|
+
provider: evidence.provider,
|
|
127
|
+
operation: evidence.operation,
|
|
128
|
+
confidence: evidence.confidence,
|
|
129
|
+
authority: evidence.authority,
|
|
130
|
+
analysis_profile_digest: evidence.analysis_profile?.digest ?? null,
|
|
131
|
+
retention: "complete-record",
|
|
132
|
+
limitation_count: evidence.limitations.length,
|
|
133
|
+
native_dossier: native,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
kind: "evidence-bundle-summary",
|
|
138
|
+
filters: selectedFilters,
|
|
139
|
+
total_retained_records: bundle.records.length,
|
|
140
|
+
matching_records: records.length,
|
|
141
|
+
unknown_revisions: bundle.unknowns.length,
|
|
142
|
+
records,
|
|
143
|
+
};
|
|
144
|
+
};
|
|
@@ -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,4 +1,5 @@
|
|
|
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";
|
|
@@ -32,6 +33,6 @@ export const compareFunctions = (leftInput, rightInput) => {
|
|
|
32
33
|
]
|
|
33
34
|
: []),
|
|
34
35
|
]),
|
|
35
|
-
].sort((a, b) => a
|
|
36
|
+
].sort((a, b) => compareUnicodeCodePoints(a, b)),
|
|
36
37
|
});
|
|
37
38
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { canonicalJson } from "./comparisonSemantics.js";
|
|
2
|
-
import {
|
|
2
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
3
3
|
export const identityProjection = (snapshot) => ({
|
|
4
4
|
name: snapshot.dossier.procedure.name,
|
|
5
5
|
signature: snapshot.dossier.procedure.signature,
|
|
@@ -136,9 +136,10 @@ export const sorted = (values) => values
|
|
|
136
136
|
value,
|
|
137
137
|
json: canonicalJson(value, "Function normalization"),
|
|
138
138
|
}))
|
|
139
|
-
.sort((left, right) =>
|
|
139
|
+
.sort((left, right) => compareUnicodeCodePoints(left.json, right.json))
|
|
140
140
|
.map(({ value }) => value);
|
|
141
|
-
|
|
141
|
+
/** Recognize address-derived procedure names without excluding named FUN_ symbols. */
|
|
142
|
+
export const isAutoName = (name) => /^(?:sub_[0-9a-f]+|fcn\.[0-9a-f]+|FUN_[0-9a-f]+)$/iu.test(name);
|
|
142
143
|
const parseAddress = (value) => /^0x[0-9a-f]+$/iu.test(value) ? BigInt(value) : null;
|
|
143
144
|
const relativeAddress = (value, base) => {
|
|
144
145
|
const parsed = parseAddress(value);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { digestCanonicalValue } from "./canonicalDigest.js";
|
|
2
2
|
export const dimensionResult = (input) => {
|
|
3
3
|
const context = {
|
|
4
4
|
dimension: input.dimension,
|
|
@@ -51,4 +51,4 @@ export const summarize = (dimensions) => ({
|
|
|
51
51
|
changed: dimensions.filter(({ status }) => status === "changed").length,
|
|
52
52
|
unknown: dimensions.filter(({ status }) => status === "unknown").length,
|
|
53
53
|
});
|
|
54
|
-
const digest = (value) =>
|
|
54
|
+
const digest = (value) => digestCanonicalValue(value, "Function comparison");
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parseEvidence } from "./evidence.js";
|
|
2
|
+
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
|
|
2
3
|
import { functionDossierSchema } from "./hopperValues.js";
|
|
3
4
|
/** Parse one complete analyze_function Evidence record for comparison workflows. */
|
|
4
5
|
export const parseFunctionEvidence = (input) => {
|
|
@@ -14,6 +15,6 @@ export const parseFunctionEvidence = (input) => {
|
|
|
14
15
|
dossier,
|
|
15
16
|
limitations: [
|
|
16
17
|
...new Set([...evidence.limitations, ...dossier.limitations]),
|
|
17
|
-
].sort((left, right) => left
|
|
18
|
+
].sort((left, right) => compareUnicodeCodePoints(left, right)),
|
|
18
19
|
};
|
|
19
20
|
};
|
|
@@ -29,12 +29,12 @@ const procedureMapSchema = z.record(z.string(), z.string());
|
|
|
29
29
|
const addressedNamesSchema = z.array(z.object({ address: z.string(), name: z.string() }));
|
|
30
30
|
const addressedNameMapSchema = z.record(z.string(), z.string());
|
|
31
31
|
const segmentSchema = z.object({
|
|
32
|
-
name: z.string()
|
|
33
|
-
start: z.string()
|
|
34
|
-
end: z.string()
|
|
35
|
-
readable: z.boolean().nullable()
|
|
36
|
-
writable: z.boolean().nullable()
|
|
37
|
-
executable: z.boolean().nullable()
|
|
32
|
+
name: z.string(),
|
|
33
|
+
start: z.string(),
|
|
34
|
+
end: z.string(),
|
|
35
|
+
readable: z.boolean().nullable(),
|
|
36
|
+
writable: z.boolean().nullable(),
|
|
37
|
+
executable: z.boolean().nullable(),
|
|
38
38
|
});
|
|
39
39
|
const unavailableAnalysisFactSchema = z
|
|
40
40
|
.object({ available: z.literal(false), reason: z.string() })
|
|
@@ -142,10 +142,6 @@ export const functionBodySchema = z.discriminatedUnion("available", [
|
|
|
142
142
|
});
|
|
143
143
|
}),
|
|
144
144
|
]);
|
|
145
|
-
const unknownFunctionBody = () => functionBodySchema.default({
|
|
146
|
-
available: false,
|
|
147
|
-
reason: "The provider did not report complete function body ranges.",
|
|
148
|
-
});
|
|
149
145
|
/** Check the declared entry membership against complete, inclusive body ranges. */
|
|
150
146
|
export const functionBodyEntryAgrees = (body, address) => {
|
|
151
147
|
if (!body.available)
|
|
@@ -176,8 +172,8 @@ export const procedureIdentitySchema = z
|
|
|
176
172
|
.object({
|
|
177
173
|
address: z.string(),
|
|
178
174
|
name: z.string(),
|
|
179
|
-
classification: procedureClassificationSchema.nullable()
|
|
180
|
-
body:
|
|
175
|
+
classification: procedureClassificationSchema.nullable(),
|
|
176
|
+
body: functionBodySchema,
|
|
181
177
|
})
|
|
182
178
|
.strict()
|
|
183
179
|
.superRefine((identity, context) => {
|
|
@@ -289,9 +285,9 @@ export const functionDossierSchema = z
|
|
|
289
285
|
successors: z.array(z.string()),
|
|
290
286
|
})
|
|
291
287
|
.strict()),
|
|
292
|
-
native_api: nativeApiBoundarySchema.nullable()
|
|
293
|
-
native_value_flow: nativeValueFlowSchema.nullable()
|
|
294
|
-
limitations: z.array(z.string())
|
|
288
|
+
native_api: nativeApiBoundarySchema.nullable(),
|
|
289
|
+
native_value_flow: nativeValueFlowSchema.nullable(),
|
|
290
|
+
limitations: z.array(z.string()),
|
|
295
291
|
})
|
|
296
292
|
.strict();
|
|
297
293
|
/** Strictly parse a complete provider-neutral function dossier. */
|
|
@@ -6,8 +6,23 @@ export const projectInputIssues = (issues, input) => issues.flatMap((issue) => p
|
|
|
6
6
|
const projectIssue = (issue, input) => {
|
|
7
7
|
const path = issue.path.flatMap((part) => typeof part === "string" || typeof part === "number" ? [part] : []);
|
|
8
8
|
// Branch issue paths are relative to the union; branches often agree.
|
|
9
|
-
if (issue.code === "invalid_union")
|
|
9
|
+
if (issue.code === "invalid_union") {
|
|
10
|
+
// Unmatched discriminators and ambiguous unions have no branch issues.
|
|
11
|
+
// Keep their outer failure instead of flattening it into an empty list.
|
|
12
|
+
if (issue.errors.length === 0) {
|
|
13
|
+
const expected = "options" in issue ? issue.options?.filter(isSafeExpected) : undefined;
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
path,
|
|
17
|
+
reason: valueAtPath(input, path) === undefined
|
|
18
|
+
? "missing_argument"
|
|
19
|
+
: "invalid_value",
|
|
20
|
+
...(expected === undefined ? {} : { expected }),
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
}
|
|
10
24
|
return uniqueIssues(issue.errors.flatMap((branch) => branch.flatMap((branchIssue) => projectIssue({ ...branchIssue, path: [...issue.path, ...branchIssue.path] }, input))));
|
|
25
|
+
}
|
|
11
26
|
if (issue.code === "invalid_key")
|
|
12
27
|
return issue.issues.flatMap((keyIssue) => projectIssue({ ...keyIssue, path: [...issue.path, ...keyIssue.path] }, input));
|
|
13
28
|
if (issue.code === "unrecognized_keys")
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { isAbsolute } from "node:path";
|
|
3
|
+
import { localPathStringSchema } from "../localPath.js";
|
|
4
|
+
const pathInputSchema = localPathStringSchema.refine(isAbsolute, {
|
|
4
5
|
message: "Electron executable, application, and root paths must be absolute local filesystem paths (for example /Applications/Electron.app/Contents/MacOS/Electron)",
|
|
5
6
|
});
|
|
6
7
|
const absolutePathSchema = z
|
|
@@ -63,7 +64,7 @@ export const electronActiveObservationInputSchema = z.strictObject({
|
|
|
63
64
|
args: z
|
|
64
65
|
.array(z
|
|
65
66
|
.string()
|
|
66
|
-
.regex(/^[^\
|
|
67
|
+
.regex(/^[^\x00]*$/u, "Electron arguments must not contain NUL"))
|
|
67
68
|
.default([]),
|
|
68
69
|
actions: z.array(actionSchema).default([]),
|
|
69
70
|
});
|