rea-agents 3.1.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 +72 -95
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
- package/dist/application/ArtifactInventory/scanReader.js +69 -51
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +41 -13
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +5 -93
- package/dist/application/BinarySessionStatus.js +5 -16
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +42 -58
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityInventory.js +10 -15
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +3 -8
- package/dist/application/ElectronActiveObservationService.js +3 -6
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +76 -44
- package/dist/application/EvidenceBundleCommands.js +11 -11
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +6 -41
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +6 -32
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +5 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +6 -16
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +52 -17
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -96
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +19 -45
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -93
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +36 -58
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +15 -24
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +26 -50
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +9 -14
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
- package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +14 -30
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +0 -17
- package/dist/browser/V8InspectorCaptureProjection.js +7 -8
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +0 -54
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +5 -270
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +42 -112
- package/dist/cliBrowserAdvancedCommands.js +10 -106
- package/dist/cliBrowserCommands.js +15 -127
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +4 -5
- package/dist/cliElectronCommands.js +8 -72
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +9 -91
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -96
- package/dist/cliPolicyCommands.js +2 -17
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +2 -2
- package/dist/config/environment.js +0 -9
- package/dist/config/parseConfig.js +1 -33
- package/dist/config/parsers.js +6 -27
- package/dist/config/passiveObservation.js +7 -77
- package/dist/config/permissions.js +0 -7
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +56 -109
- package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +20 -67
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +8 -73
- package/dist/contracts/electronToolContracts.js +8 -108
- package/dist/contracts/enhancedInputs.js +23 -54
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +2 -2
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +6 -95
- package/dist/contracts/managedWorkflowExamples.js +77 -128
- package/dist/contracts/managedWorkflowToolContracts.js +51 -77
- package/dist/contracts/nativeToolContracts.js +7 -11
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +6 -15
- package/dist/contracts/toolContractExamples.js +11 -11
- package/dist/contracts/toolContractHelpers.js +0 -4
- package/dist/contracts/toolContracts.js +60 -71
- package/dist/contracts/toolEffects.js +5 -13
- package/dist/contracts/toolOutputSchemaGroups.js +37 -91
- package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
- package/dist/contracts/toolSchemaMetadata.js +8 -19
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -54
- package/dist/domain/appleApplication.js +24 -67
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -221
- package/dist/domain/browserCaptureComparison.js +47 -24
- package/dist/domain/browserObservation.js +28 -193
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +20 -19
- package/dist/domain/callPath.js +47 -167
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +36 -8
- package/dist/domain/conformanceTrustGate.js +23 -14
- package/dist/domain/customProtocolCapture.js +1 -1
- package/dist/domain/electronActiveObservation.js +70 -103
- package/dist/domain/electronObservation.js +14 -80
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +10 -17
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +20 -12
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +4 -11
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -156
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +15 -136
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +24 -41
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +42 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
- package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +2 -7
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +1 -5
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureValidation.js +1 -7
- package/dist/domain/processComparison.js +3 -12
- package/dist/domain/processReactiveMatching.js +29 -50
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +33 -18
- package/dist/domain/processScenario.js +56 -90
- package/dist/domain/processTraceComparison.js +0 -8
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +3 -3
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +36 -38
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +1 -5
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +41 -41
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +9 -85
- package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
- package/dist/domain/sourceToBundleSignals.js +4 -15
- package/dist/domain/staticRuntimeCorrelation.js +37 -49
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +33 -73
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +4 -12
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +65 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +16 -85
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +15 -22
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +2 -2
- package/dist/hopper/BridgeLauncher.js +112 -36
- package/dist/hopper/HopperAnalysisProfile.js +1 -1
- package/dist/hopper/HopperCleanup.js +6 -3
- package/dist/hopper/HopperClient.js +4 -7
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -16
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +0 -3
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -9
- package/dist/main/transport.js +0 -5
- package/dist/mcpDoctor.js +25 -45
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/ProcessOwnership.js +3 -2
- package/dist/process/ProcessOwnershipObservation.js +0 -1
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +3 -5
- package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +1 -3
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +0 -2
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +6 -44
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +4 -8
- package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
- package/dist/server/registerApplicationTools/compareVersions.js +5 -10
- package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
- package/dist/server/registerApplicationTools/coverage.js +6 -71
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
- package/dist/server/registerApplicationTools/traceFeature.js +5 -9
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +23 -27
- package/dist/server/registerBrowserScenarioTool.js +4 -4
- package/dist/server/registerBrowserTools.js +5 -8
- package/dist/server/registerBundleComparisonTool.js +5 -7
- package/dist/server/registerCloseLifecycleTool.js +2 -16
- package/dist/server/registerElectronTools.js +10 -29
- package/dist/server/registerEnhancedTools.js +10 -11
- package/dist/server/registerEvidenceTools.js +15 -22
- package/dist/server/registerFunctionComparisonTool.js +30 -25
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +20 -116
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
- package/dist/server/registerOfficialTools.js +1 -43
- package/dist/server/registerProcessComparisonTool.js +33 -23
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerSessionRecordTools.js +10 -156
- package/dist/server/registerSessionStatusTool.js +6 -69
- package/dist/server/registerSessionTools.js +10 -51
- package/dist/server/sessionAvailabilityPolicy.js +0 -2
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +0 -8
- package/dist/server/toolResult.js +14 -50
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +11 -7
- package/scripts/electron-active-hook.cjs +23 -55
- package/scripts/hopper-demo-x11.py +13 -32
- package/skills/reverse-engineer-anything/SKILL.md +47 -12
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -129
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -347
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -29
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -50
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
|
@@ -2,40 +2,18 @@ import { readFile, realpath, stat } from "node:fs/promises";
|
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
3
|
import ignore from "ignore";
|
|
4
4
|
import { err, ok } from "../domain/result.js";
|
|
5
|
-
import {
|
|
6
|
-
import { DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS, DEFAULT_REFERENCE_SOURCE_LIMITS, } from "./ReferenceSourceImportTypes.js";
|
|
7
|
-
import { canonicalizeConfiguredRoots } from "./ConfiguredRoots.js";
|
|
5
|
+
import { DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS, } from "./ReferenceSourceImportTypes.js";
|
|
8
6
|
const failure = (code, message) => ({
|
|
9
7
|
tag: "reference-source-import",
|
|
10
8
|
code,
|
|
11
9
|
message,
|
|
12
10
|
});
|
|
13
|
-
const
|
|
14
|
-
const maximumLimits = (options) => ({
|
|
15
|
-
maxBytes: options.policy.maxBytes,
|
|
16
|
-
maxEntries: options.policy.maxEntries,
|
|
17
|
-
maxDepth: options.policy.maxDepth,
|
|
18
|
-
maxPathBytes: options.policy.maxPathBytes,
|
|
19
|
-
});
|
|
20
|
-
const clampLimits = (requested, maximum) => ({
|
|
21
|
-
maxBytes: Math.min(requested.maxBytes, maximum.maxBytes),
|
|
22
|
-
maxEntries: Math.min(requested.maxEntries, maximum.maxEntries),
|
|
23
|
-
maxDepth: Math.min(requested.maxDepth, maximum.maxDepth),
|
|
24
|
-
maxPathBytes: Math.min(requested.maxPathBytes, maximum.maxPathBytes),
|
|
25
|
-
});
|
|
26
|
-
const authorizeRoot = async (requestedRoot, approvedRoots) => {
|
|
27
|
-
if (approvedRoots.length === 0)
|
|
28
|
-
return err(failure("policy", "No approved reference source roots"));
|
|
11
|
+
const resolveRoot = async (requestedRoot) => {
|
|
29
12
|
try {
|
|
30
13
|
if (!(await stat(requestedRoot)).isDirectory())
|
|
31
14
|
return err(failure("invalid-root", "Reference source root is not a directory"));
|
|
32
15
|
const canonicalRoot = await realpath(resolve(requestedRoot));
|
|
33
|
-
|
|
34
|
-
for (const canonicalApproved of canonicalApprovedRoots) {
|
|
35
|
-
if (withinRoot(canonicalApproved, canonicalRoot))
|
|
36
|
-
return ok(canonicalRoot);
|
|
37
|
-
}
|
|
38
|
-
return err(failure("policy", "Reference source root is outside approved roots"));
|
|
16
|
+
return ok(canonicalRoot);
|
|
39
17
|
}
|
|
40
18
|
catch {
|
|
41
19
|
return err(failure("invalid-root", "Reference source root could not be resolved"));
|
|
@@ -56,18 +34,13 @@ const buildIgnored = async (root, excludePaths) => {
|
|
|
56
34
|
}
|
|
57
35
|
return ignored;
|
|
58
36
|
};
|
|
59
|
-
/**
|
|
37
|
+
/** Resolve the caller-selected directory and build path filters. */
|
|
60
38
|
export const prepareReferenceSourceImport = async (options) => {
|
|
61
|
-
const
|
|
62
|
-
const maximum = maximumLimits(options);
|
|
63
|
-
if (!validLimits(requested) || !validLimits(maximum))
|
|
64
|
-
return err(failure("invalid-limits", "Import limits must be positive integers"));
|
|
65
|
-
const root = await authorizeRoot(options.root, options.policy.roots);
|
|
39
|
+
const root = await resolveRoot(options.root);
|
|
66
40
|
if (!root.ok)
|
|
67
41
|
return root;
|
|
68
42
|
return ok({
|
|
69
43
|
root: root.value,
|
|
70
|
-
limits: clampLimits(requested, maximum),
|
|
71
44
|
ignored: await buildIgnored(root.value, options.excludePaths ?? []),
|
|
72
45
|
secrets: ignore().add([...options.policy.secretPatterns]),
|
|
73
46
|
});
|
|
@@ -5,21 +5,11 @@ export const projectReferenceSourceImportError = (error) => {
|
|
|
5
5
|
category: "cancelled",
|
|
6
6
|
message: "Reference source import was cancelled. Start it again when ready.",
|
|
7
7
|
};
|
|
8
|
-
if (error.code === "invalid-limits")
|
|
9
|
-
return {
|
|
10
|
-
category: "invalid_input",
|
|
11
|
-
message: "Reference source limits are invalid. Use positive integer limits, then try again.",
|
|
12
|
-
};
|
|
13
8
|
if (error.code === "invalid-root")
|
|
14
9
|
return {
|
|
15
10
|
category: "invalid_input",
|
|
16
11
|
message: "Reference source directory could not be opened. Check that the path exists, is readable, and points to a directory.",
|
|
17
12
|
};
|
|
18
|
-
if (error.code === "policy")
|
|
19
|
-
return {
|
|
20
|
-
category: "permission_required",
|
|
21
|
-
message: "Reference source directory is not approved. Add its directory to `REA_REFERENCE_ROOTS_JSON`, restart REA, then try again.",
|
|
22
|
-
};
|
|
23
13
|
if (error.code === "io")
|
|
24
14
|
return {
|
|
25
15
|
category: "execution_failure",
|
|
@@ -41,10 +31,4 @@ export const DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS = [
|
|
|
41
31
|
".coverage",
|
|
42
32
|
"*.log",
|
|
43
33
|
];
|
|
44
|
-
export const DEFAULT_REFERENCE_SOURCE_LIMITS = {
|
|
45
|
-
maxBytes: 16 * 1024 * 1024,
|
|
46
|
-
maxEntries: 10_000,
|
|
47
|
-
maxDepth: 32,
|
|
48
|
-
maxPathBytes: 4_096,
|
|
49
|
-
};
|
|
50
34
|
export const PARSEABLE_REFERENCE_SOURCE_LANGUAGES = new Set(["JavaScript", "TypeScript", "JSX", "TSX"]);
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
2
|
import { constants } from "node:fs";
|
|
3
3
|
import { access, realpath } from "node:fs/promises";
|
|
4
4
|
import { delimiter, join } from "node:path";
|
|
5
5
|
const TOOL_NAMES = ["node", "npm", "npx"];
|
|
6
|
-
const MAX_CANDIDATES_PER_TOOL = 16;
|
|
7
|
-
const MAX_OUTPUT_BYTES = 65_536;
|
|
8
|
-
const MAX_DIAGNOSTIC_BYTES = 4_096;
|
|
9
6
|
const PROBE_CONCURRENCY = 4;
|
|
10
|
-
/** Inventory and
|
|
7
|
+
/** Inventory and probe Node toolchain candidates under one exact PATH. */
|
|
11
8
|
export const inspectRuntimeExecutables = async (options) => {
|
|
12
9
|
const pathEntries = unique(options.path.split(delimiter).filter(Boolean));
|
|
13
10
|
const candidates = [
|
|
@@ -37,7 +34,7 @@ export const inspectRuntimeExecutables = async (options) => {
|
|
|
37
34
|
seen.add(key);
|
|
38
35
|
uniqueCandidates.push(candidate);
|
|
39
36
|
}
|
|
40
|
-
const diagnostics = await mapConcurrentBounded(uniqueCandidates, PROBE_CONCURRENCY, (candidate) => probeCandidate(candidate, options.timeoutMs
|
|
37
|
+
const diagnostics = await mapConcurrentBounded(uniqueCandidates, PROBE_CONCURRENCY, (candidate) => probeCandidate(candidate, options.timeoutMs, options.path));
|
|
41
38
|
return {
|
|
42
39
|
launcher_node: await canonicalPath(options.launcherNode),
|
|
43
40
|
candidates: diagnostics,
|
|
@@ -56,47 +53,79 @@ const discoverToolCandidates = async (tool, pathEntries, platform, configuredExt
|
|
|
56
53
|
break;
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
|
-
if (candidates.length >= MAX_CANDIDATES_PER_TOOL)
|
|
60
|
-
break;
|
|
61
56
|
}
|
|
62
57
|
return candidates;
|
|
63
58
|
};
|
|
64
59
|
const probeCandidate = async (candidate, timeoutMs, effectivePath) => {
|
|
65
60
|
const canonical = await canonicalPath(candidate.path);
|
|
66
61
|
const result = await executeVersion(candidate.path, timeoutMs, effectivePath);
|
|
67
|
-
|
|
62
|
+
const identity = {
|
|
68
63
|
tool: candidate.tool,
|
|
69
64
|
lexical_path: candidate.path,
|
|
70
65
|
canonical_path: canonical,
|
|
71
66
|
path_index: candidate.pathIndex,
|
|
72
67
|
selection: candidate.selection,
|
|
73
|
-
version: result.ok ? result.version : null,
|
|
74
|
-
healthy: result.ok,
|
|
75
|
-
failure: result.ok ? null : result.failure,
|
|
76
68
|
};
|
|
69
|
+
return result.ok
|
|
70
|
+
? { ...identity, version: result.version, healthy: true, failure: null }
|
|
71
|
+
: {
|
|
72
|
+
...identity,
|
|
73
|
+
version: null,
|
|
74
|
+
healthy: false,
|
|
75
|
+
failure: result.failure,
|
|
76
|
+
};
|
|
77
77
|
};
|
|
78
78
|
const executeVersion = (path, timeoutMs, effectivePath) => new Promise((resolve) => {
|
|
79
|
-
const child =
|
|
80
|
-
encoding: "utf8",
|
|
81
|
-
timeout: timeoutMs,
|
|
82
|
-
maxBuffer: MAX_OUTPUT_BYTES,
|
|
79
|
+
const child = spawn(path, ["--version"], {
|
|
83
80
|
windowsHide: true,
|
|
84
81
|
env: environmentWithPath(effectivePath),
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
83
|
+
});
|
|
84
|
+
let stdout = "";
|
|
85
|
+
let stderr = "";
|
|
86
|
+
let spawnError;
|
|
87
|
+
let timeout;
|
|
88
|
+
let timedOut = false;
|
|
89
|
+
child.stdout?.setEncoding("utf8");
|
|
90
|
+
child.stderr?.setEncoding("utf8");
|
|
91
|
+
child.stdout?.on("data", (chunk) => {
|
|
92
|
+
stdout += chunk;
|
|
93
|
+
});
|
|
94
|
+
child.stderr?.on("data", (chunk) => {
|
|
95
|
+
stderr += chunk;
|
|
96
|
+
});
|
|
97
|
+
child.once("error", (cause) => {
|
|
98
|
+
spawnError = cause;
|
|
99
|
+
});
|
|
100
|
+
if (timeoutMs !== undefined && timeoutMs > 0) {
|
|
101
|
+
timeout = setTimeout(() => {
|
|
102
|
+
timedOut = true;
|
|
103
|
+
child.kill();
|
|
104
|
+
}, timeoutMs);
|
|
105
|
+
timeout.unref();
|
|
106
|
+
}
|
|
107
|
+
child.once("close", () => {
|
|
108
|
+
if (timeout !== undefined)
|
|
109
|
+
clearTimeout(timeout);
|
|
110
|
+
if (spawnError === undefined && child.exitCode === 0) {
|
|
87
111
|
const version = firstNonemptyLine(stdout) ?? firstNonemptyLine(stderr);
|
|
88
|
-
if (version !== undefined)
|
|
112
|
+
if (version !== undefined) {
|
|
89
113
|
resolve({ ok: true, version });
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
resolve({
|
|
117
|
+
ok: false,
|
|
118
|
+
failure: failure("runtime_invalid_version_output", child, stderr),
|
|
119
|
+
});
|
|
95
120
|
return;
|
|
96
121
|
}
|
|
122
|
+
const cause = spawnError ??
|
|
123
|
+
new Error("Runtime version probe did not exit successfully");
|
|
97
124
|
resolve({
|
|
98
125
|
ok: false,
|
|
99
|
-
failure:
|
|
126
|
+
failure: timedOut
|
|
127
|
+
? failure("runtime_timeout", child, stderr)
|
|
128
|
+
: classifyProbeFailure(cause, child, stderr),
|
|
100
129
|
});
|
|
101
130
|
});
|
|
102
131
|
});
|
|
@@ -117,7 +146,7 @@ const failure = (code, child, stderr, dependency = null) => ({
|
|
|
117
146
|
exit_code: child.exitCode,
|
|
118
147
|
signal: child.signalCode,
|
|
119
148
|
dependency,
|
|
120
|
-
stderr:
|
|
149
|
+
stderr: stderr.trim(),
|
|
121
150
|
});
|
|
122
151
|
const missingDynamicLibrary = (stderr) => /(?:dyld(?:\[[^\]]+\])?: )?Library not loaded:\s*([^\r\n]+)/u
|
|
123
152
|
.exec(stderr)?.[1]
|
|
@@ -143,9 +172,6 @@ const firstNonemptyLine = (value) => value
|
|
|
143
172
|
.split(/\r?\n/u)
|
|
144
173
|
.find((line) => line.trim().length > 0)
|
|
145
174
|
?.trim();
|
|
146
|
-
const bounded = (value) => value.length <= MAX_DIAGNOSTIC_BYTES
|
|
147
|
-
? value
|
|
148
|
-
: value.slice(-MAX_DIAGNOSTIC_BYTES);
|
|
149
175
|
const unique = (values) => [...new Set(values)];
|
|
150
176
|
const environmentWithPath = (path) => {
|
|
151
177
|
const environment = {};
|
|
@@ -11,8 +11,8 @@ export class SessionProviderRouter {
|
|
|
11
11
|
constructor(runtime) {
|
|
12
12
|
this.runtime = runtime;
|
|
13
13
|
}
|
|
14
|
-
/**
|
|
15
|
-
static
|
|
14
|
+
/** Create routing for an embedding backed by one fixed provider or factory. */
|
|
15
|
+
static single(provider, options = {}) {
|
|
16
16
|
const identity = typeof provider === "function"
|
|
17
17
|
? { id: "unidentified", name: "Unidentified provider", version: null }
|
|
18
18
|
: provider.identity();
|
|
@@ -13,8 +13,7 @@ import { discoverSetupActions } from "./SetupPlan.js";
|
|
|
13
13
|
import { clientConfigurationAligned, configureJsonClient, configureTomlClient, inspectClientConfiguration, } from "./SetupClientConfiguration.js";
|
|
14
14
|
export { configureJsonClient, configureTomlClient };
|
|
15
15
|
import { setupInstallFailure, } from "./SetupInstallFailure.js";
|
|
16
|
-
import { providerRegistrationEnvironment
|
|
17
|
-
export { registrationPermissionEnvironment } from "./SetupRegistrationEnvironment.js";
|
|
16
|
+
import { providerRegistrationEnvironment } from "./SetupRegistrationEnvironment.js";
|
|
18
17
|
export { canonicalSkillNeedsInstall, installCanonicalSkill };
|
|
19
18
|
const registrationCommand = () => process.env.npm_command === "exec"
|
|
20
19
|
? PRODUCT_IDENTITY.mcpCommand.split(" ")
|
|
@@ -254,7 +253,6 @@ export const systemSetupHost = (doctorHost = systemDoctorHost()) => {
|
|
|
254
253
|
const diagnosis = await runDoctor(undefined, doctorHost);
|
|
255
254
|
return {
|
|
256
255
|
...providerRegistrationEnvironment(diagnosis.providerInspections ?? []),
|
|
257
|
-
...registrationPermissionEnvironment(process.env),
|
|
258
256
|
...(diagnosis.hopperPath === undefined
|
|
259
257
|
? {}
|
|
260
258
|
: { HOPPER_LAUNCHER_PATH: diagnosis.hopperPath }),
|
|
@@ -1,10 +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 canonicalize from "canonicalize";
|
|
5
|
-
import { z } from "zod";
|
|
6
5
|
import writeFileAtomic from "write-file-atomic";
|
|
7
|
-
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
8
6
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
9
7
|
import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
|
|
10
8
|
import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
|
|
@@ -15,43 +13,43 @@ const defaultCommand = () => [
|
|
|
15
13
|
"mcp",
|
|
16
14
|
];
|
|
17
15
|
/** Back up, atomically update, and semantically read back one JSON MCP configuration. */
|
|
18
|
-
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) => {
|
|
19
20
|
const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
|
|
20
21
|
if (transactionPath === undefined)
|
|
21
22
|
return { status: "failed", reason: "path" };
|
|
22
|
-
let document = {};
|
|
23
23
|
let original;
|
|
24
24
|
try {
|
|
25
25
|
original = await readFile(transactionPath, "utf8");
|
|
26
|
-
document = parseObject(original);
|
|
27
26
|
}
|
|
28
27
|
catch (cause) {
|
|
29
28
|
if (!isMissing(cause))
|
|
30
29
|
return { status: "failed", reason: "readback" };
|
|
31
30
|
}
|
|
32
|
-
let
|
|
31
|
+
let parsed;
|
|
33
32
|
try {
|
|
34
|
-
|
|
33
|
+
parsed = parseClientConfiguration(original ?? (format === "toml" ? "" : "{}"), format);
|
|
35
34
|
}
|
|
36
35
|
catch {
|
|
37
36
|
return { status: "failed", reason: "readback" };
|
|
38
37
|
}
|
|
39
|
-
const
|
|
40
|
-
|
|
38
|
+
const { document, servers, serversKey } = parsed;
|
|
39
|
+
const desired = clientConfigurationDesired(client, environment, command);
|
|
40
|
+
if (clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
41
41
|
return { status: "unchanged" };
|
|
42
|
-
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
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] = {
|
|
49
47
|
...servers,
|
|
50
48
|
[PRODUCT_IDENTITY.mcpServerKey]: desired,
|
|
51
49
|
};
|
|
52
50
|
try {
|
|
53
51
|
await mkdir(dirname(client.configPath), { recursive: true });
|
|
54
|
-
await writeFileAtomic(transactionPath,
|
|
52
|
+
await writeFileAtomic(transactionPath, serializeClientConfiguration(document, format), {
|
|
55
53
|
encoding: "utf8",
|
|
56
54
|
mode: 0o600,
|
|
57
55
|
});
|
|
@@ -60,8 +58,8 @@ export const configureJsonClient = async (client, environment = {}, command = de
|
|
|
60
58
|
return { status: "failed", reason: "write" };
|
|
61
59
|
}
|
|
62
60
|
try {
|
|
63
|
-
const readback =
|
|
64
|
-
if (!
|
|
61
|
+
const readback = parseClientConfiguration(await readFile(transactionPath, "utf8"), format);
|
|
62
|
+
if (!clientConfigurationValuesEqual(readback.servers[PRODUCT_IDENTITY.mcpServerKey], desired)) {
|
|
65
63
|
await restoreConfig(transactionPath, original);
|
|
66
64
|
return { status: "failed", reason: "readback" };
|
|
67
65
|
}
|
|
@@ -75,68 +73,13 @@ export const configureJsonClient = async (client, environment = {}, command = de
|
|
|
75
73
|
...(backupPath === undefined ? {} : { backupPath }),
|
|
76
74
|
};
|
|
77
75
|
};
|
|
78
|
-
/** Back up, atomically update, and semantically read back Codex TOML configuration. */
|
|
79
|
-
export const configureTomlClient = async (client, environment = {}, command = defaultCommand()) => {
|
|
80
|
-
const transactionPath = await resolveClientConfigTransactionPath(client.configPath);
|
|
81
|
-
if (transactionPath === undefined)
|
|
82
|
-
return { status: "failed", reason: "path" };
|
|
83
|
-
let document = {};
|
|
84
|
-
let original;
|
|
85
|
-
try {
|
|
86
|
-
original = await readFile(transactionPath, "utf8");
|
|
87
|
-
document = objectSchema.parse(parseToml(original));
|
|
88
|
-
}
|
|
89
|
-
catch (cause) {
|
|
90
|
-
if (!isMissing(cause))
|
|
91
|
-
return { status: "failed", reason: "readback" };
|
|
92
|
-
}
|
|
93
|
-
let servers;
|
|
94
|
-
try {
|
|
95
|
-
servers = parseOptionalObject(document.mcp_servers);
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return { status: "failed", reason: "readback" };
|
|
99
|
-
}
|
|
100
|
-
const desired = clientConfigurationDesired(client, normalizeProviderEnvironment(environment), command);
|
|
101
|
-
if (sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
102
|
-
return { status: "unchanged" };
|
|
103
|
-
const backupPath = original === undefined ? undefined : `${client.configPath}.rea.backup`;
|
|
104
|
-
if (backupPath !== undefined &&
|
|
105
|
-
!(await preserveConfigBackup(transactionPath, backupPath)))
|
|
106
|
-
return { status: "failed", reason: "backup" };
|
|
107
|
-
document.mcp_servers = {
|
|
108
|
-
...servers,
|
|
109
|
-
[PRODUCT_IDENTITY.mcpServerKey]: desired,
|
|
110
|
-
};
|
|
111
|
-
try {
|
|
112
|
-
await mkdir(dirname(client.configPath), { recursive: true });
|
|
113
|
-
await writeFileAtomic(transactionPath, stringifyToml(document), {
|
|
114
|
-
encoding: "utf8",
|
|
115
|
-
mode: 0o600,
|
|
116
|
-
});
|
|
117
|
-
const readback = objectSchema.parse(parseToml(await readFile(transactionPath, "utf8")));
|
|
118
|
-
if (!sameConfiguration(parseOptionalObject(readback.mcp_servers)[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
119
|
-
throw new Error("TOML readback mismatch");
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
await restoreConfig(transactionPath, original);
|
|
123
|
-
return { status: "failed", reason: "readback" };
|
|
124
|
-
}
|
|
125
|
-
return {
|
|
126
|
-
status: "configured",
|
|
127
|
-
...(backupPath === undefined ? {} : { backupPath }),
|
|
128
|
-
};
|
|
129
|
-
};
|
|
130
76
|
/** Determine whether an existing client configuration matches the desired registration. */
|
|
131
77
|
export const clientConfigurationAligned = async (client, providerEnvironment, command) => {
|
|
132
78
|
const desired = clientConfigurationDesired(client, providerEnvironment, command);
|
|
133
79
|
try {
|
|
134
80
|
const original = await readFile(client.configPath, "utf8");
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
: parseObject(original);
|
|
138
|
-
const servers = parseOptionalObject(client.format === "toml" ? document.mcp_servers : document.mcpServers);
|
|
139
|
-
return sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired);
|
|
81
|
+
const { servers } = parseClientConfiguration(original, client.format);
|
|
82
|
+
return clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired);
|
|
140
83
|
}
|
|
141
84
|
catch {
|
|
142
85
|
return false;
|
|
@@ -166,11 +109,8 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
|
|
|
166
109
|
}
|
|
167
110
|
const desired = clientConfigurationDesired(client, providerEnvironment, command);
|
|
168
111
|
try {
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
: parseObject(original);
|
|
172
|
-
const servers = parseOptionalObject(client.format === "toml" ? document.mcp_servers : document.mcpServers);
|
|
173
|
-
if (sameConfiguration(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
112
|
+
const { servers } = parseClientConfiguration(original, client.format);
|
|
113
|
+
if (clientConfigurationValuesEqual(servers[PRODUCT_IDENTITY.mcpServerKey], desired))
|
|
174
114
|
return { status: "already_current" };
|
|
175
115
|
}
|
|
176
116
|
catch {
|
|
@@ -184,15 +124,7 @@ export const inspectClientConfiguration = async (client, providerEnvironment, co
|
|
|
184
124
|
backupPath: `${client.configPath}.rea.backup`,
|
|
185
125
|
};
|
|
186
126
|
};
|
|
187
|
-
const objectSchema = z.record(z.string(), z.unknown());
|
|
188
|
-
const parseOptionalObject = (value) => value === undefined ? {} : objectSchema.parse(value);
|
|
189
|
-
const parseObject = (text) => objectSchema.parse(JSON.parse(text));
|
|
190
127
|
const isMissing = (cause) => cause instanceof Error && "code" in cause && cause.code === "ENOENT";
|
|
191
|
-
const sameConfiguration = (left, right) => {
|
|
192
|
-
const encodedLeft = canonicalize(left);
|
|
193
|
-
const encodedRight = canonicalize(right);
|
|
194
|
-
return encodedLeft !== undefined && encodedLeft === encodedRight;
|
|
195
|
-
};
|
|
196
128
|
const preserveConfigBackup = async (source, destination) => {
|
|
197
129
|
try {
|
|
198
130
|
await copyFile(source, destination, fsConstants.COPYFILE_EXCL);
|
|
@@ -226,6 +158,3 @@ const clientConfigurationDesired = (client, providerEnvironment, command) => {
|
|
|
226
158
|
...(Object.keys(environment).length === 0 ? {} : { env: environment }),
|
|
227
159
|
};
|
|
228
160
|
};
|
|
229
|
-
const normalizeProviderEnvironment = (environment) => typeof environment === "string"
|
|
230
|
-
? { HOPPER_LAUNCHER_PATH: environment }
|
|
231
|
-
: 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();
|