rea-agents 6.1.0 → 6.2.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 +7 -5
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +6 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +57 -35
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +69 -25
- package/dist/application/DirectAnalysis.js +29 -14
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +15 -19
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +9 -1
- package/dist/application/JsonFiles.js +42 -9
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +8 -16
- package/dist/application/SetupHost.js +16 -27
- package/dist/application/SetupPlan.js +6 -6
- package/dist/application/Uninstall.js +81 -29
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/WebScriptExportService.js +30 -4
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
- package/dist/application/binary/BinarySession.js +70 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +1 -1
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
- package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +39 -14
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +48 -24
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +32 -27
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +4 -4
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli.js +16 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonInput.js +15 -1
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +5 -10
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionToolContracts.js +14 -2
- package/dist/contracts/sessionToolSchemas.js +1 -14
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +136 -92
- package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +18 -3
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +3 -4
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +10 -36
- package/dist/domain/evidenceBundle.js +7 -9
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/javascript/electronActiveObservation.js +26 -69
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
- package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/localPath.js +1 -1
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +5 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +13 -12
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +41 -22
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +2 -2
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +91 -32
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +40 -12
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +15 -7
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
- package/dist/inspector/V8InspectorProvider.js +38 -28
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +8 -2
- package/dist/native/NativeMacOSProvider.js +25 -15
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +11 -5
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/createServer.js +49 -36
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +2 -3
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +23 -23
- package/dist/server/registerEvidenceTools.js +3 -4
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +4 -19
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +12 -18
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +39 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +9 -8
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { enhancedInputSchemas } from "../contracts/enhancedInputs.js";
|
|
3
|
-
import { AnalysisCancelledError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
3
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
4
4
|
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
5
5
|
import {} from "../domain/analysisErrorBase.js";
|
|
6
6
|
import { addressDistance, functionDossierSchema, parseFunctionDossier, parseListCount, parseRelatedAddresses, parseSegments, } from "../domain/hopperValues.js";
|
|
@@ -179,20 +179,34 @@ export class EnhancedTools {
|
|
|
179
179
|
}
|
|
180
180
|
async #batchDecompile(addresses, signal) {
|
|
181
181
|
const items = await Promise.all(addresses.map(async (address) => {
|
|
182
|
-
const
|
|
182
|
+
const resolved = await resolveProcedureAddress(this.#call.bind(this), address, signal);
|
|
183
|
+
const procedure = resolved.ok
|
|
184
|
+
? await this.#batchProcedureIdentity(resolved.value, signal)
|
|
185
|
+
: {
|
|
186
|
+
status: "unknown",
|
|
187
|
+
error: projectAnalysisError(resolved.error),
|
|
188
|
+
};
|
|
189
|
+
const result = await this.#call("procedure_pseudo_code", { procedure: resolved.ok ? resolved.value : address }, signal);
|
|
183
190
|
if (!result.ok)
|
|
184
191
|
return {
|
|
185
192
|
address,
|
|
193
|
+
procedure,
|
|
186
194
|
status: "error",
|
|
187
195
|
error: projectAnalysisError(result.error),
|
|
188
196
|
};
|
|
189
197
|
if (typeof result.value !== "string" || result.value.length === 0)
|
|
190
198
|
return {
|
|
191
199
|
address,
|
|
200
|
+
procedure,
|
|
192
201
|
status: "error",
|
|
193
202
|
error: projectAnalysisError(new AnalysisOutputError("procedure_pseudo_code", "provider returned empty pseudocode")),
|
|
194
203
|
};
|
|
195
|
-
return {
|
|
204
|
+
return {
|
|
205
|
+
address,
|
|
206
|
+
procedure,
|
|
207
|
+
status: "ok",
|
|
208
|
+
pseudocode: result.value,
|
|
209
|
+
};
|
|
196
210
|
}));
|
|
197
211
|
const succeeded = items.filter(({ status }) => status === "ok").length;
|
|
198
212
|
return ok({
|
|
@@ -202,6 +216,23 @@ export class EnhancedTools {
|
|
|
202
216
|
failed: items.length - succeeded,
|
|
203
217
|
});
|
|
204
218
|
}
|
|
219
|
+
async #batchProcedureIdentity(address, signal) {
|
|
220
|
+
const observed = await this.#call("address_name", { address }, signal);
|
|
221
|
+
const named = observed.ok &&
|
|
222
|
+
(typeof observed.value === "string" || observed.value === null);
|
|
223
|
+
return {
|
|
224
|
+
status: "resolved",
|
|
225
|
+
address,
|
|
226
|
+
name: named ? observed.value : null,
|
|
227
|
+
...(named
|
|
228
|
+
? {}
|
|
229
|
+
: {
|
|
230
|
+
name_error: projectAnalysisError(observed.ok
|
|
231
|
+
? new AnalysisOutputError("address_name", "provider returned an invalid entry label")
|
|
232
|
+
: observed.error),
|
|
233
|
+
}),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
205
236
|
async #callGraph(input, signal) {
|
|
206
237
|
const relation = input.direction === "forward" ? "callees" : "callers";
|
|
207
238
|
const tool = input.direction === "forward" ? "procedure_callees" : "procedure_callers";
|
|
@@ -254,9 +285,23 @@ export class EnhancedTools {
|
|
|
254
285
|
}
|
|
255
286
|
async #analyzeSwiftTypes(input, signal) {
|
|
256
287
|
const procedures = await this.#allAddressed("list_procedures", signal);
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
288
|
+
if (!procedures.ok)
|
|
289
|
+
return procedures;
|
|
290
|
+
const symbols = await this.#allAddressed("list_names", signal);
|
|
291
|
+
if (!symbols.ok &&
|
|
292
|
+
!(symbols.error instanceof AnalysisCapabilityUnavailableError))
|
|
293
|
+
return symbols;
|
|
294
|
+
const result = categorizeSwiftTypes(procedures.value, input, symbols.ok ? symbols.value : []);
|
|
295
|
+
return ok(symbols.ok
|
|
296
|
+
? result
|
|
297
|
+
: {
|
|
298
|
+
...result,
|
|
299
|
+
symbol_inventory_error: projectAnalysisError(symbols.error),
|
|
300
|
+
limitations: [
|
|
301
|
+
...result.limitations,
|
|
302
|
+
"The provider's symbol inventory is unavailable; demangled procedures could not be joined to their Swift aliases.",
|
|
303
|
+
],
|
|
304
|
+
});
|
|
260
305
|
}
|
|
261
306
|
async #findXrefs(name, signal) {
|
|
262
307
|
const names = await this.#allAddressed("list_names", signal);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { describeEvidenceBundleFailure, describeValidationFailure, parseEvidenceBundle, } from "../domain/evidenceBundle.js";
|
|
2
2
|
import { EvidenceFileError, EvidenceIntegrityError, } from "../domain/evidenceErrors.js";
|
|
3
3
|
import { err, ok } from "../domain/result.js";
|
|
4
|
-
import {
|
|
4
|
+
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
5
|
+
import { parseProcessCapture } from "../domain/process/processCaptureParsing.js";
|
|
5
6
|
import { bufferedJsonParts, canonicalJsonParts, } from "../domain/jsonSerialization.js";
|
|
6
7
|
import { readJsonFile, writeTextParts } from "./JsonFiles.js";
|
|
7
8
|
/** Read and validate an evidence bundle at the caller-supplied path. */
|
|
@@ -35,7 +36,9 @@ export const readEvidenceBundle = async (path) => {
|
|
|
35
36
|
return ok(bundle);
|
|
36
37
|
};
|
|
37
38
|
/** Atomically write deterministic evidence JSON at the caller-supplied path. */
|
|
38
|
-
export const writeEvidenceBundle = async (bundle, path, overwrite) => {
|
|
39
|
+
export const writeEvidenceBundle = async (bundle, path, overwrite, signal) => {
|
|
40
|
+
if (signal?.aborted === true)
|
|
41
|
+
return err(new AnalysisCancelledError("export_evidence_bundle"));
|
|
39
42
|
let checked;
|
|
40
43
|
try {
|
|
41
44
|
checked = parseEvidenceBundle(bundle);
|
|
@@ -45,5 +48,7 @@ export const writeEvidenceBundle = async (bundle, path, overwrite) => {
|
|
|
45
48
|
cause,
|
|
46
49
|
}));
|
|
47
50
|
}
|
|
48
|
-
return writeTextParts(bufferedJsonParts(canonicalJsonParts(checked)), path, overwrite
|
|
51
|
+
return writeTextParts(bufferedJsonParts(canonicalJsonParts(checked)), path, overwrite, signal === undefined
|
|
52
|
+
? undefined
|
|
53
|
+
: { signal, operation: "export_evidence_bundle" });
|
|
49
54
|
};
|
|
@@ -8,7 +8,9 @@ export const REA_WORKFLOW_PROVIDER = {
|
|
|
8
8
|
/** Commit a workflow result to its upstream profile and applicable semantic revision. */
|
|
9
9
|
export const workflowAnalysisProfile = (upstream, operation) => createAnalysisProfile(REA_WORKFLOW_PROVIDER, {
|
|
10
10
|
upstream_analysis_profile: upstream,
|
|
11
|
-
...(operation === "binary_overview"
|
|
11
|
+
...(operation === "binary_overview" || operation === "batch_decompile"
|
|
12
|
+
? { workflow_revision: 2 }
|
|
13
|
+
: {}),
|
|
12
14
|
});
|
|
13
15
|
/** Provider identity for deterministic artifact inventories. */
|
|
14
16
|
export const ARTIFACT_GRAPH_PROVIDER = {
|
|
@@ -58,6 +60,12 @@ export const JAVASCRIPT_RUNTIME_RECONCILIATION_PROVIDER = {
|
|
|
58
60
|
name: "REA JavaScript runtime reconciliation",
|
|
59
61
|
version: "1",
|
|
60
62
|
};
|
|
63
|
+
/** Provider identity for selected views of retained analysis Evidence. */
|
|
64
|
+
export const ANALYSIS_VIEW_PROVIDER = {
|
|
65
|
+
id: "rea-analysis-view",
|
|
66
|
+
name: "REA analysis view projection",
|
|
67
|
+
version: "1",
|
|
68
|
+
};
|
|
61
69
|
/** Provider identity for graph-native feature tracing and version comparison. */
|
|
62
70
|
export const JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER = {
|
|
63
71
|
id: "rea-javascript-application-workflows",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { link, lstat, mkdtemp, open, readFile, realpath, rename, rm, } from "node:fs/promises";
|
|
2
2
|
import { basename, dirname, resolve } from "node:path";
|
|
3
3
|
import { EvidenceFileError } from "../domain/evidenceErrors.js";
|
|
4
|
+
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
4
5
|
import { err, ok } from "../domain/result.js";
|
|
5
6
|
/** Read JSON data from a regular file at the caller-supplied path. */
|
|
6
7
|
export const readJsonFile = async (path) => {
|
|
@@ -32,10 +33,10 @@ export const readJsonFile = async (path) => {
|
|
|
32
33
|
};
|
|
33
34
|
/** Atomically write text to the caller-supplied path. */
|
|
34
35
|
export const writeTextFile = async (encoded, path, overwrite) => writeTextParts([encoded], path, overwrite);
|
|
35
|
-
|
|
36
|
-
export const writeTextParts = async (parts, path, overwrite) => {
|
|
36
|
+
export async function writeTextParts(parts, path, overwrite, cancellation) {
|
|
37
37
|
const requestedPath = resolve(path);
|
|
38
38
|
try {
|
|
39
|
+
assertWriteActive(cancellation);
|
|
39
40
|
const canonicalParent = await realpath(dirname(requestedPath));
|
|
40
41
|
const destination = resolve(canonicalParent, basename(requestedPath));
|
|
41
42
|
const existing = await lstat(destination).catch((cause) => {
|
|
@@ -49,10 +50,15 @@ export const writeTextParts = async (parts, path, overwrite) => {
|
|
|
49
50
|
if (!existing.isFile() || existing.isSymbolicLink())
|
|
50
51
|
return err(new EvidenceFileError("write", "not-file", { path: requestedPath }));
|
|
51
52
|
}
|
|
52
|
-
|
|
53
|
+
assertWriteActive(cancellation);
|
|
54
|
+
const bytes = await publishFile(destination, parts, overwrite, cancellation);
|
|
53
55
|
return ok({ path: requestedPath, bytes });
|
|
54
56
|
}
|
|
55
57
|
catch (cause) {
|
|
58
|
+
if (cancellation?.signal.aborted === true &&
|
|
59
|
+
cause instanceof AnalysisCancelledError &&
|
|
60
|
+
cause.operation === cancellation.operation)
|
|
61
|
+
return err(cause);
|
|
56
62
|
if (!overwrite && fileErrorCode(cause) === "EEXIST")
|
|
57
63
|
return err(new EvidenceFileError("write", "exists", {
|
|
58
64
|
cause,
|
|
@@ -63,28 +69,28 @@ export const writeTextParts = async (parts, path, overwrite) => {
|
|
|
63
69
|
path: requestedPath,
|
|
64
70
|
}));
|
|
65
71
|
}
|
|
66
|
-
}
|
|
72
|
+
}
|
|
67
73
|
/** A missing path or parent is a selection error, not a permission failure. */
|
|
68
74
|
const missingOrIo = (cause) => {
|
|
69
75
|
const code = fileErrorCode(cause);
|
|
70
76
|
return code === "ENOENT" || code === "ENOTDIR" ? "missing" : "io";
|
|
71
77
|
};
|
|
72
|
-
const publishFile = async (destination, parts, overwrite) => {
|
|
78
|
+
const publishFile = async (destination, parts, overwrite, cancellation) => {
|
|
73
79
|
const stagingDirectory = await mkdtemp(resolve(dirname(destination), ".rea-write-"));
|
|
74
80
|
try {
|
|
75
81
|
const staged = resolve(stagingDirectory, "content");
|
|
76
82
|
const file = await open(staged, "wx", 0o600);
|
|
77
83
|
let bytes = 0;
|
|
78
84
|
try {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
bytes += Buffer.byteLength(part, "utf8");
|
|
82
|
-
}
|
|
85
|
+
bytes = await writeStagedParts(file, parts, cancellation);
|
|
86
|
+
assertWriteActive(cancellation);
|
|
83
87
|
await file.sync();
|
|
84
88
|
}
|
|
85
89
|
finally {
|
|
86
90
|
await file.close();
|
|
87
91
|
}
|
|
92
|
+
// Once submitted, the atomic publication can win a later cancellation race.
|
|
93
|
+
assertWriteActive(cancellation);
|
|
88
94
|
if (overwrite)
|
|
89
95
|
await rename(staged, destination);
|
|
90
96
|
// A hard link publishes complete bytes atomically and cannot replace an existing name.
|
|
@@ -96,6 +102,33 @@ const publishFile = async (destination, parts, overwrite) => {
|
|
|
96
102
|
await rm(stagingDirectory, { recursive: true, force: true });
|
|
97
103
|
}
|
|
98
104
|
};
|
|
105
|
+
const writeStagedParts = async (file, parts, cancellation) => {
|
|
106
|
+
assertWriteActive(cancellation);
|
|
107
|
+
const iterator = parts[Symbol.iterator]();
|
|
108
|
+
let exhausted = false;
|
|
109
|
+
let bytes = 0;
|
|
110
|
+
try {
|
|
111
|
+
for (;;) {
|
|
112
|
+
assertWriteActive(cancellation);
|
|
113
|
+
const part = iterator.next();
|
|
114
|
+
if (part.done)
|
|
115
|
+
exhausted = true;
|
|
116
|
+
assertWriteActive(cancellation);
|
|
117
|
+
if (part.done)
|
|
118
|
+
return bytes;
|
|
119
|
+
await file.writeFile(part.value, { encoding: "utf8" });
|
|
120
|
+
bytes += Buffer.byteLength(part.value, "utf8");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
if (!exhausted)
|
|
125
|
+
iterator.return?.();
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const assertWriteActive = (cancellation) => {
|
|
129
|
+
if (cancellation?.signal.aborted === true)
|
|
130
|
+
throw new AnalysisCancelledError(cancellation.operation);
|
|
131
|
+
};
|
|
99
132
|
const fileErrorCode = (cause) => typeof cause === "object" && cause !== null && "code" in cause
|
|
100
133
|
? cause.code
|
|
101
134
|
: undefined;
|
|
@@ -84,7 +84,7 @@ export const readLinuxDistribution = async () => {
|
|
|
84
84
|
}
|
|
85
85
|
};
|
|
86
86
|
/** Download, verify, install, and read back the official Hopper Linux package. */
|
|
87
|
-
export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(), options = {}) => {
|
|
87
|
+
export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(process.env), options = {}) => {
|
|
88
88
|
if (options.signal?.aborted === true)
|
|
89
89
|
return { status: "failed", reason: "cancelled" };
|
|
90
90
|
const distribution = await host.distribution();
|
|
@@ -124,7 +124,8 @@ export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(),
|
|
|
124
124
|
};
|
|
125
125
|
/** Canonical launcher path for a legacy user-local Linux Hopper installation. */
|
|
126
126
|
export const linuxHopperLauncherPath = (home) => join(home, ".local/share/rea/hopper/bin/Hopper");
|
|
127
|
-
|
|
127
|
+
/** Compose package-manager and linker checks from the selected caller environment. */
|
|
128
|
+
export const systemLinuxHopperInstallHost = (environment) => ({
|
|
128
129
|
distribution: readLinuxDistribution,
|
|
129
130
|
async download(url, options) {
|
|
130
131
|
const response = await fetch(url, {
|
|
@@ -138,11 +139,11 @@ const systemLinuxHopperInstallHost = () => ({
|
|
|
138
139
|
},
|
|
139
140
|
createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-")),
|
|
140
141
|
writeArchive: (path, bytes) => writeFile(path, bytes, { mode: 0o600 }),
|
|
141
|
-
installPackage: installSystemPackage,
|
|
142
|
+
installPackage: (family, archive) => installSystemPackage(family, archive, environment),
|
|
142
143
|
async launcherStatus(path) {
|
|
143
144
|
try {
|
|
144
145
|
await access(path);
|
|
145
|
-
const linked = await execFileOutput("ldd", [path]);
|
|
146
|
+
const linked = await execFileOutput("ldd", [path], { env: environment });
|
|
146
147
|
if (!linuxSharedLibrariesAvailable(`${linked.stdout}\n${linked.stderr}`))
|
|
147
148
|
return "runtime_dependencies";
|
|
148
149
|
return (await linuxHopperBinarySupported(path))
|
|
@@ -175,10 +176,12 @@ export const linuxHopperBinarySupported = async (path) => {
|
|
|
175
176
|
export const linuxHopperLauncherDigestSupported = (digest) => SUPPORTED_HOPPER_SHA256.has(digest);
|
|
176
177
|
/** Interpret ldd output conservatively so a present but broken launcher is unhealthy. */
|
|
177
178
|
export const linuxSharedLibrariesAvailable = (output) => !/(?:=>\s+not found|error while loading shared libraries)/iu.test(output);
|
|
178
|
-
const installSystemPackage = async (family, archive) => {
|
|
179
|
+
const installSystemPackage = async (family, archive, environment) => {
|
|
179
180
|
try {
|
|
180
181
|
for (const command of linuxPackageManagerCommands(family, archive, process.getuid?.() === 0))
|
|
181
|
-
await execFileAsync(command.executable, command.args
|
|
182
|
+
await execFileAsync(command.executable, command.args, {
|
|
183
|
+
env: environment,
|
|
184
|
+
});
|
|
182
185
|
return true;
|
|
183
186
|
}
|
|
184
187
|
catch (cause) {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { execFile } from "node:child_process";
|
|
3
3
|
import { access, mkdir, mkdtemp, readdir, rename, rm, writeFile, } from "node:fs/promises";
|
|
4
|
-
import {
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { promisify } from "node:util";
|
|
7
7
|
import { z } from "zod";
|
|
8
|
+
import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
|
|
8
9
|
const execFileAsync = promisify(execFile);
|
|
9
10
|
const RELEASES_URL = "https://www.hopperapp.com/include/files-api.php?request=releases&public=true";
|
|
10
11
|
const DOWNLOAD_PREFIX = "https://www.hopperapp.com:443/downloader/public/";
|
|
@@ -21,7 +22,7 @@ export const macHopperInstallDisclosure = {
|
|
|
21
22
|
],
|
|
22
23
|
};
|
|
23
24
|
/** Download, verify, and install Hopper into the current user's Applications directory. */
|
|
24
|
-
export const installMacHopper = async (options = {}, host = systemMacHopperInstallHost()) => {
|
|
25
|
+
export const installMacHopper = async (options = {}, host = systemMacHopperInstallHost(homeDirectoryFromEnvironment(process.env, process.platform), process.env)) => {
|
|
25
26
|
let temporary;
|
|
26
27
|
let mounted = false;
|
|
27
28
|
try {
|
|
@@ -77,7 +78,8 @@ export const installMacHopper = async (options = {}, host = systemMacHopperInsta
|
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
};
|
|
80
|
-
|
|
81
|
+
/** Compose installer paths and subprocesses from one selected caller context. */
|
|
82
|
+
export const systemMacHopperInstallHost = (homeDirectory, environment) => ({
|
|
81
83
|
download: downloadPackage,
|
|
82
84
|
createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-mac-")),
|
|
83
85
|
createMountDirectory: (path) => mkdir(path),
|
|
@@ -90,10 +92,10 @@ const systemMacHopperInstallHost = () => ({
|
|
|
90
92
|
"-mountpoint",
|
|
91
93
|
mountPath,
|
|
92
94
|
packagePath,
|
|
93
|
-
]);
|
|
95
|
+
], environment);
|
|
94
96
|
},
|
|
95
97
|
async unmount(mountPath) {
|
|
96
|
-
await commandSucceeds("hdiutil", ["detach", mountPath, "-force"]);
|
|
98
|
+
await commandSucceeds("hdiutil", ["detach", mountPath, "-force"], environment);
|
|
97
99
|
},
|
|
98
100
|
async appBundle(mountPath) {
|
|
99
101
|
const entries = await readdir(mountPath, { withFileTypes: true });
|
|
@@ -101,19 +103,14 @@ const systemMacHopperInstallHost = () => ({
|
|
|
101
103
|
return app === undefined ? undefined : join(mountPath, app.name);
|
|
102
104
|
},
|
|
103
105
|
async validBundle(appPath) {
|
|
104
|
-
if (!(await commandSucceeds("codesign", [
|
|
105
|
-
"--verify",
|
|
106
|
-
"--deep",
|
|
107
|
-
"--strict",
|
|
108
|
-
appPath,
|
|
109
|
-
])))
|
|
106
|
+
if (!(await commandSucceeds("codesign", ["--verify", "--deep", "--strict", appPath], environment)))
|
|
110
107
|
return false;
|
|
111
108
|
try {
|
|
112
109
|
const identifier = (await execFileAsync("/usr/libexec/PlistBuddy", [
|
|
113
110
|
"-c",
|
|
114
111
|
"Print :CFBundleIdentifier",
|
|
115
112
|
join(appPath, "Contents/Info.plist"),
|
|
116
|
-
])).stdout.trim();
|
|
113
|
+
], { env: environment })).stdout.trim();
|
|
117
114
|
return identifier === BUNDLE_IDENTIFIER;
|
|
118
115
|
}
|
|
119
116
|
catch (cause) {
|
|
@@ -136,10 +133,10 @@ const systemMacHopperInstallHost = () => ({
|
|
|
136
133
|
async installBundle(source, destination, stage, replaceExisting) {
|
|
137
134
|
const previous = `${stage}-previous`;
|
|
138
135
|
try {
|
|
139
|
-
await mkdir(join(
|
|
136
|
+
await mkdir(join(homeDirectory, "Applications"), { recursive: true });
|
|
140
137
|
await rm(stage, { recursive: true, force: true });
|
|
141
138
|
await rm(previous, { recursive: true, force: true });
|
|
142
|
-
await execFileAsync("ditto", [source, stage]);
|
|
139
|
+
await execFileAsync("ditto", [source, stage], { env: environment });
|
|
143
140
|
await access(join(stage, "Contents/MacOS/hopper"));
|
|
144
141
|
if (replaceExisting)
|
|
145
142
|
await rename(destination, previous);
|
|
@@ -176,10 +173,10 @@ const systemMacHopperInstallHost = () => ({
|
|
|
176
173
|
}
|
|
177
174
|
},
|
|
178
175
|
async openApplication(path) {
|
|
179
|
-
await execFileAsync("open", [path]);
|
|
176
|
+
await execFileAsync("open", [path], { env: environment });
|
|
180
177
|
},
|
|
181
178
|
cleanup: (path) => rm(path, { recursive: true, force: true }),
|
|
182
|
-
destination: () => join(
|
|
179
|
+
destination: () => join(homeDirectory, "Applications/Hopper Disassembler.app"),
|
|
183
180
|
});
|
|
184
181
|
const downloadPackage = async (url) => {
|
|
185
182
|
const response = await fetch(url, {
|
|
@@ -196,9 +193,9 @@ const parseJson = (bytes) => JSON.parse(new TextDecoder().decode(bytes));
|
|
|
196
193
|
const integrityMatches = (bytes, release) => bytes.byteLength === Number(release.file_length) &&
|
|
197
194
|
bytes.byteLength <= MAX_PACKAGE_BYTES &&
|
|
198
195
|
createHash("sha1").update(bytes).digest("hex") === release.file_hash;
|
|
199
|
-
const commandSucceeds = async (command, args) => {
|
|
196
|
+
const commandSucceeds = async (command, args, environment) => {
|
|
200
197
|
try {
|
|
201
|
-
await execFileAsync(command, args);
|
|
198
|
+
await execFileAsync(command, args, { env: environment });
|
|
202
199
|
return true;
|
|
203
200
|
}
|
|
204
201
|
catch (cause) {
|
|
@@ -11,17 +11,6 @@ export const firstProcedureAddress = (input) => {
|
|
|
11
11
|
throw new TypeError("Procedure inventory was empty");
|
|
12
12
|
return first.address;
|
|
13
13
|
};
|
|
14
|
-
/** Reject two target paths that resolve to the same binary content. */
|
|
15
|
-
export const requireDistinctTargetHashes = (firstHash, secondHash) => {
|
|
16
|
-
if (typeof firstHash !== "string" ||
|
|
17
|
-
typeof secondHash !== "string" ||
|
|
18
|
-
firstHash.length === 0 ||
|
|
19
|
-
secondHash.length === 0) {
|
|
20
|
-
throw new TypeError("Target hashes must be non-empty strings");
|
|
21
|
-
}
|
|
22
|
-
if (firstHash === secondHash)
|
|
23
|
-
throw new TypeError("Real-Hopper verification requires distinct binaries");
|
|
24
|
-
};
|
|
25
14
|
/** Reject empty and success-shaped embedded decompilation failures. */
|
|
26
15
|
export const requirePseudocode = (input, operation) => {
|
|
27
16
|
if (typeof input !== "string" || input.trim().length === 0)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { parseEvidenceBundle, } from "../domain/evidenceBundle.js";
|
|
4
|
-
import { parseProcessCapture } from "../domain/process/
|
|
4
|
+
import { parseProcessCapture } from "../domain/process/processCaptureParsing.js";
|
|
5
5
|
import { parseApplicationGraphEvidence } from "./javascript/JavaScriptApplicationEvidenceGraph.js";
|
|
6
6
|
import { applicationObligationPolicy, semanticObligationPolicy, } from "./ReconstructionObligationPolicies.js";
|
|
7
7
|
/** Derive conservative candidates from graph, process, and reviewed inputs. */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { manualRegistrationRemediation, } from "./SupportedClients.js";
|
|
2
2
|
import { configureDetectedClients } from "./SetupClients.js";
|
|
3
3
|
import { discoverSetupState, planSetupActions } from "./SetupPlan.js";
|
|
4
|
-
import { filterClientsNeedingConfigure, hostRemediation,
|
|
4
|
+
import { filterClientsNeedingConfigure, hostRemediation, systemSetupHost, } from "./SetupHost.js";
|
|
5
5
|
/** Discover, approve, and apply setup actions idempotently. */
|
|
6
6
|
export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
7
7
|
const appliedActions = [];
|
|
@@ -13,22 +13,14 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
13
13
|
const unsupported = await hostRemediation(host, false);
|
|
14
14
|
if (unsupported !== undefined)
|
|
15
15
|
return fail(unsupported);
|
|
16
|
-
const initialState = await host.initialSetupState
|
|
17
|
-
let hopperPath = initialState
|
|
18
|
-
? await host.hopperPath()
|
|
19
|
-
: initialState.hopperPath;
|
|
20
|
-
let providerEnvironment = initialState === undefined
|
|
21
|
-
? await initialProviderEnvironment(host, hopperPath)
|
|
22
|
-
: initialState.providerEnvironment;
|
|
16
|
+
const initialState = await host.initialSetupState(options.readinessScope);
|
|
17
|
+
let { hopperPath, providerEnvironment } = initialState;
|
|
23
18
|
const discovery = await discoverSetupState({
|
|
24
19
|
host,
|
|
25
20
|
providerEnvironment,
|
|
26
21
|
forceHopperInstall: options.installHopper,
|
|
27
22
|
proposeHopper: options.proposeHopper ?? (confirm !== undefined && !options.structured),
|
|
28
|
-
|
|
29
|
-
...(initialState === undefined
|
|
30
|
-
? {}
|
|
31
|
-
: { initialDoctor: initialState.doctor }),
|
|
23
|
+
initialDoctor: initialState.doctor,
|
|
32
24
|
});
|
|
33
25
|
clientStates = discovery.clientStates;
|
|
34
26
|
const clientSelectionAllowed = options.clientIds === undefined &&
|
|
@@ -52,7 +44,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
52
44
|
discovery,
|
|
53
45
|
host,
|
|
54
46
|
providerEnvironment,
|
|
55
|
-
command:
|
|
47
|
+
command: host.registrationCommand,
|
|
56
48
|
clientIds: [],
|
|
57
49
|
installSkill: offerSkillAction,
|
|
58
50
|
});
|
|
@@ -92,7 +84,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
92
84
|
discovery: planDiscovery,
|
|
93
85
|
host,
|
|
94
86
|
providerEnvironment,
|
|
95
|
-
command:
|
|
87
|
+
command: host.registrationCommand,
|
|
96
88
|
clientIds: selectedClientIds,
|
|
97
89
|
installSkill,
|
|
98
90
|
});
|
|
@@ -175,7 +167,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
175
167
|
host,
|
|
176
168
|
detectedClients: selectedClients,
|
|
177
169
|
providerEnvironment,
|
|
178
|
-
command:
|
|
170
|
+
command: host.registrationCommand,
|
|
179
171
|
clients,
|
|
180
172
|
appliedActions,
|
|
181
173
|
...(options.onProgress === undefined
|
|
@@ -241,7 +233,7 @@ const installHopperAction = async (input) => {
|
|
|
241
233
|
return {
|
|
242
234
|
hopperPath: installed.launcherPath,
|
|
243
235
|
providerEnvironment,
|
|
244
|
-
selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment,
|
|
236
|
+
selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, input.host.registrationCommand),
|
|
245
237
|
};
|
|
246
238
|
};
|
|
247
239
|
const installSkillAction = async (host, options, appliedActions) => {
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import { access } from "node:fs/promises";
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
2
|
import { resolve } from "node:path";
|
|
4
3
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
5
4
|
import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
|
|
6
5
|
import { SUPPORTED_NODE_VERSION_PROSE, supportsNodeVersion, } from "../domain/runtimeVersion.js";
|
|
7
6
|
import { runDoctor, systemDoctorHost } from "./Doctor.js";
|
|
8
|
-
import { installLinuxHopper, readLinuxDistribution } from "./LinuxHopper.js";
|
|
9
|
-
import { installMacHopper } from "./MacHopper.js";
|
|
7
|
+
import { installLinuxHopper, readLinuxDistribution, systemLinuxHopperInstallHost, } from "./LinuxHopper.js";
|
|
8
|
+
import { installMacHopper, systemMacHopperInstallHost } from "./MacHopper.js";
|
|
10
9
|
import { supportedClients } from "./SupportedClients.js";
|
|
11
10
|
import { canonicalSkillNeedsInstall, installCanonicalSkill, } from "./SetupSkill.js";
|
|
12
11
|
import { clientConfigurationAligned, configureClientConfiguration, inspectClientConfiguration, } from "./SetupClientConfiguration.js";
|
|
13
12
|
import { setupInstallFailure } from "./SetupInstallFailure.js";
|
|
14
13
|
import { providerRegistrationEnvironment } from "./SetupRegistrationEnvironment.js";
|
|
15
14
|
/** Resolve the executable and arguments used in a managed MCP registration. */
|
|
16
|
-
export const setupRegistrationCommand = (platform, useNpmRunner
|
|
15
|
+
export const setupRegistrationCommand = (platform, useNpmRunner) => useNpmRunner
|
|
17
16
|
? npxRegistrationCommand(platform)
|
|
18
17
|
: platform === "win32"
|
|
19
18
|
? [
|
|
@@ -26,10 +25,6 @@ export const filterClientsNeedingConfigure = async (host, detectedClients, provi
|
|
|
26
25
|
const needs = await Promise.all(detectedClients.map((client) => host.clientNeedsConfigure(client, providerEnvironment, command)));
|
|
27
26
|
return detectedClients.filter((_, index) => needs[index]);
|
|
28
27
|
};
|
|
29
|
-
export const initialProviderEnvironment = async (host, hopperPath) => ({
|
|
30
|
-
...(await host.providerEnvironment?.()),
|
|
31
|
-
...(hopperPath === undefined ? {} : { HOPPER_LAUNCHER_PATH: hopperPath }),
|
|
32
|
-
});
|
|
33
28
|
export const hostRemediation = async (host, installHopper) => {
|
|
34
29
|
if (!supportsNodeVersion(host.nodeVersion))
|
|
35
30
|
return `Install ${SUPPORTED_NODE_VERSION_PROSE} and rerun setup.`;
|
|
@@ -48,14 +43,17 @@ export const hostRemediation = async (host, installHopper) => {
|
|
|
48
43
|
return "Automated Hopper setup supports Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, and CachyOS; configure an existing supported provider instead.";
|
|
49
44
|
};
|
|
50
45
|
/** Production setup effects for Hopper, agent configuration, and the canonical skill directory. */
|
|
51
|
-
export const systemSetupHost = (
|
|
46
|
+
export const systemSetupHost = (selectedDoctorHost = undefined, environment = process.env) => {
|
|
47
|
+
const doctorHost = selectedDoctorHost ?? systemDoctorHost({ environment });
|
|
52
48
|
const platform = doctorHost.platform;
|
|
49
|
+
const { homeDirectory } = doctorHost;
|
|
53
50
|
return {
|
|
54
51
|
platform,
|
|
52
|
+
homeDirectory,
|
|
53
|
+
registrationCommand: setupRegistrationCommand(platform, environment.npm_command === "exec"),
|
|
55
54
|
nodeVersion: process.versions.node,
|
|
56
55
|
macosVersion: () => doctorHost.macosVersion(),
|
|
57
56
|
linuxDistribution: readLinuxDistribution,
|
|
58
|
-
hopperPath: async () => (await runDoctor(undefined, doctorHost)).hopperPath,
|
|
59
57
|
initialSetupState: async (scope) => {
|
|
60
58
|
const diagnosis = await runDoctor(undefined, doctorHost, scope);
|
|
61
59
|
return {
|
|
@@ -71,25 +69,16 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
|
|
|
71
69
|
doctor: diagnosis,
|
|
72
70
|
};
|
|
73
71
|
},
|
|
74
|
-
providerEnvironment: async () => {
|
|
75
|
-
const diagnosis = await runDoctor(undefined, doctorHost);
|
|
76
|
-
return {
|
|
77
|
-
...providerRegistrationEnvironment(diagnosis.providerInspections ?? []),
|
|
78
|
-
...(diagnosis.hopperPath === undefined
|
|
79
|
-
? {}
|
|
80
|
-
: { HOPPER_LAUNCHER_PATH: diagnosis.hopperPath }),
|
|
81
|
-
};
|
|
82
|
-
},
|
|
83
72
|
installHopper: async (replaceExisting) => {
|
|
84
73
|
const result = platform === "linux"
|
|
85
|
-
? await installLinuxHopper()
|
|
86
|
-
: await installMacHopper({ replaceExisting });
|
|
74
|
+
? await installLinuxHopper(systemLinuxHopperInstallHost(environment))
|
|
75
|
+
: await installMacHopper({ replaceExisting }, systemMacHopperInstallHost(homeDirectory, environment));
|
|
87
76
|
if (result.status === "installed")
|
|
88
77
|
return result;
|
|
89
78
|
return setupInstallFailure(result.reason);
|
|
90
79
|
},
|
|
91
|
-
detectedClients: () => detectClients(
|
|
92
|
-
supportedClients: () => Promise.resolve(supportedClients(
|
|
80
|
+
detectedClients: () => detectClients(homeDirectory, platform, environment),
|
|
81
|
+
supportedClients: () => Promise.resolve(supportedClients(homeDirectory, platform, environment)),
|
|
93
82
|
configureClient: (client, providerEnvironment, command) => client.format === "unsupported"
|
|
94
83
|
? Promise.resolve({ status: "skipped" })
|
|
95
84
|
: configureClientConfiguration(client, providerEnvironment, command),
|
|
@@ -97,15 +86,15 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
|
|
|
97
86
|
? Promise.resolve(false)
|
|
98
87
|
: clientConfigurationAligned(client, providerEnvironment, command).then((aligned) => !aligned),
|
|
99
88
|
inspectClientConfiguration: inspectClientConfiguration,
|
|
100
|
-
skillNeedsInstall: () => canonicalSkillNeedsInstall(
|
|
101
|
-
installSkill: () => installCanonicalSkill(
|
|
89
|
+
skillNeedsInstall: () => canonicalSkillNeedsInstall(homeDirectory),
|
|
90
|
+
installSkill: () => installCanonicalSkill(homeDirectory),
|
|
102
91
|
doctor: (scope) => runDoctor(undefined, doctorHost, scope),
|
|
103
92
|
};
|
|
104
93
|
};
|
|
105
94
|
/** Detect supported agents from their config files or stable installation markers. */
|
|
106
|
-
export const detectClients = async (home) => {
|
|
95
|
+
export const detectClients = async (home, platform = process.platform, environment = process.env) => {
|
|
107
96
|
const detected = [];
|
|
108
|
-
for (const candidate of supportedClients(home)) {
|
|
97
|
+
for (const candidate of supportedClients(home, platform, environment)) {
|
|
109
98
|
const [hasConfig, hasMarker] = await Promise.all([
|
|
110
99
|
exists(candidate.configPath),
|
|
111
100
|
candidate.markerPath === undefined ? false : exists(candidate.markerPath),
|