rea-agents 3.1.0 → 3.2.1
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 +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- 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/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- 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/CapabilityInventory.js +10 -15
- 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 +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- 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 +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- 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/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- 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 +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- 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 +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- 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 -96
- 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 +19 -45
- 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 -93
- 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/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- 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 +15 -24
- 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 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- 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 +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- 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 +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- 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 +0 -54
- 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 +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- 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 +2 -2
- 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 +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- 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 +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- 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 -54
- package/dist/domain/appleApplication.js +24 -67
- 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 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- 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 +20 -19
- package/dist/domain/callPath.js +47 -167
- 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 +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- 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 +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- 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 +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- 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 +68 -75
- 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 +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- 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 +2 -7
- 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 +1 -5
- 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/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- 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 +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- 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 +36 -38
- 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 +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- 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 +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- 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 +33 -73
- 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 -41
- 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 +4 -12
- 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 +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- 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 +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- 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/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- 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 +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- 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 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- 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 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- 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
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { projectPermissionFailure } from "./PermissionFailure.js";
|
|
2
|
+
import { AnalysisCapabilityUnavailableError, } from "../domain/errors.js";
|
|
2
3
|
import { err, ok } from "../domain/result.js";
|
|
3
4
|
import { createElectronEvidence } from "./ElectronEvidence.js";
|
|
4
|
-
/** Authorize and list
|
|
5
|
+
/** Authorize and list Electron file pages exposed by the selected endpoint. */
|
|
5
6
|
export const listElectronTargets = async (provider, authority, input, options = {}) => {
|
|
6
7
|
const ready = await prepare(provider, authority, input, "list_electron_targets");
|
|
7
8
|
if (!ready.ok)
|
|
@@ -26,20 +27,15 @@ const prepare = async (provider, authority, input, operation) => {
|
|
|
26
27
|
return err(new AnalysisCapabilityUnavailableError("rea-cdp-electron", operation, "Electron observation permission policy is not configured"));
|
|
27
28
|
const authorized = await authority.authorize({
|
|
28
29
|
capability: "electron_observe",
|
|
29
|
-
roots:
|
|
30
|
+
roots: [],
|
|
30
31
|
executables: [],
|
|
31
32
|
environment_names: [],
|
|
32
|
-
origins: [input.cdp_endpoint],
|
|
33
33
|
network: "loopback",
|
|
34
34
|
mount: false,
|
|
35
35
|
operation_identity: `${operation}:${"target_id" in input ? input.target_id : input.cdp_endpoint}`,
|
|
36
36
|
}, "read");
|
|
37
37
|
if (!authorized.ok)
|
|
38
|
-
return err(authorized.error
|
|
39
|
-
? authorized.error
|
|
40
|
-
: new AnalysisProtocolError(authorized.error.message, {
|
|
41
|
-
cause: authorized.error,
|
|
42
|
-
}));
|
|
38
|
+
return err(projectPermissionFailure(authorized.error));
|
|
43
39
|
return provider === undefined
|
|
44
40
|
? err(new AnalysisCapabilityUnavailableError("rea-cdp-electron", operation, "Electron observation provider is not configured"))
|
|
45
41
|
: ok(provider);
|
|
@@ -1,86 +1,78 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { AnalysisOutputError } from "../domain/errors.js";
|
|
2
|
-
import { parseAddressedPage } from "../domain/hopperValues.js";
|
|
3
3
|
import { err, ok } from "../domain/result.js";
|
|
4
4
|
const FEATURE_SEARCH_SOURCES = [
|
|
5
|
-
["
|
|
6
|
-
["
|
|
5
|
+
["search_strings", "string"],
|
|
6
|
+
["search_procedures", "procedure"],
|
|
7
7
|
];
|
|
8
8
|
const STRING_SEARCH_SOURCES = [
|
|
9
|
-
["
|
|
9
|
+
["search_strings", "string"],
|
|
10
10
|
];
|
|
11
|
-
/** Trace
|
|
11
|
+
/** Trace every matching feature or string literal through provider xrefs. */
|
|
12
12
|
export const traceLiteralFeature = async (call, input, scope, signal) => {
|
|
13
13
|
const sources = scope === "feature" ? FEATURE_SEARCH_SOURCES : STRING_SEARCH_SOURCES;
|
|
14
14
|
const searched = await literalMatches(call, input, sources, signal);
|
|
15
15
|
if (!searched.ok)
|
|
16
16
|
return searched;
|
|
17
|
-
const residual = new Set();
|
|
18
17
|
const traced = await traceReferences(call, {
|
|
19
18
|
matches: searched.value.matches,
|
|
20
|
-
limit: input.limit,
|
|
21
|
-
operationBudget: input.max_operations - searched.value.operations,
|
|
22
19
|
...(signal === undefined ? {} : { signal }),
|
|
23
20
|
});
|
|
24
21
|
if (!traced.ok)
|
|
25
22
|
return traced;
|
|
26
|
-
for (const reason of traced.value.residual)
|
|
27
|
-
residual.add(reason);
|
|
28
|
-
const operations = searched.value.operations + traced.value.operations;
|
|
29
|
-
if (operations >= input.max_operations)
|
|
30
|
-
residual.add("Investigation reached the operation budget.");
|
|
31
|
-
if (searched.value.matches.length >= input.limit)
|
|
32
|
-
residual.add("Literal matches reached the configured limit.");
|
|
33
23
|
return ok({
|
|
34
24
|
query: input.query,
|
|
35
25
|
search_mode: "literal",
|
|
36
|
-
operations_used: operations,
|
|
37
|
-
operation_budget: input.max_operations,
|
|
38
26
|
matches: searched.value.matches,
|
|
39
27
|
references: traced.value.references,
|
|
40
|
-
truncated:
|
|
41
|
-
residual_unknowns: [
|
|
28
|
+
truncated: false,
|
|
29
|
+
residual_unknowns: [],
|
|
42
30
|
});
|
|
43
31
|
};
|
|
44
32
|
const literalMatches = async (call, input, sources, signal) => {
|
|
45
|
-
let operations = 0;
|
|
46
33
|
const matches = [];
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
34
|
+
const needles = [...new Set(input.query.trim().split(/\s+/u))];
|
|
35
|
+
const matched = new Set();
|
|
36
|
+
for (const needle of needles) {
|
|
37
|
+
for (const [tool, type] of sources) {
|
|
38
|
+
const result = await call(tool, {
|
|
39
|
+
pattern: needle,
|
|
40
|
+
mode: "literal",
|
|
41
|
+
case_sensitive: input.case_sensitive,
|
|
42
|
+
}, signal);
|
|
53
43
|
if (!result.ok)
|
|
54
44
|
return result;
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
offset = page.value.nextOffset;
|
|
45
|
+
const items = z
|
|
46
|
+
.array(z.object({ address: z.string(), value: z.string() }))
|
|
47
|
+
.safeParse(result.value);
|
|
48
|
+
if (!items.success)
|
|
49
|
+
return err(new AnalysisOutputError(tool, "provider returned an invalid search result"));
|
|
50
|
+
addPageMatches({
|
|
51
|
+
items: items.data.map(({ address, value: name }) => ({
|
|
52
|
+
address,
|
|
53
|
+
name,
|
|
54
|
+
})),
|
|
55
|
+
type,
|
|
56
|
+
matches,
|
|
57
|
+
matched,
|
|
58
|
+
});
|
|
70
59
|
}
|
|
71
60
|
}
|
|
72
|
-
return ok({ matches
|
|
61
|
+
return ok({ matches });
|
|
62
|
+
};
|
|
63
|
+
const addPageMatches = (input) => {
|
|
64
|
+
const { items, type, matches, matched } = input;
|
|
65
|
+
for (const item of items) {
|
|
66
|
+
const key = `${type}\u0000${item.address}`;
|
|
67
|
+
if (matched.has(key))
|
|
68
|
+
continue;
|
|
69
|
+
matches.push({ type, address: item.address, value: item.name });
|
|
70
|
+
matched.add(key);
|
|
71
|
+
}
|
|
73
72
|
};
|
|
74
73
|
const traceReferences = async (call, request) => {
|
|
75
|
-
let operations = 0;
|
|
76
74
|
const references = [];
|
|
77
|
-
const residual = new Set();
|
|
78
75
|
for (const match of request.matches) {
|
|
79
|
-
if (operations >= request.operationBudget) {
|
|
80
|
-
residual.add("Reference traversal stopped at the operation budget.");
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
operations += 1;
|
|
84
76
|
const xrefs = await call("xrefs", { address: match.address }, request.signal);
|
|
85
77
|
if (!xrefs.ok)
|
|
86
78
|
return xrefs;
|
|
@@ -89,11 +81,6 @@ const traceReferences = async (call, request) => {
|
|
|
89
81
|
for (const source of xrefs.value) {
|
|
90
82
|
if (typeof source !== "string")
|
|
91
83
|
return err(new AnalysisOutputError("xrefs", "provider returned a non-address value"));
|
|
92
|
-
if (operations >= request.operationBudget) {
|
|
93
|
-
residual.add("Containing-procedure resolution stopped at the operation budget.");
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
operations += 1;
|
|
97
84
|
const resolved = await call("resolve_containing_procedure", { address: source }, request.signal);
|
|
98
85
|
if (!resolved.ok)
|
|
99
86
|
return resolved;
|
|
@@ -102,17 +89,7 @@ const traceReferences = async (call, request) => {
|
|
|
102
89
|
source_address: source,
|
|
103
90
|
containing_procedure: resolved.value,
|
|
104
91
|
});
|
|
105
|
-
if (references.length >= request.limit) {
|
|
106
|
-
residual.add("Reference results reached the configured limit.");
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
92
|
}
|
|
110
|
-
if (references.length >= request.limit)
|
|
111
|
-
break;
|
|
112
93
|
}
|
|
113
|
-
return ok({
|
|
114
|
-
references,
|
|
115
|
-
operations,
|
|
116
|
-
residual: [...residual],
|
|
117
|
-
});
|
|
94
|
+
return ok({ references });
|
|
118
95
|
};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { enhancedInputSchemas } from "../contracts/enhancedInputs.js";
|
|
2
3
|
import { AnalysisCancelledError, AnalysisOutputError, projectAnalysisError, } from "../domain/errors.js";
|
|
3
4
|
import { addressDistance, functionDossierSchema, parseDocuments, parseFunctionDossier, parseListCount, parseRelatedAddresses, parseSegments, } from "../domain/hopperValues.js";
|
|
4
5
|
import { err, ok } from "../domain/result.js";
|
|
5
|
-
import { categorizeSwiftTypes, discoverObjcClasses, discoverObjcProtocols,
|
|
6
|
+
import { categorizeSwiftTypes, discoverObjcClasses, discoverObjcProtocols, } from "../domain/symbolAnalysis.js";
|
|
7
|
+
import { inspectNativeDispatchMetadata, nativeDispatchMetadataResultSchema, } from "../domain/objcSwiftMetadata.js";
|
|
8
|
+
import { traceNativeUiAction } from "./NativeUiActionTrace.js";
|
|
6
9
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
7
10
|
import { invalidEnhancedInput, } from "./EnhancedToolTypes.js";
|
|
8
|
-
import { readAllAddressed } from "./EnhancedToolPagination.js";
|
|
9
11
|
import { traceCallPath } from "./CallPathTracing.js";
|
|
10
12
|
import { traceLiteralFeature } from "./EnhancedLiteralTracing.js";
|
|
11
13
|
import { projectNativeApiInspection } from "./NativeApiInspection.js";
|
|
@@ -25,11 +27,17 @@ export class EnhancedTools {
|
|
|
25
27
|
name === "find_code_for_string" ||
|
|
26
28
|
name === "trace_call_path")
|
|
27
29
|
return this.#executeTracing(name, input, signal);
|
|
30
|
+
if (name === "trace_native_ui_action") {
|
|
31
|
+
const parsed = enhancedInputSchemas.trace_native_ui_action.safeParse(input);
|
|
32
|
+
return parsed.success
|
|
33
|
+
? this.executeValidated({ name, input: parsed.data }, signal)
|
|
34
|
+
: invalidEnhancedInput(name, parsed.error);
|
|
35
|
+
}
|
|
28
36
|
if (name === "analyze_function" || name === "inspect_native_api")
|
|
29
37
|
return this.#executeFunctionAnalysis(name, input, signal);
|
|
30
38
|
switch (name) {
|
|
31
|
-
case "
|
|
32
|
-
const parsed = enhancedInputSchemas.
|
|
39
|
+
case "inspect_native_dispatch_metadata": {
|
|
40
|
+
const parsed = enhancedInputSchemas.inspect_native_dispatch_metadata.safeParse(input);
|
|
33
41
|
return parsed.success
|
|
34
42
|
? this.executeValidated({ name, input: parsed.data }, signal)
|
|
35
43
|
: invalidEnhancedInput(name, parsed.error);
|
|
@@ -54,8 +62,12 @@ export class EnhancedTools {
|
|
|
54
62
|
? this.executeValidated({ name, input: parsed.data }, signal)
|
|
55
63
|
: invalidEnhancedInput(name, parsed.error);
|
|
56
64
|
}
|
|
57
|
-
case "analyze_swift_types":
|
|
58
|
-
|
|
65
|
+
case "analyze_swift_types": {
|
|
66
|
+
const parsed = enhancedInputSchemas.analyze_swift_types.safeParse(input);
|
|
67
|
+
return parsed.success
|
|
68
|
+
? this.executeValidated({ name, input: parsed.data }, signal)
|
|
69
|
+
: invalidEnhancedInput(name, parsed.error);
|
|
70
|
+
}
|
|
59
71
|
case "find_xrefs_to_name": {
|
|
60
72
|
const parsed = enhancedInputSchemas.find_xrefs_to_name.safeParse(input);
|
|
61
73
|
return parsed.success
|
|
@@ -73,8 +85,8 @@ export class EnhancedTools {
|
|
|
73
85
|
/** Dispatch input already parsed by a trusted adapter boundary. */
|
|
74
86
|
executeValidated(call, signal) {
|
|
75
87
|
switch (call.name) {
|
|
76
|
-
case "
|
|
77
|
-
return this.#
|
|
88
|
+
case "inspect_native_dispatch_metadata":
|
|
89
|
+
return this.#inspectNativeDispatchMetadata(call.input.max_records, signal);
|
|
78
90
|
case "get_objc_classes":
|
|
79
91
|
return this.#objcClasses(call.input.pattern, signal);
|
|
80
92
|
case "get_objc_protocols":
|
|
@@ -84,11 +96,11 @@ export class EnhancedTools {
|
|
|
84
96
|
case "get_call_graph":
|
|
85
97
|
return this.#callGraph(call.input, signal);
|
|
86
98
|
case "analyze_swift_types":
|
|
87
|
-
return this.#analyzeSwiftTypes(signal);
|
|
99
|
+
return this.#analyzeSwiftTypes(call.input, signal);
|
|
88
100
|
case "find_xrefs_to_name":
|
|
89
101
|
return this.#findXrefs(call.input.name, signal);
|
|
90
102
|
case "binary_overview":
|
|
91
|
-
return this.#binaryOverview(
|
|
103
|
+
return this.#binaryOverview(signal);
|
|
92
104
|
case "analyze_function":
|
|
93
105
|
return this.#analyzeFunction(call.input, signal);
|
|
94
106
|
case "inspect_native_api":
|
|
@@ -99,6 +111,9 @@ export class EnhancedTools {
|
|
|
99
111
|
return traceLiteralFeature((name, arguments_, operationSignal) => this.#call(name, arguments_, operationSignal), call.input, "string", signal);
|
|
100
112
|
case "trace_call_path":
|
|
101
113
|
return traceCallPath((name, arguments_, operationSignal) => this.#call(name, arguments_, operationSignal), call.input, signal);
|
|
114
|
+
case "trace_native_ui_action": {
|
|
115
|
+
return traceNativeUiAction(this.analysis, call.input, signal);
|
|
116
|
+
}
|
|
102
117
|
}
|
|
103
118
|
}
|
|
104
119
|
#executeTracing(name, input, signal) {
|
|
@@ -138,9 +153,6 @@ export class EnhancedTools {
|
|
|
138
153
|
async #inspectNativeApi(input, signal) {
|
|
139
154
|
const analysisInput = enhancedInputSchemas.analyze_function.parse({
|
|
140
155
|
procedure: input.procedure,
|
|
141
|
-
include_assembly: true,
|
|
142
|
-
max_pseudocode_chars: input.max_pseudocode_chars,
|
|
143
|
-
max_instructions: input.max_instructions,
|
|
144
156
|
});
|
|
145
157
|
const result = await this.#call("analyze_function", analysisInput, signal);
|
|
146
158
|
if (!result.ok)
|
|
@@ -151,16 +163,32 @@ export class EnhancedTools {
|
|
|
151
163
|
const dossier = functionDossierSchema.parse(parsed.value);
|
|
152
164
|
return ok(jsonValueSchema.parse(projectNativeApiInspection(dossier)));
|
|
153
165
|
}
|
|
154
|
-
async #swiftClasses(pattern, signal) {
|
|
155
|
-
const procedures = await this.#allAddressed("list_procedures", signal);
|
|
156
|
-
return procedures.ok
|
|
157
|
-
? ok(discoverSwiftClasses(procedures.value, pattern))
|
|
158
|
-
: procedures;
|
|
159
|
-
}
|
|
160
166
|
async #objcClasses(pattern, signal) {
|
|
161
167
|
const names = await this.#allAddressed("list_names", signal);
|
|
162
168
|
return names.ok ? ok(discoverObjcClasses(names.value, pattern)) : names;
|
|
163
169
|
}
|
|
170
|
+
async #inspectNativeDispatchMetadata(maxRecords, signal) {
|
|
171
|
+
const execution = await this.analysis.execute("list_names", {}, signal === undefined ? {} : { signal });
|
|
172
|
+
if (!execution.ok)
|
|
173
|
+
return err(execution.error);
|
|
174
|
+
const names = z
|
|
175
|
+
.array(z.union([
|
|
176
|
+
z.strictObject({ address: z.string(), value: z.string() }),
|
|
177
|
+
z.strictObject({ address: z.string(), name: z.string() }),
|
|
178
|
+
]))
|
|
179
|
+
.safeParse(execution.value.result);
|
|
180
|
+
if (!names.success)
|
|
181
|
+
return err(new AnalysisOutputError("list_names", "provider returned an invalid inventory"));
|
|
182
|
+
return ok(nativeDispatchMetadataResultSchema.parse({
|
|
183
|
+
target_sha256: execution.value.subject?.sha256 ?? null,
|
|
184
|
+
provider: execution.value.provider,
|
|
185
|
+
analysis_profile_digest: execution.value.analysisProfile?.digest ?? null,
|
|
186
|
+
result: inspectNativeDispatchMetadata(names.data.map((entry) => ({
|
|
187
|
+
address: entry.address,
|
|
188
|
+
name: "value" in entry ? entry.value : entry.name,
|
|
189
|
+
})), maxRecords),
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
164
192
|
async #objcProtocols(signal) {
|
|
165
193
|
const names = await this.#allAddressed("list_names", signal);
|
|
166
194
|
return names.ok ? ok(discoverObjcProtocols(names.value)) : names;
|
|
@@ -201,9 +229,8 @@ export class EnhancedTools {
|
|
|
201
229
|
const graph = {};
|
|
202
230
|
while (queueIndex < queue.length) {
|
|
203
231
|
const current = queue[queueIndex++];
|
|
204
|
-
if (current === undefined
|
|
232
|
+
if (current === undefined)
|
|
205
233
|
continue;
|
|
206
|
-
}
|
|
207
234
|
const level = String(current.depth);
|
|
208
235
|
graph[level] ??= [];
|
|
209
236
|
const result = await this.#call(tool, { procedure: current.address }, signal);
|
|
@@ -229,21 +256,19 @@ export class EnhancedTools {
|
|
|
229
256
|
status: "ok",
|
|
230
257
|
calls: [...related.value],
|
|
231
258
|
});
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
queue.push({ address, depth: current.depth + 1 });
|
|
237
|
-
}
|
|
259
|
+
for (const address of related.value) {
|
|
260
|
+
if (!discovered.has(address)) {
|
|
261
|
+
discovered.add(address);
|
|
262
|
+
queue.push({ address, depth: current.depth + 1 });
|
|
238
263
|
}
|
|
239
264
|
}
|
|
240
265
|
}
|
|
241
266
|
return ok(graph);
|
|
242
267
|
}
|
|
243
|
-
async #analyzeSwiftTypes(signal) {
|
|
268
|
+
async #analyzeSwiftTypes(input, signal) {
|
|
244
269
|
const procedures = await this.#allAddressed("list_procedures", signal);
|
|
245
270
|
return procedures.ok
|
|
246
|
-
? ok(categorizeSwiftTypes(procedures.value))
|
|
271
|
+
? ok(categorizeSwiftTypes(procedures.value, input))
|
|
247
272
|
: procedures;
|
|
248
273
|
}
|
|
249
274
|
async #findXrefs(name, signal) {
|
|
@@ -266,12 +291,12 @@ export class EnhancedTools {
|
|
|
266
291
|
xrefs: xrefs.value,
|
|
267
292
|
});
|
|
268
293
|
}
|
|
269
|
-
async #binaryOverview(
|
|
294
|
+
async #binaryOverview(signal) {
|
|
270
295
|
const [segmentsResult, documentsResult, proceduresResult, stringsResult] = await Promise.all([
|
|
271
296
|
this.#call("list_segments", {}, signal),
|
|
272
297
|
this.#call("list_documents", {}, signal),
|
|
273
|
-
this.#call("list_procedures", {
|
|
274
|
-
this.#call("list_strings", {
|
|
298
|
+
this.#call("list_procedures", {}, signal),
|
|
299
|
+
this.#call("list_strings", {}, signal),
|
|
275
300
|
]);
|
|
276
301
|
if (!segmentsResult.ok)
|
|
277
302
|
return segmentsResult;
|
|
@@ -295,28 +320,35 @@ export class EnhancedTools {
|
|
|
295
320
|
return stringCount;
|
|
296
321
|
return ok({
|
|
297
322
|
document: documents.value[0] ?? "unknown",
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
323
|
+
segments: segments.value.map(({ name, start, end }) => ({
|
|
324
|
+
name,
|
|
325
|
+
start,
|
|
326
|
+
end,
|
|
327
|
+
length: addressDistance(start, end),
|
|
328
|
+
})),
|
|
304
329
|
segment_count: segments.value.length,
|
|
305
330
|
procedure_count: procedureCount.value,
|
|
306
331
|
string_count: stringCount.value,
|
|
307
332
|
});
|
|
308
333
|
}
|
|
309
334
|
async #allAddressed(tool, signal) {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
335
|
+
const result = await this.#call(tool, {}, signal);
|
|
336
|
+
if (!result.ok)
|
|
337
|
+
return result;
|
|
338
|
+
const parsed = z
|
|
339
|
+
.array(z.object({ address: z.string(), value: z.string() }))
|
|
340
|
+
.safeParse(result.value);
|
|
341
|
+
return parsed.success
|
|
342
|
+
? ok(parsed.data.map(({ address, value: name }) => ({ address, name })))
|
|
343
|
+
: err(new AnalysisOutputError(tool, "provider returned an invalid inventory"));
|
|
315
344
|
}
|
|
316
345
|
async #call(name, arguments_, signal) {
|
|
317
|
-
if (signal
|
|
346
|
+
if (isAborted(signal))
|
|
318
347
|
return err(new AnalysisCancelledError(name));
|
|
319
348
|
const execution = await this.analysis.execute(name, arguments_, signal === undefined ? {} : { signal });
|
|
349
|
+
if (isAborted(signal))
|
|
350
|
+
return err(new AnalysisCancelledError(name));
|
|
320
351
|
return execution.ok ? ok(execution.value.result) : execution;
|
|
321
352
|
}
|
|
322
353
|
}
|
|
354
|
+
const isAborted = (signal) => signal?.aborted === true;
|
|
@@ -4,9 +4,9 @@ import { err, ok } from "../domain/result.js";
|
|
|
4
4
|
import { compareBundles } from "../domain/bundleComparison.js";
|
|
5
5
|
import { EvidenceLedger } from "./EvidenceLedger.js";
|
|
6
6
|
import { readEvidenceBundle, writeEvidenceBundle, } from "./EvidenceBundleFiles.js";
|
|
7
|
-
/** Validate and merge one bundle using the
|
|
8
|
-
export const importEvidenceBundleCommand = async (path
|
|
9
|
-
const loaded = await readEvidenceBundle(path
|
|
7
|
+
/** Validate and merge one bundle using the session Evidence ledger. */
|
|
8
|
+
export const importEvidenceBundleCommand = async (path) => {
|
|
9
|
+
const loaded = await readEvidenceBundle(path);
|
|
10
10
|
if (!loaded.ok)
|
|
11
11
|
return loaded;
|
|
12
12
|
const ledger = createLedger();
|
|
@@ -20,24 +20,24 @@ export const importEvidenceBundleCommand = async (path, policy) => {
|
|
|
20
20
|
: imported;
|
|
21
21
|
};
|
|
22
22
|
/** Validate a source bundle and atomically export canonical bytes. */
|
|
23
|
-
export const exportEvidenceBundleCommand = async (sourcePath, outputPath, overwrite
|
|
24
|
-
const loaded = await readEvidenceBundle(sourcePath
|
|
23
|
+
export const exportEvidenceBundleCommand = async (sourcePath, outputPath, overwrite) => {
|
|
24
|
+
const loaded = await readEvidenceBundle(sourcePath);
|
|
25
25
|
if (!loaded.ok)
|
|
26
26
|
return loaded;
|
|
27
|
-
return projectWrite(loaded.value, await writeEvidenceBundle(loaded.value, outputPath, overwrite
|
|
27
|
+
return projectWrite(loaded.value, await writeEvidenceBundle(loaded.value, outputPath, overwrite));
|
|
28
28
|
};
|
|
29
|
-
/** Compare two validated canonical Evidence
|
|
29
|
+
/** Compare two validated canonical Evidence bundles without session state. */
|
|
30
30
|
export const compareEvidenceBundlesCommand = async (input) => {
|
|
31
31
|
const [left, right] = await Promise.all([
|
|
32
|
-
readEvidenceBundle(input.leftPath
|
|
33
|
-
readEvidenceBundle(input.rightPath
|
|
32
|
+
readEvidenceBundle(input.leftPath),
|
|
33
|
+
readEvidenceBundle(input.rightPath),
|
|
34
34
|
]);
|
|
35
35
|
if (!left.ok)
|
|
36
36
|
return left;
|
|
37
37
|
if (!right.ok)
|
|
38
38
|
return right;
|
|
39
39
|
try {
|
|
40
|
-
return ok(jsonValueSchema.parse(compareBundles(left.value, right.value
|
|
40
|
+
return ok(jsonValueSchema.parse(compareBundles(left.value, right.value)));
|
|
41
41
|
}
|
|
42
42
|
catch (cause) {
|
|
43
43
|
return err(new EvidenceIntegrityError("Evidence bundle comparison failed", {
|
|
@@ -45,7 +45,7 @@ export const compareEvidenceBundlesCommand = async (input) => {
|
|
|
45
45
|
}));
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
|
-
const createLedger = () => new EvidenceLedger(
|
|
48
|
+
const createLedger = () => new EvidenceLedger();
|
|
49
49
|
const projectWrite = (bundle, written) => written.ok
|
|
50
50
|
? ok({
|
|
51
51
|
path: written.value.path,
|
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
import { parseEvidenceBundle, serializeEvidenceBundle, } from "../domain/evidenceBundle.js";
|
|
2
2
|
import { EvidenceFileError, EvidenceIntegrityError } from "../domain/errors.js";
|
|
3
3
|
import { err, ok } from "../domain/result.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
/** Read and validate
|
|
7
|
-
export const readEvidenceBundle = async (path
|
|
8
|
-
|
|
9
|
-
return err(new EvidenceFileError("read", "disabled"));
|
|
10
|
-
const loaded = await readBoundedJson(path, policy);
|
|
4
|
+
import { parseProcessCapture } from "../domain/processCapture.js";
|
|
5
|
+
import { readJsonFile, writeTextFile } from "./JsonFiles.js";
|
|
6
|
+
/** Read and validate an evidence bundle at the caller-supplied path. */
|
|
7
|
+
export const readEvidenceBundle = async (path) => {
|
|
8
|
+
const loaded = await readJsonFile(path);
|
|
11
9
|
if (!loaded.ok)
|
|
12
10
|
return loaded;
|
|
13
11
|
try {
|
|
14
12
|
const bundle = parseEvidenceBundle(loaded.value);
|
|
15
13
|
for (const record of bundle.records) {
|
|
16
|
-
if (record.predicate_type === "rea.process-capture
|
|
17
|
-
throw new TypeError(LEGACY_PROCESS_CAPTURE_MESSAGE);
|
|
18
|
-
if (record.predicate_type === "rea.process-capture/v4")
|
|
14
|
+
if (record.predicate_type === "rea.process-capture")
|
|
19
15
|
parseProcessCapture(record.normalized_result);
|
|
20
16
|
}
|
|
21
17
|
return ok(bundle);
|
|
@@ -26,10 +22,8 @@ export const readEvidenceBundle = async (path, policy) => {
|
|
|
26
22
|
}));
|
|
27
23
|
}
|
|
28
24
|
};
|
|
29
|
-
/** Atomically write deterministic evidence JSON
|
|
30
|
-
export const writeEvidenceBundle = async (bundle, path, overwrite
|
|
31
|
-
if (policy.roots.length === 0)
|
|
32
|
-
return err(new EvidenceFileError("write", "disabled"));
|
|
25
|
+
/** Atomically write deterministic evidence JSON at the caller-supplied path. */
|
|
26
|
+
export const writeEvidenceBundle = async (bundle, path, overwrite) => {
|
|
33
27
|
let encoded;
|
|
34
28
|
try {
|
|
35
29
|
encoded = serializeEvidenceBundle(bundle);
|
|
@@ -39,5 +33,5 @@ export const writeEvidenceBundle = async (bundle, path, overwrite, policy) => {
|
|
|
39
33
|
cause,
|
|
40
34
|
}));
|
|
41
35
|
}
|
|
42
|
-
return
|
|
36
|
+
return writeTextFile(encoded, path, overwrite);
|
|
43
37
|
};
|
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
import canonicalize from "canonicalize";
|
|
2
2
|
import { createEvidenceBundle, parseEvidenceBundle, validateResidualUnknownAddition, } from "../domain/evidenceBundle.js";
|
|
3
|
-
import { EvidenceIntegrityError,
|
|
3
|
+
import { EvidenceIntegrityError, UnknownRegistryError, } from "../domain/errors.js";
|
|
4
4
|
import { parseEvidence } from "../domain/evidence.js";
|
|
5
5
|
import { createResidualUnknown, updateResidualUnknown, } from "../domain/residualUnknown.js";
|
|
6
6
|
import { err, ok } from "../domain/result.js";
|
|
7
|
-
/**
|
|
7
|
+
/** Session-owned set of immutable evidence records. */
|
|
8
8
|
export class EvidenceLedger {
|
|
9
|
-
limits;
|
|
10
9
|
#records = new Map();
|
|
11
10
|
#unknownRevisions = new Map();
|
|
12
11
|
#unknownHeads = new Map();
|
|
13
|
-
#bytes = 0;
|
|
14
|
-
constructor(limits) {
|
|
15
|
-
this.limits = limits;
|
|
16
|
-
if (!Number.isSafeInteger(limits.maxRecords) || limits.maxRecords < 1)
|
|
17
|
-
throw new RangeError("maxRecords must be a positive safe integer");
|
|
18
|
-
if (!Number.isSafeInteger(limits.maxBytes) || limits.maxBytes < 1)
|
|
19
|
-
throw new RangeError("maxBytes must be a positive safe integer");
|
|
20
|
-
}
|
|
21
12
|
/** Record evidence idempotently; conflicting content is rejected. */
|
|
22
13
|
record(input) {
|
|
23
14
|
let evidence;
|
|
@@ -35,13 +26,7 @@ export class EvidenceLedger {
|
|
|
35
26
|
? ok("duplicate")
|
|
36
27
|
: err(new EvidenceIntegrityError("Conflicting evidence record"));
|
|
37
28
|
}
|
|
38
|
-
if (this.#exceedsRecordLimit(this.#records.size + 1, this.#unknownRevisions.size))
|
|
39
|
-
return err(new EvidenceLimitError("records", this.limits.maxRecords));
|
|
40
|
-
const bytes = serializedBytes(evidence);
|
|
41
|
-
if (this.#bytes + bytes > this.limits.maxBytes)
|
|
42
|
-
return err(new EvidenceLimitError("bytes", this.limits.maxBytes));
|
|
43
29
|
this.#records.set(evidence.evidence_id, evidence);
|
|
44
|
-
this.#bytes += bytes;
|
|
45
30
|
return ok("added");
|
|
46
31
|
}
|
|
47
32
|
/** Validate an entire bundle before atomically merging its records. */
|
|
@@ -83,7 +68,7 @@ export class EvidenceLedger {
|
|
|
83
68
|
return err(checked.error);
|
|
84
69
|
}
|
|
85
70
|
const added = pending.size - this.#records.size;
|
|
86
|
-
this.#commit(pending, pendingUnknowns
|
|
71
|
+
this.#commit(pending, pendingUnknowns);
|
|
87
72
|
return ok({
|
|
88
73
|
recordsAdded: added,
|
|
89
74
|
unknownsAdded,
|
|
@@ -125,7 +110,7 @@ export class EvidenceLedger {
|
|
|
125
110
|
return err(new UnknownRegistryError("already-exists"));
|
|
126
111
|
return this.#appendUnknown(unknown, parsedMutation);
|
|
127
112
|
}
|
|
128
|
-
/** Atomically record derived Evidence and
|
|
113
|
+
/** Atomically record derived Evidence and a linked residual unknown. */
|
|
129
114
|
recordWithUnknown(evidenceInput, input, mutationInput) {
|
|
130
115
|
let evidence;
|
|
131
116
|
let mutation;
|
|
@@ -206,7 +191,6 @@ export class EvidenceLedger {
|
|
|
206
191
|
this.#records.clear();
|
|
207
192
|
this.#unknownRevisions.clear();
|
|
208
193
|
this.#unknownHeads.clear();
|
|
209
|
-
this.#bytes = 0;
|
|
210
194
|
}
|
|
211
195
|
#appendUnknown(unknown, mutationEvidenceInput) {
|
|
212
196
|
let mutationEvidence;
|
|
@@ -225,7 +209,6 @@ export class EvidenceLedger {
|
|
|
225
209
|
}
|
|
226
210
|
#appendIncremental(records, unknown) {
|
|
227
211
|
const additions = new Map();
|
|
228
|
-
let addedBytes = 0;
|
|
229
212
|
for (const evidence of records) {
|
|
230
213
|
const existing = additions.get(evidence.evidence_id) ??
|
|
231
214
|
this.#records.get(evidence.evidence_id);
|
|
@@ -235,16 +218,10 @@ export class EvidenceLedger {
|
|
|
235
218
|
continue;
|
|
236
219
|
}
|
|
237
220
|
additions.set(evidence.evidence_id, evidence);
|
|
238
|
-
addedBytes += serializedBytes(evidence);
|
|
239
221
|
}
|
|
240
222
|
const unknownKey = unknown === undefined ? undefined : unknownRevisionKey(unknown);
|
|
241
223
|
if (unknownKey !== undefined && this.#unknownRevisions.has(unknownKey))
|
|
242
224
|
return err(new UnknownRegistryError("integrity"));
|
|
243
|
-
const unknownBytes = unknown === undefined ? 0 : serializedBytes(unknown);
|
|
244
|
-
if (this.#exceedsRecordLimit(this.#records.size + additions.size, this.#unknownRevisions.size + (unknown === undefined ? 0 : 1)))
|
|
245
|
-
return err(new EvidenceLimitError("records", this.limits.maxRecords));
|
|
246
|
-
if (this.#bytes + addedBytes + unknownBytes > this.limits.maxBytes)
|
|
247
|
-
return err(new EvidenceLimitError("bytes", this.limits.maxBytes));
|
|
248
225
|
if (unknown !== undefined)
|
|
249
226
|
try {
|
|
250
227
|
validateResidualUnknownAddition(unknown, {
|
|
@@ -261,28 +238,18 @@ export class EvidenceLedger {
|
|
|
261
238
|
this.#unknownRevisions.set(unknownKey, unknown);
|
|
262
239
|
this.#unknownHeads.set(unknown.unknown_id, unknown);
|
|
263
240
|
}
|
|
264
|
-
this.#bytes += addedBytes + unknownBytes;
|
|
265
241
|
return ok(undefined);
|
|
266
242
|
}
|
|
267
243
|
#validateCandidate(records, unknowns) {
|
|
268
|
-
if (this.#exceedsRecordLimit(records.size, unknowns.size))
|
|
269
|
-
return err(new EvidenceLimitError("records", this.limits.maxRecords));
|
|
270
|
-
const bytes = [...records.values()].reduce((total, evidence) => total + serializedBytes(evidence), 0) +
|
|
271
|
-
[...unknowns.values()].reduce((total, unknown) => total + serializedBytes(unknown), 0);
|
|
272
|
-
if (bytes > this.limits.maxBytes)
|
|
273
|
-
return err(new EvidenceLimitError("bytes", this.limits.maxBytes));
|
|
274
244
|
try {
|
|
275
245
|
parseEvidenceBundle(createEvidenceBundle([...records.values()], [...unknowns.values()]));
|
|
276
246
|
}
|
|
277
247
|
catch (cause) {
|
|
278
248
|
return err(new UnknownRegistryError("integrity", { cause }));
|
|
279
249
|
}
|
|
280
|
-
return ok(
|
|
281
|
-
}
|
|
282
|
-
#exceedsRecordLimit(recordCount, unknownCount) {
|
|
283
|
-
return recordCount + unknownCount > this.limits.maxRecords;
|
|
250
|
+
return ok(undefined);
|
|
284
251
|
}
|
|
285
|
-
#commit(records, unknowns
|
|
252
|
+
#commit(records, unknowns) {
|
|
286
253
|
this.#records.clear();
|
|
287
254
|
for (const [id, evidence] of records)
|
|
288
255
|
this.#records.set(id, evidence);
|
|
@@ -294,10 +261,8 @@ export class EvidenceLedger {
|
|
|
294
261
|
if (head === undefined || head.revision < unknown.revision)
|
|
295
262
|
this.#unknownHeads.set(unknown.unknown_id, unknown);
|
|
296
263
|
}
|
|
297
|
-
this.#bytes = bytes;
|
|
298
264
|
}
|
|
299
265
|
}
|
|
300
|
-
const serializedBytes = (value) => Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
301
266
|
const unknownRevisionKey = (unknown) => `${unknown.unknown_id}:${String(unknown.revision)}`;
|
|
302
267
|
const recordsAgree = (left, right) => canonicalize(withoutLocalPath(left)) ===
|
|
303
268
|
canonicalize(withoutLocalPath(right));
|