rea-agents 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { AnalysisOutputError } from "../domain/errors.js";
|
|
2
|
-
import { parseAddressedPage } from "../domain/hopperValues.js";
|
|
3
|
-
import { err, ok } from "../domain/result.js";
|
|
4
|
-
/** Read all addressed entries while enforcing advancing provider pagination. */
|
|
5
|
-
export const readAllAddressed = async (input) => {
|
|
6
|
-
const entries = [];
|
|
7
|
-
let offset = 0;
|
|
8
|
-
while (true) {
|
|
9
|
-
const result = await input.call(input.tool, { offset, limit: 500 }, input.signal);
|
|
10
|
-
if (!result.ok)
|
|
11
|
-
return result;
|
|
12
|
-
const page = parseAddressedPage(result.value);
|
|
13
|
-
if (!page.ok)
|
|
14
|
-
return page;
|
|
15
|
-
entries.push(...page.value.items);
|
|
16
|
-
if (!page.value.hasMore || page.value.nextOffset === null)
|
|
17
|
-
return ok(entries);
|
|
18
|
-
if (page.value.nextOffset <= offset)
|
|
19
|
-
return err(new AnalysisOutputError(input.tool, "provider returned a non-advancing pagination offset"));
|
|
20
|
-
offset = page.value.nextOffset;
|
|
21
|
-
}
|
|
22
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { EvidenceReferenceError } from "../domain/errors.js";
|
|
2
|
-
import { err, ok } from "../domain/result.js";
|
|
3
|
-
/** Resolve IDs without accepting the digest-shaped identifier as proof itself. */
|
|
4
|
-
export const resolveEvidenceReferences = (lookup, evidenceIds, expected) => {
|
|
5
|
-
const records = [];
|
|
6
|
-
for (const evidenceId of evidenceIds) {
|
|
7
|
-
const record = lookup?.(evidenceId);
|
|
8
|
-
if (record === undefined)
|
|
9
|
-
return err(new EvidenceReferenceError(evidenceId, "missing", expectationDescription(expected), null));
|
|
10
|
-
if (expected !== undefined) {
|
|
11
|
-
const operations = expected.filter(({ operation }) => operation === record.operation);
|
|
12
|
-
if (operations.length === 0)
|
|
13
|
-
return err(new EvidenceReferenceError(evidenceId, "wrong_operation", unique(expected.map(({ operation }) => operation)).join(" | "), record.operation));
|
|
14
|
-
if (!operations.some(({ predicate }) => predicate === record.predicate_type))
|
|
15
|
-
return err(new EvidenceReferenceError(evidenceId, "wrong_predicate", unique(operations.map(({ predicate }) => predicate)).join(" | "), record.predicate_type));
|
|
16
|
-
}
|
|
17
|
-
records.push(record);
|
|
18
|
-
}
|
|
19
|
-
return ok(records);
|
|
20
|
-
};
|
|
21
|
-
const expectationDescription = (expected) => expected === undefined
|
|
22
|
-
? "Evidence in the current authority"
|
|
23
|
-
: expected
|
|
24
|
-
.map(({ operation, predicate }) => `${operation}:${predicate}`)
|
|
25
|
-
.join(" | ");
|
|
26
|
-
const unique = (values) => [...new Set(values)];
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { lstat, open, readFile, realpath, unlink, } from "node:fs/promises";
|
|
2
|
-
import { basename, dirname, isAbsolute, relative, resolve } from "node:path";
|
|
3
|
-
import writeFileAtomic from "write-file-atomic";
|
|
4
|
-
import { isJsonWithinLimits } from "../domain/jsonLimits.js";
|
|
5
|
-
import { InvestigationWorkspaceError } from "../domain/errors.js";
|
|
6
|
-
import { parseInvestigationWorkspace, serializeInvestigationWorkspace, } from "../domain/investigationWorkspace.js";
|
|
7
|
-
import { err, ok } from "../domain/result.js";
|
|
8
|
-
const investigationWorkspaceCodec = {
|
|
9
|
-
parse: parseInvestigationWorkspace,
|
|
10
|
-
serialize: serializeInvestigationWorkspace,
|
|
11
|
-
validateNext: validateNextRevision,
|
|
12
|
-
};
|
|
13
|
-
/** Read a validated workspace, returning null only when it does not exist. */
|
|
14
|
-
export const readInvestigationWorkspace = async (path, policy) => readRevisionedWorkspace(path, policy, investigationWorkspaceCodec);
|
|
15
|
-
/** Read one root-confined, owner-only revisioned workspace document. */
|
|
16
|
-
export const readRevisionedWorkspace = async (path, policy, codec) => {
|
|
17
|
-
if (policy.roots.length === 0)
|
|
18
|
-
return err(new InvestigationWorkspaceError("read", "disabled"));
|
|
19
|
-
try {
|
|
20
|
-
const destination = await resolveDestination(path, policy.roots);
|
|
21
|
-
if (destination === null)
|
|
22
|
-
return err(new InvestigationWorkspaceError("read", "outside-root"));
|
|
23
|
-
return await readWorkspaceFile(destination, policy, codec);
|
|
24
|
-
}
|
|
25
|
-
catch (cause) {
|
|
26
|
-
return err(new InvestigationWorkspaceError("read", "io", { cause }));
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
/** Atomically append one CAS-linked workspace revision under an exclusive lock. */
|
|
30
|
-
export const writeInvestigationWorkspace = async (workspace, path, expectedRevision, policy) => writeRevisionedWorkspace(path, policy, {
|
|
31
|
-
document: workspace,
|
|
32
|
-
expectedRevision,
|
|
33
|
-
codec: investigationWorkspaceCodec,
|
|
34
|
-
});
|
|
35
|
-
/** Atomically append one validated CAS-linked revision under an exclusive lock. */
|
|
36
|
-
export const writeRevisionedWorkspace = async (path, policy, input) => {
|
|
37
|
-
const { document, expectedRevision, codec } = input;
|
|
38
|
-
if (policy.roots.length === 0)
|
|
39
|
-
return err(new InvestigationWorkspaceError("update", "disabled"));
|
|
40
|
-
let encoded;
|
|
41
|
-
try {
|
|
42
|
-
encoded = codec.serialize(document);
|
|
43
|
-
}
|
|
44
|
-
catch (cause) {
|
|
45
|
-
return err(new InvestigationWorkspaceError("update", "integrity", { cause }));
|
|
46
|
-
}
|
|
47
|
-
const bytes = Buffer.byteLength(encoded, "utf8");
|
|
48
|
-
if (bytes > policy.maxBytes)
|
|
49
|
-
return err(new InvestigationWorkspaceError("update", "too-large"));
|
|
50
|
-
let lock;
|
|
51
|
-
try {
|
|
52
|
-
const destination = await resolveDestination(path, policy.roots);
|
|
53
|
-
if (destination === null)
|
|
54
|
-
return err(new InvestigationWorkspaceError("update", "outside-root"));
|
|
55
|
-
const acquired = await acquireLock(destination);
|
|
56
|
-
if (!acquired.ok)
|
|
57
|
-
return acquired;
|
|
58
|
-
lock = acquired.value;
|
|
59
|
-
const current = await readWorkspaceFile(destination, policy, codec);
|
|
60
|
-
if (!current.ok)
|
|
61
|
-
return current;
|
|
62
|
-
const checked = codec.validateNext(current.value, document, expectedRevision);
|
|
63
|
-
if (!checked.ok)
|
|
64
|
-
return checked;
|
|
65
|
-
await writeFileAtomic(destination, encoded, {
|
|
66
|
-
encoding: "utf8",
|
|
67
|
-
mode: 0o600,
|
|
68
|
-
fsync: true,
|
|
69
|
-
});
|
|
70
|
-
return ok({ path: resolve(path), bytes });
|
|
71
|
-
}
|
|
72
|
-
catch (cause) {
|
|
73
|
-
return err(new InvestigationWorkspaceError("update", "io", { cause }));
|
|
74
|
-
}
|
|
75
|
-
finally {
|
|
76
|
-
if (lock !== undefined)
|
|
77
|
-
await releaseLock(lock);
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
const resolveDestination = async (path, roots) => {
|
|
81
|
-
const requested = resolve(path);
|
|
82
|
-
const canonicalParent = await realpath(dirname(requested));
|
|
83
|
-
const destination = resolve(canonicalParent, basename(requested));
|
|
84
|
-
for (const configuredRoot of roots) {
|
|
85
|
-
const root = await realpath(resolve(configuredRoot));
|
|
86
|
-
const relation = relative(root, destination);
|
|
87
|
-
if (relation === "" ||
|
|
88
|
-
(!relation.startsWith("..") && !isAbsolute(relation)))
|
|
89
|
-
return destination;
|
|
90
|
-
}
|
|
91
|
-
return null;
|
|
92
|
-
};
|
|
93
|
-
const readWorkspaceFile = async (destination, policy, codec) => {
|
|
94
|
-
const stats = await lstat(destination).catch((cause) => {
|
|
95
|
-
if (isFileNotFound(cause))
|
|
96
|
-
return undefined;
|
|
97
|
-
throw cause;
|
|
98
|
-
});
|
|
99
|
-
if (stats === undefined)
|
|
100
|
-
return ok(null);
|
|
101
|
-
if (!stats.isFile() || stats.isSymbolicLink())
|
|
102
|
-
return err(new InvestigationWorkspaceError("read", "not-file"));
|
|
103
|
-
if (stats.size > policy.maxBytes)
|
|
104
|
-
return err(new InvestigationWorkspaceError("read", "too-large"));
|
|
105
|
-
const encoded = await readFile(destination);
|
|
106
|
-
if (encoded.byteLength > policy.maxBytes)
|
|
107
|
-
return err(new InvestigationWorkspaceError("read", "too-large"));
|
|
108
|
-
let decoded;
|
|
109
|
-
try {
|
|
110
|
-
decoded = JSON.parse(encoded.toString("utf8"));
|
|
111
|
-
}
|
|
112
|
-
catch (cause) {
|
|
113
|
-
return err(new InvestigationWorkspaceError("read", "invalid-json", { cause }));
|
|
114
|
-
}
|
|
115
|
-
if (!isJsonWithinLimits(decoded, policy))
|
|
116
|
-
return err(new InvestigationWorkspaceError("read", "too-large"));
|
|
117
|
-
try {
|
|
118
|
-
return ok(codec.parse(decoded));
|
|
119
|
-
}
|
|
120
|
-
catch (cause) {
|
|
121
|
-
return err(new InvestigationWorkspaceError("read", "integrity", { cause }));
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
const acquireLock = async (destination) => {
|
|
125
|
-
const path = `${destination}.lock`;
|
|
126
|
-
try {
|
|
127
|
-
return ok(await createLock(path));
|
|
128
|
-
}
|
|
129
|
-
catch (cause) {
|
|
130
|
-
if (isAlreadyExists(cause) && (await removeStaleLock(path))) {
|
|
131
|
-
try {
|
|
132
|
-
return ok(await createLock(path));
|
|
133
|
-
}
|
|
134
|
-
catch (retryCause) {
|
|
135
|
-
return err(new InvestigationWorkspaceError("update", isAlreadyExists(retryCause) ? "locked" : "io", { cause: retryCause }));
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return err(new InvestigationWorkspaceError("update", isAlreadyExists(cause) ? "locked" : "io", { cause }));
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
const createLock = async (path) => {
|
|
142
|
-
const handle = await open(path, "wx", 0o600);
|
|
143
|
-
try {
|
|
144
|
-
await handle.writeFile(`${String(process.pid)}\n`, "utf8");
|
|
145
|
-
await handle.sync();
|
|
146
|
-
return { path, handle };
|
|
147
|
-
}
|
|
148
|
-
catch (cause) {
|
|
149
|
-
await handle.close().catch(() => undefined);
|
|
150
|
-
await unlink(path).catch(() => undefined);
|
|
151
|
-
throw cause;
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
const removeStaleLock = async (path) => {
|
|
155
|
-
try {
|
|
156
|
-
const stats = await lstat(path);
|
|
157
|
-
if (!stats.isFile() || stats.isSymbolicLink() || stats.size > 32)
|
|
158
|
-
return false;
|
|
159
|
-
const encoded = (await readFile(path, "utf8")).trim();
|
|
160
|
-
if (!/^[1-9][0-9]{0,9}$/u.test(encoded))
|
|
161
|
-
return false;
|
|
162
|
-
const pid = Number(encoded);
|
|
163
|
-
if (processIsAlive(pid))
|
|
164
|
-
return false;
|
|
165
|
-
await unlink(path);
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
return false;
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
const processIsAlive = (pid) => {
|
|
173
|
-
try {
|
|
174
|
-
process.kill(pid, 0);
|
|
175
|
-
return true;
|
|
176
|
-
}
|
|
177
|
-
catch (cause) {
|
|
178
|
-
return errorCode(cause) !== "ESRCH";
|
|
179
|
-
}
|
|
180
|
-
};
|
|
181
|
-
const releaseLock = async (lock) => {
|
|
182
|
-
await lock.handle.close().catch(() => undefined);
|
|
183
|
-
await unlink(lock.path).catch(() => undefined);
|
|
184
|
-
};
|
|
185
|
-
function validateNextRevision(current, next, expectedRevision) {
|
|
186
|
-
if ((current?.revision ?? null) !== expectedRevision)
|
|
187
|
-
return err(new InvestigationWorkspaceError("update", "revision-conflict"));
|
|
188
|
-
if (current === null) {
|
|
189
|
-
return next.revision === 1 && next.previous_revision_digest === null
|
|
190
|
-
? ok(null)
|
|
191
|
-
: err(new InvestigationWorkspaceError("update", "revision-conflict"));
|
|
192
|
-
}
|
|
193
|
-
if (current.name !== next.name || current.workspace_id !== next.workspace_id)
|
|
194
|
-
return err(new InvestigationWorkspaceError("update", "name-conflict"));
|
|
195
|
-
return next.revision === current.revision + 1 &&
|
|
196
|
-
next.previous_revision_digest === current.revision_digest
|
|
197
|
-
? ok(null)
|
|
198
|
-
: err(new InvestigationWorkspaceError("update", "revision-conflict"));
|
|
199
|
-
}
|
|
200
|
-
const isFileNotFound = (cause) => errorCode(cause) === "ENOENT";
|
|
201
|
-
const isAlreadyExists = (cause) => errorCode(cause) === "EEXIST";
|
|
202
|
-
const errorCode = (cause) => typeof cause === "object" && cause !== null && "code" in cause
|
|
203
|
-
? cause.code
|
|
204
|
-
: undefined;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { processCaptureCancelled, } from "./ProcessCaptureError.js";
|
|
2
|
-
import { captureProcessScenario } from "./ProcessHarness.js";
|
|
3
|
-
import { compareProcessCaptures } from "../domain/processComparison.js";
|
|
4
|
-
import { PROCESS_COMPARISON_DIMENSIONS } from "../domain/processComparison.js";
|
|
5
|
-
import { analyzeProcessRepeatability, bindProcessScenario, } from "../domain/processPairedExperiment.js";
|
|
6
|
-
import { err, ok } from "../domain/result.js";
|
|
7
|
-
const productionCapturePort = {
|
|
8
|
-
capture: captureProcessScenario,
|
|
9
|
-
};
|
|
10
|
-
const captureRepeats = async (input) => {
|
|
11
|
-
const captures = [];
|
|
12
|
-
for (let index = 0; index < input.repeatCount; index += 1) {
|
|
13
|
-
if (input.signal?.aborted === true)
|
|
14
|
-
return err(processCaptureCancelled());
|
|
15
|
-
const capture = await input.port.capture(input.scenario, input.policy, input.signal);
|
|
16
|
-
if (!capture.ok)
|
|
17
|
-
return err(capture.error);
|
|
18
|
-
captures.push(capture.value);
|
|
19
|
-
}
|
|
20
|
-
return ok(captures);
|
|
21
|
-
};
|
|
22
|
-
/** Execute repeatability-first authority/candidate captures under one contract. */
|
|
23
|
-
export const runPairedProcessExperiment = async (experiment, policy, options = {}) => {
|
|
24
|
-
const port = options.capturePort ?? productionCapturePort;
|
|
25
|
-
const authorityScenario = bindProcessScenario(experiment.shared_scenario, experiment.authority);
|
|
26
|
-
const candidateScenario = bindProcessScenario(experiment.shared_scenario, experiment.candidate);
|
|
27
|
-
const authorityRuns = await captureRepeats({
|
|
28
|
-
scenario: authorityScenario,
|
|
29
|
-
repeatCount: experiment.repeat_count,
|
|
30
|
-
policy,
|
|
31
|
-
port,
|
|
32
|
-
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
33
|
-
});
|
|
34
|
-
if (!authorityRuns.ok)
|
|
35
|
-
return authorityRuns;
|
|
36
|
-
const candidateRuns = await captureRepeats({
|
|
37
|
-
scenario: candidateScenario,
|
|
38
|
-
repeatCount: experiment.repeat_count,
|
|
39
|
-
policy,
|
|
40
|
-
port,
|
|
41
|
-
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
42
|
-
});
|
|
43
|
-
if (!candidateRuns.ok)
|
|
44
|
-
return candidateRuns;
|
|
45
|
-
const authorityRepeatability = analyzeProcessRepeatability(authorityRuns.value, experiment.required_dimensions);
|
|
46
|
-
const candidateRepeatability = analyzeProcessRepeatability(candidateRuns.value, experiment.required_dimensions);
|
|
47
|
-
const stable = authorityRepeatability.stable && candidateRepeatability.stable;
|
|
48
|
-
const allDimensionsRequired = PROCESS_COMPARISON_DIMENSIONS.every((dimension) => experiment.required_dimensions.includes(dimension));
|
|
49
|
-
const authorityLatest = authorityRuns.value.at(-1);
|
|
50
|
-
const candidateLatest = candidateRuns.value.at(-1);
|
|
51
|
-
const crossSide = stable &&
|
|
52
|
-
allDimensionsRequired &&
|
|
53
|
-
authorityLatest !== undefined &&
|
|
54
|
-
candidateLatest !== undefined
|
|
55
|
-
? compareProcessCaptures(authorityLatest, candidateLatest, {
|
|
56
|
-
maxCaptureAgeMs: experiment.freshness_policy.max_capture_age_ms,
|
|
57
|
-
...(options.now === undefined ? {} : { now: options.now }),
|
|
58
|
-
})
|
|
59
|
-
: null;
|
|
60
|
-
return ok({
|
|
61
|
-
authority_runs: authorityRuns.value,
|
|
62
|
-
candidate_runs: candidateRuns.value,
|
|
63
|
-
authority_repeatability: authorityRepeatability,
|
|
64
|
-
candidate_repeatability: candidateRepeatability,
|
|
65
|
-
cross_side: crossSide,
|
|
66
|
-
cross_side_blocked_reason: crossSide !== null
|
|
67
|
-
? null
|
|
68
|
-
: !allDimensionsRequired
|
|
69
|
-
? "Cross-side comparison is blocked until every returned dimension is required and repeatable."
|
|
70
|
-
: "Cross-side comparison is blocked because a required same-side dimension is unstable.",
|
|
71
|
-
});
|
|
72
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { InvestigationWorkspaceError } from "../domain/errors.js";
|
|
2
|
-
import { parseReconstructionCoverageWorkspace, serializeReconstructionCoverageWorkspace, } from "../domain/reconstructionCoverage.js";
|
|
3
|
-
import { err, ok } from "../domain/result.js";
|
|
4
|
-
import { readRevisionedWorkspace, writeRevisionedWorkspace, } from "./InvestigationWorkspaceStore.js";
|
|
5
|
-
const codec = {
|
|
6
|
-
parse: parseReconstructionCoverageWorkspace,
|
|
7
|
-
serialize: serializeReconstructionCoverageWorkspace,
|
|
8
|
-
validateNext: (current, next, expectedRevision) => {
|
|
9
|
-
if ((current?.revision ?? null) !== expectedRevision)
|
|
10
|
-
return err(new InvestigationWorkspaceError("update", "revision-conflict"));
|
|
11
|
-
if (current === null)
|
|
12
|
-
return next.revision === 1 && next.previous_revision_sha256 === null
|
|
13
|
-
? ok(null)
|
|
14
|
-
: err(new InvestigationWorkspaceError("update", "revision-conflict"));
|
|
15
|
-
if (current.name !== next.name ||
|
|
16
|
-
current.workspace_id !== next.workspace_id)
|
|
17
|
-
return err(new InvestigationWorkspaceError("update", "name-conflict"));
|
|
18
|
-
return next.revision === current.revision + 1 &&
|
|
19
|
-
next.previous_revision_sha256 === current.revision_sha256
|
|
20
|
-
? ok(null)
|
|
21
|
-
: err(new InvestigationWorkspaceError("update", "revision-conflict"));
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
/** Read a validated reconstruction coverage workspace revision. */
|
|
25
|
-
export const readReconstructionCoverageWorkspace = (path, policy) => readRevisionedWorkspace(path, policy, codec);
|
|
26
|
-
/** Atomically append one reconstruction coverage workspace CAS revision. */
|
|
27
|
-
export const writeReconstructionCoverageWorkspace = (workspace, path, expectedRevision, policy) => writeRevisionedWorkspace(path, policy, {
|
|
28
|
-
document: workspace,
|
|
29
|
-
expectedRevision,
|
|
30
|
-
codec,
|
|
31
|
-
});
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { AnalysisInputError, AnalysisProtocolError, } from "../domain/errors.js";
|
|
3
|
-
import { createEvidence } from "../domain/evidence.js";
|
|
4
|
-
import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
|
|
5
|
-
import { createReconstructionReadinessReport } from "../domain/reconstructionReadiness.js";
|
|
6
|
-
import { reconstructionReadinessInputSchema, } from "../domain/reconstructionReadinessSchemas.js";
|
|
7
|
-
import { err, ok } from "../domain/result.js";
|
|
8
|
-
import { JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER } from "./InvestigationProviders.js";
|
|
9
|
-
const OPERATION = "evaluate_reconstruction_readiness";
|
|
10
|
-
/** Parse one portable readiness request for both CLI and MCP adapters. */
|
|
11
|
-
export const resolveReconstructionReadinessRequest = (input) => {
|
|
12
|
-
const parsed = reconstructionReadinessInputSchema.safeParse(input);
|
|
13
|
-
return parsed.success
|
|
14
|
-
? ok(parsed.data)
|
|
15
|
-
: err(new AnalysisInputError(OPERATION, { cause: parsed.error }));
|
|
16
|
-
};
|
|
17
|
-
/** Evaluate and wrap one deterministic readiness report in Evidence v2. */
|
|
18
|
-
export const evaluateReconstructionReadinessValidated = (input) => {
|
|
19
|
-
try {
|
|
20
|
-
const report = createReconstructionReadinessReport(input);
|
|
21
|
-
return ok(createEvidence(undefined, JAVASCRIPT_APPLICATION_WORKFLOW_PROVIDER, {
|
|
22
|
-
predicateType: "rea.reconstruction-readiness-report/v1",
|
|
23
|
-
operation: OPERATION,
|
|
24
|
-
parameters: jsonObjectSchema.parse({
|
|
25
|
-
source_digest: report.source_digest,
|
|
26
|
-
expected_source_digest: input.replay.expected_source_digest,
|
|
27
|
-
}),
|
|
28
|
-
result: jsonValueSchema.parse(report),
|
|
29
|
-
rawResult: null,
|
|
30
|
-
confidence: "inferred",
|
|
31
|
-
authority: "analyst-inference",
|
|
32
|
-
environment: null,
|
|
33
|
-
limitations: report.status === "pass"
|
|
34
|
-
? []
|
|
35
|
-
: [
|
|
36
|
-
"Aggregate pass is withheld until every required conformance stage passes.",
|
|
37
|
-
],
|
|
38
|
-
evidenceLinks: report.evidence_links,
|
|
39
|
-
}));
|
|
40
|
-
}
|
|
41
|
-
catch (cause) {
|
|
42
|
-
if (cause instanceof z.ZodError)
|
|
43
|
-
return err(new AnalysisInputError(OPERATION, { cause }));
|
|
44
|
-
return err(new AnalysisProtocolError("Reconstruction readiness evaluation failed", {
|
|
45
|
-
cause,
|
|
46
|
-
}));
|
|
47
|
-
}
|
|
48
|
-
};
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { Cli, z } from "incur";
|
|
2
|
-
import { runCrossVersionInvestigation } from "./application/CrossVersionInvestigation.js";
|
|
3
|
-
import { logCliCommand } from "./cliLogging.js";
|
|
4
|
-
import { parseConfig } from "./config.js";
|
|
5
|
-
import { projectAnalysisError } from "./domain/errors.js";
|
|
6
|
-
import { loadConfiguredPermissionAuthority } from "./application/PermissionConfiguration.js";
|
|
7
|
-
import { authorizeFileReadWithDeferredWrite, authorizeRootPermission, } from "./application/DeferredFileAuthorization.js";
|
|
8
|
-
import { CLI_COMMANDS } from "./cliCommandNames.js";
|
|
9
|
-
const investigationOptionsSchema = z.object({
|
|
10
|
-
yes: z
|
|
11
|
-
.boolean()
|
|
12
|
-
.default(false)
|
|
13
|
-
.describe("Approve persistent workspace writes"),
|
|
14
|
-
workspaceName: z
|
|
15
|
-
.string()
|
|
16
|
-
.trim()
|
|
17
|
-
.min(1)
|
|
18
|
-
.max(200)
|
|
19
|
-
.default("default")
|
|
20
|
-
.describe("Logical name recorded in the investigation workspace"),
|
|
21
|
-
expectedRevision: z
|
|
22
|
-
.number()
|
|
23
|
-
.int()
|
|
24
|
-
.min(1)
|
|
25
|
-
.optional()
|
|
26
|
-
.describe("Required current workspace revision for an atomic update"),
|
|
27
|
-
replayRunId: z
|
|
28
|
-
.string()
|
|
29
|
-
.regex(/^run_[a-f0-9]{64}$/u)
|
|
30
|
-
.optional()
|
|
31
|
-
.describe("Replay one verified complete workspace run without rescanning"),
|
|
32
|
-
maxEntries: z
|
|
33
|
-
.number()
|
|
34
|
-
.int()
|
|
35
|
-
.min(1)
|
|
36
|
-
.max(50_000)
|
|
37
|
-
.default(10_000)
|
|
38
|
-
.describe("Maximum artifact entries to inspect per version"),
|
|
39
|
-
maxTotalBytes: z
|
|
40
|
-
.number()
|
|
41
|
-
.int()
|
|
42
|
-
.min(1)
|
|
43
|
-
.max(Number.MAX_SAFE_INTEGER)
|
|
44
|
-
.default(1_073_741_824)
|
|
45
|
-
.describe("Maximum total uncompressed artifact content to inspect"),
|
|
46
|
-
maxEntryBytes: z
|
|
47
|
-
.number()
|
|
48
|
-
.int()
|
|
49
|
-
.min(1)
|
|
50
|
-
.max(Number.MAX_SAFE_INTEGER)
|
|
51
|
-
.default(268_435_456)
|
|
52
|
-
.describe("Maximum uncompressed content to inspect for one entry"),
|
|
53
|
-
pageSize: z
|
|
54
|
-
.number()
|
|
55
|
-
.int()
|
|
56
|
-
.min(1)
|
|
57
|
-
.max(500)
|
|
58
|
-
.default(500)
|
|
59
|
-
.describe("Maximum graph items loaded per investigation page"),
|
|
60
|
-
changeLimit: z
|
|
61
|
-
.number()
|
|
62
|
-
.int()
|
|
63
|
-
.min(1)
|
|
64
|
-
.max(500)
|
|
65
|
-
.default(500)
|
|
66
|
-
.describe("Maximum version changes to record"),
|
|
67
|
-
integrityPolicy: z
|
|
68
|
-
.enum(["fail", "record-and-continue"])
|
|
69
|
-
.default("fail")
|
|
70
|
-
.describe("Behavior when declared artifact integrity does not match"),
|
|
71
|
-
integrityContinueApproved: z
|
|
72
|
-
.boolean()
|
|
73
|
-
.default(false)
|
|
74
|
-
.describe("Approve continuing after recorded integrity mismatches"),
|
|
75
|
-
maxIntegrityMismatches: z
|
|
76
|
-
.number()
|
|
77
|
-
.int()
|
|
78
|
-
.min(1)
|
|
79
|
-
.max(100)
|
|
80
|
-
.default(10)
|
|
81
|
-
.describe("Maximum integrity mismatches to record before stopping"),
|
|
82
|
-
});
|
|
83
|
-
/** Register the persistent cross-version CLI workflow. */
|
|
84
|
-
export const registerInvestigationCommands = (cli, logger) => {
|
|
85
|
-
cli.command(CLI_COMMANDS.investigateVersions, {
|
|
86
|
-
description: "Run or resume a persistent cross-version artifact investigation",
|
|
87
|
-
args: z.object({
|
|
88
|
-
leftPath: z.string().describe("Earlier artifact or directory path"),
|
|
89
|
-
rightPath: z.string().describe("Later artifact or directory path"),
|
|
90
|
-
workspacePath: z.string().describe("Persistent workspace JSON path"),
|
|
91
|
-
}),
|
|
92
|
-
options: investigationOptionsSchema,
|
|
93
|
-
alias: {
|
|
94
|
-
workspaceName: "workspace-name",
|
|
95
|
-
expectedRevision: "expected-revision",
|
|
96
|
-
replayRunId: "replay-run-id",
|
|
97
|
-
maxEntries: "max-entries",
|
|
98
|
-
maxTotalBytes: "max-total-bytes",
|
|
99
|
-
maxEntryBytes: "max-entry-bytes",
|
|
100
|
-
pageSize: "page-size",
|
|
101
|
-
changeLimit: "change-limit",
|
|
102
|
-
integrityPolicy: "integrity-policy",
|
|
103
|
-
integrityContinueApproved: "integrity-continue-approved",
|
|
104
|
-
maxIntegrityMismatches: "max-integrity-mismatches",
|
|
105
|
-
yes: "y",
|
|
106
|
-
},
|
|
107
|
-
run: ({ args, options }) => logCliCommand(logger, "investigate-versions", () => runInvestigation(args, options)),
|
|
108
|
-
});
|
|
109
|
-
};
|
|
110
|
-
const runInvestigation = async (args, options) => {
|
|
111
|
-
if (!options.yes)
|
|
112
|
-
return {
|
|
113
|
-
error: "ApprovalRequired",
|
|
114
|
-
message: "Persistent workspace writes require explicit --yes approval.",
|
|
115
|
-
};
|
|
116
|
-
const config = parseConfig(process.env);
|
|
117
|
-
if (!config.ok)
|
|
118
|
-
return cliError(config.error);
|
|
119
|
-
const authority = await loadConfiguredPermissionAuthority(config.value);
|
|
120
|
-
if (!authority.ok)
|
|
121
|
-
return cliError(authority.error);
|
|
122
|
-
const workspaceAuthorization = await authorizeFileReadWithDeferredWrite(authority.value, {
|
|
123
|
-
path: args.workspacePath,
|
|
124
|
-
readCapability: "investigation_workspace_read",
|
|
125
|
-
writeCapability: "investigation_workspace_write",
|
|
126
|
-
operation: "investigate_versions",
|
|
127
|
-
});
|
|
128
|
-
if (!workspaceAuthorization.ok)
|
|
129
|
-
return cliError(workspaceAuthorization.error);
|
|
130
|
-
const investigated = await runCrossVersionInvestigation({
|
|
131
|
-
approved: true,
|
|
132
|
-
workspace_path: args.workspacePath,
|
|
133
|
-
workspace_name: options.workspaceName,
|
|
134
|
-
...(options.expectedRevision === undefined
|
|
135
|
-
? {}
|
|
136
|
-
: { expected_workspace_revision: options.expectedRevision }),
|
|
137
|
-
...(options.replayRunId === undefined
|
|
138
|
-
? {}
|
|
139
|
-
: { replay_run_id: options.replayRunId }),
|
|
140
|
-
left_path: args.leftPath,
|
|
141
|
-
right_path: args.rightPath,
|
|
142
|
-
integrity_policy: options.integrityPolicy,
|
|
143
|
-
integrity_continue_approved: options.integrityContinueApproved,
|
|
144
|
-
max_integrity_mismatches: options.maxIntegrityMismatches,
|
|
145
|
-
options: {
|
|
146
|
-
max_entries: options.maxEntries,
|
|
147
|
-
max_total_bytes: options.maxTotalBytes,
|
|
148
|
-
max_entry_bytes: options.maxEntryBytes,
|
|
149
|
-
max_compression_ratio: 1_000,
|
|
150
|
-
max_depth: 20,
|
|
151
|
-
max_path_bytes: 4_096,
|
|
152
|
-
page_size: options.pageSize,
|
|
153
|
-
change_limit: options.changeLimit,
|
|
154
|
-
},
|
|
155
|
-
}, config.value.evidenceFilePolicy, {
|
|
156
|
-
inputRoots: config.value.investigationInputRoots,
|
|
157
|
-
integrityContinueEnabled: config.value.artifactIntegrityContinueEnabled,
|
|
158
|
-
authorizeInputRead: () => authorizeRootPermission(authority.value, {
|
|
159
|
-
capability: "investigation_input",
|
|
160
|
-
roots: [args.leftPath, args.rightPath],
|
|
161
|
-
access: "read",
|
|
162
|
-
operation: "investigate_versions",
|
|
163
|
-
}),
|
|
164
|
-
authorizeWorkspaceWrite: workspaceAuthorization.value.authorizeWrite,
|
|
165
|
-
});
|
|
166
|
-
return investigated.ok
|
|
167
|
-
? investigated.value.evidence
|
|
168
|
-
: cliError(investigated.error);
|
|
169
|
-
};
|
|
170
|
-
const cliError = (error) => ({
|
|
171
|
-
error: "Analysis failed",
|
|
172
|
-
...projectAnalysisError(error),
|
|
173
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/** Project a Cartesian product without materializing values beyond the output limit. */
|
|
2
|
-
export const projectBoundedCartesian = (left, right, maximum, project) => {
|
|
3
|
-
const values = [];
|
|
4
|
-
for (const leftValue of left) {
|
|
5
|
-
for (const rightValue of right) {
|
|
6
|
-
if (values.length === maximum)
|
|
7
|
-
return {
|
|
8
|
-
values,
|
|
9
|
-
omitted: left.length * right.length - values.length,
|
|
10
|
-
};
|
|
11
|
-
values.push(project(leftValue, rightValue));
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return { values, omitted: 0 };
|
|
15
|
-
};
|