rea-agents 6.1.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +7 -7
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/filesystem/RegularFile.js +41 -0
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +105 -36
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +4 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +32 -41
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +19 -19
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { addressedValue } from "../contracts/toolOutputSchemaPrimitives.js";
|
|
2
|
+
import { AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
3
|
+
import { err, ok } from "../domain/result.js";
|
|
4
|
+
import { resolveProcedureAddress } from "./ProcedureAddressResolution.js";
|
|
5
|
+
/** Resolve a CLI symbol selector without changing existing address spellings. */
|
|
6
|
+
export const resolveXrefsAddress = async (analysis, selector, signal) => {
|
|
7
|
+
if (selector.length === 0 ||
|
|
8
|
+
/^[0-9a-f]+$/iu.test(selector) ||
|
|
9
|
+
/^0x/iu.test(selector) ||
|
|
10
|
+
/:0x/iu.test(selector))
|
|
11
|
+
return ok(selector);
|
|
12
|
+
const inventory = await analysis.execute("list_names", {}, { signal });
|
|
13
|
+
if (!inventory.ok) {
|
|
14
|
+
if (inventory.error instanceof AnalysisCapabilityUnavailableError &&
|
|
15
|
+
inventory.error.operation === "list_names" &&
|
|
16
|
+
!inventory.error.cleanupIncomplete)
|
|
17
|
+
return resolveProcedureAddress(async (operation, parameters, signal) => {
|
|
18
|
+
const result = await analysis.execute(operation, parameters, signal === undefined ? {} : { signal });
|
|
19
|
+
return result.ok ? ok(result.value.result) : result;
|
|
20
|
+
}, selector, signal);
|
|
21
|
+
return inventory;
|
|
22
|
+
}
|
|
23
|
+
if (!Array.isArray(inventory.value.result))
|
|
24
|
+
return err(new AnalysisOutputError("list_names", "Expected a symbol inventory array"));
|
|
25
|
+
const addresses = new Set();
|
|
26
|
+
for (const [index, item] of inventory.value.result.entries()) {
|
|
27
|
+
const parsed = addressedValue.safeParse(item);
|
|
28
|
+
if (!parsed.success || parsed.data.address.length === 0)
|
|
29
|
+
return err(new AnalysisOutputError("list_names", `Invalid symbol inventory entry at index ${index}`));
|
|
30
|
+
if (parsed.data.value === selector)
|
|
31
|
+
addresses.add(parsed.data.address);
|
|
32
|
+
}
|
|
33
|
+
const [address] = addresses;
|
|
34
|
+
if (addresses.size === 1 && address !== undefined)
|
|
35
|
+
return ok(address);
|
|
36
|
+
return err(new AnalysisInputError("xrefs", undefined, [
|
|
37
|
+
{
|
|
38
|
+
path: ["address"],
|
|
39
|
+
reason: "invalid_value",
|
|
40
|
+
message: addresses.size === 0
|
|
41
|
+
? `Unknown analyzed symbol name ${JSON.stringify(selector)}. Use an exact analyzed name or a hexadecimal address.`
|
|
42
|
+
: `Analyzed symbol name ${JSON.stringify(selector)} is ambiguous at ${[...addresses].join(", ")}. Select an exact address.`,
|
|
43
|
+
},
|
|
44
|
+
]));
|
|
45
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ANALYSIS_VIEW_PROVIDER } from "../InvestigationProviders.js";
|
|
3
|
+
import { resolveEvidenceInput } from "../EvidenceInputResolver.js";
|
|
4
|
+
import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
|
|
5
|
+
import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
|
|
6
|
+
import { createEvidence, parseEvidence, } from "../../domain/evidence.js";
|
|
7
|
+
import { INSPECT_ANALYSIS_VIEW_OPERATION, inspectAnalysisViewInputSchema, projectAnalysisView, } from "../../domain/analysisView/analysisView.js";
|
|
8
|
+
import { jsonValueSchema } from "../../domain/jsonValue.js";
|
|
9
|
+
import { err, ok } from "../../domain/result.js";
|
|
10
|
+
/** Authenticate a selected-view request and project already completed Evidence. */
|
|
11
|
+
export const inspectAnalysisView = (rawInput, lookup) => {
|
|
12
|
+
const parsed = inspectAnalysisViewInputSchema.safeParse(rawInput);
|
|
13
|
+
if (!parsed.success)
|
|
14
|
+
return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, parsed.error.issues, rawInput, { cause: parsed.error }));
|
|
15
|
+
return inspectAnalysisViewValidated(parsed.data, lookup);
|
|
16
|
+
};
|
|
17
|
+
/** Project a view from input already parsed by a trusted adapter. */
|
|
18
|
+
export const inspectAnalysisViewValidated = (input, lookup) => {
|
|
19
|
+
const resolved = resolveAnalysisViewSource(input.source, lookup);
|
|
20
|
+
if (!resolved.ok)
|
|
21
|
+
return resolved;
|
|
22
|
+
const parent = resolved.value;
|
|
23
|
+
const projected = projectAnalysisView({
|
|
24
|
+
evidenceId: parent.evidence_id,
|
|
25
|
+
operation: parent.operation,
|
|
26
|
+
normalizedResult: parent.normalized_result,
|
|
27
|
+
limitations: parent.limitations,
|
|
28
|
+
}, input.view);
|
|
29
|
+
if (!projected.ok)
|
|
30
|
+
return projected;
|
|
31
|
+
if (parent.subject !== null &&
|
|
32
|
+
parent.subject.digest.sha256 !== projected.value.artifact.sha256)
|
|
33
|
+
return err(new EvidenceIntegrityError(`Parent subject SHA-256 ${parent.subject.digest.sha256} differs from analysis artifact SHA-256 ${projected.value.artifact.sha256}.`));
|
|
34
|
+
return ok(createAnalysisViewEvidence(input, parent, projected.value));
|
|
35
|
+
};
|
|
36
|
+
const resolveAnalysisViewSource = (source, lookup) => {
|
|
37
|
+
if (source.kind === "retained-evidence")
|
|
38
|
+
return resolveEvidenceInput(source, lookup);
|
|
39
|
+
try {
|
|
40
|
+
return ok(parseEvidence(source.evidence));
|
|
41
|
+
}
|
|
42
|
+
catch (cause) {
|
|
43
|
+
if (cause instanceof z.ZodError)
|
|
44
|
+
return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, cause.issues, source.evidence, { cause }));
|
|
45
|
+
if (cause instanceof TypeError)
|
|
46
|
+
return err(new EvidenceIntegrityError(cause.message, cause.message.length > 0 ? { userMessage: cause.message } : undefined));
|
|
47
|
+
throw cause;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const createAnalysisViewEvidence = (input, parent, result) => {
|
|
51
|
+
const target = parent.subject === null
|
|
52
|
+
? undefined
|
|
53
|
+
: {
|
|
54
|
+
path: parent.subject.local_path,
|
|
55
|
+
sha256: parent.subject.digest.sha256,
|
|
56
|
+
format: parent.subject.format,
|
|
57
|
+
...(parent.subject.architecture === null
|
|
58
|
+
? {}
|
|
59
|
+
: { architecture: parent.subject.architecture }),
|
|
60
|
+
};
|
|
61
|
+
return createEvidence(target, ANALYSIS_VIEW_PROVIDER, {
|
|
62
|
+
predicateType: "rea.analysis-view",
|
|
63
|
+
operation: INSPECT_ANALYSIS_VIEW_OPERATION,
|
|
64
|
+
parameters: {
|
|
65
|
+
parent_evidence_id: parent.evidence_id,
|
|
66
|
+
view: jsonValueSchema.parse(input.view),
|
|
67
|
+
},
|
|
68
|
+
result: jsonValueSchema.parse(result),
|
|
69
|
+
rawResult: null,
|
|
70
|
+
confidence: "derived",
|
|
71
|
+
authority: parent.authority,
|
|
72
|
+
limitations: result.limitations,
|
|
73
|
+
locations: [{ kind: "artifact-path", path: result.artifact.path }],
|
|
74
|
+
evidenceLinks: [parent.evidence_id],
|
|
75
|
+
});
|
|
76
|
+
};
|
|
@@ -17,7 +17,7 @@ export class AndroidAnalysisService {
|
|
|
17
17
|
const request = androidRequestSchema.safeParse({ operation, input });
|
|
18
18
|
if (!request.success)
|
|
19
19
|
return err(new AnalysisInputError(operation, { cause: request.error }));
|
|
20
|
-
const target = await parseBinaryTarget(request.data.input.path);
|
|
20
|
+
const target = await parseBinaryTarget(request.data.input.path, options?.signal === undefined ? {} : { signal: options.signal });
|
|
21
21
|
if (!target.ok)
|
|
22
22
|
return target;
|
|
23
23
|
const executed = await this.provider.execute(target.value, request.data, options);
|
|
@@ -1,14 +1,39 @@
|
|
|
1
1
|
import { ProviderCleanupError } from "../../domain/providerCleanupError.js";
|
|
2
|
-
import {
|
|
2
|
+
import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
|
|
3
|
+
import { projectAnalysisError } from "../../domain/analysisErrorProjection.js";
|
|
4
|
+
import { err } from "../../domain/result.js";
|
|
5
|
+
import { AnalysisError } from "../../domain/analysisErrorBase.js";
|
|
3
6
|
/** Close one provider client and normalize unexpected adapter rejection. */
|
|
4
7
|
export const closeAnalysisClient = async (client, providerId, options = {}) => {
|
|
5
8
|
try {
|
|
6
|
-
|
|
7
|
-
return await client.closeWithOutcome(options);
|
|
8
|
-
await client.close();
|
|
9
|
-
return ok(null);
|
|
9
|
+
return await client.close(options);
|
|
10
10
|
}
|
|
11
11
|
catch (cause) {
|
|
12
|
+
// A typed cleanup failure already names its leftover resources.
|
|
13
|
+
if (cause instanceof AnalysisError && cause.cleanupIncomplete)
|
|
14
|
+
return err(cause);
|
|
12
15
|
return err(new ProviderCleanupError(providerId, ["provider-client"], { reason: "provider client close rejected unexpectedly" }, { cause }));
|
|
13
16
|
}
|
|
14
17
|
};
|
|
18
|
+
/** Preserve the original lifecycle failure alongside incomplete cleanup. */
|
|
19
|
+
export const analysisErrorWithCleanupFailure = (primary, cleanup, operation = "close_binary") => {
|
|
20
|
+
const projected = projectAnalysisError(cleanup);
|
|
21
|
+
return new ProviderAdapterError(cleanup instanceof ProviderAdapterError ? cleanup.providerId : "rea", operation, {
|
|
22
|
+
cause: primary,
|
|
23
|
+
userMessage: projectAnalysisError(primary).message,
|
|
24
|
+
...(primary.capturedOutput === undefined
|
|
25
|
+
? {}
|
|
26
|
+
: { capturedOutput: primary.capturedOutput }),
|
|
27
|
+
...(primary.partialObservation === undefined
|
|
28
|
+
? {}
|
|
29
|
+
: { partialObservation: primary.partialObservation }),
|
|
30
|
+
cleanup: {
|
|
31
|
+
reason: projected.message,
|
|
32
|
+
resources: cleanup.cleanupResources,
|
|
33
|
+
},
|
|
34
|
+
diagnostics: {
|
|
35
|
+
primary_error: projectAnalysisError(primary),
|
|
36
|
+
cleanup_error: projected,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
};
|
|
@@ -46,14 +46,13 @@ export const evaluateAnalysisProviderCandidate = async (candidate, status, targe
|
|
|
46
46
|
if (resolved.value.profile === null)
|
|
47
47
|
return ok(rejectedProfile(candidate, status, "Provider version or analysis profile could not be resolved"));
|
|
48
48
|
const profile = analysisProfileSchema.parse(resolved.value.profile);
|
|
49
|
-
const compatibility = jsonObjectSchema.parse(resolved.value.compatibility);
|
|
50
49
|
const identity = candidate.identity();
|
|
51
50
|
if (profile.provider.id !== identity.id ||
|
|
52
51
|
profile.provider.name !== identity.name ||
|
|
53
52
|
(identity.version !== null &&
|
|
54
53
|
profile.provider.version !== identity.version))
|
|
55
54
|
return ok(rejectedProfile(candidate, status, "Resolved analysis profile has mismatched provider identity"));
|
|
56
|
-
return ok({ candidate, status, profile
|
|
55
|
+
return ok({ candidate, status, profile });
|
|
57
56
|
}
|
|
58
57
|
catch (cause) {
|
|
59
58
|
void cause;
|
|
@@ -117,13 +117,11 @@ export class AnalysisProviderRegistry {
|
|
|
117
117
|
if (evaluated.profileError !== undefined)
|
|
118
118
|
return err(evaluated.profileError);
|
|
119
119
|
const statuses = replaceCandidate(baseline, evaluated.status);
|
|
120
|
-
if (evaluated.profile === undefined
|
|
121
|
-
evaluated.compatibility === undefined)
|
|
120
|
+
if (evaluated.profile === undefined)
|
|
122
121
|
return err(selectionError("provider_unavailable", providerId, statuses));
|
|
123
122
|
return ok(selectedResult(providerId, source, {
|
|
124
123
|
...evaluated,
|
|
125
124
|
profile: evaluated.profile,
|
|
126
|
-
compatibility: evaluated.compatibility,
|
|
127
125
|
}, statuses));
|
|
128
126
|
}
|
|
129
127
|
async #selectAutomatically(context) {
|
|
@@ -149,8 +147,7 @@ export class AnalysisProviderRegistry {
|
|
|
149
147
|
return result.value;
|
|
150
148
|
});
|
|
151
149
|
const statuses = evaluations.map(({ status }) => status);
|
|
152
|
-
const usable = evaluations.filter((evaluation) => evaluation.profile !== undefined
|
|
153
|
-
evaluation.compatibility !== undefined);
|
|
150
|
+
const usable = evaluations.filter((evaluation) => evaluation.profile !== undefined);
|
|
154
151
|
if (usable.length === 0)
|
|
155
152
|
return ok({
|
|
156
153
|
requestedProviderId: "auto",
|
|
@@ -195,7 +192,6 @@ const selectedResult = (requestedProviderId, source, evaluated, statuses) => {
|
|
|
195
192
|
identity: structuredClone(evaluated.profile.provider),
|
|
196
193
|
selectionSource: source,
|
|
197
194
|
profile: structuredClone(evaluated.profile),
|
|
198
|
-
compatibility: structuredClone(evaluated.compatibility),
|
|
199
195
|
},
|
|
200
196
|
candidates: replaceCandidate(statuses, selectedStatus),
|
|
201
197
|
};
|
|
@@ -4,6 +4,7 @@ import {} from "../../domain/analysisErrorBase.js";
|
|
|
4
4
|
import { err, ok } from "../../domain/result.js";
|
|
5
5
|
import { analysisQueryId, createAnalysisSnapshotEntry, createAnalysisSnapshotWorkflowEntry, snapshotBinding, snapshotMatchesProfile, snapshotMatchesTarget, snapshotTarget, parseAnalysisSnapshot, } from "../../domain/analysisSnapshot.js";
|
|
6
6
|
import { OFFICIAL_TOOL_CONTRACTS } from "../../contracts/officialToolContracts.js";
|
|
7
|
+
import { compareUnicodeCodePoints } from "../../domain/unicodeCodePointOrder.js";
|
|
7
8
|
const STATEFUL_OPERATIONS = new Set([
|
|
8
9
|
"health",
|
|
9
10
|
"current_address",
|
|
@@ -31,7 +32,8 @@ export const isSnapshotCacheable = (operation, descriptor, parameters) => !STATE
|
|
|
31
32
|
typeof parameters.address === "string") &&
|
|
32
33
|
descriptor?.effects.mutatesArtifact === false &&
|
|
33
34
|
descriptor.cachePolicy !== "live" &&
|
|
34
|
-
descriptor.
|
|
35
|
+
(descriptor.cachePolicy === "snapshot" ||
|
|
36
|
+
descriptor.effects.mayWriteFilesystem === false) &&
|
|
35
37
|
descriptor.effects.changesPermissions === false;
|
|
36
38
|
/** Bounded in-memory cache for one immutable binary identity. */
|
|
37
39
|
export class AnalysisSnapshotCache {
|
|
@@ -72,7 +74,7 @@ export class AnalysisSnapshotCache {
|
|
|
72
74
|
imported += 1;
|
|
73
75
|
this.#entries.set(entry.query_id, structuredClone(entry));
|
|
74
76
|
}
|
|
75
|
-
for (const entry of snapshot.workflow_entries
|
|
77
|
+
for (const entry of snapshot.workflow_entries) {
|
|
76
78
|
if (!this.#workflowEntries.has(entry.query_id) && !this.#hasCapacity())
|
|
77
79
|
continue;
|
|
78
80
|
this.#workflowEntries.set(entry.query_id, structuredClone(entry));
|
|
@@ -86,15 +88,16 @@ export class AnalysisSnapshotCache {
|
|
|
86
88
|
try {
|
|
87
89
|
const snapshotTargetIdentity = snapshotTarget(target);
|
|
88
90
|
const binding = snapshotBinding(profile);
|
|
89
|
-
const
|
|
91
|
+
const entries = [...this.#entries.values()].sort((left, right) => compareUnicodeCodePoints(left.query_id, right.query_id));
|
|
92
|
+
const workflows = [...this.#workflowEntries.values()].sort((left, right) => compareUnicodeCodePoints(left.query_id, right.query_id));
|
|
93
|
+
// Parsing owns the returned JSON and metadata; pre-cloning the same
|
|
94
|
+
// payloads here only adds another full materialization.
|
|
90
95
|
return ok(parseAnalysisSnapshot({
|
|
91
96
|
target: snapshotTargetIdentity,
|
|
92
97
|
binding,
|
|
93
|
-
entries
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
: { workflow_entries: this.workflowEntries() }),
|
|
97
|
-
evidence_bundle: retainedEvidence,
|
|
98
|
+
entries,
|
|
99
|
+
workflow_entries: workflows,
|
|
100
|
+
evidence_bundle: evidenceBundle,
|
|
98
101
|
}));
|
|
99
102
|
}
|
|
100
103
|
catch (cause) {
|
|
@@ -124,13 +127,13 @@ export class AnalysisSnapshotCache {
|
|
|
124
127
|
/** Return canonical entries for persistence. */
|
|
125
128
|
entries() {
|
|
126
129
|
return [...this.#entries.values()]
|
|
127
|
-
.sort((left, right) => left.query_id
|
|
130
|
+
.sort((left, right) => compareUnicodeCodePoints(left.query_id, right.query_id))
|
|
128
131
|
.map((entry) => structuredClone(entry));
|
|
129
132
|
}
|
|
130
133
|
/** Return canonical composed-workflow entries for persistence. */
|
|
131
134
|
workflowEntries() {
|
|
132
135
|
return [...this.#workflowEntries.values()]
|
|
133
|
-
.sort((left, right) => left.query_id
|
|
136
|
+
.sort((left, right) => compareUnicodeCodePoints(left.query_id, right.query_id))
|
|
134
137
|
.map((entry) => structuredClone(entry));
|
|
135
138
|
}
|
|
136
139
|
/** Record one exact derived workflow result unless the shared cache is full. */
|
|
@@ -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({
|
|
@@ -276,6 +314,22 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
276
314
|
this.#calls.set(call, generation);
|
|
277
315
|
return call.finally(() => this.#calls.delete(call));
|
|
278
316
|
}
|
|
317
|
+
/** Admit one composed request until its result and session bookkeeping settle. */
|
|
318
|
+
withAdmittedAnalysis(operationName, signal, operation) {
|
|
319
|
+
const generation = this.#transitionGeneration;
|
|
320
|
+
const transition = this.#transition;
|
|
321
|
+
const call = (async () => {
|
|
322
|
+
const admission = await this.#waitForTransition(operationName, signal, transition);
|
|
323
|
+
if (!admission.ok)
|
|
324
|
+
return admission;
|
|
325
|
+
return ok(await operation({
|
|
326
|
+
execute: (name, arguments_, options) => this.#execute(name, arguments_, options, Promise.resolve()),
|
|
327
|
+
}));
|
|
328
|
+
})();
|
|
329
|
+
// Register synchronously before a lifecycle transition can snapshot calls.
|
|
330
|
+
this.#calls.set(call, generation);
|
|
331
|
+
return call.finally(() => this.#calls.delete(call));
|
|
332
|
+
}
|
|
279
333
|
async #execute(name, arguments_, options, transition) {
|
|
280
334
|
const transitioned = await this.#waitForTransition(name, options?.signal, transition);
|
|
281
335
|
if (!transitioned.ok)
|
|
@@ -328,7 +382,7 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
328
382
|
execution: profiled.value,
|
|
329
383
|
});
|
|
330
384
|
}
|
|
331
|
-
else if (profiled.ok && capability
|
|
385
|
+
else if (profiled.ok && capability.effects.mutatesArtifact) {
|
|
332
386
|
this.invalidateSnapshot();
|
|
333
387
|
}
|
|
334
388
|
return profiled;
|
|
@@ -410,21 +464,24 @@ export class BinarySession extends BinarySessionRecords {
|
|
|
410
464
|
}
|
|
411
465
|
async #restore(previous) {
|
|
412
466
|
if (previous === undefined)
|
|
413
|
-
return;
|
|
467
|
+
return ok(null);
|
|
414
468
|
const runId = randomUUID();
|
|
415
469
|
const client = previous.route.createClient(previous.target, { runId });
|
|
416
470
|
const started = await client.execute("health", {});
|
|
417
|
-
if (started.ok)
|
|
471
|
+
if (started.ok) {
|
|
418
472
|
this.#active = {
|
|
419
473
|
target: previous.target,
|
|
420
474
|
client,
|
|
421
475
|
profile: previous.profile,
|
|
422
|
-
compatibility: previous.compatibility,
|
|
423
476
|
route: previous.route,
|
|
424
477
|
runId,
|
|
425
478
|
};
|
|
426
|
-
|
|
427
|
-
|
|
479
|
+
return ok(null);
|
|
480
|
+
}
|
|
481
|
+
const closed = await this.#retireClient(client, previous.route.identity.id);
|
|
482
|
+
return closed.ok
|
|
483
|
+
? ok(null)
|
|
484
|
+
: err(analysisErrorWithCleanupFailure(started.error, closed.error, "open_binary"));
|
|
428
485
|
}
|
|
429
486
|
async #waitForTransition(operation, signal, transition) {
|
|
430
487
|
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";
|
|
@@ -8,7 +8,15 @@ import { SessionProviderRouter } from "./SessionProviderRouter.js";
|
|
|
8
8
|
/** Parse a target, resolve its provider route, and validate snapshot binding. */
|
|
9
9
|
export const resolveSessionOpen = async (input) => {
|
|
10
10
|
const { path, options } = input;
|
|
11
|
-
const parsed = await parseBinaryTarget(path,
|
|
11
|
+
const parsed = await parseBinaryTarget(path, {
|
|
12
|
+
...(options.targetKind === undefined
|
|
13
|
+
? {}
|
|
14
|
+
: { targetKind: options.targetKind }),
|
|
15
|
+
...(options.formatHint === undefined
|
|
16
|
+
? {}
|
|
17
|
+
: { formatHint: options.formatHint }),
|
|
18
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
19
|
+
});
|
|
12
20
|
if (!parsed.ok)
|
|
13
21
|
return parsed;
|
|
14
22
|
return resolveSessionTarget({ ...input, target: parsed.value });
|
|
@@ -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,
|