rea-agents 6.1.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +7 -7
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/filesystem/RegularFile.js +41 -0
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +105 -36
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +4 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +32 -41
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +19 -19
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
|
-
import { access,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { access, readdir } from "node:fs/promises";
|
|
3
|
+
import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
|
|
4
|
+
import { join } from "node:path";
|
|
5
5
|
import { analysisErrorRemediationAction } from "../domain/analysisErrorPresentation.js";
|
|
6
|
+
import { BinaryTargetError } from "../domain/configurationErrors.js";
|
|
6
7
|
import { parseBinaryTarget } from "./BinaryTargetResolver.js";
|
|
7
8
|
import { execFileOutput } from "../process/ExecFileOutput.js";
|
|
8
|
-
import { probeHomebrew } from "./homebrew.js";
|
|
9
|
+
import { installedCaskAppdir, probeHomebrew } from "./homebrew.js";
|
|
9
10
|
import { linuxHopperBinarySupported, linuxSharedLibrariesAvailable, readLinuxDistribution, } from "./LinuxHopper.js";
|
|
10
|
-
import {
|
|
11
|
+
import { claudeCodeSkillsDirectory, readInstalledSkillIdentity, } from "./SetupSkill.js";
|
|
11
12
|
import { CATALOG_IDENTITY } from "../catalogIdentity.js";
|
|
12
13
|
import { PRODUCT_IDENTITY, SDK_IDENTITY } from "../identity.js";
|
|
13
14
|
import { readClientRegistrationStatuses, } from "./ClientRegistrationStatus.js";
|
|
@@ -21,8 +22,9 @@ export const DOCTOR_PROVIDER_IDS = ["hopper", "ghidra", "ida"];
|
|
|
21
22
|
* or an agent consuming the structured result.
|
|
22
23
|
*/
|
|
23
24
|
export const runDoctor = async (target, host = systemDoctorHost(), requestedScope) => {
|
|
25
|
+
const scope = normalizeDoctorScope(requestedScope, target);
|
|
24
26
|
const { checks: diagnosticChecks, hopperPath, providerInspections, } = await collectDoctorDiagnostics(target, host);
|
|
25
|
-
const identity = await collectDoctorIdentity(host);
|
|
27
|
+
const identity = await collectDoctorIdentity(host, scope);
|
|
26
28
|
const checks = [...diagnosticChecks, ...identity.checks];
|
|
27
29
|
const providers = {
|
|
28
30
|
hopperAvailable: hopperPath !== undefined &&
|
|
@@ -33,7 +35,6 @@ export const runDoctor = async (target, host = systemDoctorHost(), requestedScop
|
|
|
33
35
|
providerInspections,
|
|
34
36
|
};
|
|
35
37
|
const environmentHealthy = doctorHealthy(checks, providers);
|
|
36
|
-
const scope = normalizeDoctorScope(requestedScope, target);
|
|
37
38
|
const scoped = scopeDoctorChecks({
|
|
38
39
|
checks,
|
|
39
40
|
registrations: identity.value.registrations,
|
|
@@ -53,11 +54,14 @@ export const runDoctor = async (target, host = systemDoctorHost(), requestedScop
|
|
|
53
54
|
identity: identity.value,
|
|
54
55
|
};
|
|
55
56
|
};
|
|
56
|
-
const collectDoctorIdentity = async (host) => {
|
|
57
|
+
const collectDoctorIdentity = async (host, scope) => {
|
|
57
58
|
const installationPaths = (await host.installationPaths?.()) ?? [];
|
|
58
|
-
const installedSkillIdentity = await host.installedSkillIdentity?.();
|
|
59
|
-
const skillAligned = skillIdentityAligned(installedSkillIdentity);
|
|
60
59
|
const registrations = (await host.clientRegistrations?.()) ?? [];
|
|
60
|
+
const skillClientIds = scope.mode === "audit-wide"
|
|
61
|
+
? registrations.map(({ client }) => client)
|
|
62
|
+
: scope.clients;
|
|
63
|
+
const installedSkillIdentity = await host.installedSkillIdentity?.(skillClientIds);
|
|
64
|
+
const skillAligned = skillIdentityAligned(installedSkillIdentity);
|
|
61
65
|
return {
|
|
62
66
|
checks: [
|
|
63
67
|
...(skillAligned ? [] : [skillIdentityCheck(installedSkillIdentity)]),
|
|
@@ -81,7 +85,6 @@ const collectDoctorIdentity = async (host) => {
|
|
|
81
85
|
skill: {
|
|
82
86
|
installed_version: installedSkillIdentity?.version ?? null,
|
|
83
87
|
installed_tool_count: installedSkillIdentity?.toolCount ?? null,
|
|
84
|
-
installed_catalog_digest: installedSkillIdentity?.catalogDigest ?? null,
|
|
85
88
|
state: installedSkillIdentity === undefined
|
|
86
89
|
? "missing"
|
|
87
90
|
: skillAligned
|
|
@@ -115,23 +118,13 @@ const registrationCheck = (registration) => ({
|
|
|
115
118
|
remediation: registration.remediation,
|
|
116
119
|
});
|
|
117
120
|
const installationState = (paths) => paths.length === 0 ? "unknown" : paths.length === 1 ? "single" : "multiple";
|
|
118
|
-
const homeFromEnvironment = (environment, platform) => {
|
|
119
|
-
const selected = platform === "win32"
|
|
120
|
-
? (environment.USERPROFILE ??
|
|
121
|
-
(environment.HOMEDRIVE !== undefined &&
|
|
122
|
-
environment.HOMEPATH !== undefined
|
|
123
|
-
? `${environment.HOMEDRIVE}${environment.HOMEPATH}`
|
|
124
|
-
: environment.HOME))
|
|
125
|
-
: (environment.HOME ?? environment.USERPROFILE);
|
|
126
|
-
return selected ?? homedir();
|
|
127
|
-
};
|
|
128
121
|
/** Create diagnostics backed by the current process and host commands. */
|
|
129
122
|
export const systemDoctorHost = (options = {}) => {
|
|
130
123
|
const platform = options.platform ?? process.platform;
|
|
131
124
|
const architecture = options.architecture ?? process.arch;
|
|
132
125
|
const environment = options.environment ?? process.env;
|
|
133
126
|
const hostExecFileOutput = options.execFileOutput ?? execFileOutput;
|
|
134
|
-
const homeDirectory =
|
|
127
|
+
const homeDirectory = homeDirectoryFromEnvironment(environment, platform);
|
|
135
128
|
const commandEnvironment = { env: environment };
|
|
136
129
|
return {
|
|
137
130
|
platform,
|
|
@@ -147,10 +140,16 @@ export const systemDoctorHost = (options = {}) => {
|
|
|
147
140
|
macosVersion: () => readMacosVersion(hostExecFileOutput, commandEnvironment),
|
|
148
141
|
linuxDistribution: readLinuxDistribution,
|
|
149
142
|
async validTarget(path) {
|
|
150
|
-
return (await parseBinaryTarget(path,
|
|
143
|
+
return (await parseBinaryTarget(path, {
|
|
144
|
+
cwd: process.cwd(),
|
|
145
|
+
hostArchitecture: architecture,
|
|
146
|
+
})).ok;
|
|
151
147
|
},
|
|
152
148
|
async inspectTarget(path) {
|
|
153
|
-
const result = await parseBinaryTarget(path,
|
|
149
|
+
const result = await parseBinaryTarget(path, {
|
|
150
|
+
cwd: process.cwd(),
|
|
151
|
+
hostArchitecture: architecture,
|
|
152
|
+
});
|
|
154
153
|
if (result.ok)
|
|
155
154
|
return {
|
|
156
155
|
name: "target",
|
|
@@ -159,18 +158,19 @@ export const systemDoctorHost = (options = {}) => {
|
|
|
159
158
|
detail: path,
|
|
160
159
|
};
|
|
161
160
|
const error = result.error;
|
|
161
|
+
const targetError = error instanceof BinaryTargetError ? error : undefined;
|
|
162
162
|
return {
|
|
163
163
|
name: "target",
|
|
164
164
|
ok: false,
|
|
165
|
-
classification:
|
|
165
|
+
classification: targetError?.constraint === "directory_requires_file"
|
|
166
166
|
? "unsupported_target"
|
|
167
167
|
: "config_drift",
|
|
168
168
|
detail: path,
|
|
169
169
|
details: {
|
|
170
|
-
reason: error.
|
|
171
|
-
...(
|
|
170
|
+
reason: targetError?.reason ?? error.message,
|
|
171
|
+
...(targetError?.constraint === undefined
|
|
172
172
|
? {}
|
|
173
|
-
: { constraint:
|
|
173
|
+
: { constraint: targetError.constraint }),
|
|
174
174
|
},
|
|
175
175
|
remediation: analysisErrorRemediationAction(error),
|
|
176
176
|
};
|
|
@@ -180,15 +180,21 @@ export const systemDoctorHost = (options = {}) => {
|
|
|
180
180
|
supportedLinuxHopper: linuxHopperBinarySupported,
|
|
181
181
|
async brewHopperPath() {
|
|
182
182
|
return probeHomebrew(async (command) => {
|
|
183
|
+
let caskroom;
|
|
183
184
|
try {
|
|
184
|
-
|
|
185
|
-
|
|
185
|
+
// Without a cask argument, `--caskroom` does not load Homebrew's
|
|
186
|
+
// cask API, so doctor writes no Homebrew cache files.
|
|
187
|
+
caskroom = (await hostExecFileOutput(command, ["--caskroom"], commandEnvironment)).stdout.trim();
|
|
186
188
|
}
|
|
187
189
|
catch (cause) {
|
|
188
190
|
// best-effort cleanup: optional Homebrew probing; absence means uninstalled.
|
|
189
191
|
void cause;
|
|
190
192
|
return undefined;
|
|
191
193
|
}
|
|
194
|
+
const appdir = await installedCaskAppdir(caskroom, "hopper-disassembler", homeDirectory);
|
|
195
|
+
return appdir === undefined
|
|
196
|
+
? undefined
|
|
197
|
+
: join(appdir, "Hopper Disassembler.app/Contents/MacOS/hopper");
|
|
192
198
|
});
|
|
193
199
|
},
|
|
194
200
|
manualHopperPaths: () => manualHopperPaths(homeDirectory),
|
|
@@ -222,14 +228,14 @@ export const systemDoctorHost = (options = {}) => {
|
|
|
222
228
|
return [];
|
|
223
229
|
}
|
|
224
230
|
},
|
|
225
|
-
installedSkillIdentity: () =>
|
|
231
|
+
installedSkillIdentity: (clientIds) => readInstalledSkillIdentity(homeDirectory, clientIds, claudeCodeSkillsDirectory(homeDirectory, environment)),
|
|
226
232
|
clientRegistrations: () => readClientRegistrationStatuses(homeDirectory, undefined, {
|
|
227
233
|
platform,
|
|
228
234
|
environment,
|
|
229
235
|
}),
|
|
230
236
|
};
|
|
231
237
|
};
|
|
232
|
-
const readMacosVersion = async (run
|
|
238
|
+
const readMacosVersion = async (run, options) => {
|
|
233
239
|
try {
|
|
234
240
|
return (await run("sw_vers", ["-productVersion"], options)).stdout.trim();
|
|
235
241
|
}
|
|
@@ -239,7 +245,7 @@ const readMacosVersion = async (run = execFileOutput, options = { env: process.e
|
|
|
239
245
|
return undefined;
|
|
240
246
|
}
|
|
241
247
|
};
|
|
242
|
-
const executableAvailable = async (path, platform
|
|
248
|
+
const executableAvailable = async (path, platform, run, options) => {
|
|
243
249
|
try {
|
|
244
250
|
await access(path, constants.X_OK);
|
|
245
251
|
if (platform !== "linux")
|
|
@@ -260,7 +266,7 @@ const uncomposedLinuxDemoRuntimeCheck = () => Promise.resolve({
|
|
|
260
266
|
detail: "Linux Hopper private-display diagnostics were not composed",
|
|
261
267
|
remediation: "Run rea doctor through the production CLI adapter.",
|
|
262
268
|
});
|
|
263
|
-
const manualHopperPaths = async (home
|
|
269
|
+
const manualHopperPaths = async (home) => {
|
|
264
270
|
const paths = [];
|
|
265
271
|
for (const root of ["/Applications", join(home, "Applications")]) {
|
|
266
272
|
try {
|
|
@@ -276,25 +282,6 @@ const manualHopperPaths = async (home = homedir()) => {
|
|
|
276
282
|
}
|
|
277
283
|
return paths;
|
|
278
284
|
};
|
|
279
|
-
const readInstalledSkill = (home) => readFile(join(home, ".agents/skills", PRODUCT_IDENTITY.skillName, "SKILL.md"), "utf8");
|
|
280
|
-
const installedSkillIdentity = async (home) => {
|
|
281
|
-
try {
|
|
282
|
-
const content = await readInstalledSkill(home);
|
|
283
|
-
const countText = /^\s{2}tool_count:\s*(\d+)\s*$/mu.exec(content)?.[1];
|
|
284
|
-
return {
|
|
285
|
-
canonical: !(await canonicalSkillNeedsInstall(home)),
|
|
286
|
-
version: /^\s{2}version:\s*"([^"]+)"\s*$/mu.exec(content)?.[1] ?? null,
|
|
287
|
-
toolCount: countText === undefined ? null : Number.parseInt(countText, 10),
|
|
288
|
-
catalogDigest: /^\s{2}catalog_digest:\s*"([a-f0-9]{64})"\s*$/mu.exec(content)?.[1] ??
|
|
289
|
-
null,
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
catch (cause) {
|
|
293
|
-
// best-effort cleanup: optional skill probing; failure means unknown.
|
|
294
|
-
void cause;
|
|
295
|
-
return undefined;
|
|
296
|
-
}
|
|
297
|
-
};
|
|
298
285
|
const uniqueLines = (value) => [
|
|
299
286
|
...new Set(value
|
|
300
287
|
.split(/\r?\n/u)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { homedir } from "node:os";
|
|
2
1
|
import { SUPPORTED_NODE_VERSION_PROSE, supportsNodeVersion, } from "../domain/runtimeVersion.js";
|
|
3
2
|
import { linuxHopperLauncherPath } from "./LinuxHopper.js";
|
|
4
3
|
const DEFAULT_HOPPER = "/Applications/Hopper Disassembler.app/Contents/MacOS/hopper";
|
|
@@ -66,7 +65,7 @@ const hostCheck = async (host) => {
|
|
|
66
65
|
? `${host.platform} ${host.architecture}`
|
|
67
66
|
: `${linuxDistribution.id} ${linuxDistribution.versionId ?? "unknown"}`);
|
|
68
67
|
return check("host", supported, detail, {
|
|
69
|
-
remediation: "REA supports macOS 12+, Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, CachyOS, and the experimental Windows x64 Ghidra P0 boundary.",
|
|
68
|
+
remediation: "REA supports macOS 12+, Ubuntu 24.04+, Fedora 41+, Nobara 44+, 64-bit Arch Linux, CachyOS, and the experimental Windows x64 Ghidra P0 boundary.",
|
|
70
69
|
classification: "unsupported_host",
|
|
71
70
|
});
|
|
72
71
|
};
|
|
@@ -75,7 +74,7 @@ const findHopper = async (host) => {
|
|
|
75
74
|
? [
|
|
76
75
|
DEFAULT_HOPPER,
|
|
77
76
|
SYSTEM_LINUX_HOPPER,
|
|
78
|
-
linuxHopperLauncherPath(host.homeDirectory
|
|
77
|
+
linuxHopperLauncherPath(host.homeDirectory),
|
|
79
78
|
...(await host.manualHopperPaths()),
|
|
80
79
|
]
|
|
81
80
|
: [host.configuredHopperPath];
|
|
@@ -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,20 +8,22 @@ 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
|
-
export const ARTIFACT_GRAPH_PROVIDER = {
|
|
16
|
+
export const ARTIFACT_GRAPH_PROVIDER = Object.freeze({
|
|
15
17
|
id: "rea-artifact-graph",
|
|
16
18
|
name: "REA safe artifact graph provider",
|
|
17
19
|
version: "1",
|
|
18
|
-
};
|
|
20
|
+
});
|
|
19
21
|
/** Provider identity for execution-free managed PE/CLI analysis. */
|
|
20
|
-
export const MANAGED_STATIC_PROVIDER = {
|
|
22
|
+
export const MANAGED_STATIC_PROVIDER = Object.freeze({
|
|
21
23
|
id: "rea-dotnet-static",
|
|
22
24
|
name: "REA managed static analysis provider",
|
|
23
25
|
version: "1",
|
|
24
|
-
};
|
|
26
|
+
});
|
|
25
27
|
/** Provider identity for deterministic managed-code comparison workflows. */
|
|
26
28
|
export const MANAGED_WORKFLOW_PROVIDER = {
|
|
27
29
|
id: "rea-dotnet-workflows",
|
|
@@ -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,30 +1,31 @@
|
|
|
1
|
-
import { link, lstat, mkdtemp, open,
|
|
1
|
+
import { link, lstat, mkdtemp, open, 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, AnalysisResourceConstraintError, } from "../domain/analysisErrorCore.js";
|
|
4
5
|
import { err, ok } from "../domain/result.js";
|
|
6
|
+
import { parseUtf8Json } from "./Utf8JsonInput.js";
|
|
7
|
+
import { readRegularFile } from "./RegularFileRead.js";
|
|
8
|
+
import { NonRegularFileReadError } from "../filesystem/RegularFile.js";
|
|
5
9
|
/** Read JSON data from a regular file at the caller-supplied path. */
|
|
6
10
|
export const readJsonFile = async (path) => {
|
|
7
11
|
const requestedPath = resolve(path);
|
|
8
12
|
try {
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
if (!
|
|
12
|
-
return err(new EvidenceFileError("read", "not-file", { path: requestedPath }));
|
|
13
|
-
const encoded = await readFile(canonicalPath);
|
|
14
|
-
let decoded;
|
|
15
|
-
try {
|
|
16
|
-
decoded = JSON.parse(new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(encoded));
|
|
17
|
-
}
|
|
18
|
-
catch (cause) {
|
|
13
|
+
const encoded = await readRegularFile(requestedPath);
|
|
14
|
+
const decoded = parseUtf8Json(encoded, "read_evidence_file", requestedPath);
|
|
15
|
+
if (!decoded.ok) {
|
|
19
16
|
return err(new EvidenceFileError("read", "invalid-json", {
|
|
20
|
-
cause,
|
|
17
|
+
cause: decoded.cause,
|
|
21
18
|
path: requestedPath,
|
|
22
19
|
}));
|
|
23
20
|
}
|
|
24
|
-
return ok(decoded);
|
|
21
|
+
return ok(decoded.value);
|
|
25
22
|
}
|
|
26
23
|
catch (cause) {
|
|
27
|
-
|
|
24
|
+
if (cause instanceof AnalysisResourceConstraintError)
|
|
25
|
+
return err(cause);
|
|
26
|
+
return err(new EvidenceFileError("read", cause instanceof NonRegularFileReadError
|
|
27
|
+
? "not-file"
|
|
28
|
+
: missingOrIo(cause), {
|
|
28
29
|
cause,
|
|
29
30
|
path: requestedPath,
|
|
30
31
|
}));
|
|
@@ -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;
|
|
@@ -63,7 +63,8 @@ export const parseLinuxDistribution = (text) => {
|
|
|
63
63
|
(id === "arch" ||
|
|
64
64
|
id === "cachyos" ||
|
|
65
65
|
(id === "ubuntu" && versionAtLeast(versionId, 24)) ||
|
|
66
|
-
(id === "fedora" && versionAtLeast(versionId, 41))
|
|
66
|
+
(id === "fedora" && versionAtLeast(versionId, 41)) ||
|
|
67
|
+
(id === "nobara" && versionAtLeast(versionId, 44)));
|
|
67
68
|
const identity = {
|
|
68
69
|
id,
|
|
69
70
|
...(versionId === undefined ? {} : { versionId }),
|
|
@@ -84,7 +85,7 @@ export const readLinuxDistribution = async () => {
|
|
|
84
85
|
}
|
|
85
86
|
};
|
|
86
87
|
/** Download, verify, install, and read back the official Hopper Linux package. */
|
|
87
|
-
export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(), options = {}) => {
|
|
88
|
+
export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(process.env), options = {}) => {
|
|
88
89
|
if (options.signal?.aborted === true)
|
|
89
90
|
return { status: "failed", reason: "cancelled" };
|
|
90
91
|
const distribution = await host.distribution();
|
|
@@ -124,7 +125,8 @@ export const installLinuxHopper = async (host = systemLinuxHopperInstallHost(),
|
|
|
124
125
|
};
|
|
125
126
|
/** Canonical launcher path for a legacy user-local Linux Hopper installation. */
|
|
126
127
|
export const linuxHopperLauncherPath = (home) => join(home, ".local/share/rea/hopper/bin/Hopper");
|
|
127
|
-
|
|
128
|
+
/** Compose package-manager and linker checks from the selected caller environment. */
|
|
129
|
+
export const systemLinuxHopperInstallHost = (environment) => ({
|
|
128
130
|
distribution: readLinuxDistribution,
|
|
129
131
|
async download(url, options) {
|
|
130
132
|
const response = await fetch(url, {
|
|
@@ -138,11 +140,11 @@ const systemLinuxHopperInstallHost = () => ({
|
|
|
138
140
|
},
|
|
139
141
|
createTemporaryDirectory: () => mkdtemp(join(tmpdir(), "rea-hopper-")),
|
|
140
142
|
writeArchive: (path, bytes) => writeFile(path, bytes, { mode: 0o600 }),
|
|
141
|
-
installPackage: installSystemPackage,
|
|
143
|
+
installPackage: (family, archive) => installSystemPackage(family, archive, environment),
|
|
142
144
|
async launcherStatus(path) {
|
|
143
145
|
try {
|
|
144
146
|
await access(path);
|
|
145
|
-
const linked = await execFileOutput("ldd", [path]);
|
|
147
|
+
const linked = await execFileOutput("ldd", [path], { env: environment });
|
|
146
148
|
if (!linuxSharedLibrariesAvailable(`${linked.stdout}\n${linked.stderr}`))
|
|
147
149
|
return "runtime_dependencies";
|
|
148
150
|
return (await linuxHopperBinarySupported(path))
|
|
@@ -175,10 +177,12 @@ export const linuxHopperBinarySupported = async (path) => {
|
|
|
175
177
|
export const linuxHopperLauncherDigestSupported = (digest) => SUPPORTED_HOPPER_SHA256.has(digest);
|
|
176
178
|
/** Interpret ldd output conservatively so a present but broken launcher is unhealthy. */
|
|
177
179
|
export const linuxSharedLibrariesAvailable = (output) => !/(?:=>\s+not found|error while loading shared libraries)/iu.test(output);
|
|
178
|
-
const installSystemPackage = async (family, archive) => {
|
|
180
|
+
const installSystemPackage = async (family, archive, environment) => {
|
|
179
181
|
try {
|
|
180
182
|
for (const command of linuxPackageManagerCommands(family, archive, process.getuid?.() === 0))
|
|
181
|
-
await execFileAsync(command.executable, command.args
|
|
183
|
+
await execFileAsync(command.executable, command.args, {
|
|
184
|
+
env: environment,
|
|
185
|
+
});
|
|
182
186
|
return true;
|
|
183
187
|
}
|
|
184
188
|
catch (cause) {
|