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
|
@@ -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
|
|
8
|
+
export const observeOwnedProcessGroup = async (ownership, host = systemProcessOwnershipHost, 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",
|
|
@@ -39,8 +45,14 @@ export const observeOwnedProcessGroupWithHost = async (ownership, host) => {
|
|
|
39
45
|
}
|
|
40
46
|
return { state: "alive" };
|
|
41
47
|
};
|
|
42
|
-
/**
|
|
43
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Record the live launcher and descendant lineage after run-token validation.
|
|
50
|
+
*
|
|
51
|
+
* The observation is intentionally point-in-time. A verified empty descendant
|
|
52
|
+
* list means no descendants were live during this observation, not that the
|
|
53
|
+
* run never created a short-lived child.
|
|
54
|
+
*/
|
|
55
|
+
export const observeOwnedProcessLineage = async (ownership, host = systemProcessOwnershipHost) => {
|
|
44
56
|
let processes;
|
|
45
57
|
try {
|
|
46
58
|
processes = liveProcesses(await host.listProcesses());
|
|
@@ -325,16 +337,6 @@ export const signalProcessWithStartIdentity = async (pid, expectedIdentity, sign
|
|
|
325
337
|
export const prepareProcessOwnershipInspection = async (signal) => {
|
|
326
338
|
await systemProcessOwnershipHost.prepare?.(signal);
|
|
327
339
|
};
|
|
328
|
-
/** Observe one group without signaling it, failing closed on identity doubt. */
|
|
329
|
-
export const observeOwnedProcessGroup = async (ownership, host = systemProcessOwnershipHost) => observeOwnedProcessGroupWithHost(ownership, host);
|
|
330
|
-
/**
|
|
331
|
-
* Record the live launcher and descendant lineage after run-token validation.
|
|
332
|
-
*
|
|
333
|
-
* The observation is intentionally point-in-time. A verified empty descendant
|
|
334
|
-
* list means no descendants were live during this observation, not that the
|
|
335
|
-
* run never created a short-lived child.
|
|
336
|
-
*/
|
|
337
|
-
export const observeOwnedProcessLineage = async (ownership, host = systemProcessOwnershipHost) => observeOwnedProcessLineageWithHost(ownership, host);
|
|
338
340
|
const processIsGone = async (host, pid) => {
|
|
339
341
|
try {
|
|
340
342
|
return !liveProcesses(await host.listProcesses()).some((process) => process.pid === pid);
|
|
@@ -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: {
|
|
@@ -13,6 +13,23 @@ const hasSameFileState = (before, after) => before.dev === after.dev &&
|
|
|
13
13
|
before.size === after.size &&
|
|
14
14
|
before.mtimeMs === after.mtimeMs &&
|
|
15
15
|
before.ctimeMs === after.ctimeMs;
|
|
16
|
+
const fileUnavailableSystemCode = (cause) => {
|
|
17
|
+
if (!(cause instanceof Error) || !("code" in cause))
|
|
18
|
+
return undefined;
|
|
19
|
+
const code = cause.code;
|
|
20
|
+
return typeof code === "string" &&
|
|
21
|
+
[
|
|
22
|
+
"EACCES",
|
|
23
|
+
"EISDIR",
|
|
24
|
+
"ELOOP",
|
|
25
|
+
"ENOTDIR",
|
|
26
|
+
"ENOENT",
|
|
27
|
+
"EPERM",
|
|
28
|
+
"ESTALE",
|
|
29
|
+
].includes(code)
|
|
30
|
+
? code
|
|
31
|
+
: undefined;
|
|
32
|
+
};
|
|
16
33
|
const lstatIfPresent = async (path) => {
|
|
17
34
|
try {
|
|
18
35
|
return await lstat(path);
|
|
@@ -26,15 +43,33 @@ const lstatIfPresent = async (path) => {
|
|
|
26
43
|
/** Hash a file only when its opened descriptor still matches the captured path state. */
|
|
27
44
|
export const hashFile = async (path, expected, maxBytes, signal) => {
|
|
28
45
|
signal?.throwIfAborted();
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
(fsConstants.
|
|
46
|
+
let handle;
|
|
47
|
+
try {
|
|
48
|
+
handle = await open(path, fsConstants.O_RDONLY |
|
|
49
|
+
(fsConstants.O_NOFOLLOW ?? 0) |
|
|
50
|
+
(fsConstants.O_NONBLOCK ?? 0));
|
|
51
|
+
}
|
|
52
|
+
catch (cause) {
|
|
53
|
+
signal?.throwIfAborted();
|
|
54
|
+
const systemCode = fileUnavailableSystemCode(cause);
|
|
55
|
+
if (systemCode === undefined)
|
|
56
|
+
throw cause;
|
|
57
|
+
return {
|
|
58
|
+
state: "omitted",
|
|
59
|
+
reason: "file_unavailable",
|
|
60
|
+
system_code: systemCode,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
32
63
|
try {
|
|
33
64
|
signal?.throwIfAborted();
|
|
34
65
|
const stats = await handle.stat();
|
|
35
66
|
signal?.throwIfAborted();
|
|
36
67
|
if (!hasSameFileState(expected, stats) || stats.size > maxBytes)
|
|
37
|
-
return
|
|
68
|
+
return {
|
|
69
|
+
state: "omitted",
|
|
70
|
+
reason: "file_changed_or_short_read",
|
|
71
|
+
system_code: null,
|
|
72
|
+
};
|
|
38
73
|
const hash = createHash("sha256");
|
|
39
74
|
const buffer = Buffer.allocUnsafe(Math.min(64 * 1024, maxBytes));
|
|
40
75
|
let position = 0;
|
|
@@ -42,15 +77,34 @@ export const hashFile = async (path, expected, maxBytes, signal) => {
|
|
|
42
77
|
signal?.throwIfAborted();
|
|
43
78
|
const { bytesRead } = await handle.read(buffer, 0, Math.min(buffer.length, stats.size - position), position);
|
|
44
79
|
if (bytesRead === 0)
|
|
45
|
-
return
|
|
80
|
+
return {
|
|
81
|
+
state: "omitted",
|
|
82
|
+
reason: "file_changed_or_short_read",
|
|
83
|
+
system_code: null,
|
|
84
|
+
};
|
|
46
85
|
hash.update(buffer.subarray(0, bytesRead));
|
|
47
86
|
position += bytesRead;
|
|
48
87
|
}
|
|
49
88
|
const after = await handle.stat();
|
|
50
89
|
signal?.throwIfAborted();
|
|
51
90
|
if (!hasSameFileState(stats, after))
|
|
52
|
-
return
|
|
53
|
-
|
|
91
|
+
return {
|
|
92
|
+
state: "omitted",
|
|
93
|
+
reason: "file_changed_or_short_read",
|
|
94
|
+
system_code: null,
|
|
95
|
+
};
|
|
96
|
+
return { state: "hashed", sha256: hash.digest("hex") };
|
|
97
|
+
}
|
|
98
|
+
catch (cause) {
|
|
99
|
+
signal?.throwIfAborted();
|
|
100
|
+
const systemCode = fileUnavailableSystemCode(cause);
|
|
101
|
+
if (systemCode === undefined)
|
|
102
|
+
throw cause;
|
|
103
|
+
return {
|
|
104
|
+
state: "omitted",
|
|
105
|
+
reason: "file_unavailable",
|
|
106
|
+
system_code: systemCode,
|
|
107
|
+
};
|
|
54
108
|
}
|
|
55
109
|
finally {
|
|
56
110
|
await handle.close();
|
|
@@ -59,25 +113,33 @@ export const hashFile = async (path, expected, maxBytes, signal) => {
|
|
|
59
113
|
/** Capture bounded, root-aliased filesystem state without following symlinks. */
|
|
60
114
|
export const snapshotRoots = async (scenario, signal) => {
|
|
61
115
|
const entries = [];
|
|
116
|
+
const completeRoots = [];
|
|
62
117
|
let remainingBytes = scenario.limits.file_bytes;
|
|
63
118
|
let truncated = false;
|
|
119
|
+
const enumerationReasons = new Set();
|
|
120
|
+
const hashOmissions = [];
|
|
64
121
|
const visit = async (root, rootAlias, path, depth) => {
|
|
65
122
|
signal?.throwIfAborted();
|
|
66
123
|
if (entries.length >= scenario.limits.files ||
|
|
67
124
|
depth > scenario.limits.filesystem_depth) {
|
|
68
125
|
truncated = true;
|
|
69
|
-
|
|
126
|
+
if (entries.length >= scenario.limits.files)
|
|
127
|
+
enumerationReasons.add("files_limit");
|
|
128
|
+
if (depth > scenario.limits.filesystem_depth)
|
|
129
|
+
enumerationReasons.add("depth_limit");
|
|
130
|
+
return false;
|
|
70
131
|
}
|
|
71
132
|
const stats = await lstatIfPresent(path);
|
|
72
133
|
if (stats === undefined)
|
|
73
|
-
return;
|
|
134
|
+
return true;
|
|
74
135
|
const relativePath = relative(root, path) || ".";
|
|
75
136
|
if (stats.isSymbolicLink()) {
|
|
76
137
|
const target = resolve(dirname(path), await readlink(path));
|
|
77
138
|
const afterRead = await lstat(path);
|
|
78
139
|
if (!hasSameIdentity(stats, afterRead, "symlink")) {
|
|
79
140
|
truncated = true;
|
|
80
|
-
|
|
141
|
+
enumerationReasons.add("identity_changed");
|
|
142
|
+
return false;
|
|
81
143
|
}
|
|
82
144
|
entries.push({
|
|
83
145
|
path: `${rootAlias}:${relativePath}`,
|
|
@@ -87,15 +149,40 @@ export const snapshotRoots = async (scenario, signal) => {
|
|
|
87
149
|
sha256: null,
|
|
88
150
|
symlink_target: target,
|
|
89
151
|
});
|
|
90
|
-
return;
|
|
152
|
+
return true;
|
|
91
153
|
}
|
|
92
154
|
if (stats.isFile()) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
155
|
+
let sha256 = null;
|
|
156
|
+
let omission;
|
|
157
|
+
if (remainingBytes < stats.size) {
|
|
158
|
+
omission = {
|
|
159
|
+
path: `${rootAlias}:${relativePath}`,
|
|
160
|
+
size_bytes: stats.size,
|
|
161
|
+
remaining_budget_bytes: remainingBytes,
|
|
162
|
+
reason: "file_bytes_budget",
|
|
163
|
+
system_code: null,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const outcome = await hashFile(path, stats, remainingBytes, signal);
|
|
168
|
+
if (outcome.state === "hashed") {
|
|
169
|
+
sha256 = outcome.sha256;
|
|
170
|
+
remainingBytes -= stats.size;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
omission = {
|
|
174
|
+
path: `${rootAlias}:${relativePath}`,
|
|
175
|
+
size_bytes: stats.size,
|
|
176
|
+
remaining_budget_bytes: remainingBytes,
|
|
177
|
+
reason: outcome.reason,
|
|
178
|
+
system_code: outcome.system_code,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (omission !== undefined) {
|
|
98
183
|
truncated = true;
|
|
184
|
+
hashOmissions.push(omission);
|
|
185
|
+
}
|
|
99
186
|
entries.push({
|
|
100
187
|
path: `${rootAlias}:${relativePath}`,
|
|
101
188
|
type: "file",
|
|
@@ -104,7 +191,7 @@ export const snapshotRoots = async (scenario, signal) => {
|
|
|
104
191
|
sha256,
|
|
105
192
|
symlink_target: null,
|
|
106
193
|
});
|
|
107
|
-
return;
|
|
194
|
+
return true;
|
|
108
195
|
}
|
|
109
196
|
const type = stats.isDirectory() ? "directory" : "other";
|
|
110
197
|
entries.push({
|
|
@@ -116,22 +203,42 @@ export const snapshotRoots = async (scenario, signal) => {
|
|
|
116
203
|
symlink_target: null,
|
|
117
204
|
});
|
|
118
205
|
if (type !== "directory")
|
|
119
|
-
return;
|
|
206
|
+
return true;
|
|
120
207
|
const children = await readdir(path);
|
|
121
208
|
const afterRead = await lstat(path);
|
|
122
209
|
if (!hasSameIdentity(stats, afterRead, "directory")) {
|
|
123
210
|
truncated = true;
|
|
124
|
-
|
|
211
|
+
enumerationReasons.add("identity_changed");
|
|
212
|
+
return false;
|
|
125
213
|
}
|
|
126
|
-
|
|
127
|
-
|
|
214
|
+
let complete = true;
|
|
215
|
+
for (const child of children.sort()) {
|
|
216
|
+
if (!(await visit(root, rootAlias, join(path, child), depth + 1)))
|
|
217
|
+
complete = false;
|
|
218
|
+
}
|
|
219
|
+
return complete;
|
|
128
220
|
};
|
|
129
221
|
for (const [index, root] of scenario.filesystem_observation_paths.entries()) {
|
|
222
|
+
const alias = `root_${String(index)}`;
|
|
130
223
|
if ((await lstatIfPresent(root)) === undefined) {
|
|
131
|
-
|
|
224
|
+
completeRoots.push(alias);
|
|
132
225
|
continue;
|
|
133
226
|
}
|
|
134
|
-
await visit(root,
|
|
227
|
+
if (await visit(root, alias, root, 0))
|
|
228
|
+
completeRoots.push(alias);
|
|
135
229
|
}
|
|
136
|
-
return {
|
|
230
|
+
return {
|
|
231
|
+
files: entries,
|
|
232
|
+
truncated,
|
|
233
|
+
completeRoots,
|
|
234
|
+
coverage: {
|
|
235
|
+
files_limit: scenario.limits.files,
|
|
236
|
+
depth_limit: scenario.limits.filesystem_depth,
|
|
237
|
+
enumeration_truncated: completeRoots.length !== scenario.filesystem_observation_paths.length,
|
|
238
|
+
enumeration_reasons: [...enumerationReasons],
|
|
239
|
+
hash_budget_bytes: scenario.limits.file_bytes,
|
|
240
|
+
hashed_bytes: scenario.limits.file_bytes - remainingBytes,
|
|
241
|
+
hash_omissions: hashOmissions,
|
|
242
|
+
},
|
|
243
|
+
};
|
|
137
244
|
};
|
|
@@ -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
|
+
};
|