rea-agents 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -141,7 +141,7 @@ export class IdaOperationRunner {
|
|
|
141
141
|
offset,
|
|
142
142
|
max_lines: 100,
|
|
143
143
|
}));
|
|
144
|
-
if (page.code === null)
|
|
144
|
+
if (page.code === null || page.error !== undefined)
|
|
145
145
|
throw new AnalysisProtocolError(`IDA decompilation failed: ${page.error ?? "missing code"}`);
|
|
146
146
|
result.push(page.code);
|
|
147
147
|
offset = nextOffset(page.cursor, offset);
|
|
@@ -152,7 +152,7 @@ export class IdaOperationRunner {
|
|
|
152
152
|
if (this.protocol === "legacy")
|
|
153
153
|
return legacyXrefsSchema.parse(await this.call("get_xrefs_to", { address }));
|
|
154
154
|
const page = modernXrefsSchema.parse(await this.call("xrefs_to", { addrs: [address], limit: 1000 }))[0];
|
|
155
|
-
if (page?.xrefs == null)
|
|
155
|
+
if (page?.xrefs == null || page.error !== undefined)
|
|
156
156
|
throw new AnalysisProtocolError(`IDA xrefs failed: ${page?.error ?? "missing references"}`);
|
|
157
157
|
if (page.more === true)
|
|
158
158
|
this.limitations.push("Upstream xrefs_to capped results at 1000 references; additional references remain unknown.");
|
|
@@ -183,7 +183,7 @@ export class IdaOperationRunner {
|
|
|
183
183
|
}
|
|
184
184
|
else {
|
|
185
185
|
const page = modernCalleesSchema.parse(await this.call("callees", { addrs: [fn.address], limit: 500 }))[0];
|
|
186
|
-
if (page?.callees == null)
|
|
186
|
+
if (page?.callees == null || page.error !== undefined)
|
|
187
187
|
throw new AnalysisProtocolError(`IDA callees failed: ${page?.error ?? "missing callees"}`);
|
|
188
188
|
if (page.more === true)
|
|
189
189
|
this.limitations.push("Upstream callees capped results at 500; additional callees remain unknown.");
|
package/dist/ida/IdaProvider.js
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
1
2
|
import { createAnalysisProfile } from "../domain/analysisProfile.js";
|
|
2
3
|
import { err, ok } from "../domain/result.js";
|
|
3
4
|
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
4
|
-
import { ConfigurationError } from "../domain/configurationErrors.js";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
6
6
|
import canonicalize from "canonicalize";
|
|
7
|
-
import { readIdaConfiguration, } from "./IdaConfiguration.js";
|
|
7
|
+
import { readIdaConfiguration, idaConfigurationError, } from "./IdaConfiguration.js";
|
|
8
8
|
import { createIdaMcpConnection, } from "./IdaMcpConnection.js";
|
|
9
9
|
import { idaCapabilities, IDA_PROVIDER_IDENTITY, } from "./IdaProviderCapabilities.js";
|
|
10
10
|
import { IdaSessionClient } from "./IdaSessionClient.js";
|
|
11
11
|
import { privateRuntimeRootCapability } from "../process/PrivateRuntimeRoot.js";
|
|
12
|
-
export { IDA_PROVIDER_IDENTITY } from "./IdaProviderCapabilities.js";
|
|
13
12
|
/** Bring-your-own IDA MCP candidate; discovery performs no provider startup. */
|
|
14
13
|
export class IdaProvider {
|
|
15
14
|
config;
|
|
16
15
|
connectionFactory;
|
|
17
16
|
#registration;
|
|
18
|
-
|
|
17
|
+
environment;
|
|
18
|
+
constructor(config, environment, connectionFactory = createIdaMcpConnection) {
|
|
19
19
|
this.config = config;
|
|
20
20
|
this.connectionFactory = connectionFactory;
|
|
21
|
+
this.environment = snapshotEnvironment(environment);
|
|
21
22
|
}
|
|
22
23
|
identity() {
|
|
23
24
|
return IDA_PROVIDER_IDENTITY;
|
|
@@ -99,11 +100,6 @@ export class IdaProvider {
|
|
|
99
100
|
.update(canonicalize(config.value) ?? "")
|
|
100
101
|
.digest("hex"),
|
|
101
102
|
}),
|
|
102
|
-
compatibility: {
|
|
103
|
-
mode: config.value.mode,
|
|
104
|
-
engine_version: null,
|
|
105
|
-
upstream_distribution_version: null,
|
|
106
|
-
},
|
|
107
103
|
});
|
|
108
104
|
}
|
|
109
105
|
createClient(target, profile) {
|
|
@@ -111,9 +107,9 @@ export class IdaProvider {
|
|
|
111
107
|
if (!config.ok)
|
|
112
108
|
return {
|
|
113
109
|
execute: async () => err(config.error),
|
|
114
|
-
close: async () =>
|
|
110
|
+
close: async () => ok(null),
|
|
115
111
|
};
|
|
116
|
-
return new IdaSessionClient(config.value, target, this.connectionFactory(config.value), profile);
|
|
112
|
+
return new IdaSessionClient(config.value, target, this.connectionFactory(config.value, this.environment), profile);
|
|
117
113
|
}
|
|
118
114
|
#configuration() {
|
|
119
115
|
this.#registration ??=
|
|
@@ -123,4 +119,4 @@ export class IdaProvider {
|
|
|
123
119
|
return this.#registration;
|
|
124
120
|
}
|
|
125
121
|
}
|
|
126
|
-
const readIdaConfigurationNotConfigured = () => err(
|
|
122
|
+
const readIdaConfigurationNotConfigured = () => err(idaConfigurationError("Set REA_IDA_MCP_CONFIG to an upstream IDA MCP JSON registration; see docs/ida-provider.md."));
|
|
@@ -46,7 +46,8 @@ class IdaCleanupError extends ProviderAdapterError {
|
|
|
46
46
|
super("ida", "close", {
|
|
47
47
|
cause,
|
|
48
48
|
diagnostics: {
|
|
49
|
-
reason: "IDA
|
|
49
|
+
reason: "IDA cleanup could not be verified; the remaining connection or private workspace is retained for retry.",
|
|
50
|
+
failure_reason: cause instanceof Error ? cause.message : String(cause),
|
|
50
51
|
workspace: path,
|
|
51
52
|
},
|
|
52
53
|
});
|
|
@@ -66,6 +67,7 @@ export class IdaSessionClient {
|
|
|
66
67
|
#closePromise;
|
|
67
68
|
#workspace;
|
|
68
69
|
#database;
|
|
70
|
+
#databaseCloseAcknowledged = false;
|
|
69
71
|
#openAttempted = false;
|
|
70
72
|
#openCompleted = false;
|
|
71
73
|
#initialIdentity;
|
|
@@ -185,7 +187,8 @@ export class IdaSessionClient {
|
|
|
185
187
|
if (missing.length > 0)
|
|
186
188
|
throw new AnalysisProtocolError(`IDA MCP ${this.config.mode} compatibility profile is missing tools: ${missing.join(", ")}. Attached mode requires the legacy 1.4 profile; headless mode requires the database supervisor profile. See docs/ida-provider.md.`);
|
|
187
189
|
if (this.config.mode === "headless") {
|
|
188
|
-
this.#workspace = await IdaWorkspace.
|
|
190
|
+
this.#workspace = await IdaWorkspace.allocate(this.target, this.config.workspaceRoot);
|
|
191
|
+
await this.#workspace.copyInput();
|
|
189
192
|
this.#openAttempted = true;
|
|
190
193
|
const raw = await this.connection.call("idb_open", {
|
|
191
194
|
input_path: this.#workspace.inputPath,
|
|
@@ -253,7 +256,7 @@ export class IdaSessionClient {
|
|
|
253
256
|
this.#initialIdentity = identity;
|
|
254
257
|
return this.#metadata;
|
|
255
258
|
}
|
|
256
|
-
async
|
|
259
|
+
async close() {
|
|
257
260
|
if (this.#closePromise !== undefined)
|
|
258
261
|
return this.#closePromise;
|
|
259
262
|
const closing = this.#closeOnce();
|
|
@@ -283,22 +286,27 @@ export class IdaSessionClient {
|
|
|
283
286
|
throw new AnalysisProtocolError("An unowned worker still uses the private workspace; it was retained.");
|
|
284
287
|
}
|
|
285
288
|
if (this.#database !== undefined) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
closed.
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
289
|
+
if (!this.#databaseCloseAcknowledged) {
|
|
290
|
+
const closed = closeDatabaseSchema.parse(await this.connection.call("idb_close", {
|
|
291
|
+
database: this.#database,
|
|
292
|
+
save: false,
|
|
293
|
+
}));
|
|
294
|
+
if (closed.session_id !== this.#database ||
|
|
295
|
+
closed.saved === true ||
|
|
296
|
+
closed.owned !== true ||
|
|
297
|
+
closed.backend !== "worker")
|
|
298
|
+
throw new AnalysisProtocolError("IDA database close did not confirm the requested owned, unsaved session release.");
|
|
299
|
+
this.#databaseCloseAcknowledged = true;
|
|
300
|
+
}
|
|
295
301
|
const inventory = databaseListSchema.parse(await this.connection.call("idb_list", {}));
|
|
296
302
|
if (inventory.sessions.some((entry) => entry.session_id === this.#database ||
|
|
297
303
|
sameIdaHostPath(entry.input_path, this.#workspace?.inputPath ?? "")))
|
|
298
304
|
throw new AnalysisProtocolError("IDA worker remains registered after close.");
|
|
305
|
+
this.#database = undefined;
|
|
299
306
|
}
|
|
300
307
|
if (!this.#openCompleted)
|
|
301
308
|
throw new AnalysisProtocolError("IDA database open did not return a completed response. Worker inventory cannot prove that the request has stopped; the private workspace was retained.");
|
|
309
|
+
this.#openAttempted = false;
|
|
302
310
|
}
|
|
303
311
|
await this.connection.close();
|
|
304
312
|
await this.#workspace?.remove();
|
|
@@ -306,13 +314,7 @@ export class IdaSessionClient {
|
|
|
306
314
|
return ok(null);
|
|
307
315
|
}
|
|
308
316
|
catch (cause) {
|
|
309
|
-
await this.connection.close().catch(() => undefined);
|
|
310
317
|
return err(new IdaCleanupError(this.#workspace?.directory ?? "IDA MCP connection", cause));
|
|
311
318
|
}
|
|
312
319
|
}
|
|
313
|
-
async close() {
|
|
314
|
-
const result = await this.closeWithOutcome();
|
|
315
|
-
if (!result.ok)
|
|
316
|
-
throw result.error;
|
|
317
|
-
}
|
|
318
320
|
}
|
package/dist/ida/IdaWorkspace.js
CHANGED
|
@@ -20,32 +20,31 @@ export const sameIdaHostPath = (left, right) => process.platform === "win32"
|
|
|
20
20
|
export class IdaWorkspace {
|
|
21
21
|
runtime;
|
|
22
22
|
inputPath;
|
|
23
|
+
target;
|
|
23
24
|
sessionId = `rea-${randomUUID()}`;
|
|
24
|
-
constructor(runtime, inputPath) {
|
|
25
|
+
constructor(runtime, inputPath, target) {
|
|
25
26
|
this.runtime = runtime;
|
|
26
27
|
this.inputPath = inputPath;
|
|
28
|
+
this.target = target;
|
|
27
29
|
}
|
|
28
30
|
/** Filesystem root owned exclusively by this headless session. */
|
|
29
31
|
get directory() {
|
|
30
32
|
return this.runtime.path;
|
|
31
33
|
}
|
|
32
|
-
/** Allocate a protected workspace
|
|
33
|
-
static async
|
|
34
|
+
/** Allocate a protected workspace so its owner can retain it before input preparation. */
|
|
35
|
+
static async allocate(target, root = tmpdir()) {
|
|
34
36
|
const runtime = await PrivateRuntimeRoot.create({
|
|
35
37
|
parent: normalize(root),
|
|
36
38
|
prefix: "rea-ida-",
|
|
37
39
|
});
|
|
38
40
|
const inputPath = join(runtime.path, basename(target.path));
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
await runtime.close();
|
|
47
|
-
throw cause;
|
|
48
|
-
}
|
|
41
|
+
return new IdaWorkspace(runtime, inputPath, target);
|
|
42
|
+
}
|
|
43
|
+
/** Copy and verify admitted bytes after the session owns this workspace's cleanup. */
|
|
44
|
+
async copyInput() {
|
|
45
|
+
await copyFile(this.target.path, this.inputPath, constants.COPYFILE_EXCL);
|
|
46
|
+
if ((await idaFileDigest(this.inputPath)) !== this.target.sha256)
|
|
47
|
+
throw new AnalysisProtocolError("IDA target changed between admission and the private input copy; reopen the target.");
|
|
49
48
|
}
|
|
50
49
|
/** Delete only this object's privately allocated directory after worker cleanup. */
|
|
51
50
|
async remove() {
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { pathToFileURL } from "node:url";
|
|
2
2
|
import { browserOriginSchema, sanitizeBrowserUrl, } from "../domain/browserObservation.js";
|
|
3
|
+
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
3
4
|
import { authorizedElectronFile } from "../browser/ElectronFileScope.js";
|
|
5
|
+
/** Throw the operation's typed cancellation error whenever its signal is aborted. */
|
|
6
|
+
export const throwIfRuntimeObservationCancelled = (signal) => {
|
|
7
|
+
if (signal?.aborted === true)
|
|
8
|
+
throw new AnalysisCancelledError("observe_javascript_runtime");
|
|
9
|
+
};
|
|
4
10
|
/**
|
|
5
11
|
* Wire bucket for inspector script exclusions. The V8 observation schemas
|
|
6
12
|
* fix the `unsupported_location` key, so every canonical denial reason maps
|
|
@@ -13,7 +19,8 @@ export const inspectorExclusionKey = (reason) => {
|
|
|
13
19
|
return "unsupported_location";
|
|
14
20
|
};
|
|
15
21
|
/** Resolve a protocol location exposed by the explicitly selected Inspector endpoint. */
|
|
16
|
-
export const authorizeRuntimeLocation = async (value) => {
|
|
22
|
+
export const authorizeRuntimeLocation = async (value, signal) => {
|
|
23
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
17
24
|
if (value.startsWith("node:") && value.length > 0)
|
|
18
25
|
return {
|
|
19
26
|
allowed: true,
|
|
@@ -21,6 +28,7 @@ export const authorizeRuntimeLocation = async (value) => {
|
|
|
21
28
|
};
|
|
22
29
|
if (value.startsWith("file:")) {
|
|
23
30
|
const filePath = await authorizedElectronFile(value);
|
|
31
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
24
32
|
return filePath === undefined
|
|
25
33
|
? { allowed: false, reason: "not_approved" }
|
|
26
34
|
: { allowed: true, location: { kind: "file", file_path: filePath } };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { authorizeRuntimeLocation, inspectorExclusionKey, } from "./JavaScriptRuntimeScope.js";
|
|
2
|
+
import { authorizeRuntimeLocation, inspectorExclusionKey, throwIfRuntimeObservationCancelled, } from "./JavaScriptRuntimeScope.js";
|
|
3
3
|
/** Empty durable-location exclusion counters. */
|
|
4
4
|
export const createInspectorExclusionCounts = () => ({
|
|
5
5
|
unsupported_location: 0,
|
|
@@ -15,7 +15,8 @@ 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, }) => {
|
|
18
|
+
export const finalizeInspectorCapture = async ({ input, runtime, target, state, authorizeLocation = authorizeRuntimeLocation, signal, }) => {
|
|
19
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
19
20
|
const exclusions = createInspectorExclusionCounts();
|
|
20
21
|
const scripts = new Map();
|
|
21
22
|
const draftsByUrl = new Map();
|
|
@@ -31,6 +32,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
31
32
|
const worker = async () => {
|
|
32
33
|
try {
|
|
33
34
|
for (;;) {
|
|
35
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
34
36
|
if (stopScheduling)
|
|
35
37
|
return;
|
|
36
38
|
const index = nextGroup;
|
|
@@ -41,8 +43,9 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
41
43
|
const [rawUrl, drafts] = group;
|
|
42
44
|
authorizedGroups[index] = {
|
|
43
45
|
drafts,
|
|
44
|
-
decision: await authorizeLocation(rawUrl),
|
|
46
|
+
decision: await authorizeLocation(rawUrl, signal),
|
|
45
47
|
};
|
|
48
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
46
49
|
}
|
|
47
50
|
}
|
|
48
51
|
catch (cause) {
|
|
@@ -52,6 +55,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
52
55
|
};
|
|
53
56
|
const workerResults = await Promise.allSettled(Array.from({ length: Math.min(LOCATION_AUTHORIZATION_WORKERS, groups.length) }, worker));
|
|
54
57
|
const failedWorker = workerResults.find((result) => result.status === "rejected");
|
|
58
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
55
59
|
if (failedWorker?.status === "rejected")
|
|
56
60
|
throw failedWorker.reason;
|
|
57
61
|
for (const { drafts, decision } of authorizedGroups) {
|
|
@@ -73,7 +77,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
73
77
|
.map((context) => ({
|
|
74
78
|
context_key: context.contextKey,
|
|
75
79
|
state: context.state,
|
|
76
|
-
name:
|
|
80
|
+
name: context.name,
|
|
77
81
|
origin: context.origin,
|
|
78
82
|
}))
|
|
79
83
|
.sort((left, right) => left.context_key < right.context_key
|
|
@@ -81,6 +85,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
|
|
|
81
85
|
: left.context_key > right.context_key
|
|
82
86
|
? 1
|
|
83
87
|
: 0);
|
|
88
|
+
throwIfRuntimeObservationCancelled(signal);
|
|
84
89
|
return {
|
|
85
90
|
runtime,
|
|
86
91
|
target: {
|
|
@@ -4,14 +4,17 @@ 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";
|
|
13
|
+
/** Maximum decoded CDP message accepted while observing one Inspector target. */
|
|
14
|
+
export const INSPECTOR_MAX_PAYLOAD_BYTES = 16 * 1024 * 1024;
|
|
15
|
+
/** Aggregate retained metadata budget, including an estimate of JS object overhead. */
|
|
16
|
+
export const INSPECTOR_MAX_RETAINED_METADATA_BYTES = 8 * 1024 * 1024;
|
|
17
|
+
const RETAINED_OBJECT_OVERHEAD_BYTES = 512;
|
|
15
18
|
/** Attach-only provider; sends only Runtime.enable and Debugger.enable. */
|
|
16
19
|
export class V8InspectorProvider {
|
|
17
20
|
identity() {
|
|
@@ -61,9 +64,9 @@ export class V8InspectorProvider {
|
|
|
61
64
|
const target = await authorizedTarget(discovery.targets, input, discovery.runtime.product);
|
|
62
65
|
if (input.runtime_kind !== undefined)
|
|
63
66
|
assertRuntimeKind(target, input.runtime_kind);
|
|
64
|
-
connection = await CdpConnection.connect(target.webSocketUrl, "observe_javascript_runtime", options.signal);
|
|
67
|
+
connection = await CdpConnection.connect(target.webSocketUrl, "observe_javascript_runtime", options.signal, { maxPayloadBytes: INSPECTOR_MAX_PAYLOAD_BYTES });
|
|
65
68
|
const state = emptyCaptureState();
|
|
66
|
-
const removeListener = connection.onEvent((event) => ingestEvent(event,
|
|
69
|
+
const removeListener = connection.onEvent((event) => ingestEvent(event, state));
|
|
67
70
|
try {
|
|
68
71
|
await connection.send("Runtime.enable", {}, undefined, options.signal);
|
|
69
72
|
await connection.send("Debugger.enable", {}, undefined, options.signal);
|
|
@@ -77,6 +80,7 @@ export class V8InspectorProvider {
|
|
|
77
80
|
runtime: discovery.runtime,
|
|
78
81
|
target,
|
|
79
82
|
state,
|
|
83
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
80
84
|
});
|
|
81
85
|
outcome = ok(javascriptRuntimeObservationSchema.parse(result));
|
|
82
86
|
}
|
|
@@ -96,7 +100,11 @@ export class V8InspectorProvider {
|
|
|
96
100
|
}
|
|
97
101
|
}
|
|
98
102
|
if (cleanupFailed) {
|
|
99
|
-
return err(inspectorCleanupError(primaryFailure, cleanupFailure, failed
|
|
103
|
+
return err(inspectorCleanupError(primaryFailure, cleanupFailure, failed, outcome?.ok === true
|
|
104
|
+
? outcome.value
|
|
105
|
+
: outcome?.ok === false
|
|
106
|
+
? outcome.error.partialObservation
|
|
107
|
+
: undefined));
|
|
100
108
|
}
|
|
101
109
|
return (outcome ??
|
|
102
110
|
err(new BrowserObservationError("observe_javascript_runtime", "protocol_error")));
|
|
@@ -126,11 +134,21 @@ export const closeInspectorConnection = async (connection, signal) => {
|
|
|
126
134
|
signal.removeEventListener("abort", onAbort);
|
|
127
135
|
}
|
|
128
136
|
};
|
|
129
|
-
export const inspectorCleanupError = (primaryFailure, cleanupFailure, hasPrimaryFailure) => {
|
|
137
|
+
export const inspectorCleanupError = (primaryFailure, cleanupFailure, hasPrimaryFailure, partialObservation) => {
|
|
130
138
|
const cause = hasPrimaryFailure
|
|
131
139
|
? new AggregateError([primaryFailure, cleanupFailure], "Inspector observation and cleanup both failed")
|
|
132
140
|
: cleanupFailure;
|
|
133
|
-
|
|
141
|
+
const cleanupReason = cleanupFailure instanceof Error
|
|
142
|
+
? cleanupFailure.message
|
|
143
|
+
: String(cleanupFailure);
|
|
144
|
+
return new BrowserObservationError("observe_javascript_runtime", "cleanup_failed", {
|
|
145
|
+
cause,
|
|
146
|
+
cleanup: {
|
|
147
|
+
reason: cleanupReason,
|
|
148
|
+
resources: ["browser_transport"],
|
|
149
|
+
},
|
|
150
|
+
...(partialObservation === undefined ? {} : { partialObservation }),
|
|
151
|
+
});
|
|
134
152
|
};
|
|
135
153
|
const projectTarget = (target) => ({
|
|
136
154
|
target_id: target.id,
|
|
@@ -171,7 +189,7 @@ const emptyCaptureState = () => ({
|
|
|
171
189
|
truncated: false,
|
|
172
190
|
truncationReasons: new Set(),
|
|
173
191
|
});
|
|
174
|
-
const ingestEvent = (event,
|
|
192
|
+
const ingestEvent = (event, state) => {
|
|
175
193
|
if (event.method !== "Debugger.scriptParsed" &&
|
|
176
194
|
event.method !== "Debugger.scriptFailedToParse" &&
|
|
177
195
|
event.method !== "Runtime.executionContextCreated" &&
|
|
@@ -180,7 +198,7 @@ const ingestEvent = (event, input, state) => {
|
|
|
180
198
|
return;
|
|
181
199
|
state.eventsObserved += 1;
|
|
182
200
|
if (event.method === "Debugger.scriptParsed") {
|
|
183
|
-
ingestScript(event,
|
|
201
|
+
ingestScript(event, state);
|
|
184
202
|
return;
|
|
185
203
|
}
|
|
186
204
|
if (event.method === "Debugger.scriptFailedToParse") {
|
|
@@ -188,9 +206,9 @@ const ingestEvent = (event, input, state) => {
|
|
|
188
206
|
retainEvent(state, 0);
|
|
189
207
|
return;
|
|
190
208
|
}
|
|
191
|
-
ingestContext(event,
|
|
209
|
+
ingestContext(event, state);
|
|
192
210
|
};
|
|
193
|
-
const ingestScript = (event,
|
|
211
|
+
const ingestScript = (event, state) => {
|
|
194
212
|
state.scriptsObserved += 1;
|
|
195
213
|
const value = recordValue(event.params);
|
|
196
214
|
const rawUrl = cdpStringValue(value?.url);
|
|
@@ -199,22 +217,32 @@ const ingestScript = (event, input, state) => {
|
|
|
199
217
|
retainEvent(state, 0);
|
|
200
218
|
return;
|
|
201
219
|
}
|
|
220
|
+
const metadata = scriptMetadataValues(value);
|
|
202
221
|
const draft = {
|
|
203
222
|
rawUrl,
|
|
204
223
|
executionContextKey: contextKey(value?.executionContextId),
|
|
205
|
-
cdpHash:
|
|
206
|
-
length:
|
|
207
|
-
isModule:
|
|
224
|
+
cdpHash: metadata.hash,
|
|
225
|
+
length: metadata.length,
|
|
226
|
+
isModule: metadata.isModule,
|
|
208
227
|
};
|
|
209
|
-
const bytes =
|
|
210
|
-
retainEvent(state, bytes)
|
|
228
|
+
const bytes = retainedMetadataBytes(draft);
|
|
229
|
+
if (!retainEvent(state, bytes))
|
|
230
|
+
return;
|
|
211
231
|
state.scripts.push(draft);
|
|
212
232
|
};
|
|
213
|
-
const ingestContext = (event,
|
|
233
|
+
const ingestContext = (event, state) => {
|
|
214
234
|
if (event.method === "Runtime.executionContextsCleared") {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
235
|
+
let byteDelta = 0;
|
|
236
|
+
for (const context of state.contexts.values()) {
|
|
237
|
+
byteDelta +=
|
|
238
|
+
retainedMetadataBytes({ ...context, state: "cleared" }) -
|
|
239
|
+
retainedMetadataBytes(context);
|
|
240
|
+
}
|
|
241
|
+
if (replaceRetainedMetadata(state, byteDelta)) {
|
|
242
|
+
for (const context of state.contexts.values())
|
|
243
|
+
context.state = "cleared";
|
|
244
|
+
retainEvent(state, 0);
|
|
245
|
+
}
|
|
218
246
|
return;
|
|
219
247
|
}
|
|
220
248
|
const parameters = recordValue(event.params);
|
|
@@ -228,28 +256,44 @@ const ingestContext = (event, input, state) => {
|
|
|
228
256
|
retainEvent(state, 0);
|
|
229
257
|
return;
|
|
230
258
|
}
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
: null;
|
|
259
|
+
const previous = state.contexts.get(key);
|
|
260
|
+
const created = event.method === "Runtime.executionContextCreated";
|
|
234
261
|
const draft = {
|
|
235
262
|
contextKey: key,
|
|
236
|
-
state:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
263
|
+
state: created ? "created" : "destroyed",
|
|
264
|
+
name: created
|
|
265
|
+
? (cdpStringValue(runtimeContext?.name) ?? null)
|
|
266
|
+
: (previous?.name ?? null),
|
|
267
|
+
origin: created
|
|
268
|
+
? (cdpStringValue(runtimeContext?.origin) ?? null)
|
|
269
|
+
: (previous?.origin ?? null),
|
|
240
270
|
};
|
|
241
|
-
const bytes =
|
|
242
|
-
|
|
271
|
+
const bytes = retainedMetadataBytes(draft) -
|
|
272
|
+
(previous === undefined ? 0 : retainedMetadataBytes(previous));
|
|
273
|
+
if (!retainEvent(state, bytes))
|
|
274
|
+
return;
|
|
243
275
|
state.contexts.set(key, draft);
|
|
244
276
|
};
|
|
245
277
|
const retainEvent = (state, bytes) => {
|
|
246
|
-
state
|
|
278
|
+
if (!replaceRetainedMetadata(state, bytes))
|
|
279
|
+
return false;
|
|
247
280
|
state.eventsRetained += 1;
|
|
281
|
+
return true;
|
|
282
|
+
};
|
|
283
|
+
const replaceRetainedMetadata = (state, byteDelta) => {
|
|
284
|
+
if (state.metadataBytes + byteDelta > INSPECTOR_MAX_RETAINED_METADATA_BYTES) {
|
|
285
|
+
state.eventsDropped += 1;
|
|
286
|
+
state.truncated = true;
|
|
287
|
+
state.truncationReasons.add("retained_metadata_budget_exceeded");
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
state.metadataBytes += byteDelta;
|
|
291
|
+
return true;
|
|
248
292
|
};
|
|
249
293
|
const waitForCapture = async (connection, observationMs, signal) => {
|
|
250
294
|
let removeDisconnect = () => undefined;
|
|
251
295
|
const disconnected = new Promise((_resolve, reject) => {
|
|
252
|
-
removeDisconnect = connection.onDisconnect(() => reject(
|
|
296
|
+
removeDisconnect = connection.onDisconnect((error) => reject(error));
|
|
253
297
|
});
|
|
254
298
|
try {
|
|
255
299
|
await Promise.race([
|
|
@@ -261,10 +305,12 @@ const waitForCapture = async (connection, observationMs, signal) => {
|
|
|
261
305
|
removeDisconnect();
|
|
262
306
|
}
|
|
263
307
|
};
|
|
264
|
-
const
|
|
265
|
-
const
|
|
266
|
-
|
|
267
|
-
|
|
308
|
+
const retainedMetadataBytes = (value) => {
|
|
309
|
+
const strings = "rawUrl" in value
|
|
310
|
+
? [value.rawUrl, value.rawUrl, value.executionContextKey, value.cdpHash]
|
|
311
|
+
: [value.contextKey, value.name, value.origin];
|
|
312
|
+
return (RETAINED_OBJECT_OVERHEAD_BYTES +
|
|
313
|
+
strings.reduce((total, text) => total + (text?.length ?? 0) * 2, 0));
|
|
268
314
|
};
|
|
269
315
|
const contextKey = (value) => {
|
|
270
316
|
const identifier = numberValue(value);
|
|
@@ -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,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { TraceMap, decodedMappings } from "@jridgewell/trace-mapping";
|
|
2
|
+
import { SourceMapFormatFailure, } from "./SourceMapFormat.js";
|
|
3
|
+
/** Determine whether a leaf-local mapping falls before its enclosing boundary. */
|
|
4
|
+
export const isBeforeSourceMapLeafStop = (leaf, line, column) => {
|
|
5
|
+
if (leaf.stop === null)
|
|
6
|
+
return true;
|
|
7
|
+
const generatedLine = leaf.offset.line + line;
|
|
8
|
+
const generatedColumn = column + (line === 0 ? leaf.offset.column : 0);
|
|
9
|
+
return (generatedLine < leaf.stop.line ||
|
|
10
|
+
(generatedLine === leaf.stop.line && generatedColumn < leaf.stop.column));
|
|
11
|
+
};
|
|
12
|
+
/** Resolve one declaration with the same pinned upstream implementation used by full maps. */
|
|
13
|
+
export const resolveSourceMapSource = (source, sourceRoot, mapUrl) => {
|
|
14
|
+
const map = new TraceMap({
|
|
15
|
+
version: 3,
|
|
16
|
+
names: [],
|
|
17
|
+
sources: [source ?? ""],
|
|
18
|
+
...(sourceRoot == null ? {} : { sourceRoot }),
|
|
19
|
+
mappings: "",
|
|
20
|
+
}, mapUrl);
|
|
21
|
+
const resolved = map.resolvedSources[0];
|
|
22
|
+
if (resolved === undefined)
|
|
23
|
+
throw new SourceMapFormatFailure("format", "Source-map resolver did not return the requested source identity.");
|
|
24
|
+
return resolved;
|
|
25
|
+
};
|
|
26
|
+
/** Decode leaf mappings and validate producer indices before any consumer publishes them. */
|
|
27
|
+
export const decodeValidatedSourceMapLeaves = (leaves, mapUrl, check) => leaves.map((leaf) => {
|
|
28
|
+
check?.();
|
|
29
|
+
const map = new TraceMap(JSON.stringify(leaf.map), mapUrl);
|
|
30
|
+
const rows = decodedMappings(map);
|
|
31
|
+
for (const [line, row] of rows.entries()) {
|
|
32
|
+
if ((line & 255) === 0)
|
|
33
|
+
check?.();
|
|
34
|
+
for (const segment of row) {
|
|
35
|
+
const generatedLine = leaf.offset.line + line;
|
|
36
|
+
const generatedColumn = segment[0] + (line === 0 ? leaf.offset.column : 0);
|
|
37
|
+
if (!Number.isSafeInteger(generatedLine) ||
|
|
38
|
+
!Number.isSafeInteger(generatedColumn) ||
|
|
39
|
+
![1, 4, 5].includes(segment.length) ||
|
|
40
|
+
segment.some((value) => !Number.isSafeInteger(value) || value < 0) ||
|
|
41
|
+
(segment.length !== 1 && segment[1] >= leaf.map.sources.length) ||
|
|
42
|
+
(segment.length === 5 && segment[4] >= leaf.map.names.length))
|
|
43
|
+
throw new SourceMapFormatFailure("format", "Decoded local or absolute position, source index or name index is invalid.");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { leaf, rows, resolvedSources: map.resolvedSources };
|
|
47
|
+
});
|
|
@@ -12,10 +12,26 @@ import { PrivateRuntimeRoot, PrivateRuntimeRootUnavailableError, } from "../../p
|
|
|
12
12
|
import { ProviderStartupDeadline } from "../../process/ProviderDeadline.js";
|
|
13
13
|
import { cleanupOwnedProcessGroup } from "../../process/ProcessOwnership.js";
|
|
14
14
|
import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../../process/ProviderProcess.js";
|
|
15
|
+
import { prepareProcessOwnershipInspection } from "../../process/ProcessOwnershipObservation.js";
|
|
15
16
|
const OPERATION = "trace_web_source_location";
|
|
16
17
|
const PROVIDER = "source-map-decoder";
|
|
17
18
|
/** Run a trusted codec command and release its process/root before returning output. */
|
|
18
19
|
export const runSourceMapCommand = async (request, path, options, dependencies) => {
|
|
20
|
+
try {
|
|
21
|
+
await (dependencies.prepareOwnership ?? prepareProcessOwnershipInspection)(options?.signal);
|
|
22
|
+
}
|
|
23
|
+
catch (cause) {
|
|
24
|
+
return err(options?.signal?.aborted === true
|
|
25
|
+
? new AnalysisCancelledError(OPERATION)
|
|
26
|
+
: new ProviderAdapterError(PROVIDER, OPERATION, {
|
|
27
|
+
cause,
|
|
28
|
+
diagnostics: {
|
|
29
|
+
map_path: path,
|
|
30
|
+
error_message: message(cause),
|
|
31
|
+
phase: "process_ownership_preparation",
|
|
32
|
+
},
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
19
35
|
const deadline = new ProviderStartupDeadline(WEB_SOURCE_MAP_LIMITS.decodeTimeoutMs, options?.signal);
|
|
20
36
|
const command = new OwnedCodec(path, dependencies, deadline);
|
|
21
37
|
let result;
|