rea-agents 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -6,13 +6,14 @@ import { err, ok } from "../../domain/result.js";
|
|
|
6
6
|
import { createEvidence } from "../../domain/evidence.js";
|
|
7
7
|
import { OFFICIAL_TOOL_CONTRACTS } from "../../contracts/officialToolContracts.js";
|
|
8
8
|
import { ENHANCED_TOOL_CONTRACTS } from "../../contracts/enhancedToolContracts.js";
|
|
9
|
+
import { writeAnalysisSnapshot } from "./AnalysisSnapshotFiles.js";
|
|
9
10
|
import { SessionProviderRouter, } from "./SessionProviderRouter.js";
|
|
10
11
|
import { InvestigationRecords } from "../investigation/InvestigationRecords.js";
|
|
11
12
|
import { BinarySessionRecords } from "./BinarySessionRecords.js";
|
|
12
13
|
import { binarySessionStatus } from "./BinarySessionStatus.js";
|
|
13
14
|
import { resolveSessionOpen, resolveSessionTarget, validateResolvedSessionTarget, } from "./BinarySessionOpen.js";
|
|
14
15
|
import { bindExecutionTarget, commitExecutionProfile, prepareSessionExecution, } from "./BinarySessionExecution.js";
|
|
15
|
-
import { closeAnalysisClient } from "./AnalysisClientCleanup.js";
|
|
16
|
+
import { analysisErrorWithCleanupFailure, closeAnalysisClient, } from "./AnalysisClientCleanup.js";
|
|
16
17
|
const OFFICIAL_OPERATIONS = new Set(OFFICIAL_TOOL_CONTRACTS.map(({ name }) => name));
|
|
17
18
|
const ENHANCED_OPERATIONS = new Set(ENHANCED_TOOL_CONTRACTS.map(({ name }) => name));
|
|
18
19
|
/**
|
|
@@ -24,8 +25,10 @@ const ENHANCED_OPERATIONS = new Set(ENHANCED_TOOL_CONTRACTS.map(({ name }) => na
|
|
|
24
25
|
*/
|
|
25
26
|
export class BinarySession extends BinarySessionRecords {
|
|
26
27
|
#active;
|
|
28
|
+
#pendingCleanup;
|
|
27
29
|
#transition = Promise.resolve();
|
|
28
|
-
#
|
|
30
|
+
#transitionGeneration = 0;
|
|
31
|
+
#calls = new Map();
|
|
29
32
|
#providerRouter;
|
|
30
33
|
#runtimeUnavailability = new Map();
|
|
31
34
|
#availabilityListeners = new Set();
|
|
@@ -36,14 +39,14 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
36
39
|
/** Identify the provider producing evidence for this session. */
|
|
37
40
|
providerIdentity(operation) {
|
|
38
41
|
const route = this.#currentRoute();
|
|
39
|
-
let selected = route.identity;
|
|
42
|
+
let selected = route.binding?.identity ?? route.identity;
|
|
40
43
|
if (operation !== undefined) {
|
|
41
|
-
const exact = route.capabilities
|
|
44
|
+
const exact = route.capabilities.get(operation)?.provider;
|
|
42
45
|
if (exact !== undefined)
|
|
43
46
|
selected = exact;
|
|
44
47
|
else if (ENHANCED_OPERATIONS.has(operation)) {
|
|
45
48
|
const providers = new Map();
|
|
46
|
-
for (const descriptor of route.capabilities
|
|
49
|
+
for (const descriptor of route.capabilities.values())
|
|
47
50
|
if (descriptor.available &&
|
|
48
51
|
OFFICIAL_OPERATIONS.has(descriptor.operation))
|
|
49
52
|
providers.set(descriptor.provider.id, descriptor.provider);
|
|
@@ -79,10 +82,6 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
79
82
|
return undefined;
|
|
80
83
|
return structuredClone(profile);
|
|
81
84
|
}
|
|
82
|
-
/** Return opaque adapter metadata retained for legacy open_binary output. */
|
|
83
|
-
openCompatibility() {
|
|
84
|
-
return structuredClone(this.#active?.compatibility ?? {});
|
|
85
|
-
}
|
|
86
85
|
/** Observe runtime provider-health changes that affect discovery metadata. */
|
|
87
86
|
onAvailabilityChanged(listener) {
|
|
88
87
|
this.#availabilityListeners.add(listener);
|
|
@@ -125,62 +124,66 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
125
124
|
})), options);
|
|
126
125
|
}
|
|
127
126
|
#open(resolve, options) {
|
|
128
|
-
return this.#serialize(async () => {
|
|
127
|
+
return this.#serialize(async (admittedThrough) => {
|
|
129
128
|
if (isAborted(options.signal))
|
|
130
129
|
return err(new AnalysisCancelledError("open_binary"));
|
|
131
130
|
const resolved = await resolve();
|
|
132
131
|
if (!resolved.ok)
|
|
133
132
|
return resolved;
|
|
134
133
|
const { target, route, sameTarget } = resolved.value;
|
|
135
|
-
const { profile
|
|
134
|
+
const { profile } = route;
|
|
136
135
|
if (isAborted(options.signal))
|
|
137
136
|
return err(new AnalysisCancelledError("open_binary"));
|
|
138
137
|
const activeProfile = this.#active?.profile;
|
|
139
138
|
const sameProfile = activeProfile === null || activeProfile === undefined
|
|
140
139
|
? profile === null
|
|
141
140
|
: profile !== null && analysisProfilesEqual(activeProfile, profile);
|
|
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;
|
|
147
|
+
if (isAborted(options.signal))
|
|
148
|
+
return err(new AnalysisCancelledError("open_binary"));
|
|
142
149
|
if (sameTarget && sameProfile) {
|
|
143
150
|
if (options.snapshot !== undefined) {
|
|
144
151
|
const imported = this.importAnalysisSnapshot(options.snapshot);
|
|
145
152
|
if (!imported.ok)
|
|
146
153
|
return imported;
|
|
147
154
|
}
|
|
148
|
-
this.resetSnapshotInvalidation();
|
|
149
155
|
return ok(target);
|
|
150
156
|
}
|
|
151
|
-
await this.#drainCalls();
|
|
152
157
|
const previous = this.#active;
|
|
153
158
|
this.#active = undefined;
|
|
154
159
|
if (previous !== undefined) {
|
|
155
|
-
const closed = await
|
|
160
|
+
const closed = await this.#retireClient(previous.client, previous.route.identity.id);
|
|
156
161
|
if (!closed.ok) {
|
|
157
162
|
this.clearSessionRecords();
|
|
158
163
|
this.#clearRuntimeAvailability();
|
|
159
164
|
return closed;
|
|
160
165
|
}
|
|
161
166
|
}
|
|
167
|
+
if (isAborted(options.signal))
|
|
168
|
+
return err(await this.#restoreAfterFailedOpen(previous, new AnalysisCancelledError("open_binary")));
|
|
162
169
|
const runId = randomUUID();
|
|
163
170
|
const client = route.createClient(target, { runId });
|
|
164
171
|
const started = await client.execute("health", {}, options);
|
|
165
172
|
if (!started.ok) {
|
|
166
|
-
await client.
|
|
167
|
-
await this.#restore(previous);
|
|
168
|
-
return started;
|
|
173
|
+
return err(await this.#failedOpen(client, route.identity.id, previous, started.error));
|
|
169
174
|
}
|
|
170
175
|
if (isAborted(options.signal)) {
|
|
171
|
-
await client.
|
|
172
|
-
await this.#restore(previous);
|
|
173
|
-
return err(new AnalysisCancelledError("open_binary"));
|
|
176
|
+
return err(await this.#failedOpen(client, route.identity.id, previous, new AnalysisCancelledError("open_binary")));
|
|
174
177
|
}
|
|
175
178
|
this.#active = {
|
|
176
179
|
target,
|
|
177
180
|
client,
|
|
178
181
|
profile,
|
|
179
|
-
compatibility: structuredClone(compatibility),
|
|
180
182
|
route,
|
|
181
183
|
runId,
|
|
182
184
|
};
|
|
183
185
|
this.#clearRuntimeAvailability();
|
|
186
|
+
this.resetSnapshotInvalidation();
|
|
184
187
|
if (options.snapshot === undefined) {
|
|
185
188
|
if (profile === null)
|
|
186
189
|
this.clearSnapshot();
|
|
@@ -191,36 +194,93 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
191
194
|
const imported = this.importAnalysisSnapshot(options.snapshot);
|
|
192
195
|
if (!imported.ok) {
|
|
193
196
|
this.#active = undefined;
|
|
194
|
-
await client.
|
|
195
|
-
await this.#restore(previous);
|
|
196
|
-
return imported;
|
|
197
|
+
return err(await this.#failedOpen(client, route.identity.id, previous, imported.error));
|
|
197
198
|
}
|
|
198
199
|
}
|
|
199
|
-
this.resetSnapshotInvalidation();
|
|
200
200
|
return ok(target);
|
|
201
201
|
});
|
|
202
202
|
}
|
|
203
203
|
/** Close the active target, if any. */
|
|
204
204
|
close(options = {}) {
|
|
205
|
-
return this.#serialize(async () => {
|
|
206
|
-
|
|
207
|
-
this.#
|
|
208
|
-
await this.#drainCalls();
|
|
209
|
-
const closed = previous === undefined
|
|
210
|
-
? ok(null)
|
|
211
|
-
: await closeAnalysisClient(previous.client, previous.route.identity.id, {
|
|
212
|
-
...(options.progress === undefined
|
|
213
|
-
? {}
|
|
214
|
-
: { progress: options.progress }),
|
|
215
|
-
...(options.retainProviderDocuments === true
|
|
216
|
-
? { retainDocument: true }
|
|
217
|
-
: {}),
|
|
218
|
-
});
|
|
219
|
-
this.clearSessionRecords();
|
|
220
|
-
this.#clearRuntimeAvailability();
|
|
221
|
-
return closed;
|
|
205
|
+
return this.#serialize(async (admittedThrough) => {
|
|
206
|
+
await this.#drainCalls(admittedThrough);
|
|
207
|
+
return this.#closeActive(options);
|
|
222
208
|
});
|
|
223
209
|
}
|
|
210
|
+
/** Drain earlier requests, save an immutable snapshot, and close under one lifecycle lock. */
|
|
211
|
+
closeWithSnapshot(path, overwrite, options = {}) {
|
|
212
|
+
return this.#serialize(async (admittedThrough) => {
|
|
213
|
+
await this.#drainCalls(admittedThrough);
|
|
214
|
+
const snapshot = this.exportAnalysisSnapshot();
|
|
215
|
+
if (!snapshot.ok)
|
|
216
|
+
return snapshot;
|
|
217
|
+
const written = await writeAnalysisSnapshot(snapshot.value, path, overwrite);
|
|
218
|
+
if (!written.ok)
|
|
219
|
+
return written;
|
|
220
|
+
const closed = await this.#closeActive(options);
|
|
221
|
+
return closed.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
|
+
})
|
|
228
|
+
: closed;
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
async #closeActive(options) {
|
|
232
|
+
const previous = this.#active;
|
|
233
|
+
this.#active = undefined;
|
|
234
|
+
const closed = previous === undefined
|
|
235
|
+
? await this.#retryPendingCleanup(options.progress, options.retainProviderDocuments)
|
|
236
|
+
: await this.#retireClient(previous.client, previous.route.identity.id, {
|
|
237
|
+
...(options.progress === undefined
|
|
238
|
+
? {}
|
|
239
|
+
: { progress: options.progress }),
|
|
240
|
+
...(options.retainProviderDocuments === true
|
|
241
|
+
? { retainDocument: true }
|
|
242
|
+
: {}),
|
|
243
|
+
});
|
|
244
|
+
this.clearSessionRecords();
|
|
245
|
+
this.#clearRuntimeAvailability();
|
|
246
|
+
return closed;
|
|
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
|
+
}
|
|
224
284
|
/** Describe the active binary session. */
|
|
225
285
|
status() {
|
|
226
286
|
return binarySessionStatus({
|
|
@@ -231,6 +291,7 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
231
291
|
runId: this.#active?.runId,
|
|
232
292
|
runtimeLineageSnapshots: this.#active?.client.runtimeLineageSnapshots?.() ?? [],
|
|
233
293
|
requestActivitySnapshots: this.#active?.client.requestActivitySnapshots?.() ?? [],
|
|
294
|
+
providerOperationHealth: this.#active?.client.operationHealthSnapshot?.() ?? null,
|
|
234
295
|
});
|
|
235
296
|
}
|
|
236
297
|
/** Return the immutable artifact identity captured before its provider started. */
|
|
@@ -247,8 +308,14 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
247
308
|
* Calls may overlap, but a pending target transition prevents new calls from
|
|
248
309
|
* entering until the transition has settled.
|
|
249
310
|
*/
|
|
250
|
-
|
|
251
|
-
const
|
|
311
|
+
execute(name, arguments_, options) {
|
|
312
|
+
const generation = this.#transitionGeneration;
|
|
313
|
+
const call = this.#execute(name, arguments_, options, this.#transition);
|
|
314
|
+
this.#calls.set(call, generation);
|
|
315
|
+
return call.finally(() => this.#calls.delete(call));
|
|
316
|
+
}
|
|
317
|
+
async #execute(name, arguments_, options, transition) {
|
|
318
|
+
const transitioned = await this.#waitForTransition(name, options?.signal, transition);
|
|
252
319
|
if (!transitioned.ok)
|
|
253
320
|
return transitioned;
|
|
254
321
|
const prepared = prepareSessionExecution({
|
|
@@ -269,46 +336,40 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
269
336
|
if (cached !== undefined)
|
|
270
337
|
return ok(cached);
|
|
271
338
|
const call = active.client.execute(name, arguments_, options);
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
name
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
execution: profiled.value,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
else if (profiled.ok && capability?.effects.mutatesArtifact === true) {
|
|
305
|
-
this.invalidateSnapshot();
|
|
306
|
-
}
|
|
307
|
-
return profiled;
|
|
339
|
+
const result = await call;
|
|
340
|
+
const profiled = bindExecutionTarget(commitExecutionProfile(name, result, profile), name, active.target);
|
|
341
|
+
this.#observeRuntimeAvailability(name, profiled);
|
|
342
|
+
if (profiled.ok &&
|
|
343
|
+
cacheable &&
|
|
344
|
+
profile !== undefined &&
|
|
345
|
+
name !== "decode_interface_builder" &&
|
|
346
|
+
name !== "inspect_asset_catalog" &&
|
|
347
|
+
name !== "inspect_keyed_archive" &&
|
|
348
|
+
name !== "trace_dylib_resolution") {
|
|
349
|
+
const evidence = createEvidence(profiled.value.subject ?? active.target, profiled.value.provider, {
|
|
350
|
+
operation: name,
|
|
351
|
+
parameters: arguments_,
|
|
352
|
+
result: profiled.value.result,
|
|
353
|
+
analysisProfile: profile,
|
|
354
|
+
rawResult: profiled.value.rawResult,
|
|
355
|
+
limitations: profiled.value.limitations,
|
|
356
|
+
locations: profiled.value.locations,
|
|
357
|
+
});
|
|
358
|
+
const recorded = this.recordEvidence(evidence);
|
|
359
|
+
if (!recorded.ok)
|
|
360
|
+
return recorded;
|
|
361
|
+
this.recordSnapshot({
|
|
362
|
+
target: active.target,
|
|
363
|
+
profile,
|
|
364
|
+
operation: name,
|
|
365
|
+
parameters: arguments_,
|
|
366
|
+
execution: profiled.value,
|
|
367
|
+
});
|
|
308
368
|
}
|
|
309
|
-
|
|
310
|
-
this
|
|
369
|
+
else if (profiled.ok && capability.effects.mutatesArtifact) {
|
|
370
|
+
this.invalidateSnapshot();
|
|
311
371
|
}
|
|
372
|
+
return profiled;
|
|
312
373
|
}
|
|
313
374
|
#observeRuntimeAvailability(operation, result) {
|
|
314
375
|
if (result.ok) {
|
|
@@ -374,36 +435,43 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
374
435
|
return this.#active?.route ?? this.#providerRouter.initialRoute();
|
|
375
436
|
}
|
|
376
437
|
#serialize(operation) {
|
|
377
|
-
|
|
438
|
+
// Later calls wait for this transition and must not be included in its drain.
|
|
439
|
+
const admittedThrough = this.#transitionGeneration++;
|
|
440
|
+
const result = this.#transition.then(() => operation(admittedThrough), () => operation(admittedThrough));
|
|
378
441
|
this.#transition = result.then(() => undefined, () => undefined);
|
|
379
442
|
return result;
|
|
380
443
|
}
|
|
381
|
-
async #drainCalls() {
|
|
382
|
-
await Promise.allSettled(this.#calls
|
|
444
|
+
async #drainCalls(admittedThrough) {
|
|
445
|
+
await Promise.allSettled([...this.#calls]
|
|
446
|
+
.filter(([, generation]) => generation <= admittedThrough)
|
|
447
|
+
.map(([call]) => call));
|
|
383
448
|
}
|
|
384
449
|
async #restore(previous) {
|
|
385
450
|
if (previous === undefined)
|
|
386
|
-
return;
|
|
451
|
+
return ok(null);
|
|
387
452
|
const runId = randomUUID();
|
|
388
453
|
const client = previous.route.createClient(previous.target, { runId });
|
|
389
454
|
const started = await client.execute("health", {});
|
|
390
|
-
if (started.ok)
|
|
455
|
+
if (started.ok) {
|
|
391
456
|
this.#active = {
|
|
392
457
|
target: previous.target,
|
|
393
458
|
client,
|
|
394
459
|
profile: previous.profile,
|
|
395
|
-
compatibility: previous.compatibility,
|
|
396
460
|
route: previous.route,
|
|
397
461
|
runId,
|
|
398
462
|
};
|
|
399
|
-
|
|
400
|
-
|
|
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"));
|
|
401
469
|
}
|
|
402
|
-
async #waitForTransition(operation, signal) {
|
|
470
|
+
async #waitForTransition(operation, signal, transition) {
|
|
403
471
|
if (signal?.aborted === true)
|
|
404
472
|
return err(new AnalysisCancelledError(operation));
|
|
405
473
|
if (signal === undefined) {
|
|
406
|
-
await
|
|
474
|
+
await transition;
|
|
407
475
|
return ok(undefined);
|
|
408
476
|
}
|
|
409
477
|
return new Promise((resolve) => {
|
|
@@ -411,7 +479,7 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
411
479
|
resolve(err(new AnalysisCancelledError(operation)));
|
|
412
480
|
};
|
|
413
481
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
414
|
-
|
|
482
|
+
transition.then(() => {
|
|
415
483
|
signal.removeEventListener("abort", onAbort);
|
|
416
484
|
resolve(signal.aborted
|
|
417
485
|
? err(new AnalysisCancelledError(operation))
|
|
@@ -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,7 +1,7 @@
|
|
|
1
1
|
import { snapshotMatchesBinding, snapshotMatchesTarget, snapshotTarget, } from "../../domain/analysisSnapshot.js";
|
|
2
2
|
import { parseBinaryTarget } from "../BinaryTargetResolver.js";
|
|
3
|
-
import {} from "../../domain/
|
|
4
|
-
import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
|
|
3
|
+
import {} from "../../domain/binaryTargetTypes.js";
|
|
4
|
+
import { EvidenceIntegrityError, AnalysisSnapshotMismatchError, } from "../../domain/evidenceErrors.js";
|
|
5
5
|
import {} from "../../domain/analysisErrorBase.js";
|
|
6
6
|
import { err } from "../../domain/result.js";
|
|
7
7
|
import { SessionProviderRouter } from "./SessionProviderRouter.js";
|
|
@@ -47,8 +47,8 @@ export const validateResolvedSessionTarget = (input) => {
|
|
|
47
47
|
const validateSnapshot = ({ snapshot, target, profile, current, stagedSnapshotMatches, }) => {
|
|
48
48
|
if (snapshot !== undefined &&
|
|
49
49
|
(profile === null || !snapshotMatchesBinding(snapshot, target, profile)))
|
|
50
|
-
return new
|
|
50
|
+
return new AnalysisSnapshotMismatchError("Analysis snapshot profile_mismatch: target, provider, or analysis profile does not match the requested binary");
|
|
51
51
|
if (current === undefined && !stagedSnapshotMatches(target, profile))
|
|
52
|
-
return new
|
|
52
|
+
return new AnalysisSnapshotMismatchError("Analysis snapshot profile_mismatch: staged target, provider, or analysis profile does not match");
|
|
53
53
|
return undefined;
|
|
54
54
|
};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { evidenceBundleForTarget } from "../../domain/evidenceBundle.js";
|
|
2
|
-
import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
|
|
2
|
+
import { EvidenceIntegrityError, AnalysisSnapshotMismatchError, } from "../../domain/evidenceErrors.js";
|
|
3
3
|
import {} from "../../domain/analysisErrorBase.js";
|
|
4
4
|
import {} from "../../domain/unknownRegistryError.js";
|
|
5
5
|
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
|
+
/** Own binary snapshots and coordinate the composed investigation records. */
|
|
9
10
|
export class BinarySessionRecords {
|
|
10
11
|
#records;
|
|
11
12
|
#snapshot = new AnalysisSnapshotCache();
|
|
@@ -31,9 +32,17 @@ export class BinarySessionRecords {
|
|
|
31
32
|
evidenceById(evidenceId) {
|
|
32
33
|
return this.#records.evidenceById(evidenceId);
|
|
33
34
|
}
|
|
35
|
+
/** Borrow immutable investigation Evidence without copying a complete graph. */
|
|
36
|
+
evidenceForAnalysis(evidenceId) {
|
|
37
|
+
return this.#records.evidenceForAnalysis(evidenceId);
|
|
38
|
+
}
|
|
34
39
|
exportEvidenceBundle() {
|
|
35
40
|
return this.#records.exportEvidenceBundle();
|
|
36
41
|
}
|
|
42
|
+
/** Borrow a sealed bundle for complete serialization without cloning retained graphs. */
|
|
43
|
+
evidenceBundleForSerialization() {
|
|
44
|
+
return this.#records.evidenceBundleForSerialization();
|
|
45
|
+
}
|
|
37
46
|
importEvidenceBundle(bundle) {
|
|
38
47
|
const imported = this.#records.mergeEvidenceBundle(bundle);
|
|
39
48
|
if (!imported.ok)
|
|
@@ -47,7 +56,9 @@ export class BinarySessionRecords {
|
|
|
47
56
|
exportAnalysisSnapshot() {
|
|
48
57
|
const active = this.activeAnalysisBinding();
|
|
49
58
|
if (this.#snapshotInvalidated)
|
|
50
|
-
return err(new EvidenceIntegrityError("Analysis snapshots are unavailable after analysis metadata mutations"
|
|
59
|
+
return err(new EvidenceIntegrityError("Analysis snapshots are unavailable after analysis metadata mutations", {
|
|
60
|
+
userMessage: `Analysis snapshots are unavailable after analysis metadata mutations. ${SNAPSHOT_MUTATION_RECOVERY}`,
|
|
61
|
+
}));
|
|
51
62
|
const target = active?.target;
|
|
52
63
|
const profile = active?.profile ?? undefined;
|
|
53
64
|
if (target !== undefined && profile === undefined)
|
|
@@ -58,8 +69,12 @@ export class BinarySessionRecords {
|
|
|
58
69
|
}
|
|
59
70
|
importAnalysisSnapshot(snapshot) {
|
|
60
71
|
const active = this.activeAnalysisBinding();
|
|
72
|
+
if (active !== undefined && this.#snapshotInvalidated)
|
|
73
|
+
return err(new EvidenceIntegrityError("Analysis snapshots cannot be imported after analysis metadata mutations", {
|
|
74
|
+
userMessage: `Analysis snapshots cannot be imported after analysis metadata mutations. ${SNAPSHOT_MUTATION_RECOVERY}`,
|
|
75
|
+
}));
|
|
61
76
|
if (active?.profile === null)
|
|
62
|
-
return err(new
|
|
77
|
+
return err(new AnalysisSnapshotMismatchError("Analysis snapshot profile_mismatch: the active target has no concrete analysis profile"));
|
|
63
78
|
const imported = this.#snapshot.import(snapshot, active === undefined
|
|
64
79
|
? undefined
|
|
65
80
|
: { target: active.target, profile: active.profile }, (bundle) => {
|
|
@@ -78,9 +93,13 @@ export class BinarySessionRecords {
|
|
|
78
93
|
this.#emitSnapshotChanged();
|
|
79
94
|
}
|
|
80
95
|
lookupSnapshot(target, profile, operation, parameters) {
|
|
96
|
+
if (this.#snapshotInvalidated)
|
|
97
|
+
return undefined;
|
|
81
98
|
return this.#snapshot.lookup(target, profile, operation, parameters);
|
|
82
99
|
}
|
|
83
100
|
recordSnapshot(input) {
|
|
101
|
+
if (this.#snapshotInvalidated)
|
|
102
|
+
return;
|
|
84
103
|
this.#snapshot.record(input);
|
|
85
104
|
this.#emitSnapshotChanged();
|
|
86
105
|
}
|
|
@@ -89,6 +108,8 @@ export class BinarySessionRecords {
|
|
|
89
108
|
const active = this.activeAnalysisBinding();
|
|
90
109
|
if (active === undefined || active.profile === null)
|
|
91
110
|
return err(new EvidenceIntegrityError("Workflow snapshot entries require an active concrete provider profile"));
|
|
111
|
+
if (this.#snapshotInvalidated)
|
|
112
|
+
return ok(null);
|
|
92
113
|
try {
|
|
93
114
|
this.#snapshot.recordWorkflow({
|
|
94
115
|
target: active.target,
|
|
@@ -112,6 +133,7 @@ export class BinarySessionRecords {
|
|
|
112
133
|
resetSnapshotInvalidation() {
|
|
113
134
|
if (!this.#snapshotInvalidated)
|
|
114
135
|
return;
|
|
136
|
+
this.#snapshot.clear();
|
|
115
137
|
this.#snapshotInvalidated = false;
|
|
116
138
|
this.#emitSnapshotChanged();
|
|
117
139
|
}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/** Project internal provider routing state into the caller-visible session status. */
|
|
2
|
-
export const binarySessionStatus = ({ target, route, router, runtimeUnavailability, runId, runtimeLineageSnapshots, requestActivitySnapshots, }) => {
|
|
3
|
-
const
|
|
4
|
-
const provider = providerSummary(configuredProvider);
|
|
5
|
-
const providers = router.providerIdentities(route).map(providerSummary);
|
|
6
|
-
const capabilities = [...(route.capabilities?.values() ?? [])]
|
|
2
|
+
export const binarySessionStatus = ({ target, route, router, runtimeUnavailability, runId, runtimeLineageSnapshots, requestActivitySnapshots, providerOperationHealth, }) => {
|
|
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,
|
|
@@ -50,6 +45,7 @@ export const binarySessionStatus = ({ target, route, router, runtimeUnavailabili
|
|
|
50
45
|
process_lineage: processLineageStatus(runtimeLineageSnapshots),
|
|
51
46
|
},
|
|
52
47
|
analysis_activity: requestActivityStatus(requestActivitySnapshots),
|
|
48
|
+
provider_operation_health: providerOperationHealthStatus(providerOperationHealth),
|
|
53
49
|
};
|
|
54
50
|
return target === undefined
|
|
55
51
|
? { open: false, ...common }
|
|
@@ -137,3 +133,18 @@ const capabilityStatus = (descriptor) => ({
|
|
|
137
133
|
},
|
|
138
134
|
limitations: [...descriptor.limitations],
|
|
139
135
|
});
|
|
136
|
+
const providerOperationHealthStatus = (health) => {
|
|
137
|
+
if (health === undefined || health === null)
|
|
138
|
+
return null;
|
|
139
|
+
return {
|
|
140
|
+
state: health.state,
|
|
141
|
+
stage: health.stage,
|
|
142
|
+
retry_action: health.retryAction,
|
|
143
|
+
exit_code: health.exitCode,
|
|
144
|
+
requests: health.requests.map((request) => ({
|
|
145
|
+
request_id: request.requestId,
|
|
146
|
+
operation: request.operation,
|
|
147
|
+
stage: request.stage,
|
|
148
|
+
})),
|
|
149
|
+
};
|
|
150
|
+
};
|