rea-agents 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -18
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +205 -51
- package/bridge/hopper_bridge.py +314 -127
- package/bridge/mitmproxy/capture.py +0 -2
- package/bridge/native/rea_lldb_tracer.py +630 -94
- package/bridge/process/ProcessRunTokenReader.swift +39 -5
- package/bridge/pwntools/recorded_crash_impl.py +4 -0
- package/dist/android/JadxConfiguration.js +274 -31
- package/dist/android/JadxMcpTransport.js +18 -2
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +76 -37
- package/dist/android/JadxSession.js +23 -4
- package/dist/application/AnalysisContextQueries.js +8 -35
- package/dist/application/AnalysisDocument.js +32 -0
- package/dist/application/AppBundleExecutable.js +67 -21
- package/dist/application/BinaryTargetResolver.js +5 -3
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +2 -18
- package/dist/application/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +48 -11
- package/dist/application/ClientConfigurationDocument.js +917 -8
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +56 -51
- package/dist/application/DirectAnalysisCleanup.js +72 -0
- package/dist/application/DirectAnalysisStatus.js +4 -5
- package/dist/application/Doctor.js +19 -21
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +64 -17
- package/dist/application/EvidenceBundleFiles.js +30 -13
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +11 -2
- package/dist/application/JsonFiles.js +83 -28
- package/dist/application/LinuxHopper.js +9 -6
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +1 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/Setup.js +21 -17
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +21 -29
- package/dist/application/SetupPlan.js +11 -9
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +82 -29
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateMaintenance.js +7 -5
- package/dist/application/UpdateRuntime.js +57 -36
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCaptureService.js +4 -2
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +32 -6
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WorkflowEvidence.js +105 -0
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
- package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
- package/dist/application/binary/BinarySession.js +161 -93
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +4 -4
- package/dist/application/binary/BinarySessionRecords.js +26 -4
- package/dist/application/binary/BinarySessionStatus.js +18 -7
- package/dist/application/binary/CompositeProvider.js +16 -17
- package/dist/application/binary/LazyAnalysisProvider.js +8 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
- package/dist/application/evm/EvmInterfaceService.js +4 -2
- package/dist/application/homebrew.js +48 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
- package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
- package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/process/ProcessCli.js +25 -17
- package/dist/application/process/ProcessEvidence.js +4 -4
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +48 -13
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
- package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
- package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
- package/dist/artifacts/apple/NibArchive.js +81 -14
- package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
- package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
- package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +59 -38
- package/dist/artifacts/inventory/scanReader.js +5 -9
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +2 -3
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +78 -15
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +25 -1
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpElectronProvider.js +0 -2
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +2 -3
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
- package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +39 -22
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +41 -1
- package/dist/browser/history/CaptureRelease.js +5 -0
- package/dist/browser/history/HarCaptureAdapter.js +3 -3
- package/dist/browser/history/HarJson.js +3 -2
- package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +100 -37
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +10 -9
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +7 -3
- package/dist/cli/jsonOutput.js +4 -99
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +3 -5
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/utilityCommands.js +9 -9
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +18 -9
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -1
- package/dist/cliJsonInput.js +24 -5
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -13
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraStartupTimeout.js +12 -0
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +30 -0
- package/dist/config/parseConfig.js +8 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +2 -2
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +7 -5
- package/dist/contracts/enhancedToolContracts.js +7 -6
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/inputSchemaPresentation.js +90 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +2 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +7 -14
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +5 -3
- package/dist/contracts/officialToolContracts.js +16 -16
- package/dist/contracts/promptContracts.js +5 -5
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +3 -7
- package/dist/contracts/sessionStatusContract.js +2 -4
- package/dist/contracts/sessionToolContracts.js +18 -8
- package/dist/contracts/sessionToolSchemas.js +3 -19
- package/dist/contracts/toolContractExamples.js +0 -1
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -1
- package/dist/contracts/toolOutputSchemaGroups.js +160 -115
- package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
- package/dist/contracts/toolSchemaMetadata.js +41 -33
- package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +8 -3
- package/dist/domain/analysisErrorCore.js +6 -1
- package/dist/domain/analysisErrorPresentation.js +90 -20
- package/dist/domain/analysisErrorProjection.js +130 -32
- package/dist/domain/analysisSnapshot.js +29 -31
- package/dist/domain/analysisView/analysisView.js +243 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +18 -10
- package/dist/domain/apple/appleApplication.js +42 -15
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dylibResolution.js +130 -12
- package/dist/domain/apple/dylibResolutionFindings.js +9 -7
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +35 -3
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +16 -3
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +28 -40
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioValues.js +5 -10
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPath.js +8 -9
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalJsonDigestSteps.js +133 -0
- package/dist/domain/canonicalOrdering.js +9 -5
- package/dist/domain/changedBehavior.js +9 -9
- package/dist/domain/comparisonSourceEvidence.js +40 -0
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +13 -1
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/evidence.js +65 -36
- package/dist/domain/evidenceBundle.js +47 -8
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/explicitSensitiveFailure.js +17 -1
- package/dist/domain/firmware/firmwareAnalysis.js +6 -7
- package/dist/domain/functionComparison.js +4 -5
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +23 -34
- package/dist/domain/functionComparisonResults.js +1 -4
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +2 -37
- package/dist/domain/hopperErrors.js +23 -2
- package/dist/domain/hopperValues.js +51 -8
- package/dist/domain/immutableJson.js +114 -0
- package/dist/domain/inputIssueProjection.js +3 -0
- package/dist/domain/javascript/electronActiveObservation.js +47 -64
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
- package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
- package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
- package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
- package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
- package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
- package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
- package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
- package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
- package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
- package/dist/domain/javascript/javascriptSourceParser.js +6 -2
- package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
- package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +90 -6
- package/dist/domain/localPath.js +6 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -11
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +37 -13
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +21 -16
- package/dist/domain/process/processCaptureCoverage.js +67 -0
- package/dist/domain/process/processCaptureExample.js +2 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +81 -13
- package/dist/domain/process/processComparison.js +79 -26
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +35 -12
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +15 -11
- package/dist/domain/process/processTraceSpecification.js +3 -4
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +3 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/reconstructionCoverage.js +5 -2
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +4 -3
- package/dist/domain/referenceSourceGraph.js +20 -21
- package/dist/domain/staticRuntimeCorrelation.js +8 -45
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +61 -0
- package/dist/domain/symbolAnalysis.js +66 -18
- package/dist/domain/webBundleAnalysis.js +20 -8
- package/dist/domain/webBundleAnalyzerInspection.js +13 -8
- package/dist/domain/webBundleAnalyzerResult.js +41 -2
- package/dist/domain/webCaptureDiff.js +0 -1
- package/dist/domain/webCaptureDiffSchemas.js +6 -3
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webRuntime.js +19 -7
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +3 -5
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
- package/dist/ghidra/GhidraClient.js +126 -34
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +13 -12
- package/dist/ghidra/GhidraInstallation.js +58 -33
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +66 -0
- package/dist/ghidra/GhidraLauncher.js +47 -22
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
- package/dist/ghidra/GhidraProviderClient.js +36 -15
- package/dist/ghidra/GhidraSessionError.js +13 -7
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +65 -56
- package/dist/hopper/HopperAnalysisProfile.js +65 -12
- package/dist/hopper/HopperCleanup.js +63 -22
- package/dist/hopper/HopperClient.js +288 -59
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +197 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +71 -19
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +134 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +133 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +3 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +20 -18
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
- package/dist/inspector/V8InspectorProvider.js +82 -36
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- package/dist/main/shutdown.js +11 -3
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +22 -2
- package/dist/main.js +11 -18
- package/dist/mcpDoctor.js +62 -2
- package/dist/native/AppleDispatchCoverage.js +47 -6
- package/dist/native/AppleDispatchDecodeFacts.js +6 -0
- package/dist/native/AppleDispatchMetadata.js +6 -3
- package/dist/native/AppleMachoFixups.js +48 -24
- package/dist/native/AppleMachoSelection.js +48 -22
- package/dist/native/AppleObjcCategories.js +6 -2
- package/dist/native/AppleObjcDispatchFacets.js +5 -2
- package/dist/native/AppleObjcProperties.js +2 -1
- package/dist/native/AppleSwiftDispatchFacets.js +27 -21
- package/dist/native/AppleSwiftVtables.js +21 -15
- package/dist/native/CommandRunner.js +87 -88
- package/dist/native/LldbCallTracer.js +372 -103
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +62 -3
- package/dist/native/NativeMacOSProvider.js +122 -31
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
- package/dist/process/DarwinProcessRunTokenReader.js +23 -10
- package/dist/process/ExecFileOutput.js +108 -6
- package/dist/process/OwnedCommand.js +7 -2
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +204 -57
- package/dist/process/ProcessOwnershipObservation.js +60 -9
- package/dist/process/ProviderProcess.js +39 -10
- package/dist/process/capture/FilesystemSnapshot.js +50 -13
- package/dist/process/capture/ProcessCaptureError.js +15 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
- package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
- package/dist/process/capture/ProcessHarness.js +21 -25
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +157 -0
- package/dist/server/createServer.js +61 -41
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -5
- package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +1 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +13 -10
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
- package/dist/server/registerBrowserScenarioTool.js +3 -6
- package/dist/server/registerBrowserTools.js +13 -18
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +9 -20
- package/dist/server/registerElectronTools.js +10 -15
- package/dist/server/registerEnhancedTools.js +36 -77
- package/dist/server/registerEvidenceTools.js +3 -6
- package/dist/server/registerEvmTools.js +2 -5
- package/dist/server/registerFirmwareTools.js +2 -5
- package/dist/server/registerFunctionComparisonTool.js +15 -12
- package/dist/server/registerInvestigationTools.js +16 -17
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
- package/dist/server/registerOfficialTools.js +4 -21
- package/dist/server/registerProcessComparisonTool.js +74 -48
- package/dist/server/registerRecordedCrashTools.js +2 -5
- package/dist/server/registerSessionRecordTools.js +19 -24
- package/dist/server/registerSessionStatusTool.js +19 -6
- package/dist/server/registerSessionTools.js +20 -18
- package/dist/server/registerWebModuleTool.js +2 -5
- package/dist/server/registerWebNetworkCaptureTool.js +2 -5
- package/dist/server/registerWebRuntimeTools.js +4 -9
- package/dist/server/registerWebScriptTool.js +2 -5
- package/dist/server/registerWebSourceLocationTool.js +2 -5
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +0 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +75 -51
- package/dist/server/toolResultEncoding.js +34 -0
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/install.sh +1 -1
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +44 -30
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +12 -3
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/ghidra/GhidraDefaults.js +0 -2
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -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 {
|
|
@@ -12,14 +13,14 @@ export class ProcessCaptureError extends AnalysisError {
|
|
|
12
13
|
cleanupReport;
|
|
13
14
|
constructor(message, options) {
|
|
14
15
|
super(message, options);
|
|
15
|
-
this.userMessage = options?.userMessage;
|
|
16
|
+
this.userMessage = options?.userMessage ?? message;
|
|
16
17
|
this.userCategory = options?.userCategory;
|
|
17
18
|
this.reason =
|
|
18
19
|
options?.reason ??
|
|
19
20
|
(options?.userCategory === "cancelled" ? "cancelled" : "capture_failed");
|
|
20
21
|
this.cleanupIncomplete = this.reason === "cleanup_incomplete";
|
|
21
22
|
this.cleanupResources = options?.cleanupResources ?? [];
|
|
22
|
-
this.executionFailure = options?.executionFailure;
|
|
23
|
+
this.executionFailure = options?.executionFailure ?? message;
|
|
23
24
|
this.partialObservation = options?.partialObservation;
|
|
24
25
|
this.cleanupReport = options?.cleanupReport;
|
|
25
26
|
}
|
|
@@ -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
|
+
};
|
|
@@ -3,18 +3,22 @@ import { constants, statSync } from "node:fs";
|
|
|
3
3
|
import { open, mkdtemp, rm, stat } from "node:fs/promises";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
|
-
import {
|
|
6
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
7
|
+
import { digestProcessCommitment, processComparisonContract, processScenarioCommitment, } from "../../domain/process/processScenario.js";
|
|
8
|
+
import { parseProcessCapture } from "../../domain/process/processCaptureParsing.js";
|
|
7
9
|
import { PRODUCT_IDENTITY } from "../../identity.js";
|
|
8
10
|
import { snapshotRoots } from "./FilesystemSnapshot.js";
|
|
9
11
|
import { classifyFilesystemEffects } from "./ProcessFilesystemEffects.js";
|
|
10
12
|
import { cleanupOwnedProcessGroup, verifyNoTokenOwnedProcesses, } from "../ProcessOwnership.js";
|
|
11
13
|
import { observeOwnedProcessGroup, prepareProcessOwnershipInspection, systemProcessOwnershipHost, } from "../ProcessOwnershipObservation.js";
|
|
12
|
-
import { describeProcessCaptureExecutionFailure, ProcessCaptureError, } from "./ProcessCaptureError.js";
|
|
14
|
+
import { describeProcessCaptureExecutionFailure, normalizeCaptureFailure, ProcessCaptureError, } from "./ProcessCaptureError.js";
|
|
13
15
|
import { assertNotCancelled } from "./ProcessScenarioRuntimeValidation.js";
|
|
14
16
|
import { normalizeProcessElapsedTime, normalizeProcessSamples, normalizeProcessText, } from "./ProcessNormalization.js";
|
|
15
17
|
import { PROCESS_PROVIDER } from "../../domain/process/processEvidenceProvider.js";
|
|
16
18
|
import { TerminalRenderer } from "./TerminalRenderer.js";
|
|
19
|
+
import { hasCaptureTruncation, } from "../../domain/process/processCaptureCoverage.js";
|
|
17
20
|
import { scheduleProcessInterval } from "./ProcessTimer.js";
|
|
21
|
+
import { partialProcessCaptureObservationSchema } from "../../domain/process/processCapture.js";
|
|
18
22
|
/** Seed explicit observation availability before capture completion begins. */
|
|
19
23
|
export const createProcessCaptureObservationBuffer = (options) => ({
|
|
20
24
|
target_pid: {
|
|
@@ -92,6 +96,9 @@ export const buildCaptureResult = (options) => {
|
|
|
92
96
|
const sensitiveInputUnknown = "Sensitive scripted input values are redacted from process capture Evidence.";
|
|
93
97
|
const filesystemObservationUnknown = "No filesystem observation paths were selected; filesystem effects remain unknown.";
|
|
94
98
|
const hasFilesystemObservations = options.scenario.filesystem_observation_paths.length > 0;
|
|
99
|
+
const filesystemEffects = classifyFilesystemEffects(options.before, options.after);
|
|
100
|
+
const hasUnknownFilesystemEffects = filesystemEffects.some(({ status }) => status === "unknown");
|
|
101
|
+
const incompleteFilesystemUnknown = "Path absence in incomplete enumeration or below an unfollowed symbolic link remains unknown.";
|
|
95
102
|
return {
|
|
96
103
|
manifest: options.manifest,
|
|
97
104
|
normalization: options.scenario.normalization,
|
|
@@ -111,8 +118,13 @@ export const buildCaptureResult = (options) => {
|
|
|
111
118
|
event_journal: options.eventJournal,
|
|
112
119
|
files_before: options.before.files,
|
|
113
120
|
files_after: options.after.files,
|
|
114
|
-
filesystem_effects:
|
|
115
|
-
truncated: options.
|
|
121
|
+
filesystem_effects: filesystemEffects,
|
|
122
|
+
truncated: options.truncationDetails === undefined
|
|
123
|
+
? options.truncated
|
|
124
|
+
: hasCaptureTruncation(options.truncationDetails),
|
|
125
|
+
...(options.truncationDetails === undefined
|
|
126
|
+
? {}
|
|
127
|
+
: { truncation_details: options.truncationDetails }),
|
|
116
128
|
limitations: [
|
|
117
129
|
"The executable digest is a prelaunch file sample; matching path metadata immediately after spawn does not prove an atomic operating-system image binding.",
|
|
118
130
|
"Process trees are sampled and may omit short-lived descendants.",
|
|
@@ -122,6 +134,10 @@ export const buildCaptureResult = (options) => {
|
|
|
122
134
|
"Filesystem observations are before/after snapshots, not syscall traces.",
|
|
123
135
|
"Inherited host environment variables are not recorded and may affect results.",
|
|
124
136
|
...(!hasFilesystemObservations ? [filesystemObservationUnknown] : []),
|
|
137
|
+
...(hasUnknownFilesystemEffects ? [incompleteFilesystemUnknown] : []),
|
|
138
|
+
...(options.truncationDetails === undefined
|
|
139
|
+
? []
|
|
140
|
+
: captureCoverageUnknowns(options.truncationDetails).map(({ reason }) => reason)),
|
|
125
141
|
...(hasSensitiveScriptedInput ? [sensitiveInputUnknown] : []),
|
|
126
142
|
],
|
|
127
143
|
residual_unknowns: [
|
|
@@ -149,12 +165,58 @@ export const buildCaptureResult = (options) => {
|
|
|
149
165
|
},
|
|
150
166
|
]
|
|
151
167
|
: []),
|
|
168
|
+
...(hasUnknownFilesystemEffects
|
|
169
|
+
? [
|
|
170
|
+
{
|
|
171
|
+
scope: "filesystem",
|
|
172
|
+
reason: incompleteFilesystemUnknown,
|
|
173
|
+
},
|
|
174
|
+
]
|
|
175
|
+
: []),
|
|
152
176
|
...(hasSensitiveScriptedInput
|
|
153
177
|
? [{ scope: "interaction", reason: sensitiveInputUnknown }]
|
|
154
178
|
: []),
|
|
179
|
+
...(options.truncationDetails === undefined
|
|
180
|
+
? []
|
|
181
|
+
: captureCoverageUnknowns(options.truncationDetails).filter(({ scope }) => scope !== "terminal")),
|
|
155
182
|
],
|
|
156
183
|
};
|
|
157
184
|
};
|
|
185
|
+
const captureCoverageUnknowns = (details) => {
|
|
186
|
+
const unknowns = [];
|
|
187
|
+
if (details.raw_terminal.observed_frames > details.raw_terminal.retained_frames)
|
|
188
|
+
unknowns.push({
|
|
189
|
+
scope: "terminal",
|
|
190
|
+
reason: "Raw PTY chunks exceeded output_bytes and were omitted; rendered states also lack those inputs. See truncation_details.raw_terminal.",
|
|
191
|
+
});
|
|
192
|
+
if (details.rendered_terminal.observed_frames >
|
|
193
|
+
details.rendered_terminal.retained_frames)
|
|
194
|
+
unknowns.push({
|
|
195
|
+
scope: "terminal",
|
|
196
|
+
reason: "Cumulative rendered state and visible-line bytes exceeded output_bytes; whole rendered frames were omitted. Raw PTY coverage is reported separately. See truncation_details.rendered_terminal.",
|
|
197
|
+
});
|
|
198
|
+
for (const [name, coverage] of [
|
|
199
|
+
["before", details.filesystem_before],
|
|
200
|
+
["after_settlement", details.filesystem_after],
|
|
201
|
+
]) {
|
|
202
|
+
if (coverage.enumeration_truncated)
|
|
203
|
+
unknowns.push({
|
|
204
|
+
scope: "filesystem",
|
|
205
|
+
reason: `Filesystem ${name} path enumeration was incomplete: ${coverage.enumeration_reasons.join(", ")}. See truncation_details.`,
|
|
206
|
+
});
|
|
207
|
+
if (coverage.hash_omissions.length > 0)
|
|
208
|
+
unknowns.push({
|
|
209
|
+
scope: "filesystem",
|
|
210
|
+
reason: `Filesystem ${name} omitted ${String(coverage.hash_omissions.length)} whole-file digests; per-path reasons and remaining file_bytes budget are in truncation_details.`,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
if (details.process.sampling_partial)
|
|
214
|
+
unknowns.push({
|
|
215
|
+
scope: "process",
|
|
216
|
+
reason: "Process sampling stopped with incomplete observations; sample_limit is reported in truncation_details.process.",
|
|
217
|
+
});
|
|
218
|
+
return unknowns;
|
|
219
|
+
};
|
|
158
220
|
const identityFromStats = (stats) => ({
|
|
159
221
|
dev: stats.dev,
|
|
160
222
|
ino: stats.ino,
|
|
@@ -301,7 +363,8 @@ export const createRunManifest = async (scenario, startedAt, completedAt, execut
|
|
|
301
363
|
normalization_sha256: digestProcessCommitment(scenario.normalization),
|
|
302
364
|
};
|
|
303
365
|
};
|
|
304
|
-
export const observeSettlement = async (runId, processGroupIds, settleMs, recordEvent = () => undefined, platform = process.platform) => {
|
|
366
|
+
export const observeSettlement = async (runId, processGroupIds, settleMs, recordEvent = () => undefined, platform = process.platform, signal) => {
|
|
367
|
+
assertNotCancelled(signal);
|
|
305
368
|
if (platform === "win32") {
|
|
306
369
|
recordEvent("lifecycle", 1);
|
|
307
370
|
return { state: "unverifiable", elapsed_ms: 0 };
|
|
@@ -310,11 +373,9 @@ export const observeSettlement = async (runId, processGroupIds, settleMs, record
|
|
|
310
373
|
let consecutiveEmpty = 0;
|
|
311
374
|
let deadlineReached = false;
|
|
312
375
|
while (!deadlineReached) {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
processGroupId,
|
|
317
|
-
})));
|
|
376
|
+
assertNotCancelled(signal);
|
|
377
|
+
const observations = await Promise.all([...new Set(processGroupIds)].map((processGroupId) => observeOwnedProcessGroup({ runId, leaderPid: processGroupId, processGroupId }, undefined, signal)));
|
|
378
|
+
assertNotCancelled(signal);
|
|
318
379
|
if (observations.some(({ state }) => state === "unverifiable")) {
|
|
319
380
|
recordEvent("lifecycle", 1);
|
|
320
381
|
return { state: "unverifiable", elapsed_ms: Date.now() - started };
|
|
@@ -331,7 +392,7 @@ export const observeSettlement = async (runId, processGroupIds, settleMs, record
|
|
|
331
392
|
deadlineReached = Date.now() - started >= settleMs;
|
|
332
393
|
if (deadlineReached)
|
|
333
394
|
break;
|
|
334
|
-
await
|
|
395
|
+
await delay(50, undefined, { signal });
|
|
335
396
|
}
|
|
336
397
|
recordEvent("lifecycle", 1);
|
|
337
398
|
return { state: "alive_at_deadline", elapsed_ms: Date.now() - started };
|
|
@@ -403,6 +464,50 @@ const verifyTokenOwnedProcessesUntilSettled = async (verify) => {
|
|
|
403
464
|
}
|
|
404
465
|
return result;
|
|
405
466
|
};
|
|
467
|
+
const releaseCapturedProcessGroup = async (ownership, host) => {
|
|
468
|
+
if (host.platform === "win32")
|
|
469
|
+
return {
|
|
470
|
+
state: "unverified",
|
|
471
|
+
reason: "owned process cleanup is unverifiable on Windows without process-job authority",
|
|
472
|
+
};
|
|
473
|
+
let outcome = {
|
|
474
|
+
state: "cleaned",
|
|
475
|
+
reason: null,
|
|
476
|
+
};
|
|
477
|
+
const unverified = [];
|
|
478
|
+
try {
|
|
479
|
+
const cleaned = await host.cleanupProcessGroup(ownership);
|
|
480
|
+
unverified.push(...(cleaned.unverified ?? []));
|
|
481
|
+
if (!cleaned.cleaned) {
|
|
482
|
+
outcome = { state: "unverified", reason: cleaned.reason };
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
const verified = await verifyTokenOwnedProcessesUntilSettled(() => host.verifyTokenOwnedProcesses(ownership.runId, undefined, ownership.captureBaseline, ownership));
|
|
486
|
+
unverified.push(...(verified.unverified ?? []));
|
|
487
|
+
if (!verified.cleaned)
|
|
488
|
+
outcome = { state: "unverified", reason: verified.reason };
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
catch (cause) {
|
|
492
|
+
outcome = {
|
|
493
|
+
state: "failed",
|
|
494
|
+
reason: cause instanceof Error
|
|
495
|
+
? cause.message || cause.name || "owned process cleanup failed"
|
|
496
|
+
: "owned process cleanup failed",
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
return unverified.length === 0
|
|
500
|
+
? outcome
|
|
501
|
+
: {
|
|
502
|
+
...outcome,
|
|
503
|
+
unverified_processes: [
|
|
504
|
+
...new Map(unverified.map(({ pid, diagnostic }) => [
|
|
505
|
+
`${String(pid)}:${diagnostic}`,
|
|
506
|
+
{ pid, reason: diagnostic },
|
|
507
|
+
])).values(),
|
|
508
|
+
],
|
|
509
|
+
};
|
|
510
|
+
};
|
|
406
511
|
export const releaseProcessResources = async (options) => {
|
|
407
512
|
const host = options.host ?? processCaptureCleanupHost;
|
|
408
513
|
for (const timer of options.timers)
|
|
@@ -422,40 +527,20 @@ export const releaseProcessResources = async (options) => {
|
|
|
422
527
|
: "renderer dispose failed",
|
|
423
528
|
};
|
|
424
529
|
}
|
|
425
|
-
|
|
426
|
-
state:
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
leaderPid: options.terminal.pid,
|
|
440
|
-
processGroupId: options.terminal.pid,
|
|
441
|
-
sweepTokenOwnedProcesses: true,
|
|
442
|
-
...(options.sampledProcessGroupIds === undefined
|
|
443
|
-
? {}
|
|
444
|
-
: { sampledProcessGroupIds: options.sampledProcessGroupIds }),
|
|
445
|
-
...(options.captureBaseline === undefined
|
|
446
|
-
? {}
|
|
447
|
-
: { captureBaseline: options.captureBaseline }),
|
|
448
|
-
});
|
|
449
|
-
if (!cleaned.cleaned) {
|
|
450
|
-
ownedProcessGroup = { state: "unverified", reason: cleaned.reason };
|
|
451
|
-
}
|
|
452
|
-
else {
|
|
453
|
-
const verified = await verifyTokenOwnedProcessesUntilSettled(() => host.verifyTokenOwnedProcesses(options.runId, undefined, options.captureBaseline));
|
|
454
|
-
if (!verified.cleaned)
|
|
455
|
-
ownedProcessGroup = { state: "unverified", reason: verified.reason };
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
}
|
|
530
|
+
const ownedProcessGroup = options.terminal === undefined
|
|
531
|
+
? { state: "not_required", reason: null }
|
|
532
|
+
: await releaseCapturedProcessGroup({
|
|
533
|
+
runId: options.runId,
|
|
534
|
+
leaderPid: options.terminal.pid,
|
|
535
|
+
processGroupId: options.terminal.pid,
|
|
536
|
+
sweepTokenOwnedProcesses: true,
|
|
537
|
+
...(options.sampledProcessGroupIds === undefined
|
|
538
|
+
? {}
|
|
539
|
+
: { sampledProcessGroupIds: options.sampledProcessGroupIds }),
|
|
540
|
+
...(options.captureBaseline === undefined
|
|
541
|
+
? {}
|
|
542
|
+
: { captureBaseline: options.captureBaseline }),
|
|
543
|
+
}, host);
|
|
459
544
|
let temporaryRoot = {
|
|
460
545
|
state: "cleaned",
|
|
461
546
|
reason: null,
|
|
@@ -487,12 +572,14 @@ export const cleanupReportFailure = (report) => {
|
|
|
487
572
|
};
|
|
488
573
|
export const captureTerminalFrames = (options) => {
|
|
489
574
|
let outputBytes = 0;
|
|
490
|
-
let
|
|
575
|
+
let observedBytes = 0;
|
|
576
|
+
let observedFrames = 0;
|
|
491
577
|
options.terminal.onData((data) => {
|
|
492
578
|
options.onOutput();
|
|
493
579
|
const bytes = Buffer.byteLength(data);
|
|
580
|
+
observedBytes += bytes;
|
|
581
|
+
observedFrames += 1;
|
|
494
582
|
if (outputBytes + bytes > options.scenario.limits.output_bytes) {
|
|
495
|
-
truncated = true;
|
|
496
583
|
return;
|
|
497
584
|
}
|
|
498
585
|
outputBytes += bytes;
|
|
@@ -503,49 +590,68 @@ export const captureTerminalFrames = (options) => {
|
|
|
503
590
|
sequence,
|
|
504
591
|
at_ms: atMs,
|
|
505
592
|
data: normalized,
|
|
593
|
+
...(normalized === data ? {} : { raw_data: data }),
|
|
506
594
|
});
|
|
507
595
|
options.renderer.write(data, atMs);
|
|
508
596
|
options.recordEvent("frames", sequence);
|
|
509
597
|
});
|
|
510
|
-
return () =>
|
|
598
|
+
return () => ({
|
|
599
|
+
budget_bytes: options.scenario.limits.output_bytes,
|
|
600
|
+
observed_bytes: observedBytes,
|
|
601
|
+
retained_bytes: outputBytes,
|
|
602
|
+
observed_frames: observedFrames,
|
|
603
|
+
retained_frames: options.frames.length,
|
|
604
|
+
});
|
|
511
605
|
};
|
|
512
606
|
export const resolveProcessResult = (capture, executionFailure, cleanup, observations, partialContext) => {
|
|
513
607
|
const cleanupFailure = cleanupReportFailure(cleanup);
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
const
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
608
|
+
const executionFailureReason = describeProcessCaptureExecutionFailure(executionFailure);
|
|
609
|
+
let partialObservation;
|
|
610
|
+
if ((cleanupFailure !== undefined || executionFailure !== undefined) &&
|
|
611
|
+
(capture !== undefined || observations !== undefined)) {
|
|
612
|
+
const normalizedObservations = observations === undefined || partialContext === undefined
|
|
613
|
+
? observations
|
|
614
|
+
: normalizePartialProcessObservations(observations, partialContext);
|
|
615
|
+
if (capture === undefined) {
|
|
616
|
+
if (normalizedObservations !== undefined) {
|
|
617
|
+
const partialResult = partialProcessCaptureObservationSchema.safeParse({
|
|
618
|
+
observations: normalizedObservations,
|
|
619
|
+
cleanup,
|
|
620
|
+
execution_failure: executionFailureReason ?? null,
|
|
621
|
+
});
|
|
622
|
+
if (partialResult.success)
|
|
623
|
+
partialObservation = partialResult.data;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
else {
|
|
627
|
+
const captureData = "cleanup" in capture
|
|
628
|
+
? (() => {
|
|
629
|
+
const { cleanup: _cleanup, ...data } = capture;
|
|
630
|
+
void _cleanup;
|
|
631
|
+
return data;
|
|
632
|
+
})()
|
|
633
|
+
: capture;
|
|
634
|
+
const settlement = cleanupFailure !== undefined
|
|
635
|
+
? { ...capture.settlement, cleanup_outcome: "failed" }
|
|
636
|
+
: capture.settlement.state === "quiesced"
|
|
637
|
+
? {
|
|
532
638
|
...capture.settlement,
|
|
533
|
-
cleanup_outcome: "
|
|
534
|
-
}
|
|
535
|
-
|
|
639
|
+
cleanup_outcome: "not_required",
|
|
640
|
+
}
|
|
641
|
+
: { ...capture.settlement, cleanup_outcome: "cleaned" };
|
|
536
642
|
const partialResult = partialProcessCaptureObservationSchema.safeParse({
|
|
537
|
-
...
|
|
538
|
-
...(pendingCapture === undefined
|
|
539
|
-
? {}
|
|
540
|
-
: {
|
|
541
|
-
capture: Object.fromEntries(Object.entries(pendingCapture).filter(([key]) => key !== "cleanup")),
|
|
542
|
-
}),
|
|
643
|
+
capture: { ...captureData, settlement },
|
|
543
644
|
cleanup,
|
|
544
645
|
execution_failure: executionFailureReason ?? null,
|
|
545
646
|
});
|
|
546
647
|
if (partialResult.success)
|
|
547
648
|
partialObservation = partialResult.data;
|
|
548
649
|
}
|
|
650
|
+
}
|
|
651
|
+
if (cleanupFailure !== undefined) {
|
|
652
|
+
const cleanupResources = Object.entries(cleanup)
|
|
653
|
+
.filter(([, outcome]) => outcome.state === "failed" || outcome.state === "unverified")
|
|
654
|
+
.map(([resource]) => resource);
|
|
549
655
|
throw new ProcessCaptureError(cleanupFailure, {
|
|
550
656
|
cause: executionFailure,
|
|
551
657
|
reason: "cleanup_incomplete",
|
|
@@ -557,20 +663,43 @@ export const resolveProcessResult = (capture, executionFailure, cleanup, observa
|
|
|
557
663
|
cleanupReport: cleanup,
|
|
558
664
|
});
|
|
559
665
|
}
|
|
560
|
-
if (executionFailure instanceof ProcessCaptureError)
|
|
561
|
-
|
|
666
|
+
if (executionFailure instanceof ProcessCaptureError) {
|
|
667
|
+
const retainedExecutionFailure = executionFailure.executionFailure ?? executionFailureReason;
|
|
668
|
+
const retainedPartialObservation = executionFailure.partialObservation ?? partialObservation;
|
|
669
|
+
throw new ProcessCaptureError(executionFailure.message, {
|
|
670
|
+
cause: executionFailure,
|
|
671
|
+
...(executionFailure.userMessage === undefined
|
|
672
|
+
? {}
|
|
673
|
+
: { userMessage: executionFailure.userMessage }),
|
|
674
|
+
...(executionFailure.userCategory === undefined
|
|
675
|
+
? {}
|
|
676
|
+
: { userCategory: executionFailure.userCategory }),
|
|
677
|
+
reason: executionFailure.reason,
|
|
678
|
+
cleanupResources: executionFailure.cleanupResources,
|
|
679
|
+
...(retainedExecutionFailure === undefined
|
|
680
|
+
? {}
|
|
681
|
+
: { executionFailure: retainedExecutionFailure }),
|
|
682
|
+
...(retainedPartialObservation === undefined
|
|
683
|
+
? {}
|
|
684
|
+
: { partialObservation: retainedPartialObservation }),
|
|
685
|
+
cleanupReport: executionFailure.cleanupReport ?? cleanup,
|
|
686
|
+
});
|
|
687
|
+
}
|
|
562
688
|
if (executionFailure !== undefined) {
|
|
563
|
-
const executionFailureReason = describeProcessCaptureExecutionFailure(executionFailure);
|
|
564
689
|
throw new ProcessCaptureError("process capture failed", {
|
|
565
690
|
cause: executionFailure,
|
|
691
|
+
reason: "capture_failed",
|
|
566
692
|
...(executionFailureReason === undefined
|
|
567
693
|
? {}
|
|
568
694
|
: { executionFailure: executionFailureReason }),
|
|
695
|
+
...(partialObservation === undefined ? {} : { partialObservation }),
|
|
696
|
+
cleanupReport: cleanup,
|
|
569
697
|
});
|
|
570
698
|
}
|
|
571
699
|
if (capture === undefined)
|
|
572
700
|
throw new ProcessCaptureError("process capture produced no result");
|
|
573
|
-
|
|
701
|
+
const unverifiedProcesses = cleanup.owned_process_group.unverified_processes;
|
|
702
|
+
if ("cleanup" in capture && unverifiedProcesses === undefined)
|
|
574
703
|
return capture;
|
|
575
704
|
const settlement = capture.settlement.state === "quiesced"
|
|
576
705
|
? { ...capture.settlement, cleanup_outcome: "not_required" }
|
|
@@ -579,9 +708,20 @@ export const resolveProcessResult = (capture, executionFailure, cleanup, observa
|
|
|
579
708
|
return parseProcessCapture({
|
|
580
709
|
...capture,
|
|
581
710
|
settlement,
|
|
711
|
+
residual_unknowns: [
|
|
712
|
+
...capture.residual_unknowns,
|
|
713
|
+
...(unverifiedProcesses ?? []).map(({ pid, reason }) => ({
|
|
714
|
+
scope: "process",
|
|
715
|
+
reason: `Ownership of unrelated process ${String(pid)} could not be verified; it was left untouched: ${reason}`,
|
|
716
|
+
})),
|
|
717
|
+
],
|
|
582
718
|
cleanup: {
|
|
719
|
+
...("cleanup" in capture ? capture.cleanup : {}),
|
|
583
720
|
owned_process_group: "verified",
|
|
584
721
|
temporary_root: "removed",
|
|
722
|
+
...(unverifiedProcesses === undefined
|
|
723
|
+
? {}
|
|
724
|
+
: { unverified_processes: unverifiedProcesses }),
|
|
585
725
|
},
|
|
586
726
|
});
|
|
587
727
|
}
|
|
@@ -594,16 +734,30 @@ export const prepareProcessCapture = async (scenario, signal, captureSnapshot =
|
|
|
594
734
|
await host.prepareOwnershipInspector?.(signal);
|
|
595
735
|
assertNotCancelled(signal);
|
|
596
736
|
const before = await captureSnapshot(scenario, signal);
|
|
737
|
+
const runId = randomUUID();
|
|
597
738
|
const temporaryRoot = await host.createTemporaryRoot();
|
|
598
739
|
try {
|
|
599
740
|
assertNotCancelled(signal);
|
|
600
|
-
const runId = randomUUID();
|
|
601
741
|
const ownershipBaseline = (await host.captureOwnershipBaseline?.(signal)) ?? [];
|
|
602
742
|
assertNotCancelled(signal);
|
|
603
743
|
return { temporaryRoot, runId, ownershipBaseline, before };
|
|
604
744
|
}
|
|
605
745
|
catch (cause) {
|
|
606
|
-
await
|
|
746
|
+
const cleanup = await releaseProcessResources({
|
|
747
|
+
timers: new Set(),
|
|
748
|
+
terminal: undefined,
|
|
749
|
+
renderer: undefined,
|
|
750
|
+
runId,
|
|
751
|
+
temporaryRoot,
|
|
752
|
+
host: { ...processCaptureCleanupHost, removeTemporaryRoot: host.cleanup },
|
|
753
|
+
});
|
|
754
|
+
resolveProcessResult(undefined, normalizeCaptureFailure(cause, signal), cleanup, createProcessCaptureObservationBuffer({
|
|
755
|
+
frames: [],
|
|
756
|
+
interactions: [],
|
|
757
|
+
samples: [],
|
|
758
|
+
eventJournal: [],
|
|
759
|
+
before,
|
|
760
|
+
}), { scenario });
|
|
607
761
|
throw cause;
|
|
608
762
|
}
|
|
609
763
|
};
|