rea-agents 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -108
- package/bridge/ghidra/ReaGhidraBridge.java +609 -841
- package/bridge/hopper_bridge.py +99 -344
- package/dist/application/AbortablePromise.js +6 -3
- package/dist/application/AnalysisContextQueries.js +21 -9
- package/dist/application/AnalysisSnapshotCache.js +0 -1
- package/dist/application/AnalysisSnapshotFiles.js +7 -7
- package/dist/application/AndroidApplicationService.js +1 -1
- package/dist/application/AppleApplicationService.js +1 -1
- package/dist/application/ArtifactExtraction.js +35 -54
- package/dist/application/ArtifactExtractionDestination.js +17 -0
- package/dist/application/ArtifactGraphConstruction.js +2 -17
- package/dist/application/ArtifactInventory/classify.js +2 -6
- package/dist/application/ArtifactInventory/hash.js +2 -20
- package/dist/application/ArtifactInventory/policy.js +17 -0
- package/dist/application/ArtifactInventory/reader.js +1 -4
- package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
- package/dist/application/ArtifactInventory/scanReader.js +76 -58
- package/dist/application/ArtifactInventory/types.js +1 -5
- package/dist/application/ArtifactInventory.js +6 -14
- package/dist/application/AuthorizedArtifactInventory.js +3 -13
- package/dist/application/BinarySession.js +54 -28
- package/dist/application/BinarySessionComposition.js +0 -11
- package/dist/application/BinarySessionOpen.js +2 -1
- package/dist/application/BinarySessionRecords.js +24 -86
- package/dist/application/BinarySessionStatus.js +16 -21
- package/dist/application/BinaryTargetResolver.js +216 -0
- package/dist/application/BrowserEvidence.js +39 -57
- package/dist/application/BrowserObservationService.js +3 -6
- package/dist/application/BrowserScenarioCaptureService.js +3 -6
- package/dist/application/BrowserScenarioEvidence.js +3 -3
- package/dist/application/CallPathTracing.js +2 -36
- package/dist/application/CapabilityClientRequirements.js +26 -0
- package/dist/application/CapabilityInventory.js +143 -77
- package/dist/application/ClientConfigurationDocument.js +27 -0
- package/dist/application/ClientRegistrationStatus.js +16 -13
- package/dist/application/CommandShimReplay.js +14 -1
- package/dist/application/DirectAnalysis.js +22 -46
- package/dist/application/DirectAnalysisStatus.js +5 -61
- package/dist/application/Doctor.js +11 -32
- package/dist/application/DoctorDiagnostics.js +1 -2
- package/dist/application/DoctorScope.js +1 -1
- package/dist/application/ElectronActiveEvidence.js +50 -0
- package/dist/application/ElectronActiveObservationPort.js +1 -0
- package/dist/application/ElectronActiveObservationService.js +78 -0
- package/dist/application/ElectronBoundaryAnalysis.js +7 -8
- package/dist/application/ElectronBoundaryGraphContext.js +1 -1
- package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
- package/dist/application/ElectronBoundaryGraphNative.js +1 -2
- package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
- package/dist/application/ElectronEvidence.js +4 -7
- package/dist/application/ElectronObservationService.js +5 -9
- package/dist/application/EnhancedLiteralTracing.js +42 -65
- package/dist/application/EnhancedTools.js +98 -64
- package/dist/application/EvidenceBundleCommands.js +16 -12
- package/dist/application/EvidenceBundleFiles.js +9 -15
- package/dist/application/EvidenceLedger.js +14 -42
- package/dist/application/FilesystemSnapshot.js +2 -3
- package/dist/application/InterfaceBuilderAnalysis.js +266 -0
- package/dist/application/InventoryProjectionEvidence.js +4 -2
- package/dist/application/InvestigationProviders.js +1 -1
- package/dist/application/JavaScriptApplicationEvidence.js +2 -5
- package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
- package/dist/application/JavaScriptApplicationService.js +6 -29
- package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
- package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
- package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
- package/dist/application/JavaScriptArtifactFiles.js +67 -107
- package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
- package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
- package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
- package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
- package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
- package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
- package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
- package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
- package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
- package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
- package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
- package/dist/application/JavaScriptJsonModules.js +2 -2
- package/dist/application/JavaScriptModuleRelationships.js +22 -27
- package/dist/application/JavaScriptReplayPermission.js +1 -1
- package/dist/application/JavaScriptReplayPlanning.js +9 -3
- package/dist/application/JavaScriptReplayService.js +29 -47
- package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
- package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
- package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
- package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
- package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
- package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
- package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
- package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
- package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
- package/dist/application/JavaScriptSemanticTraceService.js +1 -10
- package/dist/application/JsonFiles.js +79 -0
- package/dist/application/LinuxHopper.js +11 -9
- package/dist/application/LoopbackReplay.js +26 -23
- package/dist/application/LoopbackReplayRecorder.js +29 -1
- package/dist/application/ManagedApplicationGraphService.js +1 -2
- package/dist/application/ManagedMemberComparisonService.js +11 -41
- package/dist/application/ManagedNativeVerificationService.js +1 -2
- package/dist/application/ManagedReconstructionService.js +1 -1
- package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
- package/dist/application/NativeApiInspection.js +2 -7
- package/dist/application/NativeUiActionTrace.js +394 -0
- package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
- package/dist/application/PermissionAuthority.js +15 -7
- package/dist/application/PermissionFailure.js +5 -0
- package/dist/application/ProcessCaptureAuthority.js +5 -7
- package/dist/application/ProcessCaptureJournal.js +3 -2
- package/dist/application/ProcessCaptureLifecycle.js +10 -12
- package/dist/application/ProcessCheckpoints.js +29 -11
- package/dist/application/ProcessCli.js +8 -17
- package/dist/application/ProcessEvidence.js +5 -7
- package/dist/application/ProcessHarness.js +60 -20
- package/dist/application/ProcessNormalization.js +2 -1
- package/dist/application/ProcessReactiveCoordinator.js +2 -4
- package/dist/application/ProcessReactiveEffects.js +9 -3
- package/dist/application/ProcessReactiveHarness.js +13 -7
- package/dist/application/ProcessSampling.js +2 -4
- package/dist/application/ProcessTimer.js +39 -0
- package/dist/application/ProjectPermissionStore.js +39 -95
- package/dist/application/RealHopperAssertions.js +20 -66
- package/dist/application/ReconstructionCoverageService.js +12 -58
- package/dist/application/ReconstructionObligationAuthority.js +2 -2
- package/dist/application/ReconstructionObligationCandidates.js +4 -4
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
- package/dist/application/ReconstructionObligationLedgerService.js +19 -38
- package/dist/application/ReferenceSourceImport.js +21 -47
- package/dist/application/ReferenceSourceImportEntries.js +2 -4
- package/dist/application/ReferenceSourceImportPolicy.js +5 -32
- package/dist/application/ReferenceSourceImportTypes.js +0 -16
- package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
- package/dist/application/SessionProviderRouter.js +2 -2
- package/dist/application/Setup.js +1 -3
- package/dist/application/SetupClientConfiguration.js +22 -88
- package/dist/application/SetupRegistrationEnvironment.js +0 -7
- package/dist/application/StoreFileLock.js +119 -0
- package/dist/application/TerminalRenderer.js +2 -3
- package/dist/application/Uninstall.js +9 -14
- package/dist/application/UnknownEvidence.js +1 -1
- package/dist/application/WindowsCapabilities.js +5 -4
- package/dist/artifacts/ArtifactPaths.js +2 -5
- package/dist/artifacts/ArtifactProvider.js +43 -67
- package/dist/artifacts/DirectoryArtifactReader.js +13 -8
- package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
- package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
- package/dist/artifacts/NibArchive.js +269 -0
- package/dist/artifacts/SafeOutputTree.js +21 -31
- package/dist/browser/BrowserProcessStartup.js +1 -2
- package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
- package/dist/browser/CdpBrowserProvider.js +3 -13
- package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
- package/dist/browser/CdpCaptureDocuments.js +28 -76
- package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
- package/dist/browser/CdpCaptureEventHandlers.js +22 -87
- package/dist/browser/CdpCaptureEvents.js +2 -8
- package/dist/browser/CdpCaptureStorage.js +9 -20
- package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
- package/dist/browser/CdpCaptureValues.js +21 -21
- package/dist/browser/CdpConnection.js +10 -25
- package/dist/browser/CdpElectronInspection.js +29 -51
- package/dist/browser/CdpElectronProvider.js +10 -35
- package/dist/browser/CdpElectronScriptEvents.js +8 -16
- package/dist/browser/CdpElectronScripts.js +6 -35
- package/dist/browser/CdpElectronWorkers.js +6 -10
- package/dist/browser/CdpEndpoint.js +25 -41
- package/dist/browser/CdpObservationSession.js +14 -26
- package/dist/browser/CdpPageCapture.js +34 -48
- package/dist/browser/CdpPageCaptureScripts.js +1 -19
- package/dist/browser/CdpPageCaptureWorkers.js +6 -10
- package/dist/browser/CdpSafeMetadata.js +19 -22
- package/dist/browser/CdpScreenshot.js +3 -5
- package/dist/browser/CdpTargetSession.js +1 -2
- package/dist/browser/CdpWebMcpDiscovery.js +13 -22
- package/dist/browser/ElectronFileScope.js +8 -19
- package/dist/browser/JavaScriptRuntimeScope.js +10 -10
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
- package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
- package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
- package/dist/browser/PlaywrightScenarioActions.js +3 -7
- package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
- package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
- package/dist/browser/PlaywrightScenarioEvents.js +45 -94
- package/dist/browser/PlaywrightScenarioSession.js +18 -34
- package/dist/browser/PngVisualDiff.js +22 -14
- package/dist/browser/SensitiveTextCapture.js +1 -18
- package/dist/browser/V8InspectorCaptureProjection.js +7 -7
- package/dist/browser/V8InspectorEndpoint.js +12 -14
- package/dist/browser/V8InspectorProvider.js +20 -61
- package/dist/browser/WebSourceMapFetcher.js +56 -176
- package/dist/catalogIdentity.js +12 -60
- package/dist/cli/artifactCommands.js +49 -77
- package/dist/cli/coreAnalysisCommands.js +83 -133
- package/dist/cli/javascriptApplicationAnalysis.js +1 -9
- package/dist/cli/managedCommands.js +6 -271
- package/dist/cli/setupCommands.js +3 -12
- package/dist/cli/utilityCommands.js +7 -41
- package/dist/cli.js +0 -2
- package/dist/cliApplicationCommands.js +44 -114
- package/dist/cliBrowserAdvancedCommands.js +12 -102
- package/dist/cliBrowserCommands.js +19 -124
- package/dist/cliBrowserContext.js +30 -0
- package/dist/cliCommandNames.js +5 -5
- package/dist/cliElectronCommands.js +49 -71
- package/dist/cliEvidenceCommands.js +8 -77
- package/dist/cliJavaScriptRuntimeCommands.js +18 -92
- package/dist/cliJsonInput.js +4 -14
- package/dist/cliObservationOptions.js +11 -92
- package/dist/cliPolicyCommands.js +2 -16
- package/dist/cliProcessCommands.js +3 -3
- package/dist/cliSetup.js +0 -13
- package/dist/config/browserScenario.js +77 -0
- package/dist/config/electronAutomation.js +35 -0
- package/dist/config/environment.js +6 -9
- package/dist/config/javascriptReplay.js +41 -0
- package/dist/config/managedRuntime.js +25 -0
- package/dist/config/parseConfig.js +56 -232
- package/dist/config/parsers.js +16 -28
- package/dist/config/passiveObservation.js +87 -0
- package/dist/config/permissions.js +0 -7
- package/dist/config/processCapture.js +47 -0
- package/dist/contracts/analysisSearchContract.js +2 -5
- package/dist/contracts/applicationToolContracts.js +58 -114
- package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
- package/dist/contracts/artifactComparisonExample.js +58 -60
- package/dist/contracts/artifactToolContracts.js +37 -91
- package/dist/contracts/browserScenarioToolContracts.js +6 -51
- package/dist/contracts/browserToolContracts.js +10 -75
- package/dist/contracts/electronToolContracts.js +27 -98
- package/dist/contracts/enhancedInputs.js +31 -78
- package/dist/contracts/errorSchemas.js +0 -1
- package/dist/contracts/functionComparisonExample.js +10 -24
- package/dist/contracts/functionInstructionContract.js +1 -3
- package/dist/contracts/functionWorkflowToolContracts.js +4 -5
- package/dist/contracts/hopperMemoryContracts.js +3 -3
- package/dist/contracts/investigationExamples.js +14 -11
- package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
- package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
- package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
- package/dist/contracts/managedToolContracts.js +10 -104
- package/dist/contracts/managedWorkflowExamples.js +77 -125
- package/dist/contracts/managedWorkflowToolContracts.js +51 -74
- package/dist/contracts/nativeToolContracts.js +9 -14
- package/dist/contracts/processCaptureExample.js +2 -69
- package/dist/contracts/promptContracts.js +49 -67
- package/dist/contracts/providerSelection.js +0 -1
- package/dist/contracts/reconstructionReadinessExample.js +1 -6
- package/dist/contracts/sessionStatusContract.js +1 -17
- package/dist/contracts/sessionToolSchemas.js +52 -0
- package/dist/contracts/toolContractExamples.js +11 -10
- package/dist/contracts/toolContractHelpers.js +19 -0
- package/dist/contracts/toolContracts.js +60 -143
- package/dist/contracts/toolEffects.js +16 -9
- package/dist/contracts/toolOutputSchemaGroups.js +47 -86
- package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
- package/dist/contracts/toolSchemaMetadata.js +117 -0
- package/dist/contracts/unknownContractExamples.js +0 -2
- package/dist/doctorRuntime.js +1 -1
- package/dist/domain/analysisErrorPresentation.js +46 -54
- package/dist/domain/analysisErrorProjection.js +28 -37
- package/dist/domain/analysisProfile.js +3 -31
- package/dist/domain/analysisSnapshot.js +3 -12
- package/dist/domain/androidApplication.js +15 -52
- package/dist/domain/appleApplication.js +24 -65
- package/dist/domain/artifactComparison.js +11 -29
- package/dist/domain/artifactGraph.js +14 -44
- package/dist/domain/artifactInspection.js +38 -69
- package/dist/domain/artifactInventoryEvidence.js +27 -21
- package/dist/domain/binaryTarget.js +2 -219
- package/dist/domain/binaryTargetTypes.js +1 -0
- package/dist/domain/browserCaptureComparison.js +35 -60
- package/dist/domain/browserObservation.js +45 -197
- package/dist/domain/browserObservationSchemas.js +5 -23
- package/dist/domain/browserScenario.js +11 -14
- package/dist/domain/browserScenarioCapture.js +11 -12
- package/dist/domain/browserScenarioCaptureValues.js +146 -84
- package/dist/domain/browserScenarioDiff.js +2 -59
- package/dist/domain/browserScenarioDiffEvidence.js +51 -0
- package/dist/domain/browserScenarioDiffValues.js +21 -38
- package/dist/domain/browserScenarioValues.js +80 -109
- package/dist/domain/browserSession.js +4 -7
- package/dist/domain/bundleComparison.js +6 -32
- package/dist/domain/bytecodeProvider.js +53 -54
- package/dist/domain/callPath.js +50 -169
- package/dist/domain/callPathSchemas.js +79 -0
- package/dist/domain/changedBehavior.js +34 -60
- package/dist/domain/completionLedgerGeneration.js +8 -14
- package/dist/domain/conformancePackage.js +126 -97
- package/dist/domain/conformanceReplay.js +39 -11
- package/dist/domain/conformanceTrustGate.js +174 -30
- package/dist/domain/customProtocolCapture.js +4 -4
- package/dist/domain/electronActiveObservation.js +244 -0
- package/dist/domain/electronObservation.js +21 -83
- package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
- package/dist/domain/electronStaticAnalysisIpc.js +38 -14
- package/dist/domain/electronStaticAnalysisNative.js +1 -8
- package/dist/domain/electronStaticAnalysisValues.js +14 -18
- package/dist/domain/errors.js +33 -54
- package/dist/domain/eventProcessTree.js +101 -90
- package/dist/domain/evidence.js +2 -10
- package/dist/domain/evidenceBundle.js +3 -5
- package/dist/domain/evidenceCompletionLedger.js +6 -8
- package/dist/domain/functionComparison.js +4 -14
- package/dist/domain/functionComparisonNormalization.js +8 -8
- package/dist/domain/functionComparisonResults.js +25 -15
- package/dist/domain/functionComparisonSchemas.js +49 -33
- package/dist/domain/functionDossierEvidence.js +31 -151
- package/dist/domain/hopperStartupFailure.js +1 -1
- package/dist/domain/hopperValues.js +17 -141
- package/dist/domain/inputIssueProjection.js +4 -1
- package/dist/domain/interfaceBuilderGraph.js +654 -0
- package/dist/domain/javascriptApplicationAnalysis.js +8 -112
- package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
- package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
- package/dist/domain/javascriptApplicationGraph.js +3 -13
- package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
- package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
- package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
- package/dist/domain/javascriptApplicationVersionItems.js +120 -53
- package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
- package/dist/domain/javascriptAstFingerprint.js +25 -58
- package/dist/domain/javascriptAstValues.js +9 -0
- package/dist/domain/javascriptExportInstrumentation.js +2 -4
- package/dist/domain/javascriptExportShapeComparison.js +6 -7
- package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
- package/dist/domain/javascriptExportShapeSelection.js +17 -19
- package/dist/domain/javascriptFeatureSeed.js +20 -12
- package/dist/domain/javascriptFeatureTrace.js +13 -67
- package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
- package/dist/domain/javascriptFeatureTraversal.js +1 -44
- package/dist/domain/javascriptNativeHandoff.js +1 -1
- package/dist/domain/javascriptReplay.js +100 -101
- package/dist/domain/javascriptRuntimeLoadState.js +3 -8
- package/dist/domain/javascriptRuntimeObservation.js +43 -103
- package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
- package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
- package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
- package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
- package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
- package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
- package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
- package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
- package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
- package/dist/domain/javascriptSemanticAnalysis.js +12 -45
- package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
- package/dist/domain/javascriptSemanticCallResolution.js +6 -16
- package/dist/domain/javascriptSemanticCalls.js +5 -32
- package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
- package/dist/domain/javascriptSemanticCoverage.js +11 -0
- package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
- package/dist/domain/javascriptSemanticDataEffects.js +1 -11
- package/dist/domain/javascriptSemanticFingerprints.js +3 -5
- package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
- package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
- package/dist/domain/javascriptSemanticIr.js +1 -29
- package/dist/domain/javascriptSemanticObjects.js +1 -5
- package/dist/domain/javascriptSemanticPrimitives.js +2 -9
- package/dist/domain/javascriptSemanticProjection.js +0 -18
- package/dist/domain/javascriptSemanticPromises.js +9 -16
- package/dist/domain/javascriptSemanticProvenance.js +16 -19
- package/dist/domain/javascriptSemanticQuery.js +17 -139
- package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
- package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
- package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
- package/dist/domain/javascriptSemanticResources.js +1 -6
- package/dist/domain/javascriptSemanticReturns.js +10 -27
- package/dist/domain/javascriptSemanticValueTypes.js +1 -0
- package/dist/domain/javascriptSemanticValues.js +44 -62
- package/dist/domain/javascriptStaticAnalysis.js +21 -43
- package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
- package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
- package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
- package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
- package/dist/domain/javascriptStaticAnalysisState.js +1 -5
- package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
- package/dist/domain/jsonShape.js +7 -33
- package/dist/domain/localPath.js +7 -0
- package/dist/domain/managedApplicationGraph.js +9 -41
- package/dist/domain/managedApplicationGraphCoverage.js +24 -156
- package/dist/domain/managedApplicationGraphNodes.js +10 -13
- package/dist/domain/managedArtifact.js +14 -27
- package/dist/domain/managedMemberComparison.js +90 -92
- package/dist/domain/managedMemberComparisonCoverage.js +11 -33
- package/dist/domain/managedMemberComparisonItems.js +221 -0
- package/dist/domain/managedMemberComparisonMatch.js +8 -208
- package/dist/domain/managedNativeVerification.js +3 -6
- package/dist/domain/managedNativeVerificationMatch.js +55 -59
- package/dist/domain/managedNativeVerificationSchemas.js +83 -47
- package/dist/domain/managedReconstruction.js +19 -23
- package/dist/domain/managedRuntimeCorrelation.js +6 -9
- package/dist/domain/nativeApiBoundary.js +17 -14
- package/dist/domain/nativeInspection.js +0 -2
- package/dist/domain/nativeInvestigationGraph.js +351 -0
- package/dist/domain/nativeValueFlow.js +61 -0
- package/dist/domain/nodeRuntimeCharacterization.js +15 -18
- package/dist/domain/objcSwiftMetadata.js +254 -0
- package/dist/domain/peInspection.js +1 -1
- package/dist/domain/permissionPolicy.js +13 -0
- package/dist/domain/processCapture.js +76 -113
- package/dist/domain/processCaptureExample.js +68 -0
- package/dist/domain/processCaptureParsing.js +21 -0
- package/dist/domain/processCaptureReactiveSchema.js +68 -0
- package/dist/domain/processCaptureReactiveValidation.js +8 -3
- package/dist/domain/processCaptureValidation.js +8 -10
- package/dist/domain/processComparison.js +12 -16
- package/dist/domain/processObservation.js +5 -6
- package/dist/domain/processReactiveMatching.js +32 -46
- package/dist/domain/processReactiveRuntime.js +4 -8
- package/dist/domain/processReactiveScenario.js +28 -94
- package/dist/domain/processReactiveScenarioPreflight.js +5 -30
- package/dist/domain/processReactiveTransition.js +42 -21
- package/dist/domain/processScenario.js +62 -93
- package/dist/domain/processTraceComparison.js +0 -7
- package/dist/domain/processTraceEvaluation.js +14 -4
- package/dist/domain/processTraceSpecification.js +11 -17
- package/dist/domain/protocolCapture.js +11 -9
- package/dist/domain/reconstructionCoverage.js +62 -129
- package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
- package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
- package/dist/domain/reconstructionReadiness.js +1 -2
- package/dist/domain/reconstructionReadinessSchemas.js +66 -40
- package/dist/domain/reconstructionUnknowns.js +3 -3
- package/dist/domain/reconstructionVerification.js +13 -47
- package/dist/domain/reconstructionVerificationSchemas.js +50 -38
- package/dist/domain/referenceSourceGraph.js +53 -61
- package/dist/domain/referenceSourceImportParsing.js +3 -7
- package/dist/domain/replayMachine.js +19 -31
- package/dist/domain/replayMachineRun.js +15 -63
- package/dist/domain/replayMachineRuntime.js +46 -44
- package/dist/domain/replayMachineValues.js +84 -0
- package/dist/domain/residualUnknown.js +25 -30
- package/dist/domain/runtimeCharacterization.js +15 -16
- package/dist/domain/runtimeIdentification.js +48 -47
- package/dist/domain/sourceToBundleComparison.js +11 -87
- package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
- package/dist/domain/sourceToBundleSignals.js +11 -16
- package/dist/domain/staticRuntimeCorrelation.js +44 -54
- package/dist/domain/symbolAnalysis.js +10 -19
- package/dist/domain/unicodeCodePointOrder.js +12 -0
- package/dist/domain/webBundleAnalysis.js +70 -99
- package/dist/domain/webBundleAnalyzer.js +2 -4
- package/dist/domain/webBundleAnalyzerAst.js +0 -13
- package/dist/domain/webBundleAnalyzerInspection.js +26 -52
- package/dist/domain/webBundleAnalyzerResult.js +7 -24
- package/dist/domain/webCaptureDiff.js +48 -85
- package/dist/domain/webCaptureDiffSchemas.js +86 -0
- package/dist/domain/webContentArtifact.js +1 -10
- package/dist/domain/webMcpDiscovery.js +3 -14
- package/dist/domain/webScreenshot.js +58 -34
- package/dist/domain/zipPackageFormat.js +7 -0
- package/dist/dotnet/ManagedArtifactInspector.js +17 -50
- package/dist/dotnet/ManagedMemberInspector.js +27 -58
- package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
- package/dist/dotnet/ManagedMemberRows.js +16 -16
- package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
- package/dist/dotnet/ManagedMetadataInventory.js +21 -30
- package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
- package/dist/dotnet/ManagedMetadataLayout.js +3 -5
- package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
- package/dist/dotnet/ManagedPeReader.js +2 -2
- package/dist/dotnet/ManagedStaticProvider.js +13 -71
- package/dist/generatedMcpToolCatalog.js +1 -1
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
- package/dist/ghidra/GhidraClient.js +5 -13
- package/dist/ghidra/GhidraClientStartup.js +1 -1
- package/dist/ghidra/GhidraClientWire.js +9 -5
- package/dist/ghidra/GhidraDefaults.js +0 -18
- package/dist/ghidra/GhidraDiagnostics.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +16 -12
- package/dist/ghidra/GhidraFunctionValues.js +67 -108
- package/dist/ghidra/GhidraInstallation.js +98 -42
- package/dist/ghidra/GhidraInventoryValues.js +18 -77
- package/dist/ghidra/GhidraLauncher.js +0 -8
- package/dist/ghidra/GhidraProvider.js +32 -31
- package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
- package/dist/ghidra/GhidraRequestQueue.js +6 -30
- package/dist/ghidra/GhidraResponseBuffer.js +1 -7
- package/dist/ghidra/GhidraSessionValues.js +0 -2
- package/dist/ghidra/GhidraSocketConnection.js +1 -1
- package/dist/ghidra/GhidraTransport.js +4 -7
- package/dist/ghidra/protocol.js +19 -42
- package/dist/hopper/BridgeLauncher.js +115 -37
- package/dist/hopper/HopperAnalysisProfile.js +3 -5
- package/dist/hopper/HopperCleanup.js +11 -9
- package/dist/hopper/HopperClient.js +5 -8
- package/dist/hopper/HopperProcessDiagnostic.js +2 -2
- package/dist/hopper/HopperProvider.js +0 -30
- package/dist/hopper/HopperRequestQueue.js +21 -40
- package/dist/hopper/HopperResponseStream.js +1 -9
- package/dist/hopper/HopperSessionValues.js +3 -2
- package/dist/hopper/HopperTargetLease.js +119 -0
- package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
- package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
- package/dist/hopper/protocol.js +6 -4
- package/dist/main/reload.js +1 -9
- package/dist/main/shutdown.js +1 -1
- package/dist/main/state.js +0 -23
- package/dist/main/transport.js +27 -39
- package/dist/main.js +17 -15
- package/dist/mcpDoctor.js +27 -69
- package/dist/native/CommandRunner.js +18 -25
- package/dist/native/NativeMacOSProvider.js +13 -38
- package/dist/native/NativeMachoInspection.js +1 -1
- package/dist/process/BoundedFileBytes.js +17 -0
- package/dist/process/ExecFileOutput.js +11 -0
- package/dist/process/PendingOperations.js +8 -6
- package/dist/process/PrivateRuntimeRoot.js +17 -0
- package/dist/process/ProcessOwnership.js +67 -130
- package/dist/process/ProcessOwnershipIdentity.js +13 -0
- package/dist/process/ProcessOwnershipObservation.js +87 -0
- package/dist/process/ProcessOwnershipProcessTree.js +22 -0
- package/dist/process/ProviderDeadline.js +8 -12
- package/dist/process/ProviderProcess.js +7 -28
- package/dist/process/WindowsAuthority.js +32 -0
- package/dist/reference/ReferenceSourceReader.js +8 -24
- package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
- package/dist/reference/ReferenceSourceReaderFile.js +13 -31
- package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
- package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
- package/dist/replay/JavaScriptReplayWorker.js +95 -13
- package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
- package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
- package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
- package/dist/replay/LinuxRuntimeClosure.js +1 -3
- package/dist/replay/ReplayOutcome.js +27 -18
- package/dist/replay/ReplayProcessLifecycle.js +32 -7
- package/dist/replay/ReplaySeccompFile.js +29 -0
- package/dist/replay/ReplayWorkerProtocol.js +33 -30
- package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
- package/dist/server/ProcessCaptureElicitation.js +4 -8
- package/dist/server/createServer.js +145 -119
- package/dist/server/mcpClientMetadata.js +32 -0
- package/dist/server/promptCompletion.js +37 -61
- package/dist/server/recordDerivedEvidence.js +1 -1
- package/dist/server/registerApplicationTools/characterization.js +10 -21
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
- package/dist/server/registerApplicationTools/compareVersions.js +6 -16
- package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
- package/dist/server/registerApplicationTools/coverage.js +7 -78
- package/dist/server/registerApplicationTools/helpers.js +1 -13
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
- package/dist/server/registerApplicationTools/traceFeature.js +6 -15
- package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
- package/dist/server/registerApplicationTools.js +0 -2
- package/dist/server/registerArtifactComparisonTool.js +27 -35
- package/dist/server/registerBrowserScenarioTool.js +3 -8
- package/dist/server/registerBrowserTools.js +36 -81
- package/dist/server/registerBundleComparisonTool.js +10 -16
- package/dist/server/registerCloseLifecycleTool.js +5 -27
- package/dist/server/registerElectronTools.js +29 -65
- package/dist/server/registerEnhancedTools.js +118 -127
- package/dist/server/registerEvidenceTools.js +19 -30
- package/dist/server/registerFunctionComparisonTool.js +35 -34
- package/dist/server/registerInvestigationTools/helpers.js +3 -32
- package/dist/server/registerInvestigationTools.js +36 -148
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
- package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
- package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
- package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
- package/dist/server/registerOfficialTools.js +8 -51
- package/dist/server/registerProcessComparisonTool.js +43 -38
- package/dist/server/registerPrompts.js +19 -17
- package/dist/server/registerReplayMachineTool.js +4 -10
- package/dist/server/registerSessionRecordTools.js +36 -153
- package/dist/server/registerSessionStatusTool.js +18 -96
- package/dist/server/registerSessionTools.js +34 -91
- package/dist/server/sessionAvailabilityPolicy.js +2 -3
- package/dist/server/sessionEvidence.js +9 -15
- package/dist/server/sessionToolPolicies.js +1 -13
- package/dist/server/toolRegistrationOptions.js +4 -192
- package/dist/server/toolResult.js +15 -67
- package/dist/serverIdentity.js +0 -20
- package/install.sh +1 -1
- package/package.json +27 -15
- package/scripts/electron-active-hook-boundaries.cjs +394 -0
- package/scripts/electron-active-hook.cjs +469 -0
- package/scripts/hopper-demo-x11.py +13 -32
- package/scripts/rea.mjs +1 -11
- package/skills/reverse-engineer-anything/SKILL.md +46 -11
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
- package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
- package/dist/application/BoundedJsonFiles.js +0 -86
- package/dist/application/CrossVersionInventory.js +0 -128
- package/dist/application/CrossVersionInvestigation.js +0 -301
- package/dist/application/CrossVersionInvestigationCollections.js +0 -23
- package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
- package/dist/application/CrossVersionInvestigationReplay.js +0 -170
- package/dist/application/DeferredFileAuthorization.js +0 -61
- package/dist/application/DoctorProjection.js +0 -43
- package/dist/application/EnhancedToolPagination.js +0 -22
- package/dist/application/EvidenceReferenceResolver.js +0 -26
- package/dist/application/InvestigationWorkspaceStore.js +0 -204
- package/dist/application/ProcessPairedExperiment.js +0 -72
- package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
- package/dist/application/ReconstructionReadinessService.js +0 -48
- package/dist/cliInvestigationCommands.js +0 -173
- package/dist/domain/boundedCartesianProjection.js +0 -15
- package/dist/domain/investigationWorkspace.js +0 -346
- package/dist/domain/jsonLimits.js +0 -26
- package/dist/domain/knownPageCoverage.js +0 -21
- package/dist/domain/processPairedExperiment.js +0 -128
- package/dist/server/DynamicToolAvailability.js +0 -70
- package/dist/server/LazyToolCatalog.js +0 -134
- package/dist/server/hydrateServerTools.js +0 -191
- package/dist/server/javascriptApplicationResult.js +0 -106
- package/dist/server/permissionFailure.js +0 -12
- package/dist/server/registerApplicationTools/readiness.js +0 -55
- package/dist/server/registerEvidenceResources.js +0 -315
- package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
- package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
- package/dist/server/registerReconstructionReadinessResource.js +0 -32
- package/dist/server/toolInputValidation.js +0 -77
- package/scripts/package-runner-bootstrap.mjs +0 -72
|
@@ -6,99 +6,31 @@ import { CLI_COMMANDS } from "./cliCommandNames.js";
|
|
|
6
6
|
import { logCliCommand } from "./cliLogging.js";
|
|
7
7
|
import { parseConfig } from "./config.js";
|
|
8
8
|
import { javascriptRuntimeKindSchema, listJavaScriptRuntimeTargetsInputSchema, observeJavaScriptRuntimeInputSchema, } from "./domain/javascriptRuntimeObservation.js";
|
|
9
|
-
import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
|
|
10
|
-
const scopeOptions = {
|
|
11
|
-
allowedFileRoots: z
|
|
12
|
-
.array(z.string().min(1))
|
|
13
|
-
.optional()
|
|
14
|
-
.describe("Exact roots; defaults to REA_V8_INSPECTOR_FILE_ROOTS_JSON"),
|
|
15
|
-
allowedOrigins: z
|
|
16
|
-
.array(z.string().min(1))
|
|
17
|
-
.optional()
|
|
18
|
-
.describe("Exact origins; defaults to REA_V8_INSPECTOR_ALLOWED_ORIGINS_JSON"),
|
|
19
|
-
approved: z.boolean().default(false).describe("Approve passive attachment"),
|
|
20
|
-
};
|
|
21
|
-
const listOptionsSchema = z.object({
|
|
22
|
-
...scopeOptions,
|
|
23
|
-
offset: z
|
|
24
|
-
.number()
|
|
25
|
-
.int()
|
|
26
|
-
.min(0)
|
|
27
|
-
.default(0)
|
|
28
|
-
.describe("Zero-based target offset"),
|
|
29
|
-
limit: z
|
|
30
|
-
.number()
|
|
31
|
-
.int()
|
|
32
|
-
.min(1)
|
|
33
|
-
.max(200)
|
|
34
|
-
.default(100)
|
|
35
|
-
.describe("Maximum targets to return"),
|
|
36
|
-
});
|
|
9
|
+
import { AnalysisCapabilityUnavailableError, AnalysisInputError, projectAnalysisError, } from "./domain/errors.js";
|
|
37
10
|
const observeOptionsSchema = z.object({
|
|
38
|
-
|
|
39
|
-
|
|
11
|
+
runtimeKind: javascriptRuntimeKindSchema
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Declared target role; Inspector cannot authenticate the Electron role"),
|
|
40
14
|
observationMs: z
|
|
41
15
|
.number()
|
|
42
16
|
.int()
|
|
43
17
|
.min(0)
|
|
44
|
-
.max(10_000)
|
|
45
18
|
.default(100)
|
|
46
|
-
.describe("
|
|
47
|
-
maxEvents: z
|
|
48
|
-
.number()
|
|
49
|
-
.int()
|
|
50
|
-
.min(1)
|
|
51
|
-
.max(50_000)
|
|
52
|
-
.default(10_000)
|
|
53
|
-
.describe("Maximum retained protocol events"),
|
|
54
|
-
maxScripts: z
|
|
55
|
-
.number()
|
|
56
|
-
.int()
|
|
57
|
-
.min(1)
|
|
58
|
-
.max(10_000)
|
|
59
|
-
.default(2_000)
|
|
60
|
-
.describe("Maximum retained scripts"),
|
|
61
|
-
maxExecutionContexts: z
|
|
62
|
-
.number()
|
|
63
|
-
.int()
|
|
64
|
-
.min(1)
|
|
65
|
-
.max(5_000)
|
|
66
|
-
.default(1_000)
|
|
67
|
-
.describe("Maximum retained execution contexts"),
|
|
68
|
-
maxLocationBytes: z
|
|
69
|
-
.number()
|
|
70
|
-
.int()
|
|
71
|
-
.min(64)
|
|
72
|
-
.max(65_536)
|
|
73
|
-
.default(16_384)
|
|
74
|
-
.describe("Maximum bytes in one protocol location"),
|
|
75
|
-
maxTotalMetadataBytes: z
|
|
76
|
-
.number()
|
|
77
|
-
.int()
|
|
78
|
-
.min(1_024)
|
|
79
|
-
.max(32 * 1_024 * 1_024)
|
|
80
|
-
.default(4 * 1_024 * 1_024)
|
|
81
|
-
.describe("Maximum retained metadata bytes"),
|
|
19
|
+
.describe("Observation window in milliseconds"),
|
|
82
20
|
});
|
|
83
21
|
/** Register CLI equivalents of passive V8 Inspector tools. */
|
|
84
22
|
export const registerJavaScriptRuntimeObservationCommands = (cli, logger) => {
|
|
85
23
|
cli.command(CLI_COMMANDS.listJavaScriptRuntimeTargets, {
|
|
86
|
-
description: "List
|
|
24
|
+
description: "List Node/Electron V8 Inspector targets",
|
|
87
25
|
args: z.object({
|
|
88
|
-
endpoint: z.string().describe("
|
|
26
|
+
endpoint: z.string().describe("Literal-loopback Inspector endpoint"),
|
|
89
27
|
}),
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const context = await runtimeContext();
|
|
28
|
+
run: ({ args }) => logCliCommand(logger, CLI_COMMANDS.listJavaScriptRuntimeTargets, async () => {
|
|
29
|
+
const context = await runtimeContext("list_javascript_runtime_targets");
|
|
93
30
|
if (!context.ok)
|
|
94
31
|
return context.error;
|
|
95
32
|
const parsed = listJavaScriptRuntimeTargetsInputSchema.safeParse({
|
|
96
33
|
inspector_endpoint: args.endpoint,
|
|
97
|
-
allowed_file_roots: options.allowedFileRoots ?? context.allowedFileRoots,
|
|
98
|
-
allowed_origins: options.allowedOrigins ?? context.allowedOrigins,
|
|
99
|
-
approved: options.approved,
|
|
100
|
-
offset: options.offset,
|
|
101
|
-
limit: options.limit,
|
|
102
34
|
});
|
|
103
35
|
if (!parsed.success)
|
|
104
36
|
return inputError("list_javascript_runtime_targets");
|
|
@@ -109,31 +41,21 @@ export const registerJavaScriptRuntimeObservationCommands = (cli, logger) => {
|
|
|
109
41
|
cli.command(CLI_COMMANDS.observeJavaScriptRuntime, {
|
|
110
42
|
description: "Passively observe one exact Node/Electron Inspector target",
|
|
111
43
|
args: z.object({
|
|
112
|
-
endpoint: z.string().describe("
|
|
44
|
+
endpoint: z.string().describe("Literal-loopback Inspector endpoint"),
|
|
113
45
|
targetId: z
|
|
114
46
|
.string()
|
|
115
47
|
.describe("Target from list-javascript-runtime-targets"),
|
|
116
48
|
}),
|
|
117
49
|
options: observeOptionsSchema,
|
|
118
50
|
run: ({ args, options }) => logCliCommand(logger, CLI_COMMANDS.observeJavaScriptRuntime, async () => {
|
|
119
|
-
const context = await runtimeContext();
|
|
51
|
+
const context = await runtimeContext("observe_javascript_runtime");
|
|
120
52
|
if (!context.ok)
|
|
121
53
|
return context.error;
|
|
122
54
|
const parsed = observeJavaScriptRuntimeInputSchema.safeParse({
|
|
123
55
|
inspector_endpoint: args.endpoint,
|
|
124
|
-
allowed_file_roots: options.allowedFileRoots ?? context.allowedFileRoots,
|
|
125
|
-
allowed_origins: options.allowedOrigins ?? context.allowedOrigins,
|
|
126
56
|
target_id: args.targetId,
|
|
127
57
|
runtime_kind: options.runtimeKind,
|
|
128
|
-
approved: options.approved,
|
|
129
58
|
observation_ms: options.observationMs,
|
|
130
|
-
limits: {
|
|
131
|
-
max_events: options.maxEvents,
|
|
132
|
-
max_scripts: options.maxScripts,
|
|
133
|
-
max_execution_contexts: options.maxExecutionContexts,
|
|
134
|
-
max_location_bytes: options.maxLocationBytes,
|
|
135
|
-
max_total_metadata_bytes: options.maxTotalMetadataBytes,
|
|
136
|
-
},
|
|
137
59
|
});
|
|
138
60
|
if (!parsed.success)
|
|
139
61
|
return inputError("observe_javascript_runtime");
|
|
@@ -142,10 +64,16 @@ export const registerJavaScriptRuntimeObservationCommands = (cli, logger) => {
|
|
|
142
64
|
}),
|
|
143
65
|
});
|
|
144
66
|
};
|
|
145
|
-
const runtimeContext = async () => {
|
|
67
|
+
const runtimeContext = async (operation) => {
|
|
146
68
|
const config = parseConfig(process.env);
|
|
147
69
|
if (!config.ok)
|
|
148
70
|
return { ok: false, error: cliError(config.error) };
|
|
71
|
+
const policy = config.value.v8InspectorObservationPolicy;
|
|
72
|
+
if (policy.status === "disabled")
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
error: cliError(new AnalysisCapabilityUnavailableError("rea-v8-inspector", operation, "V8 Inspector observation is disabled; enable REA_V8_INSPECTOR_OBSERVE_ENABLED to authorize loopback endpoints")),
|
|
76
|
+
};
|
|
149
77
|
const authority = await loadConfiguredPermissionAuthority(config.value);
|
|
150
78
|
if (!authority.ok)
|
|
151
79
|
return { ok: false, error: cliError(authority.error) };
|
|
@@ -153,8 +81,6 @@ const runtimeContext = async () => {
|
|
|
153
81
|
ok: true,
|
|
154
82
|
authority: authority.value,
|
|
155
83
|
provider: new V8InspectorProvider(),
|
|
156
|
-
allowedFileRoots: config.value.v8InspectorFileRoots,
|
|
157
|
-
allowedOrigins: config.value.v8InspectorAllowedOrigins,
|
|
158
84
|
};
|
|
159
85
|
};
|
|
160
86
|
const inputError = (operation) => cliError(new AnalysisInputError(operation));
|
package/dist/cliJsonInput.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { readFile
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
|
|
3
|
-
|
|
4
|
-
/** Parse bounded inline JSON or one bounded local JSON file for a CLI workflow. */
|
|
3
|
+
/** Parse inline JSON or one local JSON file for a CLI workflow. */
|
|
5
4
|
export const parseCliJsonInput = async (value, operation) => {
|
|
6
5
|
const inline = parseJson(value);
|
|
7
6
|
if (inline !== undefined)
|
|
@@ -9,15 +8,7 @@ export const parseCliJsonInput = async (value, operation) => {
|
|
|
9
8
|
if (["{", "["].includes(value.trimStart()[0] ?? ""))
|
|
10
9
|
return { ok: false, error: inputError(operation) };
|
|
11
10
|
try {
|
|
12
|
-
const
|
|
13
|
-
if (!metadata.isFile())
|
|
14
|
-
return jsonFileError(value, operation, "not-file");
|
|
15
|
-
if (metadata.size > MAX_JSON_INPUT_BYTES)
|
|
16
|
-
return jsonFileError(value, operation, "too-large");
|
|
17
|
-
const bytes = await readFile(value);
|
|
18
|
-
if (bytes.byteLength > MAX_JSON_INPUT_BYTES)
|
|
19
|
-
return jsonFileError(value, operation, "too-large");
|
|
20
|
-
const parsed = parseJson(bytes.toString("utf8"));
|
|
11
|
+
const parsed = parseJson(await readFile(value, "utf8"));
|
|
21
12
|
return parsed === undefined
|
|
22
13
|
? jsonFileError(value, operation, "invalid-json")
|
|
23
14
|
: { ok: true, value: parsed };
|
|
@@ -47,8 +38,7 @@ const jsonFileError = (path, operation, reason) => ({
|
|
|
47
38
|
...projectAnalysisError(new AnalysisInputError(operation, undefined, reason === "invalid-json"
|
|
48
39
|
? [{ path: [], reason: "invalid_format", expected: "JSON" }]
|
|
49
40
|
: [])),
|
|
50
|
-
input_path: path,
|
|
41
|
+
...(path === undefined ? {} : { input_path: path }),
|
|
51
42
|
input_reason: reason,
|
|
52
|
-
maximum_input_bytes: MAX_JSON_INPUT_BYTES,
|
|
53
43
|
},
|
|
54
44
|
});
|
|
@@ -1,55 +1,41 @@
|
|
|
1
1
|
import { z } from "incur";
|
|
2
|
-
|
|
2
|
+
/** Accept an agent-selected browser observation duration without an artificial ceiling. */
|
|
3
|
+
export const observationDuration = (fallback, minimum = 0) => z
|
|
3
4
|
.number()
|
|
4
5
|
.int()
|
|
5
6
|
.min(minimum)
|
|
6
|
-
.max(maximum)
|
|
7
7
|
.default(fallback)
|
|
8
|
-
.describe(
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const browserScopeOptions = {
|
|
8
|
+
.describe("Observation duration in milliseconds");
|
|
9
|
+
/** Shared passive browser origin options. */
|
|
10
|
+
export const browserScopeOptions = {
|
|
12
11
|
allowedOrigins: z
|
|
13
12
|
.array(z.string().min(1))
|
|
14
13
|
.optional()
|
|
15
14
|
.describe("Exact origins to observe; defaults to REA_BROWSER_ALLOWED_ORIGINS_JSON"),
|
|
16
|
-
approved: z.boolean().default(false).describe("Approve passive observation"),
|
|
17
15
|
};
|
|
18
16
|
export const browserPageInspectionOptions = z.object({
|
|
19
17
|
...browserScopeOptions,
|
|
20
|
-
observationMs:
|
|
18
|
+
observationMs: observationDuration(500),
|
|
21
19
|
includeAccessibilityText: z
|
|
22
20
|
.boolean()
|
|
23
21
|
.default(false)
|
|
24
|
-
.describe("Include
|
|
22
|
+
.describe("Include accessibility text"),
|
|
25
23
|
includeConsoleText: z
|
|
26
24
|
.boolean()
|
|
27
25
|
.default(false)
|
|
28
|
-
.describe("Include
|
|
29
|
-
consoleTextApproved: z
|
|
30
|
-
.boolean()
|
|
31
|
-
.default(false)
|
|
32
|
-
.describe("Approve capturing console message text"),
|
|
26
|
+
.describe("Include console message text"),
|
|
33
27
|
includeJsonBodyShapes: z
|
|
34
28
|
.boolean()
|
|
35
29
|
.default(false)
|
|
36
30
|
.describe("Include structural shapes of JSON response bodies"),
|
|
37
|
-
jsonBodySchemaApproved: z
|
|
38
|
-
.boolean()
|
|
39
|
-
.default(false)
|
|
40
|
-
.describe("Approve inspecting JSON response bodies for structural shapes"),
|
|
41
31
|
includeWebsocketShapes: z
|
|
42
32
|
.boolean()
|
|
43
33
|
.default(false)
|
|
44
34
|
.describe("Include structural shapes of WebSocket payloads"),
|
|
45
|
-
websocketShapeApproved: z
|
|
46
|
-
.boolean()
|
|
47
|
-
.default(false)
|
|
48
|
-
.describe("Approve inspecting WebSocket payloads for structural shapes"),
|
|
49
35
|
includeScriptSources: z
|
|
50
36
|
.boolean()
|
|
51
37
|
.default(false)
|
|
52
|
-
.describe("Include
|
|
38
|
+
.describe("Include JavaScript source text"),
|
|
53
39
|
includeStorageKeys: z
|
|
54
40
|
.boolean()
|
|
55
41
|
.default(false)
|
|
@@ -58,84 +44,17 @@ export const browserPageInspectionOptions = z.object({
|
|
|
58
44
|
.boolean()
|
|
59
45
|
.default(false)
|
|
60
46
|
.describe("Include content-derived storage fingerprints"),
|
|
61
|
-
maxFrames: boundedCount("page frames", 1_000, 200),
|
|
62
|
-
maxDomNodes: boundedCount("DOM nodes", 10_000, 2_000),
|
|
63
|
-
maxAxNodes: boundedCount("accessibility nodes", 10_000, 2_000),
|
|
64
|
-
maxAxTextFieldBytes: boundedBytes("one accessibility text field", 16 * 1_024, 1_024),
|
|
65
|
-
maxTotalAxTextBytes: boundedBytes("total accessibility text", 1_024 * 1_024, 64 * 1_024),
|
|
66
|
-
maxScripts: boundedCount("scripts", 1_000, 200),
|
|
67
|
-
maxResources: boundedCount("resources", 10_000, 2_000),
|
|
68
|
-
maxWorkers: boundedCount("workers", 5_000, 500),
|
|
69
|
-
maxStorageKeys: boundedCount("storage keys", 10_000, 1_000),
|
|
70
|
-
maxScriptSourceBytes: boundedBytes("one script source", 4 * 1_024 * 1_024, 1_024 * 1_024),
|
|
71
|
-
maxTotalScriptSourceBytes: boundedBytes("total script source", 16 * 1_024 * 1_024, 4 * 1_024 * 1_024),
|
|
72
|
-
maxNetworkEvents: boundedCount("network events", 10_000, 1_000),
|
|
73
|
-
maxConsoleEvents: boundedCount("console events", 2_000, 200),
|
|
74
|
-
maxConsoleTextFieldBytes: boundedBytes("one console text field", 16 * 1_024, 1_024),
|
|
75
|
-
maxTotalConsoleTextBytes: boundedBytes("total console text", 1_024 * 1_024, 64 * 1_024),
|
|
76
|
-
maxJsonBodyBytes: boundedBytes("one JSON response body", 4 * 1_024 * 1_024, 1_024 * 1_024),
|
|
77
|
-
maxTotalJsonBodyBytes: boundedBytes("total JSON response bodies", 16 * 1_024 * 1_024, 4 * 1_024 * 1_024),
|
|
78
|
-
maxJsonShapeNodes: boundedCount("JSON shape nodes", 100_000, 5_000),
|
|
79
|
-
maxJsonShapeDepth: boundedCount("JSON shape depth", 100, 20),
|
|
80
|
-
maxWebsocketEvents: boundedCount("WebSocket events", 5_000, 500),
|
|
81
|
-
maxWebsocketShapeBytes: boundedBytes("one WebSocket shape", 1_024 * 1_024, 64 * 1_024),
|
|
82
|
-
maxTotalWebsocketShapeBytes: boundedBytes("total WebSocket shapes", 16 * 1_024 * 1_024, 1_024 * 1_024),
|
|
83
47
|
});
|
|
84
|
-
const electronScopeOptions = {
|
|
85
|
-
allowedFileRoots: z
|
|
86
|
-
.array(z.string().min(1))
|
|
87
|
-
.optional()
|
|
88
|
-
.describe("Filesystem roots; defaults to REA_ELECTRON_FILE_ROOTS_JSON"),
|
|
89
|
-
approved: z.boolean().default(false).describe("Approve passive observation"),
|
|
90
|
-
};
|
|
91
48
|
export const electronPageInspectionOptions = z.object({
|
|
92
|
-
|
|
93
|
-
observationMs: boundedCount("observation duration in milliseconds", 10_000, 100, 0),
|
|
49
|
+
observationMs: observationDuration(100),
|
|
94
50
|
includeScriptSources: z
|
|
95
51
|
.boolean()
|
|
96
52
|
.default(false)
|
|
97
|
-
.describe("Include
|
|
98
|
-
sourceCaptureApproved: z
|
|
99
|
-
.boolean()
|
|
100
|
-
.default(false)
|
|
101
|
-
.describe("Approve capturing bounded script source text"),
|
|
102
|
-
maxFrames: boundedCount("page frames", 1_000, 200),
|
|
103
|
-
maxDomNodes: boundedCount("DOM nodes", 10_000, 2_000),
|
|
104
|
-
maxScripts: boundedCount("scripts", 2_000, 500),
|
|
105
|
-
maxResources: boundedCount("resources", 10_000, 2_000),
|
|
106
|
-
maxWorkers: boundedCount("workers", 5_000, 500),
|
|
107
|
-
maxScriptSourceBytes: boundedBytes("one captured script source", 4 * 1_024 * 1_024, 1_024 * 1_024),
|
|
108
|
-
maxTotalScriptSourceBytes: boundedBytes("total captured script source", 16 * 1_024 * 1_024, 4 * 1_024 * 1_024),
|
|
53
|
+
.describe("Include JavaScript source text"),
|
|
109
54
|
});
|
|
110
55
|
export const javascriptApplicationOptions = z.object({
|
|
111
|
-
approved: z
|
|
112
|
-
.boolean()
|
|
113
|
-
.default(false)
|
|
114
|
-
.describe("Approve reading the application artifact"),
|
|
115
56
|
artifactFormat: z
|
|
116
57
|
.enum(["auto", "asar", "directory"])
|
|
117
58
|
.default("auto")
|
|
118
59
|
.describe("Application artifact format"),
|
|
119
|
-
sourceMapReadApproved: z
|
|
120
|
-
.boolean()
|
|
121
|
-
.default(false)
|
|
122
|
-
.describe("Approve reading local source maps referenced by the application"),
|
|
123
|
-
maxEntries: positiveCount("artifact entries to inspect", 8_000),
|
|
124
|
-
maxTotalArtifactBytes: positiveCount("total uncompressed artifact content to inspect", 512 * 1_024 * 1_024),
|
|
125
|
-
maxArtifactEntryBytes: positiveCount("uncompressed content for one artifact entry", 128 * 1_024 * 1_024),
|
|
126
|
-
maxCompressionRatio: z
|
|
127
|
-
.number()
|
|
128
|
-
.min(1)
|
|
129
|
-
.default(1_000)
|
|
130
|
-
.describe("Maximum accepted compressed-to-uncompressed expansion ratio"),
|
|
131
|
-
maxDepth: positiveCount("artifact directory depth", 64),
|
|
132
|
-
maxPathBytes: positiveCount("encoded artifact path length", 4_096),
|
|
133
|
-
maxTextFiles: positiveCount("text files to parse", 5_000),
|
|
134
|
-
maxTotalTextBytes: positiveCount("total text content to parse", 128 * 1_024 * 1_024),
|
|
135
|
-
maxTextFileBytes: positiveCount("size of one parsed text file", 8 * 1_024 * 1_024),
|
|
136
|
-
maxAstNodes: positiveCount("JavaScript AST nodes to parse", 2_000_000),
|
|
137
|
-
maxFindings: positiveCount("static-analysis findings to return", 8_000),
|
|
138
|
-
maxModules: positiveCount("application modules to project", 20_000),
|
|
139
|
-
maxSourceMapSources: positiveCount("original sources from source maps", 5_000),
|
|
140
|
-
maxParseMilliseconds: positiveCount("JavaScript parsing time in milliseconds", 30_000),
|
|
141
60
|
});
|
|
@@ -5,23 +5,9 @@ import { readProjectPermissionStore, revokeProjectPermissionGrant, } from "./app
|
|
|
5
5
|
import { logCliCommand } from "./cliLogging.js";
|
|
6
6
|
import { parseConfig } from "./config.js";
|
|
7
7
|
import { PermissionRequiredError, projectAnalysisError, } from "./domain/errors.js";
|
|
8
|
+
import { PERMISSION_CAPABILITIES, } from "./domain/permissionPolicy.js";
|
|
8
9
|
import { CLI_COMMANDS } from "./cliCommandNames.js";
|
|
9
|
-
const capabilitySchema = z.enum(
|
|
10
|
-
"process_capture",
|
|
11
|
-
"browser_observe",
|
|
12
|
-
"browser_automate",
|
|
13
|
-
"electron_observe",
|
|
14
|
-
"evidence_read",
|
|
15
|
-
"evidence_write",
|
|
16
|
-
"investigation_input",
|
|
17
|
-
"investigation_workspace_read",
|
|
18
|
-
"investigation_workspace_write",
|
|
19
|
-
"snapshot_read",
|
|
20
|
-
"snapshot_write",
|
|
21
|
-
"artifact_extract",
|
|
22
|
-
"native_mount",
|
|
23
|
-
"reference_read",
|
|
24
|
-
]);
|
|
10
|
+
const capabilitySchema = z.enum(PERMISSION_CAPABILITIES);
|
|
25
11
|
/** Require an explicit decision before a project permission grant is removed. */
|
|
26
12
|
export const approvePolicyRevocation = async (options) => {
|
|
27
13
|
if (options.approved)
|
|
@@ -6,16 +6,16 @@ import { parseCliJsonInput } from "./cliJsonInput.js";
|
|
|
6
6
|
import { replayMachineRunInputSchema, runReplayMachine, } from "./domain/replayMachineRun.js";
|
|
7
7
|
import { AnalysisInputError, projectAnalysisError } from "./domain/errors.js";
|
|
8
8
|
import { projectInputIssues } from "./domain/inputIssueProjection.js";
|
|
9
|
-
/** Register
|
|
9
|
+
/** Register process capture one-shot commands through shared application services. */
|
|
10
10
|
export const registerProcessCommands = (cli, logger) => {
|
|
11
11
|
registerReplayMachineCommand(cli, logger);
|
|
12
12
|
cli.command(CLI_COMMANDS.captureProcess, {
|
|
13
|
-
description: "Capture one approved
|
|
13
|
+
description: "Capture one approved process capture JSON scenario",
|
|
14
14
|
args: z.object({ scenario: z.string().describe("Scenario JSON path") }),
|
|
15
15
|
run: ({ args }) => logCliCommand(logger, "capture-process", () => captureProcessScenarioFile(args.scenario)),
|
|
16
16
|
});
|
|
17
17
|
cli.command(CLI_COMMANDS.compareProcessCaptures, {
|
|
18
|
-
description: "Compare two
|
|
18
|
+
description: "Compare two process capture Evidence JSON files",
|
|
19
19
|
args: z.object({
|
|
20
20
|
left: z.string().describe("Left capture Evidence JSON path"),
|
|
21
21
|
right: z.string().describe("Right capture Evidence JSON path"),
|
package/dist/cliSetup.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { cancel, confirm, intro, isCancel, multiselect, outro, } from "@clack/prompts";
|
|
2
|
-
import { projectDoctorReport } from "./application/DoctorProjection.js";
|
|
3
2
|
import { SUPPORTED_CLIENT_DEFINITIONS } from "./application/SupportedClients.js";
|
|
4
3
|
const clientDisplayNames = new Map(SUPPORTED_CLIENT_DEFINITIONS.map(({ name, displayName }) => [
|
|
5
4
|
name,
|
|
@@ -72,18 +71,6 @@ export const renderInteractiveSetupResult = (result) => {
|
|
|
72
71
|
writeLine(`! ${result.remediation ?? "Setup needs attention."}`);
|
|
73
72
|
outro("Run `rea doctor` for the remaining checks.", promptStreams);
|
|
74
73
|
};
|
|
75
|
-
/** Keep default non-TTY output actionable without emitting the full catalog. */
|
|
76
|
-
export const conciseSetupResult = (result) => ({
|
|
77
|
-
status: result.status,
|
|
78
|
-
plannedActions: result.plannedActions,
|
|
79
|
-
appliedActions: result.appliedActions,
|
|
80
|
-
clients: result.clients,
|
|
81
|
-
doctor: projectDoctorReport(result.doctor, "summary"),
|
|
82
|
-
...(result.code === undefined ? {} : { code: result.code }),
|
|
83
|
-
...(result.remediation === undefined
|
|
84
|
-
? {}
|
|
85
|
-
: { remediation: result.remediation }),
|
|
86
|
-
});
|
|
87
74
|
const selectSetupActions = async (actions, accessible) => {
|
|
88
75
|
const clientActions = actions.filter(({ kind }) => kind === "configure_client");
|
|
89
76
|
const componentActions = actions.filter(({ kind }) => kind !== "configure_client");
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ConfigurationError } from "../domain/errors.js";
|
|
2
|
+
import { err, ok } from "../domain/result.js";
|
|
3
|
+
import { browserEndpointSchema, browserOriginSchema, } from "../domain/browserObservation.js";
|
|
4
|
+
import { parseAbsoluteRoots, parseBrowserArray, parseStringArray, } from "./parsers.js";
|
|
5
|
+
import { browserNetworkScope, permissionScope } from "./permissions.js";
|
|
6
|
+
/** Parse controlled browser scenarios into a closed disabled or enabled policy. */
|
|
7
|
+
export const parseBrowserScenarioPolicy = (env) => {
|
|
8
|
+
const executableRoots = parseAbsoluteRoots(env.REA_BROWSER_SCENARIO_EXECUTABLE_ROOTS_JSON, "REA_BROWSER_SCENARIO_EXECUTABLE_ROOTS_JSON");
|
|
9
|
+
if (!executableRoots.ok)
|
|
10
|
+
return executableRoots;
|
|
11
|
+
const cdpEndpoints = parseBrowserArray(env.REA_BROWSER_SCENARIO_CDP_ENDPOINTS_JSON, "REA_BROWSER_SCENARIO_CDP_ENDPOINTS_JSON", browserEndpointSchema);
|
|
12
|
+
if (!cdpEndpoints.ok)
|
|
13
|
+
return cdpEndpoints;
|
|
14
|
+
const allowedOrigins = parseBrowserArray(env.REA_BROWSER_SCENARIO_ALLOWED_ORIGINS_JSON, "REA_BROWSER_SCENARIO_ALLOWED_ORIGINS_JSON", browserOriginSchema);
|
|
15
|
+
if (!allowedOrigins.ok)
|
|
16
|
+
return allowedOrigins;
|
|
17
|
+
const allowedEnvironment = parseStringArray(env.REA_BROWSER_SCENARIO_ALLOWED_ENV_JSON, "REA_BROWSER_SCENARIO_ALLOWED_ENV_JSON");
|
|
18
|
+
if (!allowedEnvironment.ok)
|
|
19
|
+
return allowedEnvironment;
|
|
20
|
+
if (env.REA_BROWSER_SCENARIO_ENABLED !== "true")
|
|
21
|
+
return ok({ status: "disabled" });
|
|
22
|
+
const [firstOrigin, ...remainingOrigins] = allowedOrigins.value;
|
|
23
|
+
if (firstOrigin === undefined)
|
|
24
|
+
return err(new ConfigurationError("REA_BROWSER_SCENARIO_ALLOWED_ORIGINS_JSON must encode at least one exact origin when browser scenarios are enabled"));
|
|
25
|
+
const target = parseTargetPolicy(executableRoots.value, cdpEndpoints.value);
|
|
26
|
+
if (!target.ok)
|
|
27
|
+
return target;
|
|
28
|
+
return ok({
|
|
29
|
+
status: "enabled",
|
|
30
|
+
target: target.value,
|
|
31
|
+
allowedOrigins: [firstOrigin, ...remainingOrigins],
|
|
32
|
+
allowedEnvironment: allowedEnvironment.value,
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
/** Add the separately permissioned controlled-browser ceiling. */
|
|
36
|
+
export const appendBrowserScenarioCeiling = (ceilings, policy) => {
|
|
37
|
+
if (policy.status === "disabled")
|
|
38
|
+
return;
|
|
39
|
+
const { executableRoots, cdpEndpoints } = targetScopes(policy.target);
|
|
40
|
+
ceilings.push(permissionScope("browser_automate", [], {
|
|
41
|
+
executables: executableRoots,
|
|
42
|
+
environment_names: policy.allowedEnvironment,
|
|
43
|
+
origins: [...cdpEndpoints, ...policy.allowedOrigins],
|
|
44
|
+
network: browserNetworkScope(policy.allowedOrigins),
|
|
45
|
+
}));
|
|
46
|
+
};
|
|
47
|
+
const parseTargetPolicy = (executableRoots, cdpEndpoints) => {
|
|
48
|
+
const [firstExecutableRoot, ...remainingExecutableRoots] = executableRoots;
|
|
49
|
+
const [firstCdpEndpoint, ...remainingCdpEndpoints] = cdpEndpoints;
|
|
50
|
+
if (firstExecutableRoot !== undefined && firstCdpEndpoint !== undefined)
|
|
51
|
+
return ok({
|
|
52
|
+
access: "launch-or-attach",
|
|
53
|
+
executableRoots: [firstExecutableRoot, ...remainingExecutableRoots],
|
|
54
|
+
cdpEndpoints: [firstCdpEndpoint, ...remainingCdpEndpoints],
|
|
55
|
+
});
|
|
56
|
+
if (firstExecutableRoot !== undefined)
|
|
57
|
+
return ok({
|
|
58
|
+
access: "launch",
|
|
59
|
+
executableRoots: [firstExecutableRoot, ...remainingExecutableRoots],
|
|
60
|
+
});
|
|
61
|
+
if (firstCdpEndpoint !== undefined)
|
|
62
|
+
return ok({
|
|
63
|
+
access: "attach",
|
|
64
|
+
cdpEndpoints: [firstCdpEndpoint, ...remainingCdpEndpoints],
|
|
65
|
+
});
|
|
66
|
+
return err(new ConfigurationError("Browser scenarios require at least one executable root or loopback CDP endpoint when enabled"));
|
|
67
|
+
};
|
|
68
|
+
const targetScopes = (target) => {
|
|
69
|
+
switch (target.access) {
|
|
70
|
+
case "launch":
|
|
71
|
+
return { executableRoots: target.executableRoots, cdpEndpoints: [] };
|
|
72
|
+
case "attach":
|
|
73
|
+
return { executableRoots: [], cdpEndpoints: target.cdpEndpoints };
|
|
74
|
+
case "launch-or-attach":
|
|
75
|
+
return target;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ConfigurationError } from "../domain/errors.js";
|
|
2
|
+
import { err, ok } from "../domain/result.js";
|
|
3
|
+
import { permissionScope } from "./permissions.js";
|
|
4
|
+
import { parseAbsoluteRoots } from "./parsers.js";
|
|
5
|
+
/** Parse active Electron automation into a closed disabled or enabled policy. */
|
|
6
|
+
export const parseElectronAutomationPolicy = (env) => {
|
|
7
|
+
const executableRoots = parseAbsoluteRoots(env.REA_ELECTRON_AUTOMATE_EXECUTABLE_ROOTS_JSON, "REA_ELECTRON_AUTOMATE_EXECUTABLE_ROOTS_JSON");
|
|
8
|
+
if (!executableRoots.ok)
|
|
9
|
+
return executableRoots;
|
|
10
|
+
const applicationRoots = parseAbsoluteRoots(env.REA_ELECTRON_AUTOMATE_APPLICATION_ROOTS_JSON, "REA_ELECTRON_AUTOMATE_APPLICATION_ROOTS_JSON");
|
|
11
|
+
if (!applicationRoots.ok)
|
|
12
|
+
return applicationRoots;
|
|
13
|
+
if (env.REA_ELECTRON_AUTOMATE_ENABLED !== "true")
|
|
14
|
+
return ok({ status: "disabled" });
|
|
15
|
+
const [firstExecutableRoot, ...remainingExecutableRoots] = executableRoots.value;
|
|
16
|
+
if (firstExecutableRoot === undefined)
|
|
17
|
+
return err(new ConfigurationError("REA_ELECTRON_AUTOMATE_EXECUTABLE_ROOTS_JSON must encode at least one absolute root when Electron automation is enabled"));
|
|
18
|
+
const [firstApplicationRoot, ...remainingApplicationRoots] = applicationRoots.value;
|
|
19
|
+
if (firstApplicationRoot === undefined)
|
|
20
|
+
return err(new ConfigurationError("REA_ELECTRON_AUTOMATE_APPLICATION_ROOTS_JSON must encode at least one absolute root when Electron automation is enabled"));
|
|
21
|
+
return ok({
|
|
22
|
+
status: "enabled",
|
|
23
|
+
executableRoots: [firstExecutableRoot, ...remainingExecutableRoots],
|
|
24
|
+
applicationRoots: [firstApplicationRoot, ...remainingApplicationRoots],
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
/** Add the separately permissioned, no-network Electron automation ceiling. */
|
|
28
|
+
export const appendElectronAutomationCeiling = (ceilings, policy) => {
|
|
29
|
+
if (policy.status === "disabled")
|
|
30
|
+
return;
|
|
31
|
+
ceilings.push(permissionScope("electron_automate", policy.applicationRoots, {
|
|
32
|
+
executables: policy.executableRoots,
|
|
33
|
+
network: "external",
|
|
34
|
+
}));
|
|
35
|
+
};
|
|
@@ -44,10 +44,6 @@ const environmentSchema = z
|
|
|
44
44
|
REA_PROCESS_EXECUTABLE_ROOTS_JSON: z.string().default("[]"),
|
|
45
45
|
REA_PROCESS_WORKING_ROOTS_JSON: z.string().default("[]"),
|
|
46
46
|
REA_PROCESS_ALLOWED_ENV_JSON: z.string().default("[]"),
|
|
47
|
-
REA_EVIDENCE_ROOTS_JSON: z.string().default("[]"),
|
|
48
|
-
REA_INVESTIGATION_INPUT_ROOTS_JSON: z.string().default("[]"),
|
|
49
|
-
REA_ANALYSIS_SNAPSHOT_ROOTS_JSON: z.string().default("[]"),
|
|
50
|
-
REA_REFERENCE_ROOTS_JSON: z.string().default("[]"),
|
|
51
47
|
REA_REFERENCE_SECRET_PATTERNS_JSON: z.string().default("[]"),
|
|
52
48
|
REA_BROWSER_OBSERVE_ENABLED: z.enum(["true", "false"]).default("false"),
|
|
53
49
|
REA_BROWSER_CDP_ENDPOINTS_JSON: z.string().default("[]"),
|
|
@@ -59,14 +55,15 @@ const environmentSchema = z
|
|
|
59
55
|
REA_BROWSER_SCENARIO_ALLOWED_ORIGINS_JSON: z.string().default("[]"),
|
|
60
56
|
REA_BROWSER_SCENARIO_ALLOWED_ENV_JSON: z.string().default("[]"),
|
|
61
57
|
REA_ELECTRON_OBSERVE_ENABLED: z.enum(["true", "false"]).default("false"),
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
REA_ELECTRON_AUTOMATE_ENABLED: z.enum(["true", "false"]).default("false"),
|
|
59
|
+
REA_ELECTRON_AUTOMATE_AUTO_GRANT: z
|
|
60
|
+
.enum(["true", "false"])
|
|
61
|
+
.default("false"),
|
|
62
|
+
REA_ELECTRON_AUTOMATE_EXECUTABLE_ROOTS_JSON: z.string().default("[]"),
|
|
63
|
+
REA_ELECTRON_AUTOMATE_APPLICATION_ROOTS_JSON: z.string().default("[]"),
|
|
64
64
|
REA_V8_INSPECTOR_OBSERVE_ENABLED: z
|
|
65
65
|
.enum(["true", "false"])
|
|
66
66
|
.default("false"),
|
|
67
|
-
REA_V8_INSPECTOR_ENDPOINTS_JSON: z.string().default("[]"),
|
|
68
|
-
REA_V8_INSPECTOR_FILE_ROOTS_JSON: z.string().default("[]"),
|
|
69
|
-
REA_V8_INSPECTOR_ALLOWED_ORIGINS_JSON: z.string().default("[]"),
|
|
70
67
|
REA_JAVASCRIPT_REPLAY_ENABLED: z.enum(["true", "false"]).default("false"),
|
|
71
68
|
REA_JAVASCRIPT_REPLAY_ROOTS_JSON: z.string().default("[]"),
|
|
72
69
|
REA_JAVASCRIPT_REPLAY_NODE_PATH: z
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ConfigurationError } from "../domain/errors.js";
|
|
2
|
+
import { err, ok } from "../domain/result.js";
|
|
3
|
+
import { parseAbsoluteRoots } from "./parsers.js";
|
|
4
|
+
import { permissionScope } from "./permissions.js";
|
|
5
|
+
/** Parse controlled replay configuration into disabled or fully enabled state. */
|
|
6
|
+
export const parseJavaScriptReplayPolicy = (env) => {
|
|
7
|
+
const roots = parseAbsoluteRoots(env.REA_JAVASCRIPT_REPLAY_ROOTS_JSON, "REA_JAVASCRIPT_REPLAY_ROOTS_JSON");
|
|
8
|
+
if (!roots.ok)
|
|
9
|
+
return roots;
|
|
10
|
+
if (env.REA_JAVASCRIPT_REPLAY_ENABLED !== "true")
|
|
11
|
+
return ok({ status: "disabled" });
|
|
12
|
+
const [firstRoot, ...remainingRoots] = roots.value;
|
|
13
|
+
if (firstRoot === undefined)
|
|
14
|
+
return err(new ConfigurationError("REA_JAVASCRIPT_REPLAY_ROOTS_JSON must encode at least one absolute root when JavaScript replay is enabled"));
|
|
15
|
+
return ok({
|
|
16
|
+
status: "enabled",
|
|
17
|
+
roots: [firstRoot, ...remainingRoots],
|
|
18
|
+
nodePath: env.REA_JAVASCRIPT_REPLAY_NODE_PATH,
|
|
19
|
+
bubblewrapPath: env.REA_JAVASCRIPT_REPLAY_BWRAP_PATH,
|
|
20
|
+
systemdRunPath: env.REA_JAVASCRIPT_REPLAY_SYSTEMD_RUN_PATH,
|
|
21
|
+
systemctlPath: env.REA_JAVASCRIPT_REPLAY_SYSTEMCTL_PATH,
|
|
22
|
+
shellPath: env.REA_JAVASCRIPT_REPLAY_SHELL_PATH,
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
/** Add the exact controlled replay ceiling when replay is enabled. */
|
|
26
|
+
export const appendJavaScriptReplayCeiling = (ceilings, policy) => {
|
|
27
|
+
if (policy.status === "disabled")
|
|
28
|
+
return;
|
|
29
|
+
ceilings.push(permissionScope("javascript_replay", policy.roots, {
|
|
30
|
+
executables: replayExecutables(policy),
|
|
31
|
+
network: "none",
|
|
32
|
+
mount: true,
|
|
33
|
+
}));
|
|
34
|
+
};
|
|
35
|
+
const replayExecutables = (policy) => [
|
|
36
|
+
policy.nodePath,
|
|
37
|
+
policy.bubblewrapPath,
|
|
38
|
+
policy.systemdRunPath,
|
|
39
|
+
policy.systemctlPath,
|
|
40
|
+
policy.shellPath,
|
|
41
|
+
];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ConfigurationError } from "../domain/errors.js";
|
|
2
|
+
import { err, ok } from "../domain/result.js";
|
|
3
|
+
import { permissionScope } from "./permissions.js";
|
|
4
|
+
/** Parse managed runtime correlation into a closed disabled or enabled policy. */
|
|
5
|
+
export const parseManagedRuntimePolicy = (env, roots) => {
|
|
6
|
+
if (env.REA_MANAGED_RUNTIME_ENABLED !== "true")
|
|
7
|
+
return ok({ status: "disabled" });
|
|
8
|
+
const [firstRoot, ...remainingRoots] = roots;
|
|
9
|
+
if (firstRoot === undefined)
|
|
10
|
+
return err(new ConfigurationError("REA_MANAGED_RUNTIME_ROOTS_JSON must encode at least one absolute root when managed runtime correlation is enabled"));
|
|
11
|
+
return ok({
|
|
12
|
+
status: "enabled",
|
|
13
|
+
roots: [firstRoot, ...remainingRoots],
|
|
14
|
+
executablePath: env.REA_MANAGED_RUNTIME_EXECUTABLE_PATH,
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
/** Add the separately permissioned, no-network managed runtime ceiling. */
|
|
18
|
+
export const appendManagedRuntimeCeiling = (ceilings, policy) => {
|
|
19
|
+
if (policy.status === "disabled")
|
|
20
|
+
return;
|
|
21
|
+
ceilings.push(permissionScope("managed_runtime", policy.roots, {
|
|
22
|
+
executables: [policy.executablePath],
|
|
23
|
+
network: "none",
|
|
24
|
+
}));
|
|
25
|
+
};
|