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
|
@@ -17,8 +17,8 @@ const responseSchema = z.discriminatedUnion("ok", [
|
|
|
17
17
|
}),
|
|
18
18
|
]);
|
|
19
19
|
/** Capture a selected existing app window and run explicitly selected scenarios. */
|
|
20
|
-
export const observeNativeUi = async (target, operation, parameters, options
|
|
21
|
-
const runtime = createNativeUiHelperRuntime();
|
|
20
|
+
export const observeNativeUi = async (target, operation, parameters, options) => {
|
|
21
|
+
const runtime = createNativeUiHelperRuntime(options.environment);
|
|
22
22
|
try {
|
|
23
23
|
return await observeWithHelper(target, operation, parameters, {
|
|
24
24
|
...options,
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { lstat, mkdtemp, open, rm } from "node:fs/promises";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { basename, join } from "node:path";
|
|
6
|
+
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
7
|
+
import { AnalysisAccessDeniedError, AnalysisArtifactChangedError, AnalysisCancelledError, AnalysisResourceConstraintError, } from "../domain/analysisErrorCore.js";
|
|
8
|
+
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
9
|
+
import { err, ok } from "../domain/result.js";
|
|
10
|
+
import { NATIVE_MACOS_PROVIDER_IDENTITY } from "./NativeMacOSProviderMetadata.js";
|
|
11
|
+
const identity = (stat) => [stat.dev, stat.ino, stat.size, stat.mtimeNs, stat.ctimeNs].join(":");
|
|
12
|
+
const changedTarget = (target, reason) => err(new AnalysisArtifactChangedError("inspect_signature", target.path, reason));
|
|
13
|
+
const signatureReadFailure = (target, cause) => {
|
|
14
|
+
if (cause instanceof AnalysisError)
|
|
15
|
+
return cause;
|
|
16
|
+
const code = cause instanceof Error && "code" in cause ? cause.code : undefined;
|
|
17
|
+
if (code === "EACCES" || code === "EPERM")
|
|
18
|
+
return new AnalysisAccessDeniedError("inspect_signature", target.path, code, { cause });
|
|
19
|
+
if (code === "ENOENT" || code === "ENOTDIR" || code === "ELOOP")
|
|
20
|
+
return new AnalysisArtifactChangedError("inspect_signature", target.path, `Registered signature target is no longer readable (${code}): ${target.path}`, { cause });
|
|
21
|
+
return new ProviderAdapterError(NATIVE_MACOS_PROVIDER_IDENTITY.id, "inspect_signature", {
|
|
22
|
+
cause,
|
|
23
|
+
diagnostics: {
|
|
24
|
+
path: target.path,
|
|
25
|
+
phase: "target-version-binding",
|
|
26
|
+
system_code: typeof code === "string" ? code : null,
|
|
27
|
+
reason: cause instanceof Error ? cause.message : String(cause),
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
/** Inspect a digest-verified private copy, releasing it on every exit path. */
|
|
32
|
+
export const withSignatureTarget = async (target, inspect, signal) => {
|
|
33
|
+
let directory;
|
|
34
|
+
try {
|
|
35
|
+
signal?.throwIfAborted();
|
|
36
|
+
directory = await mkdtemp(join(tmpdir(), "rea-signature-"));
|
|
37
|
+
}
|
|
38
|
+
catch (cause) {
|
|
39
|
+
return err(signal?.aborted
|
|
40
|
+
? new AnalysisCancelledError("inspect_signature")
|
|
41
|
+
: snapshotFailure(target, "create", cause));
|
|
42
|
+
}
|
|
43
|
+
let result;
|
|
44
|
+
let cleanup;
|
|
45
|
+
try {
|
|
46
|
+
const binding = await bindSignatureTarget(target, join(directory, basename(target.path)), signal);
|
|
47
|
+
result = binding.ok ? await inspect(binding.value) : binding;
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
try {
|
|
51
|
+
await rm(directory, { recursive: true, force: true });
|
|
52
|
+
cleanup = ok(undefined);
|
|
53
|
+
}
|
|
54
|
+
catch (cause) {
|
|
55
|
+
cleanup = err(snapshotFailure(target, "cleanup", cause));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Cleanup cannot replace the operation's original actionable failure.
|
|
59
|
+
return result.ok && !cleanup.ok ? cleanup : result;
|
|
60
|
+
};
|
|
61
|
+
const snapshotFailure = (target, phase, cause) => new ProviderAdapterError(NATIVE_MACOS_PROVIDER_IDENTITY.id, "inspect_signature", {
|
|
62
|
+
cause,
|
|
63
|
+
diagnostics: {
|
|
64
|
+
path: target.path,
|
|
65
|
+
phase: `signature-snapshot-${phase}`,
|
|
66
|
+
reason: cause instanceof Error ? cause.message : String(cause),
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const snapshotIO = async (target, phase, operation) => {
|
|
70
|
+
try {
|
|
71
|
+
return await operation();
|
|
72
|
+
}
|
|
73
|
+
catch (cause) {
|
|
74
|
+
throw snapshotFailure(target, phase, cause);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const copySignatureBytes = async (target, source, snapshot, signal) => {
|
|
78
|
+
const size = Number(source.stat.size);
|
|
79
|
+
if (!Number.isSafeInteger(size))
|
|
80
|
+
throw new AnalysisResourceConstraintError("inspect_signature", "file-size", `Signature target size is not exactly representable: ${target.path}`, null);
|
|
81
|
+
const hash = createHash("sha256");
|
|
82
|
+
const chunk = Buffer.alloc(64 * 1024);
|
|
83
|
+
let position = 0;
|
|
84
|
+
while (position < size) {
|
|
85
|
+
signal?.throwIfAborted();
|
|
86
|
+
const { bytesRead } = await source.file.read(chunk, 0, Math.min(chunk.length, size - position), position);
|
|
87
|
+
signal?.throwIfAborted();
|
|
88
|
+
if (bytesRead === 0)
|
|
89
|
+
throw new AnalysisArtifactChangedError("inspect_signature", target.path, `Signature target was truncated while hashing: ${target.path}`);
|
|
90
|
+
const bytes = chunk.subarray(0, bytesRead);
|
|
91
|
+
hash.update(bytes);
|
|
92
|
+
// writeFile retries short writes; memory remains bounded to this chunk.
|
|
93
|
+
await snapshotIO(target, "write", () => snapshot.writeFile(bytes));
|
|
94
|
+
position += bytesRead;
|
|
95
|
+
}
|
|
96
|
+
return hash.digest("hex");
|
|
97
|
+
};
|
|
98
|
+
/** Hash and copy the same descriptor bytes, without reopening the mutable path. */
|
|
99
|
+
const bindSignatureTarget = async (target, snapshotPath, signal) => {
|
|
100
|
+
try {
|
|
101
|
+
signal?.throwIfAborted();
|
|
102
|
+
const before = await lstat(target.path, { bigint: true });
|
|
103
|
+
signal?.throwIfAborted();
|
|
104
|
+
if (!before.isFile() || before.isSymbolicLink())
|
|
105
|
+
return changedTarget(target, `Signature target is no longer a regular file: ${target.path}`);
|
|
106
|
+
const file = await open(target.path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
107
|
+
try {
|
|
108
|
+
const opened = await file.stat({ bigint: true });
|
|
109
|
+
signal?.throwIfAborted();
|
|
110
|
+
if (identity(opened) !== identity(before))
|
|
111
|
+
return changedTarget(target, `Signature target changed before open: ${target.path}`);
|
|
112
|
+
const snapshot = await snapshotIO(target, "create-file", () => open(snapshotPath, "wx", 0o600));
|
|
113
|
+
try {
|
|
114
|
+
const observed = await copySignatureBytes(target, { file, stat: opened }, snapshot, signal);
|
|
115
|
+
if (observed !== target.sha256)
|
|
116
|
+
return changedTarget(target, `Signature target digest changed: ${target.path}; expected ${target.sha256}, observed ${observed}`);
|
|
117
|
+
const after = await file.stat({ bigint: true });
|
|
118
|
+
const current = await lstat(target.path, { bigint: true });
|
|
119
|
+
signal?.throwIfAborted();
|
|
120
|
+
if (identity(after) !== identity(opened) ||
|
|
121
|
+
identity(current) !== identity(opened))
|
|
122
|
+
return changedTarget(target, `Signature target changed while establishing its version: ${target.path}`);
|
|
123
|
+
await snapshotIO(target, "seal", () => snapshot.chmod(0o400));
|
|
124
|
+
return ok({ identity: identity(opened), snapshotPath });
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
await snapshotIO(target, "close", () => snapshot.close());
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await file.close();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (cause) {
|
|
135
|
+
return err(signal?.aborted
|
|
136
|
+
? new AnalysisCancelledError("inspect_signature")
|
|
137
|
+
: signatureReadFailure(target, cause));
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
/** Reject target drift across signature command captures. */
|
|
141
|
+
export const verifySignatureTarget = async (target, binding, signal) => {
|
|
142
|
+
try {
|
|
143
|
+
signal?.throwIfAborted();
|
|
144
|
+
const current = await lstat(target.path, { bigint: true });
|
|
145
|
+
signal?.throwIfAborted();
|
|
146
|
+
return current.isFile() && identity(current) === binding.identity
|
|
147
|
+
? ok(undefined)
|
|
148
|
+
: changedTarget(target, `Signature target changed during inspection: ${target.path}`);
|
|
149
|
+
}
|
|
150
|
+
catch (cause) {
|
|
151
|
+
return err(signal?.aborted
|
|
152
|
+
? new AnalysisCancelledError("inspect_signature")
|
|
153
|
+
: signatureReadFailure(target, cause));
|
|
154
|
+
}
|
|
155
|
+
};
|
|
@@ -3,6 +3,9 @@ const architectureSchema = z.object({
|
|
|
3
3
|
name: z.string().min(1),
|
|
4
4
|
cpu_type: z.string().nullable(),
|
|
5
5
|
cpu_subtype: z.string().nullable(),
|
|
6
|
+
cpu_type_code: z.number().int().nonnegative().nullable(),
|
|
7
|
+
cpu_subtype_code: z.number().int().nonnegative().nullable(),
|
|
8
|
+
capabilities: z.string().nullable(),
|
|
6
9
|
file_offset: z.number().int().min(0).nullable(),
|
|
7
10
|
size: z.number().int().min(0).nullable(),
|
|
8
11
|
alignment: z.number().int().min(0).nullable(),
|
|
@@ -18,6 +21,9 @@ export const parseLipoArchitectures = (output) => {
|
|
|
18
21
|
name: thinArchitecture,
|
|
19
22
|
cpu_type: null,
|
|
20
23
|
cpu_subtype: null,
|
|
24
|
+
cpu_type_code: null,
|
|
25
|
+
cpu_subtype_code: null,
|
|
26
|
+
capabilities: null,
|
|
21
27
|
file_offset: null,
|
|
22
28
|
size: null,
|
|
23
29
|
alignment: null,
|
|
@@ -36,6 +42,9 @@ export const parseLipoArchitectures = (output) => {
|
|
|
36
42
|
: name,
|
|
37
43
|
cpu_type: current.cputype ?? null,
|
|
38
44
|
cpu_subtype: current.cpusubtype ?? null,
|
|
45
|
+
cpu_type_code: cpuTypeCode(current.cputype),
|
|
46
|
+
cpu_subtype_code: cpuSubtypeCode(current.cpusubtype, current.capabilities),
|
|
47
|
+
capabilities: current.capabilities ?? null,
|
|
39
48
|
file_offset: integer(current.offset),
|
|
40
49
|
size: integer(current.size),
|
|
41
50
|
alignment: alignment(current.align),
|
|
@@ -54,7 +63,7 @@ export const parseLipoArchitectures = (output) => {
|
|
|
54
63
|
current = { architecture: line.slice("architecture ".length).trim() };
|
|
55
64
|
continue;
|
|
56
65
|
}
|
|
57
|
-
const match = /^(cputype|cpusubtype|offset|size|align)\s+(.+)$/u.exec(line);
|
|
66
|
+
const match = /^(cputype|cpusubtype|capabilities|offset|size|align)\s+(.+)$/u.exec(line);
|
|
58
67
|
if (match?.[1] !== undefined && match[2] !== undefined) {
|
|
59
68
|
current ??= {};
|
|
60
69
|
current[match[1]] = match[2].trim();
|
|
@@ -71,6 +80,67 @@ const integer = (value) => {
|
|
|
71
80
|
const parsed = Number.parseInt(value, 10);
|
|
72
81
|
return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null;
|
|
73
82
|
};
|
|
83
|
+
const CPU_TYPES = {
|
|
84
|
+
CPU_TYPE_X86: 7,
|
|
85
|
+
CPU_TYPE_X86_64: 0x01000007,
|
|
86
|
+
CPU_TYPE_ARM: 12,
|
|
87
|
+
CPU_TYPE_ARM64: 0x0100000c,
|
|
88
|
+
CPU_TYPE_ARM64_32: 0x0200000c,
|
|
89
|
+
CPU_TYPE_POWERPC: 18,
|
|
90
|
+
CPU_TYPE_POWERPC64: 0x01000012,
|
|
91
|
+
};
|
|
92
|
+
const CPU_SUBTYPES = {
|
|
93
|
+
CPU_SUBTYPE_X86_ALL: 3,
|
|
94
|
+
CPU_SUBTYPE_X86_64_ALL: 3,
|
|
95
|
+
CPU_SUBTYPE_X86_64_H: 8,
|
|
96
|
+
CPU_SUBTYPE_ARM64_ALL: 0,
|
|
97
|
+
CPU_SUBTYPE_ARM64_V8: 1,
|
|
98
|
+
CPU_SUBTYPE_ARM64E: 2,
|
|
99
|
+
CPU_SUBTYPE_ARM64_32_ALL: 0,
|
|
100
|
+
CPU_SUBTYPE_ARM64_32_V8: 1,
|
|
101
|
+
CPU_SUBTYPE_ARM_V7: 9,
|
|
102
|
+
CPU_SUBTYPE_ARM_V7S: 11,
|
|
103
|
+
CPU_SUBTYPE_ARM_V7K: 12,
|
|
104
|
+
CPU_SUBTYPE_POWERPC_ALL: 0,
|
|
105
|
+
CPU_SUBTYPE_POWERPC_970: 100,
|
|
106
|
+
};
|
|
107
|
+
/** Normalize known lipo names while retaining the producer's original text. */
|
|
108
|
+
const cpuTypeCode = (value) => {
|
|
109
|
+
if (value === undefined)
|
|
110
|
+
return null;
|
|
111
|
+
const numeric = unsigned32(value);
|
|
112
|
+
return numeric ?? CPU_TYPES[value] ?? null;
|
|
113
|
+
};
|
|
114
|
+
/** Normalize the subtype and its separately printed ptrauth capability bits. */
|
|
115
|
+
const cpuSubtypeCode = (value, capabilities) => {
|
|
116
|
+
if (value === undefined)
|
|
117
|
+
return null;
|
|
118
|
+
const numeric = unsigned32(value);
|
|
119
|
+
if (numeric !== null)
|
|
120
|
+
return numeric;
|
|
121
|
+
const subtype = CPU_SUBTYPES[value];
|
|
122
|
+
if (subtype === undefined)
|
|
123
|
+
return null;
|
|
124
|
+
if (value !== "CPU_SUBTYPE_ARM64E")
|
|
125
|
+
return subtype;
|
|
126
|
+
const version = /PTR_AUTH_VERSION\s+USERSPACE\s+(\d+)/u.exec(capabilities ?? "")?.[1];
|
|
127
|
+
if (version === undefined)
|
|
128
|
+
return null;
|
|
129
|
+
const parsedVersion = Number(version);
|
|
130
|
+
if (!Number.isInteger(parsedVersion) ||
|
|
131
|
+
parsedVersion < 0 ||
|
|
132
|
+
parsedVersion > 15)
|
|
133
|
+
return null;
|
|
134
|
+
return (0x80000000 | (parsedVersion << 24) | subtype) >>> 0;
|
|
135
|
+
};
|
|
136
|
+
const unsigned32 = (value) => {
|
|
137
|
+
if (!/^(?:\d+|0x[\da-f]+)$/iu.test(value))
|
|
138
|
+
return null;
|
|
139
|
+
const parsed = Number(value);
|
|
140
|
+
return Number.isInteger(parsed) && parsed >= 0 && parsed <= 0xffffffff
|
|
141
|
+
? parsed >>> 0
|
|
142
|
+
: null;
|
|
143
|
+
};
|
|
74
144
|
const alignment = (value) => {
|
|
75
145
|
if (value === undefined)
|
|
76
146
|
return null;
|
|
@@ -28,7 +28,7 @@ const replySchema = z.discriminatedUnion("ok", [
|
|
|
28
28
|
}),
|
|
29
29
|
]);
|
|
30
30
|
/** Add mapping candidates from an owned core-only debugger, using the existing snapshot. */
|
|
31
|
-
export const inspectPwndbgCore = async ({ environment, rootPath, diagnostics, options, launcher, }) => {
|
|
31
|
+
export const inspectPwndbgCore = async ({ environment, rootPath, diagnostics, options, launcher, probePath, }) => {
|
|
32
32
|
const gdb = environment.REA_PWNDBG_GDB ?? "/usr/bin/gdb";
|
|
33
33
|
const entry = environment.REA_PWNDBG_GDBINIT ?? "";
|
|
34
34
|
const venv = environment.REA_PWNDBG_VENV_PATH ?? "";
|
|
@@ -37,23 +37,43 @@ export const inspectPwndbgCore = async ({ environment, rootPath, diagnostics, op
|
|
|
37
37
|
userMessage: message,
|
|
38
38
|
capturedOutput: diagnostics,
|
|
39
39
|
});
|
|
40
|
+
const checkCancelled = () => {
|
|
41
|
+
if (options?.signal?.aborted)
|
|
42
|
+
throw new AnalysisCancelledError(OPERATION, {
|
|
43
|
+
capturedOutput: diagnostics,
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
checkCancelled();
|
|
40
47
|
for (const [key, path, kind] of [
|
|
41
48
|
["REA_PWNDBG_GDB", gdb, "file"],
|
|
42
49
|
["REA_PWNDBG_GDBINIT", entry, "file"],
|
|
43
50
|
["REA_PWNDBG_VENV_PATH", venv, "directory"],
|
|
44
51
|
]) {
|
|
45
52
|
try {
|
|
53
|
+
checkCancelled();
|
|
46
54
|
if (!isAbsolute(path))
|
|
47
55
|
throw new Error("Expected an absolute caller-supplied path.");
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
const mode = key === "REA_PWNDBG_GDB" ? constants.X_OK : constants.R_OK;
|
|
57
|
+
if (probePath !== undefined) {
|
|
58
|
+
await probePath(path, kind, mode);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
await access(path, mode);
|
|
62
|
+
checkCancelled();
|
|
63
|
+
const information = await stat(path);
|
|
64
|
+
checkCancelled();
|
|
65
|
+
if (kind === "file" ? !information.isFile() : !information.isDirectory())
|
|
66
|
+
throw new Error(`Expected a ${kind}.`);
|
|
67
|
+
}
|
|
68
|
+
checkCancelled();
|
|
52
69
|
}
|
|
53
70
|
catch (cause) {
|
|
71
|
+
if (options?.signal?.aborted)
|
|
72
|
+
checkCancelled();
|
|
54
73
|
throw unavailable(`${key} is unavailable at ${path}: ${cause instanceof Error ? cause.message : String(cause)}. Configure the requested core-only context, or omit include_debugger_context for basic recorded evidence.`, cause);
|
|
55
74
|
}
|
|
56
75
|
}
|
|
76
|
+
checkCancelled();
|
|
57
77
|
const stage = join(rootPath, "debugger");
|
|
58
78
|
await mkdir(stage, { mode: 0o700 });
|
|
59
79
|
const requestPath = join(stage, "request.json");
|
|
@@ -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);
|
|
@@ -60,6 +60,8 @@ export function validateRecordedCrashStructure(report, snapshot, diagnostics) {
|
|
|
60
60
|
if (!header
|
|
61
61
|
.subarray(0, 6)
|
|
62
62
|
.equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46, 2, 1])) ||
|
|
63
|
+
header[6] !== 1 ||
|
|
64
|
+
header.readUInt32LE(20) !== 1 ||
|
|
63
65
|
![0, 3].includes(header[7] ?? -1) ||
|
|
64
66
|
header[8] !== 0 ||
|
|
65
67
|
header.readUInt16LE(16) !== 4 ||
|
|
@@ -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,18 +120,23 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
|
|
|
114
120
|
if (signal.aborted || closed)
|
|
115
121
|
throw abortReason(signal);
|
|
116
122
|
const output = join(operationRoot, "reader");
|
|
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
|
+
};
|
|
131
|
+
// Use Swift's reusable default cache for REA's internal helper compilation.
|
|
132
|
+
delete compilerEnvironment.CLANG_MODULE_CACHE_PATH;
|
|
117
133
|
try {
|
|
118
|
-
await execFileOutput(options.xcrun ?? "/usr/bin/xcrun", [
|
|
119
|
-
"swiftc",
|
|
120
|
-
"-module-cache-path",
|
|
121
|
-
join(operationRoot, "modules"),
|
|
122
|
-
...sourceFiles,
|
|
123
|
-
"-o",
|
|
124
|
-
output,
|
|
125
|
-
], {
|
|
134
|
+
await execFileOutput(options.xcrun ?? "/usr/bin/xcrun", ["swiftc", ...sourceFiles, "-o", output], {
|
|
126
135
|
timeout: 60_000,
|
|
127
136
|
maxBuffer: 1024 * 1024,
|
|
128
137
|
signal,
|
|
138
|
+
stopSignal: SWIFTC_INTERRUPT,
|
|
139
|
+
env: compilerEnvironment,
|
|
129
140
|
});
|
|
130
141
|
}
|
|
131
142
|
catch (cause) {
|
|
@@ -134,7 +145,9 @@ export const createDarwinProcessRunTokenReader = (options = {}) => {
|
|
|
134
145
|
const code = cause instanceof Error && "code" in cause
|
|
135
146
|
? String(cause.code)
|
|
136
147
|
: "unknown";
|
|
137
|
-
throw new DarwinProcessOwnershipInspectionError(
|
|
148
|
+
throw new DarwinProcessOwnershipInspectionError(code === "ENOENT"
|
|
149
|
+
? `macOS process ownership inspection requires the Apple Swift compiler via xcrun (compiler result: ${code})`
|
|
150
|
+
: `macOS process ownership helper compilation failed via xcrun (compiler result: ${code}): ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
138
151
|
}
|
|
139
152
|
if (signal.aborted || closed)
|
|
140
153
|
throw abortReason(signal);
|
|
@@ -1,17 +1,119 @@
|
|
|
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
|
+
};
|
|
36
|
+
/** Read captured output metadata from a failed execFileOutput invocation. */
|
|
37
|
+
export const execFileOutputFailure = (cause) => {
|
|
38
|
+
if (!(cause instanceof Error))
|
|
39
|
+
return undefined;
|
|
40
|
+
const stdout = Reflect.get(cause, "stdout");
|
|
41
|
+
const stderr = Reflect.get(cause, "stderr");
|
|
42
|
+
const code = Reflect.get(cause, "code");
|
|
43
|
+
const signal = Reflect.get(cause, "signal");
|
|
44
|
+
const killed = Reflect.get(cause, "killed");
|
|
45
|
+
if (typeof stdout !== "string" || typeof stderr !== "string")
|
|
46
|
+
return undefined;
|
|
47
|
+
return {
|
|
48
|
+
stdout,
|
|
49
|
+
stderr,
|
|
50
|
+
code: typeof code === "string" || typeof code === "number" ? code : null,
|
|
51
|
+
signal: typeof signal === "string" ? signal : null,
|
|
52
|
+
killed: killed === true,
|
|
53
|
+
outputTruncated: code === "ERR_CHILD_PROCESS_STDIO_MAXBUFFER",
|
|
54
|
+
};
|
|
55
|
+
};
|
|
2
56
|
/** Run a shell-free command while capturing its complete UTF-8 output. */
|
|
3
57
|
export const execFileOutput = (command, arguments_, options = {}) => new Promise((resolve, reject) => {
|
|
4
|
-
|
|
5
|
-
|
|
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 }),
|
|
6
82
|
encoding: "utf8",
|
|
7
83
|
maxBuffer: options.maxBuffer ?? Number.POSITIVE_INFINITY,
|
|
8
84
|
}, (error, stdout, stderr) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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);
|
|
13
97
|
return;
|
|
14
98
|
}
|
|
15
99
|
resolve({ stdout, stderr });
|
|
16
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);
|
|
17
119
|
});
|
|
@@ -83,9 +83,14 @@ const collectOwnedCommand = async (spawn, limits, launcher, deadline, callerSign
|
|
|
83
83
|
: "Command deadline elapsed.", snapshot);
|
|
84
84
|
if (exceeded)
|
|
85
85
|
throw new OwnedCommandFailure("output-limit", "Command diagnostic output exceeded its complete-output budget.", snapshot);
|
|
86
|
+
const acceptedNonzeroExit = limits.acceptNonZeroExit === true &&
|
|
87
|
+
snapshot.exitCode !== null &&
|
|
88
|
+
snapshot.exitCode !== undefined &&
|
|
89
|
+
snapshot.exitCode !== 0 &&
|
|
90
|
+
snapshot.signal === null;
|
|
86
91
|
if (processFailure !== undefined ||
|
|
87
|
-
snapshot.exitCode !== 0 ||
|
|
88
|
-
|
|
92
|
+
((snapshot.exitCode !== 0 || snapshot.signal !== null) &&
|
|
93
|
+
!acceptedNonzeroExit))
|
|
89
94
|
throw new OwnedCommandFailure("process", processFailure ??
|
|
90
95
|
"Command failed; inspect its exit status and diagnostics.", snapshot);
|
|
91
96
|
}
|
|
@@ -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
|
}
|