rea-agents 6.0.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 +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- 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 +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- 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 +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- 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 +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- 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 +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- 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/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- 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/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- 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 +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -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 +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- 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 +7 -14
- 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 +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- 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 +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- 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/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- 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/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- 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 +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- 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/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- 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/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -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/domain/javascript/javascriptAstValues.js +20 -0
- 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/javascriptRecovery.js +3 -8
- 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 +106 -5
- 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/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- 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 +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- 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 +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- 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 +21 -16
- 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 +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- 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/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -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 +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +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 +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- 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/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -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/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- 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/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- 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 +157 -0
- package/dist/server/createServer.js +61 -41
- 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 -5
- 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 -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 +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- 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 +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- 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 +20 -3
- 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/ghidra/GhidraDefaults.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,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) {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AnalysisOutputError } from "../domain/analysisErrorCore.js";
|
|
2
|
+
import { err, ok } from "../domain/result.js";
|
|
3
|
+
/** Resolve a caller selector to an observed provider procedure identity. */
|
|
4
|
+
export const resolveProcedureAddress = async (call, procedure, signal) => {
|
|
5
|
+
const result = await call("procedure_address", { procedure }, signal);
|
|
6
|
+
if (!result.ok)
|
|
7
|
+
return result;
|
|
8
|
+
return typeof result.value === "string" && result.value.length > 0
|
|
9
|
+
? ok(result.value)
|
|
10
|
+
: err(new AnalysisOutputError("procedure_address", "provider returned no canonical procedure address"));
|
|
11
|
+
};
|
|
@@ -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,20 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { reconstructionCoverageEvaluationInputSchema } from "../domain/reconstructionCoverageInput.js";
|
|
2
3
|
import { AnalysisInputError } from "../domain/analysisErrorCore.js";
|
|
3
4
|
import {} from "../domain/analysisErrorBase.js";
|
|
4
5
|
import { evaluateReconstructionClosure } from "../domain/reconstructionCoverage.js";
|
|
5
6
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
6
7
|
import { err, ok } from "../domain/result.js";
|
|
8
|
+
import { requestInputError, workflowInputError } from "./workflowInputError.js";
|
|
9
|
+
const OPERATION = "evaluate_reconstruction_coverage";
|
|
7
10
|
/** Evaluate inline reconstruction coverage against a named boundary. */
|
|
8
11
|
export const evaluateReconstructionCoverage = (rawInput, nowEpochMs = Date.now()) => {
|
|
9
12
|
const parsed = reconstructionCoverageEvaluationInputSchema.safeParse(rawInput);
|
|
10
13
|
if (!parsed.success)
|
|
11
|
-
return err(
|
|
12
|
-
cause: parsed.error,
|
|
13
|
-
}));
|
|
14
|
+
return err(requestInputError(OPERATION, parsed.error, rawInput));
|
|
14
15
|
try {
|
|
15
16
|
return ok(jsonValueSchema.parse(evaluateReconstructionClosure(parsed.data.coverage, parsed.data.boundary_id, nowEpochMs)));
|
|
16
17
|
}
|
|
17
18
|
catch (cause) {
|
|
18
|
-
return err(
|
|
19
|
+
return err(cause instanceof TypeError || cause instanceof z.ZodError
|
|
20
|
+
? workflowInputError(OPERATION, cause)
|
|
21
|
+
: new AnalysisInputError(OPERATION, { cause }));
|
|
19
22
|
}
|
|
20
23
|
};
|
|
@@ -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,10 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { AnalysisProtocolError } from "../domain/analysisErrorCore.js";
|
|
3
3
|
import {} from "../domain/analysisErrorBase.js";
|
|
4
4
|
import { createEvidence } from "../domain/evidence.js";
|
|
5
5
|
import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
|
|
6
6
|
import { reconstructionObligationLedgerInputSchema, reconstructionObligationLedgerSchema, } from "../domain/reconstructionObligationLedgerSchemas.js";
|
|
7
7
|
import { err, ok } from "../domain/result.js";
|
|
8
|
+
import { requestInputError, workflowInputError } from "./workflowInputError.js";
|
|
8
9
|
import { JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER } from "./InvestigationProviders.js";
|
|
9
10
|
import { deriveReconstructionObligationCandidates } from "./ReconstructionObligationCandidates.js";
|
|
10
11
|
import { evaluateReconstructionObligationLedger } from "./ReconstructionObligationLedgerEvaluation.js";
|
|
@@ -14,7 +15,7 @@ export const resolveReconstructionObligationLedgerRequest = (input) => {
|
|
|
14
15
|
const parsed = reconstructionObligationLedgerInputSchema.safeParse(input);
|
|
15
16
|
return parsed.success
|
|
16
17
|
? ok(parsed.data)
|
|
17
|
-
: err(
|
|
18
|
+
: err(requestInputError(OPERATION, parsed.error, input));
|
|
18
19
|
};
|
|
19
20
|
/** Build the complete deterministic ledger and wrap it in portable Evidence. */
|
|
20
21
|
export const buildReconstructionObligationLedgerEvidenceValidated = (input) => {
|
|
@@ -30,7 +31,7 @@ export const buildReconstructionObligationLedgerEvidenceValidated = (input) => {
|
|
|
30
31
|
}
|
|
31
32
|
catch (cause) {
|
|
32
33
|
if (cause instanceof z.ZodError)
|
|
33
|
-
return err(
|
|
34
|
+
return err(workflowInputError(OPERATION, cause));
|
|
34
35
|
return err(new AnalysisProtocolError("Reconstruction obligation ledger generation failed", { cause }));
|
|
35
36
|
}
|
|
36
37
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { manualRegistrationRemediation, } from "./SupportedClients.js";
|
|
1
2
|
import { configureDetectedClients } from "./SetupClients.js";
|
|
2
3
|
import { discoverSetupState, planSetupActions } from "./SetupPlan.js";
|
|
3
|
-
import { filterClientsNeedingConfigure, hostRemediation,
|
|
4
|
+
import { filterClientsNeedingConfigure, hostRemediation, systemSetupHost, } from "./SetupHost.js";
|
|
4
5
|
/** Discover, approve, and apply setup actions idempotently. */
|
|
5
6
|
export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
6
7
|
const appliedActions = [];
|
|
@@ -12,22 +13,14 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
12
13
|
const unsupported = await hostRemediation(host, false);
|
|
13
14
|
if (unsupported !== undefined)
|
|
14
15
|
return fail(unsupported);
|
|
15
|
-
const initialState = await host.initialSetupState
|
|
16
|
-
let hopperPath = initialState
|
|
17
|
-
? await host.hopperPath()
|
|
18
|
-
: initialState.hopperPath;
|
|
19
|
-
let providerEnvironment = initialState === undefined
|
|
20
|
-
? await initialProviderEnvironment(host, hopperPath)
|
|
21
|
-
: initialState.providerEnvironment;
|
|
16
|
+
const initialState = await host.initialSetupState(options.readinessScope);
|
|
17
|
+
let { hopperPath, providerEnvironment } = initialState;
|
|
22
18
|
const discovery = await discoverSetupState({
|
|
23
19
|
host,
|
|
24
20
|
providerEnvironment,
|
|
25
21
|
forceHopperInstall: options.installHopper,
|
|
26
22
|
proposeHopper: options.proposeHopper ?? (confirm !== undefined && !options.structured),
|
|
27
|
-
|
|
28
|
-
...(initialState === undefined
|
|
29
|
-
? {}
|
|
30
|
-
: { initialDoctor: initialState.doctor }),
|
|
23
|
+
initialDoctor: initialState.doctor,
|
|
31
24
|
});
|
|
32
25
|
clientStates = discovery.clientStates;
|
|
33
26
|
const clientSelectionAllowed = options.clientIds === undefined &&
|
|
@@ -51,7 +44,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
51
44
|
discovery,
|
|
52
45
|
host,
|
|
53
46
|
providerEnvironment,
|
|
54
|
-
command:
|
|
47
|
+
command: host.registrationCommand,
|
|
55
48
|
clientIds: [],
|
|
56
49
|
installSkill: offerSkillAction,
|
|
57
50
|
});
|
|
@@ -91,7 +84,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
91
84
|
discovery: planDiscovery,
|
|
92
85
|
host,
|
|
93
86
|
providerEnvironment,
|
|
94
|
-
command:
|
|
87
|
+
command: host.registrationCommand,
|
|
95
88
|
clientIds: selectedClientIds,
|
|
96
89
|
installSkill,
|
|
97
90
|
});
|
|
@@ -109,6 +102,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
109
102
|
clientsToConfigure: planned.clientsToConfigure,
|
|
110
103
|
};
|
|
111
104
|
readinessScope = resolvedReadinessScope(options.readinessScope, planSelection);
|
|
105
|
+
const manualRemediation = manualClientsRemediation(planned.selectedClients);
|
|
112
106
|
if (options.dryRun === true)
|
|
113
107
|
return {
|
|
114
108
|
status: "planned",
|
|
@@ -117,6 +111,9 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
117
111
|
clients,
|
|
118
112
|
doctor: summarizeDoctor(discovery.initialDoctor),
|
|
119
113
|
clientStates,
|
|
114
|
+
...(manualRemediation === undefined
|
|
115
|
+
? {}
|
|
116
|
+
: { remediation: manualRemediation }),
|
|
120
117
|
};
|
|
121
118
|
let approved = options.approved || plannedActions.length === 0;
|
|
122
119
|
let interactiveApproval = false;
|
|
@@ -170,7 +167,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
170
167
|
host,
|
|
171
168
|
detectedClients: selectedClients,
|
|
172
169
|
providerEnvironment,
|
|
173
|
-
command:
|
|
170
|
+
command: host.registrationCommand,
|
|
174
171
|
clients,
|
|
175
172
|
appliedActions,
|
|
176
173
|
...(options.onProgress === undefined
|
|
@@ -183,7 +180,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
183
180
|
!(await installSkillAction(host, options, appliedActions)))
|
|
184
181
|
return fail("REA analysis skill could not be installed or verified. Check permissions for `~/.agents/skills`, then rerun setup.");
|
|
185
182
|
const doctor = summarizeDoctor(await host.doctor(readinessScope));
|
|
186
|
-
const remediation = finalSetupRemediation(host.platform, appliedActions.includes("installed_hopper"), doctor.healthy, hopperPath);
|
|
183
|
+
const remediation = combineRemediation(finalSetupRemediation(host.platform, appliedActions.includes("installed_hopper"), doctor.healthy, hopperPath), manualRemediation);
|
|
187
184
|
return {
|
|
188
185
|
status: remediation === undefined ? "ready" : "needs_human",
|
|
189
186
|
plannedActions,
|
|
@@ -236,7 +233,7 @@ const installHopperAction = async (input) => {
|
|
|
236
233
|
return {
|
|
237
234
|
hopperPath: installed.launcherPath,
|
|
238
235
|
providerEnvironment,
|
|
239
|
-
selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment,
|
|
236
|
+
selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, input.host.registrationCommand),
|
|
240
237
|
};
|
|
241
238
|
};
|
|
242
239
|
const installSkillAction = async (host, options, appliedActions) => {
|
|
@@ -277,6 +274,13 @@ const setupFailure = async (remediation, [host, plannedActions, appliedActions,
|
|
|
277
274
|
};
|
|
278
275
|
};
|
|
279
276
|
const emitProgress = (options, event) => options.onProgress?.(event);
|
|
277
|
+
const manualClientsRemediation = (clients) => clients
|
|
278
|
+
.map((client) => manualRegistrationRemediation(client.name))
|
|
279
|
+
.find((remediation) => remediation !== undefined);
|
|
280
|
+
const combineRemediation = (...parts) => {
|
|
281
|
+
const present = parts.filter((part) => part !== undefined && part !== "");
|
|
282
|
+
return present.length === 0 ? undefined : present.join(" ");
|
|
283
|
+
};
|
|
280
284
|
const finalSetupRemediation = (platform, installedHopper, healthy, hopperPath) => {
|
|
281
285
|
if (platform === "darwin" && installedHopper)
|
|
282
286
|
return "Open Hopper, choose its demo mode or activate a license, then rerun rea doctor --json.";
|
|
@@ -1,21 +1,13 @@
|
|
|
1
|
-
import { clientRegistrationEntry, clientConfigurationValuesEqual, clientServerPath, legacyClientServerPath, parseClientConfiguration, serializeClientConfiguration, withClientServers, } from "./ClientConfigurationDocument.js";
|
|
1
|
+
import { clientRegistrationEntry, clientConfigurationValuesEqual, clientServerPath, grokServerListedDisabled, legacyClientServerPath, parseClientConfiguration, serializeClientConfiguration, withClientServers, } from "./ClientConfigurationDocument.js";
|
|
2
2
|
import { constants as fsConstants } from "node:fs";
|
|
3
3
|
import { copyFile, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
4
4
|
import { dirname } from "node:path";
|
|
5
5
|
import writeFileAtomic from "write-file-atomic";
|
|
6
6
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
7
|
+
import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
|
|
7
8
|
import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
|
|
8
9
|
import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
|
|
9
|
-
const defaultCommand = () =>
|
|
10
|
-
"npx",
|
|
11
|
-
"-y",
|
|
12
|
-
PRODUCT_IDENTITY.registrationPackageSpecifier,
|
|
13
|
-
"mcp",
|
|
14
|
-
];
|
|
15
|
-
/** Back up, atomically update, and semantically read back one JSON MCP configuration. */
|
|
16
|
-
export const configureJsonClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "json");
|
|
17
|
-
/** Back up, atomically update, and semantically read back one TOML MCP configuration. */
|
|
18
|
-
export const configureTomlClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "toml");
|
|
10
|
+
const defaultCommand = () => npxRegistrationCommand();
|
|
19
11
|
/** Configure one supported client's native stdio MCP registration shape. */
|
|
20
12
|
export const configureClientConfiguration = (client, environment = {}, command = defaultCommand()) => {
|
|
21
13
|
if (client.format === undefined || client.format === "unsupported")
|
|
@@ -36,7 +28,7 @@ const configureClientDocument = async (client, environment, command, format) =>
|
|
|
36
28
|
}
|
|
37
29
|
let parsed;
|
|
38
30
|
try {
|
|
39
|
-
parsed = parseClientConfiguration(original ?? (format === "toml" ? "" : "{}"), format);
|
|
31
|
+
parsed = parseClientConfiguration(original ?? (format === "toml" || format === "grok" ? "" : "{}"), format);
|
|
40
32
|
}
|
|
41
33
|
catch (cause) {
|
|
42
34
|
// Malformed existing configuration fails the readback gate.
|
|
@@ -163,14 +155,17 @@ const restoreConfig = async (path, original) => {
|
|
|
163
155
|
void cause;
|
|
164
156
|
}
|
|
165
157
|
};
|
|
166
|
-
/** Whether REA's entry matches
|
|
167
|
-
const registrationCurrent = (parsed, desired) => clientConfigurationValuesEqual(parsed.servers[PRODUCT_IDENTITY.mcpServerKey], desired) &&
|
|
158
|
+
/** Whether REA's entry matches, no legacy entry remains, and Grok is not suppressing it. */
|
|
159
|
+
const registrationCurrent = (parsed, desired) => clientConfigurationValuesEqual(parsed.servers[PRODUCT_IDENTITY.mcpServerKey], desired) &&
|
|
160
|
+
!Object.hasOwn(parsed.legacyServers, PRODUCT_IDENTITY.mcpServerKey) &&
|
|
161
|
+
!(parsed.dialect === "grok" &&
|
|
162
|
+
grokServerListedDisabled(parsed.document, PRODUCT_IDENTITY.mcpServerKey));
|
|
168
163
|
const clientConfigurationDesired = (client, providerEnvironment, command, format) => {
|
|
169
164
|
const environment = Object.fromEntries(Object.entries(providerEnvironment).sort(([left], [right]) => left.localeCompare(right)));
|
|
170
165
|
const registration = clientRegistrationEntry(format ?? "json", command.length === 0 ? [PRODUCT_IDENTITY.cliBinary, "mcp"] : command, environment);
|
|
171
166
|
return {
|
|
172
167
|
...registration,
|
|
173
|
-
...(client.name === "codex"
|
|
168
|
+
...(client.name === "codex" || client.name === "grok_build"
|
|
174
169
|
? {
|
|
175
170
|
startup_timeout_sec: MCP_STARTUP_POLICY.codexStartupTimeoutSeconds,
|
|
176
171
|
}
|
|
@@ -1,19 +1,19 @@
|
|
|
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";
|
|
4
|
+
import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
|
|
5
5
|
import { SUPPORTED_NODE_VERSION_PROSE, supportsNodeVersion, } from "../domain/runtimeVersion.js";
|
|
6
6
|
import { runDoctor, systemDoctorHost } from "./Doctor.js";
|
|
7
|
-
import { installLinuxHopper, readLinuxDistribution } from "./LinuxHopper.js";
|
|
8
|
-
import { installMacHopper } from "./MacHopper.js";
|
|
7
|
+
import { installLinuxHopper, readLinuxDistribution, systemLinuxHopperInstallHost, } from "./LinuxHopper.js";
|
|
8
|
+
import { installMacHopper, systemMacHopperInstallHost } from "./MacHopper.js";
|
|
9
9
|
import { supportedClients } from "./SupportedClients.js";
|
|
10
10
|
import { canonicalSkillNeedsInstall, installCanonicalSkill, } from "./SetupSkill.js";
|
|
11
11
|
import { clientConfigurationAligned, configureClientConfiguration, inspectClientConfiguration, } from "./SetupClientConfiguration.js";
|
|
12
12
|
import { setupInstallFailure } from "./SetupInstallFailure.js";
|
|
13
13
|
import { providerRegistrationEnvironment } from "./SetupRegistrationEnvironment.js";
|
|
14
14
|
/** Resolve the executable and arguments used in a managed MCP registration. */
|
|
15
|
-
export const setupRegistrationCommand = (platform, useNpmRunner
|
|
16
|
-
?
|
|
15
|
+
export const setupRegistrationCommand = (platform, useNpmRunner) => useNpmRunner
|
|
16
|
+
? npxRegistrationCommand(platform)
|
|
17
17
|
: platform === "win32"
|
|
18
18
|
? [
|
|
19
19
|
process.execPath,
|
|
@@ -25,10 +25,6 @@ export const filterClientsNeedingConfigure = async (host, detectedClients, provi
|
|
|
25
25
|
const needs = await Promise.all(detectedClients.map((client) => host.clientNeedsConfigure(client, providerEnvironment, command)));
|
|
26
26
|
return detectedClients.filter((_, index) => needs[index]);
|
|
27
27
|
};
|
|
28
|
-
export const initialProviderEnvironment = async (host, hopperPath) => ({
|
|
29
|
-
...(await host.providerEnvironment?.()),
|
|
30
|
-
...(hopperPath === undefined ? {} : { HOPPER_LAUNCHER_PATH: hopperPath }),
|
|
31
|
-
});
|
|
32
28
|
export const hostRemediation = async (host, installHopper) => {
|
|
33
29
|
if (!supportsNodeVersion(host.nodeVersion))
|
|
34
30
|
return `Install ${SUPPORTED_NODE_VERSION_PROSE} and rerun setup.`;
|
|
@@ -47,14 +43,17 @@ export const hostRemediation = async (host, installHopper) => {
|
|
|
47
43
|
return "Automated Hopper setup supports Ubuntu 24.04+, Fedora 41+, 64-bit Arch Linux, and CachyOS; configure an existing supported provider instead.";
|
|
48
44
|
};
|
|
49
45
|
/** Production setup effects for Hopper, agent configuration, and the canonical skill directory. */
|
|
50
|
-
export const systemSetupHost = (
|
|
46
|
+
export const systemSetupHost = (selectedDoctorHost = undefined, environment = process.env) => {
|
|
47
|
+
const doctorHost = selectedDoctorHost ?? systemDoctorHost({ environment });
|
|
51
48
|
const platform = doctorHost.platform;
|
|
49
|
+
const { homeDirectory } = doctorHost;
|
|
52
50
|
return {
|
|
53
51
|
platform,
|
|
52
|
+
homeDirectory,
|
|
53
|
+
registrationCommand: setupRegistrationCommand(platform, environment.npm_command === "exec"),
|
|
54
54
|
nodeVersion: process.versions.node,
|
|
55
55
|
macosVersion: () => doctorHost.macosVersion(),
|
|
56
56
|
linuxDistribution: readLinuxDistribution,
|
|
57
|
-
hopperPath: async () => (await runDoctor(undefined, doctorHost)).hopperPath,
|
|
58
57
|
initialSetupState: async (scope) => {
|
|
59
58
|
const diagnosis = await runDoctor(undefined, doctorHost, scope);
|
|
60
59
|
return {
|
|
@@ -70,39 +69,32 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
|
|
|
70
69
|
doctor: diagnosis,
|
|
71
70
|
};
|
|
72
71
|
},
|
|
73
|
-
providerEnvironment: async () => {
|
|
74
|
-
const diagnosis = await runDoctor(undefined, doctorHost);
|
|
75
|
-
return {
|
|
76
|
-
...providerRegistrationEnvironment(diagnosis.providerInspections ?? []),
|
|
77
|
-
...(diagnosis.hopperPath === undefined
|
|
78
|
-
? {}
|
|
79
|
-
: { HOPPER_LAUNCHER_PATH: diagnosis.hopperPath }),
|
|
80
|
-
};
|
|
81
|
-
},
|
|
82
72
|
installHopper: async (replaceExisting) => {
|
|
83
73
|
const result = platform === "linux"
|
|
84
|
-
? await installLinuxHopper()
|
|
85
|
-
: await installMacHopper({ replaceExisting });
|
|
74
|
+
? await installLinuxHopper(systemLinuxHopperInstallHost(environment))
|
|
75
|
+
: await installMacHopper({ replaceExisting }, systemMacHopperInstallHost(homeDirectory, environment));
|
|
86
76
|
if (result.status === "installed")
|
|
87
77
|
return result;
|
|
88
78
|
return setupInstallFailure(result.reason);
|
|
89
79
|
},
|
|
90
|
-
detectedClients: () => detectClients(
|
|
91
|
-
supportedClients: () => Promise.resolve(supportedClients(
|
|
80
|
+
detectedClients: () => detectClients(homeDirectory, platform, environment),
|
|
81
|
+
supportedClients: () => Promise.resolve(supportedClients(homeDirectory, platform, environment)),
|
|
92
82
|
configureClient: (client, providerEnvironment, command) => client.format === "unsupported"
|
|
93
83
|
? Promise.resolve({ status: "skipped" })
|
|
94
84
|
: configureClientConfiguration(client, providerEnvironment, command),
|
|
95
|
-
clientNeedsConfigure: (client, providerEnvironment, command) =>
|
|
85
|
+
clientNeedsConfigure: (client, providerEnvironment, command) => client.format === "unsupported"
|
|
86
|
+
? Promise.resolve(false)
|
|
87
|
+
: clientConfigurationAligned(client, providerEnvironment, command).then((aligned) => !aligned),
|
|
96
88
|
inspectClientConfiguration: inspectClientConfiguration,
|
|
97
|
-
skillNeedsInstall: () => canonicalSkillNeedsInstall(
|
|
98
|
-
installSkill: () => installCanonicalSkill(
|
|
89
|
+
skillNeedsInstall: () => canonicalSkillNeedsInstall(homeDirectory),
|
|
90
|
+
installSkill: () => installCanonicalSkill(homeDirectory),
|
|
99
91
|
doctor: (scope) => runDoctor(undefined, doctorHost, scope),
|
|
100
92
|
};
|
|
101
93
|
};
|
|
102
94
|
/** Detect supported agents from their config files or stable installation markers. */
|
|
103
|
-
export const detectClients = async (home) => {
|
|
95
|
+
export const detectClients = async (home, platform = process.platform, environment = process.env) => {
|
|
104
96
|
const detected = [];
|
|
105
|
-
for (const candidate of supportedClients(home)) {
|
|
97
|
+
for (const candidate of supportedClients(home, platform, environment)) {
|
|
106
98
|
const [hasConfig, hasMarker] = await Promise.all([
|
|
107
99
|
exists(candidate.configPath),
|
|
108
100
|
candidate.markerPath === undefined ? false : exists(candidate.markerPath),
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { homedir } from "node:os";
|
|
2
1
|
import { join } from "node:path";
|
|
3
2
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
4
3
|
import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
|
|
@@ -6,7 +5,7 @@ import { linuxHopperInstallDisclosure, } from "./LinuxHopper.js";
|
|
|
6
5
|
import { macHopperInstallDisclosure } from "./MacHopper.js";
|
|
7
6
|
/** Discover supported clients and current registrations without mutation. */
|
|
8
7
|
export const discoverSetupState = async (input) => {
|
|
9
|
-
const
|
|
8
|
+
const { initialDoctor } = input;
|
|
10
9
|
const linuxHopperRepairNeeded = initialDoctor.checks.some(({ name, ok, detail }) => !ok &&
|
|
11
10
|
(name === "hopper-demo-runtime" ||
|
|
12
11
|
(name === "hopper-version" && detail === "/opt/hopper/bin/Hopper")));
|
|
@@ -22,7 +21,7 @@ export const discoverSetupState = async (input) => {
|
|
|
22
21
|
(Object.keys(input.providerEnvironment).length === 0 ||
|
|
23
22
|
linuxHopperRepairNeeded));
|
|
24
23
|
const [clients, detectedClients, skillNeedsInstall] = await Promise.all([
|
|
25
|
-
input.host.supportedClients
|
|
24
|
+
input.host.supportedClients(),
|
|
26
25
|
input.host.detectedClients(),
|
|
27
26
|
input.host.skillNeedsInstall(),
|
|
28
27
|
]);
|
|
@@ -85,7 +84,7 @@ export const planSetupActions = async (input) => {
|
|
|
85
84
|
});
|
|
86
85
|
const inspections = await Promise.all(selectedClients.map(async (client) => ({
|
|
87
86
|
client,
|
|
88
|
-
inspection:
|
|
87
|
+
inspection: await input.host.inspectClientConfiguration(client, input.providerEnvironment, input.command),
|
|
89
88
|
})));
|
|
90
89
|
const invalid = inspections.find(({ inspection }) => inspection.status === "invalid");
|
|
91
90
|
if (invalid?.inspection.status === "invalid") {
|
|
@@ -96,9 +95,11 @@ export const planSetupActions = async (input) => {
|
|
|
96
95
|
blocker: `${invalid.client.displayName ?? invalid.client.name}: ${invalid.inspection.remediation}`,
|
|
97
96
|
};
|
|
98
97
|
}
|
|
99
|
-
const clientPlans = inspections.flatMap(({ client, inspection }) =>
|
|
100
|
-
inspection.status === "
|
|
101
|
-
|
|
98
|
+
const clientPlans = inspections.flatMap(({ client, inspection }) => client.format !== "unsupported" &&
|
|
99
|
+
(inspection.status === "create" ||
|
|
100
|
+
inspection.status === "update" ||
|
|
101
|
+
(input.discovery.installHopper &&
|
|
102
|
+
inspection.status === "already_current"))
|
|
102
103
|
? [
|
|
103
104
|
{
|
|
104
105
|
client,
|
|
@@ -115,6 +116,7 @@ export const planSetupActions = async (input) => {
|
|
|
115
116
|
return {
|
|
116
117
|
plannedActions: setupPlan({
|
|
117
118
|
platform: input.host.platform,
|
|
119
|
+
homeDirectory: input.host.homeDirectory,
|
|
118
120
|
installHopper: input.discovery.installHopper,
|
|
119
121
|
installSkill: input.installSkill,
|
|
120
122
|
clients: clientPlans,
|
|
@@ -137,7 +139,7 @@ const setupPlan = (input) => [
|
|
|
137
139
|
kind: "install_hopper",
|
|
138
140
|
label: "Hopper deep-analysis provider",
|
|
139
141
|
target: input.platform === "darwin"
|
|
140
|
-
? join(
|
|
142
|
+
? join(input.homeDirectory, "Applications/Hopper Disassembler.app")
|
|
141
143
|
: "system package manager",
|
|
142
144
|
detail: input.platform === "linux"
|
|
143
145
|
? "Download, verify, and install Hopper plus its Xvfb demo-session dependencies. For the supported demo build, REA uses a private display and selects Hopper's offered demo mode for each analysis session."
|
|
@@ -173,7 +175,7 @@ const setupPlan = (input) => [
|
|
|
173
175
|
id: "install_skill",
|
|
174
176
|
kind: "install_skill",
|
|
175
177
|
label: "REA reverse-engineering skill",
|
|
176
|
-
target: join(
|
|
178
|
+
target: join(input.homeDirectory, ".agents/skills", PRODUCT_IDENTITY.skillName),
|
|
177
179
|
detail: "Install or update the bundled REA reverse-engineering skill and on-demand references.",
|
|
178
180
|
external: false,
|
|
179
181
|
operation: "install",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
1
|
+
import { isAbsolute, join } from "node:path";
|
|
2
2
|
import { lstatSync } from "node:fs";
|
|
3
3
|
const vscodeUserDirectory = ({ home, platform, env, }) => {
|
|
4
4
|
if (platform === "win32")
|
|
@@ -17,6 +17,23 @@ const claudeDesktopDirectory = ({ home, platform, env, }) => {
|
|
|
17
17
|
const claudeCodeConfigDirectory = ({ home, env }) => env.CLAUDE_CONFIG_DIR ?? home;
|
|
18
18
|
const claudeCodeMarkerDirectory = ({ home, env }) => env.CLAUDE_CONFIG_DIR ?? join(home, ".claude");
|
|
19
19
|
const codexDirectory = ({ home, env }) => env.CODEX_HOME ?? join(home, ".codex");
|
|
20
|
+
const grokDirectory = ({ home, env }) => env.GROK_HOME ?? join(home, ".grok");
|
|
21
|
+
/** Grok Bot uses an absolute SAND_DATA_ROOT; anything else stays ~/.grokbot. */
|
|
22
|
+
const grokBotDirectory = ({ home, env }) => {
|
|
23
|
+
const root = env.SAND_DATA_ROOT;
|
|
24
|
+
return root !== undefined && root !== "" && isAbsolute(root)
|
|
25
|
+
? root
|
|
26
|
+
: join(home, ".grokbot");
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Grok Bot stores connectors in the signed-in account and runs them on its
|
|
30
|
+
* hosted computer. The data directory is only a detection marker.
|
|
31
|
+
*/
|
|
32
|
+
export const GROK_BOT_MANUAL_REGISTRATION_REMEDIATION = "Grok Bot keeps connectors in the signed-in account and runs them on its hosted computer. Setup does not write that account store, and a data-directory mcp.json is not a registration. In the Grok Bot chat, add a custom MCP server named rea that runs on the Bot's computer with `npx -y rea-agents@<version> mcp`. Do not put credentials in the command or arguments. A stdio server on this machine is not attached.";
|
|
33
|
+
/** Remediation for a client whose connector is not a local configuration file. */
|
|
34
|
+
export const manualRegistrationRemediation = (clientName) => clientName === "grok_bot"
|
|
35
|
+
? GROK_BOT_MANUAL_REGISTRATION_REMEDIATION
|
|
36
|
+
: undefined;
|
|
20
37
|
const copilotDirectory = ({ home, env }) => env.COPILOT_HOME ?? join(home, ".copilot");
|
|
21
38
|
const commandCodeDirectory = ({ home }) => join(home, ".commandcode");
|
|
22
39
|
const opencodeDirectory = ({ home, env }) => join(env.XDG_CONFIG_HOME ?? join(home, ".config"), "opencode");
|
|
@@ -133,6 +150,20 @@ export const SUPPORTED_CLIENT_DEFINITIONS = [
|
|
|
133
150
|
markerPath: vscodeUserDirectory,
|
|
134
151
|
format: "vscode",
|
|
135
152
|
},
|
|
153
|
+
{
|
|
154
|
+
name: "grok_build",
|
|
155
|
+
displayName: "Grok Build",
|
|
156
|
+
configPath: (context) => join(grokDirectory(context), "config.toml"),
|
|
157
|
+
markerPath: grokDirectory,
|
|
158
|
+
format: "grok",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: "grok_bot",
|
|
162
|
+
displayName: "Grok Bot",
|
|
163
|
+
configPath: grokBotDirectory,
|
|
164
|
+
markerPath: grokBotDirectory,
|
|
165
|
+
format: "unsupported",
|
|
166
|
+
},
|
|
136
167
|
];
|
|
137
168
|
const resolvePath = (path, context) => typeof path === "function" ? path(context) : join(context.home, ...path);
|
|
138
169
|
/** Describe every client location that setup, doctor, or uninstall may inspect. */
|
|
@@ -141,7 +172,9 @@ export const supportedClients = (home, platform = process.platform, env = {
|
|
|
141
172
|
CLAUDE_CONFIG_DIR: process.env.CLAUDE_CONFIG_DIR,
|
|
142
173
|
CODEX_HOME: process.env.CODEX_HOME,
|
|
143
174
|
COPILOT_HOME: process.env.COPILOT_HOME,
|
|
175
|
+
GROK_HOME: process.env.GROK_HOME,
|
|
144
176
|
OPENCODE_CONFIG: process.env.OPENCODE_CONFIG,
|
|
177
|
+
SAND_DATA_ROOT: process.env.SAND_DATA_ROOT,
|
|
145
178
|
XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME,
|
|
146
179
|
}) => {
|
|
147
180
|
const context = { home, platform, env };
|