rea-agents 3.1.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityInventory.js +10 -15
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -96
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +19 -45
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -93
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +15 -24
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +0 -54
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +2 -2
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -54
- package/dist/domain/appleApplication.js +24 -67
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +20 -19
- package/dist/domain/callPath.js +47 -167
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +2 -7
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +1 -5
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +36 -38
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +33 -73
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +4 -12
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
|
@@ -1,28 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
const addressSchema = z.string().regex(/^0x[0-9a-f]+$/iu);
|
|
3
3
|
const identitySchema = z.object({ address: addressSchema, name: z.string() });
|
|
4
|
-
|
|
5
|
-
items: z.array(z.unknown()),
|
|
6
|
-
total: z.number().int().min(0).nullable(),
|
|
7
|
-
returned: z.number().int().min(0),
|
|
8
|
-
truncated: z.boolean(),
|
|
9
|
-
next_offset: z.number().int().min(0).nullable(),
|
|
10
|
-
});
|
|
11
|
-
/** Extract a real address from the provider's exact procedure page. */
|
|
4
|
+
/** Extract one real procedure address from the complete inline inventory. */
|
|
12
5
|
export const firstProcedureAddress = (input) => {
|
|
13
|
-
const
|
|
14
|
-
.object({
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
limit: z.number().int().min(1),
|
|
18
|
-
total: z.number().int().min(1),
|
|
19
|
-
next_offset: z.number().int().min(0).nullable(),
|
|
20
|
-
has_more: z.boolean(),
|
|
21
|
-
})
|
|
22
|
-
.parse(input);
|
|
23
|
-
const first = page.items[0];
|
|
6
|
+
const first = z
|
|
7
|
+
.array(z.object({ address: addressSchema }))
|
|
8
|
+
.min(1)
|
|
9
|
+
.parse(input)[0];
|
|
24
10
|
if (first === undefined)
|
|
25
|
-
throw new TypeError("Procedure
|
|
11
|
+
throw new TypeError("Procedure inventory was empty");
|
|
26
12
|
return first.address;
|
|
27
13
|
};
|
|
28
14
|
/** Reject two target paths that resolve to the same binary content. */
|
|
@@ -44,7 +30,7 @@ export const requirePseudocode = (input, operation) => {
|
|
|
44
30
|
throw new TypeError(`${operation} returned an embedded failure: ${input}`);
|
|
45
31
|
return input;
|
|
46
32
|
};
|
|
47
|
-
/** Validate
|
|
33
|
+
/** Validate a complete Hopper function dossier semantically. */
|
|
48
34
|
export const requireFunctionDossier = (input, expectedAddress) => {
|
|
49
35
|
const value = objectValue(input, "analyze_function returned no function dossier");
|
|
50
36
|
const procedure = identitySchema.parse(value.procedure);
|
|
@@ -52,22 +38,19 @@ export const requireFunctionDossier = (input, expectedAddress) => {
|
|
|
52
38
|
throw new TypeError("analyze_function returned the wrong procedure");
|
|
53
39
|
if (procedure.name.trim().length === 0)
|
|
54
40
|
throw new TypeError("analyze_function omitted the procedure name");
|
|
55
|
-
|
|
41
|
+
requirePseudocode(value.pseudocode, "analyze_function");
|
|
56
42
|
for (const field of COLLECTION_FIELDS)
|
|
57
|
-
|
|
43
|
+
list(value, field);
|
|
58
44
|
for (const field of ["callers", "callees"])
|
|
59
|
-
z.array(identitySchema).parse(
|
|
60
|
-
validateBlocks(
|
|
61
|
-
validateInstructionScan(value.instruction_scan);
|
|
45
|
+
z.array(identitySchema).parse(list(value, field));
|
|
46
|
+
validateBlocks(list(value, "basic_blocks"));
|
|
62
47
|
return value;
|
|
63
48
|
};
|
|
64
49
|
/** Reject a structurally valid dossier that omits fixture-proven semantics. */
|
|
65
50
|
export const requireFunctionDossierOracle = (input, oracle) => {
|
|
66
51
|
const value = requireFunctionDossier(input, oracle.procedure_address);
|
|
67
52
|
if (oracle.callee_address !== undefined) {
|
|
68
|
-
const callees = z
|
|
69
|
-
.array(identitySchema)
|
|
70
|
-
.parse(collectionSchema.parse(value.callees).items);
|
|
53
|
+
const callees = z.array(identitySchema).parse(list(value, "callees"));
|
|
71
54
|
if (!callees.some(({ address }) => address === oracle.callee_address))
|
|
72
55
|
throw new TypeError("analyze_function omitted the expected fixture callee");
|
|
73
56
|
const references = z
|
|
@@ -75,14 +58,12 @@ export const requireFunctionDossierOracle = (input, oracle) => {
|
|
|
75
58
|
source_address: addressSchema,
|
|
76
59
|
target_address: addressSchema,
|
|
77
60
|
}))
|
|
78
|
-
.parse(
|
|
61
|
+
.parse(list(value, "outgoing_references"));
|
|
79
62
|
if (!references.some(({ target_address }) => target_address === oracle.callee_address))
|
|
80
63
|
throw new TypeError("analyze_function omitted the expected fixture reference");
|
|
81
64
|
}
|
|
82
65
|
if (oracle.caller_address !== undefined) {
|
|
83
|
-
const callers = z
|
|
84
|
-
.array(identitySchema)
|
|
85
|
-
.parse(collectionSchema.parse(value.callers).items);
|
|
66
|
+
const callers = z.array(identitySchema).parse(list(value, "callers"));
|
|
86
67
|
if (!callers.some(({ address }) => address === oracle.caller_address))
|
|
87
68
|
throw new TypeError("analyze_function omitted the expected fixture caller");
|
|
88
69
|
}
|
|
@@ -97,19 +78,18 @@ export const requireFunctionDossierOracle = (input, oracle) => {
|
|
|
97
78
|
kind: z.enum(["comment", "inline"]),
|
|
98
79
|
text: z.string(),
|
|
99
80
|
}))
|
|
100
|
-
.parse(
|
|
81
|
+
.parse(list(value, "comments"));
|
|
101
82
|
if (!comments.some(({ address, kind, text }) => address === oracle.procedure_address &&
|
|
102
83
|
kind === "comment" &&
|
|
103
84
|
text === oracle.comment))
|
|
104
85
|
throw new TypeError("analyze_function omitted the verifier comment");
|
|
105
86
|
}
|
|
106
|
-
if (oracle.require_assembly === true &&
|
|
107
|
-
collectionSchema.parse(value.assembly).items.length === 0)
|
|
87
|
+
if (oracle.require_assembly === true && list(value, "assembly").length === 0)
|
|
108
88
|
throw new TypeError("analyze_function omitted fixture assembly");
|
|
109
89
|
if (oracle.require_cfg_successor) {
|
|
110
90
|
const blocks = z
|
|
111
91
|
.array(z.object({ successors: z.array(addressSchema) }))
|
|
112
|
-
.parse(
|
|
92
|
+
.parse(list(value, "basic_blocks"));
|
|
113
93
|
if (!blocks.some(({ successors }) => successors.length > 0))
|
|
114
94
|
throw new TypeError("analyze_function omitted a real CFG successor");
|
|
115
95
|
}
|
|
@@ -125,12 +105,10 @@ const referenceEdgeSchema = z.object({
|
|
|
125
105
|
target_address: addressSchema,
|
|
126
106
|
});
|
|
127
107
|
const requireReferencedValue = (dossier, field, expected, normalize) => {
|
|
128
|
-
const values = z
|
|
129
|
-
.array(referencedValueSchema)
|
|
130
|
-
.parse(collectionSchema.parse(dossier[field]).items);
|
|
108
|
+
const values = z.array(referencedValueSchema).parse(list(dossier, field));
|
|
131
109
|
const references = z
|
|
132
110
|
.array(referenceEdgeSchema)
|
|
133
|
-
.parse(
|
|
111
|
+
.parse(list(dossier, "outgoing_references"));
|
|
134
112
|
const found = values.some(({ address, value, source_address: sourceAddress }) => normalize(value) === expected &&
|
|
135
113
|
references.some(({ source_address, target_address }) => source_address === sourceAddress && target_address === address));
|
|
136
114
|
if (!found)
|
|
@@ -154,36 +132,12 @@ const COLLECTION_FIELDS = [
|
|
|
154
132
|
"referenced_names",
|
|
155
133
|
"basic_blocks",
|
|
156
134
|
];
|
|
157
|
-
const
|
|
158
|
-
const pseudocode = z
|
|
159
|
-
.object({
|
|
160
|
-
text: z.string(),
|
|
161
|
-
returned_chars: z.number().int().min(0),
|
|
162
|
-
total_chars: z.number().int().min(0),
|
|
163
|
-
})
|
|
164
|
-
.parse(input);
|
|
165
|
-
const text = requirePseudocode(pseudocode.text, "analyze_function");
|
|
166
|
-
if (pseudocode.returned_chars !== [...text].length ||
|
|
167
|
-
pseudocode.total_chars < pseudocode.returned_chars)
|
|
168
|
-
throw new TypeError("analyze_function returned inconsistent pseudocode bounds");
|
|
169
|
-
};
|
|
170
|
-
const validateCollection = (input, field) => {
|
|
171
|
-
const collection = collectionSchema.parse(input);
|
|
172
|
-
if (collection.returned !== collection.items.length)
|
|
173
|
-
throw new TypeError(`analyze_function returned an invalid ${field} result`);
|
|
174
|
-
};
|
|
135
|
+
const list = (value, field) => z.array(z.unknown()).parse(value[field]);
|
|
175
136
|
const validateBlocks = (items) => {
|
|
176
137
|
for (const block of items)
|
|
177
138
|
if (!Array.isArray(objectValue(block, "Invalid basic block").successors))
|
|
178
139
|
throw new TypeError("analyze_function omitted CFG successor evidence");
|
|
179
140
|
};
|
|
180
|
-
const validateInstructionScan = (input) => {
|
|
181
|
-
const scan = z
|
|
182
|
-
.object({ scanned: z.number().int().min(0), truncated: z.boolean() })
|
|
183
|
-
.parse(input);
|
|
184
|
-
if (scan.scanned === 0 && !scan.truncated)
|
|
185
|
-
throw new TypeError("analyze_function omitted instruction scan limitations");
|
|
186
|
-
};
|
|
187
141
|
const objectValue = (input, message) => {
|
|
188
142
|
const parsed = z.record(z.string(), z.unknown()).safeParse(input);
|
|
189
143
|
if (!parsed.success)
|
|
@@ -1,69 +1,23 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { AnalysisInputError } from "../domain/errors.js";
|
|
3
|
+
import { evaluateReconstructionClosure, reconstructionCoverageDataSchema, } from "../domain/reconstructionCoverage.js";
|
|
3
4
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
4
|
-
import { evaluateReconstructionClosure, reconstructionCoverageWorkspaceSchema, } from "../domain/reconstructionCoverage.js";
|
|
5
5
|
import { err, ok } from "../domain/result.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const isAborted = (signal) => signal?.aborted === true;
|
|
10
|
-
export const reconstructionCoverageCommitInputSchema = z.strictObject({
|
|
11
|
-
approved: z.literal(true),
|
|
12
|
-
workspace_path: z.string().min(1).max(4_096),
|
|
13
|
-
expected_revision: z.number().int().min(1).nullable(),
|
|
14
|
-
workspace: reconstructionCoverageWorkspaceSchema,
|
|
6
|
+
export const reconstructionCoverageEvaluationInputSchema = z.strictObject({
|
|
7
|
+
coverage: reconstructionCoverageDataSchema,
|
|
8
|
+
boundary_id: z.string().min(1),
|
|
15
9
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
20
|
-
export const reconstructionCoverageCommitOutputSchema = z.strictObject({
|
|
21
|
-
workspace_path: z.string(),
|
|
22
|
-
bytes: z.number().int().min(0),
|
|
23
|
-
workspace_id: z.string().regex(/^rcw_[a-f0-9]{64}$/u),
|
|
24
|
-
revision: z.number().int().min(1),
|
|
25
|
-
revision_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
26
|
-
evidence_records: z.number().int().min(0),
|
|
27
|
-
});
|
|
28
|
-
/** Commit one caller-approved canonical reconstruction coverage CAS revision. */
|
|
29
|
-
export const commitReconstructionCoverage = async (rawInput, policy, options = {}) => {
|
|
30
|
-
const parsed = reconstructionCoverageCommitInputSchema.safeParse(rawInput);
|
|
31
|
-
if (!parsed.success)
|
|
32
|
-
return err(new AnalysisInputError(COMMIT_OPERATION, { cause: parsed.error }));
|
|
33
|
-
if (isAborted(options.signal))
|
|
34
|
-
return err(new AnalysisCancelledError(COMMIT_OPERATION));
|
|
35
|
-
const written = await writeReconstructionCoverageWorkspace(parsed.data.workspace, parsed.data.workspace_path, parsed.data.expected_revision, policy);
|
|
36
|
-
if (!written.ok)
|
|
37
|
-
return written;
|
|
38
|
-
return ok(jsonValueSchema.parse({
|
|
39
|
-
workspace_path: written.value.path,
|
|
40
|
-
bytes: written.value.bytes,
|
|
41
|
-
workspace_id: parsed.data.workspace.workspace_id,
|
|
42
|
-
revision: parsed.data.workspace.revision,
|
|
43
|
-
revision_sha256: parsed.data.workspace.revision_sha256,
|
|
44
|
-
evidence_records: parsed.data.workspace.evidence_bundle.records.length,
|
|
45
|
-
}));
|
|
46
|
-
};
|
|
47
|
-
/** Read one coverage revision and evaluate a named fail-closed boundary. */
|
|
48
|
-
export const queryReconstructionCoverage = async (rawInput, policy, nowEpochMs, options = {}) => {
|
|
49
|
-
const parsed = reconstructionCoverageQueryInputSchema.safeParse(rawInput);
|
|
10
|
+
/** Evaluate inline reconstruction coverage against a named boundary. */
|
|
11
|
+
export const evaluateReconstructionCoverage = (rawInput, nowEpochMs = Date.now()) => {
|
|
12
|
+
const parsed = reconstructionCoverageEvaluationInputSchema.safeParse(rawInput);
|
|
50
13
|
if (!parsed.success)
|
|
51
|
-
return err(new AnalysisInputError(
|
|
52
|
-
|
|
53
|
-
return err(new AnalysisCancelledError(QUERY_OPERATION));
|
|
54
|
-
const loaded = await readReconstructionCoverageWorkspace(parsed.data.workspace_path, policy);
|
|
55
|
-
if (!loaded.ok)
|
|
56
|
-
return loaded;
|
|
57
|
-
if (loaded.value === null)
|
|
58
|
-
return err(new AnalysisInputError(QUERY_OPERATION, {
|
|
59
|
-
cause: new TypeError("Reconstruction coverage workspace does not exist"),
|
|
14
|
+
return err(new AnalysisInputError("evaluate_reconstruction_coverage", {
|
|
15
|
+
cause: parsed.error,
|
|
60
16
|
}));
|
|
61
|
-
if (isAborted(options.signal))
|
|
62
|
-
return err(new AnalysisCancelledError(QUERY_OPERATION));
|
|
63
17
|
try {
|
|
64
|
-
return ok(jsonValueSchema.parse(evaluateReconstructionClosure(
|
|
18
|
+
return ok(jsonValueSchema.parse(evaluateReconstructionClosure(parsed.data.coverage, parsed.data.boundary_id, nowEpochMs)));
|
|
65
19
|
}
|
|
66
20
|
catch (cause) {
|
|
67
|
-
return err(new AnalysisInputError(
|
|
21
|
+
return err(new AnalysisInputError("evaluate_reconstruction_coverage", { cause }));
|
|
68
22
|
}
|
|
69
23
|
};
|
|
@@ -42,7 +42,7 @@ export const proofAuthoritySatisfies = (actual, required) => {
|
|
|
42
42
|
export const evidenceAuthoritySupportsProof = (evidence, authority, expected) => {
|
|
43
43
|
if (evidence.confidence !== "observed" ||
|
|
44
44
|
!proofEvidenceAuthorities[authority].includes(evidence.authority) ||
|
|
45
|
-
evidence.predicate_type !== "rea.reconstruction-proof
|
|
45
|
+
evidence.predicate_type !== "rea.reconstruction-proof" ||
|
|
46
46
|
evidence.operation !== "verify_reconstruction_obligations")
|
|
47
47
|
return false;
|
|
48
48
|
const result = evidence.normalized_result;
|
|
@@ -67,6 +67,6 @@ export const evidenceSupportsOriginalAuthority = (evidence, authority) => {
|
|
|
67
67
|
return ["controlled-replay", "external-service"].includes(evidence.authority);
|
|
68
68
|
if (authority === "process")
|
|
69
69
|
return (evidence.operation === "capture_process_scenario" &&
|
|
70
|
-
evidence.predicate_type === "rea.process-capture
|
|
70
|
+
evidence.predicate_type === "rea.process-capture");
|
|
71
71
|
return evidence.authority === "external-service";
|
|
72
72
|
};
|
|
@@ -73,7 +73,7 @@ const deriveApplicationCandidates = (evidence, records, candidates, limitations)
|
|
|
73
73
|
};
|
|
74
74
|
const deriveProcessCandidate = (evidence, candidates, limitations) => {
|
|
75
75
|
if (evidence.operation !== "capture_process_scenario" ||
|
|
76
|
-
evidence.predicate_type !== "rea.process-capture
|
|
76
|
+
evidence.predicate_type !== "rea.process-capture")
|
|
77
77
|
return;
|
|
78
78
|
try {
|
|
79
79
|
const capture = parseProcessCapture(evidence.normalized_result);
|
|
@@ -146,7 +146,7 @@ const deriveProcessCandidate = (evidence, candidates, limitations) => {
|
|
|
146
146
|
const generatedCandidate = ({ key, title, policy: candidatePolicy, artifactSha256, applicationNodeId, semanticNodeId, location, authorityReferences, }) => ({
|
|
147
147
|
obligation_id: obligationId(key),
|
|
148
148
|
obligation_version: 1,
|
|
149
|
-
title
|
|
149
|
+
title,
|
|
150
150
|
origin: "generated",
|
|
151
151
|
application_layer: candidatePolicy.applicationLayer,
|
|
152
152
|
family: candidatePolicy.family,
|
|
@@ -218,7 +218,7 @@ const graphReference = (envelope, records, graphEvidence, location) => {
|
|
|
218
218
|
};
|
|
219
219
|
const reviewedEvidenceState = (evidence) => {
|
|
220
220
|
if (evidence.operation === "capture_process_scenario" &&
|
|
221
|
-
evidence.predicate_type === "rea.process-capture
|
|
221
|
+
evidence.predicate_type === "rea.process-capture" &&
|
|
222
222
|
evidence.confidence === "observed")
|
|
223
223
|
return "observed";
|
|
224
224
|
if (evidence.authority === "external-service" &&
|
|
@@ -255,7 +255,7 @@ const sourceState = (references) => {
|
|
|
255
255
|
return "unknown";
|
|
256
256
|
};
|
|
257
257
|
const uniqueBy = (values, key) => [...new Map(values.map((value) => [key(value), value])).values()].sort((left, right) => key(left).localeCompare(key(right)));
|
|
258
|
-
const obligationId = (key) => `obl_${digest({ schema: "
|
|
258
|
+
const obligationId = (key) => `obl_${digest({ schema: "ReconstructionObligation", key })}`;
|
|
259
259
|
const digest = (value) => {
|
|
260
260
|
const encoded = canonicalize(value);
|
|
261
261
|
if (encoded === undefined)
|
|
@@ -4,12 +4,11 @@ import { evidenceAuthoritySupportsProof, evidenceSupportsOriginalAuthority, proo
|
|
|
4
4
|
import { addObligationDiagnostic as addDiagnostic, contradictionDiagnostics, groupManifestBindings, groupManifestContradictions, hasObligationDiagnostic as hasDiagnostic, uniqueObligationDiagnostics as uniqueDiagnostics, } from "./ReconstructionObligationLedgerDiagnostics.js";
|
|
5
5
|
import { originalCaseDiagnostics, originalCasesFor, } from "./ReconstructionObligationOriginalCases.js";
|
|
6
6
|
import { digestObligationLedgerValue, obligationLedgerCoverage, obligationEdgeOrder, obligationLedgerEvidenceLinks, obligationLedgerStatus, obligationReports, summarizeObligations, } from "./ReconstructionObligationLedgerProjection.js";
|
|
7
|
-
export const evaluateReconstructionObligationLedger = ({ candidates: candidatesInput, bundle: bundleInput, manifest,
|
|
7
|
+
export const evaluateReconstructionObligationLedger = ({ candidates: candidatesInput, bundle: bundleInput, manifest, generationLimitations, }) => {
|
|
8
8
|
const bundle = parseEvidenceBundle(bundleInput);
|
|
9
9
|
const allCandidates = [...candidatesInput].sort((left, right) => left.obligation_id.localeCompare(right.obligation_id));
|
|
10
10
|
const orphanManifestIds = findOrphanManifestIds(allCandidates, manifest);
|
|
11
|
-
const candidates = allCandidates
|
|
12
|
-
const omittedCount = allCandidates.length - candidates.length;
|
|
11
|
+
const candidates = allCandidates;
|
|
13
12
|
const context = createEvaluationContext(candidates, bundle, manifest);
|
|
14
13
|
const obligations = applyDependencyDiagnostics(candidates.map((candidate) => evaluateObligation(candidate, context)), context);
|
|
15
14
|
const ownershipGraph = obligations
|
|
@@ -30,8 +29,8 @@ export const evaluateReconstructionObligationLedger = ({ candidates: candidatesI
|
|
|
30
29
|
})))
|
|
31
30
|
.sort(obligationEdgeOrder);
|
|
32
31
|
const evidenceLinks = obligationLedgerEvidenceLinks(obligations, manifest);
|
|
33
|
-
const limitations = ledgerLimitations(generationLimitations, allCandidates.length,
|
|
34
|
-
const coverage = obligationLedgerCoverage(
|
|
32
|
+
const limitations = ledgerLimitations(generationLimitations, allCandidates.length, orphanManifestIds);
|
|
33
|
+
const coverage = obligationLedgerCoverage(limitations.length > 0);
|
|
35
34
|
const semantic = {
|
|
36
35
|
coverage,
|
|
37
36
|
summary: summarizeObligations(obligations),
|
|
@@ -42,22 +41,21 @@ export const evaluateReconstructionObligationLedger = ({ candidates: candidatesI
|
|
|
42
41
|
evidence_links: evidenceLinks,
|
|
43
42
|
limitations,
|
|
44
43
|
};
|
|
45
|
-
const evaluatedStatus = obligationLedgerStatus(obligations
|
|
44
|
+
const evaluatedStatus = obligationLedgerStatus(obligations);
|
|
46
45
|
const status = evaluatedStatus === "failed"
|
|
47
46
|
? evaluatedStatus
|
|
48
47
|
: limitations.length > 0
|
|
49
48
|
? "unknown"
|
|
50
49
|
: evaluatedStatus;
|
|
51
50
|
const closureDigest = digestObligationLedgerValue({
|
|
52
|
-
schema: "
|
|
51
|
+
schema: "ReconstructionObligationClosure",
|
|
53
52
|
status,
|
|
54
53
|
...semantic,
|
|
55
54
|
});
|
|
56
55
|
return reconstructionObligationLedgerSchema.parse({
|
|
57
56
|
schema: "ReconstructionObligationLedger",
|
|
58
|
-
schema_version: 1,
|
|
59
57
|
ledger_id: `rol_${digestObligationLedgerValue({
|
|
60
|
-
schema: "
|
|
58
|
+
schema: "ReconstructionObligationLedger",
|
|
61
59
|
evidence_ids: bundle.records.map(({ evidence_id: id }) => id),
|
|
62
60
|
obligation_ids: obligations.map(({ obligation_id: id }) => id),
|
|
63
61
|
closure_digest: closureDigest,
|
|
@@ -82,7 +80,7 @@ const findOrphanManifestIds = (candidates, manifest) => {
|
|
|
82
80
|
].filter((obligationId) => !candidateIds.has(obligationId))),
|
|
83
81
|
].sort();
|
|
84
82
|
};
|
|
85
|
-
const ledgerLimitations = (generationLimitations, candidateCount,
|
|
83
|
+
const ledgerLimitations = (generationLimitations, candidateCount, orphanManifestIds) => [
|
|
86
84
|
...new Set([
|
|
87
85
|
...generationLimitations,
|
|
88
86
|
...(candidateCount === 0
|
|
@@ -90,11 +88,6 @@ const ledgerLimitations = (generationLimitations, candidateCount, omittedCount,
|
|
|
90
88
|
"No reconstruction obligations were derived; closure cannot be claimed.",
|
|
91
89
|
]
|
|
92
90
|
: []),
|
|
93
|
-
...(omittedCount > 0
|
|
94
|
-
? [
|
|
95
|
-
`${String(omittedCount)} obligation candidates were omitted by max_obligations; closure is unknown.`,
|
|
96
|
-
]
|
|
97
|
-
: []),
|
|
98
91
|
...(orphanManifestIds.length > 0
|
|
99
92
|
? [
|
|
100
93
|
`Manifest entries reference unknown obligations: ${orphanManifestIds.join(", ")}.`,
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import canonicalize from "canonicalize";
|
|
3
|
-
export const obligationLedgerCoverage = (
|
|
3
|
+
export const obligationLedgerCoverage = (incomplete) => ({
|
|
4
4
|
status: incomplete ? "partial" : "complete",
|
|
5
|
-
truncated: omittedCount > 0,
|
|
6
|
-
omitted_count: omittedCount,
|
|
7
|
-
max_obligations: maxObligations,
|
|
8
5
|
});
|
|
9
6
|
export const summarizeObligations = (obligations) => ({
|
|
10
7
|
total: obligations.length,
|
|
@@ -56,15 +53,14 @@ export const obligationLedgerEvidenceLinks = (obligations, manifest) => [
|
|
|
56
53
|
...manifest.contradictions.flatMap(({ evidence_ids: ids }) => ids),
|
|
57
54
|
]),
|
|
58
55
|
].sort();
|
|
59
|
-
export const obligationLedgerStatus = (obligations
|
|
56
|
+
export const obligationLedgerStatus = (obligations) => {
|
|
60
57
|
if (obligations.length === 0)
|
|
61
58
|
return "unknown";
|
|
62
59
|
const requiredOpen = obligations.filter(({ required, status }) => required && status !== "verified");
|
|
63
60
|
if (requiredOpen.some(({ status, diagnostics }) => status === "contradicted" ||
|
|
64
61
|
hasDiagnostic(diagnostics, "verifier-failed")))
|
|
65
62
|
return "failed";
|
|
66
|
-
if (
|
|
67
|
-
requiredOpen.some(({ status }) => status === "unknown"))
|
|
63
|
+
if (requiredOpen.some(({ status }) => status === "unknown"))
|
|
68
64
|
return "unknown";
|
|
69
65
|
return requiredOpen.length === 0 ? "ready" : "open";
|
|
70
66
|
};
|
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { AnalysisInputError, AnalysisProtocolError, } from "../domain/errors.js";
|
|
3
3
|
import { createEvidence } from "../domain/evidence.js";
|
|
4
4
|
import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
|
|
5
|
-
import { reconstructionObligationLedgerInputSchema,
|
|
5
|
+
import { reconstructionObligationLedgerInputSchema, reconstructionObligationLedgerSchema, } from "../domain/reconstructionObligationLedgerSchemas.js";
|
|
6
6
|
import { err, ok } from "../domain/result.js";
|
|
7
7
|
import { JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER } from "./InvestigationProviders.js";
|
|
8
8
|
import { deriveReconstructionObligationCandidates } from "./ReconstructionObligationCandidates.js";
|
|
@@ -15,7 +15,7 @@ export const resolveReconstructionObligationLedgerRequest = (input) => {
|
|
|
15
15
|
? ok(parsed.data)
|
|
16
16
|
: err(new AnalysisInputError(OPERATION, { cause: parsed.error }));
|
|
17
17
|
};
|
|
18
|
-
/** Build
|
|
18
|
+
/** Build the complete deterministic ledger and wrap it in portable Evidence. */
|
|
19
19
|
export const buildReconstructionObligationLedgerEvidenceValidated = (input) => {
|
|
20
20
|
try {
|
|
21
21
|
const generated = deriveReconstructionObligationCandidates(input.evidence_bundle, input.reviewed_obligations);
|
|
@@ -23,11 +23,9 @@ export const buildReconstructionObligationLedgerEvidenceValidated = (input) => {
|
|
|
23
23
|
candidates: generated.candidates,
|
|
24
24
|
bundle: input.evidence_bundle,
|
|
25
25
|
manifest: input.manifest,
|
|
26
|
-
maxObligations: input.limits.max_obligations,
|
|
27
26
|
generationLimitations: generated.limitations,
|
|
28
27
|
});
|
|
29
|
-
|
|
30
|
-
return ok(createLedgerEvidence(input, page));
|
|
28
|
+
return ok(createLedgerEvidence(input, ledger));
|
|
31
29
|
}
|
|
32
30
|
catch (cause) {
|
|
33
31
|
if (cause instanceof z.ZodError)
|
|
@@ -35,38 +33,21 @@ export const buildReconstructionObligationLedgerEvidenceValidated = (input) => {
|
|
|
35
33
|
return err(new AnalysisProtocolError("Reconstruction obligation ledger generation failed", { cause }));
|
|
36
34
|
}
|
|
37
35
|
};
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
:
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
36
|
+
const createLedgerEvidence = (input, ledger) => {
|
|
37
|
+
const completeLedger = reconstructionObligationLedgerSchema.parse(ledger);
|
|
38
|
+
return createEvidence(undefined, JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER, {
|
|
39
|
+
predicateType: "rea.reconstruction-obligation-ledger",
|
|
40
|
+
operation: OPERATION,
|
|
41
|
+
parameters: jsonObjectSchema.parse({
|
|
42
|
+
ledger_id: completeLedger.ledger_id,
|
|
43
|
+
closure_digest: completeLedger.closure_digest,
|
|
44
|
+
}),
|
|
45
|
+
result: jsonValueSchema.parse(completeLedger),
|
|
46
|
+
rawResult: null,
|
|
47
|
+
confidence: "inferred",
|
|
48
|
+
authority: "analyst-inference",
|
|
49
|
+
environment: null,
|
|
50
|
+
limitations: completeLedger.limitations,
|
|
51
|
+
evidenceLinks: completeLedger.evidence_links,
|
|
54
52
|
});
|
|
55
53
|
};
|
|
56
|
-
const createLedgerEvidence = (input, page) => createEvidence(undefined, JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER, {
|
|
57
|
-
predicateType: "rea.reconstruction-obligation-ledger/v1",
|
|
58
|
-
operation: OPERATION,
|
|
59
|
-
parameters: jsonObjectSchema.parse({
|
|
60
|
-
ledger_id: page.ledger_id,
|
|
61
|
-
closure_digest: page.closure_digest,
|
|
62
|
-
limits: input.limits,
|
|
63
|
-
page: input.page,
|
|
64
|
-
}),
|
|
65
|
-
result: jsonValueSchema.parse(page),
|
|
66
|
-
rawResult: null,
|
|
67
|
-
confidence: "inferred",
|
|
68
|
-
authority: "analyst-inference",
|
|
69
|
-
environment: null,
|
|
70
|
-
limitations: page.limitations,
|
|
71
|
-
evidenceLinks: page.evidence_links,
|
|
72
|
-
});
|
|
@@ -1,23 +1,12 @@
|
|
|
1
|
+
import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
|
|
1
2
|
import { isSecretLikePath } from "../domain/referenceSourceClassification.js";
|
|
2
|
-
import { createHistoricalSourceGraph, historicalSourceParseFailureKey, } from "../domain/referenceSourceGraph.js";
|
|
3
|
+
import { createHistoricalSourceGraph, historicalSourceLanguages, historicalSourceManifests, historicalSourceParseFailureKey, } from "../domain/referenceSourceGraph.js";
|
|
3
4
|
import { err, ok } from "../domain/result.js";
|
|
4
5
|
import { readReferenceSource } from "../reference/ReferenceSourceReader.js";
|
|
5
6
|
import { parseReferenceSourceEntries } from "./ReferenceSourceImportEntries.js";
|
|
6
7
|
import { readReferenceSourceVcs } from "./ReferenceSourceVcsAdapter.js";
|
|
7
8
|
import {} from "./ReferenceSourceImportTypes.js";
|
|
8
9
|
import { prepareReferenceSourceImport } from "./ReferenceSourceImportPolicy.js";
|
|
9
|
-
const compareCodePoints = (left, right) => {
|
|
10
|
-
const leftPoints = [...left].map((value) => value.codePointAt(0) ?? 0);
|
|
11
|
-
const rightPoints = [...right].map((value) => value.codePointAt(0) ?? 0);
|
|
12
|
-
const length = Math.min(leftPoints.length, rightPoints.length);
|
|
13
|
-
for (let index = 0; index < length; index += 1) {
|
|
14
|
-
const difference = (leftPoints[index] ?? 0) - (rightPoints[index] ?? 0);
|
|
15
|
-
if (difference !== 0)
|
|
16
|
-
return difference;
|
|
17
|
-
}
|
|
18
|
-
return leftPoints.length - rightPoints.length;
|
|
19
|
-
};
|
|
20
|
-
const byCodePoint = (left, right) => compareCodePoints(left, right);
|
|
21
10
|
const failure = (code, message) => ({
|
|
22
11
|
tag: "reference-source-import",
|
|
23
12
|
code,
|
|
@@ -40,7 +29,7 @@ const deduplicateRelationships = (relationships) => {
|
|
|
40
29
|
};
|
|
41
30
|
/** Sort parse failures deterministically while retaining distinct reasons. */
|
|
42
31
|
export const normalizeHistoricalSourceParseFailures = (failures) => [...failures]
|
|
43
|
-
.sort((left, right) =>
|
|
32
|
+
.sort((left, right) => compareUnicodeCodePoints(historicalSourceParseFailureKey(left), historicalSourceParseFailureKey(right)))
|
|
44
33
|
.filter((value, index, array) => {
|
|
45
34
|
if (index === 0)
|
|
46
35
|
return true;
|
|
@@ -54,16 +43,6 @@ const buildProvenance = (options) => ({
|
|
|
54
43
|
importer_version: options.importerVersion ?? null,
|
|
55
44
|
caller: options.caller,
|
|
56
45
|
});
|
|
57
|
-
const deriveLanguages = (entries) => [
|
|
58
|
-
...new Set(entries.flatMap((entry) => entry.kind === "file" && entry.language !== null
|
|
59
|
-
? [entry.language]
|
|
60
|
-
: [])),
|
|
61
|
-
].sort(byCodePoint);
|
|
62
|
-
const deriveManifests = (entries) => entries
|
|
63
|
-
.flatMap((entry) => entry.kind === "file" && entry.classifications.includes("manifest")
|
|
64
|
-
? [entry.path]
|
|
65
|
-
: [])
|
|
66
|
-
.sort(byCodePoint);
|
|
67
46
|
const deriveInventoryState = (input) => {
|
|
68
47
|
if (input.limitations.length > 0)
|
|
69
48
|
return "partial";
|
|
@@ -83,17 +62,12 @@ const deriveInventoryState = (input) => {
|
|
|
83
62
|
return "partial";
|
|
84
63
|
return "complete";
|
|
85
64
|
};
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
});
|
|
93
|
-
if (sorted.length <= maxExclusions)
|
|
94
|
-
return sorted;
|
|
95
|
-
return sorted.slice(0, maxExclusions);
|
|
96
|
-
};
|
|
65
|
+
const sortExclusions = (exclusions) => [...exclusions].sort((left, right) => {
|
|
66
|
+
const byPath = compareUnicodeCodePoints(left.path, right.path);
|
|
67
|
+
if (byPath !== 0)
|
|
68
|
+
return byPath;
|
|
69
|
+
return compareUnicodeCodePoints(left.reason, right.reason);
|
|
70
|
+
});
|
|
97
71
|
/**
|
|
98
72
|
* Import a reference source directory into a committed historical source graph.
|
|
99
73
|
*
|
|
@@ -107,7 +81,7 @@ export const importReferenceSource = async (options) => {
|
|
|
107
81
|
const prepared = await prepareReferenceSourceImport(options);
|
|
108
82
|
if (!prepared.ok)
|
|
109
83
|
return prepared;
|
|
110
|
-
const { ignored,
|
|
84
|
+
const { ignored, root, secrets } = prepared.value;
|
|
111
85
|
if (isAborted(options.signal))
|
|
112
86
|
return err(cancelled());
|
|
113
87
|
const exclusions = [];
|
|
@@ -123,7 +97,7 @@ export const importReferenceSource = async (options) => {
|
|
|
123
97
|
return false;
|
|
124
98
|
};
|
|
125
99
|
const [readResult, vcs] = await Promise.all([
|
|
126
|
-
readReferenceSource(root,
|
|
100
|
+
readReferenceSource(root, {
|
|
127
101
|
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
128
102
|
shouldExclude,
|
|
129
103
|
}),
|
|
@@ -133,7 +107,7 @@ export const importReferenceSource = async (options) => {
|
|
|
133
107
|
const error = readResult.error;
|
|
134
108
|
if (error.code === "cancelled")
|
|
135
109
|
return err(cancelled());
|
|
136
|
-
return err(failure(
|
|
110
|
+
return err(failure("io", error.message));
|
|
137
111
|
}
|
|
138
112
|
if (isAborted(options.signal))
|
|
139
113
|
return err(cancelled());
|
|
@@ -146,11 +120,11 @@ export const importReferenceSource = async (options) => {
|
|
|
146
120
|
return err(cancelled());
|
|
147
121
|
const uniqueRelationships = deduplicateRelationships(relationships);
|
|
148
122
|
const uniqueFailures = normalizeHistoricalSourceParseFailures(parseFailures);
|
|
149
|
-
const sortedEntries = [...entries].sort((left, right) =>
|
|
150
|
-
const sortedExclusions =
|
|
151
|
-
const sortedLimitations = [...limitations].sort(
|
|
123
|
+
const sortedEntries = [...entries].sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
|
|
124
|
+
const sortedExclusions = sortExclusions(exclusions);
|
|
125
|
+
const sortedLimitations = [...limitations].sort(compareUnicodeCodePoints);
|
|
152
126
|
const input = {
|
|
153
|
-
schema: "HistoricalSourceGraph
|
|
127
|
+
schema: "HistoricalSourceGraph",
|
|
154
128
|
authority: "historical-reference",
|
|
155
129
|
root_alias: "$REFERENCE_ROOT",
|
|
156
130
|
inventory_state: deriveInventoryState({
|
|
@@ -161,11 +135,11 @@ export const importReferenceSource = async (options) => {
|
|
|
161
135
|
limitations: sortedLimitations,
|
|
162
136
|
}),
|
|
163
137
|
entries: sortedEntries,
|
|
164
|
-
relationships: uniqueRelationships.sort((left, right) =>
|
|
138
|
+
relationships: uniqueRelationships.sort((left, right) => compareUnicodeCodePoints(relationshipKey(left), relationshipKey(right))),
|
|
165
139
|
parse_failures: uniqueFailures,
|
|
166
140
|
exclusions: sortedExclusions,
|
|
167
|
-
languages:
|
|
168
|
-
manifests:
|
|
141
|
+
languages: historicalSourceLanguages(sortedEntries),
|
|
142
|
+
manifests: historicalSourceManifests(sortedEntries),
|
|
169
143
|
vcs,
|
|
170
144
|
provenance: buildProvenance(options),
|
|
171
145
|
limitations: sortedLimitations,
|
|
@@ -7,8 +7,6 @@ import { PARSEABLE_REFERENCE_SOURCE_LANGUAGES } from "./ReferenceSourceImportTyp
|
|
|
7
7
|
export const projectReferenceSourceEntryFailure = (entry) => {
|
|
8
8
|
if (entry.code === "cancelled")
|
|
9
9
|
return "This entry was not read because the import was cancelled. Start the import again when ready.";
|
|
10
|
-
if (entry.code === "limit")
|
|
11
|
-
return "This entry was not read because an import limit was reached. Import a smaller directory or raise the configured limits.";
|
|
12
10
|
if (entry.code === "unsupported")
|
|
13
11
|
return "This entry cannot be read safely on this system. Exclude it or import the directory on a supported system.";
|
|
14
12
|
if (entry.kind === "directory")
|
|
@@ -26,7 +24,7 @@ const failedEntry = (entry) => {
|
|
|
26
24
|
path: entry.path,
|
|
27
25
|
kind: "directory",
|
|
28
26
|
classifications,
|
|
29
|
-
tree_state:
|
|
27
|
+
tree_state: "unreadable",
|
|
30
28
|
limitations: [limitation],
|
|
31
29
|
};
|
|
32
30
|
if (entry.kind === "symlink")
|
|
@@ -45,7 +43,7 @@ const failedEntry = (entry) => {
|
|
|
45
43
|
size: entry.size ?? null,
|
|
46
44
|
language: null,
|
|
47
45
|
classifications: entry.kind === "file" ? classifications : ["unknown"],
|
|
48
|
-
content_state:
|
|
46
|
+
content_state: "unreadable",
|
|
49
47
|
limitations: [limitation],
|
|
50
48
|
};
|
|
51
49
|
};
|