rea-agents 3.1.0 → 3.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 +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityInventory.js +10 -15
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -96
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +19 -45
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -93
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +15 -24
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +0 -54
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +2 -2
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -54
- package/dist/domain/appleApplication.js +24 -67
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +20 -19
- package/dist/domain/callPath.js +47 -167
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +2 -7
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +1 -5
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +36 -38
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +33 -73
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +4 -12
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { WINDOWS_NATIVE_AUTHORITY_UNAVAILABLE_REASON } from "../process/WindowsAuthority.js";
|
|
2
2
|
import { GENERATED_MCP_TOOL_CATALOG } from "../generatedMcpToolCatalog.js";
|
|
3
|
-
import { GHIDRA_DECOMPILE_REQUEST_TIMEOUT_MS, GHIDRA_MAX_LINE_BYTES, GHIDRA_REQUEST_TIMEOUT_MS, } from "./GhidraDefaults.js";
|
|
4
3
|
import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
|
|
5
4
|
import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
|
|
6
5
|
/** Public identity committed by every Ghidra-backed observation. */
|
|
@@ -17,27 +16,9 @@ export const GHIDRA_PROVIDER_TOOL_CONTRACTS = Object.freeze([...GHIDRA_INVENTORY
|
|
|
17
16
|
throw new TypeError(`Missing provider-neutral contract for ${operation}`);
|
|
18
17
|
return contract;
|
|
19
18
|
}));
|
|
20
|
-
const PAGINATED_OPERATIONS = new Set([
|
|
21
|
-
"list_names",
|
|
22
|
-
"list_procedures",
|
|
23
|
-
"list_strings",
|
|
24
|
-
"search_procedures",
|
|
25
|
-
"search_strings",
|
|
26
|
-
"procedure_references",
|
|
27
|
-
"read_function_instructions",
|
|
28
|
-
"analyze_function",
|
|
29
|
-
]);
|
|
30
|
-
const SEARCH_OPERATIONS = new Set([
|
|
31
|
-
"search_procedures",
|
|
32
|
-
"search_strings",
|
|
33
|
-
]);
|
|
34
|
-
const DECOMPILE_OPERATIONS = new Set([
|
|
35
|
-
"procedure_pseudo_code",
|
|
36
|
-
"analyze_function",
|
|
37
|
-
]);
|
|
38
19
|
/** Health limitations shared by every Ghidra-backed capability. */
|
|
39
20
|
export const healthLimitations = Object.freeze([
|
|
40
|
-
"The session serves operations only after default
|
|
21
|
+
"The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.",
|
|
41
22
|
"The imported Program and temporary project are ephemeral, read-only to REA, and deleted on close.",
|
|
42
23
|
]);
|
|
43
24
|
/** Additional limitations applied to the experimental Windows x64 P0 boundary. */
|
|
@@ -73,7 +54,6 @@ export const limitationsFor = (operation) => {
|
|
|
73
54
|
return [
|
|
74
55
|
...common,
|
|
75
56
|
"Only Ghidra-defined string Data is observed; charset is reported, while a non-missing terminator cannot distinguish a present terminator from a fixed or Pascal layout.",
|
|
76
|
-
"Returned values are bounded to 1,024 Unicode code points and mark value_truncated instead of silently crossing the wire budget.",
|
|
77
57
|
];
|
|
78
58
|
case "list_segments":
|
|
79
59
|
return [
|
|
@@ -82,26 +62,23 @@ export const limitationsFor = (operation) => {
|
|
|
82
62
|
];
|
|
83
63
|
case "search_procedures":
|
|
84
64
|
case "search_strings":
|
|
85
|
-
return
|
|
86
|
-
...common,
|
|
87
|
-
"Literal search enforces 1,000,000 cumulative work units; regex mode also accepts only a conservative finite Java-regex subset with 10,000 static paths and 4,096 UTF-16 code units per candidate.",
|
|
88
|
-
];
|
|
65
|
+
return common;
|
|
89
66
|
case "procedure_pseudo_code":
|
|
90
67
|
return [
|
|
91
68
|
...common,
|
|
92
|
-
"Pseudocode is Ghidra decompiler output, not original source and not text-equivalent to Hopper output
|
|
69
|
+
"Pseudocode is Ghidra decompiler output, not original source and not text-equivalent to Hopper output.",
|
|
93
70
|
"External functions and functions without an analyzable body return null; other decompiler failures remain explicit.",
|
|
94
71
|
];
|
|
95
72
|
case "read_function_instructions":
|
|
96
73
|
return [
|
|
97
74
|
...common,
|
|
98
|
-
"This
|
|
75
|
+
"This fast path reads only the requested function and does not invoke the decompiler or whole-program string/name inventories.",
|
|
99
76
|
"Instruction text is Ghidra-specific and does not claim textual equivalence with Hopper output.",
|
|
100
77
|
];
|
|
101
78
|
case "procedure_assembly":
|
|
102
79
|
return [
|
|
103
80
|
...common,
|
|
104
|
-
"Assembly is Ghidra Listing text and
|
|
81
|
+
"Assembly is Ghidra Listing text and does not claim textual equivalence with Hopper output.",
|
|
105
82
|
];
|
|
106
83
|
case "procedure_callers":
|
|
107
84
|
case "procedure_callees":
|
|
@@ -120,7 +97,6 @@ export const limitationsFor = (operation) => {
|
|
|
120
97
|
...common,
|
|
121
98
|
"Reference kinds are direct Ghidra ReferenceManager observations; unresolved computed flows without a target are absent and remain unknown.",
|
|
122
99
|
"Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
|
|
123
|
-
"Instruction scans stop at max_instructions; a truncated scan reports an unknown total and no false continuation.",
|
|
124
100
|
];
|
|
125
101
|
case "analyze_function":
|
|
126
102
|
return [
|
|
@@ -128,7 +104,7 @@ export const limitationsFor = (operation) => {
|
|
|
128
104
|
"The dossier combines Ghidra FunctionManager, Listing, ReferenceManager, BasicBlockModel, and decompiler observations; provider-specific pseudocode and assembly are not cross-provider text invariants.",
|
|
129
105
|
"Resolved reference metadata identifies computed, indirect, external, call, jump, and data edges; unresolved targetless flows remain unknown, and function classifications distinguish thunks and externals.",
|
|
130
106
|
"Synthetic Ghidra entry-point references without actionable memory sources are omitted.",
|
|
131
|
-
"The Java bridge serializes one function request per Program
|
|
107
|
+
"The Java bridge serializes one function request per Program and lets each decompilation run until it completes or the caller cancels.",
|
|
132
108
|
];
|
|
133
109
|
default:
|
|
134
110
|
return common;
|
|
@@ -142,14 +118,8 @@ export const CAPABILITIES = Object.freeze(GHIDRA_PROVIDER_TOOL_CONTRACTS.map((co
|
|
|
142
118
|
return Object.freeze({
|
|
143
119
|
provider: GHIDRA_PROVIDER_IDENTITY,
|
|
144
120
|
operation,
|
|
145
|
-
inputContractVersion: 1,
|
|
146
|
-
outputContractVersion: 1,
|
|
147
121
|
available: true,
|
|
148
122
|
reason: null,
|
|
149
|
-
pagination: PAGINATED_OPERATIONS.has(contract.name)
|
|
150
|
-
? "offset"
|
|
151
|
-
: "none",
|
|
152
|
-
exhaustive: !PAGINATED_OPERATIONS.has(contract.name),
|
|
153
123
|
effects: Object.freeze({
|
|
154
124
|
mutatesArtifact: false,
|
|
155
125
|
launchesProcess: true,
|
|
@@ -159,17 +129,6 @@ export const CAPABILITIES = Object.freeze(GHIDRA_PROVIDER_TOOL_CONTRACTS.map((co
|
|
|
159
129
|
changesPermissions: false,
|
|
160
130
|
requiresRoot: false,
|
|
161
131
|
}),
|
|
162
|
-
limits: Object.freeze({
|
|
163
|
-
maxResults: PAGINATED_OPERATIONS.has(contract.name)
|
|
164
|
-
? SEARCH_OPERATIONS.has(contract.name)
|
|
165
|
-
? 100
|
|
166
|
-
: 500
|
|
167
|
-
: null,
|
|
168
|
-
maxPayloadBytes: GHIDRA_MAX_LINE_BYTES,
|
|
169
|
-
timeoutMs: DECOMPILE_OPERATIONS.has(contract.name)
|
|
170
|
-
? GHIDRA_DECOMPILE_REQUEST_TIMEOUT_MS
|
|
171
|
-
: GHIDRA_REQUEST_TIMEOUT_MS,
|
|
172
|
-
}),
|
|
173
132
|
limitations: Object.freeze(limitationsFor(contract.name)),
|
|
174
133
|
});
|
|
175
134
|
}));
|
|
@@ -1,41 +1,28 @@
|
|
|
1
|
-
import { performance } from "node:perf_hooks";
|
|
2
1
|
import { err } from "../domain/result.js";
|
|
3
|
-
/**
|
|
2
|
+
/** FIFO that admits one Ghidra Program request at a time. */
|
|
4
3
|
export class GhidraRequestQueue {
|
|
5
|
-
maximum;
|
|
6
4
|
execute;
|
|
7
5
|
failure;
|
|
8
6
|
#queue = [];
|
|
9
7
|
#active = false;
|
|
10
|
-
|
|
11
|
-
constructor(maximum, execute, failure) {
|
|
12
|
-
this.maximum = maximum;
|
|
8
|
+
constructor(execute, failure) {
|
|
13
9
|
this.execute = execute;
|
|
14
10
|
this.failure = failure;
|
|
15
11
|
}
|
|
16
|
-
/** Queue one request,
|
|
12
|
+
/** Queue one request until it completes, is cancelled, or the session closes. */
|
|
17
13
|
run(method, parameters, options) {
|
|
18
14
|
if (options.signal?.aborted === true)
|
|
19
15
|
return Promise.resolve(err(this.failure("cancelled", "Ghidra request was cancelled")));
|
|
20
|
-
if (options.timeoutMs <= 0)
|
|
21
|
-
return Promise.resolve(err(this.failure("timeout", "Ghidra request deadline elapsed", options.timeoutMs)));
|
|
22
|
-
if (this.#size >= this.maximum)
|
|
23
|
-
return Promise.resolve(err(this.failure("protocol", `Ghidra serial request queue reached its ${String(this.maximum)}-request limit`)));
|
|
24
|
-
this.#size += 1;
|
|
25
16
|
return new Promise((resolve) => {
|
|
26
17
|
let entry;
|
|
27
18
|
const onAbort = options.signal === undefined
|
|
28
19
|
? undefined
|
|
29
20
|
: () => this.#rejectQueued(entry, err(this.failure("cancelled", "Ghidra request was cancelled")));
|
|
30
|
-
const timer = setTimeout(() => this.#rejectQueued(entry, err(this.failure("timeout", "Ghidra request deadline elapsed in the serial queue", options.timeoutMs))), options.timeoutMs);
|
|
31
21
|
entry = {
|
|
32
22
|
method,
|
|
33
23
|
parameters,
|
|
34
24
|
signal: options.signal,
|
|
35
|
-
timeoutMs: options.timeoutMs,
|
|
36
|
-
deadline: performance.now() + options.timeoutMs,
|
|
37
25
|
resolve,
|
|
38
|
-
timer,
|
|
39
26
|
onAbort,
|
|
40
27
|
};
|
|
41
28
|
this.#queue.push(entry);
|
|
@@ -48,7 +35,6 @@ export class GhidraRequestQueue {
|
|
|
48
35
|
failQueued(failure) {
|
|
49
36
|
for (const entry of this.#queue.splice(0)) {
|
|
50
37
|
this.#release(entry);
|
|
51
|
-
this.#size -= 1;
|
|
52
38
|
entry.resolve(err(failure));
|
|
53
39
|
}
|
|
54
40
|
}
|
|
@@ -59,25 +45,17 @@ export class GhidraRequestQueue {
|
|
|
59
45
|
if (entry === undefined)
|
|
60
46
|
return;
|
|
61
47
|
this.#release(entry);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
this.#size -= 1;
|
|
65
|
-
entry.resolve(err(entry.signal?.aborted === true
|
|
66
|
-
? this.failure("cancelled", "Ghidra request was cancelled")
|
|
67
|
-
: this.failure("timeout", "Ghidra request deadline elapsed in the serial queue", entry.timeoutMs)));
|
|
48
|
+
if (entry.signal?.aborted === true) {
|
|
49
|
+
entry.resolve(err(this.failure("cancelled", "Ghidra request was cancelled")));
|
|
68
50
|
this.#drain();
|
|
69
51
|
return;
|
|
70
52
|
}
|
|
71
53
|
this.#active = true;
|
|
72
|
-
void this.execute(entry.method, entry.parameters, {
|
|
73
|
-
...(entry.signal === undefined ? {} : { signal: entry.signal }),
|
|
74
|
-
timeoutMs: remaining,
|
|
75
|
-
})
|
|
54
|
+
void this.execute(entry.method, entry.parameters, entry.signal === undefined ? {} : { signal: entry.signal })
|
|
76
55
|
.then(entry.resolve)
|
|
77
56
|
.catch(() => entry.resolve(err(this.failure("protocol", "Ghidra serial request execution rejected unexpectedly"))))
|
|
78
57
|
.finally(() => {
|
|
79
58
|
this.#active = false;
|
|
80
|
-
this.#size -= 1;
|
|
81
59
|
this.#drain();
|
|
82
60
|
});
|
|
83
61
|
}
|
|
@@ -87,11 +65,9 @@ export class GhidraRequestQueue {
|
|
|
87
65
|
return;
|
|
88
66
|
this.#queue.splice(index, 1);
|
|
89
67
|
this.#release(entry);
|
|
90
|
-
this.#size -= 1;
|
|
91
68
|
entry.resolve(result);
|
|
92
69
|
}
|
|
93
70
|
#release(entry) {
|
|
94
|
-
clearTimeout(entry.timer);
|
|
95
71
|
if (entry.signal !== undefined && entry.onAbort !== undefined)
|
|
96
72
|
entry.signal.removeEventListener("abort", entry.onAbort);
|
|
97
73
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Splits fragmented UTF-8 socket data
|
|
1
|
+
/** Splits fragmented UTF-8 socket data into response lines. */
|
|
2
2
|
export class GhidraResponseBuffer {
|
|
3
3
|
#options;
|
|
4
4
|
#buffer = "";
|
|
@@ -12,17 +12,11 @@ export class GhidraResponseBuffer {
|
|
|
12
12
|
while (newline >= 0) {
|
|
13
13
|
const encodedLine = this.#buffer.slice(0, newline);
|
|
14
14
|
this.#buffer = this.#buffer.slice(newline + 1);
|
|
15
|
-
if (Buffer.byteLength(encodedLine) > this.#options.maxLineBytes) {
|
|
16
|
-
this.#options.onFailure("Ghidra response exceeded the maximum line size");
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
15
|
const line = encodedLine.trim();
|
|
20
16
|
if (line.length > 0)
|
|
21
17
|
this.#options.onLine(line);
|
|
22
18
|
newline = this.#buffer.indexOf("\n");
|
|
23
19
|
}
|
|
24
|
-
if (Buffer.byteLength(this.#buffer) > this.#options.maxLineBytes)
|
|
25
|
-
this.#options.onFailure("Ghidra response exceeded the maximum line size");
|
|
26
20
|
}
|
|
27
21
|
/** Drop any incomplete line when a session closes. */
|
|
28
22
|
reset() {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { err, ok } from "../domain/result.js";
|
|
3
|
-
import { GHIDRA_BRIDGE_VERSION } from "./GhidraDefaults.js";
|
|
4
3
|
import { GHIDRA_INVENTORY_OPERATIONS } from "./GhidraInventoryValues.js";
|
|
5
4
|
import { GHIDRA_FUNCTION_OPERATIONS } from "./GhidraFunctionValues.js";
|
|
6
5
|
/** Exact methods proved by the bridge handshake after auto-analysis. */
|
|
@@ -14,7 +13,6 @@ const capabilitySchema = z.enum(GHIDRA_SESSION_CAPABILITIES);
|
|
|
14
13
|
const sessionInfoSchema = z
|
|
15
14
|
.object({
|
|
16
15
|
name: z.literal("REA Ghidra bridge"),
|
|
17
|
-
bridge_version: z.literal(GHIDRA_BRIDGE_VERSION),
|
|
18
16
|
run_id: z.string().uuid(),
|
|
19
17
|
profile_digest: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
20
18
|
provider: z
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { access, open } from "node:fs/promises";
|
|
2
2
|
import { err, ok } from "../domain/result.js";
|
|
3
3
|
import { GhidraSessionError } from "./GhidraSessionError.js";
|
|
4
|
-
const MAX_ENDPOINT_BYTES = 1024;
|
|
5
4
|
/** Observe a ready endpoint, returning null while its bridge is not listening. */
|
|
6
5
|
export const observeGhidraEndpoint = async (endpoint) => {
|
|
7
6
|
if (endpoint.transport === "unix-socket") {
|
|
@@ -25,11 +24,10 @@ export const observeGhidraEndpoint = async (endpoint) => {
|
|
|
25
24
|
: err(endpointFailure(endpoint, "Ghidra endpoint observation failed", cause));
|
|
26
25
|
}
|
|
27
26
|
try {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
if (observed.bytesRead === 0 || observed.bytesRead > MAX_ENDPOINT_BYTES)
|
|
27
|
+
const encoded = await handle.readFile("utf8");
|
|
28
|
+
if (encoded.length === 0)
|
|
31
29
|
return err(endpointFailure(endpoint, "Ghidra TCP endpoint is invalid"));
|
|
32
|
-
return parseTcpEndpoint(endpoint,
|
|
30
|
+
return parseTcpEndpoint(endpoint, encoded);
|
|
33
31
|
}
|
|
34
32
|
catch (cause) {
|
|
35
33
|
return err(endpointFailure(endpoint, "Ghidra endpoint read failed", cause));
|
|
@@ -44,8 +42,7 @@ const parseTcpEndpoint = (endpoint, encoded) => {
|
|
|
44
42
|
if (typeof value !== "object" ||
|
|
45
43
|
value === null ||
|
|
46
44
|
Array.isArray(value) ||
|
|
47
|
-
!hasExactKeys(value, ["host", "port"
|
|
48
|
-
value.schema_version !== 1 ||
|
|
45
|
+
!hasExactKeys(value, ["host", "port"]) ||
|
|
49
46
|
value.host !== "127.0.0.1" ||
|
|
50
47
|
!Number.isSafeInteger(value.port) ||
|
|
51
48
|
typeof value.port !== "number" ||
|
package/dist/ghidra/protocol.js
CHANGED
|
@@ -12,8 +12,8 @@ const responseSchema = z.discriminatedUnion("ok", [
|
|
|
12
12
|
ok: z.literal(false),
|
|
13
13
|
error: z
|
|
14
14
|
.object({
|
|
15
|
-
code: z.string().min(1)
|
|
16
|
-
message: z.string().min(1)
|
|
15
|
+
code: z.string().min(1),
|
|
16
|
+
message: z.string().min(1),
|
|
17
17
|
})
|
|
18
18
|
.strict(),
|
|
19
19
|
}),
|
|
@@ -5,10 +5,12 @@ import { promisify } from "node:util";
|
|
|
5
5
|
import { HopperCancelledError, HopperProcessError, HopperStartError, } from "../domain/errors.js";
|
|
6
6
|
import { err, ok } from "../domain/result.js";
|
|
7
7
|
import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
|
|
8
|
+
import { execFileOutput } from "../process/ExecFileOutput.js";
|
|
8
9
|
import { spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
|
|
9
10
|
import { waitForAbortableDelay } from "../process/ProviderDeadline.js";
|
|
10
11
|
import { selectLinuxPrivateDisplayStrategy, } from "./LinuxPrivateDisplayProbe.js";
|
|
11
12
|
import writeFileAtomic from "write-file-atomic";
|
|
13
|
+
import { acquireHopperTargetLease } from "./HopperTargetLease.js";
|
|
12
14
|
const execFileAsync = promisify(execFile);
|
|
13
15
|
const HOPPER_BACKGROUND_STARTUP_MS = 5_000;
|
|
14
16
|
/**
|
|
@@ -33,57 +35,68 @@ export class HopperApplicationLauncher {
|
|
|
33
35
|
this.dependencies = dependencies;
|
|
34
36
|
}
|
|
35
37
|
async launch(session, options = {}) {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
`REA_RUN_ID = ${JSON.stringify(session.runId)}`,
|
|
42
|
-
`REA_TARGET_PATH = ${JSON.stringify(this.options.targetPath)}`,
|
|
43
|
-
`REA_OWNS_PROCESS_LIFETIME = ${ownsProcessLifetime ? "True" : "False"}`,
|
|
44
|
-
`exec(compile(open(${JSON.stringify(this.options.bridgeScriptPath)}, 'rb').read(), ${JSON.stringify(this.options.bridgeScriptPath)}, 'exec'))`,
|
|
45
|
-
"",
|
|
46
|
-
].join("\n");
|
|
38
|
+
const leaseResult = await this.#acquireTargetLease(session.runId);
|
|
39
|
+
if (!leaseResult.ok)
|
|
40
|
+
return leaseResult;
|
|
41
|
+
const lease = leaseResult.value;
|
|
42
|
+
let leaseTransferred = false;
|
|
47
43
|
try {
|
|
48
|
-
|
|
49
|
-
await
|
|
44
|
+
const ownsProcessLifetime = usesLinuxDemo(this.options);
|
|
45
|
+
const bootstrap = await this.#writeBootstrap(session, ownsProcessLifetime);
|
|
46
|
+
if (!bootstrap.ok)
|
|
47
|
+
return bootstrap;
|
|
48
|
+
const launched = await this.#launchPreparedTarget({
|
|
49
|
+
session,
|
|
50
|
+
signal: options.signal,
|
|
51
|
+
bootstrapPath: bootstrap.value,
|
|
52
|
+
ownsProcessLifetime,
|
|
53
|
+
lease,
|
|
54
|
+
});
|
|
55
|
+
leaseTransferred = launched.ok;
|
|
56
|
+
return launched;
|
|
50
57
|
}
|
|
51
|
-
|
|
52
|
-
|
|
58
|
+
finally {
|
|
59
|
+
if (!leaseTransferred)
|
|
60
|
+
await lease?.release();
|
|
53
61
|
}
|
|
62
|
+
}
|
|
63
|
+
async #launchPreparedTarget(input) {
|
|
64
|
+
const { session, signal, bootstrapPath, ownsProcessLifetime, lease } = input;
|
|
54
65
|
const action = this.options.targetKind === "database" ? "--database" : "--executable";
|
|
55
|
-
const
|
|
66
|
+
const argumentsForTarget = [
|
|
56
67
|
...this.options.loaderArgs,
|
|
57
68
|
"--analysis",
|
|
58
|
-
"
|
|
69
|
+
"-Y",
|
|
59
70
|
bootstrapPath,
|
|
60
71
|
action,
|
|
61
72
|
this.options.targetPath,
|
|
62
73
|
];
|
|
63
74
|
try {
|
|
64
|
-
if (
|
|
75
|
+
if (signal?.aborted === true)
|
|
65
76
|
return err(new HopperCancelledError());
|
|
66
|
-
const display = await this.#privateDisplay(
|
|
77
|
+
const display = await this.#privateDisplay(signal);
|
|
67
78
|
if (!display.ok)
|
|
68
79
|
return err(display.error);
|
|
69
|
-
const prepared = await prepareHopperApplication(this.options.launcherPath,
|
|
80
|
+
const prepared = await prepareHopperApplication(this.options.launcherPath, signal);
|
|
70
81
|
if (!prepared)
|
|
71
82
|
return err(new HopperCancelledError());
|
|
72
|
-
const linuxDemo = linuxDemoLaunch(this.options, session,
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
const linuxDemo = linuxDemoLaunch(this.options, session, argumentsForTarget, display.strategy);
|
|
84
|
+
const started = await launchHopperProcess({
|
|
85
|
+
options: this.options,
|
|
86
|
+
session,
|
|
87
|
+
bootstrapPath,
|
|
88
|
+
ownsProcessLifetime,
|
|
89
|
+
argumentsForTarget,
|
|
90
|
+
linuxDemo,
|
|
91
|
+
signal,
|
|
79
92
|
});
|
|
80
|
-
|
|
81
|
-
|
|
93
|
+
if (started === null)
|
|
94
|
+
return err(new HopperCancelledError());
|
|
95
|
+
const cleanup = () => cleanupOwnedProcessGroup(started.ownership).finally(() => lease?.release());
|
|
82
96
|
const ownership = {
|
|
83
|
-
schema_version: 1,
|
|
84
97
|
run_id: session.runId,
|
|
85
|
-
pid,
|
|
86
|
-
process_group_id:
|
|
98
|
+
pid: started.ownership.leaderPid,
|
|
99
|
+
process_group_id: started.ownership.leaderPid,
|
|
87
100
|
parent_pid: process.pid,
|
|
88
101
|
launcher: linuxDemo?.command ?? this.options.launcherPath,
|
|
89
102
|
created_at: new Date().toISOString(),
|
|
@@ -96,17 +109,50 @@ export class HopperApplicationLauncher {
|
|
|
96
109
|
return err(new HopperStartError({ cause }));
|
|
97
110
|
}
|
|
98
111
|
return ok({
|
|
99
|
-
process:
|
|
112
|
+
process: started.process,
|
|
100
113
|
ownsProcessLifetime: true,
|
|
101
114
|
ownership: started.ownership,
|
|
102
115
|
shutdownMode: ownsProcessLifetime
|
|
103
116
|
? "process-cleanup"
|
|
104
117
|
: "bridge-request",
|
|
105
|
-
cleanup
|
|
118
|
+
cleanup,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (cause) {
|
|
122
|
+
return err(hopperLaunchFailure(cause, signal));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async #acquireTargetLease(runId) {
|
|
126
|
+
if ((this.dependencies.platform ?? process.platform) !== "darwin")
|
|
127
|
+
return ok(undefined);
|
|
128
|
+
try {
|
|
129
|
+
const acquisition = await (this.dependencies.acquireTargetLease ?? acquireHopperTargetLease)({
|
|
130
|
+
targetPath: this.options.targetPath,
|
|
131
|
+
targetKind: this.options.targetKind,
|
|
132
|
+
loaderArgs: this.options.loaderArgs,
|
|
133
|
+
runId,
|
|
106
134
|
});
|
|
135
|
+
if (!acquisition.acquired)
|
|
136
|
+
return err(new HopperStartError({
|
|
137
|
+
ownerRunId: acquisition.owner.runId,
|
|
138
|
+
userMessage: `This Hopper target is already open in REA session ${acquisition.owner.runId}. ` +
|
|
139
|
+
"Use that REA session or close it before opening this target again.",
|
|
140
|
+
}));
|
|
141
|
+
return ok(acquisition.lease);
|
|
142
|
+
}
|
|
143
|
+
catch (cause) {
|
|
144
|
+
return err(new HopperStartError({ cause }));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async #writeBootstrap(session, ownsProcessLifetime) {
|
|
148
|
+
const bootstrapPath = `${session.directory}/bootstrap.py`;
|
|
149
|
+
try {
|
|
150
|
+
await writeFile(bootstrapPath, bridgeBootstrapSource(session, this.options, ownsProcessLifetime), { encoding: "utf8", mode: 0o600 });
|
|
151
|
+
await chmod(bootstrapPath, 0o600);
|
|
152
|
+
return ok(bootstrapPath);
|
|
107
153
|
}
|
|
108
154
|
catch (cause) {
|
|
109
|
-
return err(
|
|
155
|
+
return err(new HopperStartError({ cause }));
|
|
110
156
|
}
|
|
111
157
|
}
|
|
112
158
|
async #privateDisplay(signal) {
|
|
@@ -127,6 +173,32 @@ export class HopperApplicationLauncher {
|
|
|
127
173
|
};
|
|
128
174
|
}
|
|
129
175
|
}
|
|
176
|
+
const bridgeBootstrapSource = (session, options, ownsProcessLifetime) => [
|
|
177
|
+
`REA_SOCKET = ${JSON.stringify(session.socketPath)}`,
|
|
178
|
+
`REA_TOKEN = ${JSON.stringify(session.token)}`,
|
|
179
|
+
`REA_RUN_ID = ${JSON.stringify(session.runId)}`,
|
|
180
|
+
`REA_TARGET_PATH = ${JSON.stringify(options.targetPath)}`,
|
|
181
|
+
`REA_OWNS_PROCESS_LIFETIME = ${ownsProcessLifetime ? "True" : "False"}`,
|
|
182
|
+
`exec(compile(open(${JSON.stringify(options.bridgeScriptPath)}, 'rb').read(), ${JSON.stringify(options.bridgeScriptPath)}, 'exec'))`,
|
|
183
|
+
"",
|
|
184
|
+
].join("\n");
|
|
185
|
+
const launchHopperProcess = async (input) => {
|
|
186
|
+
const ownershipCommand = input.linuxDemo?.ownershipCommand ?? input.options.launcherPath;
|
|
187
|
+
const spawn = (arguments_) => spawnOwnedProviderProcess({
|
|
188
|
+
command: input.options.launcherPath,
|
|
189
|
+
arguments: arguments_,
|
|
190
|
+
runId: input.session.runId,
|
|
191
|
+
expectedCommand: ownershipCommand,
|
|
192
|
+
});
|
|
193
|
+
if (input.linuxDemo !== undefined)
|
|
194
|
+
return spawnOwnedProviderProcess({
|
|
195
|
+
command: input.linuxDemo.command,
|
|
196
|
+
arguments: input.linuxDemo.args,
|
|
197
|
+
runId: input.session.runId,
|
|
198
|
+
expectedCommand: ownershipCommand,
|
|
199
|
+
});
|
|
200
|
+
return spawn(input.argumentsForTarget);
|
|
201
|
+
};
|
|
130
202
|
export const linuxDemoLaunch = (options, session, hopperArgs, strategy) => {
|
|
131
203
|
if (!usesLinuxDemo(options) || options.demoHelperPath === undefined)
|
|
132
204
|
return undefined;
|
|
@@ -194,7 +266,11 @@ const hopperApplicationBundle = (launcherPath) => {
|
|
|
194
266
|
};
|
|
195
267
|
const processIsRunning = async (executablePath) => {
|
|
196
268
|
try {
|
|
197
|
-
const processes = await
|
|
269
|
+
const processes = await execFileOutput("/bin/ps", [
|
|
270
|
+
"-ax",
|
|
271
|
+
"-o",
|
|
272
|
+
"command=",
|
|
273
|
+
]);
|
|
198
274
|
return processes.stdout
|
|
199
275
|
.split("\n")
|
|
200
276
|
.some((command) => command.trim() === executablePath);
|
|
@@ -25,7 +25,7 @@ export const resolveHopperAnalysisProfile = async (target, options) => {
|
|
|
25
25
|
version: `launcher-sha256:${launcherDigest.value}`,
|
|
26
26
|
};
|
|
27
27
|
return ok({
|
|
28
|
-
profile: createAnalysisProfile(provider,
|
|
28
|
+
profile: createAnalysisProfile(provider, {
|
|
29
29
|
target_kind: target.kind,
|
|
30
30
|
target_format: target.format,
|
|
31
31
|
architecture: target.architecture ?? null,
|
|
@@ -11,7 +11,9 @@ export const cleanupHopperSession = async (input) => {
|
|
|
11
11
|
cleanupResult: undefined,
|
|
12
12
|
shutdownConfirmed: false,
|
|
13
13
|
};
|
|
14
|
-
await report(input.progress, 0,
|
|
14
|
+
await report(input.progress, 0, input.retainDocument
|
|
15
|
+
? "detaching REA from the Hopper document"
|
|
16
|
+
: "requesting Hopper document shutdown");
|
|
15
17
|
await requestShutdown(input, state);
|
|
16
18
|
await report(input.progress, 0.35, "releasing Hopper bridge transport");
|
|
17
19
|
input.releaseTransport(input.socket);
|
|
@@ -33,7 +35,9 @@ const requestShutdown = async (input, state) => {
|
|
|
33
35
|
return;
|
|
34
36
|
}
|
|
35
37
|
const shutdown = await input
|
|
36
|
-
.request("
|
|
38
|
+
.request(input.retainDocument || input.launch?.shutdownMode === "process-cleanup"
|
|
39
|
+
? "shutdown"
|
|
40
|
+
: "shutdown_document")
|
|
37
41
|
.catch(() => err(new HopperProcessError(null)));
|
|
38
42
|
if (shutdown.ok &&
|
|
39
43
|
isHopperCleanupRequired(shutdown.value) &&
|
|
@@ -141,7 +145,6 @@ const activityDetails = (activity) => ({
|
|
|
141
145
|
request_id: activity.requestId,
|
|
142
146
|
operation: activity.operation,
|
|
143
147
|
elapsed_ms: activity.elapsedMs,
|
|
144
|
-
timeout_ms: activity.timeoutMs,
|
|
145
148
|
caller_state: activity.callerState,
|
|
146
149
|
queued_requests: activity.queuedRequests,
|
|
147
150
|
});
|
|
@@ -17,7 +17,6 @@ import { HopperRequestQueue, } from "./HopperRequestQueue.js";
|
|
|
17
17
|
import { HopperResponseStream } from "./HopperResponseStream.js";
|
|
18
18
|
import { responseResult, } from "./protocol.js";
|
|
19
19
|
const SHUTDOWN_TIMEOUT_MS = 30_000;
|
|
20
|
-
const MAX_QUEUED_REQUESTS = 64;
|
|
21
20
|
const SESSION_ROOT = process.platform === "darwin" ? "/tmp" : tmpdir();
|
|
22
21
|
/** Safe launcher telemetry; stderr content is intentionally never exposed. */
|
|
23
22
|
/**
|
|
@@ -60,10 +59,9 @@ export class HopperClient {
|
|
|
60
59
|
this.#logger = options.logger ?? silentLogger;
|
|
61
60
|
this.#options = {
|
|
62
61
|
...options,
|
|
63
|
-
requestTimeoutMs: options.requestTimeoutMs ?? 30_000,
|
|
64
62
|
startupTimeoutMs: options.startupTimeoutMs ?? 120_000,
|
|
65
63
|
};
|
|
66
|
-
this.#requests = new HopperRequestQueue(
|
|
64
|
+
this.#requests = new HopperRequestQueue(({ id, method, params }, failed) => {
|
|
67
65
|
const socket = this.#socket;
|
|
68
66
|
const token = this.#token;
|
|
69
67
|
if (socket === undefined || socket.destroyed || token === undefined) {
|
|
@@ -255,6 +253,7 @@ export class HopperClient {
|
|
|
255
253
|
logger: this.#logger,
|
|
256
254
|
onDiagnostic: this.#options.onDiagnostic,
|
|
257
255
|
request: (method) => this.#request(method, {}, { timeoutMs: SHUTDOWN_TIMEOUT_MS }),
|
|
256
|
+
retainDocument: options.retainDocument === true,
|
|
258
257
|
releaseTransport: (socket) => {
|
|
259
258
|
this.#failAll(new HopperProcessError(null));
|
|
260
259
|
if (socket !== undefined)
|
|
@@ -304,18 +303,16 @@ export class HopperClient {
|
|
|
304
303
|
return err(new HopperTimeoutError(this.#options.startupTimeoutMs));
|
|
305
304
|
}
|
|
306
305
|
async #request(method, params, options) {
|
|
306
|
+
const id = this.#nextId++;
|
|
307
307
|
const socket = this.#socket;
|
|
308
308
|
const token = this.#token;
|
|
309
309
|
if (socket === undefined || socket.destroyed || token === undefined) {
|
|
310
|
-
return err(new HopperProcessError(null));
|
|
310
|
+
return err(new HopperProcessError(null, undefined, method, id));
|
|
311
311
|
}
|
|
312
312
|
if (options.signal?.aborted === true)
|
|
313
313
|
return err(new HopperCancelledError());
|
|
314
|
-
const id = this.#nextId++;
|
|
315
314
|
const startedAt = performance.now();
|
|
316
|
-
const timeoutMs = options.timeoutMs ?? this.#options.requestTimeoutMs;
|
|
317
315
|
const result = await this.#requests.run(id, method, params, {
|
|
318
|
-
timeoutMs,
|
|
319
316
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
320
317
|
...(options.progress !== undefined ? { progress: options.progress } : {}),
|
|
321
318
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { hopperStartupFailure, } from "../domain/errors.js";
|
|
2
2
|
import { parseLinuxPrivateDisplayDiagnostic } from "./LinuxPrivateDisplayDiagnostic.js";
|
|
3
|
-
/** Extract only a matching
|
|
3
|
+
/** Extract only a matching Linux adapter failure record. */
|
|
4
4
|
export const hopperLauncherFailureDiagnostic = (event) => {
|
|
5
|
-
const parsed = parseLinuxPrivateDisplayDiagnostic(event.snapshot.stderr.text
|
|
5
|
+
const parsed = parseLinuxPrivateDisplayDiagnostic(event.snapshot.stderr.text);
|
|
6
6
|
if (!parsed.ok)
|
|
7
7
|
return undefined;
|
|
8
8
|
const expected = hopperStartupFailure(event.code)?.code;
|
|
@@ -34,15 +34,8 @@ const CAPABILITIES = Object.freeze(HOPPER_PROVIDER_TOOL_CONTRACTS.map((contract)
|
|
|
34
34
|
return Object.freeze({
|
|
35
35
|
provider: IDENTITY,
|
|
36
36
|
operation,
|
|
37
|
-
inputContractVersion: 1,
|
|
38
|
-
outputContractVersion: 1,
|
|
39
37
|
available: true,
|
|
40
38
|
reason: null,
|
|
41
|
-
pagination: isRecord(contract.inputSchema.properties) &&
|
|
42
|
-
"offset" in contract.inputSchema.properties
|
|
43
|
-
? "offset"
|
|
44
|
-
: "none",
|
|
45
|
-
exhaustive: false,
|
|
46
39
|
effects: Object.freeze({
|
|
47
40
|
mutatesArtifact: MUTATING_OPERATIONS.has(contract.name),
|
|
48
41
|
launchesProcess: true,
|
|
@@ -52,19 +45,11 @@ const CAPABILITIES = Object.freeze(HOPPER_PROVIDER_TOOL_CONTRACTS.map((contract)
|
|
|
52
45
|
changesPermissions: false,
|
|
53
46
|
requiresRoot: false,
|
|
54
47
|
}),
|
|
55
|
-
limits: Object.freeze({
|
|
56
|
-
maxResults: null,
|
|
57
|
-
maxPayloadBytes: contract.name === "read_bytes" ? 4_096 : null,
|
|
58
|
-
timeoutMs: null,
|
|
59
|
-
}),
|
|
60
48
|
limitations: Object.freeze([
|
|
61
49
|
"Results depend on Hopper's completed static analysis.",
|
|
62
50
|
]),
|
|
63
51
|
});
|
|
64
52
|
}));
|
|
65
|
-
function isRecord(value) {
|
|
66
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
67
|
-
}
|
|
68
53
|
/** Concrete analysis provider backed by REA's private Hopper bridge. */
|
|
69
54
|
export class HopperProvider {
|
|
70
55
|
config;
|
|
@@ -209,7 +194,6 @@ export class HopperProvider {
|
|
|
209
194
|
requestId: activity.requestId,
|
|
210
195
|
operation: activity.operation,
|
|
211
196
|
elapsedMs: activity.elapsedMs,
|
|
212
|
-
timeoutMs: activity.timeoutMs,
|
|
213
197
|
callerState: activity.callerState,
|
|
214
198
|
},
|
|
215
199
|
queuedRequests: activity?.queuedRequests ?? 0,
|