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
|
@@ -2,9 +2,8 @@ import { constants } from "node:fs";
|
|
|
2
2
|
import { access, readFile, readdir } from "node:fs/promises";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { delimiter, join } from "node:path";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { parseBinaryTarget } from "../domain/binaryTarget.js";
|
|
5
|
+
import { parseBinaryTarget } from "./BinaryTargetResolver.js";
|
|
6
|
+
import { execFileOutput } from "../process/ExecFileOutput.js";
|
|
8
7
|
import { probeHomebrew } from "./homebrew.js";
|
|
9
8
|
import { linuxHopperBinarySupported, linuxSharedLibrariesAvailable, readLinuxDistribution, } from "./LinuxHopper.js";
|
|
10
9
|
import { CATALOG_IDENTITY } from "../catalogIdentity.js";
|
|
@@ -13,7 +12,6 @@ import { readClientRegistrationStatuses, } from "./ClientRegistrationStatus.js";
|
|
|
13
12
|
import { inspectRuntimeExecutables, } from "./RuntimeExecutableDiagnostics.js";
|
|
14
13
|
import { collectDoctorDiagnostics, doctorHealthy, } from "./DoctorDiagnostics.js";
|
|
15
14
|
import { normalizeDoctorScope, scopeDoctorChecks, } from "./DoctorScope.js";
|
|
16
|
-
const execFileAsync = promisify(execFile);
|
|
17
15
|
/** Deep provider IDs whose readiness can be selected explicitly by doctor. */
|
|
18
16
|
export const DOCTOR_PROVIDER_IDS = ["hopper", "ghidra"];
|
|
19
17
|
/**
|
|
@@ -56,14 +54,14 @@ export const runDoctor = async (target, host = systemDoctorHost(), requestedScop
|
|
|
56
54
|
};
|
|
57
55
|
const collectDoctorIdentity = async (host, runtimeExecutables) => {
|
|
58
56
|
const installationPaths = (await host.installationPaths?.()) ?? [];
|
|
59
|
-
const installedSkillIdentity = await
|
|
57
|
+
const installedSkillIdentity = await host.installedSkillIdentity?.();
|
|
60
58
|
const skillAligned = skillIdentityAligned(installedSkillIdentity);
|
|
61
59
|
const registrations = (await host.clientRegistrations?.()) ?? [];
|
|
62
60
|
return {
|
|
63
61
|
checks: [
|
|
64
62
|
...(skillAligned ? [] : [skillIdentityCheck(installedSkillIdentity)]),
|
|
65
63
|
...registrations
|
|
66
|
-
.filter((
|
|
64
|
+
.filter((registration) => registration.state !== "aligned")
|
|
67
65
|
.map(registrationCheck),
|
|
68
66
|
],
|
|
69
67
|
value: {
|
|
@@ -73,7 +71,7 @@ const collectDoctorIdentity = async (host, runtimeExecutables) => {
|
|
|
73
71
|
catalog: CATALOG_IDENTITY,
|
|
74
72
|
live_server: {
|
|
75
73
|
state: "unknown",
|
|
76
|
-
remediation: "
|
|
74
|
+
remediation: "Call binary_session in the active client to inspect the running server identity.",
|
|
77
75
|
},
|
|
78
76
|
installations: {
|
|
79
77
|
paths: installationPaths,
|
|
@@ -97,15 +95,6 @@ const collectDoctorIdentity = async (host, runtimeExecutables) => {
|
|
|
97
95
|
},
|
|
98
96
|
};
|
|
99
97
|
};
|
|
100
|
-
const readInstalledSkillIdentity = async (host) => {
|
|
101
|
-
const observed = await host.installedSkillIdentity?.();
|
|
102
|
-
if (observed !== undefined)
|
|
103
|
-
return observed;
|
|
104
|
-
const legacyVersion = await host.installedSkillVersion?.();
|
|
105
|
-
return legacyVersion === undefined
|
|
106
|
-
? undefined
|
|
107
|
-
: { version: legacyVersion, toolCount: null, catalogDigest: null };
|
|
108
|
-
};
|
|
109
98
|
const skillIdentityAligned = (identity) => identity?.version === PRODUCT_IDENTITY.skillVersion &&
|
|
110
99
|
identity.toolCount === CATALOG_IDENTITY.counts.mcp_tools &&
|
|
111
100
|
identity.catalogDigest === CATALOG_IDENTITY.digests.combined_sha256;
|
|
@@ -123,8 +112,7 @@ const registrationCheck = (registration) => ({
|
|
|
123
112
|
ok: false,
|
|
124
113
|
classification: "config_drift",
|
|
125
114
|
detail: registration.config_path,
|
|
126
|
-
remediation: registration.remediation
|
|
127
|
-
"Run rea setup, then restart the affected client.",
|
|
115
|
+
remediation: registration.remediation,
|
|
128
116
|
});
|
|
129
117
|
const installationState = (paths) => paths.length === 0 ? "unknown" : paths.length === 1 ? "single" : "multiple";
|
|
130
118
|
/** Create diagnostics backed by the current process and host commands. */
|
|
@@ -149,7 +137,7 @@ export const systemDoctorHost = (options = {}) => ({
|
|
|
149
137
|
async brewHopperPath() {
|
|
150
138
|
return probeHomebrew(async (command) => {
|
|
151
139
|
try {
|
|
152
|
-
const prefix = (await
|
|
140
|
+
const prefix = (await execFileOutput(command, [
|
|
153
141
|
"--prefix",
|
|
154
142
|
"--cask",
|
|
155
143
|
"hopper-disassembler",
|
|
@@ -171,7 +159,7 @@ export const systemDoctorHost = (options = {}) => ({
|
|
|
171
159
|
async ilspyCmdVersion(path) {
|
|
172
160
|
try {
|
|
173
161
|
await access(path, constants.X_OK);
|
|
174
|
-
return firstIlspyVersionLine((await
|
|
162
|
+
return firstIlspyVersionLine((await execFileOutput(path, ["--version"], { timeout: 10_000 })).stdout);
|
|
175
163
|
}
|
|
176
164
|
catch {
|
|
177
165
|
return undefined;
|
|
@@ -189,19 +177,18 @@ export const systemDoctorHost = (options = {}) => ({
|
|
|
189
177
|
try {
|
|
190
178
|
const command = process.platform === "win32" ? "where" : "which";
|
|
191
179
|
const arguments_ = process.platform === "win32" ? ["rea"] : ["-a", "rea"];
|
|
192
|
-
return uniqueLines((await
|
|
180
|
+
return uniqueLines((await execFileOutput(command, arguments_)).stdout);
|
|
193
181
|
}
|
|
194
182
|
catch {
|
|
195
183
|
return [];
|
|
196
184
|
}
|
|
197
185
|
},
|
|
198
|
-
installedSkillVersion,
|
|
199
186
|
installedSkillIdentity,
|
|
200
187
|
clientRegistrations: () => readClientRegistrationStatuses(homedir()),
|
|
201
188
|
});
|
|
202
189
|
const readMacosVersion = async () => {
|
|
203
190
|
try {
|
|
204
|
-
return (await
|
|
191
|
+
return (await execFileOutput("sw_vers", ["-productVersion"])).stdout.trim();
|
|
205
192
|
}
|
|
206
193
|
catch {
|
|
207
194
|
return undefined;
|
|
@@ -212,7 +199,7 @@ const executableAvailable = async (path) => {
|
|
|
212
199
|
await access(path, constants.X_OK);
|
|
213
200
|
if (process.platform !== "linux")
|
|
214
201
|
return true;
|
|
215
|
-
const linked = await
|
|
202
|
+
const linked = await execFileOutput("ldd", [path]);
|
|
216
203
|
return linuxSharedLibrariesAvailable(`${linked.stdout}\n${linked.stderr}`);
|
|
217
204
|
}
|
|
218
205
|
catch {
|
|
@@ -242,14 +229,6 @@ const manualHopperPaths = async () => {
|
|
|
242
229
|
return paths;
|
|
243
230
|
};
|
|
244
231
|
const readInstalledSkill = () => readFile(join(homedir(), ".agents/skills", PRODUCT_IDENTITY.skillName, "SKILL.md"), "utf8");
|
|
245
|
-
const installedSkillVersion = async () => {
|
|
246
|
-
try {
|
|
247
|
-
return /^\s{2}version:\s*"([^"]+)"\s*$/mu.exec(await readInstalledSkill())?.[1];
|
|
248
|
-
}
|
|
249
|
-
catch {
|
|
250
|
-
return undefined;
|
|
251
|
-
}
|
|
252
|
-
};
|
|
253
232
|
const installedSkillIdentity = async () => {
|
|
254
233
|
try {
|
|
255
234
|
const content = await readInstalledSkill();
|
|
@@ -70,9 +70,8 @@ const runtimeChecks = (inventory) => {
|
|
|
70
70
|
const detail = broken.length === 0
|
|
71
71
|
? `${String(inventory.candidates.length)} runtime executable candidates passed bounded version probes.`
|
|
72
72
|
: `${String(broken.length)} of ${String(inventory.candidates.length)} runtime executable candidates failed bounded version probes: ${broken
|
|
73
|
-
.slice(0, 5)
|
|
74
73
|
.map(({ lexical_path: path }) => path)
|
|
75
|
-
.join(", ")}
|
|
74
|
+
.join(", ")}`;
|
|
76
75
|
return [
|
|
77
76
|
check("node-toolchains", broken.length === 0, detail, {
|
|
78
77
|
remediation: "Select a verified healthy Node toolchain or repair the failing installation, then rerun rea doctor. Do not create compatibility-library symlinks.",
|
|
@@ -88,7 +88,7 @@ const registrationCheck = (status) => ({
|
|
|
88
88
|
ok: false,
|
|
89
89
|
classification: "config_drift",
|
|
90
90
|
detail: status.config_path,
|
|
91
|
-
remediation: status.remediation
|
|
91
|
+
remediation: status.remediation,
|
|
92
92
|
});
|
|
93
93
|
const selectedSkillCheck = (state, checks) => checks.find(({ name }) => name === "skill:identity") ?? {
|
|
94
94
|
name: "skill:identity",
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createEvidence } from "../domain/evidence.js";
|
|
2
|
+
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
3
|
+
import { digestJson } from "./JavaScriptReplayPlanning.js";
|
|
4
|
+
/** Create Evidence without retaining arbitrary runtime argument values. */
|
|
5
|
+
export const createElectronActiveEvidence = (input, result, provider) => createEvidence(undefined, provider, {
|
|
6
|
+
predicateType: "rea.electron-active-scenario",
|
|
7
|
+
operation: "capture_electron_scenario",
|
|
8
|
+
parameters: parameters(input),
|
|
9
|
+
result: jsonValueSchema.parse(result),
|
|
10
|
+
confidence: "observed",
|
|
11
|
+
authority: "controlled-replay",
|
|
12
|
+
environment: {
|
|
13
|
+
id: `${result.application.electron_version}@${process.platform}`,
|
|
14
|
+
platform: process.platform,
|
|
15
|
+
architecture: process.arch,
|
|
16
|
+
isolation: "none",
|
|
17
|
+
},
|
|
18
|
+
limitations: result.limitations,
|
|
19
|
+
});
|
|
20
|
+
const scenarioProjection = (input) => ({
|
|
21
|
+
executable_path: input.executable_path,
|
|
22
|
+
application_path: input.application_path,
|
|
23
|
+
application_root: input.application_root,
|
|
24
|
+
args: redactArguments(input.args),
|
|
25
|
+
actions: input.actions.map(({ step_id, kind }) => ({ step_id, kind })),
|
|
26
|
+
});
|
|
27
|
+
const parameters = (input) => ({
|
|
28
|
+
...scenarioProjection(input),
|
|
29
|
+
scenario_sha256: digestJson(scenarioProjection(input)),
|
|
30
|
+
});
|
|
31
|
+
const redactArguments = (arguments_) => {
|
|
32
|
+
let redactNext = false;
|
|
33
|
+
return arguments_.map((argument) => {
|
|
34
|
+
if (redactNext) {
|
|
35
|
+
redactNext = false;
|
|
36
|
+
return "<redacted>";
|
|
37
|
+
}
|
|
38
|
+
if (sensitiveFlag.test(argument)) {
|
|
39
|
+
redactNext = true;
|
|
40
|
+
return argument;
|
|
41
|
+
}
|
|
42
|
+
return redactArgument(argument);
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const sensitiveFlag = /^--?(?:password|token|secret|api[-_]?key|authorization|cookie)$/iu;
|
|
46
|
+
const redactArgument = (argument) => {
|
|
47
|
+
if (/^--?(?:password|token|secret|api[-_]?key|authorization|cookie)=/iu.test(argument))
|
|
48
|
+
return `${argument.slice(0, argument.indexOf("=") + 1)}<redacted>`;
|
|
49
|
+
return argument;
|
|
50
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { projectPermissionFailure } from "./PermissionFailure.js";
|
|
2
|
+
import { realpath } from "node:fs/promises";
|
|
3
|
+
import { digestJson } from "./JavaScriptReplayPlanning.js";
|
|
4
|
+
import { AnalysisCapabilityUnavailableError, AnalysisInputError, } from "../domain/errors.js";
|
|
5
|
+
import { isPathContained } from "../domain/permissionPolicy.js";
|
|
6
|
+
import { err } from "../domain/result.js";
|
|
7
|
+
import { createElectronActiveEvidence } from "./ElectronActiveEvidence.js";
|
|
8
|
+
const OPERATION = "capture_electron_scenario";
|
|
9
|
+
const PROVIDER_ID = "rea-playwright-electron-active";
|
|
10
|
+
const canonicalizeInput = async (input) => {
|
|
11
|
+
try {
|
|
12
|
+
const [executablePath, applicationPath, applicationRoot] = await Promise.all([
|
|
13
|
+
realpath(input.executable_path),
|
|
14
|
+
realpath(input.application_path),
|
|
15
|
+
realpath(input.application_root),
|
|
16
|
+
]);
|
|
17
|
+
if (!isPathContained(applicationRoot, applicationPath))
|
|
18
|
+
return err(new AnalysisInputError(OPERATION, undefined, [
|
|
19
|
+
{
|
|
20
|
+
path: ["application_path"],
|
|
21
|
+
reason: "invalid_value",
|
|
22
|
+
message: "application_path must remain beneath application_root after symlink resolution",
|
|
23
|
+
},
|
|
24
|
+
]));
|
|
25
|
+
return {
|
|
26
|
+
ok: true,
|
|
27
|
+
value: {
|
|
28
|
+
...input,
|
|
29
|
+
executable_path: executablePath,
|
|
30
|
+
application_path: applicationPath,
|
|
31
|
+
application_root: applicationRoot,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (cause) {
|
|
36
|
+
return err(new AnalysisInputError(OPERATION, { cause }, [
|
|
37
|
+
{
|
|
38
|
+
path: ["application_path"],
|
|
39
|
+
reason: "invalid_format",
|
|
40
|
+
message: "Electron executable, application, and root must resolve to existing paths",
|
|
41
|
+
},
|
|
42
|
+
]));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const authorize = async (authority, input) => {
|
|
46
|
+
const canonical = await canonicalizeInput(input);
|
|
47
|
+
if (!canonical.ok)
|
|
48
|
+
return canonical;
|
|
49
|
+
if (authority === undefined)
|
|
50
|
+
return err(new AnalysisCapabilityUnavailableError(PROVIDER_ID, OPERATION, "active Electron observation permission policy is not configured"));
|
|
51
|
+
const authorized = await authority.authorize({
|
|
52
|
+
capability: "electron_automate",
|
|
53
|
+
roots: [canonical.value.application_root],
|
|
54
|
+
executables: [canonical.value.executable_path],
|
|
55
|
+
environment_names: [],
|
|
56
|
+
network: "external",
|
|
57
|
+
mount: false,
|
|
58
|
+
operation_identity: `${OPERATION}:${digestJson(canonical.value)}`,
|
|
59
|
+
}, "write");
|
|
60
|
+
if (!authorized.ok)
|
|
61
|
+
return err(projectPermissionFailure(authorized.error));
|
|
62
|
+
return canonical;
|
|
63
|
+
};
|
|
64
|
+
/** Authorize and execute one bounded, provider-owned Electron experiment. */
|
|
65
|
+
export const captureElectronScenario = async (provider, authority, input, options = {}) => {
|
|
66
|
+
const authorized = await authorize(authority, input);
|
|
67
|
+
if (!authorized.ok)
|
|
68
|
+
return authorized;
|
|
69
|
+
if (provider === undefined)
|
|
70
|
+
return err(new AnalysisCapabilityUnavailableError(PROVIDER_ID, OPERATION, "active Electron observation provider is not configured"));
|
|
71
|
+
const captured = await provider.capture(authorized.value, options);
|
|
72
|
+
return captured.ok
|
|
73
|
+
? {
|
|
74
|
+
ok: true,
|
|
75
|
+
value: createElectronActiveEvidence(authorized.value, captured.value, provider.identity()),
|
|
76
|
+
}
|
|
77
|
+
: captured;
|
|
78
|
+
};
|
|
@@ -70,12 +70,13 @@ export const summarizeElectronBoundaries = (analysis) => {
|
|
|
70
70
|
},
|
|
71
71
|
sender_validation_observations: validations.length,
|
|
72
72
|
utility_processes: utilities.length,
|
|
73
|
-
resolved_utility_entrypoints: utilities.filter(({ file, finding }) =>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
resolved_utility_entrypoints: utilities.filter(({ file, finding }) => finding.module_path !== null &&
|
|
74
|
+
resolvesToFile({
|
|
75
|
+
file,
|
|
76
|
+
specifier: finding.module_path,
|
|
77
|
+
context: finding.module_resolution_context,
|
|
78
|
+
files,
|
|
79
|
+
})).length,
|
|
79
80
|
native_addon_bindings: nativeBindings.length,
|
|
80
81
|
resolved_native_addon_bindings: nativeBindings.filter(({ file, finding }) => resolvesToFile({
|
|
81
82
|
file,
|
|
@@ -97,8 +98,6 @@ const isPairableRendererTransmission = (record) => isRendererTransmission(record
|
|
|
97
98
|
const isMainHandler = ({ finding }) => finding.side === "main" &&
|
|
98
99
|
(finding.mode === "listen" || finding.mode === "handle");
|
|
99
100
|
const resolvesToFile = (input) => {
|
|
100
|
-
if (input.specifier === null)
|
|
101
|
-
return false;
|
|
102
101
|
const resolved = resolveArtifactPathByContext({
|
|
103
102
|
declaredPath: input.specifier,
|
|
104
103
|
sourcePath: input.file.path,
|
|
@@ -9,7 +9,7 @@ export const electronObservationIdentity = (context, scope, key) => ({
|
|
|
9
9
|
strategy: "observation-fingerprint",
|
|
10
10
|
stability: "observation-only",
|
|
11
11
|
observation_sha256: sha256Text(`${context.snapshot.manifest.root_sha256}\0${scope}\0${key}`),
|
|
12
|
-
scope
|
|
12
|
+
scope,
|
|
13
13
|
});
|
|
14
14
|
/** Add a direct AST syntax relationship. */
|
|
15
15
|
export const addElectronAstEdge = (context, input) => {
|
|
@@ -96,7 +96,7 @@ const addHandlerNode = (input) => {
|
|
|
96
96
|
const handlerRange = finding.handler_location ?? finding.location;
|
|
97
97
|
const handler = context.accumulator.addNode({
|
|
98
98
|
kind: "ipc-handler",
|
|
99
|
-
identity: artifactLocalIdentity(file.sha256, "electron-ipc-handler", `${finding.side}:${finding.operation}:${finding.channel ?? finding.channel_expression
|
|
99
|
+
identity: artifactLocalIdentity(file.sha256, "electron-ipc-handler", `${finding.side}:${finding.operation}:${finding.channel ?? finding.channel_expression}:${electronRangeKey(handlerRange)}`),
|
|
100
100
|
observations: [
|
|
101
101
|
{
|
|
102
102
|
label: finding.channel,
|
|
@@ -177,7 +177,7 @@ const addValidationObservations = (state) => {
|
|
|
177
177
|
const { file, javascript } = analyzed;
|
|
178
178
|
if (javascript === null)
|
|
179
179
|
continue;
|
|
180
|
-
const coverage = javascriptAnalysisCoverage(javascript
|
|
180
|
+
const coverage = javascriptAnalysisCoverage(javascript);
|
|
181
181
|
for (const validation of javascript.electron.sender_validations) {
|
|
182
182
|
const handlerRecord = containingHandler(state.records, file, validation);
|
|
183
183
|
const target = handlerRecord === undefined
|
|
@@ -238,5 +238,5 @@ const coverageFor = (context, file) => {
|
|
|
238
238
|
const javascript = context.analysis.files.find(({ file: candidate }) => candidate.path === file.path)?.javascript;
|
|
239
239
|
return javascript === null || javascript === undefined
|
|
240
240
|
? undefined
|
|
241
|
-
: javascriptAnalysisCoverage(javascript
|
|
241
|
+
: javascriptAnalysisCoverage(javascript);
|
|
242
242
|
};
|
|
@@ -7,7 +7,7 @@ export const addElectronNativeBoundaries = (context) => {
|
|
|
7
7
|
const { file, javascript } = analyzed;
|
|
8
8
|
if (javascript === null)
|
|
9
9
|
continue;
|
|
10
|
-
const coverage = javascriptAnalysisCoverage(javascript
|
|
10
|
+
const coverage = javascriptAnalysisCoverage(javascript);
|
|
11
11
|
for (const value of javascript.electron.native_addon_bindings)
|
|
12
12
|
addNativeBinding({ context, file, value, coverage });
|
|
13
13
|
}
|
|
@@ -29,7 +29,6 @@ const addNativeBinding = (input) => {
|
|
|
29
29
|
specifier: value.specifier,
|
|
30
30
|
binding_kind: value.binding_kind,
|
|
31
31
|
requested_members: value.members,
|
|
32
|
-
members_truncated: value.members_truncated,
|
|
33
32
|
resolved_path: resolved,
|
|
34
33
|
native_export_verification: "not-performed",
|
|
35
34
|
},
|
|
@@ -8,7 +8,7 @@ export const addElectronWindowBoundaries = (context) => {
|
|
|
8
8
|
const { file, javascript } = analyzed;
|
|
9
9
|
if (javascript === null)
|
|
10
10
|
continue;
|
|
11
|
-
const coverage = javascriptAnalysisCoverage(javascript
|
|
11
|
+
const coverage = javascriptAnalysisCoverage(javascript);
|
|
12
12
|
for (const value of javascript.electron.browser_windows) {
|
|
13
13
|
const source = electronFindingSourceNode(context, file, value.module_key);
|
|
14
14
|
if (source !== undefined)
|
|
@@ -39,7 +39,6 @@ const addBrowserWindow = (input) => {
|
|
|
39
39
|
options_status: value.options_status,
|
|
40
40
|
web_preferences_status: value.web_preferences_status,
|
|
41
41
|
web_preferences: value.web_preferences,
|
|
42
|
-
omitted_web_preferences: value.omitted_web_preferences,
|
|
43
42
|
preload_path: value.preload_path,
|
|
44
43
|
preload_resolution_context: value.preload_resolution_context,
|
|
45
44
|
absence_means_default: false,
|
|
@@ -70,13 +69,13 @@ const addBrowserWindow = (input) => {
|
|
|
70
69
|
addWindowPreload(input, window);
|
|
71
70
|
};
|
|
72
71
|
const addWindowPreload = (input, window) => {
|
|
73
|
-
|
|
74
|
-
if (declared === null)
|
|
72
|
+
if (input.value.preload_path === null)
|
|
75
73
|
return;
|
|
74
|
+
const { preload_path: declared, preload_resolution_context: resolutionContext, } = input.value;
|
|
76
75
|
const resolution = resolveArtifactPathByContext({
|
|
77
76
|
declaredPath: declared,
|
|
78
77
|
sourcePath: input.file.path,
|
|
79
|
-
context:
|
|
78
|
+
context: resolutionContext,
|
|
80
79
|
files: input.context.filesByPath,
|
|
81
80
|
});
|
|
82
81
|
const role = createElectronRoleNode(input.context, {
|
|
@@ -127,7 +126,6 @@ const addContextBridge = (input) => {
|
|
|
127
126
|
api_status: value.api_status,
|
|
128
127
|
members: value.members,
|
|
129
128
|
unknown_members: value.unknown_members,
|
|
130
|
-
omitted_members: value.omitted_members,
|
|
131
129
|
},
|
|
132
130
|
evidence: astObservationEvidence({
|
|
133
131
|
sha256: file.sha256,
|
|
@@ -158,7 +156,7 @@ const addUtilityProcess = (input) => {
|
|
|
158
156
|
const { context, file, value, coverage } = input;
|
|
159
157
|
const utility = context.accumulator.addNode({
|
|
160
158
|
kind: "electron-utility",
|
|
161
|
-
identity: artifactLocalIdentity(file.sha256, "electron-utility-process", `${value.module_path ?? value.module_expression
|
|
159
|
+
identity: artifactLocalIdentity(file.sha256, "electron-utility-process", `${value.module_path ?? value.module_expression}:${electronRangeKey(value.location)}`),
|
|
162
160
|
observations: [
|
|
163
161
|
{
|
|
164
162
|
label: value.service_name ?? value.module_path,
|
|
@@ -196,7 +194,7 @@ const addUtilityProcess = (input) => {
|
|
|
196
194
|
const resolution = resolveArtifactPathByContext({
|
|
197
195
|
declaredPath: value.module_path,
|
|
198
196
|
sourcePath: file.path,
|
|
199
|
-
context: value.module_resolution_context
|
|
197
|
+
context: value.module_resolution_context,
|
|
200
198
|
files: context.filesByPath,
|
|
201
199
|
});
|
|
202
200
|
const resolved = resolution.resolved_path;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createEvidence, } from "../domain/evidence.js";
|
|
2
2
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
3
|
-
/** Create Evidence
|
|
3
|
+
/** Create Evidence for one Electron observation. */
|
|
4
4
|
export const createElectronEvidence = (operation, input, result, provider) => createEvidence(undefined, provider, {
|
|
5
5
|
predicateType: operation === "list_electron_targets"
|
|
6
|
-
? "rea.electron-target-list
|
|
7
|
-
: "rea.electron-page-inspection
|
|
6
|
+
? "rea.electron-target-list"
|
|
7
|
+
: "rea.electron-page-inspection",
|
|
8
8
|
operation,
|
|
9
9
|
parameters: parameters(input),
|
|
10
10
|
result: jsonValueSchema.parse(result),
|
|
@@ -22,14 +22,11 @@ export const createElectronEvidence = (operation, input, result, provider) => cr
|
|
|
22
22
|
});
|
|
23
23
|
const parameters = (input) => ({
|
|
24
24
|
cdp_endpoint: input.cdp_endpoint,
|
|
25
|
-
allowed_file_roots: input.allowed_file_roots,
|
|
26
25
|
...("target_id" in input
|
|
27
26
|
? {
|
|
28
27
|
target_id: input.target_id,
|
|
29
28
|
observation_ms: input.observation_ms,
|
|
30
29
|
include_script_sources: input.include_script_sources,
|
|
31
|
-
source_capture_approved: input.source_capture_approved,
|
|
32
|
-
limits: input.limits,
|
|
33
30
|
}
|
|
34
|
-
: {
|
|
31
|
+
: {}),
|
|
35
32
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { projectPermissionFailure } from "./PermissionFailure.js";
|
|
2
|
+
import { AnalysisCapabilityUnavailableError, } from "../domain/errors.js";
|
|
2
3
|
import { err, ok } from "../domain/result.js";
|
|
3
4
|
import { createElectronEvidence } from "./ElectronEvidence.js";
|
|
4
|
-
/** Authorize and list
|
|
5
|
+
/** Authorize and list Electron file pages exposed by the selected endpoint. */
|
|
5
6
|
export const listElectronTargets = async (provider, authority, input, options = {}) => {
|
|
6
7
|
const ready = await prepare(provider, authority, input, "list_electron_targets");
|
|
7
8
|
if (!ready.ok)
|
|
@@ -26,20 +27,15 @@ const prepare = async (provider, authority, input, operation) => {
|
|
|
26
27
|
return err(new AnalysisCapabilityUnavailableError("rea-cdp-electron", operation, "Electron observation permission policy is not configured"));
|
|
27
28
|
const authorized = await authority.authorize({
|
|
28
29
|
capability: "electron_observe",
|
|
29
|
-
roots:
|
|
30
|
+
roots: [],
|
|
30
31
|
executables: [],
|
|
31
32
|
environment_names: [],
|
|
32
|
-
origins: [input.cdp_endpoint],
|
|
33
33
|
network: "loopback",
|
|
34
34
|
mount: false,
|
|
35
35
|
operation_identity: `${operation}:${"target_id" in input ? input.target_id : input.cdp_endpoint}`,
|
|
36
36
|
}, "read");
|
|
37
37
|
if (!authorized.ok)
|
|
38
|
-
return err(authorized.error
|
|
39
|
-
? authorized.error
|
|
40
|
-
: new AnalysisProtocolError(authorized.error.message, {
|
|
41
|
-
cause: authorized.error,
|
|
42
|
-
}));
|
|
38
|
+
return err(projectPermissionFailure(authorized.error));
|
|
43
39
|
return provider === undefined
|
|
44
40
|
? err(new AnalysisCapabilityUnavailableError("rea-cdp-electron", operation, "Electron observation provider is not configured"))
|
|
45
41
|
: ok(provider);
|
|
@@ -1,86 +1,78 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { AnalysisOutputError } from "../domain/errors.js";
|
|
2
|
-
import { parseAddressedPage } from "../domain/hopperValues.js";
|
|
3
3
|
import { err, ok } from "../domain/result.js";
|
|
4
4
|
const FEATURE_SEARCH_SOURCES = [
|
|
5
|
-
["
|
|
6
|
-
["
|
|
5
|
+
["search_strings", "string"],
|
|
6
|
+
["search_procedures", "procedure"],
|
|
7
7
|
];
|
|
8
8
|
const STRING_SEARCH_SOURCES = [
|
|
9
|
-
["
|
|
9
|
+
["search_strings", "string"],
|
|
10
10
|
];
|
|
11
|
-
/** Trace
|
|
11
|
+
/** Trace every matching feature or string literal through provider xrefs. */
|
|
12
12
|
export const traceLiteralFeature = async (call, input, scope, signal) => {
|
|
13
13
|
const sources = scope === "feature" ? FEATURE_SEARCH_SOURCES : STRING_SEARCH_SOURCES;
|
|
14
14
|
const searched = await literalMatches(call, input, sources, signal);
|
|
15
15
|
if (!searched.ok)
|
|
16
16
|
return searched;
|
|
17
|
-
const residual = new Set();
|
|
18
17
|
const traced = await traceReferences(call, {
|
|
19
18
|
matches: searched.value.matches,
|
|
20
|
-
limit: input.limit,
|
|
21
|
-
operationBudget: input.max_operations - searched.value.operations,
|
|
22
19
|
...(signal === undefined ? {} : { signal }),
|
|
23
20
|
});
|
|
24
21
|
if (!traced.ok)
|
|
25
22
|
return traced;
|
|
26
|
-
for (const reason of traced.value.residual)
|
|
27
|
-
residual.add(reason);
|
|
28
|
-
const operations = searched.value.operations + traced.value.operations;
|
|
29
|
-
if (operations >= input.max_operations)
|
|
30
|
-
residual.add("Investigation reached the operation budget.");
|
|
31
|
-
if (searched.value.matches.length >= input.limit)
|
|
32
|
-
residual.add("Literal matches reached the configured limit.");
|
|
33
23
|
return ok({
|
|
34
24
|
query: input.query,
|
|
35
25
|
search_mode: "literal",
|
|
36
|
-
operations_used: operations,
|
|
37
|
-
operation_budget: input.max_operations,
|
|
38
26
|
matches: searched.value.matches,
|
|
39
27
|
references: traced.value.references,
|
|
40
|
-
truncated:
|
|
41
|
-
residual_unknowns: [
|
|
28
|
+
truncated: false,
|
|
29
|
+
residual_unknowns: [],
|
|
42
30
|
});
|
|
43
31
|
};
|
|
44
32
|
const literalMatches = async (call, input, sources, signal) => {
|
|
45
|
-
let operations = 0;
|
|
46
33
|
const matches = [];
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
34
|
+
const needles = [...new Set(input.query.trim().split(/\s+/u))];
|
|
35
|
+
const matched = new Set();
|
|
36
|
+
for (const needle of needles) {
|
|
37
|
+
for (const [tool, type] of sources) {
|
|
38
|
+
const result = await call(tool, {
|
|
39
|
+
pattern: needle,
|
|
40
|
+
mode: "literal",
|
|
41
|
+
case_sensitive: input.case_sensitive,
|
|
42
|
+
}, signal);
|
|
53
43
|
if (!result.ok)
|
|
54
44
|
return result;
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
offset = page.value.nextOffset;
|
|
45
|
+
const items = z
|
|
46
|
+
.array(z.object({ address: z.string(), value: z.string() }))
|
|
47
|
+
.safeParse(result.value);
|
|
48
|
+
if (!items.success)
|
|
49
|
+
return err(new AnalysisOutputError(tool, "provider returned an invalid search result"));
|
|
50
|
+
addPageMatches({
|
|
51
|
+
items: items.data.map(({ address, value: name }) => ({
|
|
52
|
+
address,
|
|
53
|
+
name,
|
|
54
|
+
})),
|
|
55
|
+
type,
|
|
56
|
+
matches,
|
|
57
|
+
matched,
|
|
58
|
+
});
|
|
70
59
|
}
|
|
71
60
|
}
|
|
72
|
-
return ok({ matches
|
|
61
|
+
return ok({ matches });
|
|
62
|
+
};
|
|
63
|
+
const addPageMatches = (input) => {
|
|
64
|
+
const { items, type, matches, matched } = input;
|
|
65
|
+
for (const item of items) {
|
|
66
|
+
const key = `${type}\u0000${item.address}`;
|
|
67
|
+
if (matched.has(key))
|
|
68
|
+
continue;
|
|
69
|
+
matches.push({ type, address: item.address, value: item.name });
|
|
70
|
+
matched.add(key);
|
|
71
|
+
}
|
|
73
72
|
};
|
|
74
73
|
const traceReferences = async (call, request) => {
|
|
75
|
-
let operations = 0;
|
|
76
74
|
const references = [];
|
|
77
|
-
const residual = new Set();
|
|
78
75
|
for (const match of request.matches) {
|
|
79
|
-
if (operations >= request.operationBudget) {
|
|
80
|
-
residual.add("Reference traversal stopped at the operation budget.");
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
operations += 1;
|
|
84
76
|
const xrefs = await call("xrefs", { address: match.address }, request.signal);
|
|
85
77
|
if (!xrefs.ok)
|
|
86
78
|
return xrefs;
|
|
@@ -89,11 +81,6 @@ const traceReferences = async (call, request) => {
|
|
|
89
81
|
for (const source of xrefs.value) {
|
|
90
82
|
if (typeof source !== "string")
|
|
91
83
|
return err(new AnalysisOutputError("xrefs", "provider returned a non-address value"));
|
|
92
|
-
if (operations >= request.operationBudget) {
|
|
93
|
-
residual.add("Containing-procedure resolution stopped at the operation budget.");
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
operations += 1;
|
|
97
84
|
const resolved = await call("resolve_containing_procedure", { address: source }, request.signal);
|
|
98
85
|
if (!resolved.ok)
|
|
99
86
|
return resolved;
|
|
@@ -102,17 +89,7 @@ const traceReferences = async (call, request) => {
|
|
|
102
89
|
source_address: source,
|
|
103
90
|
containing_procedure: resolved.value,
|
|
104
91
|
});
|
|
105
|
-
if (references.length >= request.limit) {
|
|
106
|
-
residual.add("Reference results reached the configured limit.");
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
92
|
}
|
|
110
|
-
if (references.length >= request.limit)
|
|
111
|
-
break;
|
|
112
93
|
}
|
|
113
|
-
return ok({
|
|
114
|
-
references,
|
|
115
|
-
operations,
|
|
116
|
-
residual: [...residual],
|
|
117
|
-
});
|
|
94
|
+
return ok({ references });
|
|
118
95
|
};
|