rea-agents 5.0.0 → 6.1.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 +168 -655
- package/bridge/android/ReaJadxBridge.java +14 -5
- package/bridge/ghidra/ReaGhidraBridge.java +173 -47
- package/bridge/hopper_bridge.py +310 -128
- package/bridge/mitmproxy/capture.py +208 -0
- package/bridge/native/rea_lldb_tracer.py +839 -0
- package/bridge/process/ProcessRunTokenReader.swift +297 -0
- package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
- package/bridge/pwndbg/core_context.py +101 -0
- package/bridge/pwndbg/launch.py +39 -0
- package/bridge/pwndbg/launch_impl.py +34 -0
- package/bridge/pwntools/decoder_runtime.py +59 -0
- package/bridge/pwntools/layout.py +39 -0
- package/bridge/pwntools/layout_impl.py +309 -0
- package/bridge/pwntools/recorded_crash.py +39 -0
- package/bridge/pwntools/recorded_crash_impl.py +147 -0
- package/dist/android/JadxConfiguration.js +196 -33
- package/dist/android/JadxMcpTransport.js +4 -0
- package/dist/android/JadxProtocol.js +6 -0
- package/dist/android/JadxProvider.js +20 -2
- 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/CallPathTracing.js +19 -3
- package/dist/application/CapabilityInventory.js +27 -3
- package/dist/application/ClientConfigurationDocument.js +871 -6
- package/dist/application/ClientRegistrationIdentity.js +26 -5
- package/dist/application/ClientRegistrationStatus.js +29 -14
- package/dist/application/DirectAnalysis.js +97 -33
- package/dist/application/Doctor.js +4 -2
- package/dist/application/DoctorScope.js +25 -13
- package/dist/application/EnhancedLiteralTracing.js +22 -25
- package/dist/application/EnhancedTools.js +13 -11
- package/dist/application/EvidenceBundleFiles.js +24 -12
- package/dist/application/FunctionAnalysisEvidence.js +2 -3
- package/dist/application/InventoryProjectionEvidence.js +4 -3
- package/dist/application/InvestigationProviders.js +3 -2
- package/dist/application/JsonFiles.js +50 -28
- package/dist/application/ProcedureAddressResolution.js +11 -0
- package/dist/application/ReconstructionCoverageService.js +7 -4
- package/dist/application/ReconstructionObligationCandidates.js +5 -1
- package/dist/application/ReconstructionObligationLedgerService.js +4 -3
- package/dist/application/Setup.js +13 -1
- package/dist/application/SetupClientConfiguration.js +10 -15
- package/dist/application/SetupHost.js +5 -2
- package/dist/application/SetupPlan.js +5 -3
- package/dist/application/SupportedClients.js +34 -1
- package/dist/application/Uninstall.js +4 -3
- package/dist/application/Update.js +18 -3
- package/dist/application/UpdateRuntime.js +46 -25
- package/dist/application/WebModuleTraceService.js +4 -2
- package/dist/application/WebNetworkCapturePort.js +1 -0
- package/dist/application/WebNetworkCaptureService.js +134 -0
- package/dist/application/WebRuntimeService.js +5 -3
- package/dist/application/WebScriptExportService.js +2 -2
- package/dist/application/WebSourceLocationService.js +4 -2
- package/dist/application/WindowsCapabilities.js +1 -1
- package/dist/application/WorkflowEvidence.js +82 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
- package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
- package/dist/application/binary/BinarySession.js +131 -76
- package/dist/application/binary/BinarySessionOpen.js +19 -6
- package/dist/application/binary/BinarySessionRecords.js +45 -3
- package/dist/application/binary/BinarySessionStatus.js +17 -1
- package/dist/application/binary/CompositeProvider.js +13 -0
- package/dist/application/binary/LazyAnalysisProvider.js +3 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
- package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
- package/dist/application/evm/EvmInterfacePort.js +1 -0
- package/dist/application/evm/EvmInterfaceService.js +64 -0
- package/dist/application/investigation/EvidenceLedger.js +21 -7
- package/dist/application/investigation/InvestigationRecords.js +8 -0
- package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
- package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
- package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
- package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
- package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
- package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
- package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
- package/dist/application/managed/ManagedReconstructionService.js +4 -3
- package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
- package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
- package/dist/application/workflowInputError.js +18 -0
- package/dist/artifacts/ArtifactProvider.js +42 -5
- package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
- package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
- package/dist/artifacts/ZipArtifactReader.js +3 -0
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
- package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
- package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
- package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
- 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/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
- package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
- package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
- package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
- package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
- package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
- package/dist/artifacts/readStableArtifact.js +20 -4
- package/dist/browser/CdpCaptureCompleteness.js +2 -0
- package/dist/browser/CdpCaptureEventHandlers.js +165 -12
- package/dist/browser/CdpCaptureEventTypes.js +5 -1
- package/dist/browser/CdpCaptureEvents.js +34 -0
- package/dist/browser/CdpConnection.js +30 -11
- package/dist/browser/CdpOptionalCommand.js +2 -3
- package/dist/browser/CdpPageCapture.js +23 -1
- package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
- package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
- package/dist/browser/WebSourceMapFetcher.js +426 -72
- package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
- package/dist/browser/history/CaptureFailures.js +137 -0
- package/dist/browser/history/CaptureFormatError.js +10 -0
- package/dist/browser/history/CaptureRedaction.js +65 -0
- package/dist/browser/history/CaptureRelease.js +17 -0
- package/dist/browser/history/HarCapture.js +165 -0
- package/dist/browser/history/HarCaptureAdapter.js +20 -0
- package/dist/browser/history/HarCaptureProcess.js +57 -0
- package/dist/browser/history/HarJson.js +92 -0
- package/dist/browser/history/HarSchema.js +72 -0
- package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
- package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
- package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
- package/dist/cli/analysisSelector.js +23 -0
- package/dist/cli/applicationCommands.js +2 -3
- package/dist/cli/artifactCommands.js +26 -1
- package/dist/cli/binaryDiagnosticsCommands.js +39 -0
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +78 -20
- package/dist/cli/electronCommands.js +21 -13
- package/dist/cli/evmCommands.js +24 -0
- package/dist/cli/firmwareCommands.js +6 -3
- package/dist/cli/javascriptApplicationAnalysis.js +20 -3
- package/dist/cli/jsonOutput.js +38 -0
- package/dist/cli/nativeCallCommands.js +34 -0
- package/dist/cli/processCommands.js +1 -1
- package/dist/cli/streamedJsonOutput.js +56 -0
- package/dist/cli/utilityCommands.js +2 -0
- package/dist/cli/webNetworkCaptureCommands.js +40 -0
- package/dist/cli/webRuntimeCommands.js +8 -8
- package/dist/cli.js +11 -4
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +6 -1
- package/dist/cliJsonInput.js +35 -1
- package/dist/cliOutput.js +21 -6
- package/dist/composition/binaryDiagnostics.js +8 -0
- package/dist/composition/evm.js +4 -0
- package/dist/composition/webNetworkCaptures.js +6 -0
- package/dist/config/environment.js +4 -0
- package/dist/config/ghidraStartupTimeout.js +17 -0
- package/dist/config/mcpResponseBudget.js +22 -0
- package/dist/config/parseConfig.js +2 -1
- package/dist/contracts/artifactToolContracts.js +6 -0
- package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
- package/dist/contracts/browserToolContracts.js +4 -3
- package/dist/contracts/enhancedInputs.js +5 -3
- package/dist/contracts/enhancedToolContracts.js +3 -3
- package/dist/contracts/errorSchemas.js +8 -1
- package/dist/contracts/evm/evmToolContracts.js +20 -0
- package/dist/contracts/hopperMemoryContracts.js +2 -5
- package/dist/contracts/investigationExamples.js +2 -2
- package/dist/contracts/javascript/electronToolContracts.js +1 -1
- package/dist/contracts/managed/managedToolContracts.js +8 -6
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
- package/dist/contracts/native/nativeToolContracts.js +21 -3
- package/dist/contracts/officialToolContracts.js +26 -24
- package/dist/contracts/process/processCaptureExample.js +2 -0
- package/dist/contracts/promptContracts.js +3 -3
- package/dist/contracts/sessionLifecycleInputs.js +18 -5
- package/dist/contracts/sessionStatusContract.js +8 -2
- package/dist/contracts/sessionToolContracts.js +8 -3
- package/dist/contracts/sessionToolSchemas.js +8 -4
- package/dist/contracts/toolContractExamples.js +1 -2
- package/dist/contracts/toolContractHelpers.js +4 -1
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +30 -1
- package/dist/contracts/toolOutputSchemaGroups.js +33 -28
- package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
- package/dist/contracts/toolSchemaMetadata.js +69 -10
- package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
- package/dist/domain/analysisErrorBase.js +22 -2
- package/dist/domain/analysisErrorCore.js +61 -5
- package/dist/domain/analysisErrorPresentation.js +95 -12
- package/dist/domain/analysisErrorProjection.js +148 -19
- package/dist/domain/analysisSnapshot.js +166 -2
- package/dist/domain/android/androidAnalysis.js +2 -4
- package/dist/domain/android/androidApplication.js +17 -9
- package/dist/domain/apple/appleApplication.js +41 -14
- package/dist/domain/apple/dyldEnvironment.js +73 -0
- package/dist/domain/apple/dyldPaths.js +81 -0
- package/dist/domain/apple/dylibResolution.js +478 -0
- package/dist/domain/apple/dylibResolutionFindings.js +77 -0
- package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
- package/dist/domain/apple/keyedArchive.js +9 -1
- package/dist/domain/apple/machoContainer.js +54 -0
- package/dist/domain/apple/plistNumbers.js +76 -0
- package/dist/domain/artifactIdentity.js +29 -0
- package/dist/domain/artifactInventoryEvidence.js +19 -24
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/bridgeCandidateProjection.js +71 -0
- package/dist/domain/browserCompleteness.js +1 -0
- package/dist/domain/browserObservation.js +1 -1
- package/dist/domain/browserObservationError.js +24 -5
- package/dist/domain/browserObservationSchemas.js +13 -0
- package/dist/domain/browserScenarioValues.js +5 -2
- package/dist/domain/bundleComparison.js +3 -2
- package/dist/domain/callPathSchemas.js +1 -1
- package/dist/domain/canonicalDigest.js +13 -1
- 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/comparisonStatus.js +2 -30
- package/dist/domain/configurationErrors.js +1 -1
- package/dist/domain/conformanceTrustGate.js +0 -16
- package/dist/domain/evidence.js +78 -11
- package/dist/domain/evidenceBundle.js +42 -1
- package/dist/domain/evidenceErrors.js +12 -1
- package/dist/domain/evm/evmInterface.js +63 -0
- package/dist/domain/explicitSensitiveFailure.js +108 -0
- package/dist/domain/explicitSensitiveValues.js +10 -0
- package/dist/domain/firmware/firmwareAnalysis.js +10 -4
- 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 +37 -6
- package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
- package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
- package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
- package/dist/domain/javascript/javascriptAstValues.js +20 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
- package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
- package/dist/domain/javascript/javascriptRecovery.js +3 -8
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
- package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
- package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
- 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 +14 -4
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
- package/dist/domain/jsonSerialization.js +109 -0
- package/dist/domain/jsonValue.js +91 -3
- package/dist/domain/localPath.js +8 -0
- package/dist/domain/managed/managedApplicationGraph.js +10 -10
- package/dist/domain/managed/managedInspectionEvidence.js +16 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
- package/dist/domain/managed/managedNativeVerification.js +3 -9
- package/dist/domain/native/binaryLayout.js +357 -0
- package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
- package/dist/domain/native/nativeCallObservation.js +186 -0
- package/dist/domain/native/nativeCallPartialObservation.js +33 -0
- package/dist/domain/native/objcSwiftMetadata.js +0 -39
- package/dist/domain/native/recordedCrash.js +266 -0
- package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
- package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
- package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
- package/dist/domain/process/processCaptureParsing.js +54 -0
- package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
- package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
- package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
- package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
- package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
- package/dist/domain/propertyListKeys.js +1 -1
- package/dist/domain/propertyListXmlText.js +19 -0
- package/dist/domain/providerAdapterError.js +1 -1
- package/dist/domain/providerOperationHealth.js +54 -0
- package/dist/domain/providerSelectionError.js +4 -2
- package/dist/domain/reconstructionVerification.js +9 -46
- package/dist/domain/reconstructionVerificationSchemas.js +3 -3
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +9 -46
- 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 +1 -0
- package/dist/domain/webNetworkCapture.js +118 -0
- package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
- package/dist/domain/webRuntime.js +19 -5
- package/dist/domain/webSourceLocation.js +1 -0
- package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
- package/dist/dotnet/ManagedMemberInspector.js +4 -2
- package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
- package/dist/dotnet/ManagedMemberRows.js +14 -3
- package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
- package/dist/dotnet/ManagedMetadataInventory.js +38 -28
- package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
- package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
- package/dist/dotnet/ManagedPeReader.js +11 -0
- package/dist/evm/EvmBytecodeCarrier.js +21 -0
- package/dist/evm/EvmWorkerLimits.js +40 -0
- package/dist/evm/EvmoleFailures.js +126 -0
- package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
- package/dist/evm/EvmoleInterfaceProvider.js +273 -0
- package/dist/evm/EvmoleInterfaceWorker.js +87 -0
- package/dist/evm/EvmoleRelease.js +16 -0
- package/dist/firmware/FirmwareCommand.js +1 -0
- package/dist/firmware/FirmwareFiles.js +1 -1
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
- package/dist/ghidra/GhidraClient.js +47 -14
- package/dist/ghidra/GhidraDiagnostics.js +7 -7
- package/dist/ghidra/GhidraFunctionValues.js +10 -7
- package/dist/ghidra/GhidraInstallation.js +18 -21
- package/dist/ghidra/GhidraInventoryValues.js +14 -4
- package/dist/ghidra/GhidraJavaLaunch.js +62 -0
- package/dist/ghidra/GhidraLauncher.js +34 -16
- package/dist/ghidra/GhidraProvider.js +2 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
- package/dist/ghidra/GhidraProviderClient.js +23 -12
- package/dist/ghidra/GhidraSessionError.js +11 -7
- package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
- package/dist/ghidra/GhidraTransport.js +20 -0
- package/dist/hopper/BridgeLauncher.js +33 -11
- package/dist/hopper/HopperAnalysisProfile.js +62 -4
- package/dist/hopper/HopperCleanup.js +15 -3
- package/dist/hopper/HopperClient.js +222 -14
- package/dist/hopper/HopperFileOffset.js +237 -0
- package/dist/hopper/HopperMachOImage.js +196 -0
- package/dist/hopper/HopperOperationStage.js +6 -0
- package/dist/hopper/HopperProvider.js +63 -9
- package/dist/hopper/HopperProviderCapabilities.js +19 -1
- package/dist/hopper/HopperRegexSearch.js +137 -0
- package/dist/hopper/HopperRegexWorker.js +27 -0
- package/dist/hopper/HopperRequestQueue.js +68 -19
- package/dist/hopper/HopperTargetLease.js +3 -2
- package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
- package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
- package/dist/inspector/V8InspectorProvider.js +47 -11
- package/dist/javascript/recovery/WakaruCommand.js +3 -0
- package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
- package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
- package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
- 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 +32 -16
- 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 +82 -84
- package/dist/native/LldbCallTracer.js +541 -0
- package/dist/native/LldbRetainedObservations.js +178 -0
- package/dist/native/NativeCallObservation.js +194 -0
- package/dist/native/NativeMacOSProvider.js +117 -20
- package/dist/native/NativeMacOSProviderMetadata.js +8 -3
- package/dist/native/SignatureTargetBinding.js +155 -0
- package/dist/native/parsers/lipo.js +71 -1
- package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
- package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
- package/dist/native/pwntools/PwntoolsFailures.js +180 -0
- package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
- package/dist/native/pwntools/PwntoolsRelease.js +19 -0
- package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
- package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
- package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
- package/dist/process/DarwinProcessRunTokenReader.js +293 -0
- package/dist/process/ExecFileOutput.js +20 -0
- package/dist/process/OwnedCommand.js +118 -0
- package/dist/process/ProcessOwnership.js +431 -51
- package/dist/process/ProcessOwnershipObservation.js +209 -27
- package/dist/process/ProviderProcess.js +68 -10
- package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
- package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
- package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
- package/dist/{application → process/capture}/ProcessHarness.js +195 -29
- package/dist/{application → process/capture}/ProcessSampling.js +2 -2
- package/dist/server/EvidenceMcpServer.js +146 -0
- package/dist/server/createServer.js +37 -8
- package/dist/server/promptCompletion.js +10 -3
- package/dist/server/registerAndroidTools.js +2 -4
- package/dist/server/registerApplicationTools/helpers.js +2 -4
- package/dist/server/registerArtifactComparisonTool.js +11 -7
- package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
- package/dist/server/registerBrowserScenarioTool.js +2 -4
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerBundleComparisonTool.js +2 -3
- package/dist/server/registerCloseLifecycleTool.js +8 -18
- package/dist/server/registerElectronTools.js +2 -4
- package/dist/server/registerEnhancedTools.js +18 -59
- package/dist/server/registerEvidenceTools.js +3 -5
- package/dist/server/registerEvmTools.js +15 -0
- package/dist/server/registerFirmwareTools.js +2 -4
- package/dist/server/registerFunctionComparisonTool.js +10 -6
- package/dist/server/registerInvestigationTools.js +7 -7
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
- package/dist/server/registerOfficialTools.js +2 -4
- package/dist/server/registerProcessComparisonTool.js +72 -46
- package/dist/server/registerRecordedCrashTools.js +15 -0
- package/dist/server/registerSessionRecordTools.js +5 -6
- package/dist/server/registerSessionStatusTool.js +17 -3
- package/dist/server/registerSessionTools.js +13 -5
- package/dist/server/registerWebModuleTool.js +2 -4
- package/dist/server/registerWebNetworkCaptureTool.js +26 -0
- package/dist/server/registerWebRuntimeTools.js +3 -7
- package/dist/server/registerWebScriptTool.js +2 -4
- package/dist/server/registerWebSourceLocationTool.js +2 -4
- package/dist/server/runDerivedOperation.js +15 -3
- package/dist/server/sessionAvailabilityPolicy.js +3 -1
- package/dist/server/sessionToolPolicies.js +1 -1
- package/dist/server/toolRegistrationOptions.js +2 -2
- package/dist/server/toolResult.js +63 -11
- package/dist/server/toolResultEncoding.js +33 -0
- package/install.sh +1 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -9
- package/scripts/electron-active-hook-boundaries.cjs +18 -20
- package/scripts/electron-active-hook.cjs +241 -37
- package/scripts/rea.mjs +11 -3
- package/skills/reverse-engineer-anything/SKILL.md +32 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
- package/third_party/README.md +60 -0
- package/third_party/evmole/LICENSE +21 -0
- package/third_party/evmole/README.md +22 -0
- package/third_party/pwndbg/LICENSE.md +21 -0
- package/third_party/pwndbg/README.md +23 -0
- package/third_party/pwntools/README.md +40 -0
- package/dist/application/AuthorizedArtifactInventory.js +0 -7
- package/dist/application/ProcessCaptureLifecycle.js +0 -299
- package/dist/application/StoreFileLock.js +0 -124
- package/dist/contracts/processCaptureExample.js +0 -2
- package/dist/domain/bytecodeProvider.js +0 -178
- package/dist/domain/customProtocolCapture.js +0 -137
- package/dist/domain/eventProcessTree.js +0 -225
- package/dist/domain/mobileApplicationInvestigation.js +0 -159
- package/dist/domain/packageAnalysis.js +0 -123
- package/dist/domain/peInspection.js +0 -197
- package/dist/domain/processCaptureParsing.js +0 -21
- package/dist/domain/protocolCapture.js +0 -217
- package/dist/domain/runtimeIdentification.js +0 -212
- package/dist/generatedMcpToolCatalog.js +0 -37
- package/dist/ghidra/GhidraDefaults.js +0 -2
- /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
- /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
- /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
- /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
- /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
- /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
- /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
- /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
- /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
- /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
- /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
- /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
- /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { open } from "node:fs/promises";
|
|
2
|
+
import { nativeCallEventSchema } from "../domain/native/nativeCallObservation.js";
|
|
3
|
+
/** Maximum journal size enforced by the LLDB bridge. */
|
|
4
|
+
export const LLDB_OBSERVATION_JOURNAL_MAX_BYTES = 8 * 1024 * 1024;
|
|
5
|
+
const MAX_CAPTURE_BYTES = 1024 * 1024;
|
|
6
|
+
/** Join safely retained journal and process evidence into its failure contract. */
|
|
7
|
+
export const projectLldbPartialObservation = (input) => ({
|
|
8
|
+
kind: "native-call-observation",
|
|
9
|
+
target: input.target,
|
|
10
|
+
process: {
|
|
11
|
+
pid: input.pid ?? null,
|
|
12
|
+
stdout: input.stdout,
|
|
13
|
+
stderr: input.stderr,
|
|
14
|
+
other_stops: input.journal.otherStops,
|
|
15
|
+
},
|
|
16
|
+
debugger: { version: input.version },
|
|
17
|
+
events: input.journal.events,
|
|
18
|
+
coverage: { status: "partial", reason: input.reason },
|
|
19
|
+
limitations: [
|
|
20
|
+
"The LLDB run did not produce a complete native call observation result.",
|
|
21
|
+
"The target SHA-256 identifies the selected artifact; LLDB did not verify the bytes loaded into the process.",
|
|
22
|
+
"Captured output byte counts are observed lower bounds because LLDB did not report final stream counters.",
|
|
23
|
+
...input.journal.limitations,
|
|
24
|
+
...(input.journalLimitations ?? []),
|
|
25
|
+
...(input.limitations ?? []),
|
|
26
|
+
...(input.pid === undefined ? ["The target PID was unavailable."] : []),
|
|
27
|
+
...(input.stdout === null
|
|
28
|
+
? ["The target stdout capture was unavailable."]
|
|
29
|
+
: []),
|
|
30
|
+
...(input.stderr === null
|
|
31
|
+
? ["The target stderr capture was unavailable."]
|
|
32
|
+
: []),
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
/** Parse completed JSONL records while retaining valid records around bad ones. */
|
|
36
|
+
export const parseLldbObservationJournal = (bytes) => {
|
|
37
|
+
const completeText = Buffer.from(bytes).toString("utf8");
|
|
38
|
+
const newline = completeText.lastIndexOf("\n");
|
|
39
|
+
const hasTornTail = newline !== completeText.length - 1;
|
|
40
|
+
const events = [];
|
|
41
|
+
const otherStops = [];
|
|
42
|
+
const limitations = [];
|
|
43
|
+
let malformedCount = 0;
|
|
44
|
+
let firstMalformedRow;
|
|
45
|
+
let start = 0;
|
|
46
|
+
let rowNumber = 0;
|
|
47
|
+
while (start <= newline && newline >= 0) {
|
|
48
|
+
const end = completeText.indexOf("\n", start);
|
|
49
|
+
if (end < 0 || end > newline)
|
|
50
|
+
break;
|
|
51
|
+
const line = completeText.slice(start, end);
|
|
52
|
+
start = end + 1;
|
|
53
|
+
if (line.length === 0)
|
|
54
|
+
continue;
|
|
55
|
+
rowNumber += 1;
|
|
56
|
+
const markMalformed = () => {
|
|
57
|
+
malformedCount += 1;
|
|
58
|
+
firstMalformedRow ??= rowNumber;
|
|
59
|
+
};
|
|
60
|
+
let row;
|
|
61
|
+
try {
|
|
62
|
+
row = JSON.parse(line);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
markMalformed();
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (typeof row !== "object" ||
|
|
69
|
+
row === null ||
|
|
70
|
+
!("kind" in row) ||
|
|
71
|
+
typeof row.kind !== "string") {
|
|
72
|
+
markMalformed();
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (row.kind === "event" && "event" in row) {
|
|
76
|
+
const event = nativeCallEventSchema.safeParse(row.event);
|
|
77
|
+
if (event.success)
|
|
78
|
+
events.push(event.data);
|
|
79
|
+
else
|
|
80
|
+
markMalformed();
|
|
81
|
+
}
|
|
82
|
+
else if (row.kind === "other-stop" &&
|
|
83
|
+
"reason" in row &&
|
|
84
|
+
typeof row.reason === "string") {
|
|
85
|
+
otherStops.push(row.reason);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
markMalformed();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (malformedCount > 0)
|
|
92
|
+
limitations.push(`${malformedCount} observation journal row(s) were malformed or invalid and ignored (first at row ${String(firstMalformedRow)}).`);
|
|
93
|
+
if (hasTornTail)
|
|
94
|
+
limitations.push("The final observation journal record was incomplete and was ignored.");
|
|
95
|
+
return { events, otherStops, limitations };
|
|
96
|
+
};
|
|
97
|
+
/** Keep reading a bounded prefix across short reads until EOF or the bound. */
|
|
98
|
+
export const readBoundedPrefix = async (requestedBytes, readChunk) => {
|
|
99
|
+
const buffer = Buffer.alloc(requestedBytes);
|
|
100
|
+
let bytesRead = 0;
|
|
101
|
+
while (bytesRead < requestedBytes) {
|
|
102
|
+
const count = await readChunk(buffer, bytesRead, requestedBytes - bytesRead, bytesRead);
|
|
103
|
+
if (count === 0)
|
|
104
|
+
break;
|
|
105
|
+
if (count > requestedBytes - bytesRead)
|
|
106
|
+
throw new Error("The bounded read returned more bytes than requested");
|
|
107
|
+
bytesRead += count;
|
|
108
|
+
}
|
|
109
|
+
return { buffer, bytesRead };
|
|
110
|
+
};
|
|
111
|
+
const readPrefix = (handle, requestedBytes) => readBoundedPrefix(requestedBytes, async (buffer, offset, length, position) => (await handle.read(buffer, offset, length, position)).bytesRead);
|
|
112
|
+
/** Read at most the bridge's journal bound, checking size before allocation. */
|
|
113
|
+
export const readLldbObservationJournal = async (path) => {
|
|
114
|
+
let handle;
|
|
115
|
+
try {
|
|
116
|
+
handle = await open(path, "r");
|
|
117
|
+
const { size } = await handle.stat();
|
|
118
|
+
const length = Math.min(size, LLDB_OBSERVATION_JOURNAL_MAX_BYTES);
|
|
119
|
+
const { buffer, bytesRead } = await readPrefix(handle, length);
|
|
120
|
+
const parsed = parseLldbObservationJournal(buffer.subarray(0, bytesRead));
|
|
121
|
+
const limitations = [
|
|
122
|
+
...(size > LLDB_OBSERVATION_JOURNAL_MAX_BYTES
|
|
123
|
+
? [
|
|
124
|
+
"The observation journal exceeded 8 MiB; only its bounded prefix was read.",
|
|
125
|
+
]
|
|
126
|
+
: []),
|
|
127
|
+
...(bytesRead < length
|
|
128
|
+
? [
|
|
129
|
+
"The observation journal became shorter while being read; the available prefix was parsed.",
|
|
130
|
+
]
|
|
131
|
+
: []),
|
|
132
|
+
];
|
|
133
|
+
return {
|
|
134
|
+
parsed,
|
|
135
|
+
limitations,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (cause) {
|
|
139
|
+
return {
|
|
140
|
+
parsed: { events: [], otherStops: [], limitations: [] },
|
|
141
|
+
limitations: [
|
|
142
|
+
`The observation journal could not be read: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
143
|
+
],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
await handle?.close().catch(() => undefined);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
/** Retain an available output prefix without claiming an unreported total. */
|
|
151
|
+
export const readPartialCapture = async (path) => {
|
|
152
|
+
let handle;
|
|
153
|
+
try {
|
|
154
|
+
handle = await open(path, "r");
|
|
155
|
+
const { size } = await handle.stat();
|
|
156
|
+
const length = Math.min(size, MAX_CAPTURE_BYTES);
|
|
157
|
+
const { buffer, bytesRead } = await readPrefix(handle, length);
|
|
158
|
+
return {
|
|
159
|
+
capture: {
|
|
160
|
+
text: buffer.subarray(0, bytesRead).toString("utf8"),
|
|
161
|
+
bytes: Math.max(size, bytesRead),
|
|
162
|
+
truncated: true,
|
|
163
|
+
complete: false,
|
|
164
|
+
},
|
|
165
|
+
limitations: bytesRead < length
|
|
166
|
+
? [
|
|
167
|
+
"A target output capture became shorter while being read; its retained prefix may be incomplete.",
|
|
168
|
+
]
|
|
169
|
+
: [],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
await handle?.close().catch(() => undefined);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { open } from "node:fs/promises";
|
|
3
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
|
|
4
|
+
import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
|
|
5
|
+
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
6
|
+
import { nativeCallObservationInputSchema, nativeCallObservationResultSchema, } from "../domain/native/nativeCallObservation.js";
|
|
7
|
+
import { err, ok } from "../domain/result.js";
|
|
8
|
+
const OPERATION = "observe_native_calls";
|
|
9
|
+
/** What every call observation leaves unobserved or approximated. */
|
|
10
|
+
export const NATIVE_CALL_OBSERVATION_LIMITATIONS = [
|
|
11
|
+
"Only entries are observed; return values, floating-point and stack-passed arguments are not captured.",
|
|
12
|
+
"Registers are the raw integer argument registers at entry. For Objective-C methods the first two hold the receiver and the selector.",
|
|
13
|
+
"Receiver classes come from LLDB's Objective-C runtime reader without running target code; they are null for class methods and for receivers LLDB cannot classify.",
|
|
14
|
+
"Calls that never reach a symbol's entry, such as inlined code or objc_direct methods called directly, are not observed.",
|
|
15
|
+
"The target is launched directly under LLDB, not through LaunchServices; LLDB disables ASLR for it, so load addresses can equal file addresses.",
|
|
16
|
+
"The observation window is checked about once a second, and recording pauses the process at every entry, which slows it.",
|
|
17
|
+
];
|
|
18
|
+
/** Launch the active Mach-O under LLDB, record requested call entries, then stop it. */
|
|
19
|
+
export const observeNativeCalls = async (target, parameters, tracer, signal, readTargetDigest = fileSha256) => {
|
|
20
|
+
if (target.kind !== "executable" || target.format !== "mach-o")
|
|
21
|
+
return err(new AnalysisCapabilityUnavailableError("native-macos", OPERATION, "Native call observation launches a Mach-O executable; the active target is not one"));
|
|
22
|
+
const parsed = nativeCallObservationInputSchema.safeParse(parameters);
|
|
23
|
+
if (!parsed.success)
|
|
24
|
+
return err(new AnalysisInputError(OPERATION, { cause: parsed.error }));
|
|
25
|
+
// Observe the bytes the session's other Evidence describes.
|
|
26
|
+
let digest;
|
|
27
|
+
try {
|
|
28
|
+
digest = await readTargetDigest(target.path, signal);
|
|
29
|
+
}
|
|
30
|
+
catch (cause) {
|
|
31
|
+
if (signal?.aborted === true || isAbortError(cause))
|
|
32
|
+
return err(new AnalysisCancelledError(OPERATION));
|
|
33
|
+
return err(new ProviderAdapterError("native-macos", OPERATION, {
|
|
34
|
+
diagnostics: {
|
|
35
|
+
reason: "Unable to verify the selected target digest",
|
|
36
|
+
detail: cause instanceof Error ? cause.message : String(cause),
|
|
37
|
+
},
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
if (digest !== target.sha256)
|
|
41
|
+
return err(new EvidenceIntegrityError("Native call observation target digest changed after session binding"));
|
|
42
|
+
if (signal?.aborted === true)
|
|
43
|
+
return err(new AnalysisCancelledError(OPERATION));
|
|
44
|
+
const traced = await tracer.trace({
|
|
45
|
+
executable: target.path,
|
|
46
|
+
architecture: target.architecture,
|
|
47
|
+
expectedSha256: target.sha256,
|
|
48
|
+
input: parsed.data,
|
|
49
|
+
}, signal);
|
|
50
|
+
if (!traced.ok)
|
|
51
|
+
return traced;
|
|
52
|
+
return ok(projectNativeCalls(target, parsed.data, traced.value));
|
|
53
|
+
};
|
|
54
|
+
const isAbortError = (cause) => cause instanceof Error && cause.name === "AbortError";
|
|
55
|
+
/** Join the request, the tracer's run and REA's own checks into the result contract. */
|
|
56
|
+
export const projectNativeCalls = (target, input, trace) => {
|
|
57
|
+
const { run } = trace;
|
|
58
|
+
const unresolved = run.breakpoints
|
|
59
|
+
.filter(({ location_count: count }) => count === 0)
|
|
60
|
+
.map(({ index }) => index);
|
|
61
|
+
const eventLimit = run.outcome === "event-limit";
|
|
62
|
+
const resourceLimit = run.outcome === "resource-limit";
|
|
63
|
+
const breakpointLocationLimit = run.breakpoint_locations_truncated === true;
|
|
64
|
+
const partial = eventLimit ||
|
|
65
|
+
resourceLimit ||
|
|
66
|
+
breakpointLocationLimit ||
|
|
67
|
+
run.outcome === "duration-elapsed" ||
|
|
68
|
+
run.outcome === "stop-limit" ||
|
|
69
|
+
unresolved.length > 0;
|
|
70
|
+
return nativeCallObservationResultSchema.parse({
|
|
71
|
+
target: {
|
|
72
|
+
path: target.path,
|
|
73
|
+
sha256: target.sha256,
|
|
74
|
+
architecture: target.architecture,
|
|
75
|
+
arguments: input.arguments,
|
|
76
|
+
environment: input.environment,
|
|
77
|
+
working_directory: input.working_directory ?? null,
|
|
78
|
+
launch_identity: {
|
|
79
|
+
loaded_image_sha256: run.target_identity.loaded_image_sha256,
|
|
80
|
+
file_device: run.target_identity.file_device,
|
|
81
|
+
file_inode: run.target_identity.file_inode,
|
|
82
|
+
selected_file_sha256: run.target_identity.selected_file_sha256,
|
|
83
|
+
module_path: run.target_identity.module_path,
|
|
84
|
+
module_uuid: run.target_identity.module_uuid,
|
|
85
|
+
stable: run.target_identity.stable,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
debugger: trace.debugger,
|
|
89
|
+
process: {
|
|
90
|
+
pid: run.pid,
|
|
91
|
+
outcome: run.outcome,
|
|
92
|
+
exit_status: run.exit_status,
|
|
93
|
+
exit_description: run.exit_description,
|
|
94
|
+
terminated: run.terminated && trace.terminated,
|
|
95
|
+
elapsed_ms: run.elapsed_ms,
|
|
96
|
+
stdout: trace.stdout,
|
|
97
|
+
stderr: trace.stderr,
|
|
98
|
+
other_stops: run.other_stops,
|
|
99
|
+
},
|
|
100
|
+
breakpoints: input.breakpoints.map((request, index) => ({
|
|
101
|
+
index,
|
|
102
|
+
request: request.kind === "function"
|
|
103
|
+
? { ...request, module: request.module ?? null }
|
|
104
|
+
: { ...request, class_name: request.class_name ?? null },
|
|
105
|
+
location_count: run.breakpoints[index]?.location_count ?? 0,
|
|
106
|
+
locations: run.breakpoints[index]?.locations ?? [],
|
|
107
|
+
})),
|
|
108
|
+
events: run.events,
|
|
109
|
+
coverage: {
|
|
110
|
+
status: partial ? "partial" : "complete",
|
|
111
|
+
event_limit_reached: eventLimit,
|
|
112
|
+
resource_limit_reached: resourceLimit,
|
|
113
|
+
...(breakpointLocationLimit
|
|
114
|
+
? { breakpoint_locations_truncated: true }
|
|
115
|
+
: {}),
|
|
116
|
+
unresolved_breakpoints: unresolved,
|
|
117
|
+
},
|
|
118
|
+
limitations: [
|
|
119
|
+
...NATIVE_CALL_OBSERVATION_LIMITATIONS,
|
|
120
|
+
"The selected pathname digest and LLDB module identity are checked around launch. No immutable executable snapshot is used; concurrent in-place mutation or replacement and restoration cannot be ruled out, so the loaded-image digest remains unknown.",
|
|
121
|
+
...(eventLimit
|
|
122
|
+
? [
|
|
123
|
+
`Observation stopped at max_events (${input.max_events}); later calls were not recorded and the process was killed.`,
|
|
124
|
+
]
|
|
125
|
+
: []),
|
|
126
|
+
...(resourceLimit
|
|
127
|
+
? [
|
|
128
|
+
"Observation stopped before retaining the next complete event because the estimated 8 MiB trace-payload or 65,536-frame aggregate budget was reached; the process was killed.",
|
|
129
|
+
]
|
|
130
|
+
: []),
|
|
131
|
+
...(run.outcome === "duration-elapsed"
|
|
132
|
+
? [
|
|
133
|
+
`The process was still running after duration_ms (${input.duration_ms}) and was killed.`,
|
|
134
|
+
]
|
|
135
|
+
: []),
|
|
136
|
+
...(run.target_identity.stable
|
|
137
|
+
? []
|
|
138
|
+
: [
|
|
139
|
+
"LLDB did not provide enough module identity evidence to confirm pathname and module continuity around launch.",
|
|
140
|
+
]),
|
|
141
|
+
...(run.outcome === "stop-limit"
|
|
142
|
+
? [
|
|
143
|
+
"Observation stopped after repeated signal or exception stops; the process was killed.",
|
|
144
|
+
]
|
|
145
|
+
: []),
|
|
146
|
+
...(unresolved.length === 0
|
|
147
|
+
? []
|
|
148
|
+
: [
|
|
149
|
+
`Breakpoints ${unresolved.join(", ")} matched no code in any image loaded while observing; their calls could not be observed.`,
|
|
150
|
+
]),
|
|
151
|
+
...(run.breakpoints.some(({ location_count: count, locations }) => locations.length < count)
|
|
152
|
+
? [
|
|
153
|
+
"Breakpoints with many matching locations list only the first 64; location_count gives the total.",
|
|
154
|
+
]
|
|
155
|
+
: []),
|
|
156
|
+
...(breakpointLocationLimit
|
|
157
|
+
? [
|
|
158
|
+
"Resolved breakpoint locations exceeded the aggregate 8 MiB metadata budget; omitted locations are counted in location_count. This metadata limit does not change the process outcome.",
|
|
159
|
+
]
|
|
160
|
+
: []),
|
|
161
|
+
...(trace.stdout.truncated || trace.stderr.truncated
|
|
162
|
+
? ["Target output beyond 1 MiB per stream is counted but not kept."]
|
|
163
|
+
: []),
|
|
164
|
+
...(!trace.stdout.complete || !trace.stderr.complete
|
|
165
|
+
? [
|
|
166
|
+
"Target output draining did not complete; reported byte counts are observed lower bounds, not stream totals.",
|
|
167
|
+
]
|
|
168
|
+
: []),
|
|
169
|
+
...(run.terminated && trace.terminated
|
|
170
|
+
? []
|
|
171
|
+
: [
|
|
172
|
+
`REA could not confirm that process ${run.pid} exited; check for it before relying on host state.`,
|
|
173
|
+
]),
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
const fileSha256 = async (path, signal) => {
|
|
178
|
+
const handle = await open(path, "r");
|
|
179
|
+
try {
|
|
180
|
+
const hash = createHash("sha256");
|
|
181
|
+
const buffer = new Uint8Array(1024 * 1024);
|
|
182
|
+
for (;;) {
|
|
183
|
+
signal?.throwIfAborted();
|
|
184
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, null);
|
|
185
|
+
if (bytesRead === 0)
|
|
186
|
+
break;
|
|
187
|
+
hash.update(buffer.subarray(0, bytesRead));
|
|
188
|
+
}
|
|
189
|
+
return hash.digest("hex");
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
await handle.close();
|
|
193
|
+
}
|
|
194
|
+
};
|
|
@@ -2,12 +2,14 @@ import { NATIVE_MACOS_PROVIDER_IDENTITY as IDENTITY, nativeMacOSCapabilities, }
|
|
|
2
2
|
export { NATIVE_MACOS_PROVIDER_IDENTITY } from "./NativeMacOSProviderMetadata.js";
|
|
3
3
|
import { inspectAppleDispatchMetadata } from "./AppleDispatchMetadata.js";
|
|
4
4
|
import { observeNativeUi } from "./NativeUiObservation.js";
|
|
5
|
+
import { LldbCallTracer } from "./LldbCallTracer.js";
|
|
6
|
+
import { observeNativeCalls } from "./NativeCallObservation.js";
|
|
5
7
|
import { dirname, isAbsolute, resolve } from "node:path";
|
|
6
8
|
import { open, realpath, stat } from "node:fs/promises";
|
|
7
9
|
import { z } from "zod";
|
|
8
10
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
9
11
|
import { NATIVE_TOOL_CONTRACTS, } from "../contracts/native/nativeToolContracts.js";
|
|
10
|
-
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
12
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, AnalysisResourceConstraintError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
|
|
11
13
|
import { BinaryTargetError } from "../domain/configurationErrors.js";
|
|
12
14
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
13
15
|
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
@@ -15,7 +17,8 @@ import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
|
15
17
|
import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../domain/propertyListKeys.js";
|
|
16
18
|
import { demangleSwiftSchema, inspectPlistSchema, inspectSignatureSchema, listArchitecturesSchema, } from "../domain/native/nativeInspection.js";
|
|
17
19
|
import { err, ok } from "../domain/result.js";
|
|
18
|
-
import { NativeCommandFailure, XcrunCommandRunner, } from "./CommandRunner.js";
|
|
20
|
+
import { NATIVE_COMMAND_TIMEOUT_MS, NATIVE_COMMAND_OUTPUT_BUDGET_BYTES, NativeCommandFailure, XcrunCommandRunner, } from "./CommandRunner.js";
|
|
21
|
+
import { withSignatureTarget, verifySignatureTarget, } from "./SignatureTargetBinding.js";
|
|
19
22
|
import { parseCodeSignature } from "./parsers/codesign.js";
|
|
20
23
|
import { parseDemangledSymbols } from "./parsers/demangle.js";
|
|
21
24
|
import { parseLipoArchitectures } from "./parsers/lipo.js";
|
|
@@ -24,9 +27,11 @@ import { architectureLocations, inspectNativeMacho, } from "./NativeMachoInspect
|
|
|
24
27
|
/** Read-only semantic provider composed from Xcode command-line utilities. */
|
|
25
28
|
export class NativeMacOSProvider {
|
|
26
29
|
runner;
|
|
30
|
+
tracer;
|
|
27
31
|
#capabilities;
|
|
28
|
-
constructor(runner = new XcrunCommandRunner(), platform = process.platform) {
|
|
32
|
+
constructor(runner = new XcrunCommandRunner(), platform = process.platform, tracer = new LldbCallTracer()) {
|
|
29
33
|
this.runner = runner;
|
|
34
|
+
this.tracer = tracer;
|
|
30
35
|
this.#capabilities = nativeMacOSCapabilities(platform);
|
|
31
36
|
}
|
|
32
37
|
identity() {
|
|
@@ -36,15 +41,17 @@ export class NativeMacOSProvider {
|
|
|
36
41
|
return this.#capabilities;
|
|
37
42
|
}
|
|
38
43
|
createClient(target) {
|
|
39
|
-
return new NativeMacOSClient(target, this.runner);
|
|
44
|
+
return new NativeMacOSClient(target, this.runner, this.tracer);
|
|
40
45
|
}
|
|
41
46
|
}
|
|
42
47
|
class NativeMacOSClient {
|
|
43
48
|
target;
|
|
44
49
|
runner;
|
|
45
|
-
|
|
50
|
+
tracer;
|
|
51
|
+
constructor(target, runner, tracer) {
|
|
46
52
|
this.target = target;
|
|
47
53
|
this.runner = runner;
|
|
54
|
+
this.tracer = tracer;
|
|
48
55
|
}
|
|
49
56
|
async execute(operation, parameters, options) {
|
|
50
57
|
if (options?.signal?.aborted === true)
|
|
@@ -83,6 +90,15 @@ class NativeMacOSClient {
|
|
|
83
90
|
}
|
|
84
91
|
if (!isNativeOperation(operation))
|
|
85
92
|
return err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "Operation is not implemented by native macOS tools."));
|
|
93
|
+
if (operation === "observe_native_calls") {
|
|
94
|
+
const result = await observeNativeCalls(this.target, parameters, this.tracer, options?.signal);
|
|
95
|
+
return result.ok
|
|
96
|
+
? ok(createAnalysisExecution(result.value, IDENTITY, {
|
|
97
|
+
limitations: result.value.limitations,
|
|
98
|
+
locations: [{ kind: "artifact-path", path: this.target.path }],
|
|
99
|
+
}))
|
|
100
|
+
: result;
|
|
101
|
+
}
|
|
86
102
|
if (operation === "observe_native_ui" ||
|
|
87
103
|
operation === "capture_native_ui_scenario") {
|
|
88
104
|
const result = await observeNativeUi(this.target, operation, parameters, {
|
|
@@ -117,6 +133,7 @@ class NativeMacOSClient {
|
|
|
117
133
|
switch (operation) {
|
|
118
134
|
case "observe_native_ui":
|
|
119
135
|
case "capture_native_ui_scenario":
|
|
136
|
+
case "observe_native_calls":
|
|
120
137
|
return Promise.resolve(err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "UI observation uses its explicit authority boundary")));
|
|
121
138
|
case "inspect_macho":
|
|
122
139
|
return this.#inspectMacho(signal);
|
|
@@ -176,20 +193,23 @@ class NativeMacOSClient {
|
|
|
176
193
|
});
|
|
177
194
|
}
|
|
178
195
|
async #inspectSignature(signal) {
|
|
179
|
-
|
|
196
|
+
return withSignatureTarget(this.target, (binding) => this.#inspectBoundSignature(binding, signal), signal);
|
|
197
|
+
}
|
|
198
|
+
async #inspectBoundSignature(binding, signal) {
|
|
199
|
+
const display = await this.#captureSignature(binding, ["-d", "--verbose=4"], signal);
|
|
180
200
|
if (!display.ok)
|
|
181
201
|
return display;
|
|
182
202
|
const unsigned = isNonzeroUnsignedObservation(display.value);
|
|
183
203
|
const displayFailure = codeSignCaptureFailure(display.value);
|
|
184
204
|
if (displayFailure !== null)
|
|
185
205
|
return err(displayFailure);
|
|
186
|
-
const requirements = await this.#
|
|
206
|
+
const requirements = await this.#captureSignature(binding, ["-d", "-r-"], signal);
|
|
187
207
|
if (!requirements.ok)
|
|
188
208
|
return requirements;
|
|
189
209
|
const requirementsFailure = codeSignCaptureFailure(requirements.value);
|
|
190
210
|
if (requirementsFailure !== null)
|
|
191
211
|
return err(requirementsFailure);
|
|
192
|
-
const entitlements = await this.#
|
|
212
|
+
const entitlements = await this.#captureSignature(binding, ["-d", "--entitlements", ":-"], signal);
|
|
193
213
|
if (!entitlements.ok)
|
|
194
214
|
return entitlements;
|
|
195
215
|
const entitlementsFailure = codeSignCaptureFailure(entitlements.value);
|
|
@@ -197,8 +217,8 @@ class NativeMacOSClient {
|
|
|
197
217
|
return err(entitlementsFailure);
|
|
198
218
|
// codesign echoes the resolved executable path in its diagnostics.
|
|
199
219
|
const parsed = parseCodeSignature(display.value.stderr, unsigned, [
|
|
200
|
-
|
|
201
|
-
...(await canonicalPath(
|
|
220
|
+
binding.snapshotPath,
|
|
221
|
+
...(await canonicalPath(binding.snapshotPath)),
|
|
202
222
|
]);
|
|
203
223
|
// The requirement is printed to stdout; stderr echoes the path.
|
|
204
224
|
const requirementText = /designated\s*=>\s*(.+)$/mu.exec(requirements.value.stdout)?.[1] ?? null;
|
|
@@ -207,6 +227,7 @@ class NativeMacOSClient {
|
|
|
207
227
|
const captures = [display.value, requirements.value, entitlements.value];
|
|
208
228
|
const limitations = [
|
|
209
229
|
...parsed.limitations,
|
|
230
|
+
"Inspected a digest-verified Mach-O byte snapshot; filesystem-bound signing context and trust validation are not examined.",
|
|
210
231
|
...(entitlementValue.omittedPrototypeKeys === 0
|
|
211
232
|
? []
|
|
212
233
|
: [
|
|
@@ -217,13 +238,19 @@ class NativeMacOSClient {
|
|
|
217
238
|
(isNonzeroUnsignedObservation(requirements.value) ||
|
|
218
239
|
isNonzeroUnsignedObservation(entitlements.value));
|
|
219
240
|
if (mixedSigning) {
|
|
220
|
-
const slices = await this.#inspectMixedSignatureSlices(parsed.format,
|
|
241
|
+
const slices = await this.#inspectMixedSignatureSlices(binding, parsed.format, {
|
|
242
|
+
requirements: requirements.value.exitCode,
|
|
243
|
+
entitlements: entitlements.value.exitCode,
|
|
244
|
+
}, signal);
|
|
221
245
|
if (!slices.ok)
|
|
222
246
|
return slices;
|
|
223
247
|
captures.push(...slices.value.captures);
|
|
224
248
|
limitations.push(...slices.value.limitations);
|
|
225
249
|
}
|
|
226
|
-
const provenance = captures.map((capture) => invocation(capture,
|
|
250
|
+
const provenance = captures.map((capture) => invocation(capture, binding.snapshotPath));
|
|
251
|
+
const version = await verifySignatureTarget(this.target, binding, signal);
|
|
252
|
+
if (!version.ok)
|
|
253
|
+
return version;
|
|
227
254
|
const result = inspectSignatureSchema.parse({
|
|
228
255
|
...parsed,
|
|
229
256
|
designated_requirement: requirementText,
|
|
@@ -238,12 +265,12 @@ class NativeMacOSClient {
|
|
|
238
265
|
locations: [],
|
|
239
266
|
});
|
|
240
267
|
}
|
|
241
|
-
async #inspectMixedSignatureSlices(
|
|
268
|
+
async #inspectMixedSignatureSlices(binding, format, aggregateExits, signal) {
|
|
242
269
|
const captures = [];
|
|
243
270
|
const unsigned = [];
|
|
244
271
|
const unclassified = [];
|
|
245
272
|
for (const architecture of codeSignArchitectures(format, this.target)) {
|
|
246
|
-
const slice = await this.#
|
|
273
|
+
const slice = await this.#captureSignature(binding, ["-d", "-a", architecture, "--verbose=4"], signal);
|
|
247
274
|
if (!slice.ok)
|
|
248
275
|
return slice;
|
|
249
276
|
captures.push(slice.value);
|
|
@@ -261,12 +288,38 @@ class NativeMacOSClient {
|
|
|
261
288
|
];
|
|
262
289
|
if (unclassified.length > 0)
|
|
263
290
|
limitations.push(`Signature state could not be classified for Mach-O slices: ${unclassified.join(", ")}.`);
|
|
264
|
-
if (
|
|
291
|
+
if (aggregateExits.requirements !== 0)
|
|
265
292
|
limitations.push("The aggregate designated requirement is unavailable because Mach-O slices have mixed signing states.");
|
|
266
|
-
if (
|
|
293
|
+
if (aggregateExits.entitlements !== 0)
|
|
267
294
|
limitations.push("The aggregate entitlements are unavailable because Mach-O slices have mixed signing states.");
|
|
268
295
|
return ok({ captures, limitations });
|
|
269
296
|
}
|
|
297
|
+
async #captureSignature(binding, args, signal) {
|
|
298
|
+
const before = await verifySignatureTarget(this.target, binding, signal);
|
|
299
|
+
if (!before.ok)
|
|
300
|
+
return before;
|
|
301
|
+
let capture;
|
|
302
|
+
try {
|
|
303
|
+
capture = await this.#run("inspect_signature", "codesign", [...args, binding.snapshotPath], {
|
|
304
|
+
signal,
|
|
305
|
+
acceptNonZero: true,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
catch (cause) {
|
|
309
|
+
capture = err(new ProviderAdapterError(IDENTITY.id, "inspect_signature", {
|
|
310
|
+
cause,
|
|
311
|
+
diagnostics: {
|
|
312
|
+
phase: "codesign-capture",
|
|
313
|
+
path: this.target.path,
|
|
314
|
+
reason: cause instanceof Error ? cause.message : String(cause),
|
|
315
|
+
},
|
|
316
|
+
}));
|
|
317
|
+
}
|
|
318
|
+
// Verify failed captures too: a disappearing target is not a codesign
|
|
319
|
+
// execution failure, and later captures must never use another version.
|
|
320
|
+
const after = await verifySignatureTarget(this.target, binding, signal);
|
|
321
|
+
return after.ok ? capture : after;
|
|
322
|
+
}
|
|
270
323
|
async #inspectPlist(parameters, signal) {
|
|
271
324
|
const requested = parameters.path;
|
|
272
325
|
if (requested !== undefined && typeof requested !== "string")
|
|
@@ -350,13 +403,57 @@ class NativeMacOSClient {
|
|
|
350
403
|
}
|
|
351
404
|
const isNativeOperation = (operation) => NATIVE_TOOL_CONTRACTS.some(({ name }) => name === operation);
|
|
352
405
|
const translateCommandFailure = (operation, failure) => {
|
|
406
|
+
const capturedOutput = failure.capture === null
|
|
407
|
+
? undefined
|
|
408
|
+
: {
|
|
409
|
+
stdout: failure.capture.stdout,
|
|
410
|
+
stderr: failure.capture.stderr,
|
|
411
|
+
truncated: failure.capture.truncated,
|
|
412
|
+
stdout_bytes: failure.capture.stdoutBytes,
|
|
413
|
+
stderr_bytes: failure.capture.stderrBytes,
|
|
414
|
+
exit_code: failure.capture.exitCode,
|
|
415
|
+
signal: failure.capture.signal,
|
|
416
|
+
};
|
|
417
|
+
const cleanup = failure.cleanupFailure === null
|
|
418
|
+
? undefined
|
|
419
|
+
: {
|
|
420
|
+
reason: failure.cleanupFailure,
|
|
421
|
+
resources: [...failure.cleanupResources],
|
|
422
|
+
};
|
|
423
|
+
const errorOptions = {
|
|
424
|
+
...(capturedOutput === undefined ? {} : { capturedOutput }),
|
|
425
|
+
...(cleanup === undefined ? {} : { cleanup }),
|
|
426
|
+
};
|
|
353
427
|
if (failure.reason === "unavailable")
|
|
354
|
-
return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, `${failure.tool} is unavailable through xcrun
|
|
428
|
+
return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, `${failure.tool} is unavailable through xcrun.`, errorOptions);
|
|
355
429
|
if (failure.reason === "cancelled")
|
|
356
|
-
return new AnalysisCancelledError(operation);
|
|
357
|
-
|
|
430
|
+
return new AnalysisCancelledError(operation, errorOptions);
|
|
431
|
+
if (failure.reason === "timeout")
|
|
432
|
+
return new AnalysisTimeoutError(operation, NATIVE_COMMAND_TIMEOUT_MS, errorOptions);
|
|
433
|
+
if (failure.reason === "output-limit")
|
|
434
|
+
return new AnalysisResourceConstraintError(operation, "memory", `Native command output exceeded ${String(NATIVE_COMMAND_OUTPUT_BUDGET_BYTES)} bytes; complete output is required for analysis.`, { max_output_bytes: NATIVE_COMMAND_OUTPUT_BUDGET_BYTES }, errorOptions);
|
|
435
|
+
return new ProviderAdapterError(IDENTITY.id, operation, {
|
|
436
|
+
cause: failure,
|
|
437
|
+
...errorOptions,
|
|
438
|
+
diagnostics: {
|
|
439
|
+
tool: failure.tool,
|
|
440
|
+
reason: failure.reason,
|
|
441
|
+
exit_code: failure.capture?.exitCode ?? failure.exitCode,
|
|
442
|
+
signal: failure.capture?.signal ?? null,
|
|
443
|
+
stdout_bytes: failure.capture?.stdoutBytes ?? 0,
|
|
444
|
+
stderr_bytes: failure.capture?.stderrBytes ?? 0,
|
|
445
|
+
},
|
|
446
|
+
});
|
|
358
447
|
};
|
|
359
|
-
const translateCodeSignExitFailure = (capture) => translateCommandFailure("inspect_signature", new NativeCommandFailure("codesign", "nonzero-exit", capture.exitCode
|
|
448
|
+
const translateCodeSignExitFailure = (capture) => translateCommandFailure("inspect_signature", new NativeCommandFailure("codesign", "nonzero-exit", capture.exitCode, undefined, {
|
|
449
|
+
stdout: capture.stdout,
|
|
450
|
+
stderr: capture.stderr,
|
|
451
|
+
stdoutBytes: capture.stdoutBytes,
|
|
452
|
+
stderrBytes: capture.stderrBytes,
|
|
453
|
+
exitCode: capture.exitCode,
|
|
454
|
+
signal: capture.signal,
|
|
455
|
+
truncated: false,
|
|
456
|
+
}));
|
|
360
457
|
const commandOutput = (capture) => `${capture.stdout}\n${capture.stderr}`;
|
|
361
458
|
/**
|
|
362
459
|
* A signed artifact exits zero; its diagnostics can still contain this text
|
|
@@ -6,6 +6,11 @@ export const NATIVE_MACOS_PROVIDER_IDENTITY = Object.freeze({
|
|
|
6
6
|
version: null,
|
|
7
7
|
});
|
|
8
8
|
const IDENTITY = NATIVE_MACOS_PROVIDER_IDENTITY;
|
|
9
|
+
/** Operations whose target process can show UI, use the network and write files. */
|
|
10
|
+
const OWNED_PROCESS_OPERATIONS = new Set([
|
|
11
|
+
"capture_native_ui_scenario",
|
|
12
|
+
"observe_native_calls",
|
|
13
|
+
]);
|
|
9
14
|
/** Declare native host coverage without creating a command runner. */
|
|
10
15
|
export const nativeMacOSCapabilities = (platform = process.platform) => {
|
|
11
16
|
const available = platform === "darwin";
|
|
@@ -27,9 +32,9 @@ export const nativeMacOSCapabilities = (platform = process.platform) => {
|
|
|
27
32
|
effects: Object.freeze({
|
|
28
33
|
mutatesArtifact: false,
|
|
29
34
|
launchesProcess: contract.name !== "inspect_native_dispatch_metadata",
|
|
30
|
-
mayShowUi: contract.name
|
|
31
|
-
mayAccessNetwork: contract.name
|
|
32
|
-
mayWriteFilesystem: contract.name
|
|
35
|
+
mayShowUi: OWNED_PROCESS_OPERATIONS.has(contract.name),
|
|
36
|
+
mayAccessNetwork: OWNED_PROCESS_OPERATIONS.has(contract.name),
|
|
37
|
+
mayWriteFilesystem: OWNED_PROCESS_OPERATIONS.has(contract.name) ||
|
|
33
38
|
contract.name === "observe_native_ui",
|
|
34
39
|
changesPermissions: false,
|
|
35
40
|
requiresRoot: false,
|