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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { authorizeRuntimeLocation, inspectorExclusionKey, throwIfRuntimeObservationCancelled, } from "./JavaScriptRuntimeScope.js";
|
|
2
|
+
import { authorizeRuntimeLocation, inspectorExclusionKey, projectReportedRuntimeUrl, throwIfRuntimeObservationCancelled, } from "./JavaScriptRuntimeScope.js";
|
|
3
3
|
/** Empty durable-location exclusion counters. */
|
|
4
4
|
export const createInspectorExclusionCounts = () => ({
|
|
5
5
|
unsupported_location: 0,
|
|
@@ -15,26 +15,29 @@ export const describeInspectorTargetLimitations = () => [
|
|
|
15
15
|
];
|
|
16
16
|
const LOCATION_AUTHORIZATION_WORKERS = 8;
|
|
17
17
|
/** Canonically authorize, deduplicate, and sort one bounded raw capture. */
|
|
18
|
-
export const finalizeInspectorCapture = async ({ input, runtime, target, state, authorizeLocation = authorizeRuntimeLocation, signal, }) => {
|
|
19
|
-
|
|
18
|
+
export const finalizeInspectorCapture = async ({ input, runtime, target, state, authorizeLocation = authorizeRuntimeLocation, locationMode = "verify", signal, }) => {
|
|
19
|
+
if (locationMode === "verify")
|
|
20
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
20
21
|
const exclusions = createInspectorExclusionCounts();
|
|
21
22
|
const scripts = new Map();
|
|
22
23
|
const draftsByUrl = new Map();
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
if (locationMode === "verify")
|
|
25
|
+
for (const draft of state.scripts) {
|
|
26
|
+
const drafts = draftsByUrl.get(draft.rawUrl) ?? [];
|
|
27
|
+
drafts.push(draft);
|
|
28
|
+
draftsByUrl.set(draft.rawUrl, drafts);
|
|
29
|
+
}
|
|
28
30
|
const groups = [...draftsByUrl];
|
|
29
31
|
const authorizedGroups = new Array(groups.length);
|
|
30
32
|
let nextGroup = 0;
|
|
31
33
|
let stopScheduling = false;
|
|
34
|
+
let unresolvedScripts = 0;
|
|
32
35
|
const worker = async () => {
|
|
33
36
|
try {
|
|
34
37
|
for (;;) {
|
|
35
|
-
throwIfRuntimeObservationCancelled(signal);
|
|
36
38
|
if (stopScheduling)
|
|
37
39
|
return;
|
|
40
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
38
41
|
const index = nextGroup;
|
|
39
42
|
nextGroup += 1;
|
|
40
43
|
const group = groups[index];
|
|
@@ -53,12 +56,18 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
53
56
|
throw cause;
|
|
54
57
|
}
|
|
55
58
|
};
|
|
56
|
-
const workerResults =
|
|
59
|
+
const workerResults = locationMode === "verify"
|
|
60
|
+
? await Promise.allSettled(Array.from({ length: Math.min(LOCATION_AUTHORIZATION_WORKERS, groups.length) }, worker))
|
|
61
|
+
: [];
|
|
57
62
|
const failedWorker = workerResults.find((result) => result.status === "rejected");
|
|
58
|
-
|
|
63
|
+
if (locationMode === "verify")
|
|
64
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
59
65
|
if (failedWorker?.status === "rejected")
|
|
60
66
|
throw failedWorker.reason;
|
|
61
|
-
for (const
|
|
67
|
+
for (const group of authorizedGroups) {
|
|
68
|
+
if (group === undefined)
|
|
69
|
+
continue;
|
|
70
|
+
const { drafts, decision } = group;
|
|
62
71
|
for (const draft of drafts) {
|
|
63
72
|
if (!decision.allowed) {
|
|
64
73
|
exclusions[inspectorExclusionKey(decision.reason)] += 1;
|
|
@@ -68,6 +77,14 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
68
77
|
scripts.set(script.script_key, script);
|
|
69
78
|
}
|
|
70
79
|
}
|
|
80
|
+
if (locationMode === "reported")
|
|
81
|
+
for (const draft of state.scripts) {
|
|
82
|
+
const location = partialScriptLocation(draft.rawUrl);
|
|
83
|
+
if (location.kind === "unresolved")
|
|
84
|
+
unresolvedScripts += 1;
|
|
85
|
+
const script = scriptFromDraft(draft, location);
|
|
86
|
+
scripts.set(script.script_key, script);
|
|
87
|
+
}
|
|
71
88
|
const items = [...scripts.values()].sort((left, right) => left.script_key < right.script_key
|
|
72
89
|
? -1
|
|
73
90
|
: left.script_key > right.script_key
|
|
@@ -77,7 +94,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
77
94
|
.map((context) => ({
|
|
78
95
|
context_key: context.contextKey,
|
|
79
96
|
state: context.state,
|
|
80
|
-
name:
|
|
97
|
+
name: context.name,
|
|
81
98
|
origin: context.origin,
|
|
82
99
|
}))
|
|
83
100
|
.sort((left, right) => left.context_key < right.context_key
|
|
@@ -85,7 +102,8 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
85
102
|
: left.context_key > right.context_key
|
|
86
103
|
? 1
|
|
87
104
|
: 0);
|
|
88
|
-
|
|
105
|
+
if (locationMode === "verify")
|
|
106
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
89
107
|
return {
|
|
90
108
|
runtime,
|
|
91
109
|
target: {
|
|
@@ -132,6 +150,11 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
132
150
|
"The discovery-reported file location cannot be verified; loaded script locations are resolved independently from Debugger.scriptParsed.",
|
|
133
151
|
]
|
|
134
152
|
: []),
|
|
153
|
+
...(unresolvedScripts === 0
|
|
154
|
+
? []
|
|
155
|
+
: [
|
|
156
|
+
`${String(unresolvedScripts)} observed script location${unresolvedScripts === 1 ? " remains" : "s remain"} unverified; raw URLs and script metadata are retained.`,
|
|
157
|
+
]),
|
|
135
158
|
"Scripts collected before attachment may have been garbage-collected and therefore omitted.",
|
|
136
159
|
"A bounded observation window cannot establish that an unobserved script or behavior never occurs.",
|
|
137
160
|
"The declared Node/Electron process role is not authenticated by the Inspector protocol.",
|
|
@@ -157,3 +180,13 @@ const scriptFromDraft = (draft, location) => {
|
|
|
157
180
|
status: "observed-loaded",
|
|
158
181
|
};
|
|
159
182
|
};
|
|
183
|
+
const partialScriptLocation = (reportedUrl) => {
|
|
184
|
+
const projection = projectReportedRuntimeUrl(reportedUrl);
|
|
185
|
+
if (projection.allowed)
|
|
186
|
+
return projection.location;
|
|
187
|
+
return {
|
|
188
|
+
kind: "unresolved",
|
|
189
|
+
reported_url: reportedUrl,
|
|
190
|
+
reason: "location-authorization-not-attempted",
|
|
191
|
+
};
|
|
192
|
+
};
|
|
@@ -4,13 +4,11 @@ import { BrowserObservationError } from "../domain/browserObservationError.js";
|
|
|
4
4
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
5
5
|
import {} from "../domain/browserObservationErrors.js";
|
|
6
6
|
import { err, ok } from "../domain/result.js";
|
|
7
|
-
import { numberValue, recordValue, cdpStringValue, delayWithCancellation, } from "../browser/CdpCaptureValues.js";
|
|
7
|
+
import { numberValue, recordValue, cdpStringValue, scriptMetadataValues, delayWithCancellation, } from "../browser/CdpCaptureValues.js";
|
|
8
8
|
import { CdpConnection } from "../browser/CdpConnection.js";
|
|
9
9
|
import { authorizeRuntimeTargetLocation, inspectorExclusionKey, } from "./JavaScriptRuntimeScope.js";
|
|
10
10
|
import { createInspectorExclusionCounts, describeInspectorTargetLimitations, finalizeInspectorCapture, } from "./V8InspectorCaptureProjection.js";
|
|
11
11
|
import { discoverV8Inspector, } from "./V8InspectorEndpoint.js";
|
|
12
|
-
/** Public identity committed by passive V8 Inspector observations. */
|
|
13
|
-
export { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentity.js";
|
|
14
12
|
import { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentity.js";
|
|
15
13
|
/** Maximum decoded CDP message accepted while observing one Inspector target. */
|
|
16
14
|
export const INSPECTOR_MAX_PAYLOAD_BYTES = 16 * 1024 * 1024;
|
|
@@ -56,19 +54,30 @@ export class V8InspectorProvider {
|
|
|
56
54
|
}
|
|
57
55
|
async observe(input, options = {}) {
|
|
58
56
|
let connection;
|
|
57
|
+
let discovery;
|
|
58
|
+
let target;
|
|
59
|
+
let state;
|
|
59
60
|
let primaryFailure;
|
|
60
61
|
let failed = false;
|
|
61
62
|
let cleanupFailure;
|
|
62
63
|
let cleanupFailed = false;
|
|
64
|
+
let connectionClosePromise;
|
|
63
65
|
let outcome;
|
|
66
|
+
const closeConnection = () => {
|
|
67
|
+
if (connection === undefined)
|
|
68
|
+
return Promise.resolve();
|
|
69
|
+
connectionClosePromise ??= closeInspectorConnection(connection, options.signal);
|
|
70
|
+
return connectionClosePromise;
|
|
71
|
+
};
|
|
64
72
|
try {
|
|
65
|
-
|
|
66
|
-
|
|
73
|
+
discovery = await discoverV8Inspector(input.inspector_endpoint, "observe_javascript_runtime", options.signal);
|
|
74
|
+
target = await authorizedTarget(discovery.targets, input, discovery.runtime.product);
|
|
67
75
|
if (input.runtime_kind !== undefined)
|
|
68
76
|
assertRuntimeKind(target, input.runtime_kind);
|
|
69
77
|
connection = await CdpConnection.connect(target.webSocketUrl, "observe_javascript_runtime", options.signal, { maxPayloadBytes: INSPECTOR_MAX_PAYLOAD_BYTES });
|
|
70
|
-
const
|
|
71
|
-
|
|
78
|
+
const captureState = emptyCaptureState();
|
|
79
|
+
state = captureState;
|
|
80
|
+
const removeListener = connection.onEvent((event) => ingestEvent(event, captureState));
|
|
72
81
|
try {
|
|
73
82
|
await connection.send("Runtime.enable", {}, undefined, options.signal);
|
|
74
83
|
await connection.send("Debugger.enable", {}, undefined, options.signal);
|
|
@@ -81,7 +90,7 @@ export class V8InspectorProvider {
|
|
|
81
90
|
input,
|
|
82
91
|
runtime: discovery.runtime,
|
|
83
92
|
target,
|
|
84
|
-
state,
|
|
93
|
+
state: captureState,
|
|
85
94
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
86
95
|
});
|
|
87
96
|
outcome = ok(javascriptRuntimeObservationSchema.parse(result));
|
|
@@ -89,12 +98,53 @@ export class V8InspectorProvider {
|
|
|
89
98
|
catch (cause) {
|
|
90
99
|
failed = true;
|
|
91
100
|
primaryFailure = cause;
|
|
92
|
-
|
|
101
|
+
let error = providerError(cause, "observe_javascript_runtime");
|
|
102
|
+
if (state !== undefined &&
|
|
103
|
+
discovery !== undefined &&
|
|
104
|
+
target !== undefined &&
|
|
105
|
+
(cause instanceof BrowserObservationError ||
|
|
106
|
+
options.signal?.aborted === true)) {
|
|
107
|
+
const reason = options.signal?.aborted === true
|
|
108
|
+
? "cancelled"
|
|
109
|
+
: cause instanceof BrowserObservationError
|
|
110
|
+
? cause.reason
|
|
111
|
+
: "protocol_error";
|
|
112
|
+
try {
|
|
113
|
+
await closeConnection();
|
|
114
|
+
}
|
|
115
|
+
catch (cause) {
|
|
116
|
+
cleanupFailed = true;
|
|
117
|
+
cleanupFailure = cause;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const partialObservation = await finalizeInspectorCapture({
|
|
121
|
+
input,
|
|
122
|
+
runtime: discovery.runtime,
|
|
123
|
+
target,
|
|
124
|
+
state,
|
|
125
|
+
locationMode: "reported",
|
|
126
|
+
});
|
|
127
|
+
error = new BrowserObservationError("observe_javascript_runtime", reason, {
|
|
128
|
+
cause: error,
|
|
129
|
+
...(error.userMessage === undefined
|
|
130
|
+
? {}
|
|
131
|
+
: { detail: error.userMessage }),
|
|
132
|
+
partialObservation,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch (projectionFailure) {
|
|
136
|
+
error = new BrowserObservationError("observe_javascript_runtime", reason, {
|
|
137
|
+
cause: new AggregateError([error, projectionFailure], "Inspector failure and partial-observation projection both failed"),
|
|
138
|
+
detail: `${error.message} Partial observations could not be projected.`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
outcome = err(error);
|
|
93
143
|
}
|
|
94
144
|
finally {
|
|
95
145
|
if (connection !== undefined)
|
|
96
146
|
try {
|
|
97
|
-
await
|
|
147
|
+
await closeConnection();
|
|
98
148
|
}
|
|
99
149
|
catch (cause) {
|
|
100
150
|
cleanupFailed = true;
|
|
@@ -102,7 +152,11 @@ export class V8InspectorProvider {
|
|
|
102
152
|
}
|
|
103
153
|
}
|
|
104
154
|
if (cleanupFailed) {
|
|
105
|
-
return err(inspectorCleanupError(primaryFailure, cleanupFailure, failed
|
|
155
|
+
return err(inspectorCleanupError(primaryFailure, cleanupFailure, failed, outcome?.ok === true
|
|
156
|
+
? outcome.value
|
|
157
|
+
: outcome?.ok === false
|
|
158
|
+
? outcome.error.partialObservation
|
|
159
|
+
: undefined));
|
|
106
160
|
}
|
|
107
161
|
return (outcome ??
|
|
108
162
|
err(new BrowserObservationError("observe_javascript_runtime", "protocol_error")));
|
|
@@ -132,11 +186,21 @@ export const closeInspectorConnection = async (connection, signal) => {
|
|
|
132
186
|
signal.removeEventListener("abort", onAbort);
|
|
133
187
|
}
|
|
134
188
|
};
|
|
135
|
-
export const inspectorCleanupError = (primaryFailure, cleanupFailure, hasPrimaryFailure) => {
|
|
189
|
+
export const inspectorCleanupError = (primaryFailure, cleanupFailure, hasPrimaryFailure, partialObservation) => {
|
|
136
190
|
const cause = hasPrimaryFailure
|
|
137
191
|
? new AggregateError([primaryFailure, cleanupFailure], "Inspector observation and cleanup both failed")
|
|
138
192
|
: cleanupFailure;
|
|
139
|
-
|
|
193
|
+
const cleanupReason = cleanupFailure instanceof Error
|
|
194
|
+
? cleanupFailure.message
|
|
195
|
+
: String(cleanupFailure);
|
|
196
|
+
return new BrowserObservationError("observe_javascript_runtime", "cleanup_failed", {
|
|
197
|
+
cause,
|
|
198
|
+
cleanup: {
|
|
199
|
+
reason: cleanupReason,
|
|
200
|
+
resources: ["browser_transport"],
|
|
201
|
+
},
|
|
202
|
+
...(partialObservation === undefined ? {} : { partialObservation }),
|
|
203
|
+
});
|
|
140
204
|
};
|
|
141
205
|
const projectTarget = (target) => ({
|
|
142
206
|
target_id: target.id,
|
|
@@ -177,7 +241,7 @@ const emptyCaptureState = () => ({
|
|
|
177
241
|
truncated: false,
|
|
178
242
|
truncationReasons: new Set(),
|
|
179
243
|
});
|
|
180
|
-
const ingestEvent = (event,
|
|
244
|
+
const ingestEvent = (event, state) => {
|
|
181
245
|
if (event.method !== "Debugger.scriptParsed" &&
|
|
182
246
|
event.method !== "Debugger.scriptFailedToParse" &&
|
|
183
247
|
event.method !== "Runtime.executionContextCreated" &&
|
|
@@ -186,7 +250,7 @@ const ingestEvent = (event, input, state) => {
|
|
|
186
250
|
return;
|
|
187
251
|
state.eventsObserved += 1;
|
|
188
252
|
if (event.method === "Debugger.scriptParsed") {
|
|
189
|
-
ingestScript(event,
|
|
253
|
+
ingestScript(event, state);
|
|
190
254
|
return;
|
|
191
255
|
}
|
|
192
256
|
if (event.method === "Debugger.scriptFailedToParse") {
|
|
@@ -194,30 +258,31 @@ const ingestEvent = (event, input, state) => {
|
|
|
194
258
|
retainEvent(state, 0);
|
|
195
259
|
return;
|
|
196
260
|
}
|
|
197
|
-
ingestContext(event,
|
|
261
|
+
ingestContext(event, state);
|
|
198
262
|
};
|
|
199
|
-
const ingestScript = (event,
|
|
263
|
+
const ingestScript = (event, state) => {
|
|
200
264
|
state.scriptsObserved += 1;
|
|
201
265
|
const value = recordValue(event.params);
|
|
202
266
|
const rawUrl = cdpStringValue(value?.url);
|
|
203
|
-
if (rawUrl === undefined
|
|
267
|
+
if (rawUrl === undefined) {
|
|
204
268
|
state.invalidScripts += 1;
|
|
205
269
|
retainEvent(state, 0);
|
|
206
270
|
return;
|
|
207
271
|
}
|
|
272
|
+
const metadata = scriptMetadataValues(value);
|
|
208
273
|
const draft = {
|
|
209
274
|
rawUrl,
|
|
210
275
|
executionContextKey: contextKey(value?.executionContextId),
|
|
211
|
-
cdpHash:
|
|
212
|
-
length:
|
|
213
|
-
isModule:
|
|
276
|
+
cdpHash: metadata.hash,
|
|
277
|
+
length: metadata.length,
|
|
278
|
+
isModule: metadata.isModule,
|
|
214
279
|
};
|
|
215
280
|
const bytes = retainedMetadataBytes(draft);
|
|
216
281
|
if (!retainEvent(state, bytes))
|
|
217
282
|
return;
|
|
218
283
|
state.scripts.push(draft);
|
|
219
284
|
};
|
|
220
|
-
const ingestContext = (event,
|
|
285
|
+
const ingestContext = (event, state) => {
|
|
221
286
|
if (event.method === "Runtime.executionContextsCleared") {
|
|
222
287
|
let byteDelta = 0;
|
|
223
288
|
for (const context of state.contexts.values()) {
|
|
@@ -243,17 +308,18 @@ const ingestContext = (event, input, state) => {
|
|
|
243
308
|
retainEvent(state, 0);
|
|
244
309
|
return;
|
|
245
310
|
}
|
|
246
|
-
const
|
|
247
|
-
|
|
248
|
-
: null;
|
|
311
|
+
const previous = state.contexts.get(key);
|
|
312
|
+
const created = event.method === "Runtime.executionContextCreated";
|
|
249
313
|
const draft = {
|
|
250
314
|
contextKey: key,
|
|
251
|
-
state:
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
315
|
+
state: created ? "created" : "destroyed",
|
|
316
|
+
name: created
|
|
317
|
+
? (cdpStringValue(runtimeContext?.name) ?? null)
|
|
318
|
+
: (previous?.name ?? null),
|
|
319
|
+
origin: created
|
|
320
|
+
? (cdpStringValue(runtimeContext?.origin) ?? null)
|
|
321
|
+
: (previous?.origin ?? null),
|
|
255
322
|
};
|
|
256
|
-
const previous = state.contexts.get(key);
|
|
257
323
|
const bytes = retainedMetadataBytes(draft) -
|
|
258
324
|
(previous === undefined ? 0 : retainedMetadataBytes(previous));
|
|
259
325
|
if (!retainEvent(state, bytes))
|
|
@@ -294,14 +360,10 @@ const waitForCapture = async (connection, observationMs, signal) => {
|
|
|
294
360
|
const retainedMetadataBytes = (value) => {
|
|
295
361
|
const strings = "rawUrl" in value
|
|
296
362
|
? [value.rawUrl, value.rawUrl, value.executionContextKey, value.cdpHash]
|
|
297
|
-
: [value.contextKey, value.origin];
|
|
363
|
+
: [value.contextKey, value.name, value.origin];
|
|
298
364
|
return (RETAINED_OBJECT_OVERHEAD_BYTES +
|
|
299
365
|
strings.reduce((total, text) => total + (text?.length ?? 0) * 2, 0));
|
|
300
366
|
};
|
|
301
|
-
const nonnegativeInteger = (value) => {
|
|
302
|
-
const parsed = numberValue(value);
|
|
303
|
-
return parsed === undefined ? 0 : Math.max(0, Math.trunc(parsed));
|
|
304
|
-
};
|
|
305
367
|
const contextKey = (value) => {
|
|
306
368
|
const identifier = numberValue(value);
|
|
307
369
|
return identifier !== undefined && Number.isSafeInteger(identifier)
|
|
@@ -10,6 +10,7 @@ import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../../pro
|
|
|
10
10
|
import { checkRecoveryDeadline, inventoryRecoveryFiles, fingerprintRecoveryFile, recoveryFailureMessage, } from "./RecoveryFiles.js";
|
|
11
11
|
import { RECOVERY_LIMITS } from "./WakaruRelease.js";
|
|
12
12
|
const OPERATION = "recover_javascript_sources";
|
|
13
|
+
const WAKARU_REQUIREMENT = "Provide an absolute REA_WAKARU_COMMAND pointing to Wakaru 1.13.0 on Linux x64; no tool is installed by REA";
|
|
13
14
|
/** Resolve and fingerprint explicitly configured tools; acquire nothing at startup. */
|
|
14
15
|
export const resolveWakaruCommand = async (environment) => {
|
|
15
16
|
const configured = environment.REA_WAKARU_COMMAND;
|
|
@@ -17,7 +18,7 @@ export const resolveWakaruCommand = async (environment) => {
|
|
|
17
18
|
process.arch !== "x64" ||
|
|
18
19
|
configured === undefined ||
|
|
19
20
|
!isAbsolute(configured))
|
|
20
|
-
throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION,
|
|
21
|
+
throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, WAKARU_REQUIREMENT, { userMessage: WAKARU_REQUIREMENT });
|
|
21
22
|
try {
|
|
22
23
|
const command = await realpath(configured);
|
|
23
24
|
await access(command, constants.R_OK | constants.X_OK);
|
|
@@ -29,7 +30,11 @@ export const resolveWakaruCommand = async (environment) => {
|
|
|
29
30
|
return { command, limiter, ...fingerprint };
|
|
30
31
|
}
|
|
31
32
|
catch (cause) {
|
|
32
|
-
|
|
33
|
+
const reason = `Configured Wakaru or util-linux prlimit is unavailable: ${recoveryFailureMessage(cause)}`;
|
|
34
|
+
throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, reason, {
|
|
35
|
+
cause,
|
|
36
|
+
userMessage: reason,
|
|
37
|
+
});
|
|
33
38
|
}
|
|
34
39
|
};
|
|
35
40
|
/** Run one bounded command and verify cleanup before consuming its output. */
|
|
@@ -30,8 +30,11 @@ const executeWakaruRecovery = async (context) => {
|
|
|
30
30
|
arguments: ["--version"],
|
|
31
31
|
});
|
|
32
32
|
if (version.exit_code !== 0 ||
|
|
33
|
-
version.stdout.trim() !== `wakaru ${WAKARU_RELEASE.version}`)
|
|
34
|
-
|
|
33
|
+
version.stdout.trim() !== `wakaru ${WAKARU_RELEASE.version}`) {
|
|
34
|
+
// The message names the mismatch; the reason also keeps the tool's stderr.
|
|
35
|
+
const mismatch = `This adapter requires Wakaru ${WAKARU_RELEASE.version}; reported version: ${version.stdout.trim()}; exit: ${String(version.exit_code)}`;
|
|
36
|
+
throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, `${mismatch}; stderr: ${version.stderr}`, { userMessage: `${mismatch}.` });
|
|
37
|
+
}
|
|
35
38
|
const run = await runWakaruCommand({
|
|
36
39
|
...commandContext,
|
|
37
40
|
staging,
|
package/dist/main/shutdown.js
CHANGED
|
@@ -1,22 +1,53 @@
|
|
|
1
|
+
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
2
|
+
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
1
3
|
import { MCP_SHUTDOWN_FAILED } from "./messages.js";
|
|
2
4
|
export const createShutdown = (input) => {
|
|
3
|
-
const { handle, session,
|
|
4
|
-
let
|
|
5
|
+
const { handle, session, dependencies, serverLogger } = input;
|
|
6
|
+
let shutdownAttempt;
|
|
7
|
+
const cleanupOwners = [
|
|
8
|
+
{ close: () => handle.close(), closed: false },
|
|
9
|
+
...(input.closeAndroid === undefined
|
|
10
|
+
? []
|
|
11
|
+
: [{ close: input.closeAndroid, closed: false }]),
|
|
12
|
+
{
|
|
13
|
+
close: async () => {
|
|
14
|
+
const closed = await session.close({ retainProviderDocuments: true });
|
|
15
|
+
if (!closed.ok)
|
|
16
|
+
throw closed.error;
|
|
17
|
+
},
|
|
18
|
+
closed: false,
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
let shutdownUnregistered = false;
|
|
5
22
|
let unregisterShutdown = () => undefined;
|
|
6
23
|
const shutdown = async () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
24
|
+
if (shutdownAttempt !== undefined)
|
|
25
|
+
return shutdownAttempt;
|
|
26
|
+
const pending = cleanupOwners.filter(({ closed }) => !closed);
|
|
27
|
+
const attempt = (async () => {
|
|
28
|
+
const results = await Promise.allSettled(pending.map(async (owner) => {
|
|
29
|
+
await owner.close();
|
|
30
|
+
owner.closed = true;
|
|
31
|
+
}));
|
|
32
|
+
const failures = [];
|
|
15
33
|
for (const result of results)
|
|
16
34
|
if (result.status === "rejected")
|
|
17
|
-
|
|
35
|
+
failures.push(result.reason);
|
|
36
|
+
if (failures.length === 1)
|
|
37
|
+
throw failures[0];
|
|
38
|
+
if (failures.length > 1)
|
|
39
|
+
throw new AggregateError(failures, "Multiple MCP cleanup operations failed");
|
|
40
|
+
if (!shutdownUnregistered) {
|
|
41
|
+
unregisterShutdown();
|
|
42
|
+
shutdownUnregistered = true;
|
|
43
|
+
}
|
|
18
44
|
})();
|
|
19
|
-
|
|
45
|
+
shutdownAttempt = attempt;
|
|
46
|
+
void attempt.catch(() => {
|
|
47
|
+
if (shutdownAttempt === attempt)
|
|
48
|
+
shutdownAttempt = undefined;
|
|
49
|
+
});
|
|
50
|
+
return attempt;
|
|
20
51
|
};
|
|
21
52
|
const requestShutdown = () => {
|
|
22
53
|
shutdown().catch((cause) => {
|
|
@@ -24,27 +55,48 @@ export const createShutdown = (input) => {
|
|
|
24
55
|
dependencies.setExitCode(1);
|
|
25
56
|
serverLogger.error(MCP_SHUTDOWN_FAILED);
|
|
26
57
|
dependencies.writeStderr(`${MCP_SHUTDOWN_FAILED}\n`);
|
|
58
|
+
if (cause instanceof AnalysisError)
|
|
59
|
+
dependencies.writeStderr(`${projectAnalysisError(cause).message}\n`);
|
|
27
60
|
});
|
|
28
61
|
};
|
|
29
62
|
unregisterShutdown = dependencies.registerShutdown(requestShutdown);
|
|
30
63
|
return { shutdown, request: requestShutdown };
|
|
31
64
|
};
|
|
32
|
-
const describeShutdownFailure = (cause) =>
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
65
|
+
const describeShutdownFailure = (cause) => describeShutdownFailureNode(cause, new WeakSet());
|
|
66
|
+
const describeShutdownFailureNode = (cause, active) => {
|
|
67
|
+
if (typeof cause === "object" && cause !== null) {
|
|
68
|
+
if (active.has(cause))
|
|
69
|
+
return { type: "cyclic_error" };
|
|
70
|
+
active.add(cause);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
if (cause instanceof AnalysisError)
|
|
74
|
+
return { analysis_error: projectAnalysisError(cause) };
|
|
75
|
+
if (cause instanceof Error) {
|
|
76
|
+
const code = "code" in cause ? cause.code : undefined;
|
|
77
|
+
return {
|
|
78
|
+
name: cause.name,
|
|
79
|
+
message: cause.message,
|
|
80
|
+
...(typeof code === "string" ||
|
|
81
|
+
(typeof code === "number" && Number.isFinite(code))
|
|
82
|
+
? { code }
|
|
83
|
+
: {}),
|
|
84
|
+
...(cause instanceof AggregateError
|
|
85
|
+
? {
|
|
86
|
+
errors: cause.errors.map((error) => describeShutdownFailureNode(error, active)),
|
|
87
|
+
}
|
|
88
|
+
: {}),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (cause === null ||
|
|
92
|
+
typeof cause === "string" ||
|
|
93
|
+
typeof cause === "boolean" ||
|
|
94
|
+
(typeof cause === "number" && Number.isFinite(cause)))
|
|
95
|
+
return { type: cause === null ? "null" : typeof cause, value: cause };
|
|
96
|
+
return { type: typeof cause };
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
if (typeof cause === "object" && cause !== null)
|
|
100
|
+
active.delete(cause);
|
|
43
101
|
}
|
|
44
|
-
if (cause === null ||
|
|
45
|
-
typeof cause === "string" ||
|
|
46
|
-
typeof cause === "boolean" ||
|
|
47
|
-
(typeof cause === "number" && Number.isFinite(cause)))
|
|
48
|
-
return { type: cause === null ? "null" : typeof cause, value: cause };
|
|
49
|
-
return { type: typeof cause };
|
|
50
102
|
};
|
package/dist/main/startup.js
CHANGED
|
@@ -7,8 +7,15 @@ export const openInitialTarget = async (session, config, serverLogger, writeStde
|
|
|
7
7
|
});
|
|
8
8
|
if (opened.ok)
|
|
9
9
|
return { ok: true };
|
|
10
|
-
await session.close();
|
|
11
|
-
serverLogger.error({
|
|
10
|
+
const closed = await session.close();
|
|
11
|
+
serverLogger.error({
|
|
12
|
+
error: projectAnalysisError(opened.error),
|
|
13
|
+
...(closed.ok
|
|
14
|
+
? {}
|
|
15
|
+
: { cleanup_error: projectAnalysisError(closed.error) }),
|
|
16
|
+
}, "Initial target failed to open");
|
|
12
17
|
writeStderr(`${projectAnalysisError(opened.error).message}\n`);
|
|
18
|
+
if (!closed.ok)
|
|
19
|
+
writeStderr(`${projectAnalysisError(closed.error).message}\n`);
|
|
13
20
|
return { ok: false, exitCode: 1 };
|
|
14
21
|
};
|
package/dist/main/transport.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createAndroidAnalysisProvider } from "../composition/android.js";
|
|
2
2
|
import { createServer } from "../server/createServer.js";
|
|
3
|
+
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
3
4
|
import { MCP_CONNECTION_LOST, MCP_CONNECTION_START_FAILED, } from "./messages.js";
|
|
4
5
|
export const startMcpTransport = async (dependencies, session, serverContext) => {
|
|
5
6
|
const { serverLogger } = serverContext;
|
|
@@ -26,10 +27,12 @@ export const startMcpTransport = async (dependencies, session, serverContext) =>
|
|
|
26
27
|
try {
|
|
27
28
|
handle = dependencies.serve(() => {
|
|
28
29
|
// The SDK can discard a discovery probe and construct a replacement server.
|
|
29
|
-
const android = createAndroidAnalysisProvider(
|
|
30
|
+
const android = createAndroidAnalysisProvider(serverContext.environment);
|
|
30
31
|
androidProviders.push(android);
|
|
31
|
-
return (dependencies.createServer ?? createServer)(session, session, {
|
|
32
|
+
return (dependencies.createServer ?? createServer)({ kind: "session", session }, {
|
|
32
33
|
logger: serverContext.logger,
|
|
34
|
+
environment: serverContext.environment,
|
|
35
|
+
delivery: serverContext.delivery,
|
|
33
36
|
...optionalProviders,
|
|
34
37
|
androidAnalysis: android,
|
|
35
38
|
});
|
|
@@ -41,11 +44,28 @@ export const startMcpTransport = async (dependencies, session, serverContext) =>
|
|
|
41
44
|
});
|
|
42
45
|
}
|
|
43
46
|
catch (cause) {
|
|
44
|
-
await Promise.allSettled([
|
|
47
|
+
const [binaryCleanup, androidCleanup] = await Promise.allSettled([
|
|
48
|
+
session.close(),
|
|
49
|
+
closeAndroid(),
|
|
50
|
+
]);
|
|
45
51
|
serverLogger.error({
|
|
46
52
|
error: cause instanceof Error ? cause.message : String(cause),
|
|
47
53
|
}, MCP_CONNECTION_START_FAILED);
|
|
48
54
|
dependencies.writeStderr(`${MCP_CONNECTION_START_FAILED}\n`);
|
|
55
|
+
if (binaryCleanup.status === "fulfilled" && !binaryCleanup.value.ok) {
|
|
56
|
+
const cleanupError = projectAnalysisError(binaryCleanup.value.error);
|
|
57
|
+
serverLogger.error({ cleanup_error: cleanupError }, "Binary provider cleanup failed after MCP startup");
|
|
58
|
+
dependencies.writeStderr(`${cleanupError.message}\n`);
|
|
59
|
+
}
|
|
60
|
+
for (const cleanup of [binaryCleanup, androidCleanup]) {
|
|
61
|
+
if (cleanup.status === "rejected") {
|
|
62
|
+
const reason = cleanup.reason instanceof Error
|
|
63
|
+
? cleanup.reason.message
|
|
64
|
+
: String(cleanup.reason);
|
|
65
|
+
serverLogger.error({ cleanup_error: reason }, "Provider cleanup rejected after MCP startup");
|
|
66
|
+
dependencies.writeStderr(`Provider cleanup failed: ${reason}\n`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
49
69
|
return { ok: false };
|
|
50
70
|
}
|
|
51
71
|
return { ok: true, handle, closeAndroid };
|