rea-agents 3.0.0 → 3.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 +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -1,17 +1,33 @@
|
|
|
1
|
-
import { AnalysisInputError, ArtifactOperationError, BinaryTargetError, BrowserObservationError, ConfigurationError, EvidenceFileError, EvidenceIntegrityError,
|
|
1
|
+
import { AnalysisInputError, ArtifactOperationError, BinaryTargetError, BrowserObservationError, ConfigurationError, EvidenceFileError, EvidenceIntegrityError, HopperRemoteError, HopperProcessError, HopperStartError, HopperTimeoutError, NoBinaryOpenError, PermissionRequiredError, ProviderSelectionError, ReplayPlanStaleError, UnknownRegistryError, } from "./errors.js";
|
|
2
2
|
export const analysisErrorRemediationAction = (error) => {
|
|
3
|
+
if (error instanceof HopperTimeoutError)
|
|
4
|
+
return error.providerState === "busy"
|
|
5
|
+
? "Check binary_session.analysis_activity, wait for the active Hopper request to finish, then retry."
|
|
6
|
+
: "Check binary_session for Hopper health, then retry the operation.";
|
|
7
|
+
if (error instanceof HopperProcessError)
|
|
8
|
+
return "Check binary_session provider health. Restart the owned Hopper process only when it has stopped.";
|
|
9
|
+
if (error instanceof HopperStartError)
|
|
10
|
+
return error.ownerRunId === undefined
|
|
11
|
+
? "Check the Hopper launcher and target details, then retry opening the target."
|
|
12
|
+
: `Use the active REA session ${error.ownerRunId} or close it before opening this target again.`;
|
|
13
|
+
if (error instanceof HopperRemoteError)
|
|
14
|
+
return "Review the Hopper diagnostic details; correct the request or retry if the failure was transient.";
|
|
3
15
|
if (error instanceof AnalysisInputError)
|
|
4
16
|
return "Correct the listed arguments and retry.";
|
|
5
17
|
if (error instanceof UnknownRegistryError && error.reason === "not-found")
|
|
6
18
|
return "Check that the unknown_id belongs to this session, then retry.";
|
|
7
19
|
if (error instanceof ReplayPlanStaleError)
|
|
8
20
|
return "Review the rebuilt replay plan and explicitly approve its new digest.";
|
|
9
|
-
if (error instanceof PermissionRequiredError)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
21
|
+
if (error instanceof PermissionRequiredError) {
|
|
22
|
+
switch (error.remediation) {
|
|
23
|
+
case "configure":
|
|
24
|
+
return "Add the exact missing scope beneath the administrator ceiling, then retry.";
|
|
25
|
+
case "elicit":
|
|
26
|
+
return "Approve the exact missing scope, then retry the operation.";
|
|
27
|
+
case "restart":
|
|
28
|
+
return "Add the exact missing scope to the administrator configuration, then restart the registered MCP server or client.";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
15
31
|
return analysisErrorUserMessage(error);
|
|
16
32
|
};
|
|
17
33
|
export const analysisErrorCategory = (error) => {
|
|
@@ -29,12 +45,10 @@ export const analysisErrorCategory = (error) => {
|
|
|
29
45
|
if (error instanceof HopperRemoteError &&
|
|
30
46
|
error.diagnosticType === "authorization")
|
|
31
47
|
return "permission_required";
|
|
48
|
+
if (error instanceof HopperProcessError || error instanceof HopperStartError)
|
|
49
|
+
return "unavailable";
|
|
32
50
|
if (error instanceof ArtifactOperationError)
|
|
33
51
|
return artifactErrorCategory(error.reason);
|
|
34
|
-
if (error instanceof EvidenceFileError && error.reason === "disabled")
|
|
35
|
-
return "unavailable";
|
|
36
|
-
if (error instanceof InvestigationWorkspaceError)
|
|
37
|
-
return investigationWorkspaceCategory(error.reason);
|
|
38
52
|
return STATIC_ERROR_CATEGORIES[error._tag] ?? "execution_failure";
|
|
39
53
|
};
|
|
40
54
|
const browserErrorCategory = (reason) => {
|
|
@@ -48,17 +62,6 @@ const browserErrorCategory = (reason) => {
|
|
|
48
62
|
return "unavailable";
|
|
49
63
|
return "execution_failure";
|
|
50
64
|
};
|
|
51
|
-
const investigationWorkspaceCategory = (reason) => {
|
|
52
|
-
if (reason === "disabled" ||
|
|
53
|
-
reason === "outside-root" ||
|
|
54
|
-
reason === "not-file")
|
|
55
|
-
return "unavailable";
|
|
56
|
-
if (reason === "too-large")
|
|
57
|
-
return "truncated";
|
|
58
|
-
if (reason === "invalid-json" || reason === "integrity")
|
|
59
|
-
return "integrity_mismatch";
|
|
60
|
-
return "execution_failure";
|
|
61
|
-
};
|
|
62
65
|
const artifactErrorCategory = (reason) => {
|
|
63
66
|
if (reason === "integrity")
|
|
64
67
|
return "integrity_mismatch";
|
|
@@ -75,7 +78,6 @@ const STATIC_ERROR_CATEGORIES = {
|
|
|
75
78
|
AnalysisCapabilityUnavailableError: "unsupported_provider",
|
|
76
79
|
ProviderSelectionError: "unsupported_provider",
|
|
77
80
|
EvidenceIntegrityError: "integrity_mismatch",
|
|
78
|
-
EvidenceLimitError: "truncated",
|
|
79
81
|
AnalysisCancelledError: "cancelled",
|
|
80
82
|
HopperCancelledError: "cancelled",
|
|
81
83
|
AnalysisTimeoutError: "timeout",
|
|
@@ -90,6 +92,9 @@ export const analysisErrorUserMessage = (error) => {
|
|
|
90
92
|
return "This operation needs additional local permission. Review the requested scope and remediation.";
|
|
91
93
|
if (error instanceof AnalysisInputError)
|
|
92
94
|
return "Analysis input is invalid. Check the arguments and try again.";
|
|
95
|
+
const hopperMessage = hopperErrorUserMessage(error);
|
|
96
|
+
if (hopperMessage !== undefined)
|
|
97
|
+
return hopperMessage;
|
|
93
98
|
if (error.userMessage !== undefined)
|
|
94
99
|
return error.userMessage;
|
|
95
100
|
const standardMessage = standardErrorMessage(error._tag);
|
|
@@ -99,12 +104,8 @@ export const analysisErrorUserMessage = (error) => {
|
|
|
99
104
|
return artifactMessage(error.reason);
|
|
100
105
|
if (error instanceof EvidenceIntegrityError)
|
|
101
106
|
return "Evidence is invalid or has changed. Recreate or re-import it, then try again.";
|
|
102
|
-
if (error instanceof EvidenceLimitError)
|
|
103
|
-
return "Evidence is too large for this session. Reduce the evidence set and try again.";
|
|
104
107
|
if (error instanceof EvidenceFileError)
|
|
105
108
|
return evidenceFileMessage(error.reason);
|
|
106
|
-
if (error instanceof InvestigationWorkspaceError)
|
|
107
|
-
return investigationWorkspaceMessage(error.reason);
|
|
108
109
|
if (error instanceof UnknownRegistryError && error.reason === "not-found")
|
|
109
110
|
return "The requested residual unknown does not exist in this session. Check the unknown_id and try again.";
|
|
110
111
|
if (error instanceof UnknownRegistryError)
|
|
@@ -120,6 +121,22 @@ export const analysisErrorUserMessage = (error) => {
|
|
|
120
121
|
"Process capture could not complete. Run `rea doctor`, then review capture policy and try again.");
|
|
121
122
|
return "Analysis could not complete. Run `rea doctor`, then try again.";
|
|
122
123
|
};
|
|
124
|
+
const hopperErrorUserMessage = (error) => {
|
|
125
|
+
if (error instanceof HopperTimeoutError) {
|
|
126
|
+
const request = error.operation ?? "startup";
|
|
127
|
+
return error.providerState === "busy"
|
|
128
|
+
? `Hopper timed out during ${request} while the provider remained busy. Check binary_session.analysis_activity, wait for the active request to finish, then retry.`
|
|
129
|
+
: `Hopper timed out during ${request} before it started. Check binary_session for provider health, then retry.`;
|
|
130
|
+
}
|
|
131
|
+
if (error instanceof HopperProcessError)
|
|
132
|
+
return `Hopper stopped during ${error.operation ?? "connection"}${error.exitCode === null ? "; its exit was not observed" : ` with exit code ${String(error.exitCode)}`}.${error.userMessage === undefined ? "" : ` ${error.userMessage}`} Check binary_session provider health before retrying.`;
|
|
133
|
+
if (error instanceof HopperStartError)
|
|
134
|
+
return (error.userMessage ??
|
|
135
|
+
"Hopper could not start. Check the launcher and target details, then retry opening the target.");
|
|
136
|
+
if (error instanceof HopperRemoteError)
|
|
137
|
+
return `Hopper ${error.operation ?? "analysis"} failed (${String(error.code)}, ${error.diagnosticType}): ${error.safeMessage}`;
|
|
138
|
+
return undefined;
|
|
139
|
+
};
|
|
123
140
|
const standardErrorMessage = (tag) => {
|
|
124
141
|
if (UNREADABLE_OUTPUT_TAGS.has(tag))
|
|
125
142
|
return "Analysis returned an unreadable result. Retry once; if it continues, run `rea doctor`.";
|
|
@@ -166,7 +183,7 @@ const artifactMessage = (reason) => {
|
|
|
166
183
|
if (reason === "limit")
|
|
167
184
|
return "Artifact is too large to process safely. Narrow the requested path or use a smaller artifact.";
|
|
168
185
|
if (reason === "path")
|
|
169
|
-
return "Artifact
|
|
186
|
+
return "Artifact contains an unsafe or conflicting internal path. Inspect the reported path and correct the artifact before retrying.";
|
|
170
187
|
if (reason === "policy")
|
|
171
188
|
return "Artifact integrity continuation is disabled by policy. Configure REA_ARTIFACT_INTEGRITY_CONTINUE_ENABLED=true and retry only if continuing after mismatches is approved.";
|
|
172
189
|
if (reason === "unavailable")
|
|
@@ -176,37 +193,14 @@ const artifactMessage = (reason) => {
|
|
|
176
193
|
return "Artifact could not be read or written. Check file access and try again.";
|
|
177
194
|
};
|
|
178
195
|
const evidenceFileMessage = (reason) => {
|
|
179
|
-
if (reason === "disabled")
|
|
180
|
-
return "Evidence file access is disabled. Enable an evidence directory or use inline evidence.";
|
|
181
|
-
if (reason === "outside-root")
|
|
182
|
-
return "Evidence path is outside the allowed directory. Choose a path inside the configured evidence directory.";
|
|
183
196
|
if (reason === "not-file")
|
|
184
|
-
return "Evidence path does not point to a file. Choose
|
|
185
|
-
if (reason === "too-large")
|
|
186
|
-
return "Evidence file is too large. Reduce its size and try again.";
|
|
197
|
+
return "Evidence path does not point to a regular file. Choose a file and try again.";
|
|
187
198
|
if (reason === "exists")
|
|
188
199
|
return "Evidence file already exists. Choose another path or allow overwrite.";
|
|
189
200
|
if (reason === "invalid-json")
|
|
190
201
|
return "Evidence file is not valid JSON. Repair or recreate the file and try again.";
|
|
191
202
|
return "Evidence file could not be accessed. Check file permissions and try again.";
|
|
192
203
|
};
|
|
193
|
-
const investigationWorkspaceMessage = (reason) => {
|
|
194
|
-
if (reason === "disabled")
|
|
195
|
-
return "Investigation workspace access is disabled. Configure a workspace directory and try again.";
|
|
196
|
-
if (reason === "outside-root")
|
|
197
|
-
return "Investigation workspace is outside the allowed directory. Choose a configured workspace directory and try again.";
|
|
198
|
-
if (reason === "not-file")
|
|
199
|
-
return "Investigation workspace path is not a file. Choose a workspace file and try again.";
|
|
200
|
-
if (reason === "too-large")
|
|
201
|
-
return "Investigation workspace is too large. Reduce its size and try again.";
|
|
202
|
-
if (reason === "invalid-json" || reason === "integrity")
|
|
203
|
-
return "Investigation workspace is invalid or has changed. Recreate or repair it, then try again.";
|
|
204
|
-
if (reason === "locked")
|
|
205
|
-
return "Another investigation update is in progress. Try again when it finishes.";
|
|
206
|
-
if (reason === "revision-conflict" || reason === "name-conflict")
|
|
207
|
-
return "Investigation workspace state changed. Refresh the current state and try again.";
|
|
208
|
-
return "Investigation workspace could not be accessed. Check file permissions and try again.";
|
|
209
|
-
};
|
|
210
204
|
const KNOWN_ERROR_TAGS = {
|
|
211
205
|
AnalysisProtocolError: true,
|
|
212
206
|
AnalysisInputError: true,
|
|
@@ -220,9 +214,7 @@ const KNOWN_ERROR_TAGS = {
|
|
|
220
214
|
ArtifactOperationError: true,
|
|
221
215
|
ProcessCaptureError: true,
|
|
222
216
|
EvidenceIntegrityError: true,
|
|
223
|
-
EvidenceLimitError: true,
|
|
224
217
|
EvidenceFileError: true,
|
|
225
|
-
InvestigationWorkspaceError: true,
|
|
226
218
|
UnknownRegistryError: true,
|
|
227
219
|
HopperTimeoutError: true,
|
|
228
220
|
HopperCancelledError: true,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisTimeoutError, ArtifactOperationError, BinaryTargetError, BrowserObservationError, EvidenceFileError,
|
|
1
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisTimeoutError, ArtifactOperationError, BinaryTargetError, BrowserObservationError, EvidenceFileError, EvidenceReferenceError, HopperCancelledError, HopperProcessError, HopperRemoteError, HopperTimeoutError, PermissionRequiredError, ProviderAdapterError, ProviderSelectionError, ReplayPlanStaleError, UnknownRegistryError, } from "./errors.js";
|
|
2
2
|
import { analysisErrorCategory, analysisErrorRemediationAction, analysisErrorUserMessage, assertKnownAnalysisErrorTag, } from "./analysisErrorPresentation.js";
|
|
3
3
|
/** Project expected failures into exhaustive, secret-safe caller fields. */
|
|
4
4
|
export const projectAnalysisError = (error) => {
|
|
@@ -12,9 +12,10 @@ export const projectAnalysisError = (error) => {
|
|
|
12
12
|
retryable: RETRYABLE_CODES.has(code),
|
|
13
13
|
remediation: {
|
|
14
14
|
action: analysisErrorRemediationAction(error),
|
|
15
|
-
restart_required: error instanceof PermissionRequiredError &&
|
|
15
|
+
restart_required: error instanceof PermissionRequiredError &&
|
|
16
|
+
error.remediation === "restart",
|
|
16
17
|
...(error instanceof PermissionRequiredError
|
|
17
|
-
? { elicitation_supported: error.
|
|
18
|
+
? { elicitation_supported: error.remediation === "elicit" }
|
|
18
19
|
: {}),
|
|
19
20
|
},
|
|
20
21
|
...(details === undefined ? {} : { details }),
|
|
@@ -37,8 +38,6 @@ const errorCode = (error) => {
|
|
|
37
38
|
return artifactOperationCode(error);
|
|
38
39
|
if (error instanceof EvidenceFileError)
|
|
39
40
|
return evidenceFileCode(error.reason);
|
|
40
|
-
if (error instanceof InvestigationWorkspaceError)
|
|
41
|
-
return investigationWorkspaceCode(error.reason);
|
|
42
41
|
if (error instanceof UnknownRegistryError)
|
|
43
42
|
return unknownRegistryCode(error.reason);
|
|
44
43
|
if (error._tag === "ProcessCaptureError")
|
|
@@ -65,28 +64,9 @@ const artifactOperationCode = (error) => {
|
|
|
65
64
|
return "cancelled";
|
|
66
65
|
return "artifact_operation_failed";
|
|
67
66
|
};
|
|
68
|
-
const evidenceFileCode = (reason) =>
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (reason === "too-large")
|
|
72
|
-
return "truncated";
|
|
73
|
-
if (reason === "disabled")
|
|
74
|
-
return "capability_unavailable";
|
|
75
|
-
return "execution_failure";
|
|
76
|
-
};
|
|
77
|
-
const investigationWorkspaceCode = (reason) => {
|
|
78
|
-
if (reason === "revision-conflict" || reason === "name-conflict")
|
|
79
|
-
return "revision_conflict";
|
|
80
|
-
if (reason === "too-large")
|
|
81
|
-
return "truncated";
|
|
82
|
-
if (reason === "disabled")
|
|
83
|
-
return "capability_unavailable";
|
|
84
|
-
if (reason === "outside-root")
|
|
85
|
-
return "outside_approved_root";
|
|
86
|
-
if (reason === "integrity" || reason === "invalid-json")
|
|
87
|
-
return "evidence_integrity_mismatch";
|
|
88
|
-
return "execution_failure";
|
|
89
|
-
};
|
|
67
|
+
const evidenceFileCode = (reason) => reason === "invalid-json"
|
|
68
|
+
? "evidence_integrity_mismatch"
|
|
69
|
+
: "execution_failure";
|
|
90
70
|
const unknownRegistryCode = (reason) => {
|
|
91
71
|
if (reason === "revision-conflict" || reason === "already-exists")
|
|
92
72
|
return "revision_conflict";
|
|
@@ -121,7 +101,6 @@ const STATIC_ERROR_CODES = {
|
|
|
121
101
|
NoBinaryOpenError: "target_unavailable",
|
|
122
102
|
BinaryTargetError: "target_unavailable",
|
|
123
103
|
EvidenceIntegrityError: "evidence_integrity_mismatch",
|
|
124
|
-
EvidenceLimitError: "truncated",
|
|
125
104
|
ProviderAdapterError: "execution_failure",
|
|
126
105
|
HopperRemoteError: "execution_failure",
|
|
127
106
|
};
|
|
@@ -130,7 +109,6 @@ const staticErrorCode = (tag) => {
|
|
|
130
109
|
case "ArtifactOperationError":
|
|
131
110
|
case "BrowserObservationError":
|
|
132
111
|
case "EvidenceFileError":
|
|
133
|
-
case "InvestigationWorkspaceError":
|
|
134
112
|
case "PermissionRequiredError":
|
|
135
113
|
case "ProcessCaptureError":
|
|
136
114
|
case "ProviderSelectionError":
|
|
@@ -194,10 +172,6 @@ const artifactStateErrorDetails = (error) => {
|
|
|
194
172
|
reason: error.reason,
|
|
195
173
|
...(error.reason === "limit" ? { truncated: true } : {}),
|
|
196
174
|
};
|
|
197
|
-
if (error instanceof EvidenceLimitError)
|
|
198
|
-
return { limit: error.limit, maximum: error.maximum, truncated: true };
|
|
199
|
-
if (error instanceof InvestigationWorkspaceError)
|
|
200
|
-
return { operation: error.operation, reason: error.reason };
|
|
201
175
|
if (error instanceof UnknownRegistryError)
|
|
202
176
|
return { reason: error.reason };
|
|
203
177
|
if (error instanceof EvidenceFileError)
|
|
@@ -237,11 +211,22 @@ const providerErrorDetails = (error) => {
|
|
|
237
211
|
if (error instanceof BrowserObservationError)
|
|
238
212
|
return { operation: error.operation, reason: error.reason };
|
|
239
213
|
if (error instanceof HopperRemoteError)
|
|
240
|
-
return { provider_code: error.code, diagnostic_type: error.diagnosticType };
|
|
241
|
-
if (error instanceof HopperProcessError && error.failureCode !== undefined)
|
|
242
214
|
return {
|
|
243
|
-
|
|
215
|
+
stage: "analysis",
|
|
216
|
+
provider_code: error.code,
|
|
217
|
+
diagnostic_type: error.diagnosticType,
|
|
218
|
+
...(error.operation === undefined ? {} : { operation: error.operation }),
|
|
219
|
+
...(error.requestId === undefined ? {} : { request_id: error.requestId }),
|
|
220
|
+
};
|
|
221
|
+
if (error instanceof HopperProcessError)
|
|
222
|
+
return {
|
|
244
223
|
exit_code: error.exitCode,
|
|
224
|
+
stage: error.operation === undefined ? "connection" : "analysis",
|
|
225
|
+
...(error.failureCode === undefined
|
|
226
|
+
? {}
|
|
227
|
+
: { failure_code: error.failureCode }),
|
|
228
|
+
...(error.operation === undefined ? {} : { operation: error.operation }),
|
|
229
|
+
...(error.requestId === undefined ? {} : { request_id: error.requestId }),
|
|
245
230
|
...(error.diagnostic === undefined
|
|
246
231
|
? {}
|
|
247
232
|
: { diagnostics: { ...error.diagnostic } }),
|
|
@@ -256,7 +241,13 @@ const lifecycleErrorDetails = (error) => {
|
|
|
256
241
|
if (error instanceof AnalysisTimeoutError)
|
|
257
242
|
return { operation: error.operation, timeout_ms: error.timeoutMs };
|
|
258
243
|
if (error instanceof HopperTimeoutError)
|
|
259
|
-
return {
|
|
244
|
+
return {
|
|
245
|
+
stage: error.operation === undefined ? "startup" : "analysis",
|
|
246
|
+
timeout_ms: error.timeoutMs,
|
|
247
|
+
provider_state: error.providerState,
|
|
248
|
+
...(error.operation === undefined ? {} : { operation: error.operation }),
|
|
249
|
+
...(error.requestId === undefined ? {} : { request_id: error.requestId }),
|
|
250
|
+
};
|
|
260
251
|
if (error._tag === "ProcessCaptureError" && error.cleanupIncomplete)
|
|
261
252
|
return {
|
|
262
253
|
cleanup: "incomplete",
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { isJsonWithinLimits } from "./jsonLimits.js";
|
|
5
4
|
import { jsonObjectSchema } from "./jsonValue.js";
|
|
6
|
-
const PROFILE_MAX_BYTES = 64 * 1024;
|
|
7
|
-
const PROFILE_JSON_LIMITS = Object.freeze({
|
|
8
|
-
maxDepth: 16,
|
|
9
|
-
maxStringLength: 16 * 1024,
|
|
10
|
-
maxNodes: 4_096,
|
|
11
|
-
});
|
|
12
5
|
const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
|
|
13
6
|
/** Concrete provider identity committed by an analysis profile. */
|
|
14
7
|
export const committedProviderSchema = z.object({
|
|
@@ -16,25 +9,9 @@ export const committedProviderSchema = z.object({
|
|
|
16
9
|
name: z.string().min(1),
|
|
17
10
|
version: z.string().min(1),
|
|
18
11
|
});
|
|
19
|
-
const boundedParametersSchema = jsonObjectSchema.superRefine((parameters, context) => {
|
|
20
|
-
if (!isJsonWithinLimits(parameters, PROFILE_JSON_LIMITS)) {
|
|
21
|
-
context.addIssue({
|
|
22
|
-
code: "custom",
|
|
23
|
-
message: "Analysis profile parameters exceed structural limits",
|
|
24
|
-
});
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
if (Buffer.byteLength(canonicalJson(parameters), "utf8") > PROFILE_MAX_BYTES)
|
|
28
|
-
context.addIssue({
|
|
29
|
-
code: "custom",
|
|
30
|
-
message: "Analysis profile parameters exceed the byte limit",
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
12
|
const unsignedAnalysisProfileSchema = z.object({
|
|
34
|
-
schema_version: z.literal(1),
|
|
35
13
|
provider: committedProviderSchema,
|
|
36
|
-
|
|
37
|
-
parameters: boundedParametersSchema,
|
|
14
|
+
parameters: jsonObjectSchema,
|
|
38
15
|
});
|
|
39
16
|
/** Canonical, provider-neutral commitment to analysis-affecting semantics. */
|
|
40
17
|
export const analysisProfileSchema = unsignedAnalysisProfileSchema
|
|
@@ -49,11 +26,9 @@ export const analysisProfileSchema = unsignedAnalysisProfileSchema
|
|
|
49
26
|
});
|
|
50
27
|
});
|
|
51
28
|
/** Create a validated RFC 8785 profile commitment at a provider boundary. */
|
|
52
|
-
export const createAnalysisProfile = (provider,
|
|
29
|
+
export const createAnalysisProfile = (provider, parameters) => {
|
|
53
30
|
const unsigned = unsignedAnalysisProfileSchema.parse({
|
|
54
|
-
schema_version: 1,
|
|
55
31
|
provider,
|
|
56
|
-
provider_profile_schema_version: providerProfileSchemaVersion,
|
|
57
32
|
parameters,
|
|
58
33
|
});
|
|
59
34
|
return analysisProfileSchema.parse({
|
|
@@ -65,10 +40,7 @@ export const createAnalysisProfile = (provider, providerProfileSchemaVersion, pa
|
|
|
65
40
|
export const analysisProfilesEqual = (left, right) => left.digest === right.digest &&
|
|
66
41
|
left.provider.id === right.provider.id &&
|
|
67
42
|
left.provider.name === right.provider.name &&
|
|
68
|
-
left.provider.version === right.provider.version
|
|
69
|
-
left.schema_version === right.schema_version &&
|
|
70
|
-
left.provider_profile_schema_version ===
|
|
71
|
-
right.provider_profile_schema_version;
|
|
43
|
+
left.provider.version === right.provider.version;
|
|
72
44
|
const profileDigest = (profile) => createHash("sha256").update(canonicalJson(profile)).digest("hex");
|
|
73
45
|
const canonicalJson = (value) => {
|
|
74
46
|
const encoded = canonicalize(value);
|
|
@@ -76,10 +76,9 @@ const entrySchema = z.object({
|
|
|
76
76
|
});
|
|
77
77
|
/** Provider- and profile-exact cache of successful immutable analysis calls. */
|
|
78
78
|
export const analysisSnapshotSchema = z.object({
|
|
79
|
-
snapshot_version: z.literal(2),
|
|
80
79
|
target: targetSchema,
|
|
81
80
|
binding: bindingSchema,
|
|
82
|
-
entries: z.array(entrySchema)
|
|
81
|
+
entries: z.array(entrySchema),
|
|
83
82
|
evidence_bundle: evidenceBundleSchema,
|
|
84
83
|
});
|
|
85
84
|
const canonicalJson = (value) => {
|
|
@@ -96,7 +95,7 @@ export const snapshotTarget = (target) => ({
|
|
|
96
95
|
format: target.format,
|
|
97
96
|
architecture: target.architecture ?? null,
|
|
98
97
|
});
|
|
99
|
-
/** Build the immutable provider/profile binding used by snapshot
|
|
98
|
+
/** Build the immutable provider/profile binding used by a cached snapshot. */
|
|
100
99
|
export const snapshotBinding = (profile) => bindingSchema.parse({
|
|
101
100
|
provider: profile.provider,
|
|
102
101
|
analysis_profile: profile,
|
|
@@ -161,9 +160,8 @@ export const createAnalysisSnapshotEntry = (input) => {
|
|
|
161
160
|
},
|
|
162
161
|
};
|
|
163
162
|
};
|
|
164
|
-
/** Parse
|
|
163
|
+
/** Parse a provider/profile-exact snapshot and verify its entries and evidence. */
|
|
165
164
|
export const parseAnalysisSnapshot = (input) => {
|
|
166
|
-
rejectLegacySnapshot(input);
|
|
167
165
|
const parsed = analysisSnapshotSchema.parse(input);
|
|
168
166
|
parseEvidenceBundle(parsed.evidence_bundle);
|
|
169
167
|
if (JSON.stringify(evidenceBundleForTarget(parsed.evidence_bundle, parsed.target.sha256)) !== JSON.stringify(parsed.evidence_bundle))
|
|
@@ -188,10 +186,3 @@ export const parseAnalysisSnapshot = (input) => {
|
|
|
188
186
|
};
|
|
189
187
|
/** Serialize a validated snapshot with byte-stable canonical entry ordering. */
|
|
190
188
|
export const serializeAnalysisSnapshot = (snapshot) => `${canonicalJson(parseAnalysisSnapshot(snapshot))}\n`;
|
|
191
|
-
const rejectLegacySnapshot = (input) => {
|
|
192
|
-
if (typeof input === "object" &&
|
|
193
|
-
input !== null &&
|
|
194
|
-
"snapshot_version" in input &&
|
|
195
|
-
input.snapshot_version === 1)
|
|
196
|
-
throw new TypeError("Analysis snapshot v1 is incompatible with profile-exact replay; recapture it as snapshot v2. Its Evidence bundle may be imported separately.");
|
|
197
|
-
};
|
|
@@ -2,33 +2,26 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { parseArtifactInventoryEvidence } from "./artifactInventoryEvidence.js";
|
|
5
|
-
import { projectBoundedCartesian } from "./boundedCartesianProjection.js";
|
|
6
5
|
import { evidenceSchema } from "./evidence.js";
|
|
7
6
|
const digestSchema = z.string().regex(/^[a-f0-9]{64}$/u);
|
|
8
7
|
const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
|
|
9
|
-
const pathSchema = z.string().min(1)
|
|
8
|
+
const pathSchema = z.string().min(1);
|
|
10
9
|
const componentSchema = z.strictObject({
|
|
11
10
|
path: pathSchema,
|
|
12
11
|
artifact_id: z.string().regex(/^art_[a-f0-9]{64}$/u),
|
|
13
12
|
sha256: digestSchema,
|
|
14
|
-
format: z.string().min(1)
|
|
13
|
+
format: z.string().min(1),
|
|
15
14
|
});
|
|
16
15
|
/** Authenticated APK inventory pages projected as one Android application. */
|
|
17
16
|
export const androidApplicationProjectionInputSchema = z.strictObject({
|
|
18
|
-
inventory_evidence: z.array(evidenceSchema).min(1)
|
|
19
|
-
limits: z
|
|
20
|
-
.strictObject({
|
|
21
|
-
max_components: z.number().int().min(1).max(10_000).default(1_000),
|
|
22
|
-
})
|
|
23
|
-
.default({ max_components: 1_000 }),
|
|
17
|
+
inventory_evidence: z.array(evidenceSchema).min(1),
|
|
24
18
|
});
|
|
25
19
|
/** Deterministic, execution-free Android application inventory projection. */
|
|
26
20
|
export const androidApplicationProjectionResultSchema = z.strictObject({
|
|
27
|
-
schema_version: z.literal(1),
|
|
28
21
|
projection_id: z.string().regex(/^adp_[a-f0-9]{64}$/u),
|
|
29
22
|
root_sha256: digestSchema,
|
|
30
23
|
root_format: z.literal("apk"),
|
|
31
|
-
source_evidence_ids: z.array(evidenceIdSchema).min(1)
|
|
24
|
+
source_evidence_ids: z.array(evidenceIdSchema).min(1),
|
|
32
25
|
components: z.strictObject({
|
|
33
26
|
manifests: z.array(componentSchema),
|
|
34
27
|
resources: z.array(componentSchema),
|
|
@@ -59,12 +52,10 @@ export const androidApplicationProjectionResultSchema = z.strictObject({
|
|
|
59
52
|
]),
|
|
60
53
|
})),
|
|
61
54
|
coverage: z.strictObject({
|
|
62
|
-
status: z.enum(["complete-within-inventory", "partial"
|
|
55
|
+
status: z.enum(["complete-within-inventory", "partial"]),
|
|
63
56
|
inventory_complete: z.boolean(),
|
|
64
|
-
omitted_components: z.number().int().min(0),
|
|
65
|
-
omitted_bridge_candidates: z.number().int().min(0),
|
|
66
57
|
}),
|
|
67
|
-
limitations: z.array(z.string().min(1)
|
|
58
|
+
limitations: z.array(z.string().min(1)),
|
|
68
59
|
});
|
|
69
60
|
/** Project exact APK paths and hashes without decoding or executing target code. */
|
|
70
61
|
export const projectAndroidApplication = (input) => {
|
|
@@ -87,28 +78,16 @@ export const projectAndroidApplication = (input) => {
|
|
|
87
78
|
};
|
|
88
79
|
});
|
|
89
80
|
const classified = classify(all);
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
const bridgeProjection = bridgeCandidates([...components.dex, ...components.jvm_classes], components.native_libraries, parsed.limits.max_components);
|
|
81
|
+
const bridgeProjection = bridgeCandidates([...classified.dex, ...classified.jvm_classes], classified.native_libraries);
|
|
82
|
+
const components = classified;
|
|
93
83
|
const limitations = [
|
|
94
84
|
...(!inventory.complete
|
|
95
85
|
? ["Source inventory pages are incomplete; absence is unknown."]
|
|
96
86
|
: []),
|
|
97
|
-
...(omittedComponents > 0
|
|
98
|
-
? [
|
|
99
|
-
`${String(omittedComponents)} component observations were omitted by the projection limit.`,
|
|
100
|
-
]
|
|
101
|
-
: []),
|
|
102
|
-
...(bridgeProjection.omitted > 0
|
|
103
|
-
? [
|
|
104
|
-
`${String(bridgeProjection.omitted)} bridge hypotheses were omitted by the projection limit.`,
|
|
105
|
-
]
|
|
106
|
-
: []),
|
|
107
87
|
"Manifest, resource, signing, and bytecode semantics require a dedicated Android provider; this projection reports exact inventory paths and hashes only.",
|
|
108
88
|
"Bridge candidates are path-based hypotheses, not decoded JNI declarations or observed runtime calls.",
|
|
109
89
|
];
|
|
110
90
|
const withoutId = {
|
|
111
|
-
schema_version: 1,
|
|
112
91
|
root_sha256: inventory.manifest.root_sha256,
|
|
113
92
|
root_format: "apk",
|
|
114
93
|
source_evidence_ids: evidence
|
|
@@ -118,14 +97,10 @@ export const projectAndroidApplication = (input) => {
|
|
|
118
97
|
runtime_families: runtimeFamilies(all),
|
|
119
98
|
bridge_candidates: bridgeProjection.candidates,
|
|
120
99
|
coverage: {
|
|
121
|
-
status:
|
|
122
|
-
? "
|
|
123
|
-
:
|
|
124
|
-
? "complete-within-inventory"
|
|
125
|
-
: "partial",
|
|
100
|
+
status: inventory.complete
|
|
101
|
+
? "complete-within-inventory"
|
|
102
|
+
: "partial",
|
|
126
103
|
inventory_complete: inventory.complete,
|
|
127
|
-
omitted_components: omittedComponents,
|
|
128
|
-
omitted_bridge_candidates: bridgeProjection.omitted,
|
|
129
104
|
},
|
|
130
105
|
limitations,
|
|
131
106
|
};
|
|
@@ -144,17 +119,6 @@ const classify = (all) => ({
|
|
|
144
119
|
javascript: all.filter(({ format }) => format === "javascript-bundle"),
|
|
145
120
|
signing: all.filter(({ path }) => /^META-INF\/[^/]+\.(?:MF|RSA|DSA|EC|SF)$/iu.test(path)),
|
|
146
121
|
});
|
|
147
|
-
const retain = (groups, maximum) => {
|
|
148
|
-
let remaining = maximum;
|
|
149
|
-
return Object.fromEntries(Object.entries(groups).map(([key, values]) => {
|
|
150
|
-
const selected = [...values]
|
|
151
|
-
.sort((left, right) => compare(left.path, right.path))
|
|
152
|
-
.slice(0, remaining);
|
|
153
|
-
remaining -= selected.length;
|
|
154
|
-
return [key, selected];
|
|
155
|
-
}));
|
|
156
|
-
};
|
|
157
|
-
const count = (groups) => Object.values(groups).reduce((total, values) => total + values.length, 0);
|
|
158
122
|
const runtimeFamilies = (all) => {
|
|
159
123
|
const paths = all.map(({ path }) => path.toLowerCase());
|
|
160
124
|
const families = new Set();
|
|
@@ -174,15 +138,14 @@ const runtimeFamilies = (all) => {
|
|
|
174
138
|
families.add("unity");
|
|
175
139
|
return [...families].sort(compare);
|
|
176
140
|
};
|
|
177
|
-
const bridgeCandidates = (managed, native
|
|
178
|
-
const
|
|
141
|
+
const bridgeCandidates = (managed, native) => {
|
|
142
|
+
const candidates = managed.flatMap((source) => native.map((target) => ({
|
|
179
143
|
managed_path: source.path,
|
|
180
144
|
native_path: target.path,
|
|
181
145
|
basis: bridgeBasis(target.path),
|
|
182
|
-
}));
|
|
146
|
+
})));
|
|
183
147
|
return {
|
|
184
|
-
candidates
|
|
185
|
-
omitted: projection.omitted,
|
|
148
|
+
candidates,
|
|
186
149
|
};
|
|
187
150
|
};
|
|
188
151
|
const bridgeBasis = (path) => {
|