rea-agents 6.2.0 → 6.4.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 +24 -23
- package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
- package/bridge/ghidra/ReaGhidraBridge.java +597 -209
- package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
- package/bridge/hopper_bridge.py +2 -0
- package/dist/adb/AdbConfiguration.js +88 -0
- package/dist/adb/AdbDeviceOutput.js +186 -0
- package/dist/adb/AdbProvider.js +1190 -0
- package/dist/adb/AdbShellOutput.js +309 -0
- package/dist/android/AndroidTargetSnapshot.js +104 -22
- package/dist/android/JadxConfiguration.js +44 -24
- package/dist/android/JadxProvider.js +59 -21
- package/dist/android/JadxSession.js +51 -9
- package/dist/apktool/ApktoolConfiguration.js +84 -0
- package/dist/apktool/ApktoolDecodeOutput.js +59 -0
- package/dist/apktool/ApktoolProvider.js +506 -0
- package/dist/application/AnalysisProvider.js +8 -2
- package/dist/application/AppBundleExecutable.js +27 -22
- package/dist/application/BinaryTargetResolver.js +85 -19
- package/dist/application/BrowserScenarioEvidence.js +2 -2
- package/dist/application/CapabilityInventory.js +11 -1
- package/dist/application/ClientConfigurationDocument.js +98 -0
- package/dist/application/ClientConfigurationFiles.js +91 -0
- package/dist/application/ClientRegistrationEnvironment.js +35 -0
- package/dist/application/ClientRegistrationStatus.js +75 -27
- package/dist/application/DirectAnalysis.js +14 -8
- package/dist/application/DirectAnalysisCleanup.js +1 -2
- package/dist/application/DirectAnalysisStatus.js +3 -6
- package/dist/application/Doctor.js +27 -34
- package/dist/application/DoctorDiagnostics.js +1 -1
- package/dist/application/EvidenceBundleCommands.js +6 -12
- package/dist/application/EvidenceBundleFiles.js +1 -1
- package/dist/application/GeminiClientSettings.js +139 -0
- package/dist/application/HermesClientHome.js +115 -0
- package/dist/application/HopperDownload.js +39 -0
- package/dist/application/InvestigationProviders.js +10 -4
- package/dist/application/JsonFiles.js +16 -15
- package/dist/application/JsonInputFile.js +252 -0
- package/dist/application/LinuxHopper.js +6 -13
- package/dist/application/MacHopper.js +172 -149
- package/dist/application/MipsElfAbiFlags.js +140 -0
- package/dist/application/ProviderOperationExecution.js +31 -0
- package/dist/application/ReconstructionObligationCandidates.js +16 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImport.js +76 -29
- package/dist/application/ReferenceSourceImportEntries.js +18 -9
- package/dist/application/ReferenceSourceImportPolicy.js +99 -23
- package/dist/application/ReferenceSourceImportTypes.js +30 -22
- package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
- package/dist/application/RegularFileRead.js +103 -0
- package/dist/application/Setup.js +69 -10
- package/dist/application/SetupClientConfiguration.js +134 -23
- package/dist/application/SetupHost.js +102 -22
- package/dist/application/SetupPlan.js +18 -17
- package/dist/application/SetupSkill.js +81 -13
- package/dist/application/SupportedClients.js +305 -37
- package/dist/application/Uninstall.js +172 -8
- package/dist/application/UpdateMaintenance.js +23 -23
- package/dist/application/Utf8JsonInput.js +71 -0
- package/dist/application/WebScriptExportService.js +130 -57
- package/dist/application/WebSourceLocationService.js +3 -0
- package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
- package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
- package/dist/application/analysisView/AnalysisViewService.js +40 -2
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
- package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
- package/dist/application/binary/AnalysisClientCleanup.js +0 -24
- package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
- package/dist/application/binary/BinarySession.js +18 -1
- package/dist/application/binary/BinarySessionOpen.js +9 -1
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
- package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
- package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
- package/dist/application/evm/EvmInterfaceService.js +3 -0
- package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
- package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
- package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
- package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
- package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
- package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/jeb/JebAnalysisPort.js +1 -0
- package/dist/application/jeb/JebAnalysisService.js +13 -0
- package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/native/NativeUiActionTrace.js +16 -8
- package/dist/application/native/NativeValueTrace.js +23 -6
- package/dist/application/process/ProcessCli.js +25 -20
- package/dist/artifacts/ArtifactPaths.js +129 -8
- package/dist/artifacts/ArtifactProvider.js +34 -31
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +23 -0
- package/dist/artifacts/ArtifactResourceScope.js +100 -0
- package/dist/artifacts/AsarArtifactReader.js +218 -80
- package/dist/artifacts/AsarHeader.js +24 -0
- package/dist/artifacts/DirectoryArtifactReader.js +168 -65
- package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
- package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +245 -70
- package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
- package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
- package/dist/artifacts/ZipArtifactReader.js +77 -27
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
- package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
- package/dist/artifacts/inventory/classify.js +87 -25
- package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
- package/dist/artifacts/inventory/reader.js +13 -5
- package/dist/artifacts/inventory/scanCanonical.js +73 -30
- package/dist/artifacts/inventory/scanReader.js +43 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
- package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
- package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
- package/dist/browser/BrowserScenarioSecrets.js +52 -37
- package/dist/browser/CdpBrowserProvider.js +9 -3
- package/dist/browser/CdpCaptureDocuments.js +40 -6
- package/dist/browser/CdpCaptureDomSvg.js +210 -0
- package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
- package/dist/browser/CdpCaptureEventHandlers.js +26 -9
- package/dist/browser/CdpCaptureEvents.js +4 -9
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpConnection.js +22 -5
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -3
- package/dist/browser/CdpElectronScripts.js +2 -2
- package/dist/browser/CdpPageCapture.js +1 -1
- package/dist/browser/CdpTargetSession.js +30 -34
- package/dist/browser/CdpWebMcpDiscovery.js +48 -23
- package/dist/browser/ElectronFileScope.js +99 -9
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
- package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
- package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
- package/dist/browser/PlaywrightScenarioSession.js +130 -65
- package/dist/browser/PlaywrightScenarioStorage.js +507 -0
- package/dist/browser/PngVisualDiff.js +198 -29
- package/dist/browser/WebSourceMapFetcher.js +35 -9
- package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
- package/dist/browser/assets/PublishWebScripts.js +75 -20
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/WebArtifactReads.js +23 -1
- package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
- package/dist/browser/execution/CdpExecutionCapture.js +3 -3
- package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
- package/dist/browser/history/HarCapture.js +14 -0
- package/dist/browser/history/HarCaptureProcess.js +2 -10
- package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
- package/dist/browser/modules/WebModuleArtifacts.js +1 -0
- package/dist/cli/adbCommands.js +337 -0
- package/dist/cli/analysisViewCommands.js +39 -1
- package/dist/cli/apktoolCommands.js +53 -0
- package/dist/cli/artifactCommands.js +8 -11
- package/dist/cli/binaryDiagnosticsCommands.js +19 -1
- package/dist/cli/browserAdvancedCommands.js +65 -36
- package/dist/cli/coreAnalysisCommands.js +2 -2
- package/dist/cli/coreBinaryCommands.js +12 -13
- package/dist/cli/coreNativeCommands.js +1 -14
- package/dist/cli/electronCommands.js +14 -10
- package/dist/cli/evmCommands.js +13 -4
- package/dist/cli/firmwareCommands.js +7 -2
- package/dist/cli/javascriptApplicationAnalysis.js +19 -13
- package/dist/cli/javascriptRecoveryCommands.js +22 -15
- package/dist/cli/jebCommands.js +99 -0
- package/dist/cli/jsonOutput.js +12 -4
- package/dist/cli/referenceSourceImportStatus.js +7 -0
- package/dist/cli/setupCommands.js +15 -3
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +68 -22
- package/dist/cli/webScriptCommands.js +20 -1
- package/dist/cli/webSourceLocationCommands.js +21 -9
- package/dist/cli.js +11 -2
- package/dist/cliBrowserScenarioCommands.js +2 -1
- package/dist/cliCommandNames.js +32 -0
- package/dist/cliJsonInput.js +47 -34
- package/dist/cliObservationOptions.js +7 -0
- package/dist/composition/adb.js +3 -0
- package/dist/composition/apktool.js +3 -0
- package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
- package/dist/composition/binaryDiagnostics.js +4 -0
- package/dist/composition/browserScenario.js +2 -2
- package/dist/composition/directAnalysis.js +14 -7
- package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
- package/dist/composition/jeb.js +6 -0
- package/dist/config/environment.js +10 -0
- package/dist/config/ghidraLanguageOverride.js +9 -0
- package/dist/config/mcpInputSchemaProfile.js +27 -0
- package/dist/config/parseConfig.js +28 -1
- package/dist/contracts/adb/adbToolContracts.js +353 -0
- package/dist/contracts/advertisedInputExamples.js +48 -0
- package/dist/contracts/analysisDetail.js +10 -0
- package/dist/contracts/analysisViewToolContracts.js +17 -2
- package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
- package/dist/contracts/artifactComparisonExample.js +5 -5
- package/dist/contracts/artifactToolContracts.js +8 -5
- package/dist/contracts/browserToolContracts.js +1 -1
- package/dist/contracts/compactInputSchema.js +256 -0
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +104 -13
- package/dist/contracts/javascript/electronToolContracts.js +16 -3
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
- package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/jeb/jebToolContracts.js +64 -0
- package/dist/contracts/managed/managedToolContracts.js +3 -2
- package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
- package/dist/contracts/native/nativeToolContracts.js +1 -1
- package/dist/contracts/officialToolContracts.js +5 -5
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +5 -4
- package/dist/contracts/sessionToolSchemas.js +9 -4
- package/dist/contracts/toolContractExamples.js +6 -0
- package/dist/contracts/toolContractTypes.js +3 -0
- package/dist/contracts/toolContracts.js +6 -0
- package/dist/contracts/toolEffects.js +167 -0
- package/dist/contracts/toolOutputSchemaGroups.js +7 -5
- package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
- package/dist/contracts/toolSchemaMetadata.js +82 -7
- package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCleanup.js +29 -0
- package/dist/domain/analysisErrorPresentation.js +18 -4
- package/dist/domain/analysisErrorProjection.js +4 -1
- package/dist/domain/analysisSnapshot.js +5 -2
- package/dist/domain/analysisView/analysisView.js +53 -5
- package/dist/domain/analysisView/binaryLayoutView.js +2 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
- package/dist/domain/analysisView/nativeFunctionView.js +155 -0
- package/dist/domain/android/androidApplication.js +25 -20
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
- package/dist/domain/apple/appleApplication.js +40 -23
- package/dist/domain/apple/appleBundleAnatomy.js +95 -28
- package/dist/domain/apple/dyldPaths.js +9 -1
- package/dist/domain/apple/dylibResolution.js +3 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
- package/dist/domain/artifactComparison.js +39 -11
- package/dist/domain/artifactGraph.js +6 -4
- package/dist/domain/artifactIdentity.js +37 -9
- package/dist/domain/artifactInspection.js +10 -50
- package/dist/domain/artifactIntegrityPolicy.js +10 -0
- package/dist/domain/artifactInventoryEvidence.js +16 -17
- package/dist/domain/artifactPathSyntax.js +1 -1
- package/dist/domain/binaryTarget.js +16 -0
- package/dist/domain/binaryTargetTypes.js +8 -1
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserObservationSchemas.js +8 -4
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +3 -2
- package/dist/domain/callPath.js +8 -10
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalJsonDigestSteps.js +34 -12
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +2 -3
- package/dist/domain/compactStringIdentity.js +9 -0
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +12 -6
- package/dist/domain/evidenceBundle.js +51 -33
- package/dist/domain/evidenceRecordSummary.js +144 -0
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +2 -1
- package/dist/domain/functionComparisonNormalization.js +4 -3
- package/dist/domain/functionComparisonResults.js +2 -2
- package/dist/domain/functionDossierEvidence.js +2 -1
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/inputIssueProjection.js +16 -1
- package/dist/domain/javascript/electronActiveObservation.js +4 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
- package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
- package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
- package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
- package/dist/domain/javascript/javascriptAstValues.js +54 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
- package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
- package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
- package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
- package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
- package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
- package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
- package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
- package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
- package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
- package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
- package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
- package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
- package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
- package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
- package/dist/domain/javascript/javascriptSemanticState.js +22 -2
- package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
- package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
- package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
- package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
- package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
- package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
- package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
- package/dist/domain/jeb/jebAnalysis.js +114 -0
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +69 -31
- package/dist/domain/jsonValue.js +3 -0
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +47 -6
- package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
- package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
- package/dist/domain/managed/managedArtifact.js +1 -0
- package/dist/domain/managed/managedInspectionEvidence.js +13 -0
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/native/nativeAotPe.js +1408 -0
- package/dist/domain/native/nativeCallObservation.js +2 -4
- package/dist/domain/native/nativeInstruction.js +21 -0
- package/dist/domain/native/nativeMetadataRecovery.js +79 -6
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/peResources.js +94 -0
- package/dist/domain/nativeConvention.js +33 -0
- package/dist/domain/process/processCapture.js +102 -11
- package/dist/domain/process/processCaptureCoverage.js +8 -5
- package/dist/domain/process/processCaptureExample.js +67 -0
- package/dist/domain/process/processCaptureValidation.js +83 -3
- package/dist/domain/process/processComparison.js +0 -23
- package/dist/domain/process/processScenario.js +62 -10
- package/dist/domain/process/processTraceEvaluation.js +4 -4
- package/dist/domain/process/processTraceSpecification.js +1 -3
- package/dist/domain/propertyListKeys.js +3 -1
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +3 -2
- package/dist/domain/referenceSourceGraph.js +32 -23
- package/dist/domain/referenceSourceImportParsing.js +40 -48
- package/dist/domain/referenceSourcePathIdentity.js +22 -0
- package/dist/domain/referenceSourceRequireBindings.js +137 -0
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +2 -1
- package/dist/domain/swiftSymbolClassification.js +6 -1
- package/dist/domain/symbolAnalysis.js +17 -2
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +23 -3
- package/dist/domain/webCaptureDiff.js +170 -30
- package/dist/domain/webCaptureDiffSchemas.js +2 -8
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webScriptExport.js +1 -1
- package/dist/domain/webScriptExportError.js +10 -4
- package/dist/domain/webScriptExportPlan.js +7 -13
- package/dist/domain/zipPackageFormat.js +4 -1
- package/dist/domain/zodCollectionSteps.js +24 -0
- package/dist/dotnet/ManagedArtifactInspector.js +55 -43
- package/dist/dotnet/ManagedDecodeBudget.js +80 -0
- package/dist/dotnet/ManagedMemberInspector.js +13 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
- package/dist/dotnet/ManagedMemberRows.js +9 -4
- package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
- package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
- package/dist/dotnet/ManagedMetadataLayout.js +10 -4
- package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
- package/dist/dotnet/ManagedPeReader.js +41 -25
- package/dist/dotnet/ManagedReaderFailure.js +2 -1
- package/dist/dotnet/ManagedStaticProvider.js +65 -31
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationReport.js +9 -5
- package/dist/evaluation/CodexAgentEval.js +43 -13
- package/dist/evm/EvmoleFailures.js +0 -2
- package/dist/evm/EvmoleInterfaceProvider.js +67 -2
- package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
- package/dist/filesystem/OwnedFileHandle.js +36 -0
- package/dist/filesystem/RegularFile.js +73 -0
- package/dist/filesystem/StableFileHash.js +46 -0
- package/dist/filesystem/readFileHandleChunks.js +26 -0
- package/dist/firmware/FirmwareCommand.js +25 -3
- package/dist/firmware/FirmwareFiles.js +23 -8
- package/dist/firmware/FirmwareProvider.js +156 -32
- package/dist/firmware/FirmwarePublication.js +24 -3
- package/dist/firmware/FirmwareRelease.js +1 -0
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
- package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
- package/dist/ghidra/GhidraClient.js +90 -8
- package/dist/ghidra/GhidraDiagnostics.js +11 -8
- package/dist/ghidra/GhidraFunctionValues.js +26 -2
- package/dist/ghidra/GhidraInstallation.js +111 -10
- package/dist/ghidra/GhidraInventoryValues.js +23 -1
- package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
- package/dist/ghidra/GhidraLauncher.js +123 -58
- package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
- package/dist/ghidra/GhidraMipsProfile.js +79 -0
- package/dist/ghidra/GhidraProvider.js +57 -9
- package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
- package/dist/ghidra/GhidraProviderClient.js +282 -21
- package/dist/ghidra/GhidraSessionValues.js +9 -2
- package/dist/hopper/HopperAnalysisProfile.js +2 -0
- package/dist/hopper/HopperCleanup.js +1 -1
- package/dist/hopper/HopperClient.js +15 -6
- package/dist/hopper/HopperMachOImage.js +2 -0
- package/dist/hopper/HopperProvider.js +13 -2
- package/dist/ida/IdaOperationRunner.js +10 -2
- package/dist/ida/IdaProvider.js +7 -0
- package/dist/ida/IdaSessionClient.js +7 -3
- package/dist/ida/IdaWorkspace.js +4 -2
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
- package/dist/inspector/V8InspectorProvider.js +60 -8
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
- package/dist/javascript/recovery/RecoveryFiles.js +18 -7
- package/dist/javascript/recovery/WakaruCommand.js +22 -9
- package/dist/javascript/recovery/WakaruExecution.js +11 -7
- package/dist/javascript/recovery/WakaruProvider.js +139 -16
- package/dist/javascript/recovery/WakaruPublication.js +14 -4
- package/dist/javascript/recovery/WakaruRelease.js +10 -3
- package/dist/javascript/recovery/WakaruReport.js +12 -7
- package/dist/javascript/recovery/WakaruVersion.js +24 -0
- package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
- package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
- package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
- package/dist/jeb/JebMcpConnection.js +179 -0
- package/dist/jeb/JebMcpEndpoint.js +40 -0
- package/dist/jeb/JebProvider.js +299 -0
- package/dist/main/shutdown.js +76 -32
- package/dist/main/transport.js +1 -1
- package/dist/mcpDoctor.js +15 -6
- package/dist/native/AppleDispatchCoverage.js +25 -12
- package/dist/native/AppleDispatchMetadata.js +14 -7
- package/dist/native/AppleMachoFixups.js +71 -15
- package/dist/native/AppleMachoSelection.js +23 -3
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/LldbCallTracer.js +241 -75
- package/dist/native/NativeMacOSProvider.js +100 -20
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeMachoInspection.js +11 -7
- package/dist/native/NativeUiHelperRuntime.js +6 -1
- package/dist/native/NativeUiObservation.js +4 -3
- package/dist/native/pe/PeResourceLayout.js +120 -0
- package/dist/native/pe/PeResourceParser.js +286 -0
- package/dist/native/pe/PeResourcesProvider.js +63 -0
- package/dist/process/BoundedFileBytes.js +30 -7
- package/dist/process/DarwinProcessRunTokenReader.js +8 -3
- package/dist/process/OwnedCommand.js +4 -3
- package/dist/process/ProcessOwnership.js +104 -112
- package/dist/process/ProcessOwnershipObservation.js +104 -51
- package/dist/process/ProcessOwnershipProcessTree.js +4 -4
- package/dist/process/ProcessRunTokenObservations.js +48 -0
- package/dist/process/ProviderDiagnosticRedaction.js +17 -0
- package/dist/process/ProviderProcess.js +4 -3
- package/dist/process/capture/FilesystemSnapshot.js +116 -22
- package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
- package/dist/process/capture/ProcessCaptureProgress.js +62 -0
- package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
- package/dist/process/capture/ProcessHarness.js +202 -47
- package/dist/process/capture/ProcessNormalization.js +3 -1
- package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
- package/dist/process/capture/TerminalRenderer.js +24 -7
- package/dist/reference/ReferenceSourceReader.js +22 -5
- package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
- package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
- package/dist/reference/ReferenceSourceReaderFile.js +50 -10
- package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
- package/dist/server/EvidenceMcpServer.js +36 -1
- package/dist/server/admittedToolOperation.js +9 -0
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/contractToolHandler.js +21 -0
- package/dist/server/createServer.js +118 -47
- package/dist/server/registerAdbTools.js +36 -0
- package/dist/server/registerAnalysisViewTool.js +4 -9
- package/dist/server/registerAndroidTools.js +3 -12
- package/dist/server/registerApktoolTools.js +14 -0
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +3 -2
- package/dist/server/registerApplicationTools/coverage.js +3 -2
- package/dist/server/registerApplicationTools/helpers.js +3 -2
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +3 -2
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +5 -2
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
- package/dist/server/registerBrowserScenarioTool.js +10 -7
- package/dist/server/registerBrowserTools.js +12 -9
- package/dist/server/registerBundleComparisonTool.js +16 -2
- package/dist/server/registerCloseLifecycleTool.js +36 -5
- package/dist/server/registerElectronTools.js +28 -10
- package/dist/server/registerEnhancedTools.js +78 -73
- package/dist/server/registerEvidenceTools.js +54 -46
- package/dist/server/registerEvmTools.js +4 -9
- package/dist/server/registerFirmwareTools.js +3 -11
- package/dist/server/registerFunctionComparisonTool.js +5 -2
- package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
- package/dist/server/registerJebTools.js +16 -0
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
- package/dist/server/registerOfficialTools.js +31 -25
- package/dist/server/registerPeResourcesTool.js +9 -0
- package/dist/server/registerProcessComparisonTool.js +5 -2
- package/dist/server/registerRecordedCrashTools.js +4 -9
- package/dist/server/registerSessionRecordTools.js +2 -1
- package/dist/server/registerSessionTools.js +58 -21
- package/dist/server/registerWebModuleTool.js +4 -9
- package/dist/server/registerWebNetworkCaptureTool.js +4 -9
- package/dist/server/registerWebRuntimeTools.js +6 -5
- package/dist/server/registerWebScriptTool.js +6 -3
- package/dist/server/registerWebSourceLocationTool.js +4 -9
- package/dist/server/toolResult.js +21 -2
- package/dist/windows/WindowsPrivateRuntime.js +12 -5
- package/install.sh +7 -4
- package/licenses/nativeaot-parser-MIT.txt +28 -0
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +38 -7
- package/scripts/rea.mjs +16 -1
- package/skills/reverse-engineer-anything/SKILL.md +52 -51
- package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
- package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/server/registerNativeTools.js +0 -6
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { lstat, stat } from "node:fs/promises";
|
|
2
|
+
import { RegularFileAdmissionFailure, openRegularFile, sameRegularFileState, RegularFileChangedError, } from "../filesystem/RegularFile.js";
|
|
3
|
+
import { OwnedFileHandle } from "../filesystem/OwnedFileHandle.js";
|
|
4
|
+
import { readBoundedFileBytes } from "../process/BoundedFileBytes.js";
|
|
5
|
+
/** A close failed after reading; this error transfers the exact handle owner. */
|
|
6
|
+
export class RegularFileCleanupFailure extends Error {
|
|
7
|
+
path;
|
|
8
|
+
owner;
|
|
9
|
+
outcome;
|
|
10
|
+
cleanupCause;
|
|
11
|
+
constructor(path, owner, outcome, cleanupCause) {
|
|
12
|
+
super(`Regular file cleanup failed: ${path}`, {
|
|
13
|
+
cause: outcome.kind === "failed" ? outcome.cause : cleanupCause,
|
|
14
|
+
});
|
|
15
|
+
this.path = path;
|
|
16
|
+
this.owner = owner;
|
|
17
|
+
this.outcome = outcome;
|
|
18
|
+
this.cleanupCause = cleanupCause;
|
|
19
|
+
this.name = "RegularFileCleanupFailure";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Retry a failed close through its retained owner and report any remaining cleanup. */
|
|
23
|
+
export const retryRegularFileCleanup = async (failure, resources) => {
|
|
24
|
+
const released = await resources.release({
|
|
25
|
+
kind: "file-handle",
|
|
26
|
+
handle: failure.owner,
|
|
27
|
+
resource: failure.path,
|
|
28
|
+
});
|
|
29
|
+
if (released.kind === "released")
|
|
30
|
+
return { outcome: failure.outcome };
|
|
31
|
+
return {
|
|
32
|
+
outcome: failure.outcome,
|
|
33
|
+
cleanup: {
|
|
34
|
+
reason: `${failureMessage(failure.cleanupCause)}; retry: ${failureMessage(released.cause)}`,
|
|
35
|
+
resources: [failure.path],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
const failureMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
40
|
+
/** Admit one regular-file handle, retain it through the consumer, and always close it. */
|
|
41
|
+
export const withRegularFile = async (path, read, options = {}) => {
|
|
42
|
+
const { signal } = options;
|
|
43
|
+
let handle;
|
|
44
|
+
try {
|
|
45
|
+
handle = await openRegularFile(path, {
|
|
46
|
+
symlinks: options.symlinks ?? "follow",
|
|
47
|
+
signal,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (cause) {
|
|
51
|
+
if (!(cause instanceof RegularFileAdmissionFailure))
|
|
52
|
+
throw cause;
|
|
53
|
+
throw new RegularFileCleanupFailure(path, cause.owner, { kind: "failed", cause: cause.cause }, cause.cleanupCause);
|
|
54
|
+
}
|
|
55
|
+
const owner = new OwnedFileHandle(handle);
|
|
56
|
+
let outcome;
|
|
57
|
+
try {
|
|
58
|
+
const stats = await handle.stat();
|
|
59
|
+
signal?.throwIfAborted();
|
|
60
|
+
const value = await read(handle, stats);
|
|
61
|
+
signal?.throwIfAborted();
|
|
62
|
+
const [opened, currentPath] = await Promise.all([
|
|
63
|
+
handle.stat(),
|
|
64
|
+
options.symlinks === "reject" ? lstat(path) : stat(path),
|
|
65
|
+
]);
|
|
66
|
+
if (!sameRegularFileState(stats, opened) ||
|
|
67
|
+
!sameRegularFileState(stats, currentPath))
|
|
68
|
+
throw new RegularFileChangedError(path);
|
|
69
|
+
outcome = { kind: "completed", value };
|
|
70
|
+
}
|
|
71
|
+
catch (cause) {
|
|
72
|
+
outcome = { kind: "failed", cause };
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
await owner.close();
|
|
76
|
+
}
|
|
77
|
+
catch (cleanupCause) {
|
|
78
|
+
throw new RegularFileCleanupFailure(path, owner, outcome, cleanupCause);
|
|
79
|
+
}
|
|
80
|
+
if (outcome.kind === "failed")
|
|
81
|
+
throw outcome.cause;
|
|
82
|
+
return outcome.value;
|
|
83
|
+
};
|
|
84
|
+
/** Admit a regular file without waiting for a pipe, then read its verified handle. */
|
|
85
|
+
export const readRegularFile = (path, options = {}) => withRegularFile(path, async (handle, stats) => {
|
|
86
|
+
const bytes = await readBoundedFileBytes(handle, stats.size, options.signal);
|
|
87
|
+
if (bytes === undefined || bytes.length !== stats.size)
|
|
88
|
+
throw new RegularFileChangedError(path);
|
|
89
|
+
return bytes;
|
|
90
|
+
}, options);
|
|
91
|
+
/** Read one admitted regular file as UTF-8 without waiting on a pipe. */
|
|
92
|
+
export const readRegularFileText = async (path, options = {}) => {
|
|
93
|
+
try {
|
|
94
|
+
return (await readRegularFile(path, options)).toString("utf8");
|
|
95
|
+
}
|
|
96
|
+
catch (cause) {
|
|
97
|
+
if (cause instanceof RegularFileCleanupFailure &&
|
|
98
|
+
cause.outcome.kind === "completed" &&
|
|
99
|
+
Buffer.isBuffer(cause.outcome.value))
|
|
100
|
+
throw new RegularFileCleanupFailure(cause.path, cause.owner, { kind: "completed", value: cause.outcome.value.toString("utf8") }, cause.cleanupCause);
|
|
101
|
+
throw cause;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
@@ -2,8 +2,49 @@ import { manualRegistrationRemediation, } from "./SupportedClients.js";
|
|
|
2
2
|
import { configureDetectedClients } from "./SetupClients.js";
|
|
3
3
|
import { discoverSetupState, planSetupActions } from "./SetupPlan.js";
|
|
4
4
|
import { filterClientsNeedingConfigure, hostRemediation, systemSetupHost, } from "./SetupHost.js";
|
|
5
|
+
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
6
|
+
import { analysisErrorWithCleanupFailure } from "../domain/analysisErrorCleanup.js";
|
|
7
|
+
import { ProviderCleanupError } from "../domain/providerCleanupError.js";
|
|
5
8
|
/** Discover, approve, and apply setup actions idempotently. */
|
|
6
9
|
export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
10
|
+
let result;
|
|
11
|
+
let primaryFailure;
|
|
12
|
+
let threw = false;
|
|
13
|
+
try {
|
|
14
|
+
result = await runSetupWorkflow(options, host, confirm);
|
|
15
|
+
}
|
|
16
|
+
catch (cause) {
|
|
17
|
+
threw = true;
|
|
18
|
+
primaryFailure = cause;
|
|
19
|
+
}
|
|
20
|
+
let cleanupFailure;
|
|
21
|
+
try {
|
|
22
|
+
cleanupFailure = await host.close?.();
|
|
23
|
+
}
|
|
24
|
+
catch (cause) {
|
|
25
|
+
cleanupFailure = `Setup resource cleanup failed: ${failureMessage(cause)}`;
|
|
26
|
+
}
|
|
27
|
+
if (threw) {
|
|
28
|
+
if (cleanupFailure !== undefined && primaryFailure instanceof AnalysisError)
|
|
29
|
+
throw analysisErrorWithCleanupFailure(primaryFailure, new ProviderCleanupError("setup", primaryFailure.cleanupResources, { reason: cleanupFailure }, { operation: "setup" }), "setup");
|
|
30
|
+
if (cleanupFailure !== undefined)
|
|
31
|
+
throw new AggregateError([primaryFailure, new Error(cleanupFailure)], "Setup and resource cleanup failed.", { cause: primaryFailure });
|
|
32
|
+
throw primaryFailure;
|
|
33
|
+
}
|
|
34
|
+
if (result === undefined)
|
|
35
|
+
throw new Error("Setup returned no result.");
|
|
36
|
+
if (cleanupFailure === undefined)
|
|
37
|
+
return result;
|
|
38
|
+
return {
|
|
39
|
+
...result,
|
|
40
|
+
status: "needs_human",
|
|
41
|
+
code: result.code ?? "cleanup_failed",
|
|
42
|
+
remediation: result.remediation
|
|
43
|
+
? `${result.remediation} ${cleanupFailure}`
|
|
44
|
+
: cleanupFailure,
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const runSetupWorkflow = async (options, host, confirm) => {
|
|
7
48
|
const appliedActions = [];
|
|
8
49
|
let plannedActions = [];
|
|
9
50
|
const clients = {};
|
|
@@ -27,6 +68,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
27
68
|
options.readinessScope?.clients === undefined &&
|
|
28
69
|
options.allDetectedClients !== true &&
|
|
29
70
|
options.installHopper !== true &&
|
|
71
|
+
options.skillClientIds === undefined &&
|
|
30
72
|
options.installSkill === undefined;
|
|
31
73
|
const interactiveSelection = confirm !== undefined && !options.structured && clientSelectionAllowed;
|
|
32
74
|
let selectedClientIds = options.allDetectedClients
|
|
@@ -34,18 +76,29 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
34
76
|
: (options.clientIds ??
|
|
35
77
|
options.readinessScope?.clients ??
|
|
36
78
|
discovery.defaultClientIds);
|
|
79
|
+
let selectedSkillClientIds = options.skillClientIds ?? selectedClientIds;
|
|
80
|
+
let skillNeedsInstall = await host.skillNeedsInstall(selectedSkillClientIds);
|
|
37
81
|
let skillSelected = options.installSkill === true ||
|
|
38
|
-
(options.installSkill !== false &&
|
|
39
|
-
|
|
82
|
+
(options.installSkill !== false &&
|
|
83
|
+
(selectedClientIds.length > 0 || selectedSkillClientIds.length > 0));
|
|
84
|
+
let installSkill = skillSelected && skillNeedsInstall;
|
|
40
85
|
let planDiscovery = discovery;
|
|
41
86
|
if (interactiveSelection) {
|
|
42
|
-
const
|
|
87
|
+
const selectionSkillClientIds = [
|
|
88
|
+
...new Set([
|
|
89
|
+
...discovery.defaultClientIds,
|
|
90
|
+
...discovery.detectedClientIds,
|
|
91
|
+
]),
|
|
92
|
+
];
|
|
93
|
+
const selectionSkillNeedsInstall = await host.skillNeedsInstall(selectionSkillClientIds);
|
|
94
|
+
const offerSkillAction = options.installSkill !== false && selectionSkillNeedsInstall;
|
|
43
95
|
const selectionActions = await planSetupActions({
|
|
44
96
|
discovery,
|
|
45
97
|
host,
|
|
46
98
|
providerEnvironment,
|
|
47
99
|
command: host.registrationCommand,
|
|
48
100
|
clientIds: [],
|
|
101
|
+
skillClientIds: selectionSkillClientIds,
|
|
49
102
|
installSkill: offerSkillAction,
|
|
50
103
|
});
|
|
51
104
|
const decision = await confirm(selectionActions.plannedActions, {
|
|
@@ -67,6 +120,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
67
120
|
selectedClientIds = [...selectedActionIds]
|
|
68
121
|
.filter((id) => id.startsWith("configure_client:"))
|
|
69
122
|
.map((id) => id.slice("configure_client:".length));
|
|
123
|
+
skillNeedsInstall = await host.skillNeedsInstall(selectedClientIds);
|
|
70
124
|
const proposedInstallAction = selectionActions.plannedActions.some(({ id }) => id === "install_hopper");
|
|
71
125
|
planDiscovery = {
|
|
72
126
|
...discovery,
|
|
@@ -78,7 +132,8 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
78
132
|
(selectedActionIds.has("install_skill") &&
|
|
79
133
|
selectedClientIds.length === 0) ||
|
|
80
134
|
(options.installSkill !== false && selectedClientIds.length > 0);
|
|
81
|
-
installSkill = skillSelected &&
|
|
135
|
+
installSkill = skillSelected && skillNeedsInstall;
|
|
136
|
+
selectedSkillClientIds = selectedClientIds;
|
|
82
137
|
}
|
|
83
138
|
const planned = await planSetupActions({
|
|
84
139
|
discovery: planDiscovery,
|
|
@@ -86,6 +141,7 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
86
141
|
providerEnvironment,
|
|
87
142
|
command: host.registrationCommand,
|
|
88
143
|
clientIds: selectedClientIds,
|
|
144
|
+
skillClientIds: selectedSkillClientIds,
|
|
89
145
|
installSkill,
|
|
90
146
|
});
|
|
91
147
|
plannedActions = planned.plannedActions;
|
|
@@ -177,8 +233,8 @@ export const runSetup = async (options, host = systemSetupHost(), confirm) => {
|
|
|
177
233
|
if (clientFailure !== undefined)
|
|
178
234
|
return fail(clientFailure);
|
|
179
235
|
if (planSelection.installSkill &&
|
|
180
|
-
!(await installSkillAction(host, options, appliedActions)))
|
|
181
|
-
return fail("REA analysis skill could not be installed or verified. Check permissions for
|
|
236
|
+
!(await installSkillAction(host, options, appliedActions, selectedSkillClientIds)))
|
|
237
|
+
return fail("REA analysis skill could not be installed or verified. Check permissions for its planned skill directories, then rerun setup.");
|
|
182
238
|
const doctor = summarizeDoctor(await host.doctor(readinessScope));
|
|
183
239
|
const remediation = combineRemediation(finalSetupRemediation(host.platform, appliedActions.includes("installed_hopper"), doctor.healthy, hopperPath), manualRemediation);
|
|
184
240
|
return {
|
|
@@ -223,8 +279,10 @@ const installHopperAction = async (input) => {
|
|
|
223
279
|
emitProgress(input.options, {
|
|
224
280
|
actionId: "install_hopper",
|
|
225
281
|
label,
|
|
226
|
-
state: "completed",
|
|
227
|
-
detail: installed.
|
|
282
|
+
state: installed.cleanupFailure === undefined ? "completed" : "warning",
|
|
283
|
+
detail: installed.cleanupFailure === undefined
|
|
284
|
+
? installed.launcherPath
|
|
285
|
+
: `${installed.launcherPath}; ${installed.cleanupFailure}`,
|
|
228
286
|
});
|
|
229
287
|
const providerEnvironment = {
|
|
230
288
|
...input.providerEnvironment,
|
|
@@ -236,14 +294,14 @@ const installHopperAction = async (input) => {
|
|
|
236
294
|
selectedClients: await filterClientsNeedingConfigure(input.host, input.selectedClients, providerEnvironment, input.host.registrationCommand),
|
|
237
295
|
};
|
|
238
296
|
};
|
|
239
|
-
const installSkillAction = async (host, options, appliedActions) => {
|
|
297
|
+
const installSkillAction = async (host, options, appliedActions, skillClientIds) => {
|
|
240
298
|
const label = "REA reverse-engineering skill";
|
|
241
299
|
emitProgress(options, {
|
|
242
300
|
actionId: "install_skill",
|
|
243
301
|
label,
|
|
244
302
|
state: "started",
|
|
245
303
|
});
|
|
246
|
-
const skill = await host.installSkill();
|
|
304
|
+
const skill = await host.installSkill(skillClientIds);
|
|
247
305
|
if (skill === "failed") {
|
|
248
306
|
emitProgress(options, {
|
|
249
307
|
actionId: "install_skill",
|
|
@@ -334,3 +392,4 @@ const summarizeDoctor = (report) => ({
|
|
|
334
392
|
},
|
|
335
393
|
}),
|
|
336
394
|
});
|
|
395
|
+
const failureMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
@@ -1,43 +1,82 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readClientPolicyBlock } from "./GeminiClientSettings.js";
|
|
2
|
+
import { readClientConfigurationFiles } from "./ClientConfigurationFiles.js";
|
|
3
|
+
import { clientRegistrationEntry, clientConfigurationValuesEqual, clientServerListedDisabled, clientServerPath, legacyClientServerPath, OMP_DISABLED_SERVERS_KEY, parseClientConfiguration, serializeClientConfiguration, withClientServers, } from "./ClientConfigurationDocument.js";
|
|
2
4
|
import { constants as fsConstants } from "node:fs";
|
|
3
|
-
import { copyFile, mkdir,
|
|
5
|
+
import { copyFile, mkdir, rm, writeFile } from "node:fs/promises";
|
|
4
6
|
import { dirname } from "node:path";
|
|
5
7
|
import writeFileAtomic from "write-file-atomic";
|
|
8
|
+
import { clientRegistrationEnvironment } from "./ClientRegistrationEnvironment.js";
|
|
6
9
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
7
10
|
import { npxRegistrationCommand } from "./ClientRegistrationIdentity.js";
|
|
8
11
|
import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
|
|
9
12
|
import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
|
|
10
|
-
|
|
13
|
+
import { readRegularFileText, RegularFileCleanupFailure, } from "./RegularFileRead.js";
|
|
11
14
|
/** Configure one supported client's native stdio MCP registration shape. */
|
|
12
|
-
export const configureClientConfiguration = (client, environment = {}, command =
|
|
13
|
-
if (client.
|
|
14
|
-
return Promise.resolve({ status: "failed", reason: "
|
|
15
|
-
return configureClientDocument(client, environment, command
|
|
15
|
+
export const configureClientConfiguration = (client, environment = {}, command = npxRegistrationCommand()) => {
|
|
16
|
+
if (client.configPathError !== undefined)
|
|
17
|
+
return Promise.resolve({ status: "failed", reason: "path" });
|
|
18
|
+
return configureClientDocument(client, environment, command);
|
|
16
19
|
};
|
|
17
|
-
const configureClientDocument = async (client, environment, command
|
|
20
|
+
const configureClientDocument = async (client, environment, command) => {
|
|
21
|
+
const format = client.format;
|
|
22
|
+
if (format === undefined || format === "unsupported")
|
|
23
|
+
return { status: "failed", reason: "readback" };
|
|
24
|
+
const files = await readClientConfigurationFiles(client);
|
|
25
|
+
if (!files.ok) {
|
|
26
|
+
throwCleanupFailure(files.error);
|
|
27
|
+
return { status: "failed", reason: "readback" };
|
|
28
|
+
}
|
|
29
|
+
const policy = await readClientPolicyBlock(client, undefined, clientConfigurationDesired(client, environment, command, files.value.at(-1)));
|
|
30
|
+
if (!policy.ok) {
|
|
31
|
+
throwCleanupFailure(policy.error);
|
|
32
|
+
return { status: "failed", reason: "readback" };
|
|
33
|
+
}
|
|
34
|
+
if (policy.value !== undefined)
|
|
35
|
+
return { status: "failed", reason: "readback" };
|
|
18
36
|
const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
|
|
19
37
|
if (transactionPath === undefined)
|
|
20
38
|
return { status: "failed", reason: "path" };
|
|
21
39
|
let original;
|
|
22
40
|
try {
|
|
23
|
-
original = await
|
|
41
|
+
original = await readRegularFileText(transactionPath);
|
|
24
42
|
}
|
|
25
43
|
catch (cause) {
|
|
44
|
+
if (cause instanceof RegularFileCleanupFailure)
|
|
45
|
+
throw cause;
|
|
26
46
|
if (!isMissing(cause))
|
|
27
47
|
return { status: "failed", reason: "readback" };
|
|
28
48
|
}
|
|
29
49
|
let parsed;
|
|
30
50
|
try {
|
|
31
51
|
parsed = parseClientConfiguration(original ?? (format === "toml" || format === "grok" ? "" : "{}"), format);
|
|
52
|
+
const policy = await readClientPolicyBlock(client, parsed, clientConfigurationDesired(client, environment, command, parsed));
|
|
53
|
+
if (!policy.ok) {
|
|
54
|
+
throwCleanupFailure(policy.error);
|
|
55
|
+
return { status: "failed", reason: "readback" };
|
|
56
|
+
}
|
|
57
|
+
if (policy.value !== undefined)
|
|
58
|
+
return { status: "failed", reason: "readback" };
|
|
32
59
|
}
|
|
33
60
|
catch (cause) {
|
|
61
|
+
if (cause instanceof RegularFileCleanupFailure)
|
|
62
|
+
throw cause;
|
|
34
63
|
// Malformed existing configuration fails the readback gate.
|
|
35
64
|
void cause;
|
|
36
65
|
return { status: "failed", reason: "readback" };
|
|
37
66
|
}
|
|
38
|
-
const desired = clientConfigurationDesired(client, environment, command, parsed
|
|
67
|
+
const desired = clientConfigurationDesired(client, environment, command, parsed);
|
|
39
68
|
if (registrationCurrent(parsed, desired))
|
|
40
69
|
return { status: "unchanged" };
|
|
70
|
+
return persistClientConfiguration({
|
|
71
|
+
client,
|
|
72
|
+
transactionPath,
|
|
73
|
+
format,
|
|
74
|
+
original,
|
|
75
|
+
parsed,
|
|
76
|
+
desired,
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
const persistClientConfiguration = async ({ client, transactionPath, format, original, parsed, desired, }) => {
|
|
41
80
|
const backupPath = original === undefined ? undefined : `${client.configPath}.rea.backup`;
|
|
42
81
|
if (backupPath !== undefined &&
|
|
43
82
|
!(await preserveConfigBackup(transactionPath, backupPath)))
|
|
@@ -45,12 +84,25 @@ const configureClientDocument = async (client, environment, command, format) =>
|
|
|
45
84
|
// A native OpenCode V2 entry replaces REA's legacy V1 entry, which would
|
|
46
85
|
// otherwise conflict with it.
|
|
47
86
|
const legacyPath = legacyClientServerPath(parsed, PRODUCT_IDENTITY.mcpServerKey);
|
|
48
|
-
const
|
|
87
|
+
const registered = withClientServers(parsed, { ...parsed.servers, [PRODUCT_IDENTITY.mcpServerKey]: desired }, PRODUCT_IDENTITY.mcpServerKey);
|
|
88
|
+
// OMP's denylist would hide the registration; keep every other listed name.
|
|
89
|
+
const ompDisabled = parsed.dialect === "omp"
|
|
90
|
+
? parsed.document[OMP_DISABLED_SERVERS_KEY]
|
|
91
|
+
: undefined;
|
|
92
|
+
const enableOmp = Array.isArray(ompDisabled) &&
|
|
93
|
+
ompDisabled.includes(PRODUCT_IDENTITY.mcpServerKey);
|
|
94
|
+
const document = enableOmp && Array.isArray(ompDisabled)
|
|
95
|
+
? {
|
|
96
|
+
...registered,
|
|
97
|
+
[OMP_DISABLED_SERVERS_KEY]: ompDisabled.filter((name) => name !== PRODUCT_IDENTITY.mcpServerKey),
|
|
98
|
+
}
|
|
99
|
+
: registered;
|
|
49
100
|
try {
|
|
50
101
|
await mkdir(dirname(client.configPath), { recursive: true });
|
|
51
102
|
await writeFileAtomic(transactionPath, serializeClientConfiguration(document, format, original, [
|
|
52
103
|
clientServerPath(parsed, PRODUCT_IDENTITY.mcpServerKey),
|
|
53
104
|
...(legacyPath === undefined ? [] : [legacyPath]),
|
|
105
|
+
...(enableOmp ? [[OMP_DISABLED_SERVERS_KEY]] : []),
|
|
54
106
|
]), {
|
|
55
107
|
encoding: "utf8",
|
|
56
108
|
mode: 0o600,
|
|
@@ -62,13 +114,15 @@ const configureClientDocument = async (client, environment, command, format) =>
|
|
|
62
114
|
return { status: "failed", reason: "write" };
|
|
63
115
|
}
|
|
64
116
|
try {
|
|
65
|
-
const readback = parseClientConfiguration(await
|
|
117
|
+
const readback = parseClientConfiguration(await readRegularFileText(transactionPath), format);
|
|
66
118
|
if (!registrationCurrent(readback, desired)) {
|
|
67
119
|
await restoreConfig(transactionPath, original);
|
|
68
120
|
return { status: "failed", reason: "readback" };
|
|
69
121
|
}
|
|
70
122
|
}
|
|
71
123
|
catch (cause) {
|
|
124
|
+
if (cause instanceof RegularFileCleanupFailure)
|
|
125
|
+
throw cause;
|
|
72
126
|
// Readback failure restores the transaction before reporting.
|
|
73
127
|
void cause;
|
|
74
128
|
await restoreConfig(transactionPath, original);
|
|
@@ -81,12 +135,27 @@ const configureClientDocument = async (client, environment, command, format) =>
|
|
|
81
135
|
};
|
|
82
136
|
/** Determine whether an existing client configuration matches the desired registration. */
|
|
83
137
|
export const clientConfigurationAligned = async (client, providerEnvironment, command) => {
|
|
138
|
+
if (client.configPathError !== undefined)
|
|
139
|
+
return false;
|
|
84
140
|
try {
|
|
85
|
-
const
|
|
141
|
+
const files = await readClientConfigurationFiles(client);
|
|
142
|
+
if (!files.ok) {
|
|
143
|
+
throwCleanupFailure(files.error);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
const original = await readRegularFileText(client.configPath);
|
|
86
147
|
const parsed = parseClientConfiguration(original, client.format);
|
|
87
|
-
|
|
148
|
+
const policy = await readClientPolicyBlock(client, parsed, clientConfigurationDesired(client, providerEnvironment, command, parsed));
|
|
149
|
+
if (!policy.ok) {
|
|
150
|
+
throwCleanupFailure(policy.error);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
return (policy.value === undefined &&
|
|
154
|
+
registrationCurrent(parsed, clientConfigurationDesired(client, providerEnvironment, command, parsed)));
|
|
88
155
|
}
|
|
89
156
|
catch (cause) {
|
|
157
|
+
if (cause instanceof RegularFileCleanupFailure)
|
|
158
|
+
throw cause;
|
|
90
159
|
// Unreadable configuration is treated as not aligned so setup repairs it.
|
|
91
160
|
void cause;
|
|
92
161
|
return false;
|
|
@@ -94,8 +163,28 @@ export const clientConfigurationAligned = async (client, providerEnvironment, co
|
|
|
94
163
|
};
|
|
95
164
|
/** Preflight one client configuration before setup presents any mutations. */
|
|
96
165
|
export const inspectClientConfiguration = async (client, providerEnvironment, command) => {
|
|
166
|
+
if (client.configPathError !== undefined)
|
|
167
|
+
return { status: "invalid", remediation: client.configPathError };
|
|
97
168
|
if (client.format === "unsupported")
|
|
98
169
|
return { status: "already_current" };
|
|
170
|
+
const files = await readClientConfigurationFiles(client);
|
|
171
|
+
if (!files.ok) {
|
|
172
|
+
throwCleanupFailure(files.error);
|
|
173
|
+
return {
|
|
174
|
+
status: "invalid",
|
|
175
|
+
remediation: files.error.detail,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const policy = await readClientPolicyBlock(client, undefined, clientConfigurationDesired(client, providerEnvironment, command, files.value.at(-1)));
|
|
179
|
+
if (!policy.ok) {
|
|
180
|
+
throwCleanupFailure(policy.error);
|
|
181
|
+
return {
|
|
182
|
+
status: "invalid",
|
|
183
|
+
remediation: policy.error.detail,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
if (policy.value !== undefined)
|
|
187
|
+
return { status: "invalid", remediation: policy.value };
|
|
99
188
|
const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
|
|
100
189
|
if (transactionPath === undefined)
|
|
101
190
|
return {
|
|
@@ -104,23 +193,37 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
|
|
|
104
193
|
};
|
|
105
194
|
let original;
|
|
106
195
|
try {
|
|
107
|
-
original = await
|
|
196
|
+
original = await readRegularFileText(transactionPath);
|
|
108
197
|
}
|
|
109
198
|
catch (cause) {
|
|
199
|
+
if (cause instanceof RegularFileCleanupFailure)
|
|
200
|
+
throw cause;
|
|
110
201
|
if (isMissing(cause))
|
|
111
202
|
return { status: "create" };
|
|
112
203
|
return {
|
|
113
204
|
status: "invalid",
|
|
114
|
-
remediation:
|
|
205
|
+
remediation: `The configuration file could not be read. Check its permissions before rerunning setup. ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
115
206
|
};
|
|
116
207
|
}
|
|
117
208
|
try {
|
|
118
209
|
const parsed = parseClientConfiguration(original, client.format);
|
|
119
|
-
const
|
|
210
|
+
const policy = await readClientPolicyBlock(client, parsed, clientConfigurationDesired(client, providerEnvironment, command, parsed));
|
|
211
|
+
if (!policy.ok) {
|
|
212
|
+
throwCleanupFailure(policy.error);
|
|
213
|
+
return {
|
|
214
|
+
status: "invalid",
|
|
215
|
+
remediation: policy.error.detail,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
if (policy.value !== undefined)
|
|
219
|
+
return { status: "invalid", remediation: policy.value };
|
|
220
|
+
const desired = clientConfigurationDesired(client, providerEnvironment, command, parsed);
|
|
120
221
|
if (registrationCurrent(parsed, desired))
|
|
121
222
|
return { status: "already_current" };
|
|
122
223
|
}
|
|
123
224
|
catch (cause) {
|
|
225
|
+
if (cause instanceof RegularFileCleanupFailure)
|
|
226
|
+
throw cause;
|
|
124
227
|
// Malformed configuration is reported with the invalid remediation.
|
|
125
228
|
void cause;
|
|
126
229
|
return {
|
|
@@ -134,6 +237,10 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
|
|
|
134
237
|
};
|
|
135
238
|
};
|
|
136
239
|
const isMissing = (cause) => cause instanceof Error && "code" in cause && cause.code === "ENOENT";
|
|
240
|
+
const throwCleanupFailure = (error) => {
|
|
241
|
+
if (error.cleanupFailure !== undefined)
|
|
242
|
+
throw error.cleanupFailure;
|
|
243
|
+
};
|
|
137
244
|
const preserveConfigBackup = async (source, destination) => {
|
|
138
245
|
try {
|
|
139
246
|
await copyFile(source, destination, fsConstants.COPYFILE_EXCL);
|
|
@@ -155,14 +262,18 @@ const restoreConfig = async (path, original) => {
|
|
|
155
262
|
void cause;
|
|
156
263
|
}
|
|
157
264
|
};
|
|
158
|
-
/** Whether REA's entry matches, no legacy entry remains, and
|
|
265
|
+
/** Whether REA's entry matches, no legacy entry remains, and no client disable list suppresses it. */
|
|
159
266
|
const registrationCurrent = (parsed, desired) => clientConfigurationValuesEqual(parsed.servers[PRODUCT_IDENTITY.mcpServerKey], desired) &&
|
|
160
267
|
!Object.hasOwn(parsed.legacyServers, PRODUCT_IDENTITY.mcpServerKey) &&
|
|
161
|
-
!(parsed.
|
|
162
|
-
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
268
|
+
!clientServerListedDisabled(parsed, PRODUCT_IDENTITY.mcpServerKey);
|
|
269
|
+
const clientConfigurationDesired = (client, providerEnvironment, command, parsed) => {
|
|
270
|
+
const format = parsed?.dialect ?? client.format ?? "json";
|
|
271
|
+
// Preserve explicitly configured server settings, never the ambient process
|
|
272
|
+
// environment. Newly discovered provider paths win only for their own keys.
|
|
273
|
+
const environment = clientRegistrationEnvironment(parsed, providerEnvironment);
|
|
274
|
+
if (!environment.ok)
|
|
275
|
+
throw environment.error;
|
|
276
|
+
const registration = clientRegistrationEntry(format, command.length === 0 ? [PRODUCT_IDENTITY.cliBinary, "mcp"] : command, environment.value);
|
|
166
277
|
return {
|
|
167
278
|
...registration,
|
|
168
279
|
...(client.name === "codex" || client.name === "grok_build"
|