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
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { access,
|
|
3
|
+
import { access, lstat, realpath, stat, } from "node:fs/promises";
|
|
4
4
|
import { extname, isAbsolute, resolve } from "node:path";
|
|
5
5
|
import { BinaryTargetError } from "../domain/configurationErrors.js";
|
|
6
|
+
import { openRegularFile, sameRegularFileState, } from "../filesystem/RegularFile.js";
|
|
7
|
+
import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
|
|
6
8
|
import { err, ok } from "../domain/result.js";
|
|
9
|
+
import { readMipsElfAbiFlags } from "./MipsElfAbiFlags.js";
|
|
7
10
|
import { resolveAppBundleExecutable, } from "./AppBundleExecutable.js";
|
|
8
11
|
import { validateDosComLength, } from "../domain/dosCom.js";
|
|
9
12
|
import { mzWindowsHeaderOffset } from "../domain/dosMz.js";
|
|
@@ -14,30 +17,41 @@ import { parseExecutableHeader, parsePeRecord, } from "../domain/binaryTarget.js
|
|
|
14
17
|
* FAT Mach-O inputs select only a host-compatible architecture so setup remains
|
|
15
18
|
* non-interactive; unsupported or ambiguous inputs are returned as typed errors.
|
|
16
19
|
*/
|
|
17
|
-
export const parseBinaryTarget = async (input,
|
|
20
|
+
export const parseBinaryTarget = async (input, options = {}) => {
|
|
21
|
+
const cwd = options.cwd ?? process.cwd();
|
|
22
|
+
const hostArchitecture = options.hostArchitecture ?? process.arch;
|
|
23
|
+
const { targetKind, formatHint, signal } = options;
|
|
18
24
|
const candidate = isAbsolute(input) ? input : resolve(cwd, input);
|
|
19
25
|
try {
|
|
26
|
+
throwIfTargetResolutionCancelled(signal);
|
|
20
27
|
await access(candidate, constants.R_OK);
|
|
28
|
+
throwIfTargetResolutionCancelled(signal);
|
|
21
29
|
const canonical = await realpath(candidate);
|
|
30
|
+
throwIfTargetResolutionCancelled(signal);
|
|
22
31
|
const resolved = await resolveAppBundle(canonical);
|
|
32
|
+
throwIfTargetResolutionCancelled(signal);
|
|
23
33
|
if (!resolved.ok)
|
|
24
34
|
return err(resolved.error);
|
|
25
35
|
const { executable: path, infoPlist } = resolved.value;
|
|
26
36
|
const bundle = infoPlist === undefined ? {} : { bundleInfoPlist: infoPlist };
|
|
27
|
-
const handle = await
|
|
37
|
+
const handle = await openRegularFile(path, {
|
|
38
|
+
symlinks: "reject",
|
|
39
|
+
signal,
|
|
40
|
+
});
|
|
28
41
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
42
|
+
throwIfTargetResolutionCancelled(signal);
|
|
43
|
+
const metadata = await handle.stat();
|
|
44
|
+
throwIfTargetResolutionCancelled(signal);
|
|
31
45
|
if (formatHint === "dos-com") {
|
|
32
46
|
if (targetKind !== undefined && targetKind !== "executable")
|
|
33
47
|
return err(new BinaryTargetError(path, "DOS COM format requires an executable target kind"));
|
|
34
|
-
const length = validateDosComLength(
|
|
48
|
+
const length = validateDosComLength(metadata.size);
|
|
35
49
|
if (!length.ok)
|
|
36
50
|
return err(new BinaryTargetError(path, length.error));
|
|
37
51
|
return ok({
|
|
38
52
|
path,
|
|
39
53
|
sourcePath: canonical,
|
|
40
|
-
sha256: await sha256Handle(handle),
|
|
54
|
+
sha256: await sha256Handle(handle, path, metadata, signal),
|
|
41
55
|
kind: "executable",
|
|
42
56
|
format: "dos-com",
|
|
43
57
|
architecture: "x86",
|
|
@@ -49,29 +63,29 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
|
|
|
49
63
|
return ok({
|
|
50
64
|
path,
|
|
51
65
|
sourcePath: process.platform === "win32" ? candidate : canonical,
|
|
52
|
-
sha256: await sha256Handle(handle),
|
|
66
|
+
sha256: await sha256Handle(handle, path, metadata, signal),
|
|
53
67
|
kind: "database",
|
|
54
68
|
format: "analysis-database",
|
|
55
69
|
});
|
|
56
|
-
const artifactFormat = await detectArtifactFormat(path, handle);
|
|
70
|
+
const artifactFormat = await detectArtifactFormat(path, handle, signal);
|
|
57
71
|
if (artifactFormat !== undefined) {
|
|
58
72
|
const identity = {
|
|
59
73
|
path,
|
|
60
74
|
sourcePath: process.platform === "win32" ? candidate : canonical,
|
|
61
|
-
sha256: await sha256Handle(handle),
|
|
75
|
+
sha256: await sha256Handle(handle, path, metadata, signal),
|
|
62
76
|
};
|
|
63
77
|
return isArchiveFormat(artifactFormat)
|
|
64
78
|
? ok({ ...identity, kind: "archive", format: artifactFormat })
|
|
65
79
|
: ok({ ...identity, kind: "artifact", format: artifactFormat });
|
|
66
80
|
}
|
|
67
|
-
const detected = await readExecutableMetadata(handle, hostArchitecture);
|
|
81
|
+
const detected = await readExecutableMetadata(handle, hostArchitecture, signal);
|
|
68
82
|
if (!detected.ok)
|
|
69
83
|
return err(new BinaryTargetError(path, detected.error));
|
|
70
84
|
return ok({
|
|
71
85
|
path,
|
|
72
86
|
sourcePath: process.platform === "win32" ? candidate : canonical,
|
|
73
87
|
...bundle,
|
|
74
|
-
sha256: await sha256Handle(handle),
|
|
88
|
+
sha256: await sha256Handle(handle, path, metadata, signal),
|
|
75
89
|
kind: "executable",
|
|
76
90
|
...detected.value,
|
|
77
91
|
});
|
|
@@ -81,6 +95,10 @@ export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitec
|
|
|
81
95
|
}
|
|
82
96
|
}
|
|
83
97
|
catch (cause) {
|
|
98
|
+
if (cause instanceof AnalysisCancelledError)
|
|
99
|
+
return err(cause);
|
|
100
|
+
if (cause instanceof BinaryTargetError)
|
|
101
|
+
return err(cause);
|
|
84
102
|
if (!(cause instanceof Error))
|
|
85
103
|
throw cause;
|
|
86
104
|
const code = filesystemErrorCode(cause);
|
|
@@ -103,14 +121,24 @@ const targetFailureReason = (code, detail) => {
|
|
|
103
121
|
return `permission denied while reading target: ${detail}`;
|
|
104
122
|
case "EISDIR":
|
|
105
123
|
return `target is a directory, not a readable file: ${detail}`;
|
|
124
|
+
case "ENOTFILE":
|
|
125
|
+
return "target is not a regular file";
|
|
126
|
+
case "ELOOP":
|
|
127
|
+
return `target changed while being opened: ${detail}`;
|
|
106
128
|
default:
|
|
107
129
|
return `target could not be read (${code}): ${detail}`;
|
|
108
130
|
}
|
|
109
131
|
};
|
|
110
|
-
const
|
|
132
|
+
const throwIfTargetResolutionCancelled = (signal) => {
|
|
133
|
+
if (signal?.aborted === true)
|
|
134
|
+
throw new AnalysisCancelledError("resolve_binary_target");
|
|
135
|
+
};
|
|
136
|
+
const detectArtifactFormat = async (path, handle, signal) => {
|
|
137
|
+
throwIfTargetResolutionCancelled(signal);
|
|
111
138
|
const lower = path.toLowerCase();
|
|
112
139
|
const magic = Buffer.alloc(8);
|
|
113
140
|
const observed = await handle.read(magic, 0, magic.length, 0);
|
|
141
|
+
throwIfTargetResolutionCancelled(signal);
|
|
114
142
|
if (hasZipSignature(magic.subarray(0, observed.bytesRead))) {
|
|
115
143
|
return zipPackageFormatForPath(lower) ?? "zip";
|
|
116
144
|
}
|
|
@@ -122,10 +150,13 @@ const detectArtifactFormat = async (path, handle) => {
|
|
|
122
150
|
magic.subarray(0, 4).toString("ascii") === "xar!")
|
|
123
151
|
return "pkg";
|
|
124
152
|
if (lower.endsWith(".dmg")) {
|
|
153
|
+
throwIfTargetResolutionCancelled(signal);
|
|
125
154
|
const size = (await handle.stat()).size;
|
|
155
|
+
throwIfTargetResolutionCancelled(signal);
|
|
126
156
|
if (size >= 512) {
|
|
127
157
|
const trailer = Buffer.alloc(4);
|
|
128
158
|
const read = await handle.read(trailer, 0, trailer.length, size - 512);
|
|
159
|
+
throwIfTargetResolutionCancelled(signal);
|
|
129
160
|
if (read.bytesRead === 4 && trailer.toString("ascii") === "koly")
|
|
130
161
|
return "dmg";
|
|
131
162
|
}
|
|
@@ -142,17 +173,27 @@ const namedArtifactFormat = (lowerPath) => {
|
|
|
142
173
|
return /\.(?:m?js|cjs)$/u.test(lowerPath) ? "javascript" : undefined;
|
|
143
174
|
};
|
|
144
175
|
const isArchiveFormat = (format) => ["zip", "ipa", "apk", "msix", "appx", "asar", "dmg", "pkg"].includes(format);
|
|
145
|
-
const sha256Handle = async (handle) => {
|
|
176
|
+
const sha256Handle = async (handle, path, initial, signal) => {
|
|
146
177
|
const hash = createHash("sha256");
|
|
147
178
|
const chunk = Buffer.allocUnsafe(64 * 1024);
|
|
148
179
|
let position = 0;
|
|
149
180
|
while (true) {
|
|
150
|
-
|
|
181
|
+
throwIfTargetResolutionCancelled(signal);
|
|
182
|
+
const observed = await handle.read(chunk, 0, Math.min(chunk.length, initial.size - position + 1), position);
|
|
183
|
+
throwIfTargetResolutionCancelled(signal);
|
|
151
184
|
if (observed.bytesRead === 0)
|
|
152
185
|
break;
|
|
153
186
|
hash.update(chunk.subarray(0, observed.bytesRead));
|
|
154
187
|
position += observed.bytesRead;
|
|
188
|
+
if (position > initial.size)
|
|
189
|
+
throw new BinaryTargetError(path, "target grew while being read");
|
|
155
190
|
}
|
|
191
|
+
throwIfTargetResolutionCancelled(signal);
|
|
192
|
+
const [opened, currentPath] = await Promise.all([handle.stat(), lstat(path)]);
|
|
193
|
+
if (!sameRegularFileState(initial, opened) ||
|
|
194
|
+
!sameRegularFileState(initial, currentPath) ||
|
|
195
|
+
position !== initial.size)
|
|
196
|
+
throw new BinaryTargetError(path, "target changed while being read");
|
|
156
197
|
return hash.digest("hex");
|
|
157
198
|
};
|
|
158
199
|
const resolveAppBundle = async (path) => {
|
|
@@ -165,19 +206,22 @@ const resolveAppBundle = async (path) => {
|
|
|
165
206
|
}));
|
|
166
207
|
return resolveAppBundleExecutable(path);
|
|
167
208
|
};
|
|
168
|
-
const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
209
|
+
const readExecutableMetadata = async (handle, hostArchitecture, signal) => {
|
|
210
|
+
throwIfTargetResolutionCancelled(signal);
|
|
169
211
|
const prefix = Buffer.alloc(4096);
|
|
170
212
|
const prefixRead = await handle.read(prefix, 0, prefix.length, 0);
|
|
213
|
+
throwIfTargetResolutionCancelled(signal);
|
|
171
214
|
const bytes = prefix.subarray(0, prefixRead.bytesRead);
|
|
172
215
|
// Header commitments such as Mach-O load commands and FAT slices are
|
|
173
216
|
// checked against the whole file, not the probed prefix.
|
|
174
217
|
const fileSize = (await handle.stat()).size;
|
|
218
|
+
throwIfTargetResolutionCancelled(signal);
|
|
175
219
|
if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a) {
|
|
176
220
|
const offset = mzWindowsHeaderOffset(bytes);
|
|
177
221
|
if (offset !== null) {
|
|
178
222
|
if (offset < 64)
|
|
179
223
|
return err("invalid Windows new-header offset in MZ image");
|
|
180
|
-
return readPeMetadata(handle, offset);
|
|
224
|
+
return readPeMetadata(handle, offset, signal);
|
|
181
225
|
}
|
|
182
226
|
// MZ relocation records may extend past the initial probe; their format
|
|
183
227
|
// bounds are at most 65535 records inside a 65535-paragraph header.
|
|
@@ -190,6 +234,7 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
|
190
234
|
tableEnd <= fileSize) {
|
|
191
235
|
const table = Buffer.alloc(tableEnd);
|
|
192
236
|
const observed = await handle.read(table, 0, table.length, 0);
|
|
237
|
+
throwIfTargetResolutionCancelled(signal);
|
|
193
238
|
return parseExecutableHeader(table.subarray(0, observed.bytesRead), hostArchitecture, fileSize);
|
|
194
239
|
}
|
|
195
240
|
return parseExecutableHeader(bytes, hostArchitecture, fileSize);
|
|
@@ -203,15 +248,35 @@ const readExecutableMetadata = async (handle, hostArchitecture) => {
|
|
|
203
248
|
if (count <= 128 && required > bytes.length) {
|
|
204
249
|
const header = Buffer.alloc(required);
|
|
205
250
|
const headerRead = await handle.read(header, 0, header.length, 0);
|
|
251
|
+
throwIfTargetResolutionCancelled(signal);
|
|
206
252
|
return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture, fileSize);
|
|
207
253
|
}
|
|
208
254
|
}
|
|
209
255
|
}
|
|
210
|
-
|
|
256
|
+
const parsed = parseExecutableHeader(bytes, hostArchitecture, fileSize);
|
|
257
|
+
if (!parsed.ok ||
|
|
258
|
+
parsed.value.architecture !== "mips" ||
|
|
259
|
+
parsed.value.mips.elfClass !== 32)
|
|
260
|
+
return parsed;
|
|
261
|
+
const abiFlags = await readMipsElfAbiFlags(handle, parsed.value.mips, () => throwIfTargetResolutionCancelled(signal));
|
|
262
|
+
if (!abiFlags.ok)
|
|
263
|
+
return abiFlags;
|
|
264
|
+
return ok({
|
|
265
|
+
...parsed.value,
|
|
266
|
+
mips: {
|
|
267
|
+
...parsed.value.mips,
|
|
268
|
+
abiFlags: abiFlags.value.abiFlags,
|
|
269
|
+
...(abiFlags.value.limitations.length === 0
|
|
270
|
+
? {}
|
|
271
|
+
: { limitations: abiFlags.value.limitations }),
|
|
272
|
+
},
|
|
273
|
+
});
|
|
211
274
|
};
|
|
212
|
-
const readPeMetadata = async (handle, offset) => {
|
|
275
|
+
const readPeMetadata = async (handle, offset, signal) => {
|
|
276
|
+
throwIfTargetResolutionCancelled(signal);
|
|
213
277
|
const fileHeader = Buffer.alloc(24);
|
|
214
278
|
const fileHeaderRead = await handle.read(fileHeader, 0, fileHeader.length, offset);
|
|
279
|
+
throwIfTargetResolutionCancelled(signal);
|
|
215
280
|
if (fileHeaderRead.bytesRead !== fileHeader.length)
|
|
216
281
|
return err("invalid or truncated PE header");
|
|
217
282
|
const signature = fileHeader.toString("ascii", 0, 2);
|
|
@@ -222,6 +287,7 @@ const readPeMetadata = async (handle, offset) => {
|
|
|
222
287
|
return err("invalid PE optional header size");
|
|
223
288
|
const record = Buffer.alloc(24 + optionalHeaderSize);
|
|
224
289
|
const recordRead = await handle.read(record, 0, record.length, offset);
|
|
290
|
+
throwIfTargetResolutionCancelled(signal);
|
|
225
291
|
return recordRead.bytesRead === record.length
|
|
226
292
|
? parsePeRecord(record)
|
|
227
293
|
: err("invalid or truncated PE header");
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { digestCanonicalValue } from "../domain/canonicalDigest.js";
|
|
2
2
|
import { createEvidence, } from "../domain/evidence.js";
|
|
3
3
|
import { jsonObjectSchema, jsonValueSchema } from "../domain/jsonValue.js";
|
|
4
4
|
const browserScenarioParameters = (scenario) => ({
|
|
5
5
|
...jsonObjectSchema.parse(scenario),
|
|
6
|
-
scenario_sha256:
|
|
6
|
+
scenario_sha256: digestCanonicalValue(scenario, "Browser scenario"),
|
|
7
7
|
});
|
|
8
8
|
/** Create Evidence without retaining resolved scenario secret values. */
|
|
9
9
|
export const createBrowserScenarioEvidence = (scenario, capture, provider) => createEvidence(undefined, provider, {
|
|
@@ -203,7 +203,7 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
|
|
|
203
203
|
? { reason: "available", remediation: null }
|
|
204
204
|
: {
|
|
205
205
|
reason: "provider_missing",
|
|
206
|
-
remediation: "On Linux x64, provide an absolute REA_WAKARU_COMMAND for Wakaru 1.13.0 and util-linux prlimit. No binary target is required.",
|
|
206
|
+
remediation: "On Linux x64, provide an absolute REA_WAKARU_COMMAND for Wakaru ^1.13.0 (verified with 1.14.0) and util-linux prlimit; see docs/javascript-recovery.md#install-wakaru. No binary target is required.",
|
|
207
207
|
};
|
|
208
208
|
if (name === "inspect_binary_layout")
|
|
209
209
|
return policy.binaryLayoutEnabled === true
|
|
@@ -212,6 +212,8 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
|
|
|
212
212
|
reason: "provider_missing",
|
|
213
213
|
remediation: "On Linux x64, set absolute REA_PWNTOOLS_PYTHON to caller-supplied Python with pwntools 4.15.0. No active binary target is required.",
|
|
214
214
|
};
|
|
215
|
+
if (name === "inspect_pe_resources")
|
|
216
|
+
return { reason: "available", remediation: null };
|
|
215
217
|
if (name === "inspect_evm_interface")
|
|
216
218
|
return policy.evmInterfaceEnabled === true
|
|
217
219
|
? { reason: "available", remediation: null }
|
|
@@ -247,6 +249,14 @@ const workflowAvailabilityFor = ({ name, kind, policy, }) => {
|
|
|
247
249
|
remediation: policy.androidAnalysisAvailability?.reason ??
|
|
248
250
|
"Set REA_JADX_MCP_JAR to a caller-supplied jadx-headless-mcp 0.7.1 JAR and provide a full JDK on Linux, macOS, or Windows x64 with its matching bundled native controls.",
|
|
249
251
|
};
|
|
252
|
+
if (kind === "jeb-provider")
|
|
253
|
+
return policy.jebAnalysisAvailability?.status === "available"
|
|
254
|
+
? { reason: "available", remediation: null }
|
|
255
|
+
: {
|
|
256
|
+
reason: "provider_missing",
|
|
257
|
+
remediation: policy.jebAnalysisAvailability?.reason ??
|
|
258
|
+
"Start a JEB client serving MCP (GUI client, or headless via its programmatic launcher) and point REA_JEB_MCP_URL at it (default http://127.0.0.1:8425/mcp). REA does not install or launch JEB.",
|
|
259
|
+
};
|
|
250
260
|
const browser = browserProviderAvailability(name, kind, policy);
|
|
251
261
|
if (browser !== null)
|
|
252
262
|
return browser;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
2
|
+
import { parse as parseYaml, parseDocument as parseYamlDocument, stringify as stringifyYaml, } from "yaml";
|
|
2
3
|
import { isDeepStrictEqual } from "node:util";
|
|
3
4
|
import { applyEdits, findNodeAtLocation, modify, parse as parseJsonc, parseTree, printParseErrorCode, } from "jsonc-parser";
|
|
4
5
|
import { z } from "zod";
|
|
@@ -20,6 +21,7 @@ export const clientConfigurationServersKey = (format) => {
|
|
|
20
21
|
switch (format) {
|
|
21
22
|
case "toml":
|
|
22
23
|
case "grok":
|
|
24
|
+
case "hermes":
|
|
23
25
|
return "mcp_servers";
|
|
24
26
|
case "opencode":
|
|
25
27
|
return "mcp";
|
|
@@ -37,6 +39,14 @@ const isEmptyClientConfigurationText = (text) => text.replace(/^\uFEFF/, "").tri
|
|
|
37
39
|
const parseDocument = (text, format) => {
|
|
38
40
|
if (format === "toml" || format === "grok")
|
|
39
41
|
return objectSchema.parse(parseToml(text));
|
|
42
|
+
// Pi loads `mcp.json` with a strict `JSON.parse` and no BOM tolerance, so
|
|
43
|
+
// comments, trailing commas, a BOM, or an empty existing file must be
|
|
44
|
+
// rejected instead of registering into a document Pi cannot load.
|
|
45
|
+
if (format === "pi")
|
|
46
|
+
return objectSchema.parse(JSON.parse(text));
|
|
47
|
+
// Hermes stores MCP servers in `mcp_servers` inside a YAML document.
|
|
48
|
+
if (format === "hermes")
|
|
49
|
+
return objectSchema.parse(parseYaml(text));
|
|
40
50
|
// An empty file, which some clients create before any server is added,
|
|
41
51
|
// holds no settings to preserve.
|
|
42
52
|
if (isEmptyClientConfigurationText(text))
|
|
@@ -858,6 +868,33 @@ const tomlServerEntry = (document, serverKey) => {
|
|
|
858
868
|
/** Whether Grok Build's root disable list names `serverKey`. */
|
|
859
869
|
export const grokServerListedDisabled = (document, serverKey) => Array.isArray(document.disabled_mcp_servers) &&
|
|
860
870
|
document.disabled_mcp_servers.includes(serverKey);
|
|
871
|
+
/**
|
|
872
|
+
* OMP's user `disabledServers` denylist hides a server by name regardless of
|
|
873
|
+
* its entry, so a listed REA registration is not loaded.
|
|
874
|
+
*/
|
|
875
|
+
export const OMP_DISABLED_SERVERS_KEY = "disabledServers";
|
|
876
|
+
/** Whether OMP's root `disabledServers` denylist names `serverKey`. */
|
|
877
|
+
export const ompServerListedDisabled = (document, serverKey) => {
|
|
878
|
+
const listed = document[OMP_DISABLED_SERVERS_KEY];
|
|
879
|
+
return Array.isArray(listed) && listed.includes(serverKey);
|
|
880
|
+
};
|
|
881
|
+
/** OMP's user `enabledServers` allowlist overrides an entry's `enabled: false`. */
|
|
882
|
+
const OMP_ENABLED_SERVERS_KEY = "enabledServers";
|
|
883
|
+
/**
|
|
884
|
+
* Whether OMP's allowlist forces `serverKey` on despite its entry's
|
|
885
|
+
* `enabled: false`. The `disabledServers` denylist still wins over it.
|
|
886
|
+
*/
|
|
887
|
+
export const clientServerForcedEnabled = (parsed, serverKey) => {
|
|
888
|
+
if (parsed.dialect !== "omp")
|
|
889
|
+
return false;
|
|
890
|
+
const listed = parsed.document[OMP_ENABLED_SERVERS_KEY];
|
|
891
|
+
return Array.isArray(listed) && listed.includes(serverKey);
|
|
892
|
+
};
|
|
893
|
+
/** Whether a client's own disable list suppresses `serverKey`. */
|
|
894
|
+
export const clientServerListedDisabled = (parsed, serverKey) => (parsed.dialect === "grok" &&
|
|
895
|
+
grokServerListedDisabled(parsed.document, serverKey)) ||
|
|
896
|
+
(parsed.dialect === "omp" &&
|
|
897
|
+
ompServerListedDisabled(parsed.document, serverKey));
|
|
861
898
|
/** Keep an existing Grok document intact aside from the REA server tables. */
|
|
862
899
|
const serializeGrokConfiguration = (document, originalText) => {
|
|
863
900
|
const entry = tomlServerEntry(document, PRODUCT_IDENTITY.mcpServerKey);
|
|
@@ -1004,6 +1041,8 @@ export const serializeClientConfiguration = (document, format, originalText, edi
|
|
|
1004
1041
|
return serializeCodexConfiguration(document, originalText);
|
|
1005
1042
|
if (format === "grok")
|
|
1006
1043
|
return serializeGrokConfiguration(document, originalText);
|
|
1044
|
+
if (format === "hermes")
|
|
1045
|
+
return serializeHermesConfiguration(document, originalText);
|
|
1007
1046
|
// An empty original holds no comments or settings to preserve. Writing a
|
|
1008
1047
|
// fresh document also keeps a lone BOM from shifting past the closing brace.
|
|
1009
1048
|
if (originalText !== undefined &&
|
|
@@ -1028,6 +1067,28 @@ export const clientServerPath = (parsed, name) => [...parsed.serversPath, name];
|
|
|
1028
1067
|
export const legacyClientServerPath = (parsed, name) => Object.hasOwn(parsed.legacyServers, name)
|
|
1029
1068
|
? [parsed.serversPath[0] ?? "mcp", name]
|
|
1030
1069
|
: undefined;
|
|
1070
|
+
/**
|
|
1071
|
+
* Keep an existing Hermes `config.yaml` intact aside from the REA server entry.
|
|
1072
|
+
* Hermes config files carry user comments and unrelated settings, so the rea
|
|
1073
|
+
* entry is upserted into the parsed YAML document (which retains formatting and
|
|
1074
|
+
* comments) rather than re-serializing the whole object.
|
|
1075
|
+
*/
|
|
1076
|
+
const serializeHermesConfiguration = (document, originalText) => {
|
|
1077
|
+
if (originalText === undefined ||
|
|
1078
|
+
isEmptyClientConfigurationText(originalText))
|
|
1079
|
+
return stringifyYaml(document);
|
|
1080
|
+
const serversKey = clientConfigurationServersKey("hermes");
|
|
1081
|
+
const servers = document[serversKey];
|
|
1082
|
+
const entry = typeof servers === "object" && servers !== null
|
|
1083
|
+
? servers[PRODUCT_IDENTITY.mcpServerKey]
|
|
1084
|
+
: undefined;
|
|
1085
|
+
const yamlDocument = parseYamlDocument(originalText);
|
|
1086
|
+
if (entry === undefined)
|
|
1087
|
+
yamlDocument.deleteIn([serversKey, PRODUCT_IDENTITY.mcpServerKey]);
|
|
1088
|
+
else
|
|
1089
|
+
yamlDocument.setIn([serversKey, PRODUCT_IDENTITY.mcpServerKey], entry);
|
|
1090
|
+
return yamlDocument.toString();
|
|
1091
|
+
};
|
|
1031
1092
|
/** Build the stdio entry shape expected by one client's configuration dialect. */
|
|
1032
1093
|
export const clientRegistrationEntry = (format, command, environment) => {
|
|
1033
1094
|
const [executable = "rea", ...args] = command;
|
|
@@ -1051,6 +1112,8 @@ export const clientRegistrationEntry = (format, command, environment) => {
|
|
|
1051
1112
|
: { environment: { ...environment } }),
|
|
1052
1113
|
};
|
|
1053
1114
|
case "vscode":
|
|
1115
|
+
case "omp":
|
|
1116
|
+
case "pi":
|
|
1054
1117
|
return {
|
|
1055
1118
|
type: "stdio",
|
|
1056
1119
|
command: executable,
|
|
@@ -1073,6 +1136,15 @@ export const clientRegistrationEntry = (format, command, environment) => {
|
|
|
1073
1136
|
args,
|
|
1074
1137
|
...(Object.keys(environment).length === 0 ? {} : { env: environment }),
|
|
1075
1138
|
};
|
|
1139
|
+
case "hermes":
|
|
1140
|
+
// Hermes reads stdio servers from `mcp_servers.<name>` and connects them
|
|
1141
|
+
// unless `enabled` is false, so the entry states it explicitly.
|
|
1142
|
+
return {
|
|
1143
|
+
command: executable,
|
|
1144
|
+
args,
|
|
1145
|
+
...(Object.keys(environment).length === 0 ? {} : { env: environment }),
|
|
1146
|
+
enabled: true,
|
|
1147
|
+
};
|
|
1076
1148
|
default:
|
|
1077
1149
|
return {
|
|
1078
1150
|
command: executable,
|
|
@@ -1081,3 +1153,29 @@ export const clientRegistrationEntry = (format, command, environment) => {
|
|
|
1081
1153
|
};
|
|
1082
1154
|
}
|
|
1083
1155
|
};
|
|
1156
|
+
/** Parse one Gemini policy at its source boundary before consolidating scopes. */
|
|
1157
|
+
export const parseGeminiMcpPolicy = (parsed) => z
|
|
1158
|
+
.object({
|
|
1159
|
+
allowed: z.array(z.string()).optional(),
|
|
1160
|
+
excluded: z.array(z.string()).optional(),
|
|
1161
|
+
})
|
|
1162
|
+
.passthrough()
|
|
1163
|
+
.parse(parsed.document.mcp ?? {});
|
|
1164
|
+
/** Gemini consolidates excludes by union and allowlists by normalized intersection. */
|
|
1165
|
+
export const geminiServerPolicyBlock = (policies, serverKey) => {
|
|
1166
|
+
if (policies.some(({ excluded }) => excluded?.includes(serverKey)))
|
|
1167
|
+
return `Gemini mcp.excluded blocks ${serverKey}. Review the selected settings policies before rerunning setup.`;
|
|
1168
|
+
const allowlists = policies.flatMap(({ allowed }) => allowed === undefined ? [] : [allowed]);
|
|
1169
|
+
const allowed = allowlists.reduce((previous, current) => {
|
|
1170
|
+
if (previous === undefined)
|
|
1171
|
+
return current;
|
|
1172
|
+
const normalized = new Set(current.map((name) => name.toLowerCase().trim()));
|
|
1173
|
+
return previous.filter((name) => normalized.has(name.toLowerCase().trim()));
|
|
1174
|
+
}, undefined);
|
|
1175
|
+
// Gemini's manager applies the consolidated allowlist only when nonempty.
|
|
1176
|
+
if (allowed !== undefined &&
|
|
1177
|
+
allowed.length > 0 &&
|
|
1178
|
+
!allowed.includes(serverKey))
|
|
1179
|
+
return `Gemini mcp.allowed does not include ${serverKey}. Review the selected settings policies before rerunning setup.`;
|
|
1180
|
+
return undefined;
|
|
1181
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { err, ok } from "../domain/result.js";
|
|
2
|
+
import { RegularFileCleanupFailure, readRegularFileText, } from "./RegularFileRead.js";
|
|
3
|
+
import { effectiveClientServer, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
|
|
4
|
+
import { clientRegistrationEnvironment } from "./ClientRegistrationEnvironment.js";
|
|
5
|
+
/** Preserve named read failures and distinguish a missing source from an empty file. */
|
|
6
|
+
export const readConfigurationText = async (path) => {
|
|
7
|
+
try {
|
|
8
|
+
return ok(await readRegularFileText(path));
|
|
9
|
+
}
|
|
10
|
+
catch (cause) {
|
|
11
|
+
if (cause instanceof Error && "code" in cause && cause.code === "ENOENT")
|
|
12
|
+
return ok(undefined);
|
|
13
|
+
return err({
|
|
14
|
+
kind: "unreadable",
|
|
15
|
+
path,
|
|
16
|
+
detail: `Configuration ${path} could not be read: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
17
|
+
...(cause instanceof RegularFileCleanupFailure
|
|
18
|
+
? { cleanupFailure: cause }
|
|
19
|
+
: {}),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
/** Read and parse one configuration at its source boundary. */
|
|
24
|
+
export const readConfigurationFile = async (path, format) => {
|
|
25
|
+
const source = await readConfigurationText(path);
|
|
26
|
+
if (!source.ok)
|
|
27
|
+
return source;
|
|
28
|
+
const content = source.value;
|
|
29
|
+
if (content === undefined)
|
|
30
|
+
return ok(undefined);
|
|
31
|
+
try {
|
|
32
|
+
return ok(parseClientConfiguration(content, format));
|
|
33
|
+
}
|
|
34
|
+
catch (cause) {
|
|
35
|
+
return err({
|
|
36
|
+
kind: "malformed",
|
|
37
|
+
path,
|
|
38
|
+
detail: `Configuration ${path} is malformed: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
/** Read every applicable user file; malformed lower-priority files also stop setup. */
|
|
43
|
+
export const readClientConfigurationFiles = async (client) => {
|
|
44
|
+
const documents = [];
|
|
45
|
+
for (const path of client.configPaths ?? [client.configPath]) {
|
|
46
|
+
const document = await readConfigurationFile(path, client.format);
|
|
47
|
+
if (!document.ok)
|
|
48
|
+
return document;
|
|
49
|
+
if (document.value !== undefined) {
|
|
50
|
+
const environment = clientRegistrationEnvironment(document.value);
|
|
51
|
+
if (!environment.ok)
|
|
52
|
+
return err({
|
|
53
|
+
kind: "malformed",
|
|
54
|
+
path,
|
|
55
|
+
detail: `Configuration ${path} has an invalid REA server environment: ${environment.error.settings.map(({ setting, constraint }) => `${setting}: ${constraint}`).join("; ")}. Repair it before rerunning setup.`,
|
|
56
|
+
});
|
|
57
|
+
documents.push(document.value);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return ok(documents);
|
|
61
|
+
};
|
|
62
|
+
/** OpenCode merges server objects in file order, replacing arrays and scalar values. */
|
|
63
|
+
const mergeConfigurationValue = (previous, next) => {
|
|
64
|
+
if (!isObject(previous) || !isObject(next))
|
|
65
|
+
return next;
|
|
66
|
+
return Object.fromEntries([...new Set([...Object.keys(previous), ...Object.keys(next)])].map((key) => [
|
|
67
|
+
key,
|
|
68
|
+
Object.hasOwn(next, key)
|
|
69
|
+
? mergeConfigurationValue(previous[key], next[key])
|
|
70
|
+
: previous[key],
|
|
71
|
+
]));
|
|
72
|
+
};
|
|
73
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
74
|
+
/** Project a client's effective user registration without modifying its source files. */
|
|
75
|
+
export const effectiveClientConfiguration = (documents) => {
|
|
76
|
+
const last = documents.at(-1);
|
|
77
|
+
if (last === undefined)
|
|
78
|
+
return undefined;
|
|
79
|
+
if (documents.length === 1)
|
|
80
|
+
return last;
|
|
81
|
+
const servers = {};
|
|
82
|
+
for (const document of documents) {
|
|
83
|
+
const names = new Set([
|
|
84
|
+
...Object.keys(document.legacyServers),
|
|
85
|
+
...Object.keys(document.servers),
|
|
86
|
+
]);
|
|
87
|
+
for (const name of names)
|
|
88
|
+
servers[name] = mergeConfigurationValue(servers[name], effectiveClientServer(document, name));
|
|
89
|
+
}
|
|
90
|
+
return { ...last, servers, legacyServers: {} };
|
|
91
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { parseEnvironment } from "../config/environment.js";
|
|
3
|
+
import { ConfigurationError } from "../domain/configurationErrors.js";
|
|
4
|
+
import { err, ok } from "../domain/result.js";
|
|
5
|
+
import { effectiveClientServer, } from "./ClientConfigurationDocument.js";
|
|
6
|
+
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
7
|
+
/** Read explicit REA overrides without dropping peers when one value is invalid. */
|
|
8
|
+
export const clientRegistrationEnvironment = (parsed, overrides = {}) => {
|
|
9
|
+
const key = parsed?.dialect === "opencode" || parsed?.dialect === "opencode_v2"
|
|
10
|
+
? "environment"
|
|
11
|
+
: "env";
|
|
12
|
+
const registration = parsed === undefined
|
|
13
|
+
? undefined
|
|
14
|
+
: effectiveClientServer(parsed, PRODUCT_IDENTITY.mcpServerKey);
|
|
15
|
+
const raw = typeof registration === "object" && registration !== null
|
|
16
|
+
? Reflect.get(registration, key)
|
|
17
|
+
: undefined;
|
|
18
|
+
const existing = z
|
|
19
|
+
.record(z.string(), z.string())
|
|
20
|
+
.safeParse(raw === undefined ? {} : raw);
|
|
21
|
+
if (!existing.success)
|
|
22
|
+
return err(new ConfigurationError("Invalid REA server environment", {
|
|
23
|
+
settings: existing.error.issues.map((issue) => ({
|
|
24
|
+
setting: [key, ...issue.path].join("."),
|
|
25
|
+
constraint: "Server environment must be an object containing only string values",
|
|
26
|
+
})),
|
|
27
|
+
}));
|
|
28
|
+
// Validate known settings with the runtime's parser, but retain the original
|
|
29
|
+
// string overrides, including unknown client-specific keys and no defaults.
|
|
30
|
+
const environment = { ...existing.data, ...overrides };
|
|
31
|
+
const validated = parseEnvironment(environment);
|
|
32
|
+
if (!validated.ok)
|
|
33
|
+
return validated;
|
|
34
|
+
return ok(Object.fromEntries(Object.entries(environment).sort(([left], [right]) => left.localeCompare(right))));
|
|
35
|
+
};
|