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,9 +1,8 @@
|
|
|
1
|
+
import { clientConfigurationValuesEqual, parseClientConfiguration, serializeClientConfiguration, } from "./ClientConfigurationDocument.js";
|
|
1
2
|
import { constants as fsConstants } from "node:fs";
|
|
2
3
|
import { copyFile, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
4
|
import { dirname } from "node:path";
|
|
4
|
-
import { z } from "zod";
|
|
5
5
|
import writeFileAtomic from "write-file-atomic";
|
|
6
|
-
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
7
6
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
8
7
|
import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
|
|
9
8
|
import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
|
|
@@ -14,43 +13,43 @@ const defaultCommand = () => [
|
|
|
14
13
|
"mcp",
|
|
15
14
|
];
|
|
16
15
|
/** Back up, atomically update, and semantically read back one JSON MCP configuration. */
|
|
17
|
-
export const configureJsonClient =
|
|
16
|
+
export const configureJsonClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "json");
|
|
17
|
+
/** Back up, atomically update, and semantically read back one TOML MCP configuration. */
|
|
18
|
+
export const configureTomlClient = (client, environment = {}, command = defaultCommand()) => configureClientDocument(client, environment, command, "toml");
|
|
19
|
+
const configureClientDocument = async (client, environment, command, format) => {
|
|
18
20
|
const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
|
|
19
21
|
if (transactionPath === undefined)
|
|
20
22
|
return { status: "failed", reason: "path" };
|
|
21
|
-
let document = {};
|
|
22
23
|
let original;
|
|
23
24
|
try {
|
|
24
25
|
original = await readFile(transactionPath, "utf8");
|
|
25
|
-
document = parseObject(original);
|
|
26
26
|
}
|
|
27
27
|
catch (cause) {
|
|
28
28
|
if (!isMissing(cause))
|
|
29
29
|
return { status: "failed", reason: "readback" };
|
|
30
30
|
}
|
|
31
|
-
let
|
|
31
|
+
let parsed;
|
|
32
32
|
try {
|
|
33
|
-
|
|
33
|
+
parsed = parseClientConfiguration(original ?? (format === "toml" ? "" : "{}"), format);
|
|
34
34
|
}
|
|
35
35
|
catch {
|
|
36
36
|
return { status: "failed", reason: "readback" };
|
|
37
37
|
}
|
|
38
|
-
const
|
|
39
|
-
|
|
38
|
+
const { document, servers, serversKey } = parsed;
|
|
39
|
+
const desired = clientConfigurationDesired(client, environment, command);
|
|
40
|
+
if (clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
40
41
|
return { status: "unchanged" };
|
|
41
|
-
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
document.mcpServers = {
|
|
42
|
+
const backupPath = original === undefined ? undefined : `${client.configPath}.rea.backup`;
|
|
43
|
+
if (backupPath !== undefined &&
|
|
44
|
+
!(await preserveConfigBackup(transactionPath, backupPath)))
|
|
45
|
+
return { status: "failed", reason: "backup" };
|
|
46
|
+
document[serversKey] = {
|
|
48
47
|
...servers,
|
|
49
48
|
[PRODUCT_IDENTITY.mcpServerKey]: desired,
|
|
50
49
|
};
|
|
51
50
|
try {
|
|
52
51
|
await mkdir(dirname(client.configPath), { recursive: true });
|
|
53
|
-
await writeFileAtomic(transactionPath,
|
|
52
|
+
await writeFileAtomic(transactionPath, serializeClientConfiguration(document, format), {
|
|
54
53
|
encoding: "utf8",
|
|
55
54
|
mode: 0o600,
|
|
56
55
|
});
|
|
@@ -59,8 +58,8 @@ export const configureJsonClient = async (client, environment = {}, command = de
|
|
|
59
58
|
return { status: "failed", reason: "write" };
|
|
60
59
|
}
|
|
61
60
|
try {
|
|
62
|
-
const readback =
|
|
63
|
-
if (!
|
|
61
|
+
const readback = parseClientConfiguration(await readFile(transactionPath, "utf8"), format);
|
|
62
|
+
if (!clientConfigurationValuesEqual(readback.servers[PRODUCT_IDENTITY.mcpServerKey], desired)) {
|
|
64
63
|
await restoreConfig(transactionPath, original);
|
|
65
64
|
return { status: "failed", reason: "readback" };
|
|
66
65
|
}
|
|
@@ -74,68 +73,13 @@ export const configureJsonClient = async (client, environment = {}, command = de
|
|
|
74
73
|
...(backupPath === undefined ? {} : { backupPath }),
|
|
75
74
|
};
|
|
76
75
|
};
|
|
77
|
-
/** Back up, atomically update, and semantically read back Codex TOML configuration. */
|
|
78
|
-
export const configureTomlClient = async (client, environment = {}, command = defaultCommand()) => {
|
|
79
|
-
const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
|
|
80
|
-
if (transactionPath === undefined)
|
|
81
|
-
return { status: "failed", reason: "path" };
|
|
82
|
-
let document = {};
|
|
83
|
-
let original;
|
|
84
|
-
try {
|
|
85
|
-
original = await readFile(transactionPath, "utf8");
|
|
86
|
-
document = objectSchema.parse(parseToml(original));
|
|
87
|
-
}
|
|
88
|
-
catch (cause) {
|
|
89
|
-
if (!isMissing(cause))
|
|
90
|
-
return { status: "failed", reason: "readback" };
|
|
91
|
-
}
|
|
92
|
-
let servers;
|
|
93
|
-
try {
|
|
94
|
-
servers = parseOptionalObject(document.mcp_servers);
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
return { status: "failed", reason: "readback" };
|
|
98
|
-
}
|
|
99
|
-
const desired = clientConfigurationDesired(client, normalizeProviderEnvironment(environment), command);
|
|
100
|
-
if (sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
101
|
-
return { status: "unchanged" };
|
|
102
|
-
const backupPath = original === undefined ? undefined : `${client.configPath}.rea.backup`;
|
|
103
|
-
if (backupPath !== undefined &&
|
|
104
|
-
!(await preserveConfigBackup(transactionPath, backupPath)))
|
|
105
|
-
return { status: "failed", reason: "backup" };
|
|
106
|
-
document.mcp_servers = {
|
|
107
|
-
...servers,
|
|
108
|
-
[PRODUCT_IDENTITY.mcpServerKey]: desired,
|
|
109
|
-
};
|
|
110
|
-
try {
|
|
111
|
-
await mkdir(dirname(client.configPath), { recursive: true });
|
|
112
|
-
await writeFileAtomic(transactionPath, stringifyToml(document), {
|
|
113
|
-
encoding: "utf8",
|
|
114
|
-
mode: 0o600,
|
|
115
|
-
});
|
|
116
|
-
const readback = objectSchema.parse(parseToml(await readFile(transactionPath, "utf8")));
|
|
117
|
-
if (!sameConfiguration(parseOptionalObject(readback.mcp_servers)[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
118
|
-
throw new Error("TOML readback mismatch");
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
await restoreConfig(transactionPath, original);
|
|
122
|
-
return { status: "failed", reason: "readback" };
|
|
123
|
-
}
|
|
124
|
-
return {
|
|
125
|
-
status: "configured",
|
|
126
|
-
...(backupPath === undefined ? {} : { backupPath }),
|
|
127
|
-
};
|
|
128
|
-
};
|
|
129
76
|
/** Determine whether an existing client configuration matches the desired registration. */
|
|
130
77
|
export const clientConfigurationAligned = async (client, providerEnvironment, command) => {
|
|
131
78
|
const desired = clientConfigurationDesired(client, providerEnvironment, command);
|
|
132
79
|
try {
|
|
133
80
|
const original = await readFile(client.configPath, "utf8");
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
: parseObject(original);
|
|
137
|
-
const servers = parseOptionalObject(client.format === "toml" ? document.mcp_servers : document.mcpServers);
|
|
138
|
-
return sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired);
|
|
81
|
+
const { servers } = parseClientConfiguration(original, client.format);
|
|
82
|
+
return clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired);
|
|
139
83
|
}
|
|
140
84
|
catch {
|
|
141
85
|
return false;
|
|
@@ -165,11 +109,8 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
|
|
|
165
109
|
}
|
|
166
110
|
const desired = clientConfigurationDesired(client, providerEnvironment, command);
|
|
167
111
|
try {
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
: parseObject(original);
|
|
171
|
-
const servers = parseOptionalObject(client.format === "toml" ? document.mcp_servers : document.mcpServers);
|
|
172
|
-
if (sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
112
|
+
const { servers } = parseClientConfiguration(original, client.format);
|
|
113
|
+
if (clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
173
114
|
return { status: "already_current" };
|
|
174
115
|
}
|
|
175
116
|
catch {
|
|
@@ -183,11 +124,7 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
|
|
|
183
124
|
backupPath: `${client.configPath}.rea.backup`,
|
|
184
125
|
};
|
|
185
126
|
};
|
|
186
|
-
const objectSchema = z.record(z.string(), z.unknown());
|
|
187
|
-
const parseOptionalObject = (value) => value === undefined ? {} : objectSchema.parse(value);
|
|
188
|
-
const parseObject = (text) => objectSchema.parse(JSON.parse(text));
|
|
189
127
|
const isMissing = (cause) => cause instanceof Error && "code" in cause && cause.code === "ENOENT";
|
|
190
|
-
const sameConfiguration = (left, right) => JSON.stringify(left) === JSON.stringify(right);
|
|
191
128
|
const preserveConfigBackup = async (source, destination) => {
|
|
192
129
|
try {
|
|
193
130
|
await copyFile(source, destination, fsConstants.COPYFILE_EXCL);
|
|
@@ -221,6 +158,3 @@ const clientConfigurationDesired = (client, providerEnvironment, command) => {
|
|
|
221
158
|
...(Object.keys(environment).length === 0 ? {} : { env: environment }),
|
|
222
159
|
};
|
|
223
160
|
};
|
|
224
|
-
const normalizeProviderEnvironment = (environment) => typeof environment === "string"
|
|
225
|
-
? { HOPPER_LAUNCHER_PATH: environment }
|
|
226
|
-
: environment;
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/** Select explicit non-secret permission settings safe for managed MCP registrations. */
|
|
2
|
-
export const registrationPermissionEnvironment = (environment) => {
|
|
3
|
-
const investigationRoots = environment.REA_INVESTIGATION_INPUT_ROOTS_JSON;
|
|
4
|
-
return investigationRoots === undefined
|
|
5
|
-
? {}
|
|
6
|
-
: { REA_INVESTIGATION_INPUT_ROOTS_JSON: investigationRoots };
|
|
7
|
-
};
|
|
8
1
|
/** Select exact non-secret settings published by available providers. */
|
|
9
2
|
export const providerRegistrationEnvironment = (inspections) => Object.fromEntries(inspections
|
|
10
3
|
.filter(({ available }) => available)
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { lstat, mkdtemp, open, readdir, rename, rm, rmdir, unlink, } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { readBoundedFileBytes } from "../process/BoundedFileBytes.js";
|
|
5
|
+
class StoreFileLockOccupied extends Error {
|
|
6
|
+
code = "EEXIST";
|
|
7
|
+
constructor(cause) {
|
|
8
|
+
super("Store transaction lock is occupied", { cause });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Atomically publish a populated directory so another owner cannot replace a live lock. */
|
|
12
|
+
export const createStoreFileLock = async (path) => {
|
|
13
|
+
if (await exists(path))
|
|
14
|
+
throw new StoreFileLockOccupied();
|
|
15
|
+
const staged = await mkdtemp(join(dirname(path), ".rea-store-lock-"));
|
|
16
|
+
const owner = `owner-${randomUUID()}`;
|
|
17
|
+
try {
|
|
18
|
+
const handle = await open(join(staged, owner), "wx", 0o600);
|
|
19
|
+
try {
|
|
20
|
+
await handle.writeFile(`${String(process.pid)}\n`, "utf8");
|
|
21
|
+
await handle.sync();
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
await handle.close();
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
// Rename cannot replace a nonempty directory: the owner entry is present before publication.
|
|
28
|
+
await rename(staged, path);
|
|
29
|
+
}
|
|
30
|
+
catch (cause) {
|
|
31
|
+
if (await exists(path))
|
|
32
|
+
throw new StoreFileLockOccupied(cause);
|
|
33
|
+
throw cause;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
release: async () => {
|
|
37
|
+
await removeOwner(path, owner).catch(() => undefined);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
await rm(staged, { recursive: true, force: true });
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/** Recover a dead owner's directory lock or a legacy PID file; leave live and unknown owners intact. */
|
|
46
|
+
export const removeStaleStoreFileLock = async (path) => {
|
|
47
|
+
try {
|
|
48
|
+
const stats = await lstat(path);
|
|
49
|
+
if (stats.isFile()) {
|
|
50
|
+
if (!(await ownerIsDead(path)))
|
|
51
|
+
return false;
|
|
52
|
+
await unlink(path);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
if (!stats.isDirectory())
|
|
56
|
+
return false;
|
|
57
|
+
const entries = await readdir(path);
|
|
58
|
+
if (entries.length === 0) {
|
|
59
|
+
await rmdir(path);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
const owner = entries[0];
|
|
63
|
+
if (entries.length !== 1 ||
|
|
64
|
+
owner === undefined ||
|
|
65
|
+
!/^owner-[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/u.test(owner) ||
|
|
66
|
+
!(await ownerIsDead(join(path, owner))))
|
|
67
|
+
return false;
|
|
68
|
+
await removeOwner(path, owner);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const removeOwner = async (path, owner) => {
|
|
76
|
+
// A successor has a different entry, so stale cleanup cannot make its directory empty.
|
|
77
|
+
await unlink(join(path, owner));
|
|
78
|
+
await rmdir(path);
|
|
79
|
+
};
|
|
80
|
+
const ownerIsDead = async (path) => {
|
|
81
|
+
const stats = await lstat(path);
|
|
82
|
+
if (!stats.isFile() || stats.size > 32)
|
|
83
|
+
return false;
|
|
84
|
+
const handle = await open(path, "r");
|
|
85
|
+
let bytes;
|
|
86
|
+
try {
|
|
87
|
+
bytes = await readBoundedFileBytes(handle, 32);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await handle.close();
|
|
91
|
+
}
|
|
92
|
+
const encoded = bytes?.toString("utf8").trim();
|
|
93
|
+
return (encoded !== undefined &&
|
|
94
|
+
/^[1-9][0-9]{0,9}$/u.test(encoded) &&
|
|
95
|
+
!processIsAlive(Number(encoded)));
|
|
96
|
+
};
|
|
97
|
+
const exists = async (path) => {
|
|
98
|
+
try {
|
|
99
|
+
await lstat(path);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch (cause) {
|
|
103
|
+
if (errorCode(cause) === "ENOENT")
|
|
104
|
+
return false;
|
|
105
|
+
throw cause;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const processIsAlive = (pid) => {
|
|
109
|
+
try {
|
|
110
|
+
process.kill(pid, 0);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch (cause) {
|
|
114
|
+
return errorCode(cause) !== "ESRCH";
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const errorCode = (cause) => typeof cause === "object" && cause !== null && "code" in cause
|
|
118
|
+
? cause.code
|
|
119
|
+
: undefined;
|
|
@@ -4,8 +4,8 @@ const require = createRequire(import.meta.url);
|
|
|
4
4
|
const HeadlessPackage = require("@xterm/headless");
|
|
5
5
|
// SAFETY: the addon package is pinned with the compatible headless xterm release.
|
|
6
6
|
const SerializePackage = require("@xterm/addon-serialize");
|
|
7
|
-
/** Owns one headless terminal and serializes writes into deterministic frames. */
|
|
8
7
|
/**
|
|
8
|
+
* Owns one headless terminal and serializes writes into deterministic frames.
|
|
9
9
|
* Reconstructs bounded terminal states while raw PTY chunks remain authoritative.
|
|
10
10
|
*
|
|
11
11
|
* Rendered frames answer what an operator saw after control-sequence handling;
|
|
@@ -71,8 +71,7 @@ export class TerminalRenderer {
|
|
|
71
71
|
const serializedState = this.options.normalize(this.#serializeAddon.serialize());
|
|
72
72
|
const bytes = Buffer.byteLength(serializedState) +
|
|
73
73
|
lines.reduce((total, line) => total + Buffer.byteLength(line), 0);
|
|
74
|
-
if (this.#
|
|
75
|
-
this.#capturedBytes + bytes > this.options.maxBytes) {
|
|
74
|
+
if (this.#capturedBytes + bytes > this.options.maxBytes) {
|
|
76
75
|
this.#truncated = true;
|
|
77
76
|
return;
|
|
78
77
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { parseClientConfiguration, serializeClientConfiguration, } from "./ClientConfigurationDocument.js";
|
|
1
2
|
import { copyFile, lstat, readFile, realpath, rm } from "node:fs/promises";
|
|
2
3
|
import { homedir } from "node:os";
|
|
3
4
|
import { basename, isAbsolute, join } from "node:path";
|
|
4
|
-
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
5
5
|
import writeFileAtomic from "write-file-atomic";
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
@@ -65,9 +65,11 @@ const removeClient = async (client, fileSystem) => {
|
|
|
65
65
|
let key;
|
|
66
66
|
let servers;
|
|
67
67
|
try {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
({
|
|
69
|
+
document,
|
|
70
|
+
servers,
|
|
71
|
+
serversKey: key,
|
|
72
|
+
} = parseClientConfiguration(original, client.format));
|
|
71
73
|
}
|
|
72
74
|
catch {
|
|
73
75
|
return item(client.name, "failed", `Configuration is not valid ${client.format === "toml" ? "TOML" : "JSON"} and was not changed. Repair it, then rerun uninstall.`);
|
|
@@ -88,14 +90,9 @@ const removeClient = async (client, fileSystem) => {
|
|
|
88
90
|
return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
|
|
89
91
|
}
|
|
90
92
|
try {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
await fileSystem.writeText(transactionPath, encoded);
|
|
95
|
-
const readback = objectSchema.parse(client.format === "toml"
|
|
96
|
-
? parseToml(await fileSystem.readText(transactionPath))
|
|
97
|
-
: JSON.parse(await fileSystem.readText(transactionPath)));
|
|
98
|
-
if (PRODUCT_IDENTITY.mcpServerKey in optionalObject(readback[key]))
|
|
93
|
+
await fileSystem.writeText(transactionPath, serializeClientConfiguration(document, client.format));
|
|
94
|
+
const readback = parseClientConfiguration(await fileSystem.readText(transactionPath), client.format);
|
|
95
|
+
if (PRODUCT_IDENTITY.mcpServerKey in readback.servers)
|
|
99
96
|
throw new Error("registration readback mismatch");
|
|
100
97
|
return item(client.name, "removed", `Removed registration from ${client.configPath}.`);
|
|
101
98
|
}
|
|
@@ -154,8 +151,6 @@ const removeManagedPath = async (path, name, fileSystem) => {
|
|
|
154
151
|
};
|
|
155
152
|
const removeManagedSkills = async (home, fileSystem) => removeManagedPath(join(home, ".agents/skills", PRODUCT_IDENTITY.skillName), "skill", fileSystem);
|
|
156
153
|
const item = (name, status, detail) => ({ name, status, detail });
|
|
157
|
-
const objectSchema = z.record(z.string(), z.unknown());
|
|
158
|
-
const optionalObject = (value) => value === undefined ? {} : objectSchema.parse(value);
|
|
159
154
|
const registrationSchema = z
|
|
160
155
|
.object({ command: z.string(), args: z.array(z.string()) })
|
|
161
156
|
.passthrough();
|
|
@@ -7,7 +7,7 @@ export const UNKNOWN_REGISTRY_PROVIDER = {
|
|
|
7
7
|
};
|
|
8
8
|
/** Create immutable evidence for one approved residual-unknown mutation. */
|
|
9
9
|
export const unknownMutationEvidence = (target, input) => createEvidence(target, UNKNOWN_REGISTRY_PROVIDER, {
|
|
10
|
-
predicateType: "rea.residual-unknown-mutation
|
|
10
|
+
predicateType: "rea.residual-unknown-mutation",
|
|
11
11
|
operation: "record_unknown",
|
|
12
12
|
parameters: { domain: input.domain, severity: input.severity },
|
|
13
13
|
result: {
|
|
@@ -2,6 +2,7 @@ import { constants } from "node:fs";
|
|
|
2
2
|
import { mkdtemp, rm, symlink, writeFile } from "node:fs/promises";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import { windowsNativeCapabilities, } from "../process/WindowsAuthority.js";
|
|
5
6
|
import { probeProcessCaptureCapability, } from "./ProcessCaptureCapability.js";
|
|
6
7
|
/** Probe named prerequisites without converting missing controls into support. */
|
|
7
8
|
export const probeWindowsCapabilities = async (dependencies = systemDependencies()) => {
|
|
@@ -17,11 +18,11 @@ export const probeWindowsCapabilities = async (dependencies = systemDependencies
|
|
|
17
18
|
no_follow_open: dependencies.probeNoFollowOpen(),
|
|
18
19
|
private_acl: dependencies.probePrivateAcl(),
|
|
19
20
|
unix_domain_socket: dependencies.probeUnixDomainSocket(),
|
|
20
|
-
pty:
|
|
21
|
-
available:
|
|
22
|
-
|
|
23
|
-
},
|
|
21
|
+
pty: pty.available
|
|
22
|
+
? { available: true, reason: null }
|
|
23
|
+
: { available: false, reason: pty.reason },
|
|
24
24
|
},
|
|
25
|
+
security: windowsNativeCapabilities(dependencies.platform),
|
|
25
26
|
};
|
|
26
27
|
};
|
|
27
28
|
const systemDependencies = () => ({
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Buffer } from "node:buffer";
|
|
2
1
|
import { posix } from "node:path";
|
|
3
|
-
import { ArtifactReaderFailure
|
|
2
|
+
import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
4
3
|
const DRIVE_OR_UNC = /^(?:[A-Za-z]:|\\|\/\/)/u;
|
|
5
4
|
/** Normalize an untrusted logical archive path without touching filesystem. */
|
|
6
|
-
export const normalizeArtifactPath = (input
|
|
5
|
+
export const normalizeArtifactPath = (input) => {
|
|
7
6
|
if (input.includes("\0") ||
|
|
8
7
|
input.includes("\\") ||
|
|
9
8
|
input.startsWith("/") ||
|
|
@@ -13,8 +12,6 @@ export const normalizeArtifactPath = (input, limits) => {
|
|
|
13
12
|
const parts = normalized.split("/");
|
|
14
13
|
if (normalized.length === 0 ||
|
|
15
14
|
parts.some((part) => part === "" || part === "." || part === "..") ||
|
|
16
|
-
parts.length > limits.maxDepth ||
|
|
17
|
-
Buffer.byteLength(normalized, "utf8") > limits.maxPathBytes ||
|
|
18
15
|
posix.normalize(normalized) !== normalized)
|
|
19
16
|
throw new ArtifactReaderFailure("path", "Artifact path is not normalized");
|
|
20
17
|
return normalized;
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
2
2
|
import { inventoryArtifact } from "../application/ArtifactInventory.js";
|
|
3
3
|
import { extractArtifact } from "../application/ArtifactExtraction.js";
|
|
4
|
-
import {
|
|
4
|
+
import { analyzeInterfaceBuilderBundle } from "../application/InterfaceBuilderAnalysis.js";
|
|
5
|
+
import { ARTIFACT_ANALYSIS_OPERATIONS, artifactInventoryInputSchema, artifactExtractionExecutionSchema, } from "../contracts/artifactToolContracts.js";
|
|
5
6
|
import { AnalysisCapabilityUnavailableError, ArtifactOperationError, } from "../domain/errors.js";
|
|
7
|
+
import { interfaceBuilderLimitsSchema } from "../domain/interfaceBuilderGraph.js";
|
|
6
8
|
import { err, ok } from "../domain/result.js";
|
|
7
|
-
import { ArtifactReaderFailure
|
|
9
|
+
import { ArtifactReaderFailure } from "./ArtifactReader.js";
|
|
8
10
|
import { ARTIFACT_GRAPH_PROVIDER } from "../application/InvestigationProviders.js";
|
|
9
11
|
import { createEvidence } from "../domain/evidence.js";
|
|
10
12
|
import { createArtifactInspection } from "../domain/artifactInspection.js";
|
|
13
|
+
import { resolveArtifactIntegrityPolicy, resolveNativeMountPolicy, } from "../application/ArtifactInventory/policy.js";
|
|
11
14
|
const IDENTITY = Object.freeze(ARTIFACT_GRAPH_PROVIDER);
|
|
12
15
|
/** Read-only inventory and exclusively owned extraction provider. */
|
|
13
16
|
export class ArtifactProvider {
|
|
@@ -17,31 +20,20 @@ export class ArtifactProvider {
|
|
|
17
20
|
this.nativeMountEnabled = nativeMountEnabled;
|
|
18
21
|
this.integrityContinueEnabled = integrityContinueEnabled;
|
|
19
22
|
}
|
|
20
|
-
#capabilities = Object.freeze(
|
|
23
|
+
#capabilities = Object.freeze(ARTIFACT_ANALYSIS_OPERATIONS.map((operation) => Object.freeze({
|
|
21
24
|
provider: IDENTITY,
|
|
22
|
-
operation
|
|
23
|
-
inputContractVersion: 1,
|
|
24
|
-
outputContractVersion: 1,
|
|
25
|
+
operation,
|
|
25
26
|
available: true,
|
|
26
27
|
reason: null,
|
|
27
|
-
pagination: contract.name === "inspect_artifact"
|
|
28
|
-
? "none"
|
|
29
|
-
: "offset",
|
|
30
|
-
exhaustive: false,
|
|
31
28
|
effects: Object.freeze({
|
|
32
29
|
mutatesArtifact: false,
|
|
33
|
-
launchesProcess:
|
|
30
|
+
launchesProcess: operation !== "decode_interface_builder",
|
|
34
31
|
mayShowUi: false,
|
|
35
32
|
mayAccessNetwork: false,
|
|
36
|
-
mayWriteFilesystem:
|
|
33
|
+
mayWriteFilesystem: operation === "extract_artifact",
|
|
37
34
|
changesPermissions: false,
|
|
38
35
|
requiresRoot: false,
|
|
39
36
|
}),
|
|
40
|
-
limits: Object.freeze({
|
|
41
|
-
maxResults: 500,
|
|
42
|
-
maxPayloadBytes: 4 * 1024 * 1024,
|
|
43
|
-
timeoutMs: 120_000,
|
|
44
|
-
}),
|
|
45
37
|
limitations: Object.freeze([
|
|
46
38
|
"DMG child inventory is macOS-only and requires per-call approval plus operator policy; PKG remains root-hash-only.",
|
|
47
39
|
"ASAR files discovered in filesystem-backed inventories are expanded without bulk extraction; other nested containers remain recorded only.",
|
|
@@ -76,22 +68,38 @@ class ArtifactClient {
|
|
|
76
68
|
const inspected = await this.inspectArtifact(parameters, options);
|
|
77
69
|
return inspected;
|
|
78
70
|
}
|
|
71
|
+
if (operation === "decode_interface_builder") {
|
|
72
|
+
if (this.target.kind !== "executable" ||
|
|
73
|
+
this.target.sourcePath === undefined ||
|
|
74
|
+
!this.target.sourcePath.toLowerCase().endsWith(".app"))
|
|
75
|
+
throw new ArtifactReaderFailure("unavailable", "decode_interface_builder requires an active .app bundle target");
|
|
76
|
+
const limits = interfaceBuilderLimitsSchema.parse(parameters);
|
|
77
|
+
const result = await analyzeInterfaceBuilderBundle({
|
|
78
|
+
bundlePath: this.target.sourcePath,
|
|
79
|
+
targetSha256: this.target.sha256,
|
|
80
|
+
limits,
|
|
81
|
+
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
82
|
+
});
|
|
83
|
+
return ok(createAnalysisExecution(result, IDENTITY, {
|
|
84
|
+
limitations: result.limitations,
|
|
85
|
+
locations: result.documents.map(({ relative_path: path }) => ({
|
|
86
|
+
kind: "artifact-path",
|
|
87
|
+
path,
|
|
88
|
+
})),
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
79
91
|
if (operation === "extract_artifact") {
|
|
80
|
-
const parsed =
|
|
92
|
+
const parsed = artifactExtractionExecutionSchema.parse(parameters);
|
|
81
93
|
const result = await extractArtifact({
|
|
82
94
|
inputPath: this.target.sourcePath ?? this.target.path,
|
|
83
95
|
inputFormat: this.target.format,
|
|
84
96
|
outputRoot: parsed.output_root,
|
|
85
|
-
occurrenceIds: parsed.occurrence_ids,
|
|
86
|
-
offset: parsed.offset,
|
|
87
|
-
limit: parsed.limit,
|
|
88
|
-
limits: limitsFrom(parsed),
|
|
89
97
|
}, options?.signal);
|
|
90
98
|
return ok(createAnalysisExecution(result, IDENTITY, {
|
|
91
99
|
rawResult: null,
|
|
92
100
|
limitations: result.limitations,
|
|
93
101
|
subject: subjectFor(this.target.sourcePath ?? this.target.path, result.manifest),
|
|
94
|
-
locations: result.artifacts.
|
|
102
|
+
locations: result.artifacts.map(({ relative_path: path }) => ({
|
|
95
103
|
kind: "artifact-path",
|
|
96
104
|
path,
|
|
97
105
|
})),
|
|
@@ -103,7 +111,7 @@ class ArtifactClient {
|
|
|
103
111
|
rawResult: null,
|
|
104
112
|
limitations: result.limitations,
|
|
105
113
|
subject: subjectFor(this.target.sourcePath ?? this.target.path, result.manifest),
|
|
106
|
-
locations: result.occurrences.
|
|
114
|
+
locations: result.occurrences.map(({ logical_path: path }) => ({
|
|
107
115
|
kind: "artifact-path",
|
|
108
116
|
path,
|
|
109
117
|
})),
|
|
@@ -117,24 +125,11 @@ class ArtifactClient {
|
|
|
117
125
|
return Promise.resolve();
|
|
118
126
|
}
|
|
119
127
|
async inspectArtifact(parameters, options) {
|
|
120
|
-
const parsed =
|
|
128
|
+
const parsed = artifactInventoryInputSchema.parse(parameters);
|
|
121
129
|
const inventoryParameters = artifactInventoryInputSchema.parse({
|
|
122
|
-
node_offset: 0,
|
|
123
|
-
node_limit: parsed.max_observations,
|
|
124
|
-
occurrence_offset: 0,
|
|
125
|
-
occurrence_limit: parsed.max_observations,
|
|
126
|
-
edge_offset: 0,
|
|
127
|
-
edge_limit: parsed.max_relationships,
|
|
128
130
|
native_mount_approved: parsed.native_mount_approved,
|
|
129
131
|
integrity_policy: parsed.integrity_policy,
|
|
130
132
|
integrity_continue_approved: parsed.integrity_continue_approved,
|
|
131
|
-
max_integrity_mismatches: parsed.max_integrity_mismatches,
|
|
132
|
-
max_entries: parsed.max_entries,
|
|
133
|
-
max_total_bytes: parsed.max_total_bytes,
|
|
134
|
-
max_entry_bytes: parsed.max_entry_bytes,
|
|
135
|
-
max_compression_ratio: parsed.max_compression_ratio,
|
|
136
|
-
max_depth: parsed.max_depth,
|
|
137
|
-
max_path_bytes: parsed.max_path_bytes,
|
|
138
133
|
});
|
|
139
134
|
await options?.progress?.report({
|
|
140
135
|
phase: "inspect_artifact.inventory",
|
|
@@ -144,7 +139,7 @@ class ArtifactClient {
|
|
|
144
139
|
});
|
|
145
140
|
const inventory = await this.inventory(inventoryParameters, options);
|
|
146
141
|
const subject = subjectFor(this.target.sourcePath ?? this.target.path, inventory.manifest);
|
|
147
|
-
const locations = inventory.occurrences.
|
|
142
|
+
const locations = inventory.occurrences.map(({ logical_path: path }) => ({
|
|
148
143
|
kind: "artifact-path",
|
|
149
144
|
path,
|
|
150
145
|
}));
|
|
@@ -156,7 +151,7 @@ class ArtifactClient {
|
|
|
156
151
|
limitations: inventory.limitations,
|
|
157
152
|
locations,
|
|
158
153
|
});
|
|
159
|
-
const result = createArtifactInspection(inventoryEvidence
|
|
154
|
+
const result = createArtifactInspection(inventoryEvidence);
|
|
160
155
|
await options?.progress?.report({
|
|
161
156
|
phase: "inspect_artifact.inventory",
|
|
162
157
|
completed: 1,
|
|
@@ -171,37 +166,18 @@ class ArtifactClient {
|
|
|
171
166
|
}));
|
|
172
167
|
}
|
|
173
168
|
inventory(parsed, options) {
|
|
174
|
-
return inventoryArtifact(this.target.sourcePath ?? this.target.path,
|
|
175
|
-
nodeOffset: parsed.node_offset,
|
|
176
|
-
nodeLimit: parsed.node_limit,
|
|
177
|
-
occurrenceOffset: parsed.occurrence_offset,
|
|
178
|
-
occurrenceLimit: parsed.occurrence_limit,
|
|
179
|
-
edgeOffset: parsed.edge_offset,
|
|
180
|
-
edgeLimit: parsed.edge_limit,
|
|
181
|
-
}, {
|
|
169
|
+
return inventoryArtifact(this.target.sourcePath ?? this.target.path, {
|
|
182
170
|
...(options?.signal === undefined ? {} : { signal: options.signal }),
|
|
183
|
-
nativeMount:
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
approved: parsed.integrity_continue_approved === true,
|
|
190
|
-
enabled: this.integrityContinueEnabled,
|
|
191
|
-
maxMismatches: parsed.max_integrity_mismatches,
|
|
192
|
-
},
|
|
171
|
+
nativeMount: resolveNativeMountPolicy(parsed.native_mount_approved === true, this.nativeMountEnabled),
|
|
172
|
+
integrity: resolveArtifactIntegrityPolicy(parsed.integrity_policy === "fail"
|
|
173
|
+
? { mode: "fail" }
|
|
174
|
+
: {
|
|
175
|
+
mode: parsed.integrity_policy,
|
|
176
|
+
}, this.integrityContinueEnabled),
|
|
193
177
|
});
|
|
194
178
|
}
|
|
195
179
|
}
|
|
196
|
-
const
|
|
197
|
-
maxEntries: input.max_entries,
|
|
198
|
-
maxTotalBytes: input.max_total_bytes,
|
|
199
|
-
maxEntryBytes: input.max_entry_bytes,
|
|
200
|
-
maxCompressionRatio: input.max_compression_ratio,
|
|
201
|
-
maxDepth: input.max_depth,
|
|
202
|
-
maxPathBytes: input.max_path_bytes,
|
|
203
|
-
});
|
|
204
|
-
const isArtifactOperation = (operation) => ARTIFACT_TOOL_CONTRACTS.some(({ name }) => name === operation);
|
|
180
|
+
const isArtifactOperation = (operation) => ARTIFACT_ANALYSIS_OPERATIONS.includes(operation);
|
|
205
181
|
const translateFailure = (operation, cause) => {
|
|
206
182
|
if (cause instanceof ArtifactReaderFailure)
|
|
207
183
|
return new ArtifactOperationError(operation, cause.reason, cause.details);
|