rea-agents 5.0.0 → 6.1.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 +168 -655
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +173 -47
- package/bridge/hopper_bridge.py +310 -128
- package/bridge/mitmproxy/capture.py +208 -0
- package/bridge/native/rea_lldb_tracer.py +839 -0
- package/bridge/process/ProcessRunTokenReader.swift +297 -0
- package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
- package/bridge/pwndbg/core_context.py +101 -0
- package/bridge/pwndbg/launch.py +39 -0
- package/bridge/pwndbg/launch_impl.py +34 -0
- package/bridge/pwntools/decoder_runtime.py +59 -0
- package/bridge/pwntools/layout.py +39 -0
- package/bridge/pwntools/layout_impl.py +309 -0
- package/bridge/pwntools/recorded_crash.py +39 -0
- package/bridge/pwntools/recorded_crash_impl.py +147 -0
- package/dist/android/JadxConfiguration.js +196 -33
- package/dist/android/JadxMcpTransport.js +4 -0
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +20 -2
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +27 -3
- package/dist/application/ClientConfigurationDocument.js +871 -6
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +97 -33
- package/dist/application/Doctor.js +4 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +13 -11
- package/dist/application/EvidenceBundleFiles.js +24 -12
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +3 -2
- package/dist/application/JsonFiles.js +50 -28
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +5 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/Setup.js +13 -1
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +5 -2
- package/dist/application/SetupPlan.js +5 -3
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +4 -3
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateRuntime.js +46 -25
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCapturePort.js +1 -0
- package/dist/application/WebNetworkCaptureService.js +134 -0
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +2 -2
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WindowsCapabilities.js +1 -1
- package/dist/application/WorkflowEvidence.js +82 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
- package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
- package/dist/application/binary/BinarySession.js +131 -76
- package/dist/application/binary/BinarySessionOpen.js +19 -6
- package/dist/application/binary/BinarySessionRecords.js +45 -3
- package/dist/application/binary/BinarySessionStatus.js +17 -1
- package/dist/application/binary/CompositeProvider.js +13 -0
- package/dist/application/binary/LazyAnalysisProvider.js +3 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
- package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
- package/dist/application/evm/EvmInterfacePort.js +1 -0
- package/dist/application/evm/EvmInterfaceService.js +64 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
- package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
- package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
- package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +42 -5
- package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
- package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
- package/dist/artifacts/ZipArtifactReader.js +3 -0
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
- package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
- package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
- package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
- package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
- package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
- package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/artifacts/readStableArtifact.js +20 -4
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +165 -12
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +34 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/history/CaptureFailures.js +137 -0
- package/dist/browser/history/CaptureFormatError.js +10 -0
- package/dist/browser/history/CaptureRedaction.js +65 -0
- package/dist/browser/history/CaptureRelease.js +17 -0
- package/dist/browser/history/HarCapture.js +165 -0
- package/dist/browser/history/HarCaptureAdapter.js +20 -0
- package/dist/browser/history/HarCaptureProcess.js +57 -0
- package/dist/browser/history/HarJson.js +92 -0
- package/dist/browser/history/HarSchema.js +72 -0
- package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
- package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
- package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +26 -1
- package/dist/cli/binaryDiagnosticsCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +78 -20
- package/dist/cli/electronCommands.js +21 -13
- package/dist/cli/evmCommands.js +24 -0
- package/dist/cli/firmwareCommands.js +6 -3
- package/dist/cli/javascriptApplicationAnalysis.js +20 -3
- package/dist/cli/jsonOutput.js +38 -0
- package/dist/cli/nativeCallCommands.js +34 -0
- package/dist/cli/processCommands.js +1 -1
- package/dist/cli/streamedJsonOutput.js +56 -0
- package/dist/cli/utilityCommands.js +2 -0
- package/dist/cli/webNetworkCaptureCommands.js +40 -0
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +11 -4
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +6 -1
- package/dist/cliJsonInput.js +35 -1
- package/dist/cliOutput.js +21 -6
- package/dist/composition/binaryDiagnostics.js +8 -0
- package/dist/composition/evm.js +4 -0
- package/dist/composition/webNetworkCaptures.js +6 -0
- package/dist/config/environment.js +4 -0
- package/dist/config/ghidraStartupTimeout.js +17 -0
- package/dist/config/mcpResponseBudget.js +22 -0
- package/dist/config/parseConfig.js +2 -1
- package/dist/contracts/artifactToolContracts.js +6 -0
- package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
- package/dist/contracts/browserToolContracts.js +4 -3
- package/dist/contracts/enhancedInputs.js +5 -3
- package/dist/contracts/enhancedToolContracts.js +3 -3
- package/dist/contracts/errorSchemas.js +8 -1
- package/dist/contracts/evm/evmToolContracts.js +20 -0
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/investigationExamples.js +2 -2
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +8 -6
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
- package/dist/contracts/native/nativeToolContracts.js +21 -3
- package/dist/contracts/officialToolContracts.js +26 -24
- package/dist/contracts/process/processCaptureExample.js +2 -0
- package/dist/contracts/promptContracts.js +3 -3
- package/dist/contracts/sessionLifecycleInputs.js +18 -5
- package/dist/contracts/sessionStatusContract.js +8 -2
- package/dist/contracts/sessionToolContracts.js +8 -3
- package/dist/contracts/sessionToolSchemas.js +8 -4
- package/dist/contracts/toolContractExamples.js +1 -2
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +30 -1
- package/dist/contracts/toolOutputSchemaGroups.js +33 -28
- package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
- package/dist/contracts/toolSchemaMetadata.js +69 -10
- package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
- package/dist/domain/analysisErrorBase.js +22 -2
- package/dist/domain/analysisErrorCore.js +61 -5
- package/dist/domain/analysisErrorPresentation.js +95 -12
- package/dist/domain/analysisErrorProjection.js +148 -19
- package/dist/domain/analysisSnapshot.js +166 -2
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +17 -9
- package/dist/domain/apple/appleApplication.js +41 -14
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dyldPaths.js +81 -0
- package/dist/domain/apple/dylibResolution.js +478 -0
- package/dist/domain/apple/dylibResolutionFindings.js +77 -0
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +9 -1
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +19 -24
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserObservation.js +1 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +13 -0
- package/dist/domain/browserScenarioValues.js +5 -2
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPathSchemas.js +1 -1
- package/dist/domain/canonicalDigest.js +13 -1
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/comparisonStatus.js +2 -30
- package/dist/domain/configurationErrors.js +1 -1
- package/dist/domain/conformanceTrustGate.js +0 -16
- package/dist/domain/evidence.js +78 -11
- package/dist/domain/evidenceBundle.js +42 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/evm/evmInterface.js +63 -0
- package/dist/domain/explicitSensitiveFailure.js +108 -0
- package/dist/domain/explicitSensitiveValues.js +10 -0
- package/dist/domain/firmware/firmwareAnalysis.js +10 -4
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +37 -6
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
- package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +91 -3
- package/dist/domain/localPath.js +8 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -9
- package/dist/domain/native/binaryLayout.js +357 -0
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeCallObservation.js +186 -0
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/objcSwiftMetadata.js +0 -39
- package/dist/domain/native/recordedCrash.js +266 -0
- package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
- package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
- package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
- package/dist/domain/process/processCaptureParsing.js +54 -0
- package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
- package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
- package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
- package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
- package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +1 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/providerSelectionError.js +4 -2
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +3 -3
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +9 -46
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +1 -0
- package/dist/domain/webNetworkCapture.js +118 -0
- package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
- package/dist/domain/webRuntime.js +19 -5
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
- package/dist/dotnet/ManagedMemberInspector.js +4 -2
- package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
- package/dist/dotnet/ManagedMemberRows.js +14 -3
- package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
- package/dist/dotnet/ManagedMetadataInventory.js +38 -28
- package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
- package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
- package/dist/dotnet/ManagedPeReader.js +11 -0
- package/dist/evm/EvmBytecodeCarrier.js +21 -0
- package/dist/evm/EvmWorkerLimits.js +40 -0
- package/dist/evm/EvmoleFailures.js +126 -0
- package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
- package/dist/evm/EvmoleInterfaceProvider.js +273 -0
- package/dist/evm/EvmoleInterfaceWorker.js +87 -0
- package/dist/evm/EvmoleRelease.js +16 -0
- package/dist/firmware/FirmwareCommand.js +1 -0
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
- package/dist/ghidra/GhidraClient.js +47 -14
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraFunctionValues.js +10 -7
- package/dist/ghidra/GhidraInstallation.js +18 -21
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +62 -0
- package/dist/ghidra/GhidraLauncher.js +34 -16
- package/dist/ghidra/GhidraProvider.js +2 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
- package/dist/ghidra/GhidraProviderClient.js +23 -12
- package/dist/ghidra/GhidraSessionError.js +11 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/hopper/BridgeLauncher.js +33 -11
- package/dist/hopper/HopperAnalysisProfile.js +62 -4
- package/dist/hopper/HopperCleanup.js +15 -3
- package/dist/hopper/HopperClient.js +222 -14
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +196 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +63 -9
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +137 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +3 -2
- package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
- package/dist/inspector/V8InspectorProvider.js +47 -11
- package/dist/javascript/recovery/WakaruCommand.js +3 -0
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +32 -16
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +82 -84
- package/dist/native/LldbCallTracer.js +541 -0
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +194 -0
- package/dist/native/NativeMacOSProvider.js +117 -20
- package/dist/native/NativeMacOSProviderMetadata.js +8 -3
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
- package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
- package/dist/native/pwntools/PwntoolsFailures.js +180 -0
- package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
- package/dist/native/pwntools/PwntoolsRelease.js +19 -0
- package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
- package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
- package/dist/process/DarwinProcessRunTokenReader.js +293 -0
- package/dist/process/ExecFileOutput.js +20 -0
- package/dist/process/OwnedCommand.js +118 -0
- package/dist/process/ProcessOwnership.js +431 -51
- package/dist/process/ProcessOwnershipObservation.js +209 -27
- package/dist/process/ProviderProcess.js +68 -10
- package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
- package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
- package/dist/{application → process/capture}/ProcessHarness.js +195 -29
- package/dist/{application → process/capture}/ProcessSampling.js +2 -2
- package/dist/server/EvidenceMcpServer.js +146 -0
- package/dist/server/createServer.js +37 -8
- package/dist/server/promptCompletion.js +10 -3
- package/dist/server/registerAndroidTools.js +2 -4
- package/dist/server/registerApplicationTools/helpers.js +2 -4
- package/dist/server/registerArtifactComparisonTool.js +11 -7
- package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
- package/dist/server/registerBrowserScenarioTool.js +2 -4
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerBundleComparisonTool.js +2 -3
- package/dist/server/registerCloseLifecycleTool.js +8 -18
- package/dist/server/registerElectronTools.js +2 -4
- package/dist/server/registerEnhancedTools.js +18 -59
- package/dist/server/registerEvidenceTools.js +3 -5
- package/dist/server/registerEvmTools.js +15 -0
- package/dist/server/registerFirmwareTools.js +2 -4
- package/dist/server/registerFunctionComparisonTool.js +10 -6
- package/dist/server/registerInvestigationTools.js +7 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
- package/dist/server/registerOfficialTools.js +2 -4
- package/dist/server/registerProcessComparisonTool.js +72 -46
- package/dist/server/registerRecordedCrashTools.js +15 -0
- package/dist/server/registerSessionRecordTools.js +5 -6
- package/dist/server/registerSessionStatusTool.js +17 -3
- package/dist/server/registerSessionTools.js +13 -5
- package/dist/server/registerWebModuleTool.js +2 -4
- package/dist/server/registerWebNetworkCaptureTool.js +26 -0
- package/dist/server/registerWebRuntimeTools.js +3 -7
- package/dist/server/registerWebScriptTool.js +2 -4
- package/dist/server/registerWebSourceLocationTool.js +2 -4
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +3 -1
- package/dist/server/sessionToolPolicies.js +1 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +63 -11
- package/dist/server/toolResultEncoding.js +33 -0
- package/install.sh +1 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -9
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +11 -3
- package/skills/reverse-engineer-anything/SKILL.md +32 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
- package/third_party/README.md +60 -0
- package/third_party/evmole/LICENSE +21 -0
- package/third_party/evmole/README.md +22 -0
- package/third_party/pwndbg/LICENSE.md +21 -0
- package/third_party/pwndbg/README.md +23 -0
- package/third_party/pwntools/README.md +40 -0
- package/dist/application/AuthorizedArtifactInventory.js +0 -7
- package/dist/application/ProcessCaptureLifecycle.js +0 -299
- package/dist/application/StoreFileLock.js +0 -124
- package/dist/contracts/processCaptureExample.js +0 -2
- package/dist/domain/bytecodeProvider.js +0 -178
- package/dist/domain/customProtocolCapture.js +0 -137
- package/dist/domain/eventProcessTree.js +0 -225
- package/dist/domain/mobileApplicationInvestigation.js +0 -159
- package/dist/domain/packageAnalysis.js +0 -123
- package/dist/domain/peInspection.js +0 -197
- package/dist/domain/processCaptureParsing.js +0 -21
- package/dist/domain/protocolCapture.js +0 -217
- package/dist/domain/runtimeIdentification.js +0 -212
- package/dist/generatedMcpToolCatalog.js +0 -37
- package/dist/ghidra/GhidraDefaults.js +0 -2
- /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
- /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
- /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
- /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
- /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
- /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
- /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
- /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
- /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
- /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
- /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
|
@@ -1,18 +1,124 @@
|
|
|
1
1
|
import { compareCodePoints } from "../../domain/canonicalOrdering.js";
|
|
2
2
|
import { JAVASCRIPT_SEMANTIC_RELATION_FAMILIES } from "../../domain/javascript/javascriptSemanticGraphSchemas.js";
|
|
3
|
-
/**
|
|
4
|
-
export const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
/** Index one immutable file IR; read retained callable membership at query time. */
|
|
4
|
+
export const createSemanticCallableOwnerLookup = (ir, nodes) => {
|
|
5
|
+
const entries = ir.callables
|
|
6
|
+
.map((callable, order) => ({
|
|
7
|
+
callableId: callable.callableId,
|
|
8
|
+
range: callable.location,
|
|
9
|
+
order,
|
|
10
|
+
priority: positionKey(callable.location),
|
|
11
|
+
}))
|
|
12
|
+
.sort((left, right) => pointCompare(left.range.start, right.range.start) ||
|
|
13
|
+
left.order - right.order);
|
|
14
|
+
const tree = buildSourceIntervalTree(entries, 0, entries.length);
|
|
15
|
+
return (location) => {
|
|
16
|
+
if (location === null || tree === null || nodes.size === 0)
|
|
17
|
+
return undefined;
|
|
18
|
+
const pending = [tree];
|
|
19
|
+
let best;
|
|
20
|
+
let result;
|
|
21
|
+
while (pending.length > 0) {
|
|
22
|
+
const current = pending.pop();
|
|
23
|
+
if (current === undefined ||
|
|
24
|
+
pointCompare(current.minimumStart, location.start) > 0 ||
|
|
25
|
+
pointCompare(current.maximumEnd, location.end) < 0)
|
|
26
|
+
continue;
|
|
27
|
+
const candidate = current.entry;
|
|
28
|
+
if (contains(candidate.range, location)) {
|
|
29
|
+
const node = nodes.get(candidate.callableId);
|
|
30
|
+
const rank = best === undefined
|
|
31
|
+
? 1
|
|
32
|
+
: compareCodePoints(candidate.priority, best.priority) ||
|
|
33
|
+
best.order - candidate.order;
|
|
34
|
+
if (node !== undefined && rank > 0) {
|
|
35
|
+
best = candidate;
|
|
36
|
+
result = node;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (current.left !== null)
|
|
40
|
+
pending.push(current.left);
|
|
41
|
+
if (current.right !== null)
|
|
42
|
+
pending.push(current.right);
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
12
46
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
47
|
+
const buildSourceIntervalTree = (entries, start, end) => {
|
|
48
|
+
if (start >= end)
|
|
49
|
+
return null;
|
|
50
|
+
const middle = Math.floor((start + end) / 2);
|
|
51
|
+
const entry = entries[middle];
|
|
52
|
+
if (entry === undefined)
|
|
53
|
+
return null;
|
|
54
|
+
// This recursion follows a balanced index, not the producer's nesting depth.
|
|
55
|
+
const left = buildSourceIntervalTree(entries, start, middle);
|
|
56
|
+
const right = buildSourceIntervalTree(entries, middle + 1, end);
|
|
57
|
+
let minimumEnd = entry.range.end;
|
|
58
|
+
let maximumEnd = entry.range.end;
|
|
59
|
+
for (const child of [left, right]) {
|
|
60
|
+
if (child !== null && pointCompare(child.minimumEnd, minimumEnd) < 0)
|
|
61
|
+
minimumEnd = child.minimumEnd;
|
|
62
|
+
if (child !== null && pointCompare(child.maximumEnd, maximumEnd) > 0)
|
|
63
|
+
maximumEnd = child.maximumEnd;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
entry,
|
|
67
|
+
minimumStart: left?.minimumStart ?? entry.range.start,
|
|
68
|
+
maximumStart: right?.maximumStart ?? entry.range.start,
|
|
69
|
+
minimumEnd,
|
|
70
|
+
maximumEnd,
|
|
71
|
+
left,
|
|
72
|
+
right,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
/** Index an immutable node list; return contained ranges in producer order. */
|
|
76
|
+
export const createSemanticNodeRangeLookup = (nodes) => {
|
|
77
|
+
const entries = nodes
|
|
78
|
+
.flatMap((node, order) => {
|
|
79
|
+
const range = node.identity.source_range;
|
|
80
|
+
return range === null ? [] : [{ node, range, order }];
|
|
81
|
+
})
|
|
82
|
+
.sort((left, right) => pointCompare(left.range.start, right.range.start) ||
|
|
83
|
+
left.order - right.order);
|
|
84
|
+
const tree = buildSourceIntervalTree(entries, 0, entries.length);
|
|
85
|
+
return (range) => {
|
|
86
|
+
if (tree === null)
|
|
87
|
+
return [];
|
|
88
|
+
const pending = [tree];
|
|
89
|
+
const matches = [];
|
|
90
|
+
while (pending.length > 0) {
|
|
91
|
+
const current = pending.pop();
|
|
92
|
+
if (current === undefined ||
|
|
93
|
+
pointCompare(current.maximumStart, range.start) < 0 ||
|
|
94
|
+
pointCompare(current.minimumEnd, range.end) > 0)
|
|
95
|
+
continue;
|
|
96
|
+
if (contains(range, current.entry.range))
|
|
97
|
+
matches.push(current.entry);
|
|
98
|
+
if (current.left !== null)
|
|
99
|
+
pending.push(current.left);
|
|
100
|
+
if (current.right !== null)
|
|
101
|
+
pending.push(current.right);
|
|
102
|
+
}
|
|
103
|
+
return matches
|
|
104
|
+
.sort((left, right) => left.order - right.order)
|
|
105
|
+
.map(({ node }) => node);
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
/** Index exact call ranges, preserving the first producer occurrence. */
|
|
109
|
+
export const createSemanticCallSiteLookup = (ir, nodes) => {
|
|
110
|
+
const identifiers = new Map();
|
|
111
|
+
for (const call of ir.callSites) {
|
|
112
|
+
const key = rangeKey(call.location);
|
|
113
|
+
if (!identifiers.has(key))
|
|
114
|
+
identifiers.set(key, call.callSiteId);
|
|
115
|
+
}
|
|
116
|
+
return (range) => {
|
|
117
|
+
const identifier = identifiers.get(rangeKey(range));
|
|
118
|
+
return identifier === undefined ? undefined : nodes.get(identifier);
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
const rangeKey = (range) => `${range.start.line}:${range.start.column}-${range.end.line}:${range.end.column}`;
|
|
16
122
|
/** Report extractor support without treating missing families as absence. */
|
|
17
123
|
export const semanticFamilyStatus = (family, analysis) => {
|
|
18
124
|
if (![
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
|
|
2
|
-
import {
|
|
2
|
+
import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
|
|
3
3
|
import { unknownSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
|
|
4
4
|
import { semanticCallSiteAt, } from "./JavaScriptSemanticGraphFlowProjection.js";
|
|
5
5
|
/** Project built-in resource acquisition and exact local release handles. */
|
|
@@ -21,7 +21,7 @@ export const projectSemanticResources = (context) => {
|
|
|
21
21
|
else
|
|
22
22
|
projectRelease(context, operation, resourceNodes);
|
|
23
23
|
};
|
|
24
|
-
const addResourceNode = (context, operation) =>
|
|
24
|
+
const addResourceNode = (context, operation) => retainSemanticGraphNode(context.state, context.file, {
|
|
25
25
|
kind: "resource",
|
|
26
26
|
roleKey: operation.resourceId,
|
|
27
27
|
location: operation.location,
|
|
@@ -31,7 +31,7 @@ const addResourceNode = (context, operation) => addSemanticGraphNode(context.sta
|
|
|
31
31
|
: (context.callableNodes.get(operation.ownerCallableId)?.node_id ??
|
|
32
32
|
null),
|
|
33
33
|
properties: { method: operation.method },
|
|
34
|
-
}
|
|
34
|
+
});
|
|
35
35
|
const projectRelease = (context, operation, resourceNodes) => {
|
|
36
36
|
const callSite = semanticCallSiteAt(context, operation.location);
|
|
37
37
|
const resources = operation.linkedResourceIds.flatMap((identifier) => {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createJavaScriptSemanticGraphUnknown } from "../../domain/javascript/javascriptSemanticGraph.js";
|
|
2
|
+
import { retainSemanticGraphNode, addSemanticGraphRelation, addSemanticGraphUnknown, } from "./JavaScriptSemanticGraphConstruction.js";
|
|
3
|
+
import { observedSemanticEvidence } from "./JavaScriptSemanticGraphEvidence.js";
|
|
2
4
|
/** Project bounded literal values and object slots for exact query seeds. */
|
|
3
5
|
export const projectSemanticValues = (context) => {
|
|
4
6
|
for (const binding of context.ir.bindings) {
|
|
@@ -54,17 +56,37 @@ const projectValue = (input) => {
|
|
|
54
56
|
role: `property:${property.name}`,
|
|
55
57
|
});
|
|
56
58
|
}
|
|
59
|
+
else if (value.status === "unknown" && value.resourceLimit !== undefined) {
|
|
60
|
+
const location = binding.definitions[0]?.location ?? null;
|
|
61
|
+
const evidence = observedSemanticEvidence(context.file, location);
|
|
62
|
+
const isPropertyValue = role.startsWith("property:");
|
|
63
|
+
addSemanticGraphUnknown(context.state, createJavaScriptSemanticGraphUnknown({
|
|
64
|
+
node_id: target.node_id,
|
|
65
|
+
family: isPropertyValue ? "object-flow" : "data-flow",
|
|
66
|
+
relation_kinds: [isPropertyValue ? "writes-property" : "defines"],
|
|
67
|
+
reason: "resource-limit",
|
|
68
|
+
detail: `${value.reason} Unknown value at ${role}.`,
|
|
69
|
+
candidate_node_ids: [target.node_id],
|
|
70
|
+
evidence: {
|
|
71
|
+
...evidence,
|
|
72
|
+
authority: "unknown",
|
|
73
|
+
state: "unknown",
|
|
74
|
+
confidence: "unknown",
|
|
75
|
+
limitations: [value.reason],
|
|
76
|
+
},
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
57
79
|
};
|
|
58
|
-
const addLiteralNode = (context, binding, value, role) =>
|
|
80
|
+
const addLiteralNode = (context, binding, value, role) => retainSemanticGraphNode(context.state, context.file, {
|
|
59
81
|
kind: "literal",
|
|
60
82
|
roleKey: `literal:${binding.bindingId}:${role}:${JSON.stringify(value)}`,
|
|
61
83
|
location: binding.definitions[0]?.location ?? null,
|
|
62
84
|
label: JSON.stringify(value),
|
|
63
85
|
functionNodeId: context.bindingNodes.get(binding.bindingId)?.function_node_id ?? null,
|
|
64
86
|
properties: { value },
|
|
65
|
-
}
|
|
87
|
+
});
|
|
66
88
|
/** Create one canonical property slot for a binding/property identity. */
|
|
67
|
-
export const semanticPropertySlot = (context, objectBindingId, name) =>
|
|
89
|
+
export const semanticPropertySlot = (context, objectBindingId, name) => retainSemanticGraphNode(context.state, context.file, {
|
|
68
90
|
kind: "property-slot",
|
|
69
91
|
roleKey: `property:${objectBindingId}:${name}`,
|
|
70
92
|
location: null,
|
|
@@ -74,4 +96,4 @@ export const semanticPropertySlot = (context, objectBindingId, name) => addSeman
|
|
|
74
96
|
name,
|
|
75
97
|
object_binding_id: objectBindingId,
|
|
76
98
|
},
|
|
77
|
-
}
|
|
99
|
+
});
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
4
|
import { createEvidence } from "../../domain/evidence.js";
|
|
5
5
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
6
6
|
import { managedApplicationGraphResultSchema, projectManagedApplicationGraph, projectManagedApplicationGraphInputSchema, } from "../../domain/managed/managedApplicationGraph.js";
|
|
7
7
|
import { err, ok } from "../../domain/result.js";
|
|
8
8
|
import { MANAGED_WORKFLOW_PROVIDER } from "../InvestigationProviders.js";
|
|
9
|
+
import { requestInputError, workflowInputError, } from "../workflowInputError.js";
|
|
9
10
|
const OPERATION = "project_managed_application_graph";
|
|
10
11
|
/** Project authenticated managed Evidence into a provider-neutral graph. */
|
|
11
12
|
export const projectManagedApplicationGraphEvidence = (rawInput) => {
|
|
12
13
|
const parsed = projectManagedApplicationGraphInputSchema.safeParse(rawInput);
|
|
13
14
|
if (!parsed.success)
|
|
14
|
-
return err(
|
|
15
|
+
return err(requestInputError(OPERATION, parsed.error, rawInput));
|
|
15
16
|
try {
|
|
16
17
|
const result = projectManagedApplicationGraph(parsed.data);
|
|
17
18
|
return ok(createManagedApplicationGraphEvidence(parsed.data, result));
|
|
18
19
|
}
|
|
19
20
|
catch (cause) {
|
|
20
21
|
return err(cause instanceof TypeError || cause instanceof z.ZodError
|
|
21
|
-
?
|
|
22
|
+
? workflowInputError(OPERATION, cause)
|
|
22
23
|
: new AnalysisProtocolError("Managed application graph projection produced an invalid result", { cause }));
|
|
23
24
|
}
|
|
24
25
|
};
|
|
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { compareManagedMembers, managedMemberComparisonResultSchema, parseManagedMemberEvidence, } from "../../domain/managed/managedMemberComparison.js";
|
|
5
|
-
import {
|
|
5
|
+
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
|
|
6
6
|
import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
|
|
7
7
|
import {} from "../../domain/analysisErrorBase.js";
|
|
8
8
|
import { createEvidence } from "../../domain/evidence.js";
|
|
@@ -11,6 +11,7 @@ import { parseBinaryTarget } from "../BinaryTargetResolver.js";
|
|
|
11
11
|
import { err, ok } from "../../domain/result.js";
|
|
12
12
|
import { inspectManagedMembersBytes } from "../../dotnet/ManagedMemberInspector.js";
|
|
13
13
|
import { MANAGED_STATIC_PROVIDER, MANAGED_WORKFLOW_PROVIDER, } from "../InvestigationProviders.js";
|
|
14
|
+
import { workflowInputError } from "../workflowInputError.js";
|
|
14
15
|
/** Compare managed members from input parsed by a trusted adapter. */
|
|
15
16
|
export const compareManagedMembersEvidenceValidated = (input) => {
|
|
16
17
|
const operation = "compare_managed_members";
|
|
@@ -36,10 +37,12 @@ export const compareManagedMemberPaths = async (input, dependencies = DEFAULT_PA
|
|
|
36
37
|
dependencies.resolveTarget(input.leftPath),
|
|
37
38
|
dependencies.resolveTarget(input.rightPath),
|
|
38
39
|
]);
|
|
40
|
+
// Report an unopenable path like every other path-based command does,
|
|
41
|
+
// with the failed path and constraint, rather than a bare input error.
|
|
39
42
|
if (!leftTarget.ok)
|
|
40
|
-
return err(
|
|
43
|
+
return err(leftTarget.error);
|
|
41
44
|
if (!rightTarget.ok)
|
|
42
|
-
return err(
|
|
45
|
+
return err(rightTarget.error);
|
|
43
46
|
const [leftBytes, rightBytes] = await Promise.all([
|
|
44
47
|
dependencies.readBytes(leftTarget.value.path),
|
|
45
48
|
dependencies.readBytes(rightTarget.value.path),
|
|
@@ -103,5 +106,5 @@ const createManagedMemberComparisonEvidence = (parameters, result) => createEvid
|
|
|
103
106
|
evidenceLinks: result.evidence_links,
|
|
104
107
|
});
|
|
105
108
|
const workflowFailure = (operation, cause) => err(cause instanceof z.ZodError || cause instanceof TypeError
|
|
106
|
-
?
|
|
109
|
+
? workflowInputError(operation, cause)
|
|
107
110
|
: new AnalysisProtocolError("Managed member comparison produced an invalid result", { cause }));
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
4
|
import { createEvidence } from "../../domain/evidence.js";
|
|
5
5
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
6
6
|
import { managedNativeVerificationInputSchema, verifyManagedNativeBoundaries, } from "../../domain/managed/managedNativeVerification.js";
|
|
7
7
|
import { err, ok } from "../../domain/result.js";
|
|
8
8
|
import { MANAGED_WORKFLOW_PROVIDER } from "../InvestigationProviders.js";
|
|
9
|
+
import { requestInputError, workflowInputError, } from "../workflowInputError.js";
|
|
9
10
|
const OPERATION = "verify_managed_native_boundaries";
|
|
10
11
|
/** Verify managed/native boundary declarations against native Evidence. */
|
|
11
12
|
export const verifyManagedNativeBoundariesEvidence = (rawInput) => {
|
|
12
13
|
const parsed = managedNativeVerificationInputSchema.safeParse(rawInput);
|
|
13
14
|
if (!parsed.success)
|
|
14
|
-
return err(
|
|
15
|
+
return err(requestInputError(OPERATION, parsed.error, rawInput));
|
|
15
16
|
try {
|
|
16
17
|
const result = verifyManagedNativeBoundaries(parsed.data);
|
|
17
18
|
return ok(createManagedNativeVerificationEvidence(parsed.data, result));
|
|
18
19
|
}
|
|
19
20
|
catch (cause) {
|
|
20
21
|
return err(cause instanceof TypeError || cause instanceof z.ZodError
|
|
21
|
-
?
|
|
22
|
+
? workflowInputError(OPERATION, cause)
|
|
22
23
|
: new AnalysisProtocolError("Managed/native verification produced an invalid result", { cause }));
|
|
23
24
|
}
|
|
24
25
|
};
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { AnalysisProtocolError } from "../../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
4
|
import { createEvidence } from "../../domain/evidence.js";
|
|
5
5
|
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
6
6
|
import { importManagedReconstruction, managedReconstructionImportInputSchema, } from "../../domain/managed/managedReconstruction.js";
|
|
7
7
|
import { err, ok } from "../../domain/result.js";
|
|
8
8
|
import { MANAGED_WORKFLOW_PROVIDER } from "../InvestigationProviders.js";
|
|
9
|
+
import { requestInputError, workflowInputError, } from "../workflowInputError.js";
|
|
9
10
|
const OPERATION = "import_managed_reconstruction";
|
|
10
11
|
/** Authenticate and import managed decompiler reconstruction as Evidence. */
|
|
11
12
|
export const importManagedReconstructionEvidence = (rawInput) => {
|
|
12
13
|
const parsed = managedReconstructionImportInputSchema.safeParse(rawInput);
|
|
13
14
|
if (!parsed.success)
|
|
14
|
-
return err(
|
|
15
|
+
return err(requestInputError(OPERATION, parsed.error, rawInput));
|
|
15
16
|
return importManagedReconstructionEvidenceValidated(parsed.data);
|
|
16
17
|
};
|
|
17
18
|
/** Import reconstruction from input parsed by a trusted adapter. */
|
|
@@ -22,7 +23,7 @@ export const importManagedReconstructionEvidenceValidated = (input) => {
|
|
|
22
23
|
}
|
|
23
24
|
catch (cause) {
|
|
24
25
|
return err(cause instanceof TypeError || cause instanceof z.ZodError
|
|
25
|
-
?
|
|
26
|
+
? workflowInputError(OPERATION, cause)
|
|
26
27
|
: new AnalysisProtocolError("Managed reconstruction import produced an invalid result", { cause }));
|
|
27
28
|
}
|
|
28
29
|
};
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { AnalysisError } from "../../domain/analysisErrorBase.js";
|
|
4
|
+
import { AnalysisInputError } from "../../domain/analysisErrorCore.js";
|
|
5
|
+
import { projectAnalysisError } from "../../domain/analysisErrorProjection.js";
|
|
6
|
+
import { createEvidence, parseEvidence } from "../../domain/evidence.js";
|
|
7
|
+
import { describeValidationFailure } from "../../domain/evidenceBundle.js";
|
|
8
|
+
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
9
|
+
import { analysisInputErrorFromIssues, projectInputIssues, } from "../../domain/inputIssueProjection.js";
|
|
10
|
+
import { processTraceSpecificationSchema } from "../../domain/process/processTraceComparison.js";
|
|
11
|
+
import { processScenarioSchema } from "../../domain/process/processScenario.js";
|
|
12
|
+
import { compareProcessCaptures, parseProcessCapture, } from "../../domain/process/processCapture.js";
|
|
13
|
+
import { captureProcessScenario } from "../../process/capture/ProcessHarness.js";
|
|
12
14
|
import { PROCESS_PROVIDER, createProcessCaptureEvidence, } from "./ProcessEvidence.js";
|
|
13
15
|
/** Identify the process workflow's typed diagnostic result for CLI exit status. */
|
|
14
16
|
export const isProcessCliFailure = (value) => typeof value === "object" &&
|
|
@@ -25,7 +27,7 @@ export const captureProcessScenarioFile = async (path, environment = process.env
|
|
|
25
27
|
const input = await readJson(path);
|
|
26
28
|
const parsed = processScenarioSchema.safeParse(input);
|
|
27
29
|
if (!parsed.success)
|
|
28
|
-
throw
|
|
30
|
+
throw analysisInputErrorFromIssues("capture_process_scenario", parsed.error.issues, input, { cause: parsed.error });
|
|
29
31
|
const captured = await captureProcessScenario(parsed.data, undefined, process.platform, environment);
|
|
30
32
|
if (!captured.ok)
|
|
31
33
|
return cliAnalysisError(captured.error);
|
|
@@ -78,7 +80,9 @@ const parseCaptureEvidence = (input) => {
|
|
|
78
80
|
evidence = parseEvidence(input);
|
|
79
81
|
}
|
|
80
82
|
catch (cause) {
|
|
81
|
-
|
|
83
|
+
if (cause instanceof z.ZodError)
|
|
84
|
+
throw new AnalysisInputError("compare_process_captures", { cause }, projectInputIssues(cause.issues, input));
|
|
85
|
+
throw invalidCaptureEvidence(cause);
|
|
82
86
|
}
|
|
83
87
|
if (evidence.operation !== "capture_process_scenario" ||
|
|
84
88
|
evidence.predicate_type !== "rea.process-capture" ||
|
|
@@ -94,16 +98,20 @@ const parseCaptureEvidence = (input) => {
|
|
|
94
98
|
};
|
|
95
99
|
}
|
|
96
100
|
catch (cause) {
|
|
97
|
-
throw invalidCaptureEvidence();
|
|
101
|
+
throw invalidCaptureEvidence(cause);
|
|
98
102
|
}
|
|
99
103
|
};
|
|
100
104
|
const parseTraceSpecification = (input) => {
|
|
101
105
|
const parsed = processTraceSpecificationSchema.safeParse(input);
|
|
102
106
|
if (parsed.success)
|
|
103
107
|
return parsed.data;
|
|
104
|
-
|
|
108
|
+
// Match the MCP boundary: the operation name and a trace_spec-rooted path.
|
|
109
|
+
throw new AnalysisInputError("compare_process_captures", { cause: parsed.error }, projectInputIssues(parsed.error.issues, input).map((issue) => ({
|
|
110
|
+
...issue,
|
|
111
|
+
path: ["trace_spec", ...issue.path],
|
|
112
|
+
})));
|
|
105
113
|
};
|
|
106
|
-
const invalidCaptureEvidence = () => new ProcessCliFailure("invalid_input",
|
|
114
|
+
const invalidCaptureEvidence = (cause) => new ProcessCliFailure("invalid_input", `Capture evidence is malformed (${describeValidationFailure(cause)}). Create new capture evidence, then try again.`);
|
|
107
115
|
const readJson = async (path) => {
|
|
108
116
|
let bytes;
|
|
109
117
|
try {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { posix, win32 } from "node:path";
|
|
2
|
+
import { createEvidence } from "../../domain/evidence.js";
|
|
3
|
+
import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
|
|
4
|
+
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
5
|
+
export { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
|
|
5
6
|
/** Project one process scenario into secret-free Evidence parameters. */
|
|
6
|
-
const processEvidenceParameters = (scenario) => ({
|
|
7
|
-
executable_name:
|
|
7
|
+
const processEvidenceParameters = (scenario, platform) => ({
|
|
8
|
+
executable_name: (platform === "win32" ? win32 : posix).basename(scenario.executable),
|
|
8
9
|
argument_count: scenario.arguments.length,
|
|
9
10
|
event_count: scenario.events.length,
|
|
10
11
|
filesystem_observation_path_count: scenario.filesystem_observation_paths.length,
|
|
@@ -15,7 +16,7 @@ export const createProcessCaptureEvidence = (scenario, capture) => {
|
|
|
15
16
|
return createEvidence(undefined, PROCESS_PROVIDER, {
|
|
16
17
|
predicateType: "rea.process-capture",
|
|
17
18
|
operation: "capture_process_scenario",
|
|
18
|
-
parameters: processEvidenceParameters(scenario),
|
|
19
|
+
parameters: processEvidenceParameters(scenario, capture.manifest.platform),
|
|
19
20
|
result: jsonValueSchema.parse(capture),
|
|
20
21
|
confidence: "observed",
|
|
21
22
|
authority: "controlled-replay",
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AnalysisInputError } from "../domain/analysisErrorCore.js";
|
|
3
|
+
import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
|
|
4
|
+
/** Project schema issues of the raw request onto their request paths. */
|
|
5
|
+
export const requestInputError = (operation, cause, input) => analysisInputErrorFromIssues(operation, cause.issues, input, { cause });
|
|
6
|
+
/**
|
|
7
|
+
* Keep the failed constraint when a parsed request is rejected later. Nested
|
|
8
|
+
* values such as Evidence results are parsed on their own, so their issue
|
|
9
|
+
* paths are relative to that value and are reported in the message, not as
|
|
10
|
+
* request paths.
|
|
11
|
+
*/
|
|
12
|
+
export const workflowInputError = (operation, cause) => new AnalysisInputError(operation, { cause }, cause instanceof z.ZodError
|
|
13
|
+
? cause.issues.map((issue) => ({
|
|
14
|
+
path: [],
|
|
15
|
+
reason: "invalid_value",
|
|
16
|
+
message: `A nested value failed validation at ${issue.path.length === 0 ? "its root" : issue.path.map(String).join(".")}: ${issue.message}`,
|
|
17
|
+
}))
|
|
18
|
+
: [{ path: [], reason: "invalid_value", message: cause.message }]);
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
2
2
|
import { inspectBundleKeyedArchive } from "./apple/KeyedArchiveReader.js";
|
|
3
|
+
import { traceDylibResolution } from "./apple/DylibResolutionReader.js";
|
|
3
4
|
import { basename, dirname } from "node:path";
|
|
4
|
-
import { inventoryArtifact } from "
|
|
5
|
-
import { extractArtifact } from "
|
|
5
|
+
import { inventoryArtifact } from "./inventory/ArtifactInventory.js";
|
|
6
|
+
import { extractArtifact } from "./extraction/ArtifactExtraction.js";
|
|
6
7
|
import { analyzeInterfaceBuilderBundle } from "./apple/InterfaceBuilderAnalysis.js";
|
|
7
8
|
import { analyzeAppleAssetCatalogs } from "./apple/AppleAssetCatalogAnalysis.js";
|
|
8
9
|
import { ARTIFACT_ANALYSIS_OPERATIONS, artifactInventoryInputSchema, artifactExtractionExecutionSchema, } from "../contracts/artifactToolContracts.js";
|
|
9
|
-
import { AnalysisCapabilityUnavailableError } from "../domain/analysisErrorCore.js";
|
|
10
|
+
import { AnalysisCapabilityUnavailableError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
|
|
10
11
|
import { ArtifactOperationError } from "../domain/artifactOperationError.js";
|
|
11
12
|
import {} from "../domain/analysisErrorBase.js";
|
|
12
13
|
import { interfaceBuilderLimitsSchema } from "../domain/apple/interfaceBuilderGraph.js";
|
|
@@ -15,7 +16,7 @@ import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
|
15
16
|
import { ARTIFACT_PROVIDER_IDENTITY as IDENTITY, artifactCapabilities, } from "./ArtifactProviderMetadata.js";
|
|
16
17
|
import { createEvidence } from "../domain/evidence.js";
|
|
17
18
|
import { createArtifactInspection } from "../domain/artifactInspection.js";
|
|
18
|
-
import { resolveArtifactIntegrityPolicy } from "
|
|
19
|
+
import { resolveArtifactIntegrityPolicy } from "./inventory/policy.js";
|
|
19
20
|
/** Read-only inventory and exclusively owned extraction provider. */
|
|
20
21
|
export class ArtifactProvider {
|
|
21
22
|
#capabilities;
|
|
@@ -73,7 +74,14 @@ class ArtifactClient {
|
|
|
73
74
|
parameters.path !== undefined &&
|
|
74
75
|
parameters.path !== "." &&
|
|
75
76
|
parameters.path !== basename(this.target.path))
|
|
76
|
-
throw new
|
|
77
|
+
throw new AnalysisInputError(operation, undefined, [
|
|
78
|
+
{
|
|
79
|
+
path: ["path"],
|
|
80
|
+
reason: "invalid_value",
|
|
81
|
+
message: "For an active plist, path must select that archive (omit path or use its basename).",
|
|
82
|
+
expected: basename(this.target.path),
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
77
85
|
const bundlePath = standalone
|
|
78
86
|
? dirname(this.target.path)
|
|
79
87
|
: this.target.sourcePath;
|
|
@@ -98,6 +106,8 @@ class ArtifactClient {
|
|
|
98
106
|
if (operation === "inspect_asset_catalog") {
|
|
99
107
|
return await this.inspectAssetCatalog(parameters, options);
|
|
100
108
|
}
|
|
109
|
+
if (operation === "trace_dylib_resolution")
|
|
110
|
+
return await this.traceDylibResolution(parameters, options);
|
|
101
111
|
if (operation === "extract_artifact") {
|
|
102
112
|
const parsed = artifactExtractionExecutionSchema.parse(parameters);
|
|
103
113
|
const result = await extractArtifact({
|
|
@@ -154,6 +164,30 @@ class ArtifactClient {
|
|
|
154
164
|
})),
|
|
155
165
|
}));
|
|
156
166
|
}
|
|
167
|
+
async traceDylibResolution(parameters, options) {
|
|
168
|
+
if (this.target.kind !== "executable" || this.target.format !== "mach-o")
|
|
169
|
+
throw new ArtifactReaderFailure("unavailable", "trace_dylib_resolution requires an active Mach-O or .app bundle target");
|
|
170
|
+
// Only a target opened from an app bundle directory carries its Info.plist;
|
|
171
|
+
// a regular file whose name ends in .app is a standalone image.
|
|
172
|
+
const bundle = this.target.bundleInfoPlist === undefined
|
|
173
|
+
? undefined
|
|
174
|
+
: this.target.sourcePath;
|
|
175
|
+
const result = await traceDylibResolution({
|
|
176
|
+
rootPath: bundle ?? dirname(this.target.path),
|
|
177
|
+
targetPath: this.target.path,
|
|
178
|
+
targetSha256: this.target.sha256,
|
|
179
|
+
enumerateRoots: bundle !== undefined,
|
|
180
|
+
parameters,
|
|
181
|
+
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
182
|
+
});
|
|
183
|
+
return ok(createAnalysisExecution(result, IDENTITY, {
|
|
184
|
+
limitations: result.limitations,
|
|
185
|
+
locations: result.images.map(({ path }) => ({
|
|
186
|
+
kind: "artifact-path",
|
|
187
|
+
path,
|
|
188
|
+
})),
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
157
191
|
async inspectArtifact(parameters, options) {
|
|
158
192
|
const parsed = artifactInventoryInputSchema.parse(parameters);
|
|
159
193
|
const inventoryParameters = {
|
|
@@ -206,6 +240,9 @@ const isArtifactOperation = (operation) => ARTIFACT_ANALYSIS_OPERATIONS.includes
|
|
|
206
240
|
const translateFailure = (operation, cause) => {
|
|
207
241
|
if (cause instanceof ArtifactReaderFailure)
|
|
208
242
|
return new ArtifactOperationError(operation, cause.reason, cause.details, cause.message);
|
|
243
|
+
// Caller-selection failures are already typed; keep their correction details.
|
|
244
|
+
if (cause instanceof AnalysisInputError)
|
|
245
|
+
return cause;
|
|
209
246
|
return new ArtifactOperationError(operation, "io");
|
|
210
247
|
};
|
|
211
248
|
const subjectFor = (path, manifest) => ({
|
|
@@ -11,7 +11,8 @@ export const artifactCapabilities = (platform = process.platform) => Object.free
|
|
|
11
11
|
effects: Object.freeze({
|
|
12
12
|
mutatesArtifact: false,
|
|
13
13
|
launchesProcess: operation !== "decode_interface_builder" &&
|
|
14
|
-
operation !== "inspect_keyed_archive"
|
|
14
|
+
operation !== "inspect_keyed_archive" &&
|
|
15
|
+
operation !== "trace_dylib_resolution",
|
|
15
16
|
mayShowUi: false,
|
|
16
17
|
mayAccessNetwork: false,
|
|
17
18
|
mayWriteFilesystem: operation === "extract_artifact" ||
|