rea-agents 3.1.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 +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
|
@@ -21,29 +21,53 @@ const inspectIpcCall = (node, context) => {
|
|
|
21
21
|
const channel = channelValue.status === "literal" && typeof channelValue.value === "string"
|
|
22
22
|
? channelValue.value
|
|
23
23
|
: null;
|
|
24
|
-
const
|
|
25
|
-
?
|
|
26
|
-
|
|
27
|
-
:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
const channelReference = channel === null
|
|
25
|
+
? {
|
|
26
|
+
channel: null,
|
|
27
|
+
channel_expression: channelValue.status === "dynamic"
|
|
28
|
+
? channelValue.expression
|
|
29
|
+
: boundedExpression(context.source, channelNode),
|
|
30
|
+
}
|
|
31
|
+
: { channel, channel_expression: null };
|
|
32
|
+
const handlerNode = descriptor.mode === "listen" || descriptor.mode === "handle"
|
|
33
|
+
? argumentNode(node.arguments[1])
|
|
34
|
+
: undefined;
|
|
35
|
+
const findingState = descriptor.mode === "send"
|
|
36
|
+
? {
|
|
37
|
+
...descriptor,
|
|
38
|
+
handler_kind: null,
|
|
39
|
+
handler_location: null,
|
|
40
|
+
}
|
|
41
|
+
: descriptor.mode === "invoke"
|
|
42
|
+
? {
|
|
43
|
+
...descriptor,
|
|
44
|
+
handler_kind: null,
|
|
45
|
+
handler_location: null,
|
|
46
|
+
}
|
|
47
|
+
: handlerNode === undefined
|
|
48
|
+
? {
|
|
49
|
+
...descriptor,
|
|
50
|
+
handler_kind: "missing",
|
|
51
|
+
handler_location: null,
|
|
52
|
+
}
|
|
53
|
+
: {
|
|
54
|
+
...descriptor,
|
|
55
|
+
handler_kind: handlerKind(handlerNode),
|
|
56
|
+
handler_location: range(handlerNode),
|
|
57
|
+
};
|
|
31
58
|
if (channel === null)
|
|
32
59
|
context.accumulator.unknownFindings += 1;
|
|
33
|
-
if (
|
|
60
|
+
if (findingState.handler_kind === "missing")
|
|
34
61
|
context.accumulator.unknownFindings += 1;
|
|
35
62
|
const finding = {
|
|
36
|
-
...
|
|
37
|
-
|
|
38
|
-
channel_expression: channelExpression,
|
|
39
|
-
handler_kind: hasHandler ? handlerKind(handlerNode) : null,
|
|
40
|
-
handler_location: handlerNode === undefined ? null : range(handlerNode),
|
|
63
|
+
...findingState,
|
|
64
|
+
...channelReference,
|
|
41
65
|
module_key: null,
|
|
42
66
|
location: range(node),
|
|
43
67
|
};
|
|
44
68
|
addLocatedFinding(context, {
|
|
45
69
|
collection: context.accumulator.ipc,
|
|
46
|
-
key: `electron-ipc\0${descriptor.side}\0${descriptor.operation}\0${channel ??
|
|
70
|
+
key: `electron-ipc\0${descriptor.side}\0${descriptor.operation}\0${channelReference.channel ?? channelReference.channel_expression}`,
|
|
47
71
|
node,
|
|
48
72
|
value: finding,
|
|
49
73
|
});
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as t from "@babel/types";
|
|
2
2
|
import { addLocatedFinding } from "./javascriptStaticAnalysisFindings.js";
|
|
3
3
|
import { argumentNode, calleeName, compareCodePoints, propertyName, range, stringValue, } from "./javascriptStaticAnalysisHelpers.js";
|
|
4
|
-
const MAX_NATIVE_MEMBERS = 64;
|
|
5
4
|
/** Inspect JavaScript-side imports and re-exports of native .node addons. */
|
|
6
5
|
export const inspectElectronNativeNode = (node, context) => {
|
|
7
6
|
if (t.isImportDeclaration(node))
|
|
@@ -91,12 +90,7 @@ const addBinding = (input) => {
|
|
|
91
90
|
const unique = [
|
|
92
91
|
...new Set(input.members.filter((member) => member !== "")),
|
|
93
92
|
].sort(compareCodePoints);
|
|
94
|
-
const members =
|
|
95
|
-
const omitted = Math.max(0, unique.length - MAX_NATIVE_MEMBERS);
|
|
96
|
-
if (omitted > 0) {
|
|
97
|
-
context.accumulator.structuralTruncation = true;
|
|
98
|
-
context.accumulator.droppedFindings += omitted;
|
|
99
|
-
}
|
|
93
|
+
const members = unique.length === 0 ? ["*"] : unique;
|
|
100
94
|
addLocatedFinding(context, {
|
|
101
95
|
collection: context.accumulator.nativeAddonBindings,
|
|
102
96
|
key: `native-addon-binding\0${kind}\0${specifier}\0${members.join("\0")}`,
|
|
@@ -105,7 +99,6 @@ const addBinding = (input) => {
|
|
|
105
99
|
specifier,
|
|
106
100
|
binding_kind: kind,
|
|
107
101
|
members,
|
|
108
|
-
members_truncated: omitted > 0,
|
|
109
102
|
module_key: null,
|
|
110
103
|
location: range(node),
|
|
111
104
|
},
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as t from "@babel/types";
|
|
2
2
|
import { compareCodePoints, propertyName, sourceSlice, } from "./javascriptStaticAnalysisHelpers.js";
|
|
3
|
-
|
|
4
|
-
/** Preserve one literal value or the exact bounded inert expression. */
|
|
3
|
+
/** Preserve one literal value or the exact inert expression. */
|
|
5
4
|
export const electronStaticValue = (source, node) => {
|
|
6
5
|
const literal = literalValue(node);
|
|
7
6
|
return literal.found
|
|
@@ -12,17 +11,16 @@ export const electronStaticValue = (source, node) => {
|
|
|
12
11
|
expression: boundedExpression(source, node),
|
|
13
12
|
};
|
|
14
13
|
};
|
|
15
|
-
/** Return an actionable
|
|
14
|
+
/** Return an actionable expression without evaluating it. */
|
|
16
15
|
export const boundedExpression = (source, node) => {
|
|
17
16
|
if (node === null || node === undefined)
|
|
18
17
|
return "[missing-expression]";
|
|
19
18
|
const expression = sourceSlice(source, node).trim();
|
|
20
|
-
return
|
|
19
|
+
return expression === "" ? `[${node.type}]` : expression;
|
|
21
20
|
};
|
|
22
21
|
/** Read one named object property without following spreads or bindings. */
|
|
23
22
|
export const objectProperty = (object, name) => object.properties.find((property) => t.isObjectProperty(property) && propertyName(property.key) === name);
|
|
24
|
-
|
|
25
|
-
export const handlerKind = (node) => {
|
|
23
|
+
export function handlerKind(node) {
|
|
26
24
|
if (node === null || node === undefined)
|
|
27
25
|
return "missing";
|
|
28
26
|
if (t.isArrowFunctionExpression(node) ||
|
|
@@ -34,22 +32,20 @@ export const handlerKind = (node) => {
|
|
|
34
32
|
if (t.isMemberExpression(node) || t.isOptionalMemberExpression(node))
|
|
35
33
|
return "member-expression";
|
|
36
34
|
return "dynamic-expression";
|
|
37
|
-
}
|
|
38
|
-
/** Collect
|
|
39
|
-
export const collectContextBridgeMembers = (node
|
|
35
|
+
}
|
|
36
|
+
/** Collect statically visible dotted keys from one literal contextBridge API object. */
|
|
37
|
+
export const collectContextBridgeMembers = (node) => {
|
|
40
38
|
if (node === null || node === undefined)
|
|
41
39
|
return {
|
|
42
40
|
status: "missing",
|
|
43
41
|
members: [],
|
|
44
42
|
unknown: 0,
|
|
45
|
-
omitted: 0,
|
|
46
43
|
};
|
|
47
44
|
if (!t.isObjectExpression(node))
|
|
48
45
|
return {
|
|
49
46
|
status: "dynamic",
|
|
50
47
|
members: [],
|
|
51
48
|
unknown: 1,
|
|
52
|
-
omitted: 0,
|
|
53
49
|
};
|
|
54
50
|
const state = {
|
|
55
51
|
members: [],
|
|
@@ -59,9 +55,8 @@ export const collectContextBridgeMembers = (node, maximum = 128) => {
|
|
|
59
55
|
const members = [...new Set(state.members)].sort(compareCodePoints);
|
|
60
56
|
return {
|
|
61
57
|
status: "object-literal",
|
|
62
|
-
members
|
|
58
|
+
members,
|
|
63
59
|
unknown: state.unknown,
|
|
64
|
-
omitted: Math.max(0, members.length - maximum),
|
|
65
60
|
};
|
|
66
61
|
};
|
|
67
62
|
const collectMembersAt = (object, prefix, depth, state) => {
|
|
@@ -79,7 +74,7 @@ const collectMembersAt = (object, prefix, depth, state) => {
|
|
|
79
74
|
state.unknown += 1;
|
|
80
75
|
continue;
|
|
81
76
|
}
|
|
82
|
-
const path =
|
|
77
|
+
const path = prefix === "" ? name : `${prefix}.${name}`;
|
|
83
78
|
state.members.push(path);
|
|
84
79
|
if (t.isObjectProperty(property) && t.isObjectExpression(property.value))
|
|
85
80
|
collectMembersAt(property.value, path, depth + 1, state);
|
|
@@ -95,9 +90,7 @@ const literalValue = (node) => {
|
|
|
95
90
|
if (t.isTemplateLiteral(node) && node.expressions.length === 0)
|
|
96
91
|
return {
|
|
97
92
|
found: true,
|
|
98
|
-
value:
|
|
99
|
-
node.quasis[0]?.value.raw ??
|
|
100
|
-
"").slice(0, MAX_EXPRESSION_CHARACTERS),
|
|
93
|
+
value: node.quasis[0]?.value.cooked ?? node.quasis[0]?.value.raw ?? "",
|
|
101
94
|
};
|
|
102
95
|
if (t.isUnaryExpression(node, { operator: "-" }) &&
|
|
103
96
|
t.isNumericLiteral(node.argument))
|
package/dist/domain/errors.js
CHANGED
|
@@ -15,9 +15,7 @@ const ANALYSIS_ERROR_TAGS = [
|
|
|
15
15
|
"ArtifactOperationError",
|
|
16
16
|
"ProcessCaptureError",
|
|
17
17
|
"EvidenceIntegrityError",
|
|
18
|
-
"EvidenceLimitError",
|
|
19
18
|
"EvidenceFileError",
|
|
20
|
-
"InvestigationWorkspaceError",
|
|
21
19
|
"UnknownRegistryError",
|
|
22
20
|
"HopperTimeoutError",
|
|
23
21
|
"HopperCancelledError",
|
|
@@ -109,20 +107,9 @@ export class ProviderSelectionError extends AnalysisError {
|
|
|
109
107
|
candidateIds;
|
|
110
108
|
rejections;
|
|
111
109
|
userMessage;
|
|
112
|
-
constructor(
|
|
113
|
-
const legacy = typeof input === "string";
|
|
114
|
-
const options = legacy
|
|
115
|
-
? {
|
|
116
|
-
operation: input,
|
|
117
|
-
reason: "provider_unavailable",
|
|
118
|
-
requestedProviderId: "auto",
|
|
119
|
-
candidateIds: [],
|
|
120
|
-
}
|
|
121
|
-
: input;
|
|
110
|
+
constructor(options) {
|
|
122
111
|
const operation = options.operation ?? "open_binary";
|
|
123
|
-
super(
|
|
124
|
-
? `No configured provider can execute ${operation}`
|
|
125
|
-
: providerSelectionDiagnostic(options));
|
|
112
|
+
super(providerSelectionDiagnostic(options));
|
|
126
113
|
this.operation = operation;
|
|
127
114
|
this.reason = options.reason;
|
|
128
115
|
this.requestedProviderId = options.requestedProviderId;
|
|
@@ -214,17 +201,6 @@ export class EvidenceReferenceError extends EvidenceIntegrityError {
|
|
|
214
201
|
this.actual = actual;
|
|
215
202
|
}
|
|
216
203
|
}
|
|
217
|
-
/** A bounded evidence ledger cannot accept more records or serialized bytes. */
|
|
218
|
-
export class EvidenceLimitError extends AnalysisError {
|
|
219
|
-
limit;
|
|
220
|
-
maximum;
|
|
221
|
-
_tag = "EvidenceLimitError";
|
|
222
|
-
constructor(limit, maximum) {
|
|
223
|
-
super(`Evidence ledger ${limit} limit exceeded (${String(maximum)})`);
|
|
224
|
-
this.limit = limit;
|
|
225
|
-
this.maximum = maximum;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
204
|
/** Evidence bundle filesystem access failed within the configured policy. */
|
|
229
205
|
export class EvidenceFileError extends AnalysisError {
|
|
230
206
|
operation;
|
|
@@ -236,17 +212,6 @@ export class EvidenceFileError extends AnalysisError {
|
|
|
236
212
|
this.reason = reason;
|
|
237
213
|
}
|
|
238
214
|
}
|
|
239
|
-
/** Persistent investigation workspace access or CAS validation failed. */
|
|
240
|
-
export class InvestigationWorkspaceError extends AnalysisError {
|
|
241
|
-
operation;
|
|
242
|
-
reason;
|
|
243
|
-
_tag = "InvestigationWorkspaceError";
|
|
244
|
-
constructor(operation, reason, options) {
|
|
245
|
-
super(`Investigation workspace ${operation} failed: ${reason}`, options);
|
|
246
|
-
this.operation = operation;
|
|
247
|
-
this.reason = reason;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
215
|
/** Residual-unknown mutation failed a lifecycle, reference, or CAS invariant. */
|
|
251
216
|
export class UnknownRegistryError extends AnalysisError {
|
|
252
217
|
reason;
|
|
@@ -259,10 +224,16 @@ export class UnknownRegistryError extends AnalysisError {
|
|
|
259
224
|
/** Hopper did not respond within the configured operation deadline. */
|
|
260
225
|
export class HopperTimeoutError extends HopperError {
|
|
261
226
|
timeoutMs;
|
|
227
|
+
operation;
|
|
228
|
+
requestId;
|
|
229
|
+
providerState;
|
|
262
230
|
_tag = "HopperTimeoutError";
|
|
263
|
-
constructor(timeoutMs) {
|
|
264
|
-
super(`Hopper
|
|
231
|
+
constructor(timeoutMs, operation, requestId, providerState = "not_started") {
|
|
232
|
+
super(`Hopper ${operation === undefined ? "startup" : operation} timed out after ${String(timeoutMs)}ms`);
|
|
265
233
|
this.timeoutMs = timeoutMs;
|
|
234
|
+
this.operation = operation;
|
|
235
|
+
this.requestId = requestId;
|
|
236
|
+
this.providerState = providerState;
|
|
266
237
|
}
|
|
267
238
|
}
|
|
268
239
|
/** The caller cancelled a Hopper operation before it completed. */
|
|
@@ -276,30 +247,37 @@ export class HopperCancelledError extends HopperError {
|
|
|
276
247
|
export class HopperProtocolError extends HopperError {
|
|
277
248
|
_tag = "HopperProtocolError";
|
|
278
249
|
}
|
|
279
|
-
/** Hopper's JSON-RPC endpoint returned an expected remote error response. */
|
|
280
250
|
export class HopperRemoteError extends HopperError {
|
|
281
251
|
code;
|
|
282
252
|
safeMessage;
|
|
283
|
-
diagnosticType;
|
|
284
253
|
_tag = "HopperRemoteError";
|
|
285
|
-
|
|
254
|
+
diagnosticType;
|
|
255
|
+
operation;
|
|
256
|
+
requestId;
|
|
257
|
+
constructor(code, safeMessage, context = {}) {
|
|
286
258
|
super(`Hopper request failed (${String(code)}): ${safeMessage}`);
|
|
287
259
|
this.code = code;
|
|
288
260
|
this.safeMessage = safeMessage;
|
|
289
|
-
this.diagnosticType = diagnosticType;
|
|
261
|
+
this.diagnosticType = context.diagnosticType ?? "remote";
|
|
262
|
+
this.operation = context.operation;
|
|
263
|
+
this.requestId = context.requestId;
|
|
290
264
|
}
|
|
291
265
|
}
|
|
292
266
|
/** The owned Hopper bridge stopped before its client was closed. */
|
|
293
267
|
export class HopperProcessError extends HopperError {
|
|
294
268
|
exitCode;
|
|
295
269
|
diagnostic;
|
|
270
|
+
operation;
|
|
271
|
+
requestId;
|
|
296
272
|
_tag = "HopperProcessError";
|
|
297
273
|
failureCode;
|
|
298
274
|
userMessage;
|
|
299
|
-
constructor(exitCode, diagnostic) {
|
|
275
|
+
constructor(exitCode, diagnostic, operation, requestId) {
|
|
300
276
|
super(`Hopper bridge stopped unexpectedly with code ${String(exitCode)}`);
|
|
301
277
|
this.exitCode = exitCode;
|
|
302
278
|
this.diagnostic = diagnostic;
|
|
279
|
+
this.operation = operation;
|
|
280
|
+
this.requestId = requestId;
|
|
303
281
|
const failure = hopperStartupFailure(exitCode);
|
|
304
282
|
this.failureCode = failure?.code;
|
|
305
283
|
this.userMessage = failure?.message;
|
|
@@ -308,8 +286,12 @@ export class HopperProcessError extends HopperError {
|
|
|
308
286
|
/** Hopper or the repository bridge could not be started. */
|
|
309
287
|
export class HopperStartError extends HopperError {
|
|
310
288
|
_tag = "HopperStartError";
|
|
289
|
+
userMessage;
|
|
290
|
+
ownerRunId;
|
|
311
291
|
constructor(options) {
|
|
312
292
|
super("Hopper application bridge could not be started", options);
|
|
293
|
+
this.userMessage = options?.userMessage;
|
|
294
|
+
this.ownerRunId = options?.ownerRunId;
|
|
313
295
|
}
|
|
314
296
|
}
|
|
315
297
|
/** Runtime configuration could not be parsed safely. */
|
|
@@ -338,16 +320,13 @@ export class PermissionRequiredError extends AnalysisError {
|
|
|
338
320
|
requested;
|
|
339
321
|
missing;
|
|
340
322
|
ceiling;
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
this.
|
|
347
|
-
this.
|
|
348
|
-
this.ceiling = ceiling;
|
|
349
|
-
this.elicitationSupported = elicitationSupported;
|
|
350
|
-
this.restartRequired = restartRequired;
|
|
323
|
+
remediation;
|
|
324
|
+
constructor(context) {
|
|
325
|
+
super(`Permission required for ${context.requested.capability}`);
|
|
326
|
+
this.requested = context.requested;
|
|
327
|
+
this.missing = context.missing;
|
|
328
|
+
this.ceiling = context.ceiling;
|
|
329
|
+
this.remediation = context.remediation;
|
|
351
330
|
}
|
|
352
331
|
}
|
|
353
332
|
/** Approved replay commitment no longer matches the immediately rebuilt plan. */
|
|
@@ -59,7 +59,7 @@ export const processTreeReconstructionSchema = z.strictObject({
|
|
|
59
59
|
/** Root PID of the process tree. */
|
|
60
60
|
root_pid: z.number().int().positive(),
|
|
61
61
|
/** All reconstructed process nodes. */
|
|
62
|
-
processes: z.array(processNodeSchema).min(0)
|
|
62
|
+
processes: z.array(processNodeSchema).min(0),
|
|
63
63
|
/** Events that were consumed. */
|
|
64
64
|
events_consumed: z.number().int().nonnegative(),
|
|
65
65
|
/** Events that could not be matched. */
|
|
@@ -178,10 +178,10 @@ export function getDescendants(processes, rootPid) {
|
|
|
178
178
|
const visited = new Set();
|
|
179
179
|
const result = [];
|
|
180
180
|
const queue = [rootPid];
|
|
181
|
-
|
|
182
|
-
const pid = queue
|
|
181
|
+
for (let head = 0; head < queue.length; head += 1) {
|
|
182
|
+
const pid = queue[head];
|
|
183
183
|
if (pid === undefined)
|
|
184
|
-
|
|
184
|
+
continue;
|
|
185
185
|
if (visited.has(pid))
|
|
186
186
|
continue;
|
|
187
187
|
visited.add(pid);
|
|
@@ -204,14 +204,22 @@ export function containsProcess(processes, pid) {
|
|
|
204
204
|
/** Get the maximum tree depth from the root. */
|
|
205
205
|
export function maxTreeDepth(processes, rootPid) {
|
|
206
206
|
const byPid = new Map(processes.map((p) => [p.pid, p]));
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
const
|
|
207
|
+
const pending = [{ pid: rootPid, depth: 0 }];
|
|
208
|
+
const visited = new Set();
|
|
209
|
+
let maximumDepth = 0;
|
|
210
|
+
while (pending.length > 0) {
|
|
211
|
+
const current = pending.pop();
|
|
212
|
+
if (!current || visited.has(current.pid))
|
|
213
|
+
continue;
|
|
214
|
+
visited.add(current.pid);
|
|
215
|
+
const node = byPid.get(current.pid);
|
|
212
216
|
if (!node || node.children.length === 0)
|
|
213
|
-
|
|
214
|
-
|
|
217
|
+
continue;
|
|
218
|
+
const childDepth = current.depth + 1;
|
|
219
|
+
maximumDepth = Math.max(maximumDepth, childDepth);
|
|
220
|
+
for (const childPid of node.children)
|
|
221
|
+
if (!visited.has(childPid))
|
|
222
|
+
pending.push({ pid: childPid, depth: childDepth });
|
|
215
223
|
}
|
|
216
|
-
return
|
|
224
|
+
return maximumDepth;
|
|
217
225
|
}
|
package/dist/domain/evidence.js
CHANGED
|
@@ -72,7 +72,6 @@ const executionEnvironmentSchema = z.object({
|
|
|
72
72
|
});
|
|
73
73
|
const evidenceBaseSchema = z
|
|
74
74
|
.object({
|
|
75
|
-
schema_version: z.literal(2),
|
|
76
75
|
evidence_id: z.string().regex(/^ev_[a-f0-9]{64}$/u),
|
|
77
76
|
subject: subjectSchema.nullable(),
|
|
78
77
|
provider: providerSchema,
|
|
@@ -124,7 +123,6 @@ const canonicalJson = (value) => {
|
|
|
124
123
|
return serialized;
|
|
125
124
|
};
|
|
126
125
|
const semanticProjection = (evidence) => ({
|
|
127
|
-
schema_version: evidence.schema_version,
|
|
128
126
|
subject: evidence.subject === null
|
|
129
127
|
? null
|
|
130
128
|
: {
|
|
@@ -152,18 +150,13 @@ const semanticProjection = (evidence) => ({
|
|
|
152
150
|
const computeEvidenceId = (evidence) => `ev_${sha256(canonicalJson(semanticProjection(evidence)))}`;
|
|
153
151
|
/** Parse evidence and reject a syntactically valid but tampered semantic ID. */
|
|
154
152
|
export const parseEvidence = (input) => {
|
|
155
|
-
if (typeof input === "object" &&
|
|
156
|
-
input !== null &&
|
|
157
|
-
"schema_version" in input &&
|
|
158
|
-
input.schema_version !== 2)
|
|
159
|
-
throw new TypeError(`Unsupported evidence schema_version ${String(input.schema_version)}; Evidence v1 is not accepted. Produce Evidence v2.`);
|
|
160
153
|
const evidence = evidenceRecordSchema.parse(input);
|
|
161
154
|
const { evidence_id: evidenceId, ...withoutId } = evidence;
|
|
162
155
|
if (computeEvidenceId(withoutId) !== evidenceId)
|
|
163
156
|
throw new TypeError("Evidence semantic identifier does not match its record");
|
|
164
157
|
return evidence;
|
|
165
158
|
};
|
|
166
|
-
/** Build deterministic Evidence
|
|
159
|
+
/** Build deterministic Evidence from an immutable artifact subject. */
|
|
167
160
|
export const createEvidence = (target, provider, observation) => {
|
|
168
161
|
const subject = target === undefined
|
|
169
162
|
? null
|
|
@@ -175,7 +168,6 @@ export const createEvidence = (target, provider, observation) => {
|
|
|
175
168
|
local_path: target.path,
|
|
176
169
|
};
|
|
177
170
|
const semantic = {
|
|
178
|
-
schema_version: 2,
|
|
179
171
|
subject: subject === null
|
|
180
172
|
? null
|
|
181
173
|
: {
|
|
@@ -191,7 +183,7 @@ export const createEvidence = (target, provider, observation) => {
|
|
|
191
183
|
...(observation.analysisProfile === undefined
|
|
192
184
|
? {}
|
|
193
185
|
: { analysis_profile: observation.analysisProfile }),
|
|
194
|
-
predicate_type: observation.predicateType ?? "rea.analysis
|
|
186
|
+
predicate_type: observation.predicateType ?? "rea.analysis",
|
|
195
187
|
operation: observation.operation,
|
|
196
188
|
parameters: observation.parameters,
|
|
197
189
|
raw_result: observation.rawResult ?? null,
|
|
@@ -21,7 +21,6 @@ const captureManifestSchema = z.object({
|
|
|
21
21
|
predicate_type: z.string().min(1),
|
|
22
22
|
});
|
|
23
23
|
export const evidenceBundleSchema = z.object({
|
|
24
|
-
bundle_version: z.literal(2),
|
|
25
24
|
artifacts: z.array(artifactManifestSchema),
|
|
26
25
|
providers: z.array(providerManifestSchema),
|
|
27
26
|
environments: z.array(environmentManifestSchema),
|
|
@@ -34,7 +33,6 @@ export const evidenceBundleSchema = z.object({
|
|
|
34
33
|
export const createEvidenceBundle = (records, unknowns = []) => {
|
|
35
34
|
const sortedRecords = [...records].sort((left, right) => left.evidence_id.localeCompare(right.evidence_id));
|
|
36
35
|
return {
|
|
37
|
-
bundle_version: 2,
|
|
38
36
|
artifacts: uniqueSorted(sortedRecords.flatMap(({ subject }) => subject === null
|
|
39
37
|
? []
|
|
40
38
|
: [
|
|
@@ -55,7 +53,7 @@ export const createEvidenceBundle = (records, unknowns = []) => {
|
|
|
55
53
|
},
|
|
56
54
|
]
|
|
57
55
|
: []),
|
|
58
|
-
captures: sortedRecords.flatMap((evidence) => evidence.predicate_type
|
|
56
|
+
captures: sortedRecords.flatMap((evidence) => evidence.predicate_type === "rea.process-capture"
|
|
59
57
|
? [
|
|
60
58
|
{
|
|
61
59
|
evidence_id: evidence.evidence_id,
|
|
@@ -81,7 +79,7 @@ export const evidenceBundleForTarget = (bundle, sha256) => {
|
|
|
81
79
|
return (record?.subject?.digest.sha256 === sha256 ||
|
|
82
80
|
(unknown.mutation_evidence_ids.includes(id) &&
|
|
83
81
|
record?.subject === null &&
|
|
84
|
-
record.predicate_type === "rea.residual-unknown-mutation
|
|
82
|
+
record.predicate_type === "rea.residual-unknown-mutation"));
|
|
85
83
|
}));
|
|
86
84
|
changed = retained.length !== unknowns.length;
|
|
87
85
|
unknowns = retained;
|
|
@@ -157,7 +155,7 @@ const validateVerifiedResolution = (unknown, evidenceById) => {
|
|
|
157
155
|
const evidence = evidenceById.get(evidenceId);
|
|
158
156
|
return (unknown.supporting_evidence_ids.includes(evidenceId) &&
|
|
159
157
|
evidence !== undefined &&
|
|
160
|
-
evidence.predicate_type !== "rea.residual-unknown-mutation
|
|
158
|
+
evidence.predicate_type !== "rea.residual-unknown-mutation" &&
|
|
161
159
|
evidenceQualifies(unknown, evidence));
|
|
162
160
|
});
|
|
163
161
|
if (qualifies !== true)
|
|
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
const evidenceIdSchema = z.string().regex(/^ev_[a-f0-9]{64}$/u);
|
|
5
|
-
const claimIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]
|
|
5
|
+
const claimIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
|
|
6
6
|
/** Terminal outcome recorded for one verifier claim. */
|
|
7
7
|
export const evidenceCompletionStatusSchema = z.enum([
|
|
8
8
|
"pass",
|
|
@@ -15,10 +15,10 @@ export const evidenceCompletionStatusSchema = z.enum([
|
|
|
15
15
|
export const evidenceCompletionRecordSchema = z.strictObject({
|
|
16
16
|
claim_id: claimIdSchema,
|
|
17
17
|
status: evidenceCompletionStatusSchema,
|
|
18
|
-
evidence_ids: z.array(evidenceIdSchema).min(1)
|
|
18
|
+
evidence_ids: z.array(evidenceIdSchema).min(1),
|
|
19
19
|
});
|
|
20
20
|
const completionSummarySchema = z.strictObject({
|
|
21
|
-
total: z.number().int().min(1)
|
|
21
|
+
total: z.number().int().min(1),
|
|
22
22
|
pass: z.number().int().nonnegative(),
|
|
23
23
|
fail: z.number().int().nonnegative(),
|
|
24
24
|
unsupported: z.number().int().nonnegative(),
|
|
@@ -27,9 +27,8 @@ const completionSummarySchema = z.strictObject({
|
|
|
27
27
|
complete: z.boolean(),
|
|
28
28
|
});
|
|
29
29
|
const completionLedgerObjectSchema = z.strictObject({
|
|
30
|
-
schema_version: z.literal(1),
|
|
31
30
|
ledger_id: z.string().regex(/^ecl_[a-f0-9]{64}$/u),
|
|
32
|
-
records: z.array(evidenceCompletionRecordSchema).min(1)
|
|
31
|
+
records: z.array(evidenceCompletionRecordSchema).min(1),
|
|
33
32
|
summary: completionSummarySchema,
|
|
34
33
|
});
|
|
35
34
|
const compareIdentifiers = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
@@ -57,7 +56,7 @@ const canonicalJson = (value) => {
|
|
|
57
56
|
return serialized;
|
|
58
57
|
};
|
|
59
58
|
const computeLedgerId = (records) => `ecl_${createHash("sha256")
|
|
60
|
-
.update(canonicalJson({
|
|
59
|
+
.update(canonicalJson({ records }))
|
|
61
60
|
.digest("hex")}`;
|
|
62
61
|
const ledgerIssues = (ledger, context) => {
|
|
63
62
|
if (!isSortedUnique(ledger.records.map((record) => record.claim_id)))
|
|
@@ -86,7 +85,7 @@ const ledgerIssues = (ledger, context) => {
|
|
|
86
85
|
message: "Completion ledger identifier does not match its records",
|
|
87
86
|
});
|
|
88
87
|
};
|
|
89
|
-
/** Strict path-free Evidence
|
|
88
|
+
/** Strict path-free Evidence completion ledger. */
|
|
90
89
|
export const evidenceCompletionLedgerSchema = completionLedgerObjectSchema.superRefine(ledgerIssues);
|
|
91
90
|
/** Build a canonical path-independent ledger from verifier claim outcomes. */
|
|
92
91
|
export const createEvidenceCompletionLedger = (input) => {
|
|
@@ -103,7 +102,6 @@ export const createEvidenceCompletionLedger = (input) => {
|
|
|
103
102
|
if (!isSortedUnique(record.evidence_ids))
|
|
104
103
|
throw new TypeError("Completion Evidence IDs must be unique per claim");
|
|
105
104
|
return evidenceCompletionLedgerSchema.parse({
|
|
106
|
-
schema_version: 1,
|
|
107
105
|
ledger_id: computeLedgerId(records),
|
|
108
106
|
records,
|
|
109
107
|
summary: summarize(records),
|
|
@@ -4,19 +4,15 @@ import { functionComparisonResultSchema, } from "./functionComparisonSchemas.js"
|
|
|
4
4
|
import { overallStatus, summarize, canonicalJson, } from "./functionComparisonResults.js";
|
|
5
5
|
import { compareDimensions } from "./functionComparisonDimensions.js";
|
|
6
6
|
export { functionComparisonInputSchema, functionComparisonResultSchema, } from "./functionComparisonSchemas.js";
|
|
7
|
-
/** Compare two
|
|
8
|
-
export const compareFunctions = (leftInput, rightInput
|
|
7
|
+
/** Compare two complete function Evidence records without fuzzy matching. */
|
|
8
|
+
export const compareFunctions = (leftInput, rightInput) => {
|
|
9
9
|
const left = parseFunctionEvidence(leftInput);
|
|
10
10
|
const right = parseFunctionEvidence(rightInput);
|
|
11
|
-
const links = [
|
|
12
|
-
...left.evidence.map(({ evidence_id: id }) => id),
|
|
13
|
-
...right.evidence.map(({ evidence_id: id }) => id),
|
|
14
|
-
];
|
|
11
|
+
const links = [left.evidence[0].evidence_id, right.evidence[0].evidence_id];
|
|
15
12
|
const providersDiffer = canonicalJson(left.provider) !== canonicalJson(right.provider);
|
|
16
13
|
const dimensions = compareDimensions(left, right, links, providersDiffer);
|
|
17
14
|
const match = functionMatch(left, right);
|
|
18
15
|
const changes = dimensions.filter(({ status }) => status !== "unchanged");
|
|
19
|
-
const page = changes.slice(offset, offset + limit);
|
|
20
16
|
return functionComparisonResultSchema.parse({
|
|
21
17
|
status: overallStatus(dimensions, match.status),
|
|
22
18
|
function_match: match,
|
|
@@ -24,13 +20,7 @@ export const compareFunctions = (leftInput, rightInput, offset, limit) => {
|
|
|
24
20
|
right_subject_sha256: right.subject.digest.sha256,
|
|
25
21
|
summary: summarize(dimensions),
|
|
26
22
|
dimensions,
|
|
27
|
-
changes
|
|
28
|
-
items: page,
|
|
29
|
-
offset,
|
|
30
|
-
limit,
|
|
31
|
-
total: changes.length,
|
|
32
|
-
next_offset: offset + page.length < changes.length ? offset + page.length : null,
|
|
33
|
-
},
|
|
23
|
+
changes,
|
|
34
24
|
limitations: [
|
|
35
25
|
...new Set([
|
|
36
26
|
...left.limitations.map((item) => `Left: ${item}`),
|
|
@@ -124,19 +124,12 @@ export const stringAndNameProjection = (snapshot) => {
|
|
|
124
124
|
};
|
|
125
125
|
export const sorted = (values) => [...values].sort((left, right) => canonicalJson(left).localeCompare(canonicalJson(right)));
|
|
126
126
|
export const combineCoverage = (left, right) => {
|
|
127
|
-
|
|
127
|
+
return {
|
|
128
128
|
items: [...left.items, ...right.items],
|
|
129
|
-
total: left.total
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
total: left.total + right.total,
|
|
130
|
+
complete: true,
|
|
131
|
+
truncated: false,
|
|
132
132
|
};
|
|
133
|
-
return left.complete && right.complete
|
|
134
|
-
? { ...base, complete: true, truncated: false }
|
|
135
|
-
: {
|
|
136
|
-
...base,
|
|
137
|
-
complete: false,
|
|
138
|
-
truncated: left.truncated || right.truncated,
|
|
139
|
-
};
|
|
140
133
|
};
|
|
141
134
|
export const project = (collection, mapper) => collection.items.map(mapper);
|
|
142
135
|
export const isAutoName = (name) => /^(?:sub_[0-9a-f]+|fcn\.)/iu.test(name);
|