rea-agents 6.1.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +6 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +57 -35
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +69 -25
- package/dist/application/DirectAnalysis.js +29 -14
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +15 -19
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +9 -1
- package/dist/application/JsonFiles.js +42 -9
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +8 -16
- package/dist/application/SetupHost.js +16 -27
- package/dist/application/SetupPlan.js +6 -6
- package/dist/application/Uninstall.js +81 -29
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/WebScriptExportService.js +30 -4
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
- package/dist/application/binary/BinarySession.js +70 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +1 -1
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
- package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +39 -14
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +48 -24
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +32 -27
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +4 -4
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli.js +16 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonInput.js +15 -1
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +5 -10
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionToolContracts.js +14 -2
- package/dist/contracts/sessionToolSchemas.js +1 -14
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +136 -92
- package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +18 -3
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +3 -4
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +10 -36
- package/dist/domain/evidenceBundle.js +7 -9
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/javascript/electronActiveObservation.js +26 -69
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
- package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/localPath.js +1 -1
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +5 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +13 -12
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +41 -22
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +2 -2
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +91 -32
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +40 -12
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +15 -7
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
- package/dist/inspector/V8InspectorProvider.js +38 -28
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +8 -2
- package/dist/native/NativeMacOSProvider.js +25 -15
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +11 -5
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/createServer.js +49 -36
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +2 -3
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +23 -23
- package/dist/server/registerEvidenceTools.js +3 -4
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +4 -19
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +12 -18
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +39 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +9 -8
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -31,7 +31,8 @@ export const isSnapshotCacheable = (operation, descriptor, parameters) => !STATE
|
|
|
31
31
|
typeof parameters.address === "string") &&
|
|
32
32
|
descriptor?.effects.mutatesArtifact === false &&
|
|
33
33
|
descriptor.cachePolicy !== "live" &&
|
|
34
|
-
descriptor.
|
|
34
|
+
(descriptor.cachePolicy === "snapshot" ||
|
|
35
|
+
descriptor.effects.mayWriteFilesystem === false) &&
|
|
35
36
|
descriptor.effects.changesPermissions === false;
|
|
36
37
|
/** Bounded in-memory cache for one immutable binary identity. */
|
|
37
38
|
export class AnalysisSnapshotCache {
|
|
@@ -72,7 +73,7 @@ export class AnalysisSnapshotCache {
|
|
|
72
73
|
imported += 1;
|
|
73
74
|
this.#entries.set(entry.query_id, structuredClone(entry));
|
|
74
75
|
}
|
|
75
|
-
for (const entry of snapshot.workflow_entries
|
|
76
|
+
for (const entry of snapshot.workflow_entries) {
|
|
76
77
|
if (!this.#workflowEntries.has(entry.query_id) && !this.#hasCapacity())
|
|
77
78
|
continue;
|
|
78
79
|
this.#workflowEntries.set(entry.query_id, structuredClone(entry));
|
|
@@ -86,15 +87,16 @@ export class AnalysisSnapshotCache {
|
|
|
86
87
|
try {
|
|
87
88
|
const snapshotTargetIdentity = snapshotTarget(target);
|
|
88
89
|
const binding = snapshotBinding(profile);
|
|
89
|
-
const
|
|
90
|
+
const entries = [...this.#entries.values()].sort((left, right) => left.query_id.localeCompare(right.query_id));
|
|
91
|
+
const workflows = [...this.#workflowEntries.values()].sort((left, right) => left.query_id.localeCompare(right.query_id));
|
|
92
|
+
// Parsing owns the returned JSON and metadata; pre-cloning the same
|
|
93
|
+
// payloads here only adds another full materialization.
|
|
90
94
|
return ok(parseAnalysisSnapshot({
|
|
91
95
|
target: snapshotTargetIdentity,
|
|
92
96
|
binding,
|
|
93
|
-
entries
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
: { workflow_entries: this.workflowEntries() }),
|
|
97
|
-
evidence_bundle: retainedEvidence,
|
|
97
|
+
entries,
|
|
98
|
+
workflow_entries: workflows,
|
|
99
|
+
evidence_bundle: evidenceBundle,
|
|
98
100
|
}));
|
|
99
101
|
}
|
|
100
102
|
catch (cause) {
|
|
@@ -13,7 +13,7 @@ import { BinarySessionRecords } from "./BinarySessionRecords.js";
|
|
|
13
13
|
import { binarySessionStatus } from "./BinarySessionStatus.js";
|
|
14
14
|
import { resolveSessionOpen, resolveSessionTarget, validateResolvedSessionTarget, } from "./BinarySessionOpen.js";
|
|
15
15
|
import { bindExecutionTarget, commitExecutionProfile, prepareSessionExecution, } from "./BinarySessionExecution.js";
|
|
16
|
-
import { closeAnalysisClient } from "./AnalysisClientCleanup.js";
|
|
16
|
+
import { analysisErrorWithCleanupFailure, closeAnalysisClient, } from "./AnalysisClientCleanup.js";
|
|
17
17
|
const OFFICIAL_OPERATIONS = new Set(OFFICIAL_TOOL_CONTRACTS.map(({ name }) => name));
|
|
18
18
|
const ENHANCED_OPERATIONS = new Set(ENHANCED_TOOL_CONTRACTS.map(({ name }) => name));
|
|
19
19
|
/**
|
|
@@ -25,6 +25,7 @@ const ENHANCED_OPERATIONS = new Set(ENHANCED_TOOL_CONTRACTS.map(({ name }) => na
|
|
|
25
25
|
*/
|
|
26
26
|
export class BinarySession extends BinarySessionRecords {
|
|
27
27
|
#active;
|
|
28
|
+
#pendingCleanup;
|
|
28
29
|
#transition = Promise.resolve();
|
|
29
30
|
#transitionGeneration = 0;
|
|
30
31
|
#calls = new Map();
|
|
@@ -38,14 +39,14 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
38
39
|
/** Identify the provider producing evidence for this session. */
|
|
39
40
|
providerIdentity(operation) {
|
|
40
41
|
const route = this.#currentRoute();
|
|
41
|
-
let selected = route.identity;
|
|
42
|
+
let selected = route.binding?.identity ?? route.identity;
|
|
42
43
|
if (operation !== undefined) {
|
|
43
|
-
const exact = route.capabilities
|
|
44
|
+
const exact = route.capabilities.get(operation)?.provider;
|
|
44
45
|
if (exact !== undefined)
|
|
45
46
|
selected = exact;
|
|
46
47
|
else if (ENHANCED_OPERATIONS.has(operation)) {
|
|
47
48
|
const providers = new Map();
|
|
48
|
-
for (const descriptor of route.capabilities
|
|
49
|
+
for (const descriptor of route.capabilities.values())
|
|
49
50
|
if (descriptor.available &&
|
|
50
51
|
OFFICIAL_OPERATIONS.has(descriptor.operation))
|
|
51
52
|
providers.set(descriptor.provider.id, descriptor.provider);
|
|
@@ -81,10 +82,6 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
81
82
|
return undefined;
|
|
82
83
|
return structuredClone(profile);
|
|
83
84
|
}
|
|
84
|
-
/** Return opaque adapter metadata retained for legacy open_binary output. */
|
|
85
|
-
openCompatibility() {
|
|
86
|
-
return structuredClone(this.#active?.compatibility ?? {});
|
|
87
|
-
}
|
|
88
85
|
/** Observe runtime provider-health changes that affect discovery metadata. */
|
|
89
86
|
onAvailabilityChanged(listener) {
|
|
90
87
|
this.#availabilityListeners.add(listener);
|
|
@@ -134,7 +131,7 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
134
131
|
if (!resolved.ok)
|
|
135
132
|
return resolved;
|
|
136
133
|
const { target, route, sameTarget } = resolved.value;
|
|
137
|
-
const { profile
|
|
134
|
+
const { profile } = route;
|
|
138
135
|
if (isAborted(options.signal))
|
|
139
136
|
return err(new AnalysisCancelledError("open_binary"));
|
|
140
137
|
const activeProfile = this.#active?.profile;
|
|
@@ -142,6 +139,11 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
142
139
|
? profile === null
|
|
143
140
|
: profile !== null && analysisProfilesEqual(activeProfile, profile);
|
|
144
141
|
await this.#drainCalls(admittedThrough);
|
|
142
|
+
if (isAborted(options.signal))
|
|
143
|
+
return err(new AnalysisCancelledError("open_binary"));
|
|
144
|
+
const pendingClosed = await this.#retryPendingCleanup();
|
|
145
|
+
if (!pendingClosed.ok)
|
|
146
|
+
return pendingClosed;
|
|
145
147
|
if (isAborted(options.signal))
|
|
146
148
|
return err(new AnalysisCancelledError("open_binary"));
|
|
147
149
|
if (sameTarget && sameProfile) {
|
|
@@ -155,31 +157,28 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
155
157
|
const previous = this.#active;
|
|
156
158
|
this.#active = undefined;
|
|
157
159
|
if (previous !== undefined) {
|
|
158
|
-
const closed = await
|
|
160
|
+
const closed = await this.#retireClient(previous.client, previous.route.identity.id);
|
|
159
161
|
if (!closed.ok) {
|
|
160
162
|
this.clearSessionRecords();
|
|
161
163
|
this.#clearRuntimeAvailability();
|
|
162
164
|
return closed;
|
|
163
165
|
}
|
|
164
166
|
}
|
|
167
|
+
if (isAborted(options.signal))
|
|
168
|
+
return err(await this.#restoreAfterFailedOpen(previous, new AnalysisCancelledError("open_binary")));
|
|
165
169
|
const runId = randomUUID();
|
|
166
170
|
const client = route.createClient(target, { runId });
|
|
167
171
|
const started = await client.execute("health", {}, options);
|
|
168
172
|
if (!started.ok) {
|
|
169
|
-
await client.
|
|
170
|
-
await this.#restore(previous);
|
|
171
|
-
return started;
|
|
173
|
+
return err(await this.#failedOpen(client, route.identity.id, previous, started.error));
|
|
172
174
|
}
|
|
173
175
|
if (isAborted(options.signal)) {
|
|
174
|
-
await client.
|
|
175
|
-
await this.#restore(previous);
|
|
176
|
-
return err(new AnalysisCancelledError("open_binary"));
|
|
176
|
+
return err(await this.#failedOpen(client, route.identity.id, previous, new AnalysisCancelledError("open_binary")));
|
|
177
177
|
}
|
|
178
178
|
this.#active = {
|
|
179
179
|
target,
|
|
180
180
|
client,
|
|
181
181
|
profile,
|
|
182
|
-
compatibility: structuredClone(compatibility),
|
|
183
182
|
route,
|
|
184
183
|
runId,
|
|
185
184
|
};
|
|
@@ -195,9 +194,7 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
195
194
|
const imported = this.importAnalysisSnapshot(options.snapshot);
|
|
196
195
|
if (!imported.ok) {
|
|
197
196
|
this.#active = undefined;
|
|
198
|
-
await client.
|
|
199
|
-
await this.#restore(previous);
|
|
200
|
-
return imported;
|
|
197
|
+
return err(await this.#failedOpen(client, route.identity.id, previous, imported.error));
|
|
201
198
|
}
|
|
202
199
|
}
|
|
203
200
|
return ok(target);
|
|
@@ -222,7 +219,12 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
222
219
|
return written;
|
|
223
220
|
const closed = await this.#closeActive(options);
|
|
224
221
|
return closed.ok
|
|
225
|
-
? ok({
|
|
222
|
+
? ok({
|
|
223
|
+
...written.value,
|
|
224
|
+
primitive_entries: snapshot.value.entries.length,
|
|
225
|
+
workflow_entries: snapshot.value.workflow_entries.length,
|
|
226
|
+
evidence_records: snapshot.value.evidence_bundle.records.length,
|
|
227
|
+
})
|
|
226
228
|
: closed;
|
|
227
229
|
});
|
|
228
230
|
}
|
|
@@ -230,8 +232,8 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
230
232
|
const previous = this.#active;
|
|
231
233
|
this.#active = undefined;
|
|
232
234
|
const closed = previous === undefined
|
|
233
|
-
?
|
|
234
|
-
: await
|
|
235
|
+
? await this.#retryPendingCleanup(options.progress, options.retainProviderDocuments)
|
|
236
|
+
: await this.#retireClient(previous.client, previous.route.identity.id, {
|
|
235
237
|
...(options.progress === undefined
|
|
236
238
|
? {}
|
|
237
239
|
: { progress: options.progress }),
|
|
@@ -243,6 +245,42 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
243
245
|
this.#clearRuntimeAvailability();
|
|
244
246
|
return closed;
|
|
245
247
|
}
|
|
248
|
+
async #retireClient(client, providerId, options = {}) {
|
|
249
|
+
this.#pendingCleanup = {
|
|
250
|
+
client,
|
|
251
|
+
providerId,
|
|
252
|
+
retainDocument: options.retainDocument === true,
|
|
253
|
+
};
|
|
254
|
+
return this.#retryPendingCleanup(options.progress);
|
|
255
|
+
}
|
|
256
|
+
async #retryPendingCleanup(progress, retainDocument) {
|
|
257
|
+
let pending = this.#pendingCleanup;
|
|
258
|
+
if (pending === undefined)
|
|
259
|
+
return ok(null);
|
|
260
|
+
if (retainDocument !== undefined) {
|
|
261
|
+
pending = { ...pending, retainDocument };
|
|
262
|
+
this.#pendingCleanup = pending;
|
|
263
|
+
}
|
|
264
|
+
const closed = await closeAnalysisClient(pending.client, pending.providerId, {
|
|
265
|
+
...(progress === undefined ? {} : { progress }),
|
|
266
|
+
...(pending.retainDocument ? { retainDocument: true } : {}),
|
|
267
|
+
});
|
|
268
|
+
if (closed.ok)
|
|
269
|
+
this.#pendingCleanup = undefined;
|
|
270
|
+
return closed;
|
|
271
|
+
}
|
|
272
|
+
async #failedOpen(client, providerId, previous, primary) {
|
|
273
|
+
const closed = await this.#retireClient(client, providerId);
|
|
274
|
+
if (!closed.ok)
|
|
275
|
+
return analysisErrorWithCleanupFailure(primary, closed.error, "open_binary");
|
|
276
|
+
return this.#restoreAfterFailedOpen(previous, primary);
|
|
277
|
+
}
|
|
278
|
+
async #restoreAfterFailedOpen(previous, primary) {
|
|
279
|
+
const restored = await this.#restore(previous);
|
|
280
|
+
return restored.ok
|
|
281
|
+
? primary
|
|
282
|
+
: analysisErrorWithCleanupFailure(primary, restored.error, "open_binary");
|
|
283
|
+
}
|
|
246
284
|
/** Describe the active binary session. */
|
|
247
285
|
status() {
|
|
248
286
|
return binarySessionStatus({
|
|
@@ -328,7 +366,7 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
328
366
|
execution: profiled.value,
|
|
329
367
|
});
|
|
330
368
|
}
|
|
331
|
-
else if (profiled.ok && capability
|
|
369
|
+
else if (profiled.ok && capability.effects.mutatesArtifact) {
|
|
332
370
|
this.invalidateSnapshot();
|
|
333
371
|
}
|
|
334
372
|
return profiled;
|
|
@@ -410,21 +448,24 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
410
448
|
}
|
|
411
449
|
async #restore(previous) {
|
|
412
450
|
if (previous === undefined)
|
|
413
|
-
return;
|
|
451
|
+
return ok(null);
|
|
414
452
|
const runId = randomUUID();
|
|
415
453
|
const client = previous.route.createClient(previous.target, { runId });
|
|
416
454
|
const started = await client.execute("health", {});
|
|
417
|
-
if (started.ok)
|
|
455
|
+
if (started.ok) {
|
|
418
456
|
this.#active = {
|
|
419
457
|
target: previous.target,
|
|
420
458
|
client,
|
|
421
459
|
profile: previous.profile,
|
|
422
|
-
compatibility: previous.compatibility,
|
|
423
460
|
route: previous.route,
|
|
424
461
|
runId,
|
|
425
462
|
};
|
|
426
|
-
|
|
427
|
-
|
|
463
|
+
return ok(null);
|
|
464
|
+
}
|
|
465
|
+
const closed = await this.#retireClient(client, previous.route.identity.id);
|
|
466
|
+
return closed.ok
|
|
467
|
+
? ok(null)
|
|
468
|
+
: err(analysisErrorWithCleanupFailure(started.error, closed.error, "open_binary"));
|
|
428
469
|
}
|
|
429
470
|
async #waitForTransition(operation, signal, transition) {
|
|
430
471
|
if (signal?.aborted === true)
|
|
@@ -6,6 +6,4 @@ import { SessionProviderRouter } from "./SessionProviderRouter.js";
|
|
|
6
6
|
* Compose one provider-neutral session from deep-provider selection and
|
|
7
7
|
* disjoint auxiliary operation families.
|
|
8
8
|
*/
|
|
9
|
-
export const composeBinarySession = (registry, auxiliaryProviders = []) => new BinarySession(registry
|
|
10
|
-
? registry
|
|
11
|
-
: SessionProviderRouter.selectable(registry, auxiliaryProviders), new InvestigationRecords());
|
|
9
|
+
export const composeBinarySession = (registry, auxiliaryProviders = []) => new BinarySession(SessionProviderRouter.selectable(registry, auxiliaryProviders), new InvestigationRecords());
|
|
@@ -9,17 +9,15 @@ export const prepareSessionExecution = (input) => {
|
|
|
9
9
|
const { active, operation, parameters, unboundOperationError, lookupSnapshot, } = input;
|
|
10
10
|
if (active === undefined)
|
|
11
11
|
return err(new NoBinaryOpenError());
|
|
12
|
-
const capability = active.route.capabilities
|
|
13
|
-
if (
|
|
14
|
-
capability?.available !== true) {
|
|
12
|
+
const capability = active.route.capabilities.get(operation);
|
|
13
|
+
if (capability?.available !== true) {
|
|
15
14
|
const selectionError = unboundOperationError(operation, active.route);
|
|
16
15
|
if (selectionError !== undefined)
|
|
17
16
|
return err(selectionError);
|
|
18
17
|
return err(new AnalysisCapabilityUnavailableError(active.route.binding?.identity.id ?? active.route.identity.id, operation, capability?.reason ?? "operation is not declared by this provider"));
|
|
19
18
|
}
|
|
20
19
|
const profile = active.profile !== null &&
|
|
21
|
-
|
|
22
|
-
capability.provider.id === active.profile.provider.id)
|
|
20
|
+
capability.provider.id === active.profile.provider.id
|
|
23
21
|
? active.profile
|
|
24
22
|
: undefined;
|
|
25
23
|
const cacheable = profile !== undefined &&
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { snapshotMatchesBinding, snapshotMatchesTarget, snapshotTarget, } from "../../domain/analysisSnapshot.js";
|
|
2
2
|
import { parseBinaryTarget } from "../BinaryTargetResolver.js";
|
|
3
|
-
import {} from "../../domain/
|
|
3
|
+
import {} from "../../domain/binaryTargetTypes.js";
|
|
4
4
|
import { EvidenceIntegrityError, AnalysisSnapshotMismatchError, } from "../../domain/evidenceErrors.js";
|
|
5
5
|
import {} from "../../domain/analysisErrorBase.js";
|
|
6
6
|
import { err } from "../../domain/result.js";
|
|
@@ -6,7 +6,7 @@ import { err, ok } from "../../domain/result.js";
|
|
|
6
6
|
import { AnalysisSnapshotCache } from "./AnalysisSnapshotCache.js";
|
|
7
7
|
import { InvestigationRecords } from "../investigation/InvestigationRecords.js";
|
|
8
8
|
const SNAPSHOT_MUTATION_RECOVERY = "Export session observations through export_evidence_bundle if needed. Close the active target without saving a snapshot, then reopen it before importing or saving a snapshot.";
|
|
9
|
-
/**
|
|
9
|
+
/** Own binary snapshots and coordinate the composed investigation records. */
|
|
10
10
|
export class BinarySessionRecords {
|
|
11
11
|
#records;
|
|
12
12
|
#snapshot = new AnalysisSnapshotCache();
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/** Project internal provider routing state into the caller-visible session status. */
|
|
2
2
|
export const binarySessionStatus = ({ target, route, router, runtimeUnavailability, runId, runtimeLineageSnapshots, requestActivitySnapshots, providerOperationHealth, }) => {
|
|
3
|
-
const
|
|
4
|
-
const provider = providerSummary(configuredProvider);
|
|
5
|
-
const providers = router.providerIdentities(route).map(providerSummary);
|
|
6
|
-
const capabilities = [...(route.capabilities?.values() ?? [])]
|
|
3
|
+
const capabilities = [...route.capabilities.values()]
|
|
7
4
|
.filter(({ operation }) => operation !== "inventory_artifact")
|
|
8
5
|
.sort((left, right) => left.operation.localeCompare(right.operation))
|
|
9
6
|
.map((descriptor) => {
|
|
@@ -38,8 +35,6 @@ export const binarySessionStatus = ({ target, route, router, runtimeUnavailabili
|
|
|
38
35
|
.map(capabilityStatus),
|
|
39
36
|
}));
|
|
40
37
|
const common = {
|
|
41
|
-
provider,
|
|
42
|
-
providers,
|
|
43
38
|
capabilities,
|
|
44
39
|
analysis_provider_binding: analysisProviderBinding,
|
|
45
40
|
analysis_provider_candidates: analysisProviderCandidates,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
|
|
2
2
|
import { err, ok } from "../../domain/result.js";
|
|
3
3
|
import { closeAnalysisClient } from "./AnalysisClientCleanup.js";
|
|
4
|
-
/** Synthetic
|
|
5
|
-
|
|
4
|
+
/** Synthetic identity for a deterministic provider set. */
|
|
5
|
+
const compositeProviderIdentity = (identities) => ({
|
|
6
6
|
id: `composite:${identities
|
|
7
7
|
.map(({ id }) => id)
|
|
8
8
|
.sort()
|
|
@@ -16,15 +16,10 @@ export class CompositeProvider {
|
|
|
16
16
|
#identity;
|
|
17
17
|
#capabilities;
|
|
18
18
|
#providerByOperation;
|
|
19
|
-
#profileProvider;
|
|
20
19
|
constructor(providers) {
|
|
21
20
|
this.providers = providers;
|
|
22
21
|
if (providers.length === 0)
|
|
23
22
|
throw new RangeError("CompositeProvider requires at least one provider");
|
|
24
|
-
const profileProviders = providers.filter(({ resolveAnalysisProfile }) => resolveAnalysisProfile !== undefined);
|
|
25
|
-
if (profileProviders.length > 1)
|
|
26
|
-
throw new TypeError("CompositeProvider supports at most one target-bound analysis profile");
|
|
27
|
-
this.#profileProvider = profileProviders[0];
|
|
28
23
|
this.#identity = Object.freeze(compositeProviderIdentity(providers.map((provider) => provider.identity())));
|
|
29
24
|
const routes = new Map();
|
|
30
25
|
const capabilities = [];
|
|
@@ -46,12 +41,6 @@ export class CompositeProvider {
|
|
|
46
41
|
capabilities() {
|
|
47
42
|
return this.#capabilities;
|
|
48
43
|
}
|
|
49
|
-
resolveAnalysisProfile(target, options) {
|
|
50
|
-
const resolve = this.#profileProvider?.resolveAnalysisProfile;
|
|
51
|
-
return resolve === undefined
|
|
52
|
-
? Promise.resolve(ok({ profile: null, compatibility: {} }))
|
|
53
|
-
: resolve.call(this.#profileProvider, target, options);
|
|
54
|
-
}
|
|
55
44
|
createClient(target, profile, context) {
|
|
56
45
|
const clients = new Map();
|
|
57
46
|
const clientFor = (provider) => {
|
|
@@ -62,7 +51,7 @@ export class CompositeProvider {
|
|
|
62
51
|
clients.set(provider, created);
|
|
63
52
|
return created;
|
|
64
53
|
};
|
|
65
|
-
const
|
|
54
|
+
const close = async (options) => {
|
|
66
55
|
const outcomes = await Promise.all([...clients.entries()].map(([provider, client]) => closeAnalysisClient(client, provider.identity().id, options)));
|
|
67
56
|
return outcomes.find((outcome) => !outcome.ok) ?? ok(null);
|
|
68
57
|
};
|
|
@@ -101,10 +90,7 @@ export class CompositeProvider {
|
|
|
101
90
|
}
|
|
102
91
|
return undefined;
|
|
103
92
|
},
|
|
104
|
-
|
|
105
|
-
close: async () => {
|
|
106
|
-
await closeWithOutcome();
|
|
107
|
-
},
|
|
93
|
+
close,
|
|
108
94
|
};
|
|
109
95
|
}
|
|
110
96
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AnalysisCancelledError } from "../../domain/analysisErrorCore.js";
|
|
2
2
|
import { AnalysisError } from "../../domain/analysisErrorBase.js";
|
|
3
3
|
import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
|
|
4
|
-
import { err } from "../../domain/result.js";
|
|
4
|
+
import { err, ok } from "../../domain/result.js";
|
|
5
5
|
import { ABORTED, waitForAbortable } from "./AbortablePromise.js";
|
|
6
6
|
const isAborted = (signal) => signal?.aborted === true;
|
|
7
7
|
/**
|
|
@@ -77,13 +77,13 @@ class LazyAnalysisClient {
|
|
|
77
77
|
operationHealthSnapshot() {
|
|
78
78
|
return this.#client?.operationHealthSnapshot?.();
|
|
79
79
|
}
|
|
80
|
-
async
|
|
80
|
+
close = async (options) => {
|
|
81
81
|
this.#closed = true;
|
|
82
82
|
if (this.#loading === undefined)
|
|
83
|
-
return;
|
|
83
|
+
return ok(null);
|
|
84
84
|
const client = await this.#loading;
|
|
85
|
-
|
|
86
|
-
}
|
|
85
|
+
return client.close(options);
|
|
86
|
+
};
|
|
87
87
|
async #load(operation) {
|
|
88
88
|
if (this.#closed)
|
|
89
89
|
throw new ProviderAdapterError(this.#providerId, operation, {
|
|
@@ -1,40 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, } from "../../domain/analysisErrorCore.js";
|
|
3
|
-
import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
|
|
1
|
+
import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
|
|
4
2
|
import { ProviderSelectionError } from "../../domain/providerSelectionError.js";
|
|
5
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
6
|
-
import { jsonObjectSchema } from "../../domain/jsonValue.js";
|
|
7
4
|
import { err, ok } from "../../domain/result.js";
|
|
8
5
|
import { AnalysisProviderRegistry, } from "./AnalysisProviderRegistry.js";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
/** Resolve either the compatibility single-provider seam or a selectable set. */
|
|
6
|
+
import { CompositeProvider } from "./CompositeProvider.js";
|
|
7
|
+
/** Resolve one registry-selected deep provider and disjoint auxiliary families. */
|
|
12
8
|
export class SessionProviderRouter {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
? { id: "unidentified", name: "Unidentified provider", version: null }
|
|
21
|
-
: provider.identity();
|
|
22
|
-
const capabilities = typeof provider === "function"
|
|
23
|
-
? undefined
|
|
24
|
-
: capabilityMap(provider.capabilities());
|
|
25
|
-
const resolveProfile = options.resolveAnalysisProfile ??
|
|
26
|
-
(typeof provider === "function" ||
|
|
27
|
-
provider.resolveAnalysisProfile === undefined
|
|
28
|
-
? () => Promise.resolve(ok({ profile: null, compatibility: {} }))
|
|
29
|
-
: (target, resolutionOptions) => provider.resolveAnalysisProfile?.(target, resolutionOptions) ??
|
|
30
|
-
Promise.resolve(ok({ profile: null, compatibility: {} })));
|
|
31
|
-
return new SessionProviderRouter({
|
|
32
|
-
kind: "single",
|
|
33
|
-
provider,
|
|
34
|
-
identity,
|
|
35
|
-
capabilities,
|
|
36
|
-
resolveProfile,
|
|
37
|
-
});
|
|
9
|
+
registry;
|
|
10
|
+
auxiliaryProviders;
|
|
11
|
+
route;
|
|
12
|
+
constructor(registry, auxiliaryProviders, route) {
|
|
13
|
+
this.registry = registry;
|
|
14
|
+
this.auxiliaryProviders = auxiliaryProviders;
|
|
15
|
+
this.route = route;
|
|
38
16
|
}
|
|
39
17
|
/** Create selection-aware routing while keeping auxiliary families disjoint. */
|
|
40
18
|
static selectable(registry, auxiliaryProviders) {
|
|
@@ -48,99 +26,31 @@ export class SessionProviderRouter {
|
|
|
48
26
|
if (auxiliaryOperations.has(operation))
|
|
49
27
|
throw new TypeError(`Deep and auxiliary providers both declare operation ${operation}`);
|
|
50
28
|
const initialRoute = selectableRoute(auxiliaryProviders, undefined);
|
|
51
|
-
return new SessionProviderRouter(
|
|
52
|
-
kind: "selectable",
|
|
53
|
-
registry,
|
|
54
|
-
auxiliaryProviders: [...auxiliaryProviders],
|
|
55
|
-
identity: identities.length === 0
|
|
56
|
-
? emptyProviderIdentity()
|
|
57
|
-
: compositeProviderIdentity(identities),
|
|
58
|
-
initialRoute,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
/** Compatibility identity covering every configured provider. */
|
|
62
|
-
configuredIdentity() {
|
|
63
|
-
return structuredClone(this.runtime.identity);
|
|
64
|
-
}
|
|
65
|
-
/** Provider identities exposed through the flat 1.x compatibility field. */
|
|
66
|
-
providerIdentities(route) {
|
|
67
|
-
if (this.runtime.kind === "single") {
|
|
68
|
-
if (route.capabilities === undefined)
|
|
69
|
-
return [route.identity];
|
|
70
|
-
return uniqueProviderIdentities([...route.capabilities.values()].map(({ provider }) => provider));
|
|
71
|
-
}
|
|
72
|
-
const selected = route.binding?.identity;
|
|
73
|
-
return uniqueProviderIdentities([
|
|
74
|
-
...this.runtime.auxiliaryProviders.map((provider) => provider.identity()),
|
|
75
|
-
...this.runtime.registry
|
|
76
|
-
.identities()
|
|
77
|
-
.map((identity) => identity.id === selected?.id ? selected : identity),
|
|
78
|
-
]);
|
|
29
|
+
return new SessionProviderRouter(registry, [...auxiliaryProviders], initialRoute);
|
|
79
30
|
}
|
|
80
31
|
/** Target-free routes and discovery metadata. */
|
|
81
32
|
initialRoute() {
|
|
82
|
-
|
|
83
|
-
return this.runtime.initialRoute;
|
|
84
|
-
const runtime = this.runtime;
|
|
85
|
-
return {
|
|
86
|
-
identity: structuredClone(runtime.identity),
|
|
87
|
-
capabilities: runtime.capabilities,
|
|
88
|
-
profile: null,
|
|
89
|
-
compatibility: {},
|
|
90
|
-
binding: null,
|
|
91
|
-
selection: undefined,
|
|
92
|
-
createClient: (target, context) => createSingleProviderClient(runtime, target, undefined, context),
|
|
93
|
-
};
|
|
33
|
+
return this.route;
|
|
94
34
|
}
|
|
95
35
|
/** Resolve target routes before any provider client is created. */
|
|
96
36
|
async resolve(target, providerId, signal) {
|
|
97
37
|
const resolutionOptions = signal === undefined ? undefined : { signal };
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
: selected;
|
|
103
|
-
}
|
|
104
|
-
const runtime = this.runtime;
|
|
105
|
-
if (providerId !== undefined &&
|
|
106
|
-
providerId !== "auto" &&
|
|
107
|
-
providerId !== runtime.identity.id)
|
|
108
|
-
return err(new ProviderSelectionError({
|
|
109
|
-
reason: "unknown_provider",
|
|
110
|
-
requestedProviderId: providerId,
|
|
111
|
-
candidateIds: [runtime.identity.id],
|
|
112
|
-
}));
|
|
113
|
-
const resolved = await waitForAbortable(runtime.resolveProfile(target, resolutionOptions), signal);
|
|
114
|
-
if (resolved === ABORTED)
|
|
115
|
-
return err(new AnalysisCancelledError("open_binary"));
|
|
116
|
-
if (!resolved.ok)
|
|
117
|
-
return resolved;
|
|
118
|
-
const normalized = normalizeProfileResolution(resolved.value, runtime.identity.id);
|
|
119
|
-
if (!normalized.ok)
|
|
120
|
-
return normalized;
|
|
121
|
-
return ok({
|
|
122
|
-
identity: structuredClone(runtime.identity),
|
|
123
|
-
capabilities: runtime.capabilities,
|
|
124
|
-
profile: normalized.value.profile,
|
|
125
|
-
compatibility: normalized.value.compatibility,
|
|
126
|
-
binding: null,
|
|
127
|
-
selection: undefined,
|
|
128
|
-
createClient: (openedTarget, context) => createSingleProviderClient(runtime, openedTarget, normalized.value.profile ?? undefined, context),
|
|
129
|
-
});
|
|
38
|
+
const selected = await this.registry.select(target, providerId, resolutionOptions);
|
|
39
|
+
return selected.ok
|
|
40
|
+
? ok(selectableRoute(this.auxiliaryProviders, selected.value))
|
|
41
|
+
: selected;
|
|
130
42
|
}
|
|
131
43
|
/** Candidate status authoritative for the active or target-free route. */
|
|
132
44
|
candidateStatuses(route) {
|
|
133
|
-
|
|
134
|
-
return [];
|
|
135
|
-
return route.selection?.candidates ?? this.runtime.registry.candidates();
|
|
45
|
+
return route.selection?.candidates ?? this.registry.candidates();
|
|
136
46
|
}
|
|
137
47
|
/** Produce exact candidate rejections for an intentionally unbound route. */
|
|
138
48
|
unboundOperationError(operation, route) {
|
|
139
|
-
if (
|
|
140
|
-
route.
|
|
141
|
-
|
|
49
|
+
if (route.binding !== null ||
|
|
50
|
+
route.selection === undefined ||
|
|
51
|
+
!this.registry.declaredOperations().includes(operation))
|
|
142
52
|
return undefined;
|
|
143
|
-
return this.
|
|
53
|
+
return this.registry.unboundOperationError(operation, route.selection);
|
|
144
54
|
}
|
|
145
55
|
}
|
|
146
56
|
const selectableRoute = (auxiliaryProviders, selection) => {
|
|
@@ -149,23 +59,23 @@ const selectableRoute = (auxiliaryProviders, selection) => {
|
|
|
149
59
|
...auxiliaryProviders,
|
|
150
60
|
...(binding === null ? [] : [binding.provider]),
|
|
151
61
|
];
|
|
152
|
-
const provider =
|
|
62
|
+
const provider = binding === null && providers.length === 1
|
|
63
|
+
? providers[0]
|
|
64
|
+
: providers.length === 0
|
|
65
|
+
? undefined
|
|
66
|
+
: new CompositeProvider(providers);
|
|
153
67
|
const identity = provider?.identity() ?? emptyProviderIdentity();
|
|
154
68
|
const capabilities = capabilityMap(provider?.capabilities() ?? []);
|
|
155
69
|
return {
|
|
156
70
|
identity,
|
|
157
71
|
capabilities,
|
|
158
72
|
profile: binding?.profile ?? null,
|
|
159
|
-
compatibility: structuredClone(binding?.compatibility ?? {}),
|
|
160
73
|
binding,
|
|
161
74
|
selection,
|
|
162
75
|
createClient: (target, context) => provider?.createClient(target, binding?.profile, context) ??
|
|
163
76
|
emptyClient(identity),
|
|
164
77
|
};
|
|
165
78
|
};
|
|
166
|
-
const createSingleProviderClient = (runtime, target, profile, context) => typeof runtime.provider === "function"
|
|
167
|
-
? runtime.provider(target, profile, context)
|
|
168
|
-
: runtime.provider.createClient(target, profile, context);
|
|
169
79
|
const emptyClient = (identity) => ({
|
|
170
80
|
execute: (operation) => operation === "health"
|
|
171
81
|
? Promise.resolve(ok({
|
|
@@ -177,7 +87,7 @@ const emptyClient = (identity) => ({
|
|
|
177
87
|
subject: null,
|
|
178
88
|
}))
|
|
179
89
|
: Promise.resolve(err(new AnalysisCapabilityUnavailableError(identity.id, operation, "operation is not declared by this provider set"))),
|
|
180
|
-
close: () => Promise.resolve(),
|
|
90
|
+
close: () => Promise.resolve(ok(null)),
|
|
181
91
|
});
|
|
182
92
|
const emptyProviderIdentity = () => ({
|
|
183
93
|
id: "composite:none",
|
|
@@ -185,9 +95,6 @@ const emptyProviderIdentity = () => ({
|
|
|
185
95
|
version: null,
|
|
186
96
|
});
|
|
187
97
|
const capabilityMap = (capabilities) => new Map(capabilities.map((descriptor) => [descriptor.operation, descriptor]));
|
|
188
|
-
const uniqueProviderIdentities = (identities) => [...new Map(identities.map((identity) => [identity.id, identity])).values()]
|
|
189
|
-
.sort((left, right) => left.id.localeCompare(right.id))
|
|
190
|
-
.map((identity) => structuredClone(identity));
|
|
191
98
|
const assertDisjoint = (providers) => {
|
|
192
99
|
const routes = new Set();
|
|
193
100
|
for (const provider of providers)
|
|
@@ -206,18 +113,3 @@ const assertUniqueProviderIds = (identities) => {
|
|
|
206
113
|
ids.add(identity.id);
|
|
207
114
|
}
|
|
208
115
|
};
|
|
209
|
-
const normalizeProfileResolution = (resolution, providerId) => {
|
|
210
|
-
try {
|
|
211
|
-
return ok({
|
|
212
|
-
profile: resolution.profile === null
|
|
213
|
-
? null
|
|
214
|
-
: analysisProfileSchema.parse(resolution.profile),
|
|
215
|
-
compatibility: jsonObjectSchema.parse(resolution.compatibility),
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
catch (cause) {
|
|
219
|
-
return err(new ProviderAdapterError(providerId, "resolve_analysis_profile", {
|
|
220
|
-
cause,
|
|
221
|
-
}));
|
|
222
|
-
}
|
|
223
|
-
};
|