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
|
@@ -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
|
+
};
|
|
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { open } from "node:fs/promises";
|
|
3
3
|
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
|
|
4
4
|
import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
|
|
5
|
+
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
5
6
|
import { nativeCallObservationInputSchema, nativeCallObservationResultSchema, } from "../domain/native/nativeCallObservation.js";
|
|
6
7
|
import { err, ok } from "../domain/result.js";
|
|
7
8
|
const OPERATION = "observe_native_calls";
|
|
@@ -15,26 +16,42 @@ export const NATIVE_CALL_OBSERVATION_LIMITATIONS = [
|
|
|
15
16
|
"The observation window is checked about once a second, and recording pauses the process at every entry, which slows it.",
|
|
16
17
|
];
|
|
17
18
|
/** Launch the active Mach-O under LLDB, record requested call entries, then stop it. */
|
|
18
|
-
export const observeNativeCalls = async (target, parameters, tracer, signal) => {
|
|
19
|
+
export const observeNativeCalls = async (target, parameters, tracer, signal, readTargetDigest = fileSha256) => {
|
|
19
20
|
if (target.kind !== "executable" || target.format !== "mach-o")
|
|
20
21
|
return err(new AnalysisCapabilityUnavailableError("native-macos", OPERATION, "Native call observation launches a Mach-O executable; the active target is not one"));
|
|
21
22
|
const parsed = nativeCallObservationInputSchema.safeParse(parameters);
|
|
22
23
|
if (!parsed.success)
|
|
23
24
|
return err(new AnalysisInputError(OPERATION, { cause: parsed.error }));
|
|
24
25
|
// Observe the bytes the session's other Evidence describes.
|
|
25
|
-
|
|
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)
|
|
26
41
|
return err(new EvidenceIntegrityError("Native call observation target digest changed after session binding"));
|
|
27
42
|
if (signal?.aborted === true)
|
|
28
43
|
return err(new AnalysisCancelledError(OPERATION));
|
|
29
44
|
const traced = await tracer.trace({
|
|
30
45
|
executable: target.path,
|
|
31
46
|
architecture: target.architecture,
|
|
47
|
+
expectedSha256: target.sha256,
|
|
32
48
|
input: parsed.data,
|
|
33
49
|
}, signal);
|
|
34
50
|
if (!traced.ok)
|
|
35
51
|
return traced;
|
|
36
52
|
return ok(projectNativeCalls(target, parsed.data, traced.value));
|
|
37
53
|
};
|
|
54
|
+
const isAbortError = (cause) => cause instanceof Error && cause.name === "AbortError";
|
|
38
55
|
/** Join the request, the tracer's run and REA's own checks into the result contract. */
|
|
39
56
|
export const projectNativeCalls = (target, input, trace) => {
|
|
40
57
|
const { run } = trace;
|
|
@@ -42,14 +59,31 @@ export const projectNativeCalls = (target, input, trace) => {
|
|
|
42
59
|
.filter(({ location_count: count }) => count === 0)
|
|
43
60
|
.map(({ index }) => index);
|
|
44
61
|
const eventLimit = run.outcome === "event-limit";
|
|
45
|
-
const
|
|
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;
|
|
46
70
|
return nativeCallObservationResultSchema.parse({
|
|
47
71
|
target: {
|
|
48
72
|
path: target.path,
|
|
49
73
|
sha256: target.sha256,
|
|
50
74
|
architecture: target.architecture,
|
|
51
75
|
arguments: input.arguments,
|
|
76
|
+
environment: input.environment,
|
|
52
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
|
+
},
|
|
53
87
|
},
|
|
54
88
|
debugger: trace.debugger,
|
|
55
89
|
process: {
|
|
@@ -75,20 +109,35 @@ export const projectNativeCalls = (target, input, trace) => {
|
|
|
75
109
|
coverage: {
|
|
76
110
|
status: partial ? "partial" : "complete",
|
|
77
111
|
event_limit_reached: eventLimit,
|
|
112
|
+
resource_limit_reached: resourceLimit,
|
|
113
|
+
...(breakpointLocationLimit
|
|
114
|
+
? { breakpoint_locations_truncated: true }
|
|
115
|
+
: {}),
|
|
78
116
|
unresolved_breakpoints: unresolved,
|
|
79
117
|
},
|
|
80
118
|
limitations: [
|
|
81
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.",
|
|
82
121
|
...(eventLimit
|
|
83
122
|
? [
|
|
84
123
|
`Observation stopped at max_events (${input.max_events}); later calls were not recorded and the process was killed.`,
|
|
85
124
|
]
|
|
86
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
|
+
: []),
|
|
87
131
|
...(run.outcome === "duration-elapsed"
|
|
88
132
|
? [
|
|
89
133
|
`The process was still running after duration_ms (${input.duration_ms}) and was killed.`,
|
|
90
134
|
]
|
|
91
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
|
+
]),
|
|
92
141
|
...(run.outcome === "stop-limit"
|
|
93
142
|
? [
|
|
94
143
|
"Observation stopped after repeated signal or exception stops; the process was killed.",
|
|
@@ -104,9 +153,19 @@ export const projectNativeCalls = (target, input, trace) => {
|
|
|
104
153
|
"Breakpoints with many matching locations list only the first 64; location_count gives the total.",
|
|
105
154
|
]
|
|
106
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
|
+
: []),
|
|
107
161
|
...(trace.stdout.truncated || trace.stderr.truncated
|
|
108
162
|
? ["Target output beyond 1 MiB per stream is counted but not kept."]
|
|
109
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
|
+
: []),
|
|
110
169
|
...(run.terminated && trace.terminated
|
|
111
170
|
? []
|
|
112
171
|
: [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
1
2
|
import { NATIVE_MACOS_PROVIDER_IDENTITY as IDENTITY, nativeMacOSCapabilities, } from "./NativeMacOSProviderMetadata.js";
|
|
2
|
-
export { NATIVE_MACOS_PROVIDER_IDENTITY } from "./NativeMacOSProviderMetadata.js";
|
|
3
3
|
import { inspectAppleDispatchMetadata } from "./AppleDispatchMetadata.js";
|
|
4
4
|
import { observeNativeUi } from "./NativeUiObservation.js";
|
|
5
5
|
import { LldbCallTracer } from "./LldbCallTracer.js";
|
|
@@ -9,7 +9,9 @@ import { open, realpath, stat } from "node:fs/promises";
|
|
|
9
9
|
import { z } from "zod";
|
|
10
10
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
11
11
|
import { NATIVE_TOOL_CONTRACTS, } from "../contracts/native/nativeToolContracts.js";
|
|
12
|
-
import {
|
|
12
|
+
import { toolContract } from "../contracts/toolContracts.js";
|
|
13
|
+
import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
|
|
14
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, AnalysisResourceConstraintError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
|
|
13
15
|
import { BinaryTargetError } from "../domain/configurationErrors.js";
|
|
14
16
|
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
15
17
|
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
@@ -17,7 +19,8 @@ import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
|
17
19
|
import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../domain/propertyListKeys.js";
|
|
18
20
|
import { demangleSwiftSchema, inspectPlistSchema, inspectSignatureSchema, listArchitecturesSchema, } from "../domain/native/nativeInspection.js";
|
|
19
21
|
import { err, ok } from "../domain/result.js";
|
|
20
|
-
import { NativeCommandFailure, XcrunCommandRunner, } from "./CommandRunner.js";
|
|
22
|
+
import { NATIVE_COMMAND_TIMEOUT_MS, NATIVE_COMMAND_OUTPUT_BUDGET_BYTES, NativeCommandFailure, XcrunCommandRunner, } from "./CommandRunner.js";
|
|
23
|
+
import { withSignatureTarget, verifySignatureTarget, } from "./SignatureTargetBinding.js";
|
|
21
24
|
import { parseCodeSignature } from "./parsers/codesign.js";
|
|
22
25
|
import { parseDemangledSymbols } from "./parsers/demangle.js";
|
|
23
26
|
import { parseLipoArchitectures } from "./parsers/lipo.js";
|
|
@@ -28,9 +31,11 @@ export class NativeMacOSProvider {
|
|
|
28
31
|
runner;
|
|
29
32
|
tracer;
|
|
30
33
|
#capabilities;
|
|
31
|
-
|
|
34
|
+
#environment;
|
|
35
|
+
constructor(environment, runner = new XcrunCommandRunner(environment), platform = process.platform, tracer = new LldbCallTracer(environment)) {
|
|
32
36
|
this.runner = runner;
|
|
33
37
|
this.tracer = tracer;
|
|
38
|
+
this.#environment = snapshotEnvironment(environment, platform);
|
|
34
39
|
this.#capabilities = nativeMacOSCapabilities(platform);
|
|
35
40
|
}
|
|
36
41
|
identity() {
|
|
@@ -40,17 +45,19 @@ export class NativeMacOSProvider {
|
|
|
40
45
|
return this.#capabilities;
|
|
41
46
|
}
|
|
42
47
|
createClient(target) {
|
|
43
|
-
return new NativeMacOSClient(target, this.runner, this.tracer);
|
|
48
|
+
return new NativeMacOSClient(target, this.runner, this.tracer, this.#environment);
|
|
44
49
|
}
|
|
45
50
|
}
|
|
46
51
|
class NativeMacOSClient {
|
|
47
52
|
target;
|
|
48
53
|
runner;
|
|
49
54
|
tracer;
|
|
50
|
-
|
|
55
|
+
environment;
|
|
56
|
+
constructor(target, runner, tracer, environment) {
|
|
51
57
|
this.target = target;
|
|
52
58
|
this.runner = runner;
|
|
53
59
|
this.tracer = tracer;
|
|
60
|
+
this.environment = environment;
|
|
54
61
|
}
|
|
55
62
|
async execute(operation, parameters, options) {
|
|
56
63
|
if (options?.signal?.aborted === true)
|
|
@@ -58,16 +65,15 @@ class NativeMacOSClient {
|
|
|
58
65
|
if (operation === "health")
|
|
59
66
|
return ok(createAnalysisExecution(null, IDENTITY));
|
|
60
67
|
if (operation === "inspect_native_dispatch_metadata") {
|
|
68
|
+
const input = toolContract(operation).inputSchema.safeParse(parameters);
|
|
69
|
+
if (!input.success)
|
|
70
|
+
return err(analysisInputErrorFromIssues(operation, input.error.issues, parameters, {
|
|
71
|
+
cause: input.error,
|
|
72
|
+
}));
|
|
61
73
|
if (this.target.kind !== "executable" || this.target.format !== "mach-o")
|
|
62
74
|
return err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "Binary Apple metadata requires Mach-O; other providers can report symbol-only metadata"));
|
|
63
75
|
try {
|
|
64
|
-
const
|
|
65
|
-
.number()
|
|
66
|
-
.int()
|
|
67
|
-
.min(1)
|
|
68
|
-
.max(20000)
|
|
69
|
-
.parse(parameters.max_records ?? 5000);
|
|
70
|
-
const result = await inspectAppleDispatchMetadata(this.target, maxRecords, options?.signal);
|
|
76
|
+
const result = await inspectAppleDispatchMetadata(this.target, input.data.max_records, options?.signal);
|
|
71
77
|
return ok(createAnalysisExecution(result, result.provider, {
|
|
72
78
|
locations: [{ kind: "artifact-path", path: this.target.path }],
|
|
73
79
|
limitations: result.result.coverage.flatMap(({ reason }) => reason === null ? [] : [reason]),
|
|
@@ -101,6 +107,7 @@ class NativeMacOSClient {
|
|
|
101
107
|
if (operation === "observe_native_ui" ||
|
|
102
108
|
operation === "capture_native_ui_scenario") {
|
|
103
109
|
const result = await observeNativeUi(this.target, operation, parameters, {
|
|
110
|
+
environment: this.environment,
|
|
104
111
|
signal: options?.signal,
|
|
105
112
|
});
|
|
106
113
|
return result.ok
|
|
@@ -126,7 +133,7 @@ class NativeMacOSClient {
|
|
|
126
133
|
}
|
|
127
134
|
}
|
|
128
135
|
close() {
|
|
129
|
-
return Promise.resolve();
|
|
136
|
+
return Promise.resolve(ok(null));
|
|
130
137
|
}
|
|
131
138
|
#dispatch(operation, parameters, signal) {
|
|
132
139
|
switch (operation) {
|
|
@@ -192,20 +199,23 @@ class NativeMacOSClient {
|
|
|
192
199
|
});
|
|
193
200
|
}
|
|
194
201
|
async #inspectSignature(signal) {
|
|
195
|
-
|
|
202
|
+
return withSignatureTarget(this.target, (binding) => this.#inspectBoundSignature(binding, signal), signal);
|
|
203
|
+
}
|
|
204
|
+
async #inspectBoundSignature(binding, signal) {
|
|
205
|
+
const display = await this.#captureSignature(binding, ["-d", "--verbose=4"], signal);
|
|
196
206
|
if (!display.ok)
|
|
197
207
|
return display;
|
|
198
208
|
const unsigned = isNonzeroUnsignedObservation(display.value);
|
|
199
209
|
const displayFailure = codeSignCaptureFailure(display.value);
|
|
200
210
|
if (displayFailure !== null)
|
|
201
211
|
return err(displayFailure);
|
|
202
|
-
const requirements = await this.#
|
|
212
|
+
const requirements = await this.#captureSignature(binding, ["-d", "-r-"], signal);
|
|
203
213
|
if (!requirements.ok)
|
|
204
214
|
return requirements;
|
|
205
215
|
const requirementsFailure = codeSignCaptureFailure(requirements.value);
|
|
206
216
|
if (requirementsFailure !== null)
|
|
207
217
|
return err(requirementsFailure);
|
|
208
|
-
const entitlements = await this.#
|
|
218
|
+
const entitlements = await this.#captureSignature(binding, ["-d", "--entitlements", ":-"], signal);
|
|
209
219
|
if (!entitlements.ok)
|
|
210
220
|
return entitlements;
|
|
211
221
|
const entitlementsFailure = codeSignCaptureFailure(entitlements.value);
|
|
@@ -213,8 +223,8 @@ class NativeMacOSClient {
|
|
|
213
223
|
return err(entitlementsFailure);
|
|
214
224
|
// codesign echoes the resolved executable path in its diagnostics.
|
|
215
225
|
const parsed = parseCodeSignature(display.value.stderr, unsigned, [
|
|
216
|
-
|
|
217
|
-
...(await canonicalPath(
|
|
226
|
+
binding.snapshotPath,
|
|
227
|
+
...(await canonicalPath(binding.snapshotPath)),
|
|
218
228
|
]);
|
|
219
229
|
// The requirement is printed to stdout; stderr echoes the path.
|
|
220
230
|
const requirementText = /designated\s*=>\s*(.+)$/mu.exec(requirements.value.stdout)?.[1] ?? null;
|
|
@@ -223,6 +233,7 @@ class NativeMacOSClient {
|
|
|
223
233
|
const captures = [display.value, requirements.value, entitlements.value];
|
|
224
234
|
const limitations = [
|
|
225
235
|
...parsed.limitations,
|
|
236
|
+
"Inspected a digest-verified Mach-O byte snapshot; filesystem-bound signing context and trust validation are not examined.",
|
|
226
237
|
...(entitlementValue.omittedPrototypeKeys === 0
|
|
227
238
|
? []
|
|
228
239
|
: [
|
|
@@ -233,13 +244,19 @@ class NativeMacOSClient {
|
|
|
233
244
|
(isNonzeroUnsignedObservation(requirements.value) ||
|
|
234
245
|
isNonzeroUnsignedObservation(entitlements.value));
|
|
235
246
|
if (mixedSigning) {
|
|
236
|
-
const slices = await this.#inspectMixedSignatureSlices(parsed.format,
|
|
247
|
+
const slices = await this.#inspectMixedSignatureSlices(binding, parsed.format, {
|
|
248
|
+
requirements: requirements.value.exitCode,
|
|
249
|
+
entitlements: entitlements.value.exitCode,
|
|
250
|
+
}, signal);
|
|
237
251
|
if (!slices.ok)
|
|
238
252
|
return slices;
|
|
239
253
|
captures.push(...slices.value.captures);
|
|
240
254
|
limitations.push(...slices.value.limitations);
|
|
241
255
|
}
|
|
242
|
-
const provenance = captures.map((capture) => invocation(capture,
|
|
256
|
+
const provenance = captures.map((capture) => invocation(capture, binding.snapshotPath));
|
|
257
|
+
const version = await verifySignatureTarget(this.target, binding, signal);
|
|
258
|
+
if (!version.ok)
|
|
259
|
+
return version;
|
|
243
260
|
const result = inspectSignatureSchema.parse({
|
|
244
261
|
...parsed,
|
|
245
262
|
designated_requirement: requirementText,
|
|
@@ -254,12 +271,12 @@ class NativeMacOSClient {
|
|
|
254
271
|
locations: [],
|
|
255
272
|
});
|
|
256
273
|
}
|
|
257
|
-
async #inspectMixedSignatureSlices(
|
|
274
|
+
async #inspectMixedSignatureSlices(binding, format, aggregateExits, signal) {
|
|
258
275
|
const captures = [];
|
|
259
276
|
const unsigned = [];
|
|
260
277
|
const unclassified = [];
|
|
261
278
|
for (const architecture of codeSignArchitectures(format, this.target)) {
|
|
262
|
-
const slice = await this.#
|
|
279
|
+
const slice = await this.#captureSignature(binding, ["-d", "-a", architecture, "--verbose=4"], signal);
|
|
263
280
|
if (!slice.ok)
|
|
264
281
|
return slice;
|
|
265
282
|
captures.push(slice.value);
|
|
@@ -277,12 +294,38 @@ class NativeMacOSClient {
|
|
|
277
294
|
];
|
|
278
295
|
if (unclassified.length > 0)
|
|
279
296
|
limitations.push(`Signature state could not be classified for Mach-O slices: ${unclassified.join(", ")}.`);
|
|
280
|
-
if (
|
|
297
|
+
if (aggregateExits.requirements !== 0)
|
|
281
298
|
limitations.push("The aggregate designated requirement is unavailable because Mach-O slices have mixed signing states.");
|
|
282
|
-
if (
|
|
299
|
+
if (aggregateExits.entitlements !== 0)
|
|
283
300
|
limitations.push("The aggregate entitlements are unavailable because Mach-O slices have mixed signing states.");
|
|
284
301
|
return ok({ captures, limitations });
|
|
285
302
|
}
|
|
303
|
+
async #captureSignature(binding, args, signal) {
|
|
304
|
+
const before = await verifySignatureTarget(this.target, binding, signal);
|
|
305
|
+
if (!before.ok)
|
|
306
|
+
return before;
|
|
307
|
+
let capture;
|
|
308
|
+
try {
|
|
309
|
+
capture = await this.#run("inspect_signature", "codesign", [...args, binding.snapshotPath], {
|
|
310
|
+
signal,
|
|
311
|
+
acceptNonZero: true,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
catch (cause) {
|
|
315
|
+
capture = err(new ProviderAdapterError(IDENTITY.id, "inspect_signature", {
|
|
316
|
+
cause,
|
|
317
|
+
diagnostics: {
|
|
318
|
+
phase: "codesign-capture",
|
|
319
|
+
path: this.target.path,
|
|
320
|
+
reason: cause instanceof Error ? cause.message : String(cause),
|
|
321
|
+
},
|
|
322
|
+
}));
|
|
323
|
+
}
|
|
324
|
+
// Verify failed captures too: a disappearing target is not a codesign
|
|
325
|
+
// execution failure, and later captures must never use another version.
|
|
326
|
+
const after = await verifySignatureTarget(this.target, binding, signal);
|
|
327
|
+
return after.ok ? capture : after;
|
|
328
|
+
}
|
|
286
329
|
async #inspectPlist(parameters, signal) {
|
|
287
330
|
const requested = parameters.path;
|
|
288
331
|
if (requested !== undefined && typeof requested !== "string")
|
|
@@ -366,13 +409,59 @@ class NativeMacOSClient {
|
|
|
366
409
|
}
|
|
367
410
|
const isNativeOperation = (operation) => NATIVE_TOOL_CONTRACTS.some(({ name }) => name === operation);
|
|
368
411
|
const translateCommandFailure = (operation, failure) => {
|
|
369
|
-
|
|
370
|
-
|
|
412
|
+
const capturedOutput = failure.capture === null
|
|
413
|
+
? undefined
|
|
414
|
+
: {
|
|
415
|
+
stdout: failure.capture.stdout,
|
|
416
|
+
stderr: failure.capture.stderr,
|
|
417
|
+
truncated: failure.capture.truncated,
|
|
418
|
+
stdout_bytes: failure.capture.stdoutBytes,
|
|
419
|
+
stderr_bytes: failure.capture.stderrBytes,
|
|
420
|
+
exit_code: failure.capture.exitCode,
|
|
421
|
+
signal: failure.capture.signal,
|
|
422
|
+
};
|
|
423
|
+
const cleanup = failure.cleanupFailure === null
|
|
424
|
+
? undefined
|
|
425
|
+
: {
|
|
426
|
+
reason: failure.cleanupFailure,
|
|
427
|
+
resources: [...failure.cleanupResources],
|
|
428
|
+
};
|
|
429
|
+
const errorOptions = {
|
|
430
|
+
...(capturedOutput === undefined ? {} : { capturedOutput }),
|
|
431
|
+
...(cleanup === undefined ? {} : { cleanup }),
|
|
432
|
+
};
|
|
433
|
+
if (failure.reason === "unavailable") {
|
|
434
|
+
const reason = `${failure.tool} is unavailable through xcrun.`;
|
|
435
|
+
return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, reason, { ...errorOptions, userMessage: reason });
|
|
436
|
+
}
|
|
371
437
|
if (failure.reason === "cancelled")
|
|
372
|
-
return new AnalysisCancelledError(operation);
|
|
373
|
-
|
|
438
|
+
return new AnalysisCancelledError(operation, errorOptions);
|
|
439
|
+
if (failure.reason === "timeout")
|
|
440
|
+
return new AnalysisTimeoutError(operation, NATIVE_COMMAND_TIMEOUT_MS, errorOptions);
|
|
441
|
+
if (failure.reason === "output-limit")
|
|
442
|
+
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);
|
|
443
|
+
return new ProviderAdapterError(IDENTITY.id, operation, {
|
|
444
|
+
cause: failure,
|
|
445
|
+
...errorOptions,
|
|
446
|
+
diagnostics: {
|
|
447
|
+
tool: failure.tool,
|
|
448
|
+
reason: failure.reason,
|
|
449
|
+
exit_code: failure.capture?.exitCode ?? failure.exitCode,
|
|
450
|
+
signal: failure.capture?.signal ?? null,
|
|
451
|
+
stdout_bytes: failure.capture?.stdoutBytes ?? 0,
|
|
452
|
+
stderr_bytes: failure.capture?.stderrBytes ?? 0,
|
|
453
|
+
},
|
|
454
|
+
});
|
|
374
455
|
};
|
|
375
|
-
const translateCodeSignExitFailure = (capture) => translateCommandFailure("inspect_signature", new NativeCommandFailure("codesign", "nonzero-exit", capture.exitCode
|
|
456
|
+
const translateCodeSignExitFailure = (capture) => translateCommandFailure("inspect_signature", new NativeCommandFailure("codesign", "nonzero-exit", capture.exitCode, undefined, {
|
|
457
|
+
stdout: capture.stdout,
|
|
458
|
+
stderr: capture.stderr,
|
|
459
|
+
stdoutBytes: capture.stdoutBytes,
|
|
460
|
+
stderrBytes: capture.stderrBytes,
|
|
461
|
+
exitCode: capture.exitCode,
|
|
462
|
+
signal: capture.signal,
|
|
463
|
+
truncated: false,
|
|
464
|
+
}));
|
|
376
465
|
const commandOutput = (capture) => `${capture.stdout}\n${capture.stderr}`;
|
|
377
466
|
/**
|
|
378
467
|
* A signed artifact exits zero; its diagnostics can still contain this text
|
|
@@ -432,8 +521,10 @@ const parseEntitlements = (output) => {
|
|
|
432
521
|
*/
|
|
433
522
|
const unreadablePlist = (path, requested, reason) => {
|
|
434
523
|
const sentence = reason.endsWith(".") ? reason : `${reason}.`;
|
|
524
|
+
// Name the default that is missing and the selection that still works.
|
|
525
|
+
const missingDefault = `The target has no readable Contents/Info.plist at ${path}: ${sentence} Select another plist in the target with the path input (CLI: --relative-path).`;
|
|
435
526
|
return requested === undefined
|
|
436
|
-
? new AnalysisCapabilityUnavailableError(IDENTITY.id, "inspect_plist",
|
|
527
|
+
? new AnalysisCapabilityUnavailableError(IDENTITY.id, "inspect_plist", missingDefault, { userMessage: missingDefault })
|
|
437
528
|
: new AnalysisInputError("inspect_plist", undefined, [
|
|
438
529
|
{
|
|
439
530
|
path: ["path"],
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
|
|
2
|
+
import { mkdir, mkdtemp, rm, symlink } from "node:fs/promises";
|
|
2
3
|
import { tmpdir } from "node:os";
|
|
3
4
|
import { join } from "node:path";
|
|
4
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { SWIFTC_INTERRUPT } from "../process/DarwinProcessRunTokenReader.js";
|
|
5
7
|
import { execFileOutput } from "../process/ExecFileOutput.js";
|
|
6
8
|
import { safeParseJson } from "../domain/safeJson.js";
|
|
7
9
|
import { NATIVE_UI_HELPER_MAX_BUFFER } from "./NativeUiOutputBudget.js";
|
|
8
10
|
/** Lazily compile one owned helper per observation/scenario and remove its compiler cache. */
|
|
9
|
-
export const createNativeUiHelperRuntime = () => {
|
|
11
|
+
export const createNativeUiHelperRuntime = (environment) => {
|
|
12
|
+
const selectedEnvironment = snapshotEnvironment(environment);
|
|
10
13
|
let root;
|
|
11
14
|
let executable;
|
|
12
15
|
const invoke = async (parameters, signal) => {
|
|
@@ -15,6 +18,9 @@ export const createNativeUiHelperRuntime = () => {
|
|
|
15
18
|
const output = join(root, "observer");
|
|
16
19
|
const main = join(root, "main.swift");
|
|
17
20
|
await symlink(fileURLToPath(new URL("../../bridge/native/ReaNativeUI.swift", import.meta.url)), main);
|
|
21
|
+
// Keep swiftc's intermediate objects inside the removable root.
|
|
22
|
+
const compilerTemporary = join(root, "tmp");
|
|
23
|
+
await mkdir(compilerTemporary);
|
|
18
24
|
await execFileOutput("/usr/bin/xcrun", [
|
|
19
25
|
"swiftc",
|
|
20
26
|
"-module-cache-path",
|
|
@@ -26,6 +32,8 @@ export const createNativeUiHelperRuntime = () => {
|
|
|
26
32
|
], {
|
|
27
33
|
timeout: 60_000,
|
|
28
34
|
maxBuffer: 1024 * 1024,
|
|
35
|
+
stopSignal: SWIFTC_INTERRUPT,
|
|
36
|
+
env: { ...selectedEnvironment, TMPDIR: compilerTemporary },
|
|
29
37
|
...(signal === undefined ? {} : { signal }),
|
|
30
38
|
});
|
|
31
39
|
executable = output;
|
|
@@ -33,6 +41,7 @@ export const createNativeUiHelperRuntime = () => {
|
|
|
33
41
|
const output = await execFileOutput(executable, [JSON.stringify(parameters)], {
|
|
34
42
|
timeout: 30_000,
|
|
35
43
|
maxBuffer: NATIVE_UI_HELPER_MAX_BUFFER,
|
|
44
|
+
env: selectedEnvironment,
|
|
36
45
|
...(signal === undefined ? {} : { signal }),
|
|
37
46
|
});
|
|
38
47
|
const parsed = safeParseJson(output.stdout);
|