rea-agents 6.5.0 → 6.7.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 +12 -3
- package/THIRD_PARTY_NOTICES.md +1 -0
- package/bridge/android/ReaJadxBridge.java +167 -23
- package/bridge/cutter/rea_bridge.py +19 -10
- package/bridge/ghidra/ReaGhidraBridge.java +98 -66
- package/bridge/hopper_bridge.py +9 -1
- package/bridge/native/rea_lldb_tracer.py +48 -4
- package/bridge/pwndbg/core_context.py +15 -2
- package/dist/adb/AdbCommand.js +148 -0
- package/dist/adb/AdbConfiguration.js +26 -4
- package/dist/adb/AdbInputSnapshot.js +126 -0
- package/dist/adb/AdbProvider.js +765 -248
- package/dist/adb/AdbShellOutput.js +92 -21
- package/dist/android/AndroidTargetSnapshot.js +7 -7
- package/dist/android/JadxAnalysis.js +27 -32
- package/dist/android/JadxConfiguration.js +173 -125
- package/dist/android/JadxDoctor.js +11 -3
- package/dist/android/JadxFailure.js +154 -0
- package/dist/android/JadxInterruption.js +13 -0
- package/dist/android/JadxJavaProbe.js +246 -0
- package/dist/android/JadxMcpTransport.js +48 -15
- package/dist/android/JadxProtocol.js +29 -2
- package/dist/android/JadxProvider.js +171 -96
- package/dist/android/JadxRelease.js +5 -1
- package/dist/android/JadxSession.js +35 -14
- package/dist/apktool/ApktoolCommandCleanup.js +134 -0
- package/dist/apktool/ApktoolCommandOutput.js +22 -0
- package/dist/apktool/ApktoolConfiguration.js +162 -44
- package/dist/apktool/ApktoolDecodeOutput.js +29 -23
- package/dist/apktool/ApktoolDecodedInventory.js +52 -0
- package/dist/apktool/ApktoolProvider.js +254 -335
- package/dist/apktool/ApktoolStringTables.js +178 -0
- package/dist/apktool/ApktoolWorkspace.js +162 -0
- package/dist/application/AnalysisDocument.js +19 -4
- package/dist/application/AnalysisProvider.js +15 -1
- package/dist/application/AppBundleExecutable.js +11 -4
- package/dist/application/BinaryTargetResolver.js +9 -2
- package/dist/application/BrowserObservationService.js +54 -20
- package/dist/application/BrowserScenarioCaptureService.js +26 -6
- package/dist/application/CapabilityInventory.js +14 -8
- package/dist/application/ClaudeDesktopConfigLocation.js +5 -5
- package/dist/application/ClientConfigurationCleanup.js +73 -0
- package/dist/application/ClientConfigurationDocument.js +170 -128
- package/dist/application/ClientConfigurationPublication.js +167 -0
- package/dist/application/ClientRegistrationEnvironment.js +31 -1
- package/dist/application/ClientRegistrationIdentity.js +54 -39
- package/dist/application/ClientRegistrationStatus.js +123 -48
- package/dist/application/DirectAnalysis.js +15 -2
- package/dist/application/DirectAnalysisCleanup.js +5 -1
- package/dist/application/DirectAnalysisStatus.js +1 -1
- package/dist/application/Doctor.js +83 -9
- package/dist/application/DoctorDiagnostics.js +25 -4
- package/dist/application/DoctorProviderIds.js +7 -1
- package/dist/application/DshCordisPatch.js +1 -1
- package/dist/application/EnhancedTools.js +9 -21
- package/dist/application/HermesClientHome.js +20 -0
- package/dist/application/HermesConfigurationYaml.js +43 -3
- package/dist/application/HopperDownload.js +11 -3
- package/dist/application/HopperReleaseFeed.js +71 -0
- package/dist/application/InvestigationProviders.js +4 -3
- package/dist/application/JsonFiles.js +1 -1
- package/dist/application/LinuxHopper.js +96 -71
- package/dist/application/LinuxHopperPublisher.js +656 -0
- package/dist/application/MacHopper.js +182 -66
- package/dist/application/MipsElfMetadata.js +1 -1
- package/dist/application/MsixPackageStorage.js +13 -6
- package/dist/application/ProviderOperationExecution.js +13 -20
- package/dist/application/ReconstructionObligationCandidates.js +17 -2
- package/dist/application/ReconstructionObligationLedgerEvaluation.js +4 -0
- package/dist/application/ReconstructionObligationLedgerService.js +5 -3
- package/dist/application/ReconstructionObligationOriginalCases.js +8 -0
- package/dist/application/ReferenceSourceImportEntries.js +160 -18
- package/dist/application/ReferenceSourceImportPolicy.js +5 -3
- package/dist/application/ReferenceSourceVcsAdapter.js +3 -1
- package/dist/application/RegularFileRead.js +107 -88
- package/dist/application/Setup.js +23 -11
- package/dist/application/SetupClientConfiguration.js +155 -89
- package/dist/application/SetupClients.js +22 -13
- package/dist/application/SetupHost.js +90 -34
- package/dist/application/SetupInstallFailure.js +18 -3
- package/dist/application/SetupPlan.js +15 -5
- package/dist/application/SetupRecoveryBackup.js +40 -13
- package/dist/application/SetupRegistrationEnvironment.js +12 -0
- package/dist/application/SetupSkill.js +10 -30
- package/dist/application/SourceLimitations.js +35 -0
- package/dist/application/SupportedClients.js +4 -4
- package/dist/application/Uninstall.js +91 -36
- package/dist/application/UpdateCommandProgress.js +66 -0
- package/dist/application/UpdateMaintenance.js +7 -2
- package/dist/application/UpdateRuntime.js +60 -30
- package/dist/application/WebModuleTraceService.js +35 -22
- package/dist/application/WebNetworkCaptureService.js +8 -5
- package/dist/application/WebRuntimeService.js +41 -8
- package/dist/application/WebScriptExportService.js +6 -4
- package/dist/application/WebSourceLocationService.js +3 -4
- package/dist/application/WorkflowEvidence.js +11 -4
- package/dist/application/analysisView/AnalysisViewService.js +9 -52
- package/dist/application/android/AndroidAnalysisService.js +5 -4
- package/dist/application/android/AndroidSearchEvidenceSummary.js +6 -8
- package/dist/application/artifacts/ArtifactComparisonEvidence.js +32 -0
- package/dist/application/binary/AnalysisProviderEvaluation.js +14 -11
- package/dist/application/binary/AnalysisProviderRegistry.js +340 -50
- package/dist/application/binary/BinarySession.js +73 -34
- package/dist/application/binary/BinarySessionRecords.js +3 -0
- package/dist/application/binary/BinarySessionStatus.js +3 -4
- package/dist/application/binary/CompositeProvider.js +75 -30
- package/dist/application/binary/LazyAnalysisProvider.js +6 -68
- package/dist/application/binary/SessionProviderRouter.js +11 -2
- package/dist/application/binaryDiagnostics/BinaryLayoutService.js +3 -4
- package/dist/application/binaryDiagnostics/PeResourcesService.js +22 -5
- package/dist/application/binaryDiagnostics/RecordedCrashService.js +3 -4
- package/dist/application/captures/PacketCaptureService.js +3 -2
- package/dist/application/closeOwnedWebResources.js +32 -2
- package/dist/application/electron/ElectronFuseService.js +8 -43
- package/dist/application/evm/EvmInterfaceEvidence.js +11 -0
- package/dist/application/evm/EvmInterfaceService.js +4 -15
- package/dist/application/firmware/FirmwareAnalysisService.js +4 -3
- package/dist/application/go/GoBinaryService.js +4 -5
- package/dist/application/investigation/EvidenceLedger.js +3 -4
- package/dist/application/javascript/ElectronBoundaryGraphWindows.js +14 -2
- package/dist/application/javascript/ElectronEvidence.js +1 -2
- package/dist/application/javascript/ElectronObservationService.js +41 -7
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +6 -0
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +35 -17
- package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +30 -1
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +3 -2
- package/dist/application/javascript/JavaScriptArtifactGraphEvidence.js +3 -3
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +41 -11
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +18 -8
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +84 -24
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +15 -3
- package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
- package/dist/application/javascript/JavaScriptRuntimeObservationEvidence.js +1 -2
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +33 -10
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +103 -24
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +13 -4
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +23 -3
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +18 -5
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +4 -6
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +5 -8
- package/dist/application/native/NativeCallRoutes.js +40 -23
- package/dist/application/native/NativeUiActionTrace.js +8 -0
- package/dist/application/native/NativeValueTrace.js +8 -0
- package/dist/application/reverse/ReverseEngineeringService.js +2 -2
- package/dist/application/rust/RustBinaryService.js +6 -4
- package/dist/application/signals/SignalRecordingService.js +3 -2
- package/dist/application/wasm/WasmArtifactService.js +4 -5
- package/dist/artifacts/AnalysisCleanupLease.js +119 -0
- package/dist/artifacts/ArtifactFileOperation.js +150 -0
- package/dist/artifacts/ArtifactHash.js +2 -1
- package/dist/artifacts/ArtifactProvider.js +16 -5
- package/dist/artifacts/ArtifactReader.js +50 -4
- package/dist/artifacts/ArtifactResourceScope.js +80 -6
- package/dist/artifacts/AsarArtifactReader.js +12 -11
- package/dist/artifacts/AsarEntryStream.js +49 -17
- package/dist/artifacts/DirectoryArtifactReader.js +28 -7
- package/dist/artifacts/MachOSliceArtifactReader.js +70 -13
- package/dist/artifacts/NativeDmgArtifactReader.js +112 -13
- package/dist/artifacts/SafeOutputTree.js +5 -3
- package/dist/artifacts/SafeOutputTreeCreationFailure.js +1 -0
- package/dist/artifacts/SafeOutputTreeReadback.js +10 -16
- package/dist/artifacts/ZipArtifactReader.js +34 -14
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +3 -1
- package/dist/artifacts/apple/DylibFileAccess.js +106 -0
- package/dist/artifacts/apple/DylibResolutionReader.js +64 -155
- package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +52 -9
- package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +25 -24
- package/dist/artifacts/apple/KeyedArchiveReader.js +20 -11
- package/dist/artifacts/apple/MachoLoadCommandReader.js +17 -2
- package/dist/artifacts/apple/PlistNumberLiterals.js +104 -116
- package/dist/artifacts/extraction/ArtifactExtraction.js +15 -12
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +9 -11
- package/dist/artifacts/inventory/ArtifactInventory.js +2 -2
- package/dist/artifacts/inventory/classify.js +4 -2
- package/dist/artifacts/inventory/hashStableRootArtifact.js +14 -7
- package/dist/artifacts/inventory/scanCanonical.js +3 -4
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +3 -1
- package/dist/artifacts/readArtifactFileChunks.js +9 -0
- package/dist/artifacts/readStableArtifact.js +12 -34
- package/dist/browser/BrowserScenarioPartialObservation.js +14 -48
- package/dist/browser/CdpBrowserProvider.js +81 -30
- package/dist/browser/CdpCaptureDocuments.js +99 -131
- package/dist/browser/CdpCaptureDomSvg.js +31 -60
- package/dist/browser/CdpCaptureValues.js +12 -0
- package/dist/browser/CdpConnection.js +133 -27
- package/dist/browser/CdpElectronInspection.js +60 -60
- package/dist/browser/CdpElectronProvider.js +56 -4
- package/dist/browser/CdpElectronScriptEvents.js +4 -1
- package/dist/browser/CdpElectronScripts.js +2 -5
- package/dist/browser/CdpElectronWorkers.js +13 -2
- package/dist/browser/CdpPageCapture.js +2 -1
- package/dist/browser/CdpPageCaptureScripts.js +14 -10
- package/dist/browser/CdpPageCaptureWorkers.js +45 -14
- package/dist/browser/CdpSafeMetadata.js +23 -19
- package/dist/browser/CdpSnapshotNodes.js +103 -0
- package/dist/browser/CdpSnapshotStrings.js +0 -6
- package/dist/browser/CdpTargetSession.js +52 -10
- package/dist/browser/CdpTargetSessionOwner.js +198 -0
- package/dist/browser/ElectronCaptureCleanup.js +82 -0
- package/dist/browser/ElectronProcessCleanup.js +91 -0
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +71 -16
- package/dist/browser/PlaywrightElectronActiveActions.js +53 -5
- package/dist/browser/PlaywrightElectronActiveFuses.js +86 -0
- package/dist/browser/PlaywrightElectronActiveProjection.js +5 -0
- package/dist/browser/PlaywrightElectronActiveProvider.js +140 -151
- package/dist/browser/PlaywrightExecutionBoundary.js +4 -2
- package/dist/browser/PlaywrightScenarioBrowser.js +236 -90
- package/dist/browser/PlaywrightScenarioEvents.js +135 -48
- package/dist/browser/PlaywrightScenarioServiceWorkers.js +121 -34
- package/dist/browser/PlaywrightScenarioSession.js +95 -22
- package/dist/browser/PlaywrightScenarioStorage.js +15 -7
- package/dist/browser/StructuredFieldToken.js +53 -0
- package/dist/browser/WebArtifactCleanup.js +53 -0
- package/dist/browser/WebSourceMapFetcher.js +19 -10
- package/dist/browser/assets/WebArtifactReads.js +6 -2
- package/dist/browser/assets/WebSourceLocationArtifacts.js +12 -3
- package/dist/browser/execution/CdpRuntimeSession.js +36 -7
- package/dist/browser/execution/CdpWebRuntimeProvider.js +22 -4
- package/dist/browser/history/CaptureFailures.js +7 -2
- package/dist/browser/history/HarCapture.js +42 -11
- package/dist/browser/history/SazMetadata.js +10 -47
- package/dist/browser/modules/NativeModuleResolver.js +108 -58
- package/dist/browser/modules/WebModuleArtifacts.js +12 -3
- package/dist/browser/network/PlaywrightNetworkContent.js +40 -17
- package/dist/browser/network/PlaywrightScenarioNetwork.js +182 -73
- package/dist/captures/TsharkCaptureProvider.js +13 -6
- package/dist/catalogIdentity.js +19 -14
- package/dist/cli/adbCommands.js +18 -19
- package/dist/cli/androidCommands.js +2 -14
- package/dist/cli/apktoolCommands.js +4 -14
- package/dist/cli/binaryDiagnosticsCommands.js +5 -5
- package/dist/cli/browserAdvancedCommands.js +11 -4
- package/dist/cli/browserCommands.js +21 -12
- package/dist/cli/captureCommands.js +4 -4
- package/dist/cli/cliResultOutput.js +175 -89
- package/dist/cli/coreBinaryCommands.js +4 -3
- package/dist/cli/cutterCommands.js +51 -13
- package/dist/cli/electronCommands.js +34 -13
- package/dist/cli/evmCommands.js +6 -15
- package/dist/cli/finishAnalysisCommand.js +10 -2
- package/dist/cli/firmwareCommands.js +6 -14
- package/dist/cli/flutterCommands.js +2 -18
- package/dist/cli/fridaCommands.js +8 -0
- package/dist/cli/goCommands.js +2 -2
- package/dist/cli/javascriptRecoveryCommands.js +14 -26
- package/dist/cli/jebCommands.js +2 -14
- package/dist/cli/options.js +6 -0
- package/dist/cli/pcapCommands.js +2 -20
- package/dist/cli/rustCommands.js +6 -7
- package/dist/cli/setupCommands.js +4 -3
- package/dist/cli/signalCommands.js +4 -4
- package/dist/cli/sqliteCommands.js +17 -44
- package/dist/cli/wasmCommands.js +7 -18
- package/dist/cli/webModuleCommands.js +19 -34
- package/dist/cli/webNetworkCaptureCommands.js +3 -2
- package/dist/cli/webRuntimeCommands.js +15 -6
- package/dist/cli/webSourceLocationCommands.js +14 -33
- package/dist/cli-runtime/AnalysisCleanupLease-CWfTGYKd.js +103 -0
- package/dist/cli-runtime/{AnalysisProvider-D0Us2OTk.js → AnalysisProvider-BGrYaMVo.js} +14 -3
- package/dist/cli-runtime/{AnalysisSnapshotCache-BXS0wRd2.js → AnalysisSnapshotCache-BjRlXeUS.js} +14 -13
- package/dist/cli-runtime/ArtifactFileOperation-Dg4BcoEM.js +122 -0
- package/dist/cli-runtime/{ArtifactReader-BXkffc1D.js → ArtifactReader-DMwm42bk.js} +29 -6
- package/dist/cli-runtime/ArtifactResourceScope-CokZGcII.js +175 -0
- package/dist/cli-runtime/{AsarHeader-CnzOzYEH.js → AsarHeader-BxwU17DJ.js} +1 -1
- package/dist/cli-runtime/{BinarySessionStatus-DnMxMk-r.js → BinarySessionStatus-DRhjr7Vb.js} +4 -3
- package/dist/cli-runtime/{BinaryTargetResolver-CVIJ_s1A.js → BinaryTargetResolver-tuCTjBlQ.js} +38 -108
- package/dist/cli-runtime/{BoundedFileBytes-BU30odTm.js → BoundedFileBytes-DRtiQNAQ.js} +7 -3
- package/dist/cli-runtime/{CdpTargetSession-DGX5pV9w.js → CdpTargetSession-CQ08KHbh.js} +318 -43
- package/dist/cli-runtime/ClientConfigPath-Dn-V_GUf.js +255 -0
- package/dist/cli-runtime/{ClientConfigurationDocument-ffQ9X0Se.js → ClientConfigurationDocument-C9T8MNGc.js} +206 -142
- package/dist/cli-runtime/{ClientRegistrationStatus-DszCyPEU.js → ClientRegistrationStatus-PnD29RTX.js} +112 -36
- package/dist/cli-runtime/{CurrentEntrypointPath-D5FRNdkq.js → CurrentEntrypointPath-m7QCIVN0.js} +1 -1
- package/dist/cli-runtime/{DirectAnalysis-BgvAtpN3.js → DirectAnalysis-C5NyUryV.js} +76 -23
- package/dist/cli-runtime/DirectoryArtifactReader-CokAJ8vo.js +448 -0
- package/dist/cli-runtime/{Doctor-DIpf_I7N.js → Doctor-DrkWsav4.js} +105 -25
- package/dist/cli-runtime/{ElectronFileScope-dpHm2nrS.js → ElectronFileScope-AP7VoVr7.js} +204 -149
- package/dist/cli-runtime/ElectronFuseFailures-DsjXR7Xp.js +609 -0
- package/dist/cli-runtime/{ExecFileOutput-BEQs-lDD.js → ExecFileOutput-D6KLYTve.js} +11 -9
- package/dist/cli-runtime/{InterfaceBuilderDecodeBudget-D4omRUe4.js → InterfaceBuilderDecodeBudget-CW1IO3dG.js} +40 -21
- package/dist/cli-runtime/{InventoryProjectionEvidence-DIsI4DJ6.js → InventoryProjectionEvidence-DTH5QAqL.js} +3 -3
- package/dist/cli-runtime/{InvestigationProviders-DoQRIHii.js → InvestigationProviders-CFh4a64d.js} +3 -2
- package/dist/cli-runtime/{JavaScriptApplicationEvidenceGraph-D5aI_FSJ.js → JavaScriptApplicationEvidenceGraph-gOmPB2L6.js} +6 -6
- package/dist/cli-runtime/{JavaScriptApplicationWorkflowEvidence-Bz4-V0Ct.js → JavaScriptApplicationWorkflowEvidence-WZgtK_Ok.js} +2 -2
- package/dist/cli-runtime/JebMcpEndpoint-BEalGZh9.js +710 -0
- package/dist/cli-runtime/{JsonFiles-DQa1PRKy.js → JsonFiles-uvd6ZyQi.js} +10 -118
- package/dist/cli-runtime/KunaInstallation-P0j3x851.js +1781 -0
- package/dist/cli-runtime/MacHopperPaths-bGzqjF1Z.js +34 -0
- package/dist/cli-runtime/{MachoLoadCommandReader-C7e074Ze.js → MachoLoadCommandReader-CZm6N5vF.js} +12 -192
- package/dist/cli-runtime/{ManagedSnapshot-rqyBHcdL.js → ManagedSnapshot-CPE9C3OD.js} +406 -110
- package/dist/cli-runtime/OwnedCommandCleanup-BN_V6Erc.js +187 -0
- package/dist/cli-runtime/OwnedRegularFile-D1f5nUCx.js +256 -0
- package/dist/cli-runtime/OwnedStagedOutput-D31dOozz.js +126 -0
- package/dist/cli-runtime/{PrivateRuntimeRoot-DAy0PiBM.js → PrivateRuntimeRoot-Cd23u6jd.js} +39 -6
- package/dist/cli-runtime/ProcessOwnership-CtrNr6ee.js +545 -0
- package/dist/cli-runtime/{ProcessOwnership-DXC5-UWt.js → ProcessOwnershipObservation-C006iCtZ.js} +149 -607
- package/dist/cli-runtime/{ProviderDeadline-8m2pFRDc.js → ProviderDeadline-rSuH4Pm8.js} +27 -1
- package/dist/cli-runtime/ProviderOperationExecution-CmU-XrQr.js +38 -0
- package/dist/cli-runtime/{snapshotEnvironment-D_tWyOub.js → ProviderProcess-D87A7ctp.js} +117 -160
- package/dist/cli-runtime/RegularFileRead-mbgGYtxe.js +125 -0
- package/dist/cli-runtime/{SafeOutputTree-D6U15GXd.js → SafeOutputTree-i904hd_2.js} +21 -20
- package/dist/cli-runtime/{SetupHost-FkYWswsq.js → SetupHost-CMPmPraB.js} +365 -195
- package/dist/cli-runtime/SharedStartupAttempt-BxKyf3Uv.js +1424 -0
- package/dist/cli-runtime/StableFileHash-Ame_h3lY.js +61 -0
- package/dist/cli-runtime/{SupportedClients-DaX6Lt2d.js → SupportedClients-DMafjitv.js} +89 -72
- package/dist/cli-runtime/{Update-CbTC_eg1.js → Update-DAsASWlE.js} +1 -1
- package/dist/cli-runtime/{AbortablePromise-BVBemxbD.js → WindowsBatchCommand-Cx9kaVNf.js} +2 -28
- package/dist/cli-runtime/WindowsNativeLoader-BqyZO0ZD.js +142 -0
- package/dist/cli-runtime/{ZipArtifactReader-B8ZgNe4D.js → ZipArtifactReader-Jed69LEL.js} +20 -16
- package/dist/cli-runtime/{analysisErrorCleanup-Do6YeeoD.js → analysisErrorCleanup-COdAmDsb.js} +4 -3
- package/dist/cli-runtime/{appleArchiveFormat-tVoI2ykA.js → appleArchiveFormat-Bb3G5CCI.js} +13 -7
- package/dist/cli-runtime/{application__DirectAnalysisStatus-DpOejOf0.js → application__DirectAnalysisStatus-F74bu9oy.js} +10 -10
- package/dist/cli-runtime/{application__EnhancedTools-oFE2bOjs.js → application__EnhancedTools-Bg51b0Yp.js} +84 -51
- package/dist/cli-runtime/{application__FunctionAnalysisEvidence-B6osuhvW.js → application__FunctionAnalysisEvidence-DBWIaYCh.js} +3 -3
- package/dist/cli-runtime/{application__ReconstructionCoverageService-DN3wTFQj.js → application__ReconstructionCoverageService-AEPNpZqJ.js} +3 -3
- package/dist/cli-runtime/{application__ReconstructionObligationLedgerService-CKcTppX9.js → application__ReconstructionObligationLedgerService-Cl9cPEZf.js} +22 -9
- package/dist/cli-runtime/{application__Setup-XpMaRNjy.js → application__Setup-DwQzEewK.js} +30 -18
- package/dist/cli-runtime/{application__Uninstall-_23pU2yB.js → application__Uninstall-BOf9oyvQ.js} +78 -37
- package/dist/cli-runtime/{application__UpdateRuntime-DPvY8ohd.js → application__UpdateRuntime-CzWkRJHa.js} +119 -29
- package/dist/cli-runtime/{application__android__AndroidApplicationService-CFgIFPM4.js → application__android__AndroidApplicationService-shW_aKlj.js} +3 -3
- package/dist/cli-runtime/{application__apple__AppleApplicationService-Db6QCsun.js → application__apple__AppleApplicationService-DIv6d3wB.js} +3 -3
- package/dist/cli-runtime/{application__harmony__HarmonyApplicationService-CFjocHoK.js → application__harmony__HarmonyApplicationService-OIUFVQFV.js} +3 -3
- package/dist/cli-runtime/{application__javascript__ElectronActiveObservationService-CmVDUI_Z.js → application__javascript__ElectronActiveObservationService-wvCh72hK.js} +3 -3
- package/dist/cli-runtime/application__javascript__ElectronObservationService-SydXPCwM.js +88 -0
- package/dist/cli-runtime/{application__javascript__JavaScriptApplicationService-CCkp8KBh.js → application__javascript__JavaScriptApplicationService-o0uEsjEc.js} +1120 -316
- package/dist/cli-runtime/{application__javascript__JavaScriptApplicationWorkflowService-lPy0tzr3.js → application__javascript__JavaScriptApplicationWorkflowService-BAheG_71.js} +51 -44
- package/dist/cli-runtime/{application__javascript__JavaScriptRuntimeReconciliationService-DWleA8K9.js → application__javascript__JavaScriptRuntimeReconciliationService-Cnn4GP8q.js} +5 -5
- package/dist/cli-runtime/{application__javascript__JavaScriptSemanticTraceService-DkALH4rL.js → application__javascript__JavaScriptSemanticTraceService-CmvLfV1A.js} +6 -6
- package/dist/cli-runtime/{artifacts__ArtifactProvider-zXI0QjSL.js → artifacts__ArtifactProvider-wx2K0F2I.js} +377 -359
- package/dist/cli-runtime/{binary-BVOr2mgE.js → binary-CWVNJhAC.js} +8561 -3159
- package/dist/cli-runtime/{catalogIdentity-DLoXgfIR.js → catalogIdentity-DAEEsOdX.js} +260 -81
- package/dist/cli-runtime/cli.js +6177 -3556
- package/dist/cli-runtime/{cliOutput-BC1BdAcB.js → cliOutput-CgSuw782.js} +47 -6
- package/dist/cli-runtime/cliOutput.js +2 -2
- package/dist/cli-runtime/cliResultOutput-10sd6xGx.js +1453 -0
- package/dist/cli-runtime/cliResultOutput.js +2 -1
- package/dist/cli-runtime/{composition__browserScenario-DHXC1a8n.js → composition__browserScenario-BtPb1c1y.js} +843 -356
- package/dist/cli-runtime/{composition__electronObservation-GecK2EID.js → composition__electronObservation-Bk8R6DJo.js} +128 -69
- package/dist/cli-runtime/{composition__electronScenario-CEZnVrAL.js → composition__electronScenario-BVF0qStH.js} +398 -135
- package/dist/cli-runtime/{cutterToolContracts-TZH9EHr5.js → cutterToolContracts-BQtG_Nzo.js} +195 -62
- package/dist/cli-runtime/{doctorRuntime-BE5ZX8it.js → doctorRuntime-B__SIpm-.js} +241 -21
- package/dist/cli-runtime/{dotnet__ManagedStaticProvider-C8_yZCDc.js → dotnet__ManagedStaticProvider-DO5Yzcp4.js} +1 -1
- package/dist/cli-runtime/{errorSchemas-CTRmvMl3.js → errorSchemas-Ixz_q7qt.js} +58 -4
- package/dist/cli-runtime/homeDirectory-DC_DeJIg.js +18 -0
- package/dist/cli-runtime/{javascriptApplicationAnalysis-HgMzVMQw.js → javascriptApplicationAnalysis-Dk6yBV8g.js} +688 -668
- package/dist/cli-runtime/{javascriptExportReturnShapeProjection-Dg00g35t.js → javascriptExportReturnShapeProjection-CObOIiQ6.js} +3 -3
- package/dist/cli-runtime/{javascriptExportShapeComparisonSchemas-BYnoIqIk.js → javascriptExportShapeComparisonSchemas-DpwuBenh.js} +5 -3
- package/dist/cli-runtime/{javascriptRuntimeReconciliation-DNjDoL3S.js → javascriptRuntimeReconciliation-C6ZgWMys.js} +61 -59
- package/dist/cli-runtime/{javascriptRuntimeReconciliationSchemas-BWpGWNcI.js → javascriptRuntimeReconciliationSchemas-D6tZKUQs.js} +2 -2
- package/dist/cli-runtime/{javascriptSemanticTraceSchemas-BTCNcvbc.js → javascriptSemanticTraceSchemas-C7m0b6_w.js} +3 -3
- package/dist/cli-runtime/{lipo-DSWP6fv-.js → lipo-DPQ6qurH.js} +9 -11
- package/dist/cli-runtime/{logger-CQQCI4a2.js → logger-BuDJ9xxO.js} +2 -2
- package/dist/cli-runtime/{machoContainer-C8BIkkq3.js → machoContainer-Cy98bkFm.js} +180 -0
- package/dist/cli-runtime/{managedApplicationGraph-B08jb3jq.js → managedApplicationGraph-BazVqpJv.js} +16 -10
- package/dist/cli-runtime/{managedToolContracts-D60QmIYj.js → managedToolContracts-BuFkMBH5.js} +2 -2
- package/dist/cli-runtime/mcpDoctor.js +8 -6
- package/dist/cli-runtime/mcpStartupPolicy-imCbM3qo.js +28 -0
- package/dist/cli-runtime/{native__NativeMacOSProvider-YBTvUeJO.js → native__NativeMacOSProvider-DTcRhuGA.js} +1384 -757
- package/dist/cli-runtime/{officialToolContracts-CCFF0an9.js → officialToolContracts-CzzVLx8I.js} +74 -53
- package/dist/cli-runtime/peMachine-B9ggfSJJ.js +95 -0
- package/dist/cli-runtime/propertyListKeys-D5dSASEy.js +355 -0
- package/dist/cli-runtime/{providerCleanupError-Ceq8f0wK.js → providerCleanupError-BhsJyAhk.js} +3 -5
- package/dist/cli-runtime/readArtifactFileChunks-BbTL_PtB.js +129 -0
- package/dist/cli-runtime/{reconstructionObligationLedgerSchemas-Bao0xMr-.js → reconstructionObligationLedgerSchemas-Bi6sect1.js} +6329 -3651
- package/dist/cli-runtime/{scanCanonical-KP4T9jSl.js → scanCanonical-CcDFUr-w.js} +233 -363
- package/dist/cli-runtime/snapshotEnvironment-Yvx5qwsl.js +196 -0
- package/dist/cli-runtime/{toolContracts-D2FOG_Nb.js → toolContracts-CJzEyZ38.js} +126 -52
- package/dist/cli-runtime/{toolOutputSchemaGroups-DRiYs1je.js → toolOutputSchemaGroups-BqdSzySu.js} +768 -589
- package/dist/cli-runtime/{workflowInputError-n8Oo-bLA.js → workflowInputError-BP8z9Wxl.js} +2 -2
- package/dist/cli.js +10 -0
- package/dist/cliBrowserScenarioCommands.js +2 -3
- package/dist/cliLogging.js +22 -7
- package/dist/cliObservationOptions.js +3 -0
- package/dist/cliOutput.js +68 -3
- package/dist/composition/binary.js +15 -2
- package/dist/composition/directAnalysis.js +8 -0
- package/dist/composition/javascriptAnalysisWorkerProcess.js +4 -5
- package/dist/composition/jeb.js +32 -21
- package/dist/config/environment.js +36 -2
- package/dist/config/mcpInputSchemaProfile.js +1 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/contracts/adb/adbToolContracts.js +2 -2
- package/dist/contracts/analysisViewApiSurfaceExample.js +4 -4
- package/dist/contracts/analysisViewToolContracts.js +42 -1
- package/dist/contracts/android/androidToolContracts.js +1 -1
- package/dist/contracts/apktool/apktoolToolContracts.js +5 -1
- package/dist/contracts/artifactComparisonExample.js +18 -14
- package/dist/contracts/artifactToolContracts.js +2 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +12 -1
- package/dist/contracts/compactInputSchema.js +13 -6
- package/dist/contracts/fridaToolContracts.js +5 -4
- package/dist/contracts/gdbToolContracts.js +2 -3
- package/dist/contracts/inputSchemaPresentation.js +173 -79
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +1 -0
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +1 -0
- package/dist/contracts/jsonSchemaKeywords.js +29 -0
- package/dist/contracts/managed/managedWorkflowExamples.js +3 -0
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +15 -12
- package/dist/contracts/officialToolContracts.js +2 -2
- package/dist/contracts/rizinDebugToolContracts.js +3 -2
- package/dist/contracts/sessionToolContracts.js +3 -3
- package/dist/contracts/toolEffects.js +6 -2
- package/dist/contracts/toolOutputSchemaGroups.js +7 -4
- package/dist/contracts/toolOutputSchemaPrimitives.js +7 -0
- package/dist/contracts/toolSchemaMetadata.js +99 -27
- package/dist/cutter/CutterBridgeClient.js +206 -67
- package/dist/cutter/CutterBridgeService.js +52 -4
- package/dist/doctorRuntime.js +25 -4
- package/dist/domain/adb/adbDeviceAnalysis.js +19 -1
- package/dist/domain/analysisErrorBase.js +59 -2
- package/dist/domain/analysisErrorCleanup.js +3 -1
- package/dist/domain/analysisErrorCore.js +13 -0
- package/dist/domain/analysisErrorPresentation.js +23 -4
- package/dist/domain/analysisErrorProjection.js +44 -28
- package/dist/domain/analysisSearch.js +26 -0
- package/dist/domain/analysisSnapshot.js +11 -11
- package/dist/domain/analysisView/WebNetworkApiSurfaceAccumulator.js +4 -65
- package/dist/domain/analysisView/analysisView.js +25 -0
- package/dist/domain/analysisView/analysisViewDataAdmission.js +86 -0
- package/dist/domain/analysisView/artifactInventoryView.js +4 -18
- package/dist/domain/analysisView/javascriptApplicationCoverage.js +27 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +100 -27
- package/dist/domain/analysisView/javascriptFactsView.js +92 -0
- package/dist/domain/analysisView/javascriptModuleReferences.js +37 -0
- package/dist/domain/analysisView/managedMemberView.js +6 -0
- package/dist/domain/android/androidApplication.js +8 -7
- package/dist/domain/apktool/apktoolResourceAnalysis.js +52 -2
- package/dist/domain/apple/appleApplication.js +41 -60
- package/dist/domain/apple/appleBundleAnatomy.js +56 -68
- package/dist/domain/apple/dylibResolution.js +5 -1
- package/dist/domain/apple/interfaceBuilderGraph.js +29 -8
- package/dist/domain/apple/interfaceBuilderKeyedArchive.js +11 -4
- package/dist/domain/apple/jvmClassFile.js +226 -0
- package/dist/domain/apple/keyedArchive.js +39 -17
- package/dist/domain/apple/machoContainer.js +3 -0
- package/dist/domain/apple/plistNumbers.js +67 -5
- package/dist/domain/apple/plistValue.js +89 -18
- package/dist/domain/artifactComparison.js +7 -5
- package/dist/domain/artifactGraph.js +4 -12
- package/dist/domain/artifactInspection.js +6 -17
- package/dist/domain/artifactInventoryEvidence.js +68 -60
- package/dist/domain/binaryTarget.js +11 -26
- package/dist/domain/binaryTargetTypes.js +10 -0
- package/dist/domain/browserNetworkEvidence.js +20 -3
- package/dist/domain/browserObservation.js +5 -28
- package/dist/domain/browserObservationError.js +4 -4
- package/dist/domain/browserScenarioCapture.js +11 -2
- package/dist/domain/browserScenarioCaptureLimits.js +34 -0
- package/dist/domain/browserScenarioCaptureValues.js +50 -0
- package/dist/domain/browserScenarioDiffEvidence.js +1 -3
- package/dist/domain/browserScenarioValues.js +5 -1
- package/dist/domain/captures/packetCapture.js +2 -1
- package/dist/domain/dosMz.js +14 -5
- package/dist/domain/electron/electronFuseEvidence.js +42 -0
- package/dist/domain/elfFixedHeader.js +24 -0
- package/dist/domain/evidence.js +7 -6
- package/dist/domain/evidenceBundle.js +9 -2
- package/dist/domain/explicitSensitiveFailure.js +3 -0
- package/dist/domain/fileSnapshotObservation.js +25 -0
- package/dist/domain/fixedTupleSchema.js +9 -0
- package/dist/domain/functionCallCoverage.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +38 -11
- package/dist/domain/functionComparisonNormalization.js +17 -9
- package/dist/domain/functionDossierEvidence.js +4 -3
- package/dist/domain/harmony/harmonyApplication.js +8 -8
- package/dist/domain/hopperErrors.js +4 -2
- package/dist/domain/hopperValues.js +27 -4
- package/dist/domain/javascript/electronActiveObservation.js +1 -0
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +80 -20
- package/dist/domain/javascript/electronStaticAnalysisValues.js +0 -20
- package/dist/domain/javascript/electronStaticOptionObjects.js +45 -0
- package/dist/domain/javascript/electronWrappedCallPaths.js +70 -17
- package/dist/domain/javascript/javascriptAnalysisResourceControls.js +20 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -0
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +3 -0
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +3 -1
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +49 -21
- package/dist/domain/javascript/javascriptAstFingerprint.js +41 -10
- package/dist/domain/javascript/javascriptAstValues.js +83 -5
- package/dist/domain/javascript/javascriptBundledRequireOrigin.js +23 -36
- package/dist/domain/javascript/javascriptCommonJsExportReceivers.js +231 -0
- package/dist/domain/javascript/javascriptElectronMemberWrites.js +14 -4
- package/dist/domain/javascript/javascriptFeatureSeed.js +1 -1
- package/dist/domain/javascript/javascriptGraphqlOperations.js +382 -0
- package/dist/domain/javascript/javascriptModuleDeclaration.js +20 -0
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -11
- package/dist/domain/javascript/javascriptRpcEndpoints.js +7 -171
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +9 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +35 -12
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +50 -45
- package/dist/domain/javascript/javascriptSemanticAmbientWrites.js +284 -24
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +452 -182
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +37 -20
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +55 -27
- package/dist/domain/javascript/javascriptSemanticCalls.js +4 -4
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +134 -50
- package/dist/domain/javascript/javascriptSemanticCoverage.js +5 -1
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -13
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +33 -10
- package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +1 -1
- package/dist/domain/javascript/javascriptSemanticEvaluationOrder.js +126 -0
- package/dist/domain/javascript/javascriptSemanticExpressionShapes.js +111 -0
- package/dist/domain/javascript/javascriptSemanticGetterQueries.js +147 -0
- package/dist/domain/javascript/javascriptSemanticGetterResults.js +264 -0
- package/dist/domain/javascript/javascriptSemanticGraph.js +18 -1
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +13 -0
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +3 -2
- package/dist/domain/javascript/javascriptSemanticMapOperations.js +51 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +215 -81
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +395 -118
- package/dist/domain/javascript/javascriptSemanticObjectReferences.js +241 -328
- package/dist/domain/javascript/javascriptSemanticObjects.js +33 -27
- package/dist/domain/javascript/javascriptSemanticOpaqueEffects.js +163 -0
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +11 -1
- package/dist/domain/javascript/javascriptSemanticProjection.js +44 -67
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +2 -1
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +1 -1
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +45 -7
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +3 -19
- package/dist/domain/javascript/javascriptSemanticResources.js +27 -4
- package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +78 -37
- package/dist/domain/javascript/javascriptSemanticReturns.js +2 -2
- package/dist/domain/javascript/javascriptSemanticState.js +191 -42
- package/dist/domain/javascript/javascriptSemanticValues.js +167 -41
- package/dist/domain/javascript/javascriptSourceParser.js +54 -9
- package/dist/domain/javascript/javascriptStaticAnalysis.js +24 -13
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +276 -16
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +33 -25
- package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -0
- package/dist/domain/javascript/javascriptStaticAnalysisTypes.js +1 -1
- package/dist/domain/javascript/javascriptSymbolicBindings.js +424 -142
- package/dist/domain/javascript/javascriptSymbolicControlFlow.js +4 -0
- package/dist/domain/javascript/javascriptSymbolicValues.js +12 -1
- package/dist/domain/javascript/sourceToBundleSignals.js +3 -0
- package/dist/domain/managed/managedApplicationGraphNodes.js +14 -9
- package/dist/domain/managed/managedArtifact.js +26 -0
- package/dist/domain/managed/managedMemberComparison.js +3 -0
- package/dist/domain/managed/managedMemberComparisonCoverage.js +14 -1
- package/dist/domain/managed/managedMemberComparisonItems.js +124 -52
- package/dist/domain/managed/managedMemberComparisonMatch.js +76 -72
- package/dist/domain/managed/managedMemberSignatureIdentity.js +40 -0
- package/dist/domain/managed/managedNativeVerificationMatch.js +5 -5
- package/dist/domain/managed/managedNativeVerificationSchemas.js +2 -2
- package/dist/domain/mobileApplicationGraphProjection.js +33 -18
- package/dist/domain/native/bytePattern.js +21 -0
- package/dist/domain/native/nativeAotPe.js +29 -2
- package/dist/domain/native/nativeAotSnapshotObservation.js +18 -0
- package/dist/domain/native/nativeCallPartialObservation.js +14 -12
- package/dist/domain/native/nativeLoadImage.js +13 -0
- package/dist/domain/native/objcSwiftMetadata.js +15 -8
- package/dist/domain/native/peResources.js +6 -2
- package/dist/domain/peMachine.js +2 -0
- package/dist/domain/process/processComparison.js +3 -3
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +65 -24
- package/dist/domain/propertyListKeys.js +84 -69
- package/dist/domain/propertyListXml.js +149 -0
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +2 -4
- package/dist/domain/rawBinary.js +11 -2
- package/dist/domain/reconstructionCoverage.js +35 -23
- package/dist/domain/reconstructionCoverageEvaluation.js +36 -36
- package/dist/domain/reconstructionCoverageEvidence.js +26 -0
- package/dist/domain/reconstructionVerification.js +40 -26
- package/dist/domain/referenceSourceImportParsing.js +4 -0
- package/dist/domain/referenceSourcePathIdentity.js +2 -0
- package/dist/domain/referenceSourceRequireBindings.js +40 -101
- package/dist/domain/relationshipCoverage.js +4 -5
- package/dist/domain/sqlite/sqliteDatabase.js +2 -1
- package/dist/domain/symbolAnalysis.js +9 -8
- package/dist/domain/webBundleAnalyzerInspection.js +65 -25
- package/dist/domain/webCaptureDiff.js +124 -41
- package/dist/domain/webInventory.js +28 -14
- package/dist/domain/webModuleTrace.js +22 -0
- package/dist/domain/webScriptExportError.js +2 -3
- package/dist/domain/xmlDocument.js +41 -0
- package/dist/domain/zipPackageFormat.js +0 -4
- package/dist/dotnet/ManagedArtifactInspector.js +2 -4
- package/dist/dotnet/ManagedDecodeBudget.js +21 -1
- package/dist/dotnet/ManagedMemberInspector.js +31 -6
- package/dist/dotnet/ManagedMemberInspectorCore.js +63 -12
- package/dist/dotnet/ManagedMemberRows.js +8 -8
- package/dist/dotnet/ManagedMetadataHeaps.js +0 -1
- package/dist/dotnet/ManagedMetadataLayout.js +17 -15
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +20 -19
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +7 -8
- package/dist/dotnet/ManagedPeReader.js +5 -0
- package/dist/dotnet/ManagedSnapshot.js +25 -20
- package/dist/dotnet/ManagedTypeNameDigests.js +177 -0
- package/dist/dotnet/ManagedTypeNames.js +6 -46
- package/dist/dotnet/ManagedTypeNesting.js +25 -0
- package/dist/dotnet/ManagedTypeReferences.js +94 -0
- package/dist/electron/ElectronFuseFailures.js +105 -0
- package/dist/electron/ElectronFusePath.js +4 -3
- package/dist/electron/ElectronFuseProvider.js +67 -92
- package/dist/electron/ElectronFuseReader.js +46 -30
- package/dist/evm/EvmoleFailures.js +1 -0
- package/dist/evm/EvmoleInterfaceProvider.js +13 -16
- package/dist/filesystem/OwnedRegularFile.js +116 -0
- package/dist/filesystem/OwnedStagedOutput.js +28 -11
- package/dist/filesystem/RegularFile.js +20 -8
- package/dist/filesystem/StableFileHash.js +56 -38
- package/dist/filesystem/callerPath.js +26 -0
- package/dist/filesystem/readFileHandleChunks.js +55 -5
- package/dist/filesystem/readStableFileBytes.js +85 -0
- package/dist/firmware/FirmwareCommand.js +13 -7
- package/dist/firmware/FirmwareFailures.js +56 -0
- package/dist/firmware/FirmwareFiles.js +128 -98
- package/dist/firmware/FirmwareProvider.js +120 -65
- package/dist/firmware/FirmwarePublication.js +26 -11
- package/dist/flutter/DartElf.js +27 -0
- package/dist/flutter/FlutterBuildProvider.js +44 -4
- package/dist/gdb/GdbSessionManager.js +202 -14
- package/dist/generatedPackageMetadata.js +1 -1
- package/dist/ghidra/GhidraAnalysisProfile.js +24 -10
- package/dist/ghidra/GhidraAnalysisSeeds.js +39 -55
- package/dist/ghidra/GhidraBridgeSources.js +12 -0
- package/dist/ghidra/GhidraClient.js +362 -148
- package/dist/ghidra/GhidraClientStartup.js +5 -3
- package/dist/ghidra/GhidraClientWire.js +5 -2
- package/dist/ghidra/GhidraDiagnostics.js +16 -5
- package/dist/ghidra/GhidraDoctor.js +45 -14
- package/dist/ghidra/GhidraDosSnapshot.js +83 -0
- package/dist/ghidra/GhidraExecutableHeader.js +54 -0
- package/dist/ghidra/GhidraFileArtifacts.js +93 -0
- package/dist/ghidra/GhidraFunctionValues.js +1 -0
- package/dist/ghidra/GhidraInstallation.js +143 -142
- package/dist/ghidra/GhidraInstallationPolicy.js +20 -79
- package/dist/ghidra/GhidraInstallationProperties.js +57 -0
- package/dist/ghidra/GhidraInventoryValues.js +22 -6
- package/dist/ghidra/GhidraJavaLaunch.js +11 -4
- package/dist/ghidra/GhidraJavaProbe.js +267 -0
- package/dist/ghidra/GhidraJavaProperties.js +9 -7
- package/dist/ghidra/GhidraLanguageCatalog.js +12 -7
- package/dist/ghidra/GhidraLauncher.js +128 -65
- package/dist/ghidra/GhidraLoadImageAttest.js +75 -78
- package/dist/ghidra/GhidraLoadImageValues.js +39 -29
- package/dist/ghidra/GhidraMipsProfile.js +13 -5
- package/dist/ghidra/GhidraNativeAotSnapshotOwner.js +221 -0
- package/dist/ghidra/GhidraPeProfile.js +88 -18
- package/dist/ghidra/GhidraProvider.js +219 -32
- package/dist/ghidra/GhidraProviderCapabilities.js +17 -4
- package/dist/ghidra/GhidraProviderClient.js +199 -239
- package/dist/ghidra/GhidraPspExtension.js +104 -34
- package/dist/ghidra/GhidraPspProfile.js +4 -1
- package/dist/ghidra/GhidraRawBinaryLanguage.js +13 -4
- package/dist/ghidra/GhidraReleasePolicy.js +93 -0
- package/dist/ghidra/GhidraRequestQueue.js +64 -40
- package/dist/ghidra/GhidraSessionError.js +152 -19
- package/dist/ghidra/GhidraSessionValues.js +13 -3
- package/dist/ghidra/GhidraSocketConnection.js +25 -11
- package/dist/ghidra/GhidraTargetSnapshot.js +67 -50
- package/dist/ghidra/GhidraTransport.js +86 -63
- package/dist/ghidra/extensions/GhidraExtensions.js +30 -45
- package/dist/go/GoBinaryProvider.js +89 -60
- package/dist/go/GoElfImage.js +3 -3
- package/dist/hopper/BridgeLauncher.js +43 -4
- package/dist/hopper/HopperAnalysisProfile.js +4 -2
- package/dist/hopper/HopperCleanup.js +14 -1
- package/dist/hopper/HopperClient.js +135 -63
- package/dist/hopper/HopperProvider.js +4 -7
- package/dist/hopper/HopperProviderCapabilities.js +2 -1
- package/dist/hopper/HopperRegexSearch.js +21 -60
- package/dist/ida/IdaBusyHealth.js +36 -2
- package/dist/ida/IdaMcpConnection.js +17 -11
- package/dist/ida/IdaNativeProtocol.js +1 -9
- package/dist/ida/IdaOperationRunner.js +8 -26
- package/dist/ida/IdaProtocolValues.js +2 -1
- package/dist/ida/IdaProvider.js +18 -2
- package/dist/ida/IdaSessionClient.js +54 -12
- package/dist/inspector/V8InspectorCaptureProjection.js +7 -0
- package/dist/inspector/V8InspectorProvider.js +2 -0
- package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +25 -4
- package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +4 -3
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +3 -2
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +7 -1
- package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +1 -1
- package/dist/javascript/recovery/RecoveryFiles.js +57 -8
- package/dist/jeb/JebMcpConnection.js +129 -70
- package/dist/jeb/JebMcpConnectionOwner.js +116 -0
- package/dist/jeb/JebMcpDeadline.js +46 -0
- package/dist/jeb/JebProvider.js +77 -51
- package/dist/kuna/KunaAddress.js +11 -0
- package/dist/kuna/KunaCommand.js +217 -0
- package/dist/kuna/KunaConfiguration.js +90 -0
- package/dist/kuna/KunaDoctor.js +198 -0
- package/dist/kuna/KunaInstallation.js +137 -0
- package/dist/kuna/KunaJson.js +23 -0
- package/dist/kuna/KunaJsonStream.js +433 -0
- package/dist/kuna/KunaLimits.js +5 -0
- package/dist/kuna/KunaProjectCache.js +804 -0
- package/dist/kuna/KunaProjectExport.js +202 -0
- package/dist/kuna/KunaProjectFiles.js +191 -0
- package/dist/kuna/KunaProjectReader.js +115 -0
- package/dist/kuna/KunaProvider.js +217 -0
- package/dist/kuna/KunaProviderCapabilities.js +102 -0
- package/dist/kuna/KunaQueryErrors.js +12 -0
- package/dist/kuna/KunaQueryWork.js +113 -0
- package/dist/kuna/KunaReferenceFiles.js +258 -0
- package/dist/kuna/KunaReferenceQueries.js +211 -0
- package/dist/kuna/KunaRelease.js +10 -0
- package/dist/kuna/KunaRunSlots.js +56 -0
- package/dist/kuna/KunaSessionClient.js +1162 -0
- package/dist/kuna/KunaStringInventory.js +145 -0
- package/dist/kuna/KunaStringQueries.js +133 -0
- package/dist/kuna/KunaTargetCommands.js +205 -0
- package/dist/kuna/KunaUnavailable.js +11 -0
- package/dist/main/processShutdown.js +17 -0
- package/dist/main/transport.js +21 -1
- package/dist/main.js +2 -12
- package/dist/mcp/AnalysisProvider-BABWbLoM.js +38 -0
- package/dist/mcp/{AnalysisSnapshotFiles-BAbiJQOc.js → AnalysisSnapshotFiles-BXz0c37-.js} +39 -28
- package/dist/mcp/{ProcessOwnership-Bl_3ejLe.js → ArtifactFileOperation-64cQKI7B.js} +274 -72
- package/dist/mcp/{ArtifactProvider-DViCU_rn.js → ArtifactProvider-Dx6pmil1.js} +371 -354
- package/dist/mcp/ArtifactProviderMetadata-UCJr2oZW.js +167 -0
- package/dist/mcp/{ArtifactReader-OyM03Gjn.js → ArtifactReader-BrnwNaKY.js} +29 -6
- package/dist/mcp/ArtifactResourceScope-zi3Dkqzy.js +175 -0
- package/dist/mcp/{AsarHeader-WsPgoooH.js → AsarHeader-B_IbppTz.js} +1 -1
- package/dist/mcp/{BinarySessionStatus-B4P9gf-S.js → BinarySessionStatus-CZ9nnXMt.js} +5 -4
- package/dist/mcp/{BinaryTargetResolver-BMaE_0H1.js → BinaryTargetResolver-BUncASDP.js} +146 -215
- package/dist/mcp/BoundedFileBytes-DYt5q9G2.js +43 -0
- package/dist/mcp/{CdpCaptureDocuments-HDiF2O7k.js → CdpCaptureDocuments-Y2uFcBpl.js} +194 -145
- package/dist/mcp/{CdpCaptureValues-M-j6CIh1.js → CdpCaptureValues-tNIg-gQK.js} +12 -5
- package/dist/mcp/{CdpConnection-BpDfz4MK.js → CdpEndpoint-BrhMhpSi.js} +352 -281
- package/dist/mcp/{CdpOptionalCommand-BPjRD9Kz.js → CdpOptionalCommand-PZZhlqxv.js} +2 -2
- package/dist/mcp/CdpTargetSession-BmmDC3XO.js +290 -0
- package/dist/mcp/{DirectAnalysis-DrafbXke.js → DirectAnalysis-B9KuCHTG.js} +29 -21
- package/dist/mcp/{DirectAnalysisStatus-CjjeDLzW.js → DirectAnalysisStatus-BgzopkIt.js} +7 -7
- package/dist/mcp/{ElectronFileScope-BPG_YoyU.js → ElectronFileScope-FXtK0d6I.js} +1 -1
- package/dist/mcp/ElectronFuseFailures-uZ_wOV6T.js +610 -0
- package/dist/mcp/MachoLoadCommandReader-C2VGgHA3.js +330 -0
- package/dist/mcp/{ManagedStaticProvider-BthZbKyZ.js → ManagedStaticProvider-CZuoPme2.js} +429 -131
- package/dist/mcp/{NativeMacOSProvider-Bh79k8dI.js → NativeMacOSProvider-CMguKrvN.js} +1376 -748
- package/dist/mcp/{NativeMacOSProviderMetadata-N1lPOaY_.js → NativeMacOSProviderMetadata-B_RH4KXF.js} +97 -7
- package/dist/mcp/{ProviderDeadline-DskQ94YD.js → OwnedCommand-BW1jBSt9.js} +436 -127
- package/dist/mcp/ProcedureAddressResolution-H6Qwpb_Y.js +59 -0
- package/dist/mcp/{WorkflowEvidence-umWrB_wm.js → WorkflowEvidence-CO4C7ALz.js} +16 -9
- package/dist/mcp/analysisErrorCleanup-Q344SnTO.js +34 -0
- package/dist/mcp/analysisErrorCore-BIEP7tvF.js +509 -0
- package/dist/mcp/{analysisErrorProjection-BN0EPM-3.js → analysisErrorProjection-B8teQwwD.js} +80 -30
- package/dist/mcp/{artifactToolContracts-Di4qZlEt.js → artifactToolContracts-C9dRDo-D.js} +6 -4
- package/dist/mcp/{browserObservation-C0s4i8UI.js → browserObservation-DUraZs62.js} +272 -107
- package/dist/mcp/{browserObservationError-CyLugqX4.js → browserObservationError-C5okJ5el.js} +27 -4
- package/dist/mcp/{browserObservationSchemas-tgqjH7aA.js → browserObservationSchemas-DwGGxBpu.js} +3 -3
- package/dist/mcp/{browserScenario-CAQ8Fns9.js → browserScenario-BRUz7yN0.js} +844 -358
- package/dist/mcp/{browserScenarioCapture-CTNFN-FI.js → browserScenarioCapture-CiMAsMx8.js} +127 -11
- package/dist/mcp/{InterfaceBuilderDecodeBudget-5F2AkxJT.js → callerPath-CpPnMZyN.js} +91 -65
- package/dist/mcp/{electronActiveObservation-lDvQTMR0.js → electronActiveObservation-DV0Ffy9X.js} +1 -0
- package/dist/mcp/electronFuses-D5SS7XXw.js +367 -0
- package/dist/mcp/{electronObservation-i7LcILQ-.js → electronObservation-DsN-NqY1.js} +134 -75
- package/dist/mcp/{electronObservation-DFOFEood.js → electronObservation-wOYWwqgF.js} +3 -3
- package/dist/mcp/{electronScenario-nCzE6IfJ.js → electronScenario-CYrt2zBK.js} +395 -135
- package/dist/mcp/{emptyArraySchema-tL6Qymyd.js → emptyArraySchema-C0o2Sxwp.js} +2 -2
- package/dist/mcp/{enhancedInputs-DgdEnzHy.js → enhancedInputs-6CCgB3VB.js} +1 -1
- package/dist/mcp/{javascriptRuntimeObservation-61NhCf7H.js → javascriptRuntimeObservation-BVbhkO2-.js} +12 -9
- package/dist/mcp/{javascriptRuntimeObservation-PIUoLfX6.js → javascriptRuntimeObservation-Cu0Yedqq.js} +2 -2
- package/dist/mcp/{lipo-Bnkoq_6W.js → lipo-DSTgUqL1.js} +11 -118
- package/dist/mcp/{logger-BQY5ulYv.js → logger-BGdGHadX.js} +2 -2
- package/dist/mcp/machoContainer-CMSxUBlK.js +605 -0
- package/dist/mcp/{main-kBXHZ8S5.js → main-Cx-Z7m_n.js} +16788 -5902
- package/dist/mcp/main.js +1 -1
- package/dist/mcp/{managedToolContracts-CK--I_s7.js → managedToolContracts-CSlbKJP-.js} +3 -3
- package/dist/mcp/{nativeValueTrace-DR9UE62L.js → nativeValueTrace-BEZbDieM.js} +2630 -2468
- package/dist/mcp/{officialToolContracts-B67NJ2tC.js → officialToolContracts-CauCcSsc.js} +74 -55
- package/dist/mcp/peMachine-aP1iYnHq.js +95 -0
- package/dist/mcp/propertyListKeys-BfCo0k4w.js +356 -0
- package/dist/mcp/providerCleanupError-DIRHxzWo.js +125 -0
- package/dist/mcp/{providerOperationHealth-CTYa3iLf.js → providerOperationHealth-9DRSGM8N.js} +24 -1
- package/dist/mcp/{scanCanonical-CRXSpule.js → scanCanonical-CF3ATd1V.js} +269 -463
- package/dist/mcp/{serverIdentity-Cio4iFV3.js → serverIdentity-BK0Ejd_Y.js} +262 -83
- package/dist/mcp/{sourceMapEnvelope-C0uJlrOh.js → sourceMapEnvelope-DAaRUIGj.js} +4 -4
- package/dist/mcp/{toolContracts-BW05wpcr.js → toolContracts-BPoHQdlC.js} +541 -327
- package/dist/mcp/{toolOutputSchemaGroups-ColvNZ1r.js → toolOutputSchemaGroups-MJ_f-PMK.js} +2551 -2354
- package/dist/mcp/{webContentArtifact-Dzjc1z-R.js → webContentArtifact-DfGkgDcI.js} +2 -17
- package/dist/mcp/{webRuntime-K__NYzXm.js → webRuntime-ccyhkRru.js} +2 -2
- package/dist/mcp/{webSourceLocation-DbMAT2J9.js → webSourceLocation-DKIum0vJ.js} +6451 -4414
- package/dist/mcpDoctor.js +4 -2
- package/dist/mcpStartupPolicy.js +18 -3
- package/dist/native/AppleDispatchMetadata.js +76 -27
- package/dist/native/AppleMachoFixups.js +20 -10
- package/dist/native/AppleObjcCategories.js +12 -1
- package/dist/native/AppleObjcDispatchFacets.js +21 -12
- package/dist/native/AppleObjcProperties.js +61 -17
- package/dist/native/AppleObjcProtocols.js +25 -7
- package/dist/native/AppleSwiftVtables.js +2 -0
- package/dist/native/CommandRunner.js +13 -9
- package/dist/native/LldbCallTracer.js +232 -178
- package/dist/native/LldbReadbackFiles.js +70 -0
- package/dist/native/LldbRetainedObservations.js +28 -56
- package/dist/native/NativeCallObservation.js +53 -52
- package/dist/native/NativeCallTarget.js +95 -0
- package/dist/native/NativeMacOSProvider.js +240 -171
- package/dist/native/NativeMachoInspection.js +21 -7
- package/dist/native/NativePlistSource.js +179 -0
- package/dist/native/NativeUiCleanupError.js +30 -0
- package/dist/native/NativeUiHelperRuntime.js +48 -35
- package/dist/native/NativeUiObservation.js +67 -45
- package/dist/native/SignatureTargetBinding.js +72 -53
- package/dist/native/parsers/demangle.js +16 -12
- package/dist/native/parsers/machoUuid.js +4 -4
- package/dist/native/parsers/otool.js +57 -17
- package/dist/native/parsers/plist.js +40 -25
- package/dist/native/pe/PeResourceLayout.js +22 -7
- package/dist/native/pe/PeResourceParser.js +10 -9
- package/dist/native/pe/PeResourcesProvider.js +63 -16
- package/dist/native/pwndbg/CoreFileMappingAuthority.js +51 -0
- package/dist/native/pwndbg/PwndbgCoreContext.js +26 -15
- package/dist/native/pwntools/PwntoolsDecoder.js +116 -53
- package/dist/native/pwntools/PwntoolsFailures.js +17 -3
- package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +11 -1
- package/dist/objdump/ObjdumpCommand.js +5 -2
- package/dist/pcap/PcapOutput.js +38 -2
- package/dist/pcap/PcapProvider.js +45 -15
- package/dist/pcap/PcapSnapshot.js +24 -4
- package/dist/process/ArtifactAnalysisResources.js +145 -52
- package/dist/process/BoundedFileBytes.js +8 -3
- package/dist/process/CurrentEntrypointPath.js +3 -1
- package/dist/process/DarwinProcessRunTokenReader.js +174 -63
- package/dist/process/DetachedPgpSignature.js +57 -0
- package/dist/process/ExecFileOutput.js +14 -11
- package/dist/{hopper/HopperTargetLease.js → process/HopperLease.js} +10 -0
- package/dist/process/LinuxResourceLimits.js +4 -24
- package/dist/process/OwnedCommand.js +109 -14
- package/dist/process/ProviderProcess.js +129 -10
- package/dist/process/RegexMatcher.js +96 -0
- package/dist/process/SharedStartupAttempt.js +59 -0
- package/dist/process/WindowsAuthority.js +1 -1
- package/dist/process/capture/FilesystemSnapshot.js +3 -2
- package/dist/process/capture/ProcessCaptureError.js +55 -17
- package/dist/process/capture/ProcessCaptureLifecycle.js +17 -20
- package/dist/process/capture/ProcessCaptureProgress.js +5 -3
- package/dist/process/capture/ProcessHarness.js +17 -3
- package/dist/process/snapshotEnvironment.js +8 -8
- package/dist/{application/binary → providers}/AnalysisClientCleanup.js +3 -3
- package/dist/providers/AnalysisClientCreation.js +193 -0
- package/dist/providers/AnalysisClientFailure.js +191 -0
- package/dist/providers/DeferredAnalysisClient.js +48 -0
- package/dist/providers/OwnedCommandCleanup.js +65 -0
- package/dist/providers/ProviderInspectionScope.js +10 -0
- package/dist/recordedCatalogDigests.js +2 -0
- package/dist/reference/ReferenceSourceReader.js +64 -0
- package/dist/reference/ReferenceSourceReaderEntries.js +12 -3
- package/dist/reference/ReferenceSourceReaderFile.js +2 -1
- package/dist/rizin/RizinCommand.js +2 -2
- package/dist/rizin/RizinDebugSessionManager.js +249 -210
- package/dist/rust/RustBinaryProvider.js +55 -23
- package/dist/server/EvidenceMcpServer.js +2 -2
- package/dist/server/contractToolHandler.js +17 -11
- package/dist/server/createServer.js +27 -8
- package/dist/server/promptCompletion.js +24 -22
- package/dist/server/registerArtifactComparisonTool.js +13 -2
- package/dist/server/registerBrowserScenarioTool.js +7 -5
- package/dist/server/registerBrowserTools.js +2 -4
- package/dist/server/registerCutterTools.js +2 -3
- package/dist/server/registerElectronTools.js +2 -13
- package/dist/server/registerFridaTools.js +8 -12
- package/dist/server/registerInvestigationTools.js +20 -20
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
- package/dist/server/registerManagedWorkflowTools/evidence.js +14 -7
- package/dist/server/registerProcessComparisonTool.js +3 -0
- package/dist/server/registerSessionStatusTool.js +13 -6
- package/dist/server/registerSessionTools.js +16 -29
- package/dist/server/runDerivedOperation.js +2 -0
- package/dist/signals/SigrokRecordingProvider.js +13 -6
- package/dist/sqlite/SqliteDatabaseFailures.js +25 -12
- package/dist/sqlite/SqliteDatabaseInspection.js +27 -12
- package/dist/sqlite/SqliteDatabaseSnapshot.js +58 -32
- package/dist/sqlite/SqliteDatabaseWorkerExecution.js +18 -3
- package/dist/wasm/WabtArtifactProvider.js +64 -42
- package/dist/wasm/WabtFailures.js +19 -1
- package/dist/wasm/WabtRuntime.js +58 -0
- package/dist/wasm/WasmGlueAdapter.js +20 -7
- package/dist/windows/WindowsNativeLoader.js +16 -2
- package/dist/windows/WindowsPrivateRuntime.js +44 -1
- package/licenses/npm-dependencies.txt +146 -1
- package/licenses/npm-runtime-notices.txt +175 -1
- package/native/windows/README.md +44 -7
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +11 -3
- package/scripts/electron-active-hook-boundaries.cjs +15 -2
- package/scripts/electron-active-hook.cjs +408 -46
- package/scripts/hopper-demo-x11.py +12 -10
- package/scripts/rea.mjs +62 -15
- package/skills/reverse-engineer-anything/SKILL.md +21 -7
- package/skills/reverse-engineer-anything/references/android-applications.md +3 -1
- package/skills/reverse-engineer-anything/references/javascript-applications.md +44 -1
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +30 -10
- package/dist/cli-runtime/ArtifactResourceScope-DQWTcUwE.js +0 -114
- package/dist/cli-runtime/ClientConfigPath-c6jr6INc.js +0 -36
- package/dist/cli-runtime/IdaConfiguration-CtGP7EKo.js +0 -1094
- package/dist/cli-runtime/JebMcpEndpoint-DUytrn5G.js +0 -428
- package/dist/cli-runtime/MacHopperPaths-CwL5lYPX.js +0 -434
- package/dist/cli-runtime/OwnedCommand-Cj9GhmPR.js +0 -112
- package/dist/cli-runtime/RegularFile-B_6KPCNQ.js +0 -139
- package/dist/cli-runtime/RegularFileRead-DVlC5faM.js +0 -125
- package/dist/cli-runtime/analysisErrorPresentation-DGt7TdsH.js +0 -497
- package/dist/cli-runtime/application__javascript__ElectronObservationService-DEsR8KDN.js +0 -63
- package/dist/cli-runtime/artifactOperationError-B7n03FbD.js +0 -27
- package/dist/cli-runtime/browserObservationError-Dx6xRTjb.js +0 -40
- package/dist/cli-runtime/cliResultOutput-DsRMI8CJ.js +0 -780
- package/dist/cli-runtime/mcpStartupPolicy-CVVSOmRc.js +0 -21
- package/dist/cli-runtime/propertyListKeys-G8e74YWb.js +0 -248
- package/dist/cli-runtime/providerAdapterError-DAjhICdr.js +0 -25
- package/dist/cli-runtime/readFileHandleChunks-dp60iZ6v.js +0 -38
- package/dist/hopper/HopperRegexWorker.js +0 -27
- package/dist/mcp/ArtifactProviderMetadata-b7pOK5_t.js +0 -76
- package/dist/mcp/ArtifactResourceScope-P3tq5z8Z.js +0 -162
- package/dist/mcp/BoundedFileBytes-DuczXiQZ.js +0 -68
- package/dist/mcp/CdpTargetSession-BsPoKhEU.js +0 -86
- package/dist/mcp/ProcedureAddressResolution-CQpuwm1h.js +0 -19
- package/dist/mcp/analysisErrorCore-DXRTvF_m.js +0 -235
- package/dist/mcp/artifactOperationError-CkHMMaf7.js +0 -27
- package/dist/mcp/digests-BFoWUT_-.js +0 -223
- package/dist/mcp/propertyListKeys-DD25WsjI.js +0 -553
- package/dist/mcp/providerAdapterError-sDxToNal.js +0 -25
- package/dist/mcp/unicodeCodePointOrder-BezCbTpg.js +0 -26
|
@@ -0,0 +1,1162 @@
|
|
|
1
|
+
import { AnalysisCleanupLease } from "../artifacts/AnalysisCleanupLease.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
|
|
4
|
+
import { AnalysisError } from "../domain/analysisErrorBase.js";
|
|
5
|
+
import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisResourceConstraintError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
|
|
6
|
+
import { analysisSearchPredicate, analysisSearchQuerySchema, } from "../domain/analysisSearch.js";
|
|
7
|
+
import { combineFunctionRelationshipCoverage } from "../domain/functionCallCoverage.js";
|
|
8
|
+
import { functionDossierSchema } from "../domain/hopperValues.js";
|
|
9
|
+
import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
|
|
10
|
+
import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
|
|
11
|
+
import { ProviderAdapterError } from "../domain/providerAdapterError.js";
|
|
12
|
+
import { ProviderCleanupError } from "../domain/providerCleanupError.js";
|
|
13
|
+
import { err, ok } from "../domain/result.js";
|
|
14
|
+
import { ABORTED, waitForAbortable } from "../process/AbortablePromise.js";
|
|
15
|
+
import { SharedStartupAttempt } from "../process/SharedStartupAttempt.js";
|
|
16
|
+
import { KUNA_INVENTORY_OUTPUT_BYTES, kunaFileCleanupError, } from "./KunaCommand.js";
|
|
17
|
+
import { kunaFunctionDeadline } from "./KunaConfiguration.js";
|
|
18
|
+
import { createKunaFileCloseScope, inspectKunaInstallation, } from "./KunaInstallation.js";
|
|
19
|
+
import { kunaProjectKey, } from "./KunaProjectCache.js";
|
|
20
|
+
import { parseKunaInventory, } from "./KunaProjectFiles.js";
|
|
21
|
+
import { isKunaOperation, KUNA_RELATIONSHIP_LIMITATION, KUNA_SINGLE_FUNCTION_LIMITATION, kunaLimitations, } from "./KunaProviderCapabilities.js";
|
|
22
|
+
import { KUNA_PROVIDER_ID } from "./KunaRelease.js";
|
|
23
|
+
import { KunaTargetCommands } from "./KunaTargetCommands.js";
|
|
24
|
+
import { KunaReferenceQueries } from "./KunaReferenceQueries.js";
|
|
25
|
+
import { KunaQueryWork } from "./KunaQueryWork.js";
|
|
26
|
+
import { KunaStringQueries } from "./KunaStringQueries.js";
|
|
27
|
+
import { normalizeKunaAddress } from "./KunaAddress.js";
|
|
28
|
+
import { KUNA_FUNCTION_TEXT_BYTES } from "./KunaLimits.js";
|
|
29
|
+
import { KunaProjectReader, } from "./KunaProjectReader.js";
|
|
30
|
+
import { kunaUnavailable } from "./KunaUnavailable.js";
|
|
31
|
+
import { RegularFileCleanupFailure, regularFileCancellation, } from "../filesystem/OwnedRegularFile.js";
|
|
32
|
+
import { ArtifactResourceScope } from "../artifacts/ArtifactResourceScope.js";
|
|
33
|
+
import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
|
|
34
|
+
import { kunaQueryFailureForCaller } from "./KunaQueryErrors.js";
|
|
35
|
+
/** How often a request waiting on the project export reports that it still waits. */
|
|
36
|
+
const WAIT_PROGRESS_INTERVAL_MS = 10_000;
|
|
37
|
+
/** A queued single-function request found the export finished first. */
|
|
38
|
+
const EXPORT_READY = Symbol("kuna-export-ready");
|
|
39
|
+
/**
|
|
40
|
+
* Completed single-function texts a session keeps while it has no export
|
|
41
|
+
* reader. Each repeat would otherwise analyze the whole image again; after a
|
|
42
|
+
* failed export that holds for the rest of the session.
|
|
43
|
+
*/
|
|
44
|
+
const SINGLE_FUNCTION_TEXT_CACHE_BYTES = 16 * 1024 * 1024;
|
|
45
|
+
/** Charged per kept text beside its UTF-8 bytes. */
|
|
46
|
+
const SINGLE_FUNCTION_TEXT_ENTRY_BYTES = 256;
|
|
47
|
+
/**
|
|
48
|
+
* Wait for work this session owns, stopping only this caller's wait when its
|
|
49
|
+
* signal aborts; the work itself continues for other callers.
|
|
50
|
+
*/
|
|
51
|
+
const waitFor = async (work, signal, operation) => {
|
|
52
|
+
const result = await waitForAbortable(work, signal);
|
|
53
|
+
return result === ABORTED
|
|
54
|
+
? err(new AnalysisCancelledError(operation, { cause: signal?.reason }))
|
|
55
|
+
: result;
|
|
56
|
+
};
|
|
57
|
+
/** A file the adopted export named is gone, e.g. evicted by another REA process. */
|
|
58
|
+
const isMissing = (cause) => cause instanceof Error &&
|
|
59
|
+
"code" in cause &&
|
|
60
|
+
(cause.code === "ENOENT" || cause.code === "ENOTDIR");
|
|
61
|
+
/** Read through a call so a check before an await does not narrow later ones. */
|
|
62
|
+
const cancelled = (signal) => signal?.aborted === true;
|
|
63
|
+
const message = (cause) => cause instanceof Error ? cause.message : String(cause);
|
|
64
|
+
const failure = (operation, cause) => cause instanceof AnalysisError
|
|
65
|
+
? cause
|
|
66
|
+
: new ProviderAdapterError(KUNA_PROVIDER_ID, operation, {
|
|
67
|
+
cause,
|
|
68
|
+
userMessage: `Kuna ${operation} failed: ${message(cause)}`,
|
|
69
|
+
});
|
|
70
|
+
/**
|
|
71
|
+
* How a request that needs the export reports the export's failure. A session
|
|
72
|
+
* never rebuilds a failed export, so repeating the request cannot succeed; the
|
|
73
|
+
* error says what to change before reopening the target. Kuna settings are read
|
|
74
|
+
* when REA starts, so changing one also needs a restart. Cancellation and
|
|
75
|
+
* unproven cleanup keep their own errors, which callers must still observe.
|
|
76
|
+
*/
|
|
77
|
+
const exportUnavailable = (operation, failure) => {
|
|
78
|
+
if (failure instanceof AnalysisCancelledError || failure.cleanupIncomplete)
|
|
79
|
+
return failure;
|
|
80
|
+
const reason = failure.userMessage ?? failure.message;
|
|
81
|
+
const exported = projectAnalysisError(failure);
|
|
82
|
+
const restart = "REA reads Kuna settings when it starts, so restart REA, then reopen the target.";
|
|
83
|
+
const next = failure instanceof AnalysisTimeoutError
|
|
84
|
+
? `To retry, set REA_KUNA_PROJECT_TIMEOUT_MS above ${String(failure.timeoutMs)} ms or raise REA_KUNA_JOBS in the environment that starts REA. ${restart}`
|
|
85
|
+
: failure instanceof AnalysisResourceConstraintError &&
|
|
86
|
+
failure.remediationAction !== undefined
|
|
87
|
+
? // A fixed buffer (`memory`) is no setting, so a restart cannot help.
|
|
88
|
+
`${failure.remediationAction.replace(/\.?$/u, ".")}${failure.resource === "memory" ? "" : ` ${restart}`}`
|
|
89
|
+
: "To retry, resolve the reported failure, then reopen the target.";
|
|
90
|
+
return new AnalysisCapabilityUnavailableError(KUNA_PROVIDER_ID, operation, reason, {
|
|
91
|
+
cause: failure,
|
|
92
|
+
// Callers see only the top-level projection, so the export failure's
|
|
93
|
+
// own projected code and details (its limits, target path, captured
|
|
94
|
+
// output and diagnostics) travel whole rather than field by field.
|
|
95
|
+
diagnostics: {
|
|
96
|
+
export_error: failure._tag,
|
|
97
|
+
export_code: exported.code,
|
|
98
|
+
...(exported.details === undefined
|
|
99
|
+
? {}
|
|
100
|
+
: { export_details: exported.details }),
|
|
101
|
+
},
|
|
102
|
+
userMessage: `Kuna's project export failed, so ${operation} is unavailable in this session: ${reason.replace(/\.?$/u, ".")} ${next}`,
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
/** Kuna names a procedure by its inventory entry or by an exact entry address. */
|
|
106
|
+
const procedureSelectorSchema = z.string().min(1);
|
|
107
|
+
/**
|
|
108
|
+
* One Kuna analysis session for one target.
|
|
109
|
+
*
|
|
110
|
+
* Reads come from the verified project export in REA's cache. Until that
|
|
111
|
+
* export exists, listings use the inventory the export takes first and
|
|
112
|
+
* pseudocode a single-function `kuna decompile`, while the export builds in
|
|
113
|
+
* the background; assembly waits for it. Kuna always runs on a private copy
|
|
114
|
+
* whose digest matches the selected target.
|
|
115
|
+
*/
|
|
116
|
+
export class KunaSessionClient {
|
|
117
|
+
#target;
|
|
118
|
+
#profile;
|
|
119
|
+
#cache;
|
|
120
|
+
#environment;
|
|
121
|
+
#runSlots;
|
|
122
|
+
#fileCloseResources = new ArtifactResourceScope();
|
|
123
|
+
/** Single-function runs in flight, by entry address. */
|
|
124
|
+
#singleFunctionRuns = new Map();
|
|
125
|
+
/** Completed single-function texts by address, least recently used first. */
|
|
126
|
+
#singleFunctionTexts = new Map();
|
|
127
|
+
#singleFunctionTextBytes = 0;
|
|
128
|
+
/** Owns background work: aborting it cancels this session's export interest. */
|
|
129
|
+
#session = new AbortController();
|
|
130
|
+
/** Requests and shared readers retain their resources until their work settles. */
|
|
131
|
+
#active = new Set();
|
|
132
|
+
#commands;
|
|
133
|
+
#queryWork;
|
|
134
|
+
#references;
|
|
135
|
+
#strings;
|
|
136
|
+
#installation;
|
|
137
|
+
#inventory;
|
|
138
|
+
#project;
|
|
139
|
+
/** The cache lookup that decides #project, shared by concurrent first requests. */
|
|
140
|
+
#starting;
|
|
141
|
+
/** The building export's inventory; undefined when it settles without one. */
|
|
142
|
+
#exportInventory;
|
|
143
|
+
#reader;
|
|
144
|
+
#inventoryIndex;
|
|
145
|
+
#status;
|
|
146
|
+
#key;
|
|
147
|
+
#exportFailure;
|
|
148
|
+
#releasePin;
|
|
149
|
+
/** Set once close starts; new requests are refused from then on. */
|
|
150
|
+
#closing = false;
|
|
151
|
+
/** Set only when close has released every owned resource. */
|
|
152
|
+
#closed = false;
|
|
153
|
+
constructor(target, profile, dependencies) {
|
|
154
|
+
this.#target = target;
|
|
155
|
+
this.#profile = profile;
|
|
156
|
+
this.#cache = dependencies.cache;
|
|
157
|
+
this.#runSlots = dependencies.runSlots;
|
|
158
|
+
this.#environment = dependencies.environment;
|
|
159
|
+
this.#commands = new KunaTargetCommands(target, {
|
|
160
|
+
signal: this.#session.signal,
|
|
161
|
+
...(dependencies.launcher === undefined
|
|
162
|
+
? {}
|
|
163
|
+
: { launcher: dependencies.launcher }),
|
|
164
|
+
});
|
|
165
|
+
this.#queryWork = new KunaQueryWork(this.#commands, {
|
|
166
|
+
signal: this.#session.signal,
|
|
167
|
+
own: (work) => this.#own(work),
|
|
168
|
+
runSlots: dependencies.runSlots,
|
|
169
|
+
});
|
|
170
|
+
this.#references = new KunaReferenceQueries(this.#queryWork);
|
|
171
|
+
this.#strings = new KunaStringQueries(this.#queryWork);
|
|
172
|
+
}
|
|
173
|
+
async execute(operation, parameters, options = {}) {
|
|
174
|
+
if (this.#closing)
|
|
175
|
+
return err(kunaUnavailable(operation, "This Kuna session is closed."));
|
|
176
|
+
return this.#own(this.#execute(operation, parameters, {
|
|
177
|
+
...options,
|
|
178
|
+
signal: options.signal === undefined
|
|
179
|
+
? this.#session.signal
|
|
180
|
+
: AbortSignal.any([this.#session.signal, options.signal]),
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
#own(work) {
|
|
184
|
+
this.#active.add(work);
|
|
185
|
+
const release = () => this.#active.delete(work);
|
|
186
|
+
void work.then(release, release);
|
|
187
|
+
return work;
|
|
188
|
+
}
|
|
189
|
+
async #execute(operation, parameters, options) {
|
|
190
|
+
if (cancelled(options.signal))
|
|
191
|
+
return err(new AnalysisCancelledError(operation, {
|
|
192
|
+
cause: options.signal?.reason,
|
|
193
|
+
}));
|
|
194
|
+
if (operation !== "health" && !isKunaOperation(operation))
|
|
195
|
+
return err(kunaUnavailable(operation, "Kuna answers procedure and string queries, pseudocode, assembly and references; this operation needs another provider."));
|
|
196
|
+
const document = parameters.document;
|
|
197
|
+
if (document !== undefined && document !== this.#target.path)
|
|
198
|
+
return err(new AnalysisInputError(operation, {
|
|
199
|
+
userMessage: "A Kuna session analyzes one program; omit document or pass the selected target path.",
|
|
200
|
+
}, [
|
|
201
|
+
{
|
|
202
|
+
path: ["document"],
|
|
203
|
+
reason: "invalid_value",
|
|
204
|
+
expected: this.#target.path,
|
|
205
|
+
},
|
|
206
|
+
]));
|
|
207
|
+
const installation = await this.#ensureInstallation(operation, options.signal);
|
|
208
|
+
if (!installation.ok)
|
|
209
|
+
return installation;
|
|
210
|
+
try {
|
|
211
|
+
if (operation === "health")
|
|
212
|
+
return ok(this.#execution([], installation.value, {
|
|
213
|
+
result: {
|
|
214
|
+
ready: true,
|
|
215
|
+
kuna: {
|
|
216
|
+
version: installation.value.version,
|
|
217
|
+
verified: installation.value.verified,
|
|
218
|
+
sha256: installation.value.sha256,
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
source: null,
|
|
222
|
+
locations: [],
|
|
223
|
+
limitations: [],
|
|
224
|
+
}));
|
|
225
|
+
if (operation === "procedure_pseudo_code" ||
|
|
226
|
+
operation === "procedure_assembly" ||
|
|
227
|
+
operation === "analyze_function")
|
|
228
|
+
await this.#startProject(installation.value);
|
|
229
|
+
const answer = await this.#answer(operation, parameters, installation.value, options);
|
|
230
|
+
if (!answer.ok)
|
|
231
|
+
return err(kunaQueryFailureForCaller(answer.error, operation));
|
|
232
|
+
if (cancelled(options.signal))
|
|
233
|
+
return err(new AnalysisCancelledError(operation, {
|
|
234
|
+
cause: options.signal?.reason,
|
|
235
|
+
}));
|
|
236
|
+
return ok(this.#execution(kunaLimitations(operation), installation.value, answer.value));
|
|
237
|
+
}
|
|
238
|
+
catch (cause) {
|
|
239
|
+
if (cancelled(options.signal))
|
|
240
|
+
return err(new AnalysisCancelledError(operation, { cause }));
|
|
241
|
+
return err(failure(operation, cause));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Release everything this session owns. A failed close keeps reporting its
|
|
246
|
+
* failure, and each later call retries the cleanup that remains.
|
|
247
|
+
*/
|
|
248
|
+
async close() {
|
|
249
|
+
if (this.#closed)
|
|
250
|
+
return ok(null);
|
|
251
|
+
if (!this.#closing) {
|
|
252
|
+
this.#closing = true;
|
|
253
|
+
this.#session.abort();
|
|
254
|
+
}
|
|
255
|
+
// Cancellation starts process shutdown; its completion proves whether it
|
|
256
|
+
// is safe to remove private copies and exposes any retained cleanup owner.
|
|
257
|
+
// An admitted request may create a shared reader after shutdown begins.
|
|
258
|
+
while (this.#active.size > 0)
|
|
259
|
+
await Promise.allSettled(this.#active);
|
|
260
|
+
this.#references.clear();
|
|
261
|
+
this.#strings.clear();
|
|
262
|
+
this.#dropSingleFunctionTexts();
|
|
263
|
+
await this.#project;
|
|
264
|
+
await this.#inventory;
|
|
265
|
+
const failures = [];
|
|
266
|
+
// Kuna runs in its own process group; an export no other session wants
|
|
267
|
+
// must stop before this session reports itself closed.
|
|
268
|
+
if (this.#key !== undefined) {
|
|
269
|
+
const settled = await this.#cache.settled(this.#key);
|
|
270
|
+
if (!settled.ok)
|
|
271
|
+
failures.push(settled.error);
|
|
272
|
+
}
|
|
273
|
+
const commands = await this.#commands.close();
|
|
274
|
+
if (!commands.ok)
|
|
275
|
+
failures.push(commands.error);
|
|
276
|
+
try {
|
|
277
|
+
await this.#fileCloseResources.close();
|
|
278
|
+
}
|
|
279
|
+
catch (cause) {
|
|
280
|
+
const observation = ArtifactReaderFailure.cleanupObservation(cause, "Kuna provider file descriptor");
|
|
281
|
+
failures.push(new ProviderCleanupError(KUNA_PROVIDER_ID, observation.resources, { reason: observation.reason }, { cause, operation: "close_binary" }));
|
|
282
|
+
}
|
|
283
|
+
if (failures.length > 0)
|
|
284
|
+
return err(new ProviderCleanupError(KUNA_PROVIDER_ID, failures.flatMap((failed) => failed.cleanupResources), {
|
|
285
|
+
reason: failures
|
|
286
|
+
.map((failed) => String(failed.diagnostics?.["reason"] ?? failed.message))
|
|
287
|
+
.join("; "),
|
|
288
|
+
}, {
|
|
289
|
+
cause: new AggregateError(failures, "Kuna session cleanup remains incomplete"),
|
|
290
|
+
operation: "close_binary",
|
|
291
|
+
}).bindCleanupDependencies(failures));
|
|
292
|
+
this.#releasePin?.();
|
|
293
|
+
this.#releasePin = undefined;
|
|
294
|
+
this.#closed = true;
|
|
295
|
+
return ok(null);
|
|
296
|
+
}
|
|
297
|
+
#execution(operationLimitations, installation, answer) {
|
|
298
|
+
const source = answer.source;
|
|
299
|
+
const files = source?.kind !== "project-export"
|
|
300
|
+
? []
|
|
301
|
+
: (answer.files ?? []).map((file) => ({
|
|
302
|
+
facet: file.facet,
|
|
303
|
+
file: file.path,
|
|
304
|
+
file_sha256: Object.values(source.project.manifest.files).find(({ path }) => path === file.path)?.sha256 ?? null,
|
|
305
|
+
byte_offset: file.byteOffset,
|
|
306
|
+
byte_length: file.byteLength,
|
|
307
|
+
}));
|
|
308
|
+
// Preserve the direct text source shape; combined answers retain every
|
|
309
|
+
// component once, including its producing file digest and byte range.
|
|
310
|
+
const recordedFiles = files.length === 1 ? files[0] : files.length === 0 ? {} : { files };
|
|
311
|
+
return createAnalysisExecution(answer.result, {
|
|
312
|
+
id: KUNA_PROVIDER_ID,
|
|
313
|
+
name: "Kuna",
|
|
314
|
+
version: installation.version,
|
|
315
|
+
}, {
|
|
316
|
+
// Kuna's identity is in the analysis profile; the raw result records
|
|
317
|
+
// only where file-backed text came from.
|
|
318
|
+
...(source === null &&
|
|
319
|
+
answer.referenceSource === undefined &&
|
|
320
|
+
answer.stringSource === undefined
|
|
321
|
+
? {}
|
|
322
|
+
: {
|
|
323
|
+
rawResult: {
|
|
324
|
+
...(source === null
|
|
325
|
+
? {}
|
|
326
|
+
: {
|
|
327
|
+
source: source.kind === "single-function"
|
|
328
|
+
? { kind: "single-function" }
|
|
329
|
+
: {
|
|
330
|
+
kind: "project-export",
|
|
331
|
+
key: source.project.key,
|
|
332
|
+
directory: source.project.directory,
|
|
333
|
+
...recordedFiles,
|
|
334
|
+
},
|
|
335
|
+
project_export: this.#exportState(),
|
|
336
|
+
}),
|
|
337
|
+
...(answer.referenceSource === undefined
|
|
338
|
+
? {}
|
|
339
|
+
: { references: answer.referenceSource }),
|
|
340
|
+
...(answer.stringSource === undefined
|
|
341
|
+
? {}
|
|
342
|
+
: { strings: answer.stringSource }),
|
|
343
|
+
},
|
|
344
|
+
}),
|
|
345
|
+
limitations: [...operationLimitations, ...answer.limitations],
|
|
346
|
+
...(answer.relationshipCoverage === undefined
|
|
347
|
+
? {}
|
|
348
|
+
: { relationshipCoverage: answer.relationshipCoverage }),
|
|
349
|
+
locations: [
|
|
350
|
+
{ kind: "artifact-path", path: this.#target.path },
|
|
351
|
+
...answer.locations,
|
|
352
|
+
],
|
|
353
|
+
...(this.#profile === undefined
|
|
354
|
+
? {}
|
|
355
|
+
: { analysisProfile: this.#profile }),
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
/** Where the background export stands, for callers deciding whether to wait. */
|
|
359
|
+
#exportState() {
|
|
360
|
+
if (this.#reader !== undefined)
|
|
361
|
+
return { state: "ready", key: this.#reader.project.key };
|
|
362
|
+
if (this.#project === undefined)
|
|
363
|
+
return { state: "not-started" };
|
|
364
|
+
if (this.#exportFailure !== undefined)
|
|
365
|
+
return { state: "failed", reason: this.#exportFailure };
|
|
366
|
+
return {
|
|
367
|
+
state: "building",
|
|
368
|
+
phase: this.#status?.phase ?? null,
|
|
369
|
+
inventory_functions: this.#status?.inventory?.length ?? null,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
async #answer(operation, parameters, installation, options) {
|
|
373
|
+
if (operation === "list_documents")
|
|
374
|
+
return ok({
|
|
375
|
+
result: [this.#target.path],
|
|
376
|
+
source: null,
|
|
377
|
+
locations: [],
|
|
378
|
+
limitations: [],
|
|
379
|
+
});
|
|
380
|
+
if (operation === "xrefs" ||
|
|
381
|
+
operation === "procedure_callers" ||
|
|
382
|
+
operation === "procedure_callees")
|
|
383
|
+
return this.#referenceAnswer(operation, parameters, installation, options);
|
|
384
|
+
if (operation === "list_strings" || operation === "search_strings")
|
|
385
|
+
return this.#stringAnswer(operation, parameters, installation, options);
|
|
386
|
+
if (operation === "list_procedures" || operation === "search_procedures")
|
|
387
|
+
return this.#procedureList(operation, parameters, installation, options);
|
|
388
|
+
const inventory = await this.#ensureInventory(installation, options);
|
|
389
|
+
if (!inventory.ok)
|
|
390
|
+
return inventory;
|
|
391
|
+
if (operation === "address_name")
|
|
392
|
+
return this.#addressName(parameters, inventory.value, installation, options);
|
|
393
|
+
const entry = this.#resolve(operation, parameters.procedure, inventory.value);
|
|
394
|
+
if (!entry.ok) {
|
|
395
|
+
const selectedAddress = operation === "procedure_address"
|
|
396
|
+
? normalizeKunaAddress(parameters.procedure)
|
|
397
|
+
: undefined;
|
|
398
|
+
if (selectedAddress === undefined)
|
|
399
|
+
return entry;
|
|
400
|
+
const graph = await this.#references.functionAt(installation, selectedAddress, operation, options.signal);
|
|
401
|
+
if (!graph.ok)
|
|
402
|
+
return graph;
|
|
403
|
+
if (graph.value === undefined)
|
|
404
|
+
return entry;
|
|
405
|
+
return ok({
|
|
406
|
+
result: graph.value.address,
|
|
407
|
+
source: null,
|
|
408
|
+
locations: [{ kind: "address", address: selectedAddress }],
|
|
409
|
+
limitations: [],
|
|
410
|
+
referenceSource: graph.value.source,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
const locations = [
|
|
414
|
+
{ kind: "address", address: entry.value.address },
|
|
415
|
+
];
|
|
416
|
+
switch (operation) {
|
|
417
|
+
case "procedure_address":
|
|
418
|
+
return ok({
|
|
419
|
+
result: entry.value.address,
|
|
420
|
+
source: null,
|
|
421
|
+
locations,
|
|
422
|
+
limitations: [],
|
|
423
|
+
});
|
|
424
|
+
case "procedure_pseudo_code": {
|
|
425
|
+
const pseudocode = await this.#pseudocode(operation, entry.value, installation, options);
|
|
426
|
+
if (!pseudocode.ok)
|
|
427
|
+
return pseudocode;
|
|
428
|
+
return ok({ ...pseudocode.value, locations });
|
|
429
|
+
}
|
|
430
|
+
case "procedure_assembly": {
|
|
431
|
+
const assembly = await this.#assemblyText(operation, entry.value, installation, options);
|
|
432
|
+
if (!assembly.ok)
|
|
433
|
+
return assembly;
|
|
434
|
+
return ok({ ...assembly.value, locations });
|
|
435
|
+
}
|
|
436
|
+
case "analyze_function":
|
|
437
|
+
return this.#withProject(operation, installation, options, (reader) => this.#dossier(operation, entry.value, reader, installation, options.signal));
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
async #stringAnswer(operation, parameters, installation, options) {
|
|
441
|
+
const answer = await this.#own(this.#strings.execute(operation, parameters, installation, AbortSignal.any([
|
|
442
|
+
this.#session.signal,
|
|
443
|
+
...(options.signal === undefined ? [] : [options.signal]),
|
|
444
|
+
])));
|
|
445
|
+
return answer.ok
|
|
446
|
+
? ok({
|
|
447
|
+
result: answer.value.result,
|
|
448
|
+
source: null,
|
|
449
|
+
stringSource: answer.value.source,
|
|
450
|
+
locations: [],
|
|
451
|
+
limitations: [],
|
|
452
|
+
})
|
|
453
|
+
: answer;
|
|
454
|
+
}
|
|
455
|
+
async #procedureList(operation, parameters, installation, options) {
|
|
456
|
+
const query = operation === "search_procedures"
|
|
457
|
+
? analysisSearchQuerySchema.safeParse(parameters)
|
|
458
|
+
: undefined;
|
|
459
|
+
if (query !== undefined && !query.success)
|
|
460
|
+
return err(analysisInputErrorFromIssues(operation, query.error.issues, parameters));
|
|
461
|
+
const inventory = await this.#ensureInventory(installation, options);
|
|
462
|
+
if (!inventory.ok)
|
|
463
|
+
return inventory;
|
|
464
|
+
let selected = inventory.value;
|
|
465
|
+
if (query?.success === true) {
|
|
466
|
+
if (query.data.mode === "regex") {
|
|
467
|
+
const matches = await this.#queryWork.match({
|
|
468
|
+
operation,
|
|
469
|
+
pattern: query.data.pattern,
|
|
470
|
+
caseSensitive: query.data.case_sensitive,
|
|
471
|
+
values: () => inventory.value.map(({ name }) => name),
|
|
472
|
+
signal: options.signal,
|
|
473
|
+
});
|
|
474
|
+
if (!matches.ok)
|
|
475
|
+
return matches;
|
|
476
|
+
selected = matches.value.map((index) => inventory.value[index]);
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
const matches = analysisSearchPredicate(query.data);
|
|
480
|
+
selected = inventory.value.filter(({ name }) => matches(name));
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return ok({
|
|
484
|
+
result: selected.map(({ address, name }) => ({ address, value: name })),
|
|
485
|
+
source: null,
|
|
486
|
+
locations: [],
|
|
487
|
+
limitations: [],
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
async #referenceAnswer(operation, parameters, installation, options) {
|
|
491
|
+
const field = operation === "xrefs" ? "address" : "procedure";
|
|
492
|
+
const selected = await this.#referenceAddress(operation, parameters[field], field, installation, options);
|
|
493
|
+
if (!selected.ok)
|
|
494
|
+
return selected;
|
|
495
|
+
const address = selected.value;
|
|
496
|
+
const locations = [{ kind: "address", address }];
|
|
497
|
+
if (operation === "xrefs") {
|
|
498
|
+
const references = await this.#references.incoming(installation, address, options.signal);
|
|
499
|
+
if (!references.ok)
|
|
500
|
+
return references;
|
|
501
|
+
return ok({
|
|
502
|
+
result: [...references.value.addresses],
|
|
503
|
+
source: null,
|
|
504
|
+
locations,
|
|
505
|
+
limitations: [],
|
|
506
|
+
referenceSource: {
|
|
507
|
+
kind: "kuna-xrefs",
|
|
508
|
+
direction: "to",
|
|
509
|
+
target: address,
|
|
510
|
+
sha256: references.value.sha256,
|
|
511
|
+
bytes: references.value.bytes,
|
|
512
|
+
examined_rows: references.value.rows,
|
|
513
|
+
excluded_alias_rows: references.value.excludedAliasRows,
|
|
514
|
+
},
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
const relationships = await this.#references.relationships(installation, address, operation, options.signal);
|
|
518
|
+
if (!relationships.ok)
|
|
519
|
+
return relationships;
|
|
520
|
+
const entries = operation === "procedure_callers"
|
|
521
|
+
? relationships.value.callers
|
|
522
|
+
: relationships.value.callees;
|
|
523
|
+
return ok({
|
|
524
|
+
result: entries.map(({ address }) => address),
|
|
525
|
+
source: null,
|
|
526
|
+
locations,
|
|
527
|
+
referenceSource: relationships.value.source,
|
|
528
|
+
limitations: [],
|
|
529
|
+
relationshipCoverage: operation === "procedure_callers"
|
|
530
|
+
? relationships.value.callersCoverage
|
|
531
|
+
: relationships.value.calleesCoverage,
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
/** Exact addresses are validated by the producing graph, which also owns
|
|
535
|
+
* synthetic import nodes absent from the quick function inventory. */
|
|
536
|
+
async #referenceAddress(operation, raw, field, installation, options) {
|
|
537
|
+
if (typeof raw !== "string" || raw.length === 0)
|
|
538
|
+
return err(new AnalysisInputError(operation, { userMessage: `Kuna requires ${field}; it has no cursor.` }, [{ path: [field], reason: "missing_argument" }]));
|
|
539
|
+
const address = normalizeKunaAddress(raw);
|
|
540
|
+
if (address !== undefined)
|
|
541
|
+
return ok(address);
|
|
542
|
+
if (/^0x[0-9a-f]+$/iu.test(raw))
|
|
543
|
+
return err(new AnalysisInputError(operation, { userMessage: "The address exceeds Kuna's u64 address space." }, [{ path: [field], reason: "invalid_value" }]));
|
|
544
|
+
const inventory = await this.#ensureInventory(installation, options);
|
|
545
|
+
if (!inventory.ok)
|
|
546
|
+
return inventory;
|
|
547
|
+
const entry = this.#resolve(operation, raw, inventory.value, field);
|
|
548
|
+
return entry.ok ? ok(entry.value.address) : entry;
|
|
549
|
+
}
|
|
550
|
+
/** Resolve an exact inventory name, alias or entry address. */
|
|
551
|
+
#resolve(operation, raw, inventory, field = "procedure") {
|
|
552
|
+
const parsed = procedureSelectorSchema.safeParse(raw);
|
|
553
|
+
if (!parsed.success)
|
|
554
|
+
return err(new AnalysisInputError(operation, { userMessage: `${field} is required.` }, [{ path: [field], reason: "missing_argument" }]));
|
|
555
|
+
const selector = parsed.data;
|
|
556
|
+
const address = normalizeKunaAddress(selector);
|
|
557
|
+
if (address !== undefined) {
|
|
558
|
+
const entry = this.#index(inventory).byAddress.get(address);
|
|
559
|
+
return entry === undefined
|
|
560
|
+
? err(new AnalysisInputError(operation, {
|
|
561
|
+
userMessage: `${address} is not a procedure entry Kuna found; list_procedures shows the entries it found.`,
|
|
562
|
+
}))
|
|
563
|
+
: ok(entry);
|
|
564
|
+
}
|
|
565
|
+
const matches = this.#index(inventory).byName.get(selector) ?? [];
|
|
566
|
+
if (matches.length === 1 && matches[0] !== undefined)
|
|
567
|
+
return ok(matches[0]);
|
|
568
|
+
return err(new AnalysisInputError(operation, {
|
|
569
|
+
userMessage: matches.length === 0
|
|
570
|
+
? `Kuna found no procedure named ${selector}; search_procedures finds similar names.`
|
|
571
|
+
: `${selector} names ${String(matches.length)} Kuna entries (${matches.map(({ address }) => address).join(", ")}); select one by address.`,
|
|
572
|
+
}));
|
|
573
|
+
}
|
|
574
|
+
async #addressName(parameters, inventory, installation, options) {
|
|
575
|
+
const raw = parameters.address;
|
|
576
|
+
const address = normalizeKunaAddress(raw);
|
|
577
|
+
if (address === undefined)
|
|
578
|
+
return err(new AnalysisInputError("address_name", {
|
|
579
|
+
userMessage: "Kuna has no cursor; pass an explicit 0x-prefixed address.",
|
|
580
|
+
}, [{ path: ["address"], reason: "invalid_format" }]));
|
|
581
|
+
const locations = [{ kind: "address", address }];
|
|
582
|
+
const entry = this.#index(inventory).byAddress.get(address);
|
|
583
|
+
if (entry !== undefined)
|
|
584
|
+
return ok({
|
|
585
|
+
result: entry.name,
|
|
586
|
+
source: null,
|
|
587
|
+
locations,
|
|
588
|
+
limitations: [],
|
|
589
|
+
});
|
|
590
|
+
await this.#startProject(installation);
|
|
591
|
+
return this.#withProject("address_name", installation, options, async (reader) => {
|
|
592
|
+
const name = await reader.dataName(address, "address_name", options.signal);
|
|
593
|
+
if (!name.ok)
|
|
594
|
+
return name;
|
|
595
|
+
return ok({
|
|
596
|
+
result: name.value,
|
|
597
|
+
source: { kind: "project-export", project: reader.project },
|
|
598
|
+
locations,
|
|
599
|
+
limitations: [
|
|
600
|
+
"Kuna names function entries and the data its export references; null means Kuna assigned no name at this address, not that no symbol exists.",
|
|
601
|
+
],
|
|
602
|
+
});
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
async #pseudocode(operation, entry, installation, options) {
|
|
606
|
+
for (let recovered = false;;) {
|
|
607
|
+
const reader = this.#reader;
|
|
608
|
+
if (reader !== undefined) {
|
|
609
|
+
try {
|
|
610
|
+
const text = await reader.pseudocode(entry.address, operation);
|
|
611
|
+
if (!text.ok)
|
|
612
|
+
return text;
|
|
613
|
+
return ok({
|
|
614
|
+
...text.value,
|
|
615
|
+
source: { kind: "project-export", project: reader.project },
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
catch (cause) {
|
|
619
|
+
if (!isMissing(cause) || recovered)
|
|
620
|
+
throw cause;
|
|
621
|
+
recovered = true;
|
|
622
|
+
this.#invalidateProject(reader);
|
|
623
|
+
await this.#startProject(installation);
|
|
624
|
+
continue;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
const outcome = await this.#joinSingleFunction(operation, entry.address, installation, options.signal);
|
|
628
|
+
if (outcome === EXPORT_READY)
|
|
629
|
+
continue;
|
|
630
|
+
if (!outcome.ok)
|
|
631
|
+
return outcome;
|
|
632
|
+
const exportFailure = await this.#settledExportFailure();
|
|
633
|
+
return ok({
|
|
634
|
+
result: outcome.value,
|
|
635
|
+
source: { kind: "single-function" },
|
|
636
|
+
limitations: [
|
|
637
|
+
KUNA_SINGLE_FUNCTION_LIMITATION,
|
|
638
|
+
...(exportFailure === undefined
|
|
639
|
+
? []
|
|
640
|
+
: [
|
|
641
|
+
`The project export failed, so later requests also use single-function runs: ${exportFailure}`,
|
|
642
|
+
]),
|
|
643
|
+
],
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* Wait for this address's shared single-function run, starting it when none
|
|
649
|
+
* is in flight. A caller's cancellation stops only its own wait while others
|
|
650
|
+
* still wait; the last waiter stops the run and receives how it ended,
|
|
651
|
+
* including cleanup it could not prove. A completed text answers repeats
|
|
652
|
+
* until the export can.
|
|
653
|
+
*/
|
|
654
|
+
#joinSingleFunction(operation, address, installation, signal) {
|
|
655
|
+
if (cancelled(signal))
|
|
656
|
+
return Promise.resolve(err(new AnalysisCancelledError(operation, { cause: signal?.reason })));
|
|
657
|
+
const kept = this.#singleFunctionTexts.get(address);
|
|
658
|
+
if (kept !== undefined) {
|
|
659
|
+
this.#singleFunctionTexts.delete(address);
|
|
660
|
+
this.#singleFunctionTexts.set(address, kept);
|
|
661
|
+
return Promise.resolve(ok(kept.text));
|
|
662
|
+
}
|
|
663
|
+
let run = this.#singleFunctionRuns.get(address);
|
|
664
|
+
if (run === undefined) {
|
|
665
|
+
const controller = new AbortController();
|
|
666
|
+
const created = {
|
|
667
|
+
controller,
|
|
668
|
+
waiters: 0,
|
|
669
|
+
outcome: this.#own(this.#singleFunction(operation, address, installation, AbortSignal.any([this.#session.signal, controller.signal])).catch((cause) => err(failure(operation, cause)))),
|
|
670
|
+
};
|
|
671
|
+
this.#singleFunctionRuns.set(address, created);
|
|
672
|
+
void created.outcome.then((outcome) => {
|
|
673
|
+
// A run whose waiters all left was already replaced or removed.
|
|
674
|
+
if (this.#singleFunctionRuns.get(address) !== created)
|
|
675
|
+
return;
|
|
676
|
+
this.#singleFunctionRuns.delete(address);
|
|
677
|
+
if (outcome !== EXPORT_READY && outcome.ok)
|
|
678
|
+
this.#keepSingleFunctionText(address, outcome.value);
|
|
679
|
+
});
|
|
680
|
+
run = created;
|
|
681
|
+
}
|
|
682
|
+
const shared = run;
|
|
683
|
+
shared.waiters += 1;
|
|
684
|
+
return new Promise((resolve) => {
|
|
685
|
+
let waiting = true;
|
|
686
|
+
const leave = () => {
|
|
687
|
+
waiting = false;
|
|
688
|
+
shared.waiters -= 1;
|
|
689
|
+
};
|
|
690
|
+
const onAbort = () => {
|
|
691
|
+
if (!waiting)
|
|
692
|
+
return;
|
|
693
|
+
leave();
|
|
694
|
+
if (shared.waiters > 0) {
|
|
695
|
+
resolve(err(new AnalysisCancelledError(operation, { cause: signal?.reason })));
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
// A run whose waiters all left winds down; a new request starts afresh.
|
|
699
|
+
if (this.#singleFunctionRuns.get(address) === shared)
|
|
700
|
+
this.#singleFunctionRuns.delete(address);
|
|
701
|
+
shared.controller.abort(signal?.reason);
|
|
702
|
+
};
|
|
703
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
704
|
+
void shared.outcome.then((outcome) => {
|
|
705
|
+
signal?.removeEventListener("abort", onAbort);
|
|
706
|
+
if (waiting)
|
|
707
|
+
leave();
|
|
708
|
+
resolve(outcome);
|
|
709
|
+
});
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
/** Keep a completed text within budget, dropping the least recently used. */
|
|
713
|
+
#keepSingleFunctionText(address, text) {
|
|
714
|
+
// The export's text supersedes it; a closing session keeps nothing.
|
|
715
|
+
if (this.#reader !== undefined || this.#closing)
|
|
716
|
+
return;
|
|
717
|
+
const bytes = Buffer.byteLength(text) + SINGLE_FUNCTION_TEXT_ENTRY_BYTES;
|
|
718
|
+
if (bytes > SINGLE_FUNCTION_TEXT_CACHE_BYTES)
|
|
719
|
+
return;
|
|
720
|
+
this.#singleFunctionTexts.set(address, { text, bytes });
|
|
721
|
+
this.#singleFunctionTextBytes += bytes;
|
|
722
|
+
while (this.#singleFunctionTextBytes > SINGLE_FUNCTION_TEXT_CACHE_BYTES) {
|
|
723
|
+
const oldest = this.#singleFunctionTexts.entries().next().value;
|
|
724
|
+
if (oldest === undefined)
|
|
725
|
+
break;
|
|
726
|
+
this.#singleFunctionTexts.delete(oldest[0]);
|
|
727
|
+
this.#singleFunctionTextBytes -= oldest[1].bytes;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
#dropSingleFunctionTexts() {
|
|
731
|
+
this.#singleFunctionTexts.clear();
|
|
732
|
+
this.#singleFunctionTextBytes = 0;
|
|
733
|
+
}
|
|
734
|
+
/** One `kuna decompile --addr` run, admitted by the provider's run slots. */
|
|
735
|
+
async #singleFunction(operation, address, installation, signal) {
|
|
736
|
+
const prepared = await this.#commands.prepare();
|
|
737
|
+
if (!prepared.ok)
|
|
738
|
+
return prepared;
|
|
739
|
+
const admitted = await this.#admitSingleFunction(signal);
|
|
740
|
+
if (admitted === EXPORT_READY)
|
|
741
|
+
return admitted;
|
|
742
|
+
if (admitted === undefined)
|
|
743
|
+
return err(new AnalysisCancelledError(operation, { cause: signal.reason }));
|
|
744
|
+
const run = await this.#commands.run({
|
|
745
|
+
installation,
|
|
746
|
+
arguments: (input) => ["decompile", input, address, "--addr"],
|
|
747
|
+
operation,
|
|
748
|
+
deadline: kunaFunctionDeadline(installation.configuration),
|
|
749
|
+
outputBytes: KUNA_FUNCTION_TEXT_BYTES,
|
|
750
|
+
signal,
|
|
751
|
+
releaseRun: admitted,
|
|
752
|
+
});
|
|
753
|
+
return run.ok ? ok(run.value.stdout.text.replace(/\n+$/u, "")) : run;
|
|
754
|
+
}
|
|
755
|
+
/**
|
|
756
|
+
* A run slot, or EXPORT_READY when the export this session builds finishes
|
|
757
|
+
* first; the export then answers without another Kuna process.
|
|
758
|
+
*/
|
|
759
|
+
async #admitSingleFunction(signal) {
|
|
760
|
+
const yielded = new AbortController();
|
|
761
|
+
const slot = this.#runSlots.acquire(AbortSignal.any([signal, yielded.signal]));
|
|
762
|
+
const project = this.#project;
|
|
763
|
+
const exported = project === undefined
|
|
764
|
+
? undefined
|
|
765
|
+
: project.then((built) => built.ok && this.#reader !== undefined
|
|
766
|
+
? EXPORT_READY
|
|
767
|
+
: new Promise(() => undefined));
|
|
768
|
+
const admitted = await (exported === undefined
|
|
769
|
+
? slot
|
|
770
|
+
: Promise.race([slot, exported]));
|
|
771
|
+
if (admitted !== EXPORT_READY)
|
|
772
|
+
return admitted;
|
|
773
|
+
yielded.abort();
|
|
774
|
+
// A slot granted in the same turn is returned rather than leaked.
|
|
775
|
+
void slot.then((release) => release?.());
|
|
776
|
+
return EXPORT_READY;
|
|
777
|
+
}
|
|
778
|
+
async #assemblyText(operation, entry, installation, options) {
|
|
779
|
+
return this.#withProject(operation, installation, options, async (reader) => {
|
|
780
|
+
const text = await reader.assembly(entry.address, operation, options.signal);
|
|
781
|
+
return text.ok
|
|
782
|
+
? ok({
|
|
783
|
+
...text.value,
|
|
784
|
+
source: { kind: "project-export", project: reader.project },
|
|
785
|
+
})
|
|
786
|
+
: text;
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
async #dossier(operation, entry, reader, installation, signal) {
|
|
790
|
+
const assembly = await reader.assembly(entry.address, operation, signal);
|
|
791
|
+
if (!assembly.ok)
|
|
792
|
+
return assembly;
|
|
793
|
+
const pseudocode = await reader.pseudocode(entry.address, operation);
|
|
794
|
+
if (!pseudocode.ok)
|
|
795
|
+
return pseudocode;
|
|
796
|
+
const text = typeof pseudocode.value.result === "string"
|
|
797
|
+
? pseudocode.value.result
|
|
798
|
+
: null;
|
|
799
|
+
const unavailable = (reason) => ({ available: false, reason });
|
|
800
|
+
const relationships = await this.#references.relationships(installation, entry.address, operation, signal);
|
|
801
|
+
if (!relationships.ok &&
|
|
802
|
+
(relationships.error.cleanupIncomplete || signal?.aborted === true))
|
|
803
|
+
return relationships;
|
|
804
|
+
const callAvailability = relationships.ok
|
|
805
|
+
? { available: true }
|
|
806
|
+
: unavailable(relationships.error.userMessage ?? relationships.error.message);
|
|
807
|
+
const dossier = functionDossierSchema.parse({
|
|
808
|
+
procedure: {
|
|
809
|
+
address: entry.address,
|
|
810
|
+
name: entry.name,
|
|
811
|
+
classification: null,
|
|
812
|
+
body: unavailable("Kuna reports an inventory extent that is an upper bound, not observed body ranges."),
|
|
813
|
+
signature: null,
|
|
814
|
+
locals: [],
|
|
815
|
+
},
|
|
816
|
+
pseudocode: text ?? "",
|
|
817
|
+
assembly: typeof assembly.value.result === "string"
|
|
818
|
+
? assembly.value.result.split("\n")
|
|
819
|
+
: [],
|
|
820
|
+
comments: [],
|
|
821
|
+
callers: relationships.ok ? relationships.value.callers : [],
|
|
822
|
+
callees: relationships.ok ? relationships.value.callees : [],
|
|
823
|
+
incoming_references: [],
|
|
824
|
+
outgoing_references: [],
|
|
825
|
+
referenced_strings: [],
|
|
826
|
+
referenced_names: [],
|
|
827
|
+
basic_blocks: [],
|
|
828
|
+
native_api: null,
|
|
829
|
+
native_value_flow: null,
|
|
830
|
+
facet_availability: {
|
|
831
|
+
pseudocode: text === null
|
|
832
|
+
? unavailable(pseudocode.value.limitations.at(-1) ??
|
|
833
|
+
"Kuna did not supply pseudocode.")
|
|
834
|
+
: { available: true },
|
|
835
|
+
assembly: { available: true },
|
|
836
|
+
comments: unavailable("Kuna exports no analyst comments."),
|
|
837
|
+
callers: callAvailability,
|
|
838
|
+
callees: callAvailability,
|
|
839
|
+
references: unavailable("This provider does not report typed references."),
|
|
840
|
+
strings_names: unavailable("This provider does not report function-referenced strings and names."),
|
|
841
|
+
cfg: unavailable("Kuna exports no basic blocks."),
|
|
842
|
+
},
|
|
843
|
+
limitations: [
|
|
844
|
+
...kunaLimitations("analyze_function"),
|
|
845
|
+
...pseudocode.value.limitations,
|
|
846
|
+
KUNA_RELATIONSHIP_LIMITATION,
|
|
847
|
+
...(relationships.ok
|
|
848
|
+
? []
|
|
849
|
+
: [relationships.error.userMessage ?? relationships.error.message]),
|
|
850
|
+
],
|
|
851
|
+
});
|
|
852
|
+
return ok({
|
|
853
|
+
result: dossier,
|
|
854
|
+
source: { kind: "project-export", project: reader.project },
|
|
855
|
+
files: [
|
|
856
|
+
...(pseudocode.value.files ?? []),
|
|
857
|
+
...(assembly.value.files ?? []),
|
|
858
|
+
],
|
|
859
|
+
locations: [{ kind: "address", address: entry.address }],
|
|
860
|
+
limitations: [
|
|
861
|
+
...pseudocode.value.limitations,
|
|
862
|
+
KUNA_RELATIONSHIP_LIMITATION,
|
|
863
|
+
...(relationships.ok
|
|
864
|
+
? []
|
|
865
|
+
: [relationships.error.userMessage ?? relationships.error.message]),
|
|
866
|
+
],
|
|
867
|
+
referenceSource: relationships.ok
|
|
868
|
+
? relationships.value.source
|
|
869
|
+
: {
|
|
870
|
+
available: false,
|
|
871
|
+
reason: relationships.error.userMessage ?? relationships.error.message,
|
|
872
|
+
},
|
|
873
|
+
relationshipCoverage: relationships.ok
|
|
874
|
+
? combineFunctionRelationshipCoverage(relationships.value.callersCoverage, relationships.value.calleesCoverage)
|
|
875
|
+
: {
|
|
876
|
+
status: "unknown",
|
|
877
|
+
reason: relationships.error.userMessage ?? relationships.error.message,
|
|
878
|
+
limited_directions: ["callers", "callees"],
|
|
879
|
+
},
|
|
880
|
+
});
|
|
881
|
+
}
|
|
882
|
+
/** Address and name lookups over one inventory, built once. */
|
|
883
|
+
#index(inventory) {
|
|
884
|
+
if (this.#inventoryIndex?.inventory === inventory)
|
|
885
|
+
return this.#inventoryIndex;
|
|
886
|
+
const byAddress = new Map();
|
|
887
|
+
const byName = new Map();
|
|
888
|
+
for (const entry of inventory) {
|
|
889
|
+
byAddress.set(entry.address, entry);
|
|
890
|
+
for (const name of new Set([entry.name, ...entry.aliases])) {
|
|
891
|
+
const named = byName.get(name);
|
|
892
|
+
if (named === undefined)
|
|
893
|
+
byName.set(name, [entry]);
|
|
894
|
+
else
|
|
895
|
+
named.push(entry);
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
this.#inventoryIndex = { inventory, byAddress, byName };
|
|
899
|
+
return this.#inventoryIndex;
|
|
900
|
+
}
|
|
901
|
+
/** One installation producer; only the final departing caller stops it. */
|
|
902
|
+
async #ensureInstallation(operation, signal) {
|
|
903
|
+
let attempt = this.#installation;
|
|
904
|
+
if (attempt === undefined) {
|
|
905
|
+
attempt = new SharedStartupAttempt((ownerSignal) => this.#own(this.#inspectInstallation(ownerSignal)), this.#session.signal);
|
|
906
|
+
const owned = attempt;
|
|
907
|
+
this.#installation = owned;
|
|
908
|
+
void owned.promise.then((result) => {
|
|
909
|
+
// A proven cancellation has no reusable installation result. Its
|
|
910
|
+
// complete cleanup precedes replacement; physical failures stay cached.
|
|
911
|
+
if (this.#installation === owned &&
|
|
912
|
+
owned.signal.aborted &&
|
|
913
|
+
(result.ok ||
|
|
914
|
+
(result.error instanceof AnalysisCancelledError &&
|
|
915
|
+
!result.error.cleanupIncomplete)))
|
|
916
|
+
this.#installation = undefined;
|
|
917
|
+
});
|
|
918
|
+
}
|
|
919
|
+
const waited = await attempt.wait(signal);
|
|
920
|
+
if (waited.status === "cancelled")
|
|
921
|
+
return err(new AnalysisCancelledError(operation, { cause: signal?.reason }));
|
|
922
|
+
if (!waited.value.ok) {
|
|
923
|
+
// A fresh caller can arrive while the previous final waiter joins stop.
|
|
924
|
+
// Retry only proven cancellation, never an authored physical failure.
|
|
925
|
+
if (!signal?.aborted &&
|
|
926
|
+
attempt.signal.aborted &&
|
|
927
|
+
waited.value.error instanceof AnalysisCancelledError &&
|
|
928
|
+
!waited.value.error.cleanupIncomplete)
|
|
929
|
+
return this.#ensureInstallation(operation, signal);
|
|
930
|
+
return err(kunaQueryFailureForCaller(waited.value.error, operation));
|
|
931
|
+
}
|
|
932
|
+
if (signal?.aborted)
|
|
933
|
+
return err(new AnalysisCancelledError(operation, { cause: signal.reason }));
|
|
934
|
+
return waited.value;
|
|
935
|
+
}
|
|
936
|
+
async #inspectInstallation(signal) {
|
|
937
|
+
const parentFileCloseResources = {
|
|
938
|
+
retain: (owner, resource) => this.#fileCloseResources.retain({
|
|
939
|
+
kind: "lease",
|
|
940
|
+
resource,
|
|
941
|
+
lease: AnalysisCleanupLease.forCloseOwner(owner, resource),
|
|
942
|
+
}),
|
|
943
|
+
run: (operation) => this.#fileCloseResources.run(operation),
|
|
944
|
+
};
|
|
945
|
+
const fileCloseScope = createKunaFileCloseScope(parentFileCloseResources);
|
|
946
|
+
try {
|
|
947
|
+
const inspected = await inspectKunaInstallation(this.#environment, {
|
|
948
|
+
fileCloseResources: fileCloseScope.owner,
|
|
949
|
+
signal,
|
|
950
|
+
});
|
|
951
|
+
if (!inspected.ok)
|
|
952
|
+
return err(kunaUnavailable("health", inspected.error.reason));
|
|
953
|
+
const committed = this.#profile?.parameters["kuna_sha256"];
|
|
954
|
+
if (committed !== undefined && committed !== inspected.value.sha256)
|
|
955
|
+
return err(new ProviderAdapterError(KUNA_PROVIDER_ID, "health", {
|
|
956
|
+
userMessage: "The Kuna executable changed after this target was opened; reopen the target to analyze it with the current executable.",
|
|
957
|
+
diagnostics: {
|
|
958
|
+
committed_sha256: committed,
|
|
959
|
+
observed_sha256: inspected.value.sha256,
|
|
960
|
+
},
|
|
961
|
+
}));
|
|
962
|
+
return ok(inspected.value);
|
|
963
|
+
}
|
|
964
|
+
catch (cause) {
|
|
965
|
+
const cancellation = regularFileCancellation(cause);
|
|
966
|
+
if (!(cause instanceof RegularFileCleanupFailure) &&
|
|
967
|
+
cancellation !== undefined)
|
|
968
|
+
return err(new AnalysisCancelledError("health", {
|
|
969
|
+
cause: cancellation.reason,
|
|
970
|
+
}));
|
|
971
|
+
if (!(cause instanceof RegularFileCleanupFailure))
|
|
972
|
+
return err(failure("health", cause));
|
|
973
|
+
const error = kunaFileCleanupError(cause, "health");
|
|
974
|
+
fileCloseScope.bindFailure(cause, error);
|
|
975
|
+
return err(error);
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
/** Reuse a verified export, or start building one in the background. */
|
|
979
|
+
#startProject(installation) {
|
|
980
|
+
if (this.#project !== undefined)
|
|
981
|
+
return Promise.resolve();
|
|
982
|
+
// Concurrent first requests share one lookup, which verifies every
|
|
983
|
+
// export file's digest on a fresh server.
|
|
984
|
+
this.#starting ??= this.#lookupOrBuild(installation).finally(() => {
|
|
985
|
+
this.#starting = undefined;
|
|
986
|
+
});
|
|
987
|
+
return this.#starting;
|
|
988
|
+
}
|
|
989
|
+
async #lookupOrBuild(installation) {
|
|
990
|
+
const key = kunaProjectKey({
|
|
991
|
+
targetSha256: this.#target.sha256,
|
|
992
|
+
kunaSha256: installation.sha256,
|
|
993
|
+
kunaVersion: installation.version,
|
|
994
|
+
jobs: installation.configuration.jobs,
|
|
995
|
+
});
|
|
996
|
+
this.#key = key;
|
|
997
|
+
const cached = await this.#cache.lookup(key, this.#session.signal);
|
|
998
|
+
if (cached !== undefined) {
|
|
999
|
+
this.#adopt(cached);
|
|
1000
|
+
this.#project = Promise.resolve(ok(cached));
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
let listed;
|
|
1004
|
+
this.#exportInventory = new Promise((resolve) => {
|
|
1005
|
+
listed = resolve;
|
|
1006
|
+
});
|
|
1007
|
+
this.#project = this.#cache
|
|
1008
|
+
.build({
|
|
1009
|
+
installation,
|
|
1010
|
+
targetPath: this.#target.path,
|
|
1011
|
+
targetSha256: this.#target.sha256,
|
|
1012
|
+
signal: this.#session.signal,
|
|
1013
|
+
onStatus: (status) => {
|
|
1014
|
+
this.#status = status;
|
|
1015
|
+
if (status.inventory !== null)
|
|
1016
|
+
listed(status.inventory);
|
|
1017
|
+
},
|
|
1018
|
+
})
|
|
1019
|
+
.then((result) => {
|
|
1020
|
+
listed(result.ok ? result.value.inventory : undefined);
|
|
1021
|
+
if (result.ok && !this.#closing)
|
|
1022
|
+
this.#adopt(result.value);
|
|
1023
|
+
else if (!result.ok && !this.#closing)
|
|
1024
|
+
this.#exportFailure =
|
|
1025
|
+
result.error.userMessage ?? result.error.message;
|
|
1026
|
+
return result;
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
/** Retry the complete read when its immutable project disappears, never just one facet. */
|
|
1030
|
+
async #withProject(operation, installation, options, read) {
|
|
1031
|
+
for (let attempt = 0;; attempt += 1) {
|
|
1032
|
+
const reader = await this.#awaitProject(operation, options);
|
|
1033
|
+
if (!reader.ok)
|
|
1034
|
+
return reader;
|
|
1035
|
+
try {
|
|
1036
|
+
return await read(reader.value);
|
|
1037
|
+
}
|
|
1038
|
+
catch (cause) {
|
|
1039
|
+
if (!isMissing(cause) || attempt !== 0)
|
|
1040
|
+
throw cause;
|
|
1041
|
+
this.#invalidateProject(reader.value);
|
|
1042
|
+
await this.#startProject(installation);
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
#invalidateProject(reader) {
|
|
1047
|
+
// Another request may already have replaced this reader and its build.
|
|
1048
|
+
if (this.#reader !== reader)
|
|
1049
|
+
return;
|
|
1050
|
+
this.#releasePin?.();
|
|
1051
|
+
this.#releasePin = undefined;
|
|
1052
|
+
this.#reader = undefined;
|
|
1053
|
+
this.#project = undefined;
|
|
1054
|
+
this.#status = undefined;
|
|
1055
|
+
this.#exportFailure = undefined;
|
|
1056
|
+
}
|
|
1057
|
+
#adopt(project) {
|
|
1058
|
+
this.#reader = this.#readerFor(project);
|
|
1059
|
+
this.#dropSingleFunctionTexts();
|
|
1060
|
+
this.#releasePin ??= this.#cache.pin(project.key);
|
|
1061
|
+
}
|
|
1062
|
+
#readerFor(project) {
|
|
1063
|
+
return this.#reader?.project === project
|
|
1064
|
+
? this.#reader
|
|
1065
|
+
: new KunaProjectReader(project, {
|
|
1066
|
+
signal: this.#session.signal,
|
|
1067
|
+
own: (work) => this.#own(work),
|
|
1068
|
+
});
|
|
1069
|
+
}
|
|
1070
|
+
/** The export's failure once it has settled; undefined while it builds or after success. */
|
|
1071
|
+
async #settledExportFailure() {
|
|
1072
|
+
const settled = await Promise.race([
|
|
1073
|
+
this.#project,
|
|
1074
|
+
Promise.resolve(undefined),
|
|
1075
|
+
]);
|
|
1076
|
+
if (settled === undefined || settled.ok)
|
|
1077
|
+
return undefined;
|
|
1078
|
+
return settled.error.userMessage ?? settled.error.message;
|
|
1079
|
+
}
|
|
1080
|
+
/** Wait for the export, reporting progress, without cancelling it for other callers. */
|
|
1081
|
+
async #awaitProject(operation, options) {
|
|
1082
|
+
if (this.#reader !== undefined)
|
|
1083
|
+
return ok(this.#reader);
|
|
1084
|
+
const project = this.#project;
|
|
1085
|
+
if (project === undefined)
|
|
1086
|
+
return err(new ProviderAdapterError(KUNA_PROVIDER_ID, operation, {
|
|
1087
|
+
userMessage: "The Kuna project export was never started.",
|
|
1088
|
+
}));
|
|
1089
|
+
const started = Date.now();
|
|
1090
|
+
const progress = options.progress;
|
|
1091
|
+
// Report waiting only; Kuna exposes no measure of completed export work.
|
|
1092
|
+
const timer = setInterval(() => {
|
|
1093
|
+
void progress
|
|
1094
|
+
?.report({
|
|
1095
|
+
phase: "kuna_export",
|
|
1096
|
+
completed: 0,
|
|
1097
|
+
total: null,
|
|
1098
|
+
message: `Waiting for Kuna's project export (${this.#status?.phase ?? "starting"}, ${String(Math.floor((Date.now() - started) / 1000))}s elapsed); it serves this request and every later one`,
|
|
1099
|
+
})
|
|
1100
|
+
.catch(() => undefined);
|
|
1101
|
+
}, WAIT_PROGRESS_INTERVAL_MS);
|
|
1102
|
+
try {
|
|
1103
|
+
const built = await waitFor(project, options.signal, operation);
|
|
1104
|
+
if (!built.ok)
|
|
1105
|
+
return err(exportUnavailable(operation, built.error));
|
|
1106
|
+
return ok(this.#readerFor(built.value));
|
|
1107
|
+
}
|
|
1108
|
+
finally {
|
|
1109
|
+
clearInterval(timer);
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
/** The published or building export's inventory, otherwise one `kuna functions` run. */
|
|
1113
|
+
async #ensureInventory(installation, options) {
|
|
1114
|
+
if (this.#reader !== undefined)
|
|
1115
|
+
return ok(this.#reader.project.inventory);
|
|
1116
|
+
const exported = this.#status?.inventory;
|
|
1117
|
+
if (exported !== undefined && exported !== null)
|
|
1118
|
+
return ok(exported);
|
|
1119
|
+
if (this.#inventory === undefined) {
|
|
1120
|
+
// The session owns the shared run; each caller only stops waiting.
|
|
1121
|
+
const run = this.#listInventory(installation);
|
|
1122
|
+
this.#inventory = run;
|
|
1123
|
+
void run.then((listed) => {
|
|
1124
|
+
// A failed listing is retried by the next request.
|
|
1125
|
+
if (!listed.ok && this.#inventory === run)
|
|
1126
|
+
this.#inventory = undefined;
|
|
1127
|
+
});
|
|
1128
|
+
}
|
|
1129
|
+
return waitFor(this.#inventory, options.signal, "list_procedures");
|
|
1130
|
+
}
|
|
1131
|
+
/**
|
|
1132
|
+
* The export lists every callable entry before it decompiles, so listings
|
|
1133
|
+
* wait for that inventory. Only an export that ends without one, or none at
|
|
1134
|
+
* all, leads to a separate `kuna functions` run.
|
|
1135
|
+
*/
|
|
1136
|
+
async #listInventory(installation) {
|
|
1137
|
+
// A concurrent text request may still be choosing between the cache and a
|
|
1138
|
+
// build; its outcome decides whether an inventory already exists.
|
|
1139
|
+
await this.#starting?.catch(() => undefined);
|
|
1140
|
+
if (this.#reader !== undefined)
|
|
1141
|
+
return ok(this.#reader.project.inventory);
|
|
1142
|
+
const exported = await this.#exportInventory;
|
|
1143
|
+
if (exported !== undefined)
|
|
1144
|
+
return ok(exported);
|
|
1145
|
+
const run = await this.#commands.run({
|
|
1146
|
+
installation,
|
|
1147
|
+
arguments: (input) => ["functions", input, "--json"],
|
|
1148
|
+
operation: "list_procedures",
|
|
1149
|
+
deadline: kunaFunctionDeadline(installation.configuration),
|
|
1150
|
+
outputBytes: KUNA_INVENTORY_OUTPUT_BYTES,
|
|
1151
|
+
signal: this.#session.signal,
|
|
1152
|
+
});
|
|
1153
|
+
if (!run.ok)
|
|
1154
|
+
return run;
|
|
1155
|
+
const inventory = parseKunaInventory(run.value.stdout.text);
|
|
1156
|
+
return inventory.ok
|
|
1157
|
+
? ok(inventory.value)
|
|
1158
|
+
: err(new ProviderAdapterError(KUNA_PROVIDER_ID, "list_procedures", {
|
|
1159
|
+
userMessage: `Kuna's function inventory is not usable: ${inventory.error}`,
|
|
1160
|
+
}));
|
|
1161
|
+
}
|
|
1162
|
+
}
|