rea-agents 6.1.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 +7 -5
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +6 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +57 -35
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +69 -25
- package/dist/application/DirectAnalysis.js +29 -14
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +15 -19
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +9 -1
- package/dist/application/JsonFiles.js +42 -9
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +8 -16
- package/dist/application/SetupHost.js +16 -27
- package/dist/application/SetupPlan.js +6 -6
- package/dist/application/Uninstall.js +81 -29
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/WebScriptExportService.js +30 -4
- 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/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 +10 -8
- package/dist/application/binary/BinarySession.js +70 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +1 -1
- 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 +9 -13
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
- package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
- 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 +43 -16
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- 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 +42 -19
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +39 -14
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
- 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 +21 -3
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +48 -24
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- 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 +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- 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/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 +32 -27
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +4 -4
- package/dist/cli/interactiveSetup.js +6 -6
- 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/utilityCommands.js +9 -9
- package/dist/cli.js +16 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonInput.js +15 -1
- 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 +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 +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 +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- 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 +5 -10
- 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 +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/sessionToolContracts.js +14 -2
- package/dist/contracts/sessionToolSchemas.js +1 -14
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +136 -92
- package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
- 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/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +18 -3
- package/dist/domain/analysisErrorProjection.js +24 -5
- 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/androidApplication.js +1 -1
- 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 +16 -3
- 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/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/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +3 -4
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/changedBehavior.js +3 -3
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +10 -36
- package/dist/domain/evidenceBundle.js +7 -9
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- 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/javascript/electronActiveObservation.js +26 -69
- 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/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +26 -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/{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/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 +9 -3
- 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/javascriptSemanticDataEffects.js +1 -1
- package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
- 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 +1 -12
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- 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 +47 -54
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/localPath.js +1 -1
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- 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 +5 -3
- 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 +13 -12
- 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 +41 -22
- 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 +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/providerAdapterError.js +2 -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 +3 -3
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +2 -2
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- 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 +0 -2
- package/dist/domain/webScriptExport.js +1 -1
- 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/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +91 -32
- 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 +40 -12
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +15 -7
- 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 +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/V8InspectorCaptureProjection.js +1 -1
- package/dist/inspector/V8InspectorProvider.js +38 -28
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- 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/native/AppleMachoSelection.js +16 -6
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +8 -2
- package/dist/native/NativeMacOSProvider.js +25 -15
- 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 +11 -5
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
- 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 +25 -14
- package/dist/server/createServer.js +49 -36
- 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 +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 -2
- 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/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 +2 -3
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +23 -23
- package/dist/server/registerEvidenceTools.js +3 -4
- 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/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 +4 -19
- 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 +12 -18
- 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 +39 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +9 -8
- 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 +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/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
2
|
+
import { mkdir, mkdtemp, rm, symlink } from "node:fs/promises";
|
|
2
3
|
import { tmpdir } from "node:os";
|
|
3
4
|
import { join } from "node:path";
|
|
4
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { SWIFTC_INTERRUPT } from "../process/DarwinProcessRunTokenReader.js";
|
|
5
7
|
import { execFileOutput } from "../process/ExecFileOutput.js";
|
|
6
8
|
import { safeParseJson } from "../domain/safeJson.js";
|
|
7
9
|
import { NATIVE_UI_HELPER_MAX_BUFFER } from "./NativeUiOutputBudget.js";
|
|
8
10
|
/** Lazily compile one owned helper per observation/scenario and remove its compiler cache. */
|
|
9
|
-
export const createNativeUiHelperRuntime = () => {
|
|
11
|
+
export const createNativeUiHelperRuntime = (environment) => {
|
|
12
|
+
const selectedEnvironment = snapshotEnvironment(environment);
|
|
10
13
|
let root;
|
|
11
14
|
let executable;
|
|
12
15
|
const invoke = async (parameters, signal) => {
|
|
@@ -15,6 +18,9 @@ export const createNativeUiHelperRuntime = () => {
|
|
|
15
18
|
const output = join(root, "observer");
|
|
16
19
|
const main = join(root, "main.swift");
|
|
17
20
|
await symlink(fileURLToPath(new URL("../../bridge/native/ReaNativeUI.swift", import.meta.url)), main);
|
|
21
|
+
// Keep swiftc's intermediate objects inside the removable root.
|
|
22
|
+
const compilerTemporary = join(root, "tmp");
|
|
23
|
+
await mkdir(compilerTemporary);
|
|
18
24
|
await execFileOutput("/usr/bin/xcrun", [
|
|
19
25
|
"swiftc",
|
|
20
26
|
"-module-cache-path",
|
|
@@ -26,6 +32,8 @@ export const createNativeUiHelperRuntime = () => {
|
|
|
26
32
|
], {
|
|
27
33
|
timeout: 60_000,
|
|
28
34
|
maxBuffer: 1024 * 1024,
|
|
35
|
+
stopSignal: SWIFTC_INTERRUPT,
|
|
36
|
+
env: { ...selectedEnvironment, TMPDIR: compilerTemporary },
|
|
29
37
|
...(signal === undefined ? {} : { signal }),
|
|
30
38
|
});
|
|
31
39
|
executable = output;
|
|
@@ -33,6 +41,7 @@ export const createNativeUiHelperRuntime = () => {
|
|
|
33
41
|
const output = await execFileOutput(executable, [JSON.stringify(parameters)], {
|
|
34
42
|
timeout: 30_000,
|
|
35
43
|
maxBuffer: NATIVE_UI_HELPER_MAX_BUFFER,
|
|
44
|
+
env: selectedEnvironment,
|
|
36
45
|
...(signal === undefined ? {} : { signal }),
|
|
37
46
|
});
|
|
38
47
|
const parsed = safeParseJson(output.stdout);
|
|
@@ -17,8 +17,8 @@ const responseSchema = z.discriminatedUnion("ok", [
|
|
|
17
17
|
}),
|
|
18
18
|
]);
|
|
19
19
|
/** Capture a selected existing app window and run explicitly selected scenarios. */
|
|
20
|
-
export const observeNativeUi = async (target, operation, parameters, options
|
|
21
|
-
const runtime = createNativeUiHelperRuntime();
|
|
20
|
+
export const observeNativeUi = async (target, operation, parameters, options) => {
|
|
21
|
+
const runtime = createNativeUiHelperRuntime(options.environment);
|
|
22
22
|
try {
|
|
23
23
|
return await observeWithHelper(target, operation, parameters, {
|
|
24
24
|
...options,
|
|
@@ -16,6 +16,7 @@ import { OwnedCommandFailure } from "../../process/OwnedCommand.js";
|
|
|
16
16
|
import { pwntoolsResourceLimitsSchema, readPwntoolsFailureEvidence, } from "./PwntoolsResourceLimits.js";
|
|
17
17
|
import { PrivateRuntimeRoot } from "../../process/PrivateRuntimeRoot.js";
|
|
18
18
|
import { PWNTOOLS_PROVIDER_IDENTITY, PWNTOOLS_LIMITS, } from "./PwntoolsRelease.js";
|
|
19
|
+
const HOST_REQUIREMENT = "The initial real-verified pwntools artifact profile supports Linux x64 only.";
|
|
19
20
|
/** Thin owned-process adapter; all ELF parsing and heuristics come from unchanged upstream code. */
|
|
20
21
|
export class PwntoolsDecoder {
|
|
21
22
|
profile;
|
|
@@ -64,7 +65,7 @@ export class PwntoolsDecoder {
|
|
|
64
65
|
if (options?.signal?.aborted)
|
|
65
66
|
throw new AnalysisCancelledError(OPERATION);
|
|
66
67
|
if (process.platform !== "linux" || process.arch !== "x64")
|
|
67
|
-
throw new AnalysisCapabilityUnavailableError(this.identity.id, OPERATION,
|
|
68
|
+
throw new AnalysisCapabilityUnavailableError(this.identity.id, OPERATION, HOST_REQUIREMENT, { userMessage: HOST_REQUIREMENT });
|
|
68
69
|
if (!isAbsolute(selectedPath))
|
|
69
70
|
throw pwntoolsUnavailable("Set REA_PWNTOOLS_PYTHON to an absolute caller-supplied Python executable with pwntools 4.15.0, pyelftools 0.33 and Unicorn 2.1.2; REA never installs Python or packages.", selectedPath, undefined, undefined, context);
|
|
70
71
|
await access(selectedPath, constants.X_OK);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdtemp, rm } from "node:fs/promises";
|
|
1
|
+
import { mkdir, mkdtemp, rm } from "node:fs/promises";
|
|
2
2
|
import { rmSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
@@ -42,6 +42,12 @@ const sourceFiles = [
|
|
|
42
42
|
fileURLToPath(new URL("../../bridge/process/ProcessRunTokenReader.swift", import.meta.url)),
|
|
43
43
|
fileURLToPath(new URL("../../bridge/process/ProcessRunTokenReaderMain.swift", import.meta.url)),
|
|
44
44
|
];
|
|
45
|
+
/**
|
|
46
|
+
* swift-driver runs each frontend job in its own process group. On SIGINT it
|
|
47
|
+
* stops those jobs and deletes their objects before exiting; on SIGTERM it
|
|
48
|
+
* exits while a job can still write objects under TMPDIR.
|
|
49
|
+
*/
|
|
50
|
+
export const SWIFTC_INTERRUPT = "SIGINT";
|
|
45
51
|
/** The native Darwin process-ownership reader could not be prepared. */
|
|
46
52
|
export class DarwinProcessOwnershipInspectionError extends Error {
|
|
47
53
|
constructor(message, options) {
|
|
@@ -114,7 +120,14 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
|
|
|
114
120
|
if (signal.aborted || closed)
|
|
115
121
|
throw abortReason(signal);
|
|
116
122
|
const output = join(operationRoot, "reader");
|
|
117
|
-
|
|
123
|
+
// swiftc keeps intermediate objects under TMPDIR, so keep them inside
|
|
124
|
+
// the root that cleanup removes.
|
|
125
|
+
const compilerTemporary = join(operationRoot, "tmp");
|
|
126
|
+
await mkdir(compilerTemporary);
|
|
127
|
+
const compilerEnvironment = {
|
|
128
|
+
...process.env,
|
|
129
|
+
TMPDIR: compilerTemporary,
|
|
130
|
+
};
|
|
118
131
|
// Use Swift's reusable default cache for REA's internal helper compilation.
|
|
119
132
|
delete compilerEnvironment.CLANG_MODULE_CACHE_PATH;
|
|
120
133
|
try {
|
|
@@ -122,6 +135,7 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
|
|
|
122
135
|
timeout: 60_000,
|
|
123
136
|
maxBuffer: 1024 * 1024,
|
|
124
137
|
signal,
|
|
138
|
+
stopSignal: SWIFTC_INTERRUPT,
|
|
125
139
|
env: compilerEnvironment,
|
|
126
140
|
});
|
|
127
141
|
}
|
|
@@ -1,4 +1,38 @@
|
|
|
1
1
|
import { execFile, } from "node:child_process";
|
|
2
|
+
/** How long a stopped process may take to exit before it is killed. */
|
|
3
|
+
const STOP_GRACE_MS = 5_000;
|
|
4
|
+
const abortError = (signal) => {
|
|
5
|
+
const error = new Error("The operation was aborted", {
|
|
6
|
+
cause: signal.reason,
|
|
7
|
+
});
|
|
8
|
+
error.name = "AbortError";
|
|
9
|
+
Reflect.set(error, "code", "ABORT_ERR");
|
|
10
|
+
return error;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A command stopped at its timeout can still exit cleanly, so the timeout is
|
|
14
|
+
* the failure. Like Node's execFile timeout, it reports `killed: true`.
|
|
15
|
+
*/
|
|
16
|
+
const timeoutError = (command, timeout, exit) => {
|
|
17
|
+
const error = new Error(`Command timed out after ${String(timeout)} ms: ${command}`, exit === null ? undefined : { cause: exit });
|
|
18
|
+
Reflect.set(error, "code", "ETIMEDOUT");
|
|
19
|
+
Reflect.set(error, "killed", true);
|
|
20
|
+
Reflect.set(error, "signal", exit === null ? null : (Reflect.get(exit, "signal") ?? null));
|
|
21
|
+
return error;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* The `timeout` contract for both modes, checked before spawning. A stoppable
|
|
25
|
+
* command keeps its own deadline, so execFile never validates it. Node 26's
|
|
26
|
+
* execFile also caps it at Number.MAX_SAFE_INTEGER; Node 22 and 24 accept
|
|
27
|
+
* larger integers, which their timers then clamp to 1 ms.
|
|
28
|
+
*/
|
|
29
|
+
const invalidTimeout = (timeout) => {
|
|
30
|
+
if (Number.isSafeInteger(timeout) && timeout >= 0)
|
|
31
|
+
return undefined;
|
|
32
|
+
const error = new RangeError(`The value of "timeout" is out of range. It must be an unsigned integer. Received ${String(timeout)}`);
|
|
33
|
+
Reflect.set(error, "code", "ERR_OUT_OF_RANGE");
|
|
34
|
+
return error;
|
|
35
|
+
};
|
|
2
36
|
/** Read captured output metadata from a failed execFileOutput invocation. */
|
|
3
37
|
export const execFileOutputFailure = (cause) => {
|
|
4
38
|
if (!(cause instanceof Error))
|
|
@@ -21,17 +55,65 @@ export const execFileOutputFailure = (cause) => {
|
|
|
21
55
|
};
|
|
22
56
|
/** Run a shell-free command while capturing its complete UTF-8 output. */
|
|
23
57
|
export const execFileOutput = (command, arguments_, options = {}) => new Promise((resolve, reject) => {
|
|
24
|
-
|
|
25
|
-
|
|
58
|
+
const { stopSignal, signal, timeout, ...execOptions } = options;
|
|
59
|
+
const invalid = timeout === undefined ? undefined : invalidTimeout(timeout);
|
|
60
|
+
if (invalid !== undefined) {
|
|
61
|
+
reject(invalid);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (stopSignal !== undefined && signal?.aborted === true) {
|
|
65
|
+
reject(abortError(signal));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
let stopped;
|
|
69
|
+
let deadline;
|
|
70
|
+
let grace;
|
|
71
|
+
const child = execFile(command, [...arguments_], {
|
|
72
|
+
...execOptions,
|
|
73
|
+
// A stoppable command's abort and timeout are handled below, because
|
|
74
|
+
// execFile neither waits for the exit on abort nor kills a process
|
|
75
|
+
// that ignores its timeout signal.
|
|
76
|
+
...(stopSignal === undefined
|
|
77
|
+
? {
|
|
78
|
+
...(signal === undefined ? {} : { signal }),
|
|
79
|
+
...(timeout === undefined ? {} : { timeout }),
|
|
80
|
+
}
|
|
81
|
+
: { killSignal: stopSignal }),
|
|
26
82
|
encoding: "utf8",
|
|
27
83
|
maxBuffer: options.maxBuffer ?? Number.POSITIVE_INFINITY,
|
|
28
84
|
}, (error, stdout, stderr) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
85
|
+
signal?.removeEventListener("abort", onAbort);
|
|
86
|
+
clearTimeout(deadline);
|
|
87
|
+
clearTimeout(grace);
|
|
88
|
+
const failure = stopped === "abort" && signal !== undefined
|
|
89
|
+
? abortError(signal)
|
|
90
|
+
: stopped === "timeout" && timeout !== undefined
|
|
91
|
+
? timeoutError(command, timeout, error)
|
|
92
|
+
: error;
|
|
93
|
+
if (failure !== null) {
|
|
94
|
+
Reflect.set(failure, "stdout", stdout);
|
|
95
|
+
Reflect.set(failure, "stderr", stderr);
|
|
96
|
+
reject(failure);
|
|
33
97
|
return;
|
|
34
98
|
}
|
|
35
99
|
resolve({ stdout, stderr });
|
|
36
100
|
});
|
|
101
|
+
// The first stop request names the failure; a later one is not resent.
|
|
102
|
+
const stop = (reason) => {
|
|
103
|
+
if (stopped !== undefined)
|
|
104
|
+
return;
|
|
105
|
+
stopped = reason;
|
|
106
|
+
child.kill(stopSignal);
|
|
107
|
+
grace = setTimeout(() => child.kill("SIGKILL"), STOP_GRACE_MS);
|
|
108
|
+
};
|
|
109
|
+
const onAbort = () => {
|
|
110
|
+
stop("abort");
|
|
111
|
+
};
|
|
112
|
+
if (stopSignal === undefined)
|
|
113
|
+
return;
|
|
114
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
115
|
+
if (timeout !== undefined && timeout > 0)
|
|
116
|
+
deadline = setTimeout(() => {
|
|
117
|
+
stop("timeout");
|
|
118
|
+
}, timeout);
|
|
37
119
|
});
|
|
@@ -50,12 +50,17 @@ export class PrivateRuntimeRoot {
|
|
|
50
50
|
throw cause;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* Remove the runtime root; concurrent callers share one attempt. A failed
|
|
55
|
+
* attempt is not cached, so a later close retries the removal.
|
|
56
|
+
*/
|
|
54
57
|
close() {
|
|
55
|
-
this.#closePromise ??=
|
|
56
|
-
this.
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
this.#closePromise ??= (this.windowsRuntime === undefined
|
|
59
|
+
? rm(this.path, { recursive: true, force: true })
|
|
60
|
+
: Promise.resolve().then(() => this.windowsRuntime?.close())).catch((cause) => {
|
|
61
|
+
this.#closePromise = undefined;
|
|
62
|
+
throw cause;
|
|
63
|
+
});
|
|
59
64
|
return this.#closePromise;
|
|
60
65
|
}
|
|
61
66
|
}
|
|
@@ -19,12 +19,9 @@ export const cleanupWindowsProcessTree = async (rootPid, host = systemWindowsPro
|
|
|
19
19
|
return { cleaned: true, signaled: result === "terminated" };
|
|
20
20
|
}
|
|
21
21
|
catch (cause) {
|
|
22
|
-
// The reason string is a pinned validation contract; keep it stable and
|
|
23
|
-
// do not interpolate the cause into caller-visible diagnostics here.
|
|
24
|
-
void cause;
|
|
25
22
|
return {
|
|
26
23
|
cleaned: false,
|
|
27
|
-
reason:
|
|
24
|
+
reason: `Windows process-tree termination failed for PID ${String(rootPid)}: ${errorMessage(cause)}`,
|
|
28
25
|
};
|
|
29
26
|
}
|
|
30
27
|
};
|
|
@@ -5,30 +5,36 @@ import { descendantsOf, liveProcesses } from "./ProcessOwnershipProcessTree.js";
|
|
|
5
5
|
import { execFileOutput } from "./ExecFileOutput.js";
|
|
6
6
|
import { createDarwinProcessRunTokenReader } from "./DarwinProcessRunTokenReader.js";
|
|
7
7
|
/** Observe one group without signaling it, failing closed on identity doubt. */
|
|
8
|
-
export const observeOwnedProcessGroupWithHost = async (ownership, host) => {
|
|
8
|
+
export const observeOwnedProcessGroupWithHost = async (ownership, host, signal) => {
|
|
9
|
+
signal?.throwIfAborted();
|
|
9
10
|
let members;
|
|
10
11
|
try {
|
|
11
|
-
members = (await host.listProcesses()).filter(({ processGroupId }) => processGroupId === ownership.processGroupId);
|
|
12
|
+
members = (await host.listProcesses(signal)).filter(({ processGroupId }) => processGroupId === ownership.processGroupId);
|
|
12
13
|
}
|
|
13
14
|
catch (cause) {
|
|
15
|
+
signal?.throwIfAborted();
|
|
14
16
|
return {
|
|
15
17
|
state: "unverifiable",
|
|
16
18
|
reason: `process group could not be inspected: ${errorMessage(cause)}`,
|
|
17
19
|
};
|
|
18
20
|
}
|
|
21
|
+
signal?.throwIfAborted();
|
|
19
22
|
const liveMembers = liveProcesses(members);
|
|
20
23
|
if (liveMembers.length === 0)
|
|
21
24
|
return { state: "empty" };
|
|
22
25
|
for (const member of liveMembers) {
|
|
26
|
+
signal?.throwIfAborted();
|
|
23
27
|
try {
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
const runId = (await host.environment(member.pid)).REA_PROCESS_RUN_ID;
|
|
29
|
+
signal?.throwIfAborted();
|
|
30
|
+
if (runId !== ownership.runId)
|
|
26
31
|
return {
|
|
27
32
|
state: "unverifiable",
|
|
28
33
|
reason: "process ownership did not match",
|
|
29
34
|
};
|
|
30
35
|
}
|
|
31
36
|
catch (cause) {
|
|
37
|
+
signal?.throwIfAborted();
|
|
32
38
|
if (!(await processIsGone(host, member.pid))) {
|
|
33
39
|
return {
|
|
34
40
|
state: "unverifiable",
|
|
@@ -326,7 +332,7 @@ export const prepareProcessOwnershipInspection = async (signal) => {
|
|
|
326
332
|
await systemProcessOwnershipHost.prepare?.(signal);
|
|
327
333
|
};
|
|
328
334
|
/** Observe one group without signaling it, failing closed on identity doubt. */
|
|
329
|
-
export const observeOwnedProcessGroup = async (ownership, host = systemProcessOwnershipHost) => observeOwnedProcessGroupWithHost(ownership, host);
|
|
335
|
+
export const observeOwnedProcessGroup = async (ownership, host = systemProcessOwnershipHost, signal) => observeOwnedProcessGroupWithHost(ownership, host, signal);
|
|
330
336
|
/**
|
|
331
337
|
* Record the live launcher and descendant lineage after run-token validation.
|
|
332
338
|
*
|
|
@@ -21,9 +21,7 @@ export const spawnOwnedProviderProcess = async (options) => {
|
|
|
21
21
|
REA_PROCESS_RUN_ID: options.runId,
|
|
22
22
|
};
|
|
23
23
|
if (platform === "win32" && process.platform === "win32") {
|
|
24
|
-
|
|
25
|
-
throw new Error("Owned Windows provider processes do not support protocol stdin");
|
|
26
|
-
const child = new WindowsOwnedProcess(options.command, options.arguments, options.cwd, environment, options.windowsVerbatimArguments ?? false);
|
|
24
|
+
const child = new WindowsOwnedProcess(options.command, options.arguments, options.cwd, environment, options.windowsVerbatimArguments ?? false, options.stdin === "pipe");
|
|
27
25
|
return {
|
|
28
26
|
process: child,
|
|
29
27
|
ownership: {
|
|
@@ -59,25 +59,33 @@ export const hashFile = async (path, expected, maxBytes, signal) => {
|
|
|
59
59
|
/** Capture bounded, root-aliased filesystem state without following symlinks. */
|
|
60
60
|
export const snapshotRoots = async (scenario, signal) => {
|
|
61
61
|
const entries = [];
|
|
62
|
+
const completeRoots = [];
|
|
62
63
|
let remainingBytes = scenario.limits.file_bytes;
|
|
63
64
|
let truncated = false;
|
|
65
|
+
const enumerationReasons = new Set();
|
|
66
|
+
const hashOmissions = [];
|
|
64
67
|
const visit = async (root, rootAlias, path, depth) => {
|
|
65
68
|
signal?.throwIfAborted();
|
|
66
69
|
if (entries.length >= scenario.limits.files ||
|
|
67
70
|
depth > scenario.limits.filesystem_depth) {
|
|
68
71
|
truncated = true;
|
|
69
|
-
|
|
72
|
+
if (entries.length >= scenario.limits.files)
|
|
73
|
+
enumerationReasons.add("files_limit");
|
|
74
|
+
if (depth > scenario.limits.filesystem_depth)
|
|
75
|
+
enumerationReasons.add("depth_limit");
|
|
76
|
+
return false;
|
|
70
77
|
}
|
|
71
78
|
const stats = await lstatIfPresent(path);
|
|
72
79
|
if (stats === undefined)
|
|
73
|
-
return;
|
|
80
|
+
return true;
|
|
74
81
|
const relativePath = relative(root, path) || ".";
|
|
75
82
|
if (stats.isSymbolicLink()) {
|
|
76
83
|
const target = resolve(dirname(path), await readlink(path));
|
|
77
84
|
const afterRead = await lstat(path);
|
|
78
85
|
if (!hasSameIdentity(stats, afterRead, "symlink")) {
|
|
79
86
|
truncated = true;
|
|
80
|
-
|
|
87
|
+
enumerationReasons.add("identity_changed");
|
|
88
|
+
return false;
|
|
81
89
|
}
|
|
82
90
|
entries.push({
|
|
83
91
|
path: `${rootAlias}:${relativePath}`,
|
|
@@ -87,15 +95,24 @@ export const snapshotRoots = async (scenario, signal) => {
|
|
|
87
95
|
sha256: null,
|
|
88
96
|
symlink_target: target,
|
|
89
97
|
});
|
|
90
|
-
return;
|
|
98
|
+
return true;
|
|
91
99
|
}
|
|
92
100
|
if (stats.isFile()) {
|
|
93
101
|
const sha256 = remainingBytes >= stats.size
|
|
94
102
|
? await hashFile(path, stats, remainingBytes, signal)
|
|
95
103
|
: null;
|
|
96
104
|
remainingBytes -= sha256 === null ? 0 : stats.size;
|
|
97
|
-
if (sha256 === null)
|
|
105
|
+
if (sha256 === null) {
|
|
98
106
|
truncated = true;
|
|
107
|
+
hashOmissions.push({
|
|
108
|
+
path: `${rootAlias}:${relativePath}`,
|
|
109
|
+
size_bytes: stats.size,
|
|
110
|
+
remaining_budget_bytes: remainingBytes,
|
|
111
|
+
reason: remainingBytes < stats.size
|
|
112
|
+
? "file_bytes_budget"
|
|
113
|
+
: "file_changed_or_short_read",
|
|
114
|
+
});
|
|
115
|
+
}
|
|
99
116
|
entries.push({
|
|
100
117
|
path: `${rootAlias}:${relativePath}`,
|
|
101
118
|
type: "file",
|
|
@@ -104,7 +121,7 @@ export const snapshotRoots = async (scenario, signal) => {
|
|
|
104
121
|
sha256,
|
|
105
122
|
symlink_target: null,
|
|
106
123
|
});
|
|
107
|
-
return;
|
|
124
|
+
return true;
|
|
108
125
|
}
|
|
109
126
|
const type = stats.isDirectory() ? "directory" : "other";
|
|
110
127
|
entries.push({
|
|
@@ -116,22 +133,42 @@ export const snapshotRoots = async (scenario, signal) => {
|
|
|
116
133
|
symlink_target: null,
|
|
117
134
|
});
|
|
118
135
|
if (type !== "directory")
|
|
119
|
-
return;
|
|
136
|
+
return true;
|
|
120
137
|
const children = await readdir(path);
|
|
121
138
|
const afterRead = await lstat(path);
|
|
122
139
|
if (!hasSameIdentity(stats, afterRead, "directory")) {
|
|
123
140
|
truncated = true;
|
|
124
|
-
|
|
141
|
+
enumerationReasons.add("identity_changed");
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
let complete = true;
|
|
145
|
+
for (const child of children.sort()) {
|
|
146
|
+
if (!(await visit(root, rootAlias, join(path, child), depth + 1)))
|
|
147
|
+
complete = false;
|
|
125
148
|
}
|
|
126
|
-
|
|
127
|
-
await visit(root, rootAlias, join(path, child), depth + 1);
|
|
149
|
+
return complete;
|
|
128
150
|
};
|
|
129
151
|
for (const [index, root] of scenario.filesystem_observation_paths.entries()) {
|
|
152
|
+
const alias = `root_${String(index)}`;
|
|
130
153
|
if ((await lstatIfPresent(root)) === undefined) {
|
|
131
|
-
|
|
154
|
+
completeRoots.push(alias);
|
|
132
155
|
continue;
|
|
133
156
|
}
|
|
134
|
-
await visit(root,
|
|
157
|
+
if (await visit(root, alias, root, 0))
|
|
158
|
+
completeRoots.push(alias);
|
|
135
159
|
}
|
|
136
|
-
return {
|
|
160
|
+
return {
|
|
161
|
+
files: entries,
|
|
162
|
+
truncated,
|
|
163
|
+
completeRoots,
|
|
164
|
+
coverage: {
|
|
165
|
+
files_limit: scenario.limits.files,
|
|
166
|
+
depth_limit: scenario.limits.filesystem_depth,
|
|
167
|
+
enumeration_truncated: completeRoots.length !== scenario.filesystem_observation_paths.length,
|
|
168
|
+
enumeration_reasons: [...enumerationReasons],
|
|
169
|
+
hash_budget_bytes: scenario.limits.file_bytes,
|
|
170
|
+
hashed_bytes: scenario.limits.file_bytes - remainingBytes,
|
|
171
|
+
hash_omissions: hashOmissions,
|
|
172
|
+
},
|
|
173
|
+
};
|
|
137
174
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DarwinProcessOwnershipInspectionError } from "../DarwinProcessRunTokenReader.js";
|
|
1
2
|
import { AnalysisError } from "../../domain/analysisErrorBase.js";
|
|
2
3
|
/** Typed application failure produced by controlled process capture. */
|
|
3
4
|
export class ProcessCaptureError extends AnalysisError {
|
|
@@ -40,3 +41,15 @@ export const processCaptureCancelled = () => new ProcessCaptureError("process ca
|
|
|
40
41
|
reason: "cancelled",
|
|
41
42
|
userMessage: "Process capture was cancelled. Start it again when ready.",
|
|
42
43
|
});
|
|
44
|
+
/** Preserve typed process-inspection preflight failures at the capture boundary. */
|
|
45
|
+
export const normalizeCaptureFailure = (cause, signal) => {
|
|
46
|
+
if (cause instanceof ProcessCaptureError)
|
|
47
|
+
return cause;
|
|
48
|
+
if (cause instanceof DarwinProcessOwnershipInspectionError)
|
|
49
|
+
return new ProcessCaptureError(cause.message, { cause });
|
|
50
|
+
if (signal?.aborted === true &&
|
|
51
|
+
(cause === signal.reason ||
|
|
52
|
+
(cause instanceof Error && cause.name === "AbortError")))
|
|
53
|
+
return processCaptureCancelled();
|
|
54
|
+
return cause;
|
|
55
|
+
};
|