rea-agents 6.1.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +7 -5
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +6 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +57 -35
  7. package/dist/application/BinaryTargetResolver.js +5 -3
  8. package/dist/application/BrowserEvidence.js +3 -8
  9. package/dist/application/BrowserScenarioEvidence.js +2 -18
  10. package/dist/application/CapabilityInventory.js +43 -9
  11. package/dist/application/ClientConfigurationDocument.js +69 -25
  12. package/dist/application/DirectAnalysis.js +29 -14
  13. package/dist/application/DirectAnalysisCleanup.js +72 -0
  14. package/dist/application/DirectAnalysisStatus.js +4 -5
  15. package/dist/application/Doctor.js +15 -19
  16. package/dist/application/DoctorDiagnostics.js +1 -2
  17. package/dist/application/EnhancedTools.js +51 -6
  18. package/dist/application/EvidenceBundleFiles.js +8 -3
  19. package/dist/application/InvestigationProviders.js +9 -1
  20. package/dist/application/JsonFiles.js +42 -9
  21. package/dist/application/LinuxHopper.js +9 -6
  22. package/dist/application/MacHopper.js +15 -18
  23. package/dist/application/RealHopperAssertions.js +0 -11
  24. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  25. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  26. package/dist/application/Setup.js +8 -16
  27. package/dist/application/SetupHost.js +16 -27
  28. package/dist/application/SetupPlan.js +6 -6
  29. package/dist/application/Uninstall.js +81 -29
  30. package/dist/application/UpdateMaintenance.js +7 -5
  31. package/dist/application/UpdateRuntime.js +12 -12
  32. package/dist/application/WebScriptExportService.js +30 -4
  33. package/dist/application/WorkflowEvidence.js +25 -2
  34. package/dist/application/XrefsAddressResolution.js +45 -0
  35. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  36. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  37. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  38. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  39. package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
  40. package/dist/application/binary/BinarySession.js +70 -29
  41. package/dist/application/binary/BinarySessionComposition.js +1 -3
  42. package/dist/application/binary/BinarySessionExecution.js +3 -5
  43. package/dist/application/binary/BinarySessionOpen.js +1 -1
  44. package/dist/application/binary/BinarySessionRecords.js +1 -1
  45. package/dist/application/binary/BinarySessionStatus.js +1 -6
  46. package/dist/application/binary/CompositeProvider.js +4 -18
  47. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  48. package/dist/application/binary/SessionProviderRouter.js +27 -135
  49. package/dist/application/homebrew.js +48 -0
  50. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  51. package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
  52. package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
  53. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
  54. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
  55. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  56. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  57. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  58. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  59. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  60. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
  61. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
  62. package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
  63. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  64. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  65. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  66. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  67. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  68. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  69. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  70. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
  71. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  72. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  73. package/dist/application/process/ProcessCli.js +11 -11
  74. package/dist/application/process/ProcessEvidence.js +0 -1
  75. package/dist/artifacts/ArtifactProvider.js +39 -14
  76. package/dist/artifacts/ArtifactReader.js +31 -0
  77. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  78. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  79. package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
  80. package/dist/artifacts/SafeOutputTree.js +16 -2
  81. package/dist/artifacts/ZipArtifactReader.js +11 -4
  82. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  83. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  84. package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
  85. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  86. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
  87. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  88. package/dist/artifacts/inventory/reader.js +3 -3
  89. package/dist/artifacts/inventory/scanCanonical.js +48 -24
  90. package/dist/artifacts/inventory/scanReader.js +5 -9
  91. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  92. package/dist/browser/CdpBrowserProvider.js +2 -3
  93. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  94. package/dist/browser/CdpCaptureEvents.js +0 -1
  95. package/dist/browser/CdpCaptureValues.js +20 -0
  96. package/dist/browser/CdpElectronProvider.js +0 -2
  97. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  98. package/dist/browser/CdpElectronScripts.js +2 -3
  99. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  100. package/dist/browser/CdpSafeMetadata.js +10 -10
  101. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  102. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  103. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  104. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  105. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  106. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  107. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  108. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  109. package/dist/browser/history/CaptureFailures.js +6 -2
  110. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  111. package/dist/catalogIdentity.js +0 -1
  112. package/dist/cli/analysisViewCommands.js +36 -0
  113. package/dist/cli/artifactCommands.js +11 -12
  114. package/dist/cli/coreAnalysisCommands.js +3 -3
  115. package/dist/cli/coreBinaryCommands.js +32 -27
  116. package/dist/cli/coreNativeCommands.js +9 -10
  117. package/dist/cli/electronCommands.js +4 -4
  118. package/dist/cli/interactiveSetup.js +6 -6
  119. package/dist/cli/managedCommands.js +7 -8
  120. package/dist/cli/nativeCallCommands.js +1 -2
  121. package/dist/cli/omittableDefaults.js +50 -0
  122. package/dist/cli/processCommands.js +3 -2
  123. package/dist/cli/setupCommands.js +16 -15
  124. package/dist/cli/utilityCommands.js +9 -9
  125. package/dist/cli.js +16 -8
  126. package/dist/cliBrowserScenarioCommands.js +2 -2
  127. package/dist/cliCommandNames.js +1 -0
  128. package/dist/cliJsonInput.js +15 -1
  129. package/dist/cliOutput.js +0 -38
  130. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  131. package/dist/composition/binary.js +9 -9
  132. package/dist/composition/browserScenario.js +2 -1
  133. package/dist/composition/directAnalysis.js +20 -13
  134. package/dist/composition/electronScenario.js +1 -1
  135. package/dist/composition/optionalObservationProviders.js +12 -7
  136. package/dist/config/environment.js +6 -0
  137. package/dist/config/ghidraStartupTimeout.js +4 -9
  138. package/dist/config/homeDirectory.js +12 -0
  139. package/dist/config/mcpResponseBudget.js +9 -1
  140. package/dist/config/parseConfig.js +7 -3
  141. package/dist/config/parsers.js +19 -22
  142. package/dist/contracts/analysisViewToolContracts.js +56 -0
  143. package/dist/contracts/applicationToolContracts.js +5 -4
  144. package/dist/contracts/artifactComparisonExample.js +2 -2
  145. package/dist/contracts/artifactToolContracts.js +1 -1
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  147. package/dist/contracts/browserToolContracts.js +19 -15
  148. package/dist/contracts/enhancedInputs.js +2 -2
  149. package/dist/contracts/enhancedToolContracts.js +4 -3
  150. package/dist/contracts/evm/evmToolContracts.js +1 -1
  151. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  152. package/dist/contracts/inputSchemaPresentation.js +90 -0
  153. package/dist/contracts/investigationExamples.js +4 -3
  154. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  155. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  156. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  157. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  158. package/dist/contracts/managed/managedToolContracts.js +5 -10
  159. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  160. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  161. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  162. package/dist/contracts/native/nativeToolContracts.js +2 -2
  163. package/dist/contracts/officialToolContracts.js +2 -1
  164. package/dist/contracts/promptContracts.js +2 -2
  165. package/dist/contracts/providerSelection.js +1 -1
  166. package/dist/contracts/sessionToolContracts.js +14 -2
  167. package/dist/contracts/sessionToolSchemas.js +1 -14
  168. package/dist/contracts/toolContracts.js +2 -0
  169. package/dist/contracts/toolEffects.js +1 -0
  170. package/dist/contracts/toolOutputSchemaGroups.js +136 -92
  171. package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
  172. package/dist/contracts/toolSchemaMetadata.js +18 -69
  173. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  174. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  175. package/dist/contracts/webScriptToolContracts.js +1 -1
  176. package/dist/doctorRuntime.js +7 -5
  177. package/dist/domain/analysisErrorCore.js +3 -0
  178. package/dist/domain/analysisErrorPresentation.js +18 -3
  179. package/dist/domain/analysisErrorProjection.js +24 -5
  180. package/dist/domain/analysisSnapshot.js +29 -31
  181. package/dist/domain/analysisView/analysisView.js +243 -0
  182. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  183. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  184. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  185. package/dist/domain/android/androidApplication.js +1 -1
  186. package/dist/domain/apple/appleApplication.js +1 -1
  187. package/dist/domain/apple/dylibResolution.js +10 -3
  188. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  189. package/dist/domain/apple/keyedArchive.js +26 -2
  190. package/dist/domain/artifactComparison.js +15 -6
  191. package/dist/domain/artifactGraph.js +16 -3
  192. package/dist/domain/artifactInventoryEvidence.js +9 -16
  193. package/dist/domain/artifactOperationError.js +3 -3
  194. package/dist/domain/artifactPartialObservation.js +1 -0
  195. package/dist/domain/artifactPathSyntax.js +49 -0
  196. package/dist/domain/binaryTarget.js +39 -13
  197. package/dist/domain/browserCaptureComparison.js +13 -49
  198. package/dist/domain/browserNetworkEvidence.js +10 -4
  199. package/dist/domain/browserObservation.js +0 -1
  200. package/dist/domain/browserObservationSchemas.js +14 -3
  201. package/dist/domain/browserScenario.js +0 -1
  202. package/dist/domain/browserScenarioCapture.js +1 -2
  203. package/dist/domain/browserScenarioDiff.js +0 -2
  204. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  205. package/dist/domain/browserScenarioDiffValues.js +2 -2
  206. package/dist/domain/browserScenarioValues.js +3 -4
  207. package/dist/domain/callPath.js +8 -9
  208. package/dist/domain/callPathSchemas.js +2 -2
  209. package/dist/domain/changedBehavior.js +3 -3
  210. package/dist/domain/completionLedgerGeneration.js +2 -1
  211. package/dist/domain/configurationErrors.js +12 -0
  212. package/dist/domain/conformancePackage.js +4 -3
  213. package/dist/domain/evidence.js +10 -36
  214. package/dist/domain/evidenceBundle.js +7 -9
  215. package/dist/domain/evidenceCompletionLedger.js +2 -1
  216. package/dist/domain/functionComparison.js +4 -5
  217. package/dist/domain/functionComparisonDimensions.js +120 -87
  218. package/dist/domain/functionComparisonNormalization.js +23 -34
  219. package/dist/domain/functionComparisonResults.js +1 -4
  220. package/dist/domain/functionComparisonSchemas.js +2 -8
  221. package/dist/domain/functionDossierEvidence.js +2 -37
  222. package/dist/domain/javascript/electronActiveObservation.js +26 -69
  223. package/dist/domain/javascript/electronObservation.js +14 -3
  224. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  225. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  226. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  227. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  228. package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
  229. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  230. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  231. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  232. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  233. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  234. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  235. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  236. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  237. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  238. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  239. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  240. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  241. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  242. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  243. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  244. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  245. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  246. package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
  247. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  248. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  249. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  250. package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
  251. package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
  252. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  253. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  254. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  255. package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
  256. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  257. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  258. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  259. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  260. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  261. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  262. package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
  263. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  264. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  265. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
  266. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  267. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  268. package/dist/domain/localPath.js +1 -1
  269. package/dist/domain/managed/managedArtifact.js +6 -4
  270. package/dist/domain/managed/managedMemberComparison.js +2 -9
  271. package/dist/domain/managed/managedNativeVerification.js +0 -2
  272. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  273. package/dist/domain/native/binaryLayout.js +2 -3
  274. package/dist/domain/native/nativeApiBoundary.js +1 -1
  275. package/dist/domain/native/nativeCallObservation.js +5 -3
  276. package/dist/domain/native/nativeInstruction.js +7 -0
  277. package/dist/domain/native/recordedCrash.js +2 -3
  278. package/dist/domain/offsetDateTime.js +17 -0
  279. package/dist/domain/process/processCapture.js +13 -12
  280. package/dist/domain/process/processCaptureCoverage.js +67 -0
  281. package/dist/domain/process/processCaptureExample.js +2 -1
  282. package/dist/domain/process/processCaptureParsing.js +1 -34
  283. package/dist/domain/process/processCaptureValidation.js +81 -13
  284. package/dist/domain/process/processComparison.js +41 -22
  285. package/dist/domain/process/processObservation.js +10 -2
  286. package/dist/domain/process/processScenario.js +24 -2
  287. package/dist/domain/process/processTraceComparison.js +0 -2
  288. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  289. package/dist/domain/process/processTraceEvaluation.js +15 -11
  290. package/dist/domain/process/processTraceSpecification.js +3 -4
  291. package/dist/domain/providerAdapterError.js +2 -0
  292. package/dist/domain/reconstructionCoverage.js +5 -2
  293. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  294. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  295. package/dist/domain/reconstructionVerification.js +3 -3
  296. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  297. package/dist/domain/referenceSourceGraph.js +20 -21
  298. package/dist/domain/staticRuntimeCorrelation.js +2 -2
  299. package/dist/domain/stringPatterns.js +6 -0
  300. package/dist/domain/swiftSymbolClassification.js +61 -0
  301. package/dist/domain/symbolAnalysis.js +66 -18
  302. package/dist/domain/webCaptureDiff.js +0 -1
  303. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  304. package/dist/domain/webEventListeners.js +3 -2
  305. package/dist/domain/webExecution.js +3 -2
  306. package/dist/domain/webRuntime.js +0 -2
  307. package/dist/domain/webScriptExport.js +1 -1
  308. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  309. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  310. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  311. package/dist/dotnet/ManagedMemberRows.js +75 -62
  312. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  313. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  314. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  315. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  316. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  317. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  318. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  319. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  320. package/dist/evaluation/CodexAgentEval.js +12 -8
  321. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  322. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  323. package/dist/firmware/FirmwareCommand.js +9 -5
  324. package/dist/firmware/FirmwareProvider.js +4 -4
  325. package/dist/generatedPackageMetadata.js +2 -2
  326. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  327. package/dist/ghidra/GhidraClient.js +91 -32
  328. package/dist/ghidra/GhidraClientStartup.js +0 -2
  329. package/dist/ghidra/GhidraDoctor.js +6 -5
  330. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  331. package/dist/ghidra/GhidraInstallation.js +40 -12
  332. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  333. package/dist/ghidra/GhidraLauncher.js +15 -7
  334. package/dist/ghidra/GhidraProvider.js +6 -2
  335. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  336. package/dist/ghidra/GhidraProviderClient.js +13 -3
  337. package/dist/ghidra/GhidraSessionError.js +2 -0
  338. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  339. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  340. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  341. package/dist/hopper/BridgeLauncher.js +34 -45
  342. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  343. package/dist/hopper/HopperCleanup.js +56 -27
  344. package/dist/hopper/HopperClient.js +86 -65
  345. package/dist/hopper/HopperMachOImage.js +3 -2
  346. package/dist/hopper/HopperProvider.js +16 -18
  347. package/dist/hopper/HopperRegexSearch.js +3 -6
  348. package/dist/hopper/HopperTargetLease.js +132 -49
  349. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  350. package/dist/ida/IdaConfiguration.js +8 -3
  351. package/dist/ida/IdaInput.js +1 -7
  352. package/dist/ida/IdaMcpConnection.js +8 -4
  353. package/dist/ida/IdaOperationRunner.js +3 -3
  354. package/dist/ida/IdaProvider.js +8 -12
  355. package/dist/ida/IdaSessionClient.js +20 -18
  356. package/dist/ida/IdaWorkspace.js +12 -13
  357. package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
  358. package/dist/inspector/V8InspectorProvider.js +38 -28
  359. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  360. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  361. package/dist/main/shutdown.js +11 -3
  362. package/dist/main/startup.js +9 -2
  363. package/dist/main/transport.js +22 -2
  364. package/dist/main.js +11 -18
  365. package/dist/native/AppleMachoSelection.js +16 -6
  366. package/dist/native/CommandRunner.js +9 -7
  367. package/dist/native/LldbCallTracer.js +8 -2
  368. package/dist/native/NativeMacOSProvider.js +25 -15
  369. package/dist/native/NativeUiHelperRuntime.js +11 -2
  370. package/dist/native/NativeUiObservation.js +2 -2
  371. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  372. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  373. package/dist/process/ExecFileOutput.js +88 -6
  374. package/dist/process/PrivateRuntimeRoot.js +10 -5
  375. package/dist/process/ProcessOwnership.js +1 -4
  376. package/dist/process/ProcessOwnershipObservation.js +11 -5
  377. package/dist/process/ProviderProcess.js +1 -3
  378. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  379. package/dist/process/capture/ProcessCaptureError.js +13 -0
  380. package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
  381. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  382. package/dist/process/capture/ProcessHarness.js +21 -25
  383. package/dist/process/capture/ProcessNormalization.js +20 -2
  384. package/dist/process/capture/ProcessSampling.js +25 -2
  385. package/dist/process/capture/TerminalRenderer.js +14 -0
  386. package/dist/process/snapshotEnvironment.js +14 -0
  387. package/dist/server/EvidenceMcpServer.js +25 -14
  388. package/dist/server/createServer.js +49 -36
  389. package/dist/server/mcpClientMetadata.js +12 -5
  390. package/dist/server/promptCompletion.js +3 -8
  391. package/dist/server/registerAnalysisViewTool.js +15 -0
  392. package/dist/server/registerAndroidTools.js +2 -3
  393. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  394. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  395. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  396. package/dist/server/registerApplicationTools/coverage.js +1 -2
  397. package/dist/server/registerApplicationTools/helpers.js +1 -2
  398. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  399. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  400. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  401. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  402. package/dist/server/registerArtifactComparisonTool.js +4 -5
  403. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  404. package/dist/server/registerBrowserScenarioTool.js +3 -4
  405. package/dist/server/registerBrowserTools.js +13 -16
  406. package/dist/server/registerBundleComparisonTool.js +5 -6
  407. package/dist/server/registerCloseLifecycleTool.js +2 -3
  408. package/dist/server/registerElectronTools.js +10 -13
  409. package/dist/server/registerEnhancedTools.js +23 -23
  410. package/dist/server/registerEvidenceTools.js +3 -4
  411. package/dist/server/registerEvmTools.js +2 -3
  412. package/dist/server/registerFirmwareTools.js +2 -3
  413. package/dist/server/registerFunctionComparisonTool.js +7 -8
  414. package/dist/server/registerInvestigationTools.js +14 -15
  415. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  416. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  417. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  418. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  419. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  420. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  421. package/dist/server/registerOfficialTools.js +4 -19
  422. package/dist/server/registerProcessComparisonTool.js +8 -8
  423. package/dist/server/registerRecordedCrashTools.js +2 -3
  424. package/dist/server/registerSessionRecordTools.js +15 -19
  425. package/dist/server/registerSessionStatusTool.js +3 -4
  426. package/dist/server/registerSessionTools.js +12 -18
  427. package/dist/server/registerWebModuleTool.js +2 -3
  428. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  429. package/dist/server/registerWebRuntimeTools.js +4 -5
  430. package/dist/server/registerWebScriptTool.js +2 -3
  431. package/dist/server/registerWebSourceLocationTool.js +2 -3
  432. package/dist/server/toolResult.js +66 -94
  433. package/dist/server/toolResultEncoding.js +11 -10
  434. package/dist/windows/WindowsNativeLoader.js +1 -0
  435. package/dist/windows/WindowsOwnedProcess.js +60 -15
  436. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  437. package/native/windows/README.md +3 -1
  438. package/native/windows/build/manifest.json +2 -2
  439. package/native/windows/build/rea-windows-x64.node +0 -0
  440. package/package.json +39 -30
  441. package/scripts/rea.mjs +3 -6
  442. package/skills/reverse-engineer-anything/SKILL.md +9 -8
  443. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  444. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  445. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  446. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  447. package/dist/config.js +0 -1
  448. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  449. package/dist/contracts/process/processCaptureExample.js +0 -2
  450. package/dist/contracts/toolOutputSchemas.js +0 -2
  451. package/dist/main/reload.js +0 -12
  452. package/dist/main/state.js +0 -3
  453. package/dist/server/sessionToolPolicies.js +0 -2
@@ -31,7 +31,8 @@ export const isSnapshotCacheable = (operation, descriptor, parameters) => !STATE
31
31
  typeof parameters.address === "string") &&
32
32
  descriptor?.effects.mutatesArtifact === false &&
33
33
  descriptor.cachePolicy !== "live" &&
34
- descriptor.effects.mayWriteFilesystem === false &&
34
+ (descriptor.cachePolicy === "snapshot" ||
35
+ descriptor.effects.mayWriteFilesystem === false) &&
35
36
  descriptor.effects.changesPermissions === false;
36
37
  /** Bounded in-memory cache for one immutable binary identity. */
37
38
  export class AnalysisSnapshotCache {
@@ -72,7 +73,7 @@ export class AnalysisSnapshotCache {
72
73
  imported += 1;
73
74
  this.#entries.set(entry.query_id, structuredClone(entry));
74
75
  }
75
- for (const entry of snapshot.workflow_entries ?? []) {
76
+ for (const entry of snapshot.workflow_entries) {
76
77
  if (!this.#workflowEntries.has(entry.query_id) && !this.#hasCapacity())
77
78
  continue;
78
79
  this.#workflowEntries.set(entry.query_id, structuredClone(entry));
@@ -86,15 +87,16 @@ export class AnalysisSnapshotCache {
86
87
  try {
87
88
  const snapshotTargetIdentity = snapshotTarget(target);
88
89
  const binding = snapshotBinding(profile);
89
- const retainedEvidence = structuredClone(evidenceBundle);
90
+ const entries = [...this.#entries.values()].sort((left, right) => left.query_id.localeCompare(right.query_id));
91
+ const workflows = [...this.#workflowEntries.values()].sort((left, right) => left.query_id.localeCompare(right.query_id));
92
+ // Parsing owns the returned JSON and metadata; pre-cloning the same
93
+ // payloads here only adds another full materialization.
90
94
  return ok(parseAnalysisSnapshot({
91
95
  target: snapshotTargetIdentity,
92
96
  binding,
93
- entries: this.entries(),
94
- ...(this.workflowEntries().length === 0
95
- ? {}
96
- : { workflow_entries: this.workflowEntries() }),
97
- evidence_bundle: retainedEvidence,
97
+ entries,
98
+ workflow_entries: workflows,
99
+ evidence_bundle: evidenceBundle,
98
100
  }));
99
101
  }
100
102
  catch (cause) {
@@ -13,7 +13,7 @@ import { BinarySessionRecords } from "./BinarySessionRecords.js";
13
13
  import { binarySessionStatus } from "./BinarySessionStatus.js";
14
14
  import { resolveSessionOpen, resolveSessionTarget, validateResolvedSessionTarget, } from "./BinarySessionOpen.js";
15
15
  import { bindExecutionTarget, commitExecutionProfile, prepareSessionExecution, } from "./BinarySessionExecution.js";
16
- import { closeAnalysisClient } from "./AnalysisClientCleanup.js";
16
+ import { analysisErrorWithCleanupFailure, closeAnalysisClient, } from "./AnalysisClientCleanup.js";
17
17
  const OFFICIAL_OPERATIONS = new Set(OFFICIAL_TOOL_CONTRACTS.map(({ name }) => name));
18
18
  const ENHANCED_OPERATIONS = new Set(ENHANCED_TOOL_CONTRACTS.map(({ name }) => name));
19
19
  /**
@@ -25,6 +25,7 @@ const ENHANCED_OPERATIONS = new Set(ENHANCED_TOOL_CONTRACTS.map(({ name }) => na
25
25
  */
26
26
  export class BinarySession extends BinarySessionRecords {
27
27
  #active;
28
+ #pendingCleanup;
28
29
  #transition = Promise.resolve();
29
30
  #transitionGeneration = 0;
30
31
  #calls = new Map();
@@ -38,14 +39,14 @@ export class BinarySession extends BinarySessionRecords {
38
39
  /** Identify the provider producing evidence for this session. */
39
40
  providerIdentity(operation) {
40
41
  const route = this.#currentRoute();
41
- let selected = route.identity;
42
+ let selected = route.binding?.identity ?? route.identity;
42
43
  if (operation !== undefined) {
43
- const exact = route.capabilities?.get(operation)?.provider;
44
+ const exact = route.capabilities.get(operation)?.provider;
44
45
  if (exact !== undefined)
45
46
  selected = exact;
46
47
  else if (ENHANCED_OPERATIONS.has(operation)) {
47
48
  const providers = new Map();
48
- for (const descriptor of route.capabilities?.values() ?? [])
49
+ for (const descriptor of route.capabilities.values())
49
50
  if (descriptor.available &&
50
51
  OFFICIAL_OPERATIONS.has(descriptor.operation))
51
52
  providers.set(descriptor.provider.id, descriptor.provider);
@@ -81,10 +82,6 @@ export class BinarySession extends BinarySessionRecords {
81
82
  return undefined;
82
83
  return structuredClone(profile);
83
84
  }
84
- /** Return opaque adapter metadata retained for legacy open_binary output. */
85
- openCompatibility() {
86
- return structuredClone(this.#active?.compatibility ?? {});
87
- }
88
85
  /** Observe runtime provider-health changes that affect discovery metadata. */
89
86
  onAvailabilityChanged(listener) {
90
87
  this.#availabilityListeners.add(listener);
@@ -134,7 +131,7 @@ export class BinarySession extends BinarySessionRecords {
134
131
  if (!resolved.ok)
135
132
  return resolved;
136
133
  const { target, route, sameTarget } = resolved.value;
137
- const { profile, compatibility } = route;
134
+ const { profile } = route;
138
135
  if (isAborted(options.signal))
139
136
  return err(new AnalysisCancelledError("open_binary"));
140
137
  const activeProfile = this.#active?.profile;
@@ -142,6 +139,11 @@ export class BinarySession extends BinarySessionRecords {
142
139
  ? profile === null
143
140
  : profile !== null && analysisProfilesEqual(activeProfile, profile);
144
141
  await this.#drainCalls(admittedThrough);
142
+ if (isAborted(options.signal))
143
+ return err(new AnalysisCancelledError("open_binary"));
144
+ const pendingClosed = await this.#retryPendingCleanup();
145
+ if (!pendingClosed.ok)
146
+ return pendingClosed;
145
147
  if (isAborted(options.signal))
146
148
  return err(new AnalysisCancelledError("open_binary"));
147
149
  if (sameTarget && sameProfile) {
@@ -155,31 +157,28 @@ export class BinarySession extends BinarySessionRecords {
155
157
  const previous = this.#active;
156
158
  this.#active = undefined;
157
159
  if (previous !== undefined) {
158
- const closed = await closeAnalysisClient(previous.client, previous.route.identity.id);
160
+ const closed = await this.#retireClient(previous.client, previous.route.identity.id);
159
161
  if (!closed.ok) {
160
162
  this.clearSessionRecords();
161
163
  this.#clearRuntimeAvailability();
162
164
  return closed;
163
165
  }
164
166
  }
167
+ if (isAborted(options.signal))
168
+ return err(await this.#restoreAfterFailedOpen(previous, new AnalysisCancelledError("open_binary")));
165
169
  const runId = randomUUID();
166
170
  const client = route.createClient(target, { runId });
167
171
  const started = await client.execute("health", {}, options);
168
172
  if (!started.ok) {
169
- await client.close();
170
- await this.#restore(previous);
171
- return started;
173
+ return err(await this.#failedOpen(client, route.identity.id, previous, started.error));
172
174
  }
173
175
  if (isAborted(options.signal)) {
174
- await client.close();
175
- await this.#restore(previous);
176
- return err(new AnalysisCancelledError("open_binary"));
176
+ return err(await this.#failedOpen(client, route.identity.id, previous, new AnalysisCancelledError("open_binary")));
177
177
  }
178
178
  this.#active = {
179
179
  target,
180
180
  client,
181
181
  profile,
182
- compatibility: structuredClone(compatibility),
183
182
  route,
184
183
  runId,
185
184
  };
@@ -195,9 +194,7 @@ export class BinarySession extends BinarySessionRecords {
195
194
  const imported = this.importAnalysisSnapshot(options.snapshot);
196
195
  if (!imported.ok) {
197
196
  this.#active = undefined;
198
- await client.close();
199
- await this.#restore(previous);
200
- return imported;
197
+ return err(await this.#failedOpen(client, route.identity.id, previous, imported.error));
201
198
  }
202
199
  }
203
200
  return ok(target);
@@ -222,7 +219,12 @@ export class BinarySession extends BinarySessionRecords {
222
219
  return written;
223
220
  const closed = await this.#closeActive(options);
224
221
  return closed.ok
225
- ? ok({ ...written.value, entries: snapshot.value.entries.length })
222
+ ? ok({
223
+ ...written.value,
224
+ primitive_entries: snapshot.value.entries.length,
225
+ workflow_entries: snapshot.value.workflow_entries.length,
226
+ evidence_records: snapshot.value.evidence_bundle.records.length,
227
+ })
226
228
  : closed;
227
229
  });
228
230
  }
@@ -230,8 +232,8 @@ export class BinarySession extends BinarySessionRecords {
230
232
  const previous = this.#active;
231
233
  this.#active = undefined;
232
234
  const closed = previous === undefined
233
- ? ok(null)
234
- : await closeAnalysisClient(previous.client, previous.route.identity.id, {
235
+ ? await this.#retryPendingCleanup(options.progress, options.retainProviderDocuments)
236
+ : await this.#retireClient(previous.client, previous.route.identity.id, {
235
237
  ...(options.progress === undefined
236
238
  ? {}
237
239
  : { progress: options.progress }),
@@ -243,6 +245,42 @@ export class BinarySession extends BinarySessionRecords {
243
245
  this.#clearRuntimeAvailability();
244
246
  return closed;
245
247
  }
248
+ async #retireClient(client, providerId, options = {}) {
249
+ this.#pendingCleanup = {
250
+ client,
251
+ providerId,
252
+ retainDocument: options.retainDocument === true,
253
+ };
254
+ return this.#retryPendingCleanup(options.progress);
255
+ }
256
+ async #retryPendingCleanup(progress, retainDocument) {
257
+ let pending = this.#pendingCleanup;
258
+ if (pending === undefined)
259
+ return ok(null);
260
+ if (retainDocument !== undefined) {
261
+ pending = { ...pending, retainDocument };
262
+ this.#pendingCleanup = pending;
263
+ }
264
+ const closed = await closeAnalysisClient(pending.client, pending.providerId, {
265
+ ...(progress === undefined ? {} : { progress }),
266
+ ...(pending.retainDocument ? { retainDocument: true } : {}),
267
+ });
268
+ if (closed.ok)
269
+ this.#pendingCleanup = undefined;
270
+ return closed;
271
+ }
272
+ async #failedOpen(client, providerId, previous, primary) {
273
+ const closed = await this.#retireClient(client, providerId);
274
+ if (!closed.ok)
275
+ return analysisErrorWithCleanupFailure(primary, closed.error, "open_binary");
276
+ return this.#restoreAfterFailedOpen(previous, primary);
277
+ }
278
+ async #restoreAfterFailedOpen(previous, primary) {
279
+ const restored = await this.#restore(previous);
280
+ return restored.ok
281
+ ? primary
282
+ : analysisErrorWithCleanupFailure(primary, restored.error, "open_binary");
283
+ }
246
284
  /** Describe the active binary session. */
247
285
  status() {
248
286
  return binarySessionStatus({
@@ -328,7 +366,7 @@ export class BinarySession extends BinarySessionRecords {
328
366
  execution: profiled.value,
329
367
  });
330
368
  }
331
- else if (profiled.ok && capability?.effects.mutatesArtifact === true) {
369
+ else if (profiled.ok && capability.effects.mutatesArtifact) {
332
370
  this.invalidateSnapshot();
333
371
  }
334
372
  return profiled;
@@ -410,21 +448,24 @@ export class BinarySession extends BinarySessionRecords {
410
448
  }
411
449
  async #restore(previous) {
412
450
  if (previous === undefined)
413
- return;
451
+ return ok(null);
414
452
  const runId = randomUUID();
415
453
  const client = previous.route.createClient(previous.target, { runId });
416
454
  const started = await client.execute("health", {});
417
- if (started.ok)
455
+ if (started.ok) {
418
456
  this.#active = {
419
457
  target: previous.target,
420
458
  client,
421
459
  profile: previous.profile,
422
- compatibility: previous.compatibility,
423
460
  route: previous.route,
424
461
  runId,
425
462
  };
426
- else
427
- await client.close();
463
+ return ok(null);
464
+ }
465
+ const closed = await this.#retireClient(client, previous.route.identity.id);
466
+ return closed.ok
467
+ ? ok(null)
468
+ : err(analysisErrorWithCleanupFailure(started.error, closed.error, "open_binary"));
428
469
  }
429
470
  async #waitForTransition(operation, signal, transition) {
430
471
  if (signal?.aborted === true)
@@ -6,6 +6,4 @@ import { SessionProviderRouter } from "./SessionProviderRouter.js";
6
6
  * Compose one provider-neutral session from deep-provider selection and
7
7
  * disjoint auxiliary operation families.
8
8
  */
9
- export const composeBinarySession = (registry, auxiliaryProviders = []) => new BinarySession(registry instanceof SessionProviderRouter
10
- ? registry
11
- : SessionProviderRouter.selectable(registry, auxiliaryProviders), new InvestigationRecords());
9
+ export const composeBinarySession = (registry, auxiliaryProviders = []) => new BinarySession(SessionProviderRouter.selectable(registry, auxiliaryProviders), new InvestigationRecords());
@@ -9,17 +9,15 @@ export const prepareSessionExecution = (input) => {
9
9
  const { active, operation, parameters, unboundOperationError, lookupSnapshot, } = input;
10
10
  if (active === undefined)
11
11
  return err(new NoBinaryOpenError());
12
- const capability = active.route.capabilities?.get(operation);
13
- if (active.route.capabilities !== undefined &&
14
- capability?.available !== true) {
12
+ const capability = active.route.capabilities.get(operation);
13
+ if (capability?.available !== true) {
15
14
  const selectionError = unboundOperationError(operation, active.route);
16
15
  if (selectionError !== undefined)
17
16
  return err(selectionError);
18
17
  return err(new AnalysisCapabilityUnavailableError(active.route.binding?.identity.id ?? active.route.identity.id, operation, capability?.reason ?? "operation is not declared by this provider"));
19
18
  }
20
19
  const profile = active.profile !== null &&
21
- (capability === undefined ||
22
- capability.provider.id === active.profile.provider.id)
20
+ capability.provider.id === active.profile.provider.id
23
21
  ? active.profile
24
22
  : undefined;
25
23
  const cacheable = profile !== undefined &&
@@ -1,6 +1,6 @@
1
1
  import { snapshotMatchesBinding, snapshotMatchesTarget, snapshotTarget, } from "../../domain/analysisSnapshot.js";
2
2
  import { parseBinaryTarget } from "../BinaryTargetResolver.js";
3
- import {} from "../../domain/binaryTarget.js";
3
+ import {} from "../../domain/binaryTargetTypes.js";
4
4
  import { EvidenceIntegrityError, AnalysisSnapshotMismatchError, } from "../../domain/evidenceErrors.js";
5
5
  import {} from "../../domain/analysisErrorBase.js";
6
6
  import { err } from "../../domain/result.js";
@@ -6,7 +6,7 @@ import { err, ok } from "../../domain/result.js";
6
6
  import { AnalysisSnapshotCache } from "./AnalysisSnapshotCache.js";
7
7
  import { InvestigationRecords } from "../investigation/InvestigationRecords.js";
8
8
  const SNAPSHOT_MUTATION_RECOVERY = "Export session observations through export_evidence_bundle if needed. Close the active target without saving a snapshot, then reopen it before importing or saving a snapshot.";
9
- /** Binary snapshot owner and compatibility facade for composed investigation records. */
9
+ /** Own binary snapshots and coordinate the composed investigation records. */
10
10
  export class BinarySessionRecords {
11
11
  #records;
12
12
  #snapshot = new AnalysisSnapshotCache();
@@ -1,9 +1,6 @@
1
1
  /** Project internal provider routing state into the caller-visible session status. */
2
2
  export const binarySessionStatus = ({ target, route, router, runtimeUnavailability, runId, runtimeLineageSnapshots, requestActivitySnapshots, providerOperationHealth, }) => {
3
- const configuredProvider = router.configuredIdentity();
4
- const provider = providerSummary(configuredProvider);
5
- const providers = router.providerIdentities(route).map(providerSummary);
6
- const capabilities = [...(route.capabilities?.values() ?? [])]
3
+ const capabilities = [...route.capabilities.values()]
7
4
  .filter(({ operation }) => operation !== "inventory_artifact")
8
5
  .sort((left, right) => left.operation.localeCompare(right.operation))
9
6
  .map((descriptor) => {
@@ -38,8 +35,6 @@ export const binarySessionStatus = ({ target, route, router, runtimeUnavailabili
38
35
  .map(capabilityStatus),
39
36
  }));
40
37
  const common = {
41
- provider,
42
- providers,
43
38
  capabilities,
44
39
  analysis_provider_binding: analysisProviderBinding,
45
40
  analysis_provider_candidates: analysisProviderCandidates,
@@ -1,8 +1,8 @@
1
1
  import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
2
2
  import { err, ok } from "../../domain/result.js";
3
3
  import { closeAnalysisClient } from "./AnalysisClientCleanup.js";
4
- /** Synthetic compatibility identity for a deterministic provider set. */
5
- export const compositeProviderIdentity = (identities) => ({
4
+ /** Synthetic identity for a deterministic provider set. */
5
+ const compositeProviderIdentity = (identities) => ({
6
6
  id: `composite:${identities
7
7
  .map(({ id }) => id)
8
8
  .sort()
@@ -16,15 +16,10 @@ export class CompositeProvider {
16
16
  #identity;
17
17
  #capabilities;
18
18
  #providerByOperation;
19
- #profileProvider;
20
19
  constructor(providers) {
21
20
  this.providers = providers;
22
21
  if (providers.length === 0)
23
22
  throw new RangeError("CompositeProvider requires at least one provider");
24
- const profileProviders = providers.filter(({ resolveAnalysisProfile }) => resolveAnalysisProfile !== undefined);
25
- if (profileProviders.length > 1)
26
- throw new TypeError("CompositeProvider supports at most one target-bound analysis profile");
27
- this.#profileProvider = profileProviders[0];
28
23
  this.#identity = Object.freeze(compositeProviderIdentity(providers.map((provider) => provider.identity())));
29
24
  const routes = new Map();
30
25
  const capabilities = [];
@@ -46,12 +41,6 @@ export class CompositeProvider {
46
41
  capabilities() {
47
42
  return this.#capabilities;
48
43
  }
49
- resolveAnalysisProfile(target, options) {
50
- const resolve = this.#profileProvider?.resolveAnalysisProfile;
51
- return resolve === undefined
52
- ? Promise.resolve(ok({ profile: null, compatibility: {} }))
53
- : resolve.call(this.#profileProvider, target, options);
54
- }
55
44
  createClient(target, profile, context) {
56
45
  const clients = new Map();
57
46
  const clientFor = (provider) => {
@@ -62,7 +51,7 @@ export class CompositeProvider {
62
51
  clients.set(provider, created);
63
52
  return created;
64
53
  };
65
- const closeWithOutcome = async (options) => {
54
+ const close = async (options) => {
66
55
  const outcomes = await Promise.all([...clients.entries()].map(([provider, client]) => closeAnalysisClient(client, provider.identity().id, options)));
67
56
  return outcomes.find((outcome) => !outcome.ok) ?? ok(null);
68
57
  };
@@ -101,10 +90,7 @@ export class CompositeProvider {
101
90
  }
102
91
  return undefined;
103
92
  },
104
- closeWithOutcome,
105
- close: async () => {
106
- await closeWithOutcome();
107
- },
93
+ close,
108
94
  };
109
95
  }
110
96
  }
@@ -1,7 +1,7 @@
1
1
  import { AnalysisCancelledError } from "../../domain/analysisErrorCore.js";
2
2
  import { AnalysisError } from "../../domain/analysisErrorBase.js";
3
3
  import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
4
- import { err } from "../../domain/result.js";
4
+ import { err, ok } from "../../domain/result.js";
5
5
  import { ABORTED, waitForAbortable } from "./AbortablePromise.js";
6
6
  const isAborted = (signal) => signal?.aborted === true;
7
7
  /**
@@ -77,13 +77,13 @@ class LazyAnalysisClient {
77
77
  operationHealthSnapshot() {
78
78
  return this.#client?.operationHealthSnapshot?.();
79
79
  }
80
- async close() {
80
+ close = async (options) => {
81
81
  this.#closed = true;
82
82
  if (this.#loading === undefined)
83
- return;
83
+ return ok(null);
84
84
  const client = await this.#loading;
85
- await client.close();
86
- }
85
+ return client.close(options);
86
+ };
87
87
  async #load(operation) {
88
88
  if (this.#closed)
89
89
  throw new ProviderAdapterError(this.#providerId, operation, {
@@ -1,40 +1,18 @@
1
- import { analysisProfileSchema, } from "../../domain/analysisProfile.js";
2
- import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, } from "../../domain/analysisErrorCore.js";
3
- import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
1
+ import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
4
2
  import { ProviderSelectionError } from "../../domain/providerSelectionError.js";
5
3
  import {} from "../../domain/analysisErrorBase.js";
6
- import { jsonObjectSchema } from "../../domain/jsonValue.js";
7
4
  import { err, ok } from "../../domain/result.js";
8
5
  import { AnalysisProviderRegistry, } from "./AnalysisProviderRegistry.js";
9
- import { ABORTED, waitForAbortable } from "./AbortablePromise.js";
10
- import { CompositeProvider, compositeProviderIdentity, } from "./CompositeProvider.js";
11
- /** Resolve either the compatibility single-provider seam or a selectable set. */
6
+ import { CompositeProvider } from "./CompositeProvider.js";
7
+ /** Resolve one registry-selected deep provider and disjoint auxiliary families. */
12
8
  export class SessionProviderRouter {
13
- runtime;
14
- constructor(runtime) {
15
- this.runtime = runtime;
16
- }
17
- /** Create routing for an embedding backed by one fixed provider or factory. */
18
- static single(provider, options = {}) {
19
- const identity = typeof provider === "function"
20
- ? { id: "unidentified", name: "Unidentified provider", version: null }
21
- : provider.identity();
22
- const capabilities = typeof provider === "function"
23
- ? undefined
24
- : capabilityMap(provider.capabilities());
25
- const resolveProfile = options.resolveAnalysisProfile ??
26
- (typeof provider === "function" ||
27
- provider.resolveAnalysisProfile === undefined
28
- ? () => Promise.resolve(ok({ profile: null, compatibility: {} }))
29
- : (target, resolutionOptions) => provider.resolveAnalysisProfile?.(target, resolutionOptions) ??
30
- Promise.resolve(ok({ profile: null, compatibility: {} })));
31
- return new SessionProviderRouter({
32
- kind: "single",
33
- provider,
34
- identity,
35
- capabilities,
36
- resolveProfile,
37
- });
9
+ registry;
10
+ auxiliaryProviders;
11
+ route;
12
+ constructor(registry, auxiliaryProviders, route) {
13
+ this.registry = registry;
14
+ this.auxiliaryProviders = auxiliaryProviders;
15
+ this.route = route;
38
16
  }
39
17
  /** Create selection-aware routing while keeping auxiliary families disjoint. */
40
18
  static selectable(registry, auxiliaryProviders) {
@@ -48,99 +26,31 @@ export class SessionProviderRouter {
48
26
  if (auxiliaryOperations.has(operation))
49
27
  throw new TypeError(`Deep and auxiliary providers both declare operation ${operation}`);
50
28
  const initialRoute = selectableRoute(auxiliaryProviders, undefined);
51
- return new SessionProviderRouter({
52
- kind: "selectable",
53
- registry,
54
- auxiliaryProviders: [...auxiliaryProviders],
55
- identity: identities.length === 0
56
- ? emptyProviderIdentity()
57
- : compositeProviderIdentity(identities),
58
- initialRoute,
59
- });
60
- }
61
- /** Compatibility identity covering every configured provider. */
62
- configuredIdentity() {
63
- return structuredClone(this.runtime.identity);
64
- }
65
- /** Provider identities exposed through the flat 1.x compatibility field. */
66
- providerIdentities(route) {
67
- if (this.runtime.kind === "single") {
68
- if (route.capabilities === undefined)
69
- return [route.identity];
70
- return uniqueProviderIdentities([...route.capabilities.values()].map(({ provider }) => provider));
71
- }
72
- const selected = route.binding?.identity;
73
- return uniqueProviderIdentities([
74
- ...this.runtime.auxiliaryProviders.map((provider) => provider.identity()),
75
- ...this.runtime.registry
76
- .identities()
77
- .map((identity) => identity.id === selected?.id ? selected : identity),
78
- ]);
29
+ return new SessionProviderRouter(registry, [...auxiliaryProviders], initialRoute);
79
30
  }
80
31
  /** Target-free routes and discovery metadata. */
81
32
  initialRoute() {
82
- if (this.runtime.kind === "selectable")
83
- return this.runtime.initialRoute;
84
- const runtime = this.runtime;
85
- return {
86
- identity: structuredClone(runtime.identity),
87
- capabilities: runtime.capabilities,
88
- profile: null,
89
- compatibility: {},
90
- binding: null,
91
- selection: undefined,
92
- createClient: (target, context) => createSingleProviderClient(runtime, target, undefined, context),
93
- };
33
+ return this.route;
94
34
  }
95
35
  /** Resolve target routes before any provider client is created. */
96
36
  async resolve(target, providerId, signal) {
97
37
  const resolutionOptions = signal === undefined ? undefined : { signal };
98
- if (this.runtime.kind === "selectable") {
99
- const selected = await this.runtime.registry.select(target, providerId, resolutionOptions);
100
- return selected.ok
101
- ? ok(selectableRoute(this.runtime.auxiliaryProviders, selected.value))
102
- : selected;
103
- }
104
- const runtime = this.runtime;
105
- if (providerId !== undefined &&
106
- providerId !== "auto" &&
107
- providerId !== runtime.identity.id)
108
- return err(new ProviderSelectionError({
109
- reason: "unknown_provider",
110
- requestedProviderId: providerId,
111
- candidateIds: [runtime.identity.id],
112
- }));
113
- const resolved = await waitForAbortable(runtime.resolveProfile(target, resolutionOptions), signal);
114
- if (resolved === ABORTED)
115
- return err(new AnalysisCancelledError("open_binary"));
116
- if (!resolved.ok)
117
- return resolved;
118
- const normalized = normalizeProfileResolution(resolved.value, runtime.identity.id);
119
- if (!normalized.ok)
120
- return normalized;
121
- return ok({
122
- identity: structuredClone(runtime.identity),
123
- capabilities: runtime.capabilities,
124
- profile: normalized.value.profile,
125
- compatibility: normalized.value.compatibility,
126
- binding: null,
127
- selection: undefined,
128
- createClient: (openedTarget, context) => createSingleProviderClient(runtime, openedTarget, normalized.value.profile ?? undefined, context),
129
- });
38
+ const selected = await this.registry.select(target, providerId, resolutionOptions);
39
+ return selected.ok
40
+ ? ok(selectableRoute(this.auxiliaryProviders, selected.value))
41
+ : selected;
130
42
  }
131
43
  /** Candidate status authoritative for the active or target-free route. */
132
44
  candidateStatuses(route) {
133
- if (this.runtime.kind === "single")
134
- return [];
135
- return route.selection?.candidates ?? this.runtime.registry.candidates();
45
+ return route.selection?.candidates ?? this.registry.candidates();
136
46
  }
137
47
  /** Produce exact candidate rejections for an intentionally unbound route. */
138
48
  unboundOperationError(operation, route) {
139
- if (this.runtime.kind !== "selectable" ||
140
- route.binding !== null ||
141
- route.selection === undefined)
49
+ if (route.binding !== null ||
50
+ route.selection === undefined ||
51
+ !this.registry.declaredOperations().includes(operation))
142
52
  return undefined;
143
- return this.runtime.registry.unboundOperationError(operation, route.selection);
53
+ return this.registry.unboundOperationError(operation, route.selection);
144
54
  }
145
55
  }
146
56
  const selectableRoute = (auxiliaryProviders, selection) => {
@@ -149,23 +59,23 @@ const selectableRoute = (auxiliaryProviders, selection) => {
149
59
  ...auxiliaryProviders,
150
60
  ...(binding === null ? [] : [binding.provider]),
151
61
  ];
152
- const provider = providers.length === 0 ? undefined : new CompositeProvider(providers);
62
+ const provider = binding === null && providers.length === 1
63
+ ? providers[0]
64
+ : providers.length === 0
65
+ ? undefined
66
+ : new CompositeProvider(providers);
153
67
  const identity = provider?.identity() ?? emptyProviderIdentity();
154
68
  const capabilities = capabilityMap(provider?.capabilities() ?? []);
155
69
  return {
156
70
  identity,
157
71
  capabilities,
158
72
  profile: binding?.profile ?? null,
159
- compatibility: structuredClone(binding?.compatibility ?? {}),
160
73
  binding,
161
74
  selection,
162
75
  createClient: (target, context) => provider?.createClient(target, binding?.profile, context) ??
163
76
  emptyClient(identity),
164
77
  };
165
78
  };
166
- const createSingleProviderClient = (runtime, target, profile, context) => typeof runtime.provider === "function"
167
- ? runtime.provider(target, profile, context)
168
- : runtime.provider.createClient(target, profile, context);
169
79
  const emptyClient = (identity) => ({
170
80
  execute: (operation) => operation === "health"
171
81
  ? Promise.resolve(ok({
@@ -177,7 +87,7 @@ const emptyClient = (identity) => ({
177
87
  subject: null,
178
88
  }))
179
89
  : Promise.resolve(err(new AnalysisCapabilityUnavailableError(identity.id, operation, "operation is not declared by this provider set"))),
180
- close: () => Promise.resolve(),
90
+ close: () => Promise.resolve(ok(null)),
181
91
  });
182
92
  const emptyProviderIdentity = () => ({
183
93
  id: "composite:none",
@@ -185,9 +95,6 @@ const emptyProviderIdentity = () => ({
185
95
  version: null,
186
96
  });
187
97
  const capabilityMap = (capabilities) => new Map(capabilities.map((descriptor) => [descriptor.operation, descriptor]));
188
- const uniqueProviderIdentities = (identities) => [...new Map(identities.map((identity) => [identity.id, identity])).values()]
189
- .sort((left, right) => left.id.localeCompare(right.id))
190
- .map((identity) => structuredClone(identity));
191
98
  const assertDisjoint = (providers) => {
192
99
  const routes = new Set();
193
100
  for (const provider of providers)
@@ -206,18 +113,3 @@ const assertUniqueProviderIds = (identities) => {
206
113
  ids.add(identity.id);
207
114
  }
208
115
  };
209
- const normalizeProfileResolution = (resolution, providerId) => {
210
- try {
211
- return ok({
212
- profile: resolution.profile === null
213
- ? null
214
- : analysisProfileSchema.parse(resolution.profile),
215
- compatibility: jsonObjectSchema.parse(resolution.compatibility),
216
- });
217
- }
218
- catch (cause) {
219
- return err(new ProviderAdapterError(providerId, "resolve_analysis_profile", {
220
- cause,
221
- }));
222
- }
223
- };