rea-agents 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -8,15 +8,18 @@ export const ABORTED = Symbol("aborted");
|
|
|
8
8
|
export const waitForAbortable = async (pending, signal) => {
|
|
9
9
|
if (signal === undefined)
|
|
10
10
|
return pending;
|
|
11
|
-
if (signal.aborted)
|
|
12
|
-
return ABORTED;
|
|
13
11
|
let onAbort;
|
|
14
12
|
const cancelled = new Promise((resolve) => {
|
|
13
|
+
if (signal.aborted) {
|
|
14
|
+
resolve(ABORTED);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
15
17
|
onAbort = () => resolve(ABORTED);
|
|
16
18
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
17
19
|
});
|
|
18
20
|
try {
|
|
19
|
-
|
|
21
|
+
// Even an already-cancelled wait must own the producer's eventual rejection.
|
|
22
|
+
return await Promise.race([cancelled, pending]);
|
|
20
23
|
}
|
|
21
24
|
finally {
|
|
22
25
|
if (onAbort !== undefined)
|
|
@@ -69,10 +69,7 @@ export const inspectAddressContext = async (analysis, input, signal) => {
|
|
|
69
69
|
comment,
|
|
70
70
|
inline_comment: inlineComment,
|
|
71
71
|
bookmarks: bookmarks.state === "available"
|
|
72
|
-
?
|
|
73
|
-
state: "available",
|
|
74
|
-
value: matchingBookmarks(bookmarks.value, resolvedAddress(results[1], input.address)),
|
|
75
|
-
}
|
|
72
|
+
? matchingBookmarks(bookmarks.value, resolvedAddress(results[1], input.address))
|
|
76
73
|
: bookmarks,
|
|
77
74
|
});
|
|
78
75
|
};
|
|
@@ -122,9 +119,24 @@ const resolvedAddress = (result, fallback) => {
|
|
|
122
119
|
};
|
|
123
120
|
const matchingBookmarks = (value, address) => {
|
|
124
121
|
if (!Array.isArray(value))
|
|
125
|
-
return
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
122
|
+
return {
|
|
123
|
+
state: "unavailable",
|
|
124
|
+
reason: "list_bookmarks returned malformed output; expected an array.",
|
|
125
|
+
remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
|
|
126
|
+
};
|
|
127
|
+
if (!value.every(isBookmark))
|
|
128
|
+
return {
|
|
129
|
+
state: "unavailable",
|
|
130
|
+
reason: "list_bookmarks returned malformed entries; expected address and name strings.",
|
|
131
|
+
remediation: "Retry list_bookmarks directly and report the provider output shape if it remains malformed.",
|
|
132
|
+
};
|
|
133
|
+
return {
|
|
134
|
+
state: "available",
|
|
135
|
+
value: value.filter((bookmark) => bookmark.address === address),
|
|
136
|
+
};
|
|
130
137
|
};
|
|
138
|
+
const isBookmark = (value) => typeof value === "object" &&
|
|
139
|
+
value !== null &&
|
|
140
|
+
!Array.isArray(value) &&
|
|
141
|
+
typeof value.address === "string" &&
|
|
142
|
+
typeof value.name === "string";
|
|
@@ -76,7 +76,6 @@ export class AnalysisSnapshotCache {
|
|
|
76
76
|
if (target === undefined || profile === undefined)
|
|
77
77
|
return err(new NoBinaryOpenError());
|
|
78
78
|
return ok({
|
|
79
|
-
snapshot_version: 2,
|
|
80
79
|
target: snapshotTarget(target),
|
|
81
80
|
binding: snapshotBinding(profile),
|
|
82
81
|
entries: this.entries(),
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { parseAnalysisSnapshot, serializeAnalysisSnapshot, } from "../domain/analysisSnapshot.js";
|
|
2
2
|
import { EvidenceFileError, EvidenceIntegrityError } from "../domain/errors.js";
|
|
3
3
|
import { err, ok } from "../domain/result.js";
|
|
4
|
-
import {
|
|
5
|
-
/** Read and validate
|
|
6
|
-
export const readAnalysisSnapshot = async (path
|
|
7
|
-
const loaded = await
|
|
4
|
+
import { readJsonFile, writeTextFile } from "./JsonFiles.js";
|
|
5
|
+
/** Read and validate an analysis snapshot from the caller's path. */
|
|
6
|
+
export const readAnalysisSnapshot = async (path) => {
|
|
7
|
+
const loaded = await readJsonFile(path);
|
|
8
8
|
if (!loaded.ok)
|
|
9
9
|
return loaded;
|
|
10
10
|
try {
|
|
@@ -14,8 +14,8 @@ export const readAnalysisSnapshot = async (path, policy) => {
|
|
|
14
14
|
return err(new EvidenceIntegrityError(snapshotValidationMessage(cause), { cause }));
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
|
-
/** Atomically write a deterministic analysis snapshot
|
|
18
|
-
export const writeAnalysisSnapshot = async (snapshot, path, overwrite
|
|
17
|
+
/** Atomically write a deterministic analysis snapshot to the caller's path. */
|
|
18
|
+
export const writeAnalysisSnapshot = async (snapshot, path, overwrite) => {
|
|
19
19
|
let encoded;
|
|
20
20
|
try {
|
|
21
21
|
encoded = serializeAnalysisSnapshot(snapshot);
|
|
@@ -23,7 +23,7 @@ export const writeAnalysisSnapshot = async (snapshot, path, overwrite, policy) =
|
|
|
23
23
|
catch (cause) {
|
|
24
24
|
return err(new EvidenceIntegrityError(snapshotValidationMessage(cause), { cause }));
|
|
25
25
|
}
|
|
26
|
-
return
|
|
26
|
+
return writeTextFile(encoded, path, overwrite);
|
|
27
27
|
};
|
|
28
28
|
const snapshotValidationMessage = (cause) => cause instanceof TypeError
|
|
29
29
|
? cause.message
|
|
@@ -9,7 +9,7 @@ export const projectAndroidApplicationEvidence = (rawInput) => {
|
|
|
9
9
|
schema: androidApplicationProjectionInputSchema,
|
|
10
10
|
project: projectAndroidApplication,
|
|
11
11
|
operation: OPERATION,
|
|
12
|
-
predicateType: "rea.android-application-graph
|
|
12
|
+
predicateType: "rea.android-application-graph",
|
|
13
13
|
provider: ANDROID_APPLICATION_PROVIDER,
|
|
14
14
|
subjectFormat: () => "apk",
|
|
15
15
|
protocolError: "Android application projection produced an invalid result",
|
|
@@ -9,7 +9,7 @@ export const projectAppleApplicationEvidence = (rawInput) => {
|
|
|
9
9
|
schema: appleApplicationProjectionInputSchema,
|
|
10
10
|
project: projectAppleApplication,
|
|
11
11
|
operation: OPERATION,
|
|
12
|
-
predicateType: "rea.apple-application-graph
|
|
12
|
+
predicateType: "rea.apple-application-graph",
|
|
13
13
|
provider: APPLE_APPLICATION_PROVIDER,
|
|
14
14
|
subjectFormat: () => "ipa",
|
|
15
15
|
protocolError: "Apple application projection produced an invalid result",
|
|
@@ -8,26 +8,35 @@ import { ZipArtifactReader } from "../artifacts/ZipArtifactReader.js";
|
|
|
8
8
|
import { MachOSliceArtifactReader } from "../artifacts/MachOSliceArtifactReader.js";
|
|
9
9
|
import { artifactExtractionResultSchema, } from "../domain/artifactGraph.js";
|
|
10
10
|
import { scanArtifactInventory } from "./ArtifactInventory.js";
|
|
11
|
-
import { digestCanonical
|
|
12
|
-
|
|
13
|
-
/** Extract selected inventory occurrences into an exclusively owned absent root. */
|
|
11
|
+
import { digestCanonical } from "./ArtifactGraphConstruction.js";
|
|
12
|
+
/** Extract every regular inventory occurrence into an exclusively owned absent root. */
|
|
14
13
|
export const extractArtifact = async (input, signal) => {
|
|
15
|
-
validateSelection(input.occurrenceIds);
|
|
16
14
|
const sourcePath = await realpath(input.inputPath);
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
const snapshot = await scanArtifactInventory(sourcePath, {
|
|
16
|
+
signal,
|
|
17
|
+
});
|
|
18
|
+
const selectedOccurrences = snapshot.occurrences.filter((occurrence) => (occurrence.entry_kind === "file" || occurrence.entry_kind === "slice") &&
|
|
19
|
+
occurrence.logical_path !== ".");
|
|
20
|
+
const selectedIds = new Set(selectedOccurrences.map(({ occurrence_id: id }) => id));
|
|
21
|
+
const occurrences = new Map();
|
|
22
|
+
const neededNodes = new Set();
|
|
23
|
+
collectOccurrences(snapshot.occurrences, selectedIds, occurrences, neededNodes);
|
|
24
|
+
const nodes = new Map();
|
|
25
|
+
collectNodes(snapshot.nodes, neededNodes, nodes);
|
|
26
|
+
const inventory = {
|
|
27
|
+
manifest: snapshot.manifest,
|
|
28
|
+
occurrences,
|
|
29
|
+
nodes,
|
|
30
|
+
};
|
|
31
|
+
const selected = selectedOccurrences.map((occurrence) => {
|
|
23
32
|
if ((occurrence.entry_kind !== "file" && occurrence.entry_kind !== "slice") ||
|
|
24
33
|
occurrence.artifact_id === null ||
|
|
25
34
|
occurrence.encrypted ||
|
|
26
35
|
occurrence.logical_path === ".")
|
|
27
|
-
throw new ArtifactReaderFailure("format", `Selected occurrence is not an extractable regular child file: ${
|
|
36
|
+
throw new ArtifactReaderFailure("format", `Selected occurrence is not an extractable regular child file: ${occurrence.occurrence_id}`);
|
|
28
37
|
const node = inventory.nodes.get(occurrence.artifact_id);
|
|
29
38
|
if (node === undefined)
|
|
30
|
-
throw new ArtifactReaderFailure("integrity", `Selected occurrence has no inventory node: ${
|
|
39
|
+
throw new ArtifactReaderFailure("integrity", `Selected occurrence has no inventory node: ${occurrence.occurrence_id}`);
|
|
31
40
|
return { occurrence, node };
|
|
32
41
|
});
|
|
33
42
|
return materializeSelection({
|
|
@@ -41,23 +50,22 @@ export const extractArtifact = async (input, signal) => {
|
|
|
41
50
|
const materializeSelection = async ({ input, sourcePath, inventory, selected, signal, }) => {
|
|
42
51
|
const byPath = new Map(selected.map((item) => [item.occurrence.logical_path, item]));
|
|
43
52
|
const reader = await createReader(sourcePath, input.inputFormat);
|
|
44
|
-
const output = await SafeOutputTree.create(input.outputRoot
|
|
53
|
+
const output = await SafeOutputTree.create(input.outputRoot);
|
|
45
54
|
let readerClosed = false;
|
|
46
55
|
const extracted = [];
|
|
47
56
|
try {
|
|
48
|
-
const
|
|
57
|
+
const materialized = [];
|
|
49
58
|
const registry = new ArtifactPathRegistry();
|
|
50
|
-
let entryCount = 0;
|
|
51
59
|
for await (const entry of reader.entries(signal)) {
|
|
52
|
-
|
|
53
|
-
if (entryCount > input.limits.maxEntries)
|
|
54
|
-
throw new ArtifactReaderFailure("limit", "Artifact entry limit exceeded during extraction");
|
|
55
|
-
const path = normalizeArtifactPath(entry.path, input.limits);
|
|
60
|
+
const path = normalizeArtifactPath(entry.path);
|
|
56
61
|
registry.add(path, entry.kind);
|
|
57
62
|
const selectedItem = byPath.get(path);
|
|
58
|
-
if (selectedItem === undefined)
|
|
63
|
+
if (selectedItem === undefined) {
|
|
64
|
+
if (entry.kind === "file" || entry.kind === "slice")
|
|
65
|
+
throw new ArtifactReaderFailure("integrity", `Regular artifact entry is missing from inventory: ${path}`);
|
|
59
66
|
continue;
|
|
60
|
-
|
|
67
|
+
}
|
|
68
|
+
preflight(entry);
|
|
61
69
|
const stream = await reader.open(entry, signal);
|
|
62
70
|
const written = await output.write(path, stream, selectedItem.node.sha256, signal);
|
|
63
71
|
extracted.push({
|
|
@@ -67,14 +75,12 @@ const materializeSelection = async ({ input, sourcePath, inventory, selected, si
|
|
|
67
75
|
bytes_written: written.bytesWritten,
|
|
68
76
|
created: true,
|
|
69
77
|
});
|
|
70
|
-
|
|
78
|
+
materialized.push(selectedItem);
|
|
71
79
|
}
|
|
72
|
-
if (found.size !== selected.length)
|
|
73
|
-
throw new ArtifactReaderFailure("integrity", "Selected inventory occurrence disappeared before extraction");
|
|
74
80
|
await reader.close();
|
|
75
81
|
readerClosed = true;
|
|
76
82
|
extracted.sort((left, right) => left.relative_path.localeCompare(right.relative_path, "en"));
|
|
77
|
-
const result = createExtractionResult(input, inventory,
|
|
83
|
+
const result = createExtractionResult(input, inventory, materialized, extracted);
|
|
78
84
|
await output.commit();
|
|
79
85
|
return result;
|
|
80
86
|
}
|
|
@@ -87,7 +93,6 @@ const materializeSelection = async ({ input, sourcePath, inventory, selected, si
|
|
|
87
93
|
};
|
|
88
94
|
const createExtractionResult = (input, inventory, selected, extracted) => {
|
|
89
95
|
const extractionSemantic = {
|
|
90
|
-
schema_version: 1,
|
|
91
96
|
source_manifest_id: inventory.manifest.manifest_id,
|
|
92
97
|
selected_occurrence_ids: selected
|
|
93
98
|
.map(({ occurrence }) => occurrence.occurrence_id)
|
|
@@ -101,26 +106,16 @@ const createExtractionResult = (input, inventory, selected, extracted) => {
|
|
|
101
106
|
...extractionSemantic,
|
|
102
107
|
extraction_id: `aex_${digestCanonical(extractionSemantic)}`,
|
|
103
108
|
},
|
|
104
|
-
output_root:
|
|
105
|
-
artifacts:
|
|
109
|
+
output_root: input.outputRoot,
|
|
110
|
+
artifacts: extracted,
|
|
106
111
|
containment_verified: true,
|
|
107
112
|
cleanup: { attempted: false, verified: true, residual_paths: [] },
|
|
108
|
-
limits: toOutputLimits(input.limits),
|
|
109
113
|
provenance: [],
|
|
110
114
|
limitations: [
|
|
111
|
-
"
|
|
115
|
+
"All regular files in the active artifact were materialized; nested archive contents remain represented by their containing file.",
|
|
112
116
|
],
|
|
113
117
|
});
|
|
114
118
|
};
|
|
115
|
-
const loadInventory = async (path, limits, selectedIds, signal) => {
|
|
116
|
-
const snapshot = await scanArtifactInventory(path, limits, { signal });
|
|
117
|
-
const occurrences = new Map();
|
|
118
|
-
const neededNodes = new Set();
|
|
119
|
-
collectOccurrences(snapshot.occurrences, selectedIds, occurrences, neededNodes);
|
|
120
|
-
const nodes = new Map();
|
|
121
|
-
collectNodes(snapshot.nodes, neededNodes, nodes);
|
|
122
|
-
return { manifest: snapshot.manifest, occurrences, nodes };
|
|
123
|
-
};
|
|
124
119
|
const collectOccurrences = (items, selected, output, neededNodes) => {
|
|
125
120
|
for (const item of items) {
|
|
126
121
|
if (!selected.has(item.occurrence_id))
|
|
@@ -150,21 +145,7 @@ const createReader = async (path, format) => {
|
|
|
150
145
|
return new MachOSliceArtifactReader(path);
|
|
151
146
|
throw new ArtifactReaderFailure("unavailable", `Artifact format has no extraction reader: ${format}`);
|
|
152
147
|
};
|
|
153
|
-
const
|
|
154
|
-
if (ids.length === 0 || ids.length > PAGE_SIZE)
|
|
155
|
-
throw new ArtifactReaderFailure("limit", "Extraction requires 1 to 500 explicitly selected occurrences");
|
|
156
|
-
if (new Set(ids).size !== ids.length)
|
|
157
|
-
throw new ArtifactReaderFailure("path", "Extraction occurrence selection contains duplicates");
|
|
158
|
-
};
|
|
159
|
-
const preflight = (entry, limits) => {
|
|
148
|
+
const preflight = (entry) => {
|
|
160
149
|
if ((entry.kind !== "file" && entry.kind !== "slice") || entry.encrypted)
|
|
161
150
|
throw new ArtifactReaderFailure("format", `Selected artifact entry cannot be read: ${entry.path}`);
|
|
162
|
-
if (entry.declaredSize !== null && entry.declaredSize > limits.maxEntryBytes)
|
|
163
|
-
throw new ArtifactReaderFailure("limit", `Selected artifact exceeds byte limit: ${entry.path}`);
|
|
164
|
-
if (entry.declaredSize !== null &&
|
|
165
|
-
entry.compressedSize !== null &&
|
|
166
|
-
(entry.compressedSize === 0
|
|
167
|
-
? entry.declaredSize > 0
|
|
168
|
-
: entry.declaredSize / entry.compressedSize > limits.maxCompressionRatio))
|
|
169
|
-
throw new ArtifactReaderFailure("limit", `Selected artifact exceeds compression ratio limit: ${entry.path}`);
|
|
170
151
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
/** Choose a fresh temporary destination for an artifact extraction. */
|
|
5
|
+
export const createArtifactExtractionDestination = () => join(tmpdir(), `rea-extracted-${randomUUID()}`);
|
|
6
|
+
/** Stable parent scope used to authorize REA-owned extraction destinations. */
|
|
7
|
+
export const artifactExtractionPermissionRoot = () => tmpdir();
|
|
8
|
+
/** Stable filesystem scope for the destination selected internally by REA. */
|
|
9
|
+
export const artifactExtractionPermissionRequest = () => ({
|
|
10
|
+
capability: "artifact_extract",
|
|
11
|
+
roots: [artifactExtractionPermissionRoot()],
|
|
12
|
+
executables: [],
|
|
13
|
+
environment_names: [],
|
|
14
|
+
network: "none",
|
|
15
|
+
mount: false,
|
|
16
|
+
operation_identity: "extract_artifact:temporary_output",
|
|
17
|
+
});
|
|
@@ -19,7 +19,7 @@ export const createOccurrence = (entry, path, parent) => ({
|
|
|
19
19
|
compressed_size: entry.compressedSize,
|
|
20
20
|
executable: entry.executable,
|
|
21
21
|
encrypted: entry.encrypted,
|
|
22
|
-
hash_status: entry.encrypted ? "unavailable" : "not-hashed
|
|
22
|
+
hash_status: entry.encrypted ? "unavailable" : "not-hashed",
|
|
23
23
|
source_location: entry.byteOffset === null || entry.declaredSize === null
|
|
24
24
|
? null
|
|
25
25
|
: { offset: entry.byteOffset, length: entry.declaredSize },
|
|
@@ -82,7 +82,7 @@ export const createRootNode = (input) => createArtifactNode({
|
|
|
82
82
|
contentState: "materialized",
|
|
83
83
|
});
|
|
84
84
|
export const createArtifactNode = (input) => ({
|
|
85
|
-
artifact_id: `art_${digestCanonical({
|
|
85
|
+
artifact_id: `art_${digestCanonical({ sha256: input.sha256 })}`,
|
|
86
86
|
kind: input.kind,
|
|
87
87
|
format: input.format,
|
|
88
88
|
sha256: input.sha256,
|
|
@@ -222,21 +222,6 @@ export const classifyArtifactContent = (path, prefix) => {
|
|
|
222
222
|
};
|
|
223
223
|
return byPath;
|
|
224
224
|
};
|
|
225
|
-
export const pageOf = (items, offset, limit) => ({
|
|
226
|
-
items: items.slice(offset, offset + limit),
|
|
227
|
-
offset,
|
|
228
|
-
limit,
|
|
229
|
-
total: items.length,
|
|
230
|
-
next_offset: offset + limit < items.length ? offset + limit : null,
|
|
231
|
-
});
|
|
232
|
-
export const toOutputLimits = (limits) => ({
|
|
233
|
-
max_entries: limits.maxEntries,
|
|
234
|
-
max_total_bytes: limits.maxTotalBytes,
|
|
235
|
-
max_entry_bytes: limits.maxEntryBytes,
|
|
236
|
-
max_compression_ratio: limits.maxCompressionRatio,
|
|
237
|
-
max_depth: limits.maxDepth,
|
|
238
|
-
max_path_bytes: limits.maxPathBytes,
|
|
239
|
-
});
|
|
240
225
|
export const digestCanonical = (value) => {
|
|
241
226
|
const encoded = canonicalize(value);
|
|
242
227
|
if (encoded === undefined)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { open } from "node:fs/promises";
|
|
2
2
|
import { classifyArtifactPath } from "../ArtifactGraphConstruction.js";
|
|
3
|
-
import { zipPackageFormatForPath } from "../../domain/zipPackageFormat.js";
|
|
3
|
+
import { hasZipSignature, zipPackageFormatForPath, } from "../../domain/zipPackageFormat.js";
|
|
4
4
|
const classifyContainerExtension = (path) => {
|
|
5
5
|
const lower = path.toLowerCase();
|
|
6
6
|
const zipPackage = zipPackageFormatForPath(lower);
|
|
@@ -21,11 +21,7 @@ export const classifyRoot = async (path, directory) => {
|
|
|
21
21
|
try {
|
|
22
22
|
const magic = Buffer.alloc(4);
|
|
23
23
|
const observed = await handle.read(magic, 0, magic.length, 0);
|
|
24
|
-
if (observed.bytesRead
|
|
25
|
-
magic[0] === 0x50 &&
|
|
26
|
-
magic[1] === 0x4b &&
|
|
27
|
-
[0x03, 0x05, 0x07].includes(magic[2] ?? -1) &&
|
|
28
|
-
[0x04, 0x06, 0x08].includes(magic[3] ?? -1))
|
|
24
|
+
if (hasZipSignature(magic.subarray(0, observed.bytesRead)))
|
|
29
25
|
return "zip";
|
|
30
26
|
if (observed.bytesRead === 4) {
|
|
31
27
|
const header = magic.readUInt32BE(0);
|
|
@@ -1,25 +1,11 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { ArtifactReaderFailure
|
|
2
|
+
import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
|
|
3
3
|
import { streamChunkToBuffer } from "../../artifacts/StreamBytes.js";
|
|
4
4
|
export const abortIfNeeded = (signal) => {
|
|
5
5
|
if (signal?.aborted === true)
|
|
6
6
|
throw new ArtifactReaderFailure("cancelled", "Artifact inventory cancelled");
|
|
7
7
|
};
|
|
8
|
-
export const
|
|
9
|
-
if (entry.declaredSize !== null && entry.declaredSize > limits.maxEntryBytes)
|
|
10
|
-
throw new ArtifactReaderFailure("limit", `Entry exceeds byte limit: ${entry.path}`);
|
|
11
|
-
if (entry.declaredSize !== null &&
|
|
12
|
-
entry.compressedSize !== null &&
|
|
13
|
-
entry.compressedSize === 0 &&
|
|
14
|
-
entry.declaredSize > 0)
|
|
15
|
-
throw new ArtifactReaderFailure("limit", `Invalid compression ratio: ${entry.path}`);
|
|
16
|
-
if (entry.declaredSize !== null &&
|
|
17
|
-
entry.compressedSize !== null &&
|
|
18
|
-
entry.compressedSize > 0 &&
|
|
19
|
-
entry.declaredSize / entry.compressedSize > limits.maxCompressionRatio)
|
|
20
|
-
throw new ArtifactReaderFailure("limit", `Compression ratio exceeds limit: ${entry.path}`);
|
|
21
|
-
};
|
|
22
|
-
export const hashReadable = async (stream, maximum, signal) => {
|
|
8
|
+
export const hashReadable = async (stream, signal) => {
|
|
23
9
|
const hash = createHash("sha256");
|
|
24
10
|
const prefixes = [];
|
|
25
11
|
let prefixBytes = 0;
|
|
@@ -28,10 +14,6 @@ export const hashReadable = async (stream, maximum, signal) => {
|
|
|
28
14
|
abortIfNeeded(signal);
|
|
29
15
|
const chunk = streamChunkToBuffer(raw);
|
|
30
16
|
bytes += chunk.length;
|
|
31
|
-
if (bytes > maximum) {
|
|
32
|
-
stream.destroy();
|
|
33
|
-
throw new ArtifactReaderFailure("limit", "Observed entry bytes exceed limit");
|
|
34
|
-
}
|
|
35
17
|
hash.update(chunk);
|
|
36
18
|
if (prefixBytes < 16) {
|
|
37
19
|
const selected = chunk.subarray(0, 16 - prefixBytes);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
|
|
2
|
+
/** Resolve caller approval and operator policy before native reader selection. */
|
|
3
|
+
export const resolveNativeMountPolicy = (approved, enabled) => {
|
|
4
|
+
if (!approved)
|
|
5
|
+
return { status: "disabled" };
|
|
6
|
+
if (!enabled)
|
|
7
|
+
throw new ArtifactReaderFailure("unavailable", "Native DMG mounting is disabled by operator policy");
|
|
8
|
+
return { status: "approved" };
|
|
9
|
+
};
|
|
10
|
+
/** Resolve parsed caller intent and operator policy before artifact scanning. */
|
|
11
|
+
export const resolveArtifactIntegrityPolicy = (intent, enabled) => {
|
|
12
|
+
if (intent.mode === "fail")
|
|
13
|
+
return intent;
|
|
14
|
+
if (!enabled)
|
|
15
|
+
throw new ArtifactReaderFailure("policy", "Integrity continuation requires explicit approval and operator policy");
|
|
16
|
+
return intent;
|
|
17
|
+
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { AsarArtifactReader } from "../../artifacts/AsarArtifactReader.js";
|
|
2
|
-
import { ArtifactReaderFailure, } from "../../artifacts/ArtifactReader.js";
|
|
3
2
|
import { DirectoryArtifactReader } from "../../artifacts/DirectoryArtifactReader.js";
|
|
4
3
|
import { MachOSliceArtifactReader } from "../../artifacts/MachOSliceArtifactReader.js";
|
|
5
4
|
import { NativeDmgArtifactReader } from "../../artifacts/NativeDmgArtifactReader.js";
|
|
@@ -21,10 +20,8 @@ export const createReader = async (path, format, nativeMount, signal) => {
|
|
|
21
20
|
? new MachOSliceArtifactReader(path)
|
|
22
21
|
: undefined;
|
|
23
22
|
case "dmg":
|
|
24
|
-
if (
|
|
23
|
+
if (nativeMount.status === "disabled")
|
|
25
24
|
return undefined;
|
|
26
|
-
if (!nativeMount.nativeMountEnabled)
|
|
27
|
-
throw new ArtifactReaderFailure("unavailable", "Native DMG mounting is disabled by operator policy");
|
|
28
25
|
return NativeDmgArtifactReader.create(path, signal);
|
|
29
26
|
default:
|
|
30
27
|
return undefined;
|
|
@@ -2,32 +2,28 @@ import { createReadStream } from "node:fs";
|
|
|
2
2
|
import { lstat } from "node:fs/promises";
|
|
3
3
|
import { ArtifactReaderFailure, } from "../../artifacts/ArtifactReader.js";
|
|
4
4
|
import { artifactInventoryResultSchema, } from "../../domain/artifactGraph.js";
|
|
5
|
-
import { createArtifactEdges, createRootNode, digestCanonical, indexOccurrencesByPath, materializeDirectoryNodes, rekeyOccurrences, rootOccurrenceFor,
|
|
5
|
+
import { createArtifactEdges, createRootNode, digestCanonical, indexOccurrencesByPath, materializeDirectoryNodes, rekeyOccurrences, rootOccurrenceFor, } from "../ArtifactGraphConstruction.js";
|
|
6
6
|
import { classifyRoot } from "./classify.js";
|
|
7
7
|
import { hashReadable } from "./hash.js";
|
|
8
8
|
import { createReader, inventoryLimitations } from "./reader.js";
|
|
9
9
|
import { scanReader, } from "./scanReader.js";
|
|
10
10
|
import { NATIVE_MOUNT_DISABLED, STRICT_INTEGRITY_POLICY, } from "./types.js";
|
|
11
|
-
export const scanCanonicalArtifactInventory = async (path,
|
|
11
|
+
export const scanCanonicalArtifactInventory = async (path, options = {}) => {
|
|
12
12
|
const integrity = options.integrity ?? STRICT_INTEGRITY_POLICY;
|
|
13
|
-
if (integrity.mode === "record-and-continue" &&
|
|
14
|
-
(!integrity.approved || !integrity.enabled))
|
|
15
|
-
throw new ArtifactReaderFailure("policy", "Integrity continuation requires explicit approval and operator policy");
|
|
16
13
|
const metadata = await lstat(path);
|
|
17
14
|
const rootFormat = await classifyRoot(path, metadata.isDirectory());
|
|
18
15
|
const rootDigest = metadata.isDirectory()
|
|
19
16
|
? null
|
|
20
|
-
: await hashReadable(createReadStream(path),
|
|
17
|
+
: await hashReadable(createReadStream(path), options.signal);
|
|
21
18
|
const reader = await createReader(path, rootFormat, options.nativeMount ?? NATIVE_MOUNT_DISABLED, options.signal);
|
|
22
19
|
try {
|
|
23
|
-
const { nodes, occurrences, pendingContradictions } = await scanReader(reader,
|
|
20
|
+
const { nodes, occurrences, pendingContradictions } = await scanReader(reader, options.signal, integrity);
|
|
24
21
|
return await buildInventorySnapshot({
|
|
25
22
|
path,
|
|
26
23
|
metadata,
|
|
27
24
|
rootFormat,
|
|
28
25
|
rootDigest,
|
|
29
26
|
reader,
|
|
30
|
-
limits,
|
|
31
27
|
signal: options.signal,
|
|
32
28
|
nodes,
|
|
33
29
|
occurrences,
|
|
@@ -39,7 +35,7 @@ export const scanCanonicalArtifactInventory = async (path, limits, options = {})
|
|
|
39
35
|
}
|
|
40
36
|
};
|
|
41
37
|
const buildInventorySnapshot = async (input) => {
|
|
42
|
-
const { path, metadata, rootFormat, rootDigest, reader,
|
|
38
|
+
const { path, metadata, rootFormat, rootDigest, reader, signal } = input;
|
|
43
39
|
materializeDirectoryNodes(input.occurrences, input.nodes);
|
|
44
40
|
const rootNode = createRootNode({
|
|
45
41
|
path,
|
|
@@ -65,7 +61,7 @@ const buildInventorySnapshot = async (input) => {
|
|
|
65
61
|
const orderedNodes = sortNodes([...input.nodes.values()]);
|
|
66
62
|
const orderedOccurrences = sortOccurrences(input.occurrences);
|
|
67
63
|
const orderedEdges = sortEdges(edges);
|
|
68
|
-
await verifyRootDigest(path, rootDigest,
|
|
64
|
+
await verifyRootDigest(path, rootDigest, signal);
|
|
69
65
|
const graphSha256 = digestCanonical({
|
|
70
66
|
nodes: orderedNodes,
|
|
71
67
|
occurrences: orderedOccurrences,
|
|
@@ -84,7 +80,6 @@ const buildInventorySnapshot = async (input) => {
|
|
|
84
80
|
nodes: orderedNodes,
|
|
85
81
|
occurrences: orderedOccurrences,
|
|
86
82
|
edges: orderedEdges,
|
|
87
|
-
limits: toOutputLimits(limits),
|
|
88
83
|
provenance: reader?.provenance() ?? [],
|
|
89
84
|
integrity_contradictions: integrityContradictions,
|
|
90
85
|
limitations: buildLimitations(rootFormat, reader, integrityContradictions),
|
|
@@ -119,10 +114,10 @@ const buildIntegrityContradictions = (pending, occurrenceByPath, occurrenceById,
|
|
|
119
114
|
],
|
|
120
115
|
};
|
|
121
116
|
});
|
|
122
|
-
const verifyRootDigest = async (path, rootDigest,
|
|
117
|
+
const verifyRootDigest = async (path, rootDigest, signal) => {
|
|
123
118
|
if (rootDigest === null)
|
|
124
119
|
return;
|
|
125
|
-
const verified = await hashReadable(createReadStream(path),
|
|
120
|
+
const verified = await hashReadable(createReadStream(path), signal);
|
|
126
121
|
if (verified.sha256 !== rootDigest.sha256 ||
|
|
127
122
|
verified.bytes !== rootDigest.bytes)
|
|
128
123
|
throw new ArtifactReaderFailure("integrity", "Root artifact changed during inventory");
|
|
@@ -131,9 +126,7 @@ const sortNodes = (nodes) => nodes.sort((left, right) => left.artifact_id.locale
|
|
|
131
126
|
const sortOccurrences = (occurrences) => occurrences.sort((left, right) => left.logical_path.localeCompare(right.logical_path, "en"));
|
|
132
127
|
const sortEdges = (edges) => edges.sort((left, right) => left.edge_id.localeCompare(right.edge_id));
|
|
133
128
|
const buildManifest = ({ rootNode, graphSha256, orderedNodes, orderedOccurrences, orderedEdges, }) => artifactInventoryResultSchema.shape.manifest.parse({
|
|
134
|
-
schema_version: 1,
|
|
135
129
|
manifest_id: `agm_${digestCanonical({
|
|
136
|
-
schema_version: 1,
|
|
137
130
|
root_artifact_id: rootNode.artifact_id,
|
|
138
131
|
graph_sha256: graphSha256,
|
|
139
132
|
})}`,
|