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,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,35 +111,40 @@ 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) {
|
|
105
|
-
|
|
120
|
+
if (name === "trace_call_path") {
|
|
121
|
+
const parsed = enhancedInputSchemas.trace_call_path.safeParse(input);
|
|
122
|
+
if (!parsed.success)
|
|
123
|
+
return invalidEnhancedInput(name, parsed.error);
|
|
124
|
+
return this.executeValidated({ name, input: parsed.data }, signal);
|
|
125
|
+
}
|
|
126
|
+
if (name === "trace_feature") {
|
|
127
|
+
const parsed = enhancedInputSchemas.trace_feature.safeParse(input);
|
|
128
|
+
if (!parsed.success)
|
|
129
|
+
return invalidEnhancedInput(name, parsed.error);
|
|
130
|
+
return this.executeValidated({ name, input: parsed.data }, signal);
|
|
131
|
+
}
|
|
132
|
+
const parsed = enhancedInputSchemas.find_code_for_string.safeParse(input);
|
|
106
133
|
if (!parsed.success)
|
|
107
134
|
return invalidEnhancedInput(name, parsed.error);
|
|
108
|
-
|
|
109
|
-
return this.executeValidated({
|
|
110
|
-
name,
|
|
111
|
-
input: enhancedInputSchemas.trace_call_path.parse(parsed.data),
|
|
112
|
-
}, signal);
|
|
113
|
-
return this.executeValidated({
|
|
114
|
-
name,
|
|
115
|
-
input: enhancedInputSchemas[name].parse(parsed.data),
|
|
116
|
-
}, signal);
|
|
135
|
+
return this.executeValidated({ name, input: parsed.data }, signal);
|
|
117
136
|
}
|
|
118
137
|
#executeFunctionAnalysis(name, input, signal) {
|
|
119
|
-
|
|
138
|
+
if (name === "analyze_function") {
|
|
139
|
+
const parsed = enhancedInputSchemas.analyze_function.safeParse(input);
|
|
140
|
+
if (!parsed.success)
|
|
141
|
+
return invalidEnhancedInput(name, parsed.error);
|
|
142
|
+
return this.executeValidated({ name, input: parsed.data }, signal);
|
|
143
|
+
}
|
|
144
|
+
const parsed = enhancedInputSchemas.inspect_native_api.safeParse(input);
|
|
120
145
|
if (!parsed.success)
|
|
121
146
|
return invalidEnhancedInput(name, parsed.error);
|
|
122
|
-
|
|
123
|
-
return this.executeValidated({
|
|
124
|
-
name,
|
|
125
|
-
input: enhancedInputSchemas.analyze_function.parse(parsed.data),
|
|
126
|
-
}, signal);
|
|
127
|
-
return this.executeValidated({
|
|
128
|
-
name,
|
|
129
|
-
input: enhancedInputSchemas.inspect_native_api.parse(parsed.data),
|
|
130
|
-
}, signal);
|
|
147
|
+
return this.executeValidated({ name, input: parsed.data }, signal);
|
|
131
148
|
}
|
|
132
149
|
async #analyzeFunction(input, signal) {
|
|
133
150
|
const result = await this.#call("analyze_function", input, signal);
|
|
@@ -136,9 +153,6 @@ export class EnhancedTools {
|
|
|
136
153
|
async #inspectNativeApi(input, signal) {
|
|
137
154
|
const analysisInput = enhancedInputSchemas.analyze_function.parse({
|
|
138
155
|
procedure: input.procedure,
|
|
139
|
-
include_assembly: true,
|
|
140
|
-
max_pseudocode_chars: input.max_pseudocode_chars,
|
|
141
|
-
max_instructions: input.max_instructions,
|
|
142
156
|
});
|
|
143
157
|
const result = await this.#call("analyze_function", analysisInput, signal);
|
|
144
158
|
if (!result.ok)
|
|
@@ -149,16 +163,32 @@ export class EnhancedTools {
|
|
|
149
163
|
const dossier = functionDossierSchema.parse(parsed.value);
|
|
150
164
|
return ok(jsonValueSchema.parse(projectNativeApiInspection(dossier)));
|
|
151
165
|
}
|
|
152
|
-
async #swiftClasses(pattern, signal) {
|
|
153
|
-
const procedures = await this.#allAddressed("list_procedures", signal);
|
|
154
|
-
return procedures.ok
|
|
155
|
-
? ok(discoverSwiftClasses(procedures.value, pattern))
|
|
156
|
-
: procedures;
|
|
157
|
-
}
|
|
158
166
|
async #objcClasses(pattern, signal) {
|
|
159
167
|
const names = await this.#allAddressed("list_names", signal);
|
|
160
168
|
return names.ok ? ok(discoverObjcClasses(names.value, pattern)) : names;
|
|
161
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
|
+
}
|
|
162
192
|
async #objcProtocols(signal) {
|
|
163
193
|
const names = await this.#allAddressed("list_names", signal);
|
|
164
194
|
return names.ok ? ok(discoverObjcProtocols(names.value)) : names;
|
|
@@ -199,9 +229,8 @@ export class EnhancedTools {
|
|
|
199
229
|
const graph = {};
|
|
200
230
|
while (queueIndex < queue.length) {
|
|
201
231
|
const current = queue[queueIndex++];
|
|
202
|
-
if (current === undefined
|
|
232
|
+
if (current === undefined)
|
|
203
233
|
continue;
|
|
204
|
-
}
|
|
205
234
|
const level = String(current.depth);
|
|
206
235
|
graph[level] ??= [];
|
|
207
236
|
const result = await this.#call(tool, { procedure: current.address }, signal);
|
|
@@ -227,21 +256,19 @@ export class EnhancedTools {
|
|
|
227
256
|
status: "ok",
|
|
228
257
|
calls: [...related.value],
|
|
229
258
|
});
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
queue.push({ address, depth: current.depth + 1 });
|
|
235
|
-
}
|
|
259
|
+
for (const address of related.value) {
|
|
260
|
+
if (!discovered.has(address)) {
|
|
261
|
+
discovered.add(address);
|
|
262
|
+
queue.push({ address, depth: current.depth + 1 });
|
|
236
263
|
}
|
|
237
264
|
}
|
|
238
265
|
}
|
|
239
266
|
return ok(graph);
|
|
240
267
|
}
|
|
241
|
-
async #analyzeSwiftTypes(signal) {
|
|
268
|
+
async #analyzeSwiftTypes(input, signal) {
|
|
242
269
|
const procedures = await this.#allAddressed("list_procedures", signal);
|
|
243
270
|
return procedures.ok
|
|
244
|
-
? ok(categorizeSwiftTypes(procedures.value))
|
|
271
|
+
? ok(categorizeSwiftTypes(procedures.value, input))
|
|
245
272
|
: procedures;
|
|
246
273
|
}
|
|
247
274
|
async #findXrefs(name, signal) {
|
|
@@ -264,12 +291,12 @@ export class EnhancedTools {
|
|
|
264
291
|
xrefs: xrefs.value,
|
|
265
292
|
});
|
|
266
293
|
}
|
|
267
|
-
async #binaryOverview(
|
|
294
|
+
async #binaryOverview(signal) {
|
|
268
295
|
const [segmentsResult, documentsResult, proceduresResult, stringsResult] = await Promise.all([
|
|
269
296
|
this.#call("list_segments", {}, signal),
|
|
270
297
|
this.#call("list_documents", {}, signal),
|
|
271
|
-
this.#call("list_procedures", {
|
|
272
|
-
this.#call("list_strings", {
|
|
298
|
+
this.#call("list_procedures", {}, signal),
|
|
299
|
+
this.#call("list_strings", {}, signal),
|
|
273
300
|
]);
|
|
274
301
|
if (!segmentsResult.ok)
|
|
275
302
|
return segmentsResult;
|
|
@@ -293,28 +320,35 @@ export class EnhancedTools {
|
|
|
293
320
|
return stringCount;
|
|
294
321
|
return ok({
|
|
295
322
|
document: documents.value[0] ?? "unknown",
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
323
|
+
segments: segments.value.map(({ name, start, end }) => ({
|
|
324
|
+
name,
|
|
325
|
+
start,
|
|
326
|
+
end,
|
|
327
|
+
length: addressDistance(start, end),
|
|
328
|
+
})),
|
|
302
329
|
segment_count: segments.value.length,
|
|
303
330
|
procedure_count: procedureCount.value,
|
|
304
331
|
string_count: stringCount.value,
|
|
305
332
|
});
|
|
306
333
|
}
|
|
307
334
|
async #allAddressed(tool, signal) {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
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"));
|
|
313
344
|
}
|
|
314
345
|
async #call(name, arguments_, signal) {
|
|
315
|
-
if (signal
|
|
346
|
+
if (isAborted(signal))
|
|
316
347
|
return err(new AnalysisCancelledError(name));
|
|
317
348
|
const execution = await this.analysis.execute(name, arguments_, signal === undefined ? {} : { signal });
|
|
349
|
+
if (isAborted(signal))
|
|
350
|
+
return err(new AnalysisCancelledError(name));
|
|
318
351
|
return execution.ok ? ok(execution.value.result) : execution;
|
|
319
352
|
}
|
|
320
353
|
}
|
|
354
|
+
const isAborted = (signal) => signal?.aborted === true;
|
|
@@ -4,36 +4,40 @@ 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();
|
|
13
13
|
const imported = ledger.import(loaded.value);
|
|
14
14
|
return imported.ok
|
|
15
|
-
? ok({
|
|
15
|
+
? ok({
|
|
16
|
+
imported: imported.value.recordsAdded,
|
|
17
|
+
unknowns_added: imported.value.unknownsAdded,
|
|
18
|
+
total: ledger.export().records.length,
|
|
19
|
+
})
|
|
16
20
|
: imported;
|
|
17
21
|
};
|
|
18
22
|
/** Validate a source bundle and atomically export canonical bytes. */
|
|
19
|
-
export const exportEvidenceBundleCommand = async (sourcePath, outputPath, overwrite
|
|
20
|
-
const loaded = await readEvidenceBundle(sourcePath
|
|
23
|
+
export const exportEvidenceBundleCommand = async (sourcePath, outputPath, overwrite) => {
|
|
24
|
+
const loaded = await readEvidenceBundle(sourcePath);
|
|
21
25
|
if (!loaded.ok)
|
|
22
26
|
return loaded;
|
|
23
|
-
return projectWrite(loaded.value, await writeEvidenceBundle(loaded.value, outputPath, overwrite
|
|
27
|
+
return projectWrite(loaded.value, await writeEvidenceBundle(loaded.value, outputPath, overwrite));
|
|
24
28
|
};
|
|
25
|
-
/** Compare two validated canonical Evidence
|
|
29
|
+
/** Compare two validated canonical Evidence bundles without session state. */
|
|
26
30
|
export const compareEvidenceBundlesCommand = async (input) => {
|
|
27
31
|
const [left, right] = await Promise.all([
|
|
28
|
-
readEvidenceBundle(input.leftPath
|
|
29
|
-
readEvidenceBundle(input.rightPath
|
|
32
|
+
readEvidenceBundle(input.leftPath),
|
|
33
|
+
readEvidenceBundle(input.rightPath),
|
|
30
34
|
]);
|
|
31
35
|
if (!left.ok)
|
|
32
36
|
return left;
|
|
33
37
|
if (!right.ok)
|
|
34
38
|
return right;
|
|
35
39
|
try {
|
|
36
|
-
return ok(jsonValueSchema.parse(compareBundles(left.value, right.value
|
|
40
|
+
return ok(jsonValueSchema.parse(compareBundles(left.value, right.value)));
|
|
37
41
|
}
|
|
38
42
|
catch (cause) {
|
|
39
43
|
return err(new EvidenceIntegrityError("Evidence bundle comparison failed", {
|
|
@@ -41,7 +45,7 @@ export const compareEvidenceBundlesCommand = async (input) => {
|
|
|
41
45
|
}));
|
|
42
46
|
}
|
|
43
47
|
};
|
|
44
|
-
const createLedger = () => new EvidenceLedger(
|
|
48
|
+
const createLedger = () => new EvidenceLedger();
|
|
45
49
|
const projectWrite = (bundle, written) => written.ok
|
|
46
50
|
? ok({
|
|
47
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. */
|
|
@@ -63,6 +48,7 @@ export class EvidenceLedger {
|
|
|
63
48
|
pending.set(evidence.evidence_id, evidence);
|
|
64
49
|
}
|
|
65
50
|
const pendingUnknowns = new Map(this.#unknownRevisions);
|
|
51
|
+
let unknownsAdded = 0;
|
|
66
52
|
for (const unknown of bundle.unknowns) {
|
|
67
53
|
const key = unknownRevisionKey(unknown);
|
|
68
54
|
const existing = pendingUnknowns.get(key);
|
|
@@ -70,6 +56,8 @@ export class EvidenceLedger {
|
|
|
70
56
|
existing.revision_digest !== unknown.revision_digest)
|
|
71
57
|
return err(new EvidenceIntegrityError("Conflicting unknown revision"));
|
|
72
58
|
pendingUnknowns.set(key, unknown);
|
|
59
|
+
if (existing === undefined)
|
|
60
|
+
unknownsAdded += 1;
|
|
73
61
|
}
|
|
74
62
|
const checked = this.#validateCandidate(pending, pendingUnknowns);
|
|
75
63
|
if (!checked.ok) {
|
|
@@ -80,8 +68,12 @@ export class EvidenceLedger {
|
|
|
80
68
|
return err(checked.error);
|
|
81
69
|
}
|
|
82
70
|
const added = pending.size - this.#records.size;
|
|
83
|
-
this.#commit(pending, pendingUnknowns
|
|
84
|
-
return ok(
|
|
71
|
+
this.#commit(pending, pendingUnknowns);
|
|
72
|
+
return ok({
|
|
73
|
+
recordsAdded: added,
|
|
74
|
+
unknownsAdded,
|
|
75
|
+
changed: added > 0 || unknownsAdded > 0,
|
|
76
|
+
});
|
|
85
77
|
}
|
|
86
78
|
/** Export records in deterministic, semantically irrelevant ID order. */
|
|
87
79
|
export() {
|
|
@@ -118,7 +110,7 @@ export class EvidenceLedger {
|
|
|
118
110
|
return err(new UnknownRegistryError("already-exists"));
|
|
119
111
|
return this.#appendUnknown(unknown, parsedMutation);
|
|
120
112
|
}
|
|
121
|
-
/** Atomically record derived Evidence and
|
|
113
|
+
/** Atomically record derived Evidence and a linked residual unknown. */
|
|
122
114
|
recordWithUnknown(evidenceInput, input, mutationInput) {
|
|
123
115
|
let evidence;
|
|
124
116
|
let mutation;
|
|
@@ -199,7 +191,6 @@ export class EvidenceLedger {
|
|
|
199
191
|
this.#records.clear();
|
|
200
192
|
this.#unknownRevisions.clear();
|
|
201
193
|
this.#unknownHeads.clear();
|
|
202
|
-
this.#bytes = 0;
|
|
203
194
|
}
|
|
204
195
|
#appendUnknown(unknown, mutationEvidenceInput) {
|
|
205
196
|
let mutationEvidence;
|
|
@@ -218,7 +209,6 @@ export class EvidenceLedger {
|
|
|
218
209
|
}
|
|
219
210
|
#appendIncremental(records, unknown) {
|
|
220
211
|
const additions = new Map();
|
|
221
|
-
let addedBytes = 0;
|
|
222
212
|
for (const evidence of records) {
|
|
223
213
|
const existing = additions.get(evidence.evidence_id) ??
|
|
224
214
|
this.#records.get(evidence.evidence_id);
|
|
@@ -228,16 +218,10 @@ export class EvidenceLedger {
|
|
|
228
218
|
continue;
|
|
229
219
|
}
|
|
230
220
|
additions.set(evidence.evidence_id, evidence);
|
|
231
|
-
addedBytes += serializedBytes(evidence);
|
|
232
221
|
}
|
|
233
222
|
const unknownKey = unknown === undefined ? undefined : unknownRevisionKey(unknown);
|
|
234
223
|
if (unknownKey !== undefined && this.#unknownRevisions.has(unknownKey))
|
|
235
224
|
return err(new UnknownRegistryError("integrity"));
|
|
236
|
-
const unknownBytes = unknown === undefined ? 0 : serializedBytes(unknown);
|
|
237
|
-
if (this.#exceedsRecordLimit(this.#records.size + additions.size, this.#unknownRevisions.size + (unknown === undefined ? 0 : 1)))
|
|
238
|
-
return err(new EvidenceLimitError("records", this.limits.maxRecords));
|
|
239
|
-
if (this.#bytes + addedBytes + unknownBytes > this.limits.maxBytes)
|
|
240
|
-
return err(new EvidenceLimitError("bytes", this.limits.maxBytes));
|
|
241
225
|
if (unknown !== undefined)
|
|
242
226
|
try {
|
|
243
227
|
validateResidualUnknownAddition(unknown, {
|
|
@@ -254,28 +238,18 @@ export class EvidenceLedger {
|
|
|
254
238
|
this.#unknownRevisions.set(unknownKey, unknown);
|
|
255
239
|
this.#unknownHeads.set(unknown.unknown_id, unknown);
|
|
256
240
|
}
|
|
257
|
-
this.#bytes += addedBytes + unknownBytes;
|
|
258
241
|
return ok(undefined);
|
|
259
242
|
}
|
|
260
243
|
#validateCandidate(records, unknowns) {
|
|
261
|
-
if (this.#exceedsRecordLimit(records.size, unknowns.size))
|
|
262
|
-
return err(new EvidenceLimitError("records", this.limits.maxRecords));
|
|
263
|
-
const bytes = [...records.values()].reduce((total, evidence) => total + serializedBytes(evidence), 0) +
|
|
264
|
-
[...unknowns.values()].reduce((total, unknown) => total + serializedBytes(unknown), 0);
|
|
265
|
-
if (bytes > this.limits.maxBytes)
|
|
266
|
-
return err(new EvidenceLimitError("bytes", this.limits.maxBytes));
|
|
267
244
|
try {
|
|
268
245
|
parseEvidenceBundle(createEvidenceBundle([...records.values()], [...unknowns.values()]));
|
|
269
246
|
}
|
|
270
247
|
catch (cause) {
|
|
271
248
|
return err(new UnknownRegistryError("integrity", { cause }));
|
|
272
249
|
}
|
|
273
|
-
return ok(
|
|
274
|
-
}
|
|
275
|
-
#exceedsRecordLimit(recordCount, unknownCount) {
|
|
276
|
-
return recordCount + unknownCount > this.limits.maxRecords;
|
|
250
|
+
return ok(undefined);
|
|
277
251
|
}
|
|
278
|
-
#commit(records, unknowns
|
|
252
|
+
#commit(records, unknowns) {
|
|
279
253
|
this.#records.clear();
|
|
280
254
|
for (const [id, evidence] of records)
|
|
281
255
|
this.#records.set(id, evidence);
|
|
@@ -287,10 +261,8 @@ export class EvidenceLedger {
|
|
|
287
261
|
if (head === undefined || head.revision < unknown.revision)
|
|
288
262
|
this.#unknownHeads.set(unknown.unknown_id, unknown);
|
|
289
263
|
}
|
|
290
|
-
this.#bytes = bytes;
|
|
291
264
|
}
|
|
292
265
|
}
|
|
293
|
-
const serializedBytes = (value) => Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
294
266
|
const unknownRevisionKey = (unknown) => `${unknown.unknown_id}:${String(unknown.revision)}`;
|
|
295
267
|
const recordsAgree = (left, right) => canonicalize(withoutLocalPath(left)) ===
|
|
296
268
|
canonicalize(withoutLocalPath(right));
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
import { isPathWithinRoot } from "../domain/localPath.js";
|
|
1
2
|
import { createHash } from "node:crypto";
|
|
2
3
|
import { constants as fsConstants } from "node:fs";
|
|
3
4
|
import { lstat, open, readdir, readlink } from "node:fs/promises";
|
|
4
5
|
import { dirname, join, relative, resolve } from "node:path";
|
|
5
|
-
const isWithin = (candidate, root) => candidate === root ||
|
|
6
|
-
candidate.startsWith(`${root.endsWith("/") ? root.slice(0, -1) : root}/`);
|
|
7
6
|
const hasSameIdentity = (before, after, expected) => before.dev === after.dev &&
|
|
8
7
|
before.ino === after.ino &&
|
|
9
8
|
(expected === "directory" ? after.isDirectory() : after.isSymbolicLink());
|
|
@@ -66,7 +65,7 @@ export const snapshotRoots = async (scenario, signal) => {
|
|
|
66
65
|
truncated = true;
|
|
67
66
|
return;
|
|
68
67
|
}
|
|
69
|
-
const safeTarget =
|
|
68
|
+
const safeTarget = isPathWithinRoot(root, target)
|
|
70
69
|
? relative(root, target) || "."
|
|
71
70
|
: "<outside-declared-root>";
|
|
72
71
|
if (safeTarget === "<outside-declared-root>")
|