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,15 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { chmod, lstat, mkdir, realpath, rm } from "node:fs/promises";
|
|
2
|
+
import { chmod, lstat, mkdir, realpath, rm, rmdir } from "node:fs/promises";
|
|
3
3
|
import { createConnection, createServer, } from "node:net";
|
|
4
4
|
import { join, resolve } from "node:path";
|
|
5
5
|
import { HopperStartError } from "../domain/hopperErrors.js";
|
|
6
6
|
import { safeParseJson } from "../domain/safeJson.js";
|
|
7
|
-
/** Shared private parent of
|
|
7
|
+
/** Shared private parent of Hopper lease sockets; it outlives individual sessions. */
|
|
8
8
|
export const HOPPER_TARGET_LEASE_DIRECTORY = join("/tmp", `rea-hopper-${process.getuid?.() ?? 0}`);
|
|
9
9
|
/** Keep two REA processes from opening duplicate Hopper documents for one target/profile. */
|
|
10
10
|
export const acquireHopperTargetLease = async (input) => {
|
|
11
|
-
const directory = input.directory ?? HOPPER_TARGET_LEASE_DIRECTORY;
|
|
12
|
-
await ensureLeaseDirectory(directory);
|
|
13
11
|
// The canonical path only derives the lease key; it never authorizes access.
|
|
14
12
|
// Common expected `realpath` failures include a missing target or path
|
|
15
13
|
// component (ENOENT, ENOTDIR), an unreadable component (EACCES), or a
|
|
@@ -18,43 +16,105 @@ export const acquireHopperTargetLease = async (input) => {
|
|
|
18
16
|
// still yields a deterministic key, but aliases may take separate leases
|
|
19
17
|
// whenever `realpath` cannot resolve them.
|
|
20
18
|
const targetPath = await realpath(input.targetPath).catch(() => resolve(input.targetPath));
|
|
19
|
+
return acquireLease({
|
|
20
|
+
...input,
|
|
21
|
+
identity: {
|
|
22
|
+
targetPath,
|
|
23
|
+
targetKind: input.targetKind,
|
|
24
|
+
loaderArgs: input.loaderArgs,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
/** Reserve the Linux demo's singleton application before it can forward a target to another owner. */
|
|
29
|
+
export const acquireLinuxHopperApplicationLease = (input) => acquireLease({ ...input, identity: { application: "linux-hopper-demo" } });
|
|
30
|
+
const acquireLease = async (input) => {
|
|
31
|
+
const directory = input.directory ?? HOPPER_TARGET_LEASE_DIRECTORY;
|
|
32
|
+
await ensureLeaseDirectory(directory);
|
|
21
33
|
const key = createHash("sha256")
|
|
22
|
-
.update(JSON.stringify(
|
|
23
|
-
targetPath,
|
|
24
|
-
targetKind: input.targetKind,
|
|
25
|
-
loaderArgs: input.loaderArgs,
|
|
26
|
-
}))
|
|
34
|
+
.update(JSON.stringify(input.identity))
|
|
27
35
|
.digest("hex")
|
|
28
36
|
.slice(0, 32);
|
|
29
37
|
const socketPath = join(directory, `${key}.sock`);
|
|
30
38
|
const owner = { runId: input.runId, processId: process.pid };
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
39
|
+
const acquisition = await tryAcquireLease(socketPath, owner);
|
|
40
|
+
if (typeof acquisition !== "string")
|
|
41
|
+
return acquisition;
|
|
42
|
+
// Serialize stale cleanup through the replacement bind: otherwise two
|
|
43
|
+
// recoverers can unlink the socket that one of them has just acquired.
|
|
44
|
+
const recoveryPath = `${socketPath}.recovery`;
|
|
45
|
+
await reserveRecovery(recoveryPath);
|
|
46
|
+
let recovered;
|
|
47
|
+
try {
|
|
48
|
+
recovered = await tryAcquireLease(socketPath, owner);
|
|
49
|
+
if (recovered === "stale")
|
|
50
|
+
await rm(socketPath, { force: true });
|
|
51
|
+
if (typeof recovered === "string")
|
|
52
|
+
recovered = await tryAcquireLease(socketPath, owner);
|
|
53
|
+
if (typeof recovered !== "string")
|
|
54
|
+
return recovered;
|
|
55
|
+
throw new HopperStartError({
|
|
56
|
+
userMessage: "REA could not reserve Hopper for this request. Close competing REA sessions and retry.",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
try {
|
|
61
|
+
await rmdir(recoveryPath);
|
|
62
|
+
}
|
|
63
|
+
catch (cause) {
|
|
64
|
+
if (typeof recovered !== "string" && recovered?.acquired)
|
|
65
|
+
await recovered.lease.release();
|
|
66
|
+
throw new HopperStartError({
|
|
67
|
+
cause,
|
|
68
|
+
userMessage: `REA could not remove its Hopper recovery directory at ${JSON.stringify(recoveryPath)}. Check this directory's write access before retrying.`,
|
|
69
|
+
});
|
|
49
70
|
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const reserveRecovery = async (recoveryPath) => {
|
|
74
|
+
try {
|
|
75
|
+
await mkdir(recoveryPath, { mode: 0o700 });
|
|
76
|
+
}
|
|
77
|
+
catch (cause) {
|
|
78
|
+
const busy = typeof cause === "object" &&
|
|
79
|
+
cause !== null &&
|
|
80
|
+
Reflect.get(cause, "code") === "EEXIST";
|
|
81
|
+
throw new HopperStartError({
|
|
82
|
+
cause,
|
|
83
|
+
userMessage: busy
|
|
84
|
+
? `REA could not reserve Hopper lease recovery at ${JSON.stringify(recoveryPath)}; the existing socket was left unchanged. Retry after concurrent startup finishes. If recovery was interrupted, stop REA sessions and remove this recovery directory before retrying.`
|
|
85
|
+
: `REA could not create its Hopper recovery directory at ${JSON.stringify(recoveryPath)}; the existing socket was left unchanged. Check the parent directory's write access before retrying.`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const tryAcquireLease = async (socketPath, owner) => {
|
|
90
|
+
const server = createServer((socket) => sendOwner(socket, owner));
|
|
91
|
+
if (!(await bind(server, socketPath))) {
|
|
50
92
|
const existingOwner = await readOwner(socketPath);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
93
|
+
return typeof existingOwner === "string"
|
|
94
|
+
? existingOwner
|
|
95
|
+
: { acquired: false, owner: existingOwner };
|
|
54
96
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
97
|
+
try {
|
|
98
|
+
await chmod(socketPath, 0o600);
|
|
99
|
+
}
|
|
100
|
+
catch (cause) {
|
|
101
|
+
await closeServer(server);
|
|
102
|
+
throw cause;
|
|
103
|
+
}
|
|
104
|
+
let released = false;
|
|
105
|
+
return {
|
|
106
|
+
acquired: true,
|
|
107
|
+
lease: {
|
|
108
|
+
release: async () => {
|
|
109
|
+
if (released)
|
|
110
|
+
return;
|
|
111
|
+
// Node removes a bound Unix socket on close. A second unlink here
|
|
112
|
+
// could remove a new owner's socket bound after that close.
|
|
113
|
+
await closeServer(server);
|
|
114
|
+
released = true;
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
};
|
|
58
118
|
};
|
|
59
119
|
const ensureLeaseDirectory = async (directory) => {
|
|
60
120
|
let directoryStat;
|
|
@@ -96,14 +156,26 @@ const bind = (server, socketPath) => new Promise((resolveBind, reject) => {
|
|
|
96
156
|
const sendOwner = (socket, owner) => {
|
|
97
157
|
socket.end(`${JSON.stringify(owner)}\n`);
|
|
98
158
|
};
|
|
99
|
-
const readOwner = (socketPath) => new Promise((resolveOwner) => {
|
|
159
|
+
const readOwner = (socketPath) => new Promise((resolveOwner, rejectOwner) => {
|
|
100
160
|
const socket = createConnection(socketPath);
|
|
101
161
|
let response = "";
|
|
102
|
-
|
|
162
|
+
let settled = false;
|
|
163
|
+
const fail = (reason, cause) => {
|
|
164
|
+
if (settled)
|
|
165
|
+
return;
|
|
166
|
+
settled = true;
|
|
167
|
+
clearTimeout(timer);
|
|
103
168
|
socket.destroy();
|
|
104
|
-
|
|
105
|
-
|
|
169
|
+
rejectOwner(new HopperStartError({
|
|
170
|
+
cause,
|
|
171
|
+
userMessage: `REA could not verify the existing Hopper lease (${reason}); it was left unchanged. Retry when the owning REA session is responsive.`,
|
|
172
|
+
}));
|
|
173
|
+
};
|
|
174
|
+
const timer = setTimeout(() => fail("owner response timed out"), 250);
|
|
106
175
|
const finish = (owner) => {
|
|
176
|
+
if (settled)
|
|
177
|
+
return;
|
|
178
|
+
settled = true;
|
|
107
179
|
clearTimeout(timer);
|
|
108
180
|
socket.destroy();
|
|
109
181
|
resolveOwner(owner);
|
|
@@ -115,23 +187,34 @@ const readOwner = (socketPath) => new Promise((resolveOwner) => {
|
|
|
115
187
|
return;
|
|
116
188
|
const parsed = safeParseJson(response.slice(0, newline));
|
|
117
189
|
if (!parsed.ok) {
|
|
118
|
-
|
|
190
|
+
fail("malformed owner response");
|
|
119
191
|
return;
|
|
120
192
|
}
|
|
121
193
|
const value = parsed.value;
|
|
122
|
-
|
|
123
|
-
value
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
194
|
+
const runId = typeof value === "object" && value !== null
|
|
195
|
+
? Reflect.get(value, "runId")
|
|
196
|
+
: undefined;
|
|
197
|
+
const processId = typeof value === "object" && value !== null
|
|
198
|
+
? Reflect.get(value, "processId")
|
|
199
|
+
: undefined;
|
|
200
|
+
if (typeof runId === "string" &&
|
|
201
|
+
runId.length > 0 &&
|
|
202
|
+
typeof processId === "number" &&
|
|
203
|
+
Number.isSafeInteger(processId) &&
|
|
204
|
+
processId > 0)
|
|
205
|
+
finish({ runId, processId });
|
|
206
|
+
else
|
|
207
|
+
fail("invalid owner identity");
|
|
208
|
+
});
|
|
209
|
+
socket.on("error", (cause) => {
|
|
210
|
+
if (cause.code === "ENOENT")
|
|
211
|
+
finish("missing");
|
|
212
|
+
else if (cause.code === "ECONNREFUSED")
|
|
213
|
+
finish("stale");
|
|
130
214
|
else
|
|
131
|
-
|
|
215
|
+
fail(cause.code ?? "owner connection failed", cause);
|
|
132
216
|
});
|
|
133
|
-
socket.on("
|
|
134
|
-
socket.on("end", () => finish(undefined));
|
|
217
|
+
socket.on("end", () => fail("owner closed without a complete response"));
|
|
135
218
|
});
|
|
136
219
|
const closeServer = (server) => new Promise((resolveClose, reject) => {
|
|
137
220
|
if (!server.listening) {
|
|
@@ -50,6 +50,9 @@ export const runLinuxPrivateDisplayProbe = async (strategy, options) => {
|
|
|
50
50
|
arguments: command.arguments,
|
|
51
51
|
runId: randomUUID(),
|
|
52
52
|
expectedCommand: null,
|
|
53
|
+
...(options.environment === undefined
|
|
54
|
+
? {}
|
|
55
|
+
: { hostEnvironment: options.environment }),
|
|
53
56
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
54
57
|
});
|
|
55
58
|
}
|
|
@@ -111,6 +114,9 @@ const evaluatedProbe = async (strategy, options, timeoutMs, runner) => {
|
|
|
111
114
|
try {
|
|
112
115
|
processResult = await runner(strategy, {
|
|
113
116
|
helperPath: options.helperPath,
|
|
117
|
+
...(options.environment === undefined
|
|
118
|
+
? {}
|
|
119
|
+
: { environment: options.environment }),
|
|
114
120
|
timeoutMs,
|
|
115
121
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
116
122
|
});
|
|
@@ -40,7 +40,7 @@ const registrationSchema = z.union([
|
|
|
40
40
|
export const readIdaConfiguration = (path) => {
|
|
41
41
|
try {
|
|
42
42
|
if (statSync(path).size > 65_536)
|
|
43
|
-
return err(
|
|
43
|
+
return err(idaConfigurationError("REA_IDA_MCP_CONFIG exceeds the 64 KiB registration size."));
|
|
44
44
|
const input = JSON.parse(readFileSync(path, "utf8"));
|
|
45
45
|
const envelope = z
|
|
46
46
|
.object({ mcpServers: z.object({ "ida-pro-mcp": z.unknown() }) })
|
|
@@ -48,9 +48,14 @@ export const readIdaConfiguration = (path) => {
|
|
|
48
48
|
const parsed = registrationSchema.safeParse(envelope.success ? envelope.data.mcpServers["ida-pro-mcp"] : input);
|
|
49
49
|
return parsed.success
|
|
50
50
|
? ok(parsed.data)
|
|
51
|
-
: err(
|
|
51
|
+
: err(idaConfigurationError("REA_IDA_MCP_CONFIG must contain an IDA MCP command/args or local url registration; see docs/ida-provider.md.", parsed.error));
|
|
52
52
|
}
|
|
53
53
|
catch (cause) {
|
|
54
|
-
return err(
|
|
54
|
+
return err(idaConfigurationError(`Cannot read IDA MCP registration ${path}; provide a readable JSON configuration.`, cause));
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
|
+
/** A REA_IDA_MCP_CONFIG rejection that names the setting it concerns. */
|
|
58
|
+
export const idaConfigurationError = (constraint, cause) => new ConfigurationError(constraint, {
|
|
59
|
+
...(cause === undefined ? {} : { cause }),
|
|
60
|
+
settings: [{ setting: "REA_IDA_MCP_CONFIG", constraint }],
|
|
61
|
+
});
|
package/dist/ida/IdaInput.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
1
|
import { TOOL_CONTRACTS } from "../contracts/toolContracts.js";
|
|
3
2
|
import { AnalysisInputError } from "../domain/analysisErrorCore.js";
|
|
4
3
|
import { jsonObjectSchema } from "../domain/jsonValue.js";
|
|
@@ -8,12 +7,7 @@ import { projectInputIssues } from "../domain/inputIssueProjection.js";
|
|
|
8
7
|
/** Apply the named public contract and IDA's explicit-address boundary before startup. */
|
|
9
8
|
export const parseIdaInput = (operation, parameters) => {
|
|
10
9
|
const contract = TOOL_CONTRACTS.find(({ name }) => name === operation);
|
|
11
|
-
const
|
|
12
|
-
if (schema instanceof z.ZodObject) {
|
|
13
|
-
const shape = schema.shape;
|
|
14
|
-
parameters = Object.fromEntries(Object.entries(parameters).filter(([key, value]) => value !== null || shape[key]?.safeParse(undefined).success !== true));
|
|
15
|
-
}
|
|
16
|
-
const parsed = (schema instanceof z.ZodObject ? schema.strict() : schema)?.safeParse(parameters);
|
|
10
|
+
const parsed = contract?.inputSchema.safeParse(parameters);
|
|
17
11
|
if (parsed?.success !== true)
|
|
18
12
|
return err(new AnalysisInputError(operation, { cause: parsed?.error }, parsed?.error === undefined
|
|
19
13
|
? []
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
1
2
|
import { Client, StreamableHTTPClientTransport, } from "@modelcontextprotocol/client";
|
|
2
|
-
import { StdioClientTransport } from "@modelcontextprotocol/client/stdio";
|
|
3
|
+
import { DEFAULT_INHERITED_ENV_VARS, StdioClientTransport, } from "@modelcontextprotocol/client/stdio";
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
5
6
|
import { AnalysisProtocolError } from "../domain/analysisErrorCore.js";
|
|
@@ -66,7 +67,7 @@ export const redactIdaTransportFailure = (cause, config) => {
|
|
|
66
67
|
return new Error(message, { cause });
|
|
67
68
|
};
|
|
68
69
|
/** Create a standard SDK connection to an existing upstream registration. */
|
|
69
|
-
export const createIdaMcpConnection = (config) => {
|
|
70
|
+
export const createIdaMcpConnection = (config, environment) => {
|
|
70
71
|
const client = new Client({ name: "rea-ida-provider", version: "1" });
|
|
71
72
|
const transportFailure = (cause) => {
|
|
72
73
|
throw redactIdaTransportFailure(cause, config);
|
|
@@ -76,9 +77,12 @@ export const createIdaMcpConnection = (config) => {
|
|
|
76
77
|
command: config.command,
|
|
77
78
|
args: config.args,
|
|
78
79
|
env: {
|
|
79
|
-
|
|
80
|
+
// The SDK always merges ambient defaults. Its string-only environment
|
|
81
|
+
// API requires empty values to suppress omitted caller-selected keys.
|
|
82
|
+
...Object.fromEntries(DEFAULT_INHERITED_ENV_VARS.map((key) => [key, ""])),
|
|
83
|
+
...Object.fromEntries(Object.entries(snapshotEnvironment(environment)).filter((entry) => entry[1] !== undefined)),
|
|
80
84
|
IDA_MCP_MAX_WORKERS: "1",
|
|
81
|
-
...config.env,
|
|
85
|
+
...snapshotEnvironment(config.env),
|
|
82
86
|
},
|
|
83
87
|
stderr: "pipe",
|
|
84
88
|
})
|
|
@@ -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.");
|
|
@@ -288,6 +288,8 @@ export class IdaOperationRunner {
|
|
|
288
288
|
referenced_strings: [],
|
|
289
289
|
referenced_names: [],
|
|
290
290
|
basic_blocks: [],
|
|
291
|
+
native_api: null,
|
|
292
|
+
native_value_flow: null,
|
|
291
293
|
limitations: [
|
|
292
294
|
...IDA_LIMITATIONS,
|
|
293
295
|
...this.limitations,
|
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;
|
|
@@ -99,8 +101,10 @@ export class IdaSessionClient {
|
|
|
99
101
|
}
|
|
100
102
|
const document = parameters.document;
|
|
101
103
|
if (document !== undefined &&
|
|
102
|
-
document !==
|
|
103
|
-
|
|
104
|
+
(typeof document !== "string" ||
|
|
105
|
+
(!sameIdaHostPath(document, this.target.path) &&
|
|
106
|
+
(this.target.sourcePath === undefined ||
|
|
107
|
+
!sameIdaHostPath(document, this.target.sourcePath)))))
|
|
104
108
|
return err(new AnalysisInputError(operation, undefined, [
|
|
105
109
|
{
|
|
106
110
|
path: ["document"],
|
|
@@ -185,7 +189,8 @@ export class IdaSessionClient {
|
|
|
185
189
|
if (missing.length > 0)
|
|
186
190
|
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
191
|
if (this.config.mode === "headless") {
|
|
188
|
-
this.#workspace = await IdaWorkspace.
|
|
192
|
+
this.#workspace = await IdaWorkspace.allocate(this.target, this.config.workspaceRoot);
|
|
193
|
+
await this.#workspace.copyInput();
|
|
189
194
|
this.#openAttempted = true;
|
|
190
195
|
const raw = await this.connection.call("idb_open", {
|
|
191
196
|
input_path: this.#workspace.inputPath,
|
|
@@ -253,7 +258,7 @@ export class IdaSessionClient {
|
|
|
253
258
|
this.#initialIdentity = identity;
|
|
254
259
|
return this.#metadata;
|
|
255
260
|
}
|
|
256
|
-
async
|
|
261
|
+
async close() {
|
|
257
262
|
if (this.#closePromise !== undefined)
|
|
258
263
|
return this.#closePromise;
|
|
259
264
|
const closing = this.#closeOnce();
|
|
@@ -283,22 +288,27 @@ export class IdaSessionClient {
|
|
|
283
288
|
throw new AnalysisProtocolError("An unowned worker still uses the private workspace; it was retained.");
|
|
284
289
|
}
|
|
285
290
|
if (this.#database !== undefined) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
closed.
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
291
|
+
if (!this.#databaseCloseAcknowledged) {
|
|
292
|
+
const closed = closeDatabaseSchema.parse(await this.connection.call("idb_close", {
|
|
293
|
+
database: this.#database,
|
|
294
|
+
save: false,
|
|
295
|
+
}));
|
|
296
|
+
if (closed.session_id !== this.#database ||
|
|
297
|
+
closed.saved === true ||
|
|
298
|
+
closed.owned !== true ||
|
|
299
|
+
closed.backend !== "worker")
|
|
300
|
+
throw new AnalysisProtocolError("IDA database close did not confirm the requested owned, unsaved session release.");
|
|
301
|
+
this.#databaseCloseAcknowledged = true;
|
|
302
|
+
}
|
|
295
303
|
const inventory = databaseListSchema.parse(await this.connection.call("idb_list", {}));
|
|
296
304
|
if (inventory.sessions.some((entry) => entry.session_id === this.#database ||
|
|
297
305
|
sameIdaHostPath(entry.input_path, this.#workspace?.inputPath ?? "")))
|
|
298
306
|
throw new AnalysisProtocolError("IDA worker remains registered after close.");
|
|
307
|
+
this.#database = undefined;
|
|
299
308
|
}
|
|
300
309
|
if (!this.#openCompleted)
|
|
301
310
|
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.");
|
|
311
|
+
this.#openAttempted = false;
|
|
302
312
|
}
|
|
303
313
|
await this.connection.close();
|
|
304
314
|
await this.#workspace?.remove();
|
|
@@ -306,13 +316,7 @@ export class IdaSessionClient {
|
|
|
306
316
|
return ok(null);
|
|
307
317
|
}
|
|
308
318
|
catch (cause) {
|
|
309
|
-
await this.connection.close().catch(() => undefined);
|
|
310
319
|
return err(new IdaCleanupError(this.#workspace?.directory ?? "IDA MCP connection", cause));
|
|
311
320
|
}
|
|
312
321
|
}
|
|
313
|
-
async close() {
|
|
314
|
-
const result = await this.closeWithOutcome();
|
|
315
|
-
if (!result.ok)
|
|
316
|
-
throw result.error;
|
|
317
|
-
}
|
|
318
322
|
}
|
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() {
|
|
@@ -21,11 +21,6 @@ export const inspectorExclusionKey = (reason) => {
|
|
|
21
21
|
/** Resolve a protocol location exposed by the explicitly selected Inspector endpoint. */
|
|
22
22
|
export const authorizeRuntimeLocation = async (value, signal) => {
|
|
23
23
|
throwIfRuntimeObservationCancelled(signal);
|
|
24
|
-
if (value.startsWith("node:") && value.length > 0)
|
|
25
|
-
return {
|
|
26
|
-
allowed: true,
|
|
27
|
-
location: { kind: "builtin", specifier: value },
|
|
28
|
-
};
|
|
29
24
|
if (value.startsWith("file:")) {
|
|
30
25
|
const filePath = await authorizedElectronFile(value);
|
|
31
26
|
throwIfRuntimeObservationCancelled(signal);
|
|
@@ -33,6 +28,15 @@ export const authorizeRuntimeLocation = async (value, signal) => {
|
|
|
33
28
|
? { allowed: false, reason: "not_approved" }
|
|
34
29
|
: { allowed: true, location: { kind: "file", file_path: filePath } };
|
|
35
30
|
}
|
|
31
|
+
return projectReportedRuntimeUrl(value);
|
|
32
|
+
};
|
|
33
|
+
/** Project non-file Inspector URLs without filesystem access. */
|
|
34
|
+
export const projectReportedRuntimeUrl = (value) => {
|
|
35
|
+
if (value.startsWith("node:") && value.length > 0)
|
|
36
|
+
return {
|
|
37
|
+
allowed: true,
|
|
38
|
+
location: { kind: "builtin", specifier: value },
|
|
39
|
+
};
|
|
36
40
|
let url;
|
|
37
41
|
try {
|
|
38
42
|
url = new URL(value);
|