rea-agents 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -1,30 +1,20 @@
1
1
  import { z } from "zod";
2
+ import { providerCapability, } from "../contracts/toolOutputSchemaPrimitives.js";
2
3
  import { GENERATED_MCP_TOOL_CATALOG } from "../generatedMcpToolCatalog.js";
4
+ import { clientRequirementsFor, NO_CLIENT_FEATURES, } from "./CapabilityClientRequirements.js";
3
5
  const statusSchema = z.object({
4
6
  open: z.boolean(),
5
7
  kind: z.enum(["executable", "database", "archive", "artifact"]).optional(),
6
8
  format: z.string().optional(),
7
- capabilities: z.array(z.object({
8
- operation: z.string(),
9
- available: z.boolean(),
10
- reason: z.string().nullable(),
11
- availability_code: z.string().nullable().optional(),
12
- })),
9
+ capabilities: z.array(providerCapability),
13
10
  });
14
- const NO_CLIENT_FEATURES = {
15
- elicitation_form: false,
16
- elicitation_url: false,
17
- roots: false,
18
- sampling: false,
19
- };
20
- const CLIENT_FEATURE_REQUIREMENTS = {
21
- capture_process_scenario: {
22
- required: [],
23
- optional: ["elicitation_form"],
24
- },
25
- };
26
11
  const ENHANCED_REQUIREMENTS = {
27
- swift_classes: ["list_procedures"],
12
+ trace_native_ui_action: [
13
+ "decode_interface_builder",
14
+ "list_names",
15
+ "procedure_callees",
16
+ ],
17
+ inspect_native_dispatch_metadata: ["list_names"],
28
18
  get_objc_classes: ["list_names"],
29
19
  get_objc_protocols: ["list_names"],
30
20
  batch_decompile: ["procedure_pseudo_code"],
@@ -46,24 +36,24 @@ const ENHANCED_REQUIREMENTS = {
46
36
  "resolve_containing_procedure",
47
37
  ],
48
38
  };
49
- const SESSION_COMPOSITION_REQUIREMENTS = {
50
- get_navigation_context: [
51
- "current_document",
52
- "current_address",
53
- "resolve_containing_procedure",
54
- ],
55
- };
39
+ const NAVIGATION_CONTEXT_MODES = [
40
+ {
41
+ name: "current_selection",
42
+ requirements: [
43
+ "current_document",
44
+ "current_address",
45
+ "resolve_containing_procedure",
46
+ ],
47
+ },
48
+ {
49
+ name: "explicit_document",
50
+ requirements: ["current_address", "resolve_containing_procedure"],
51
+ },
52
+ ];
56
53
  /** Build stable per-operation availability for discovery and tool visibility. */
57
54
  export const buildCapabilityInventory = (sessionStatus, policy, clientFeatures = NO_CLIENT_FEATURES) => {
58
55
  const status = statusSchema.parse(sessionStatus);
59
- const descriptors = new Map(status.capabilities.map((descriptor) => [
60
- descriptor.operation,
61
- {
62
- available: descriptor.available,
63
- reason: descriptor.reason,
64
- availability_code: descriptor.availability_code ?? null,
65
- },
66
- ]));
56
+ const descriptors = new Map(status.capabilities.map((descriptor) => [descriptor.operation, descriptor]));
67
57
  return GENERATED_MCP_TOOL_CATALOG.map((contract) => {
68
58
  const availability = availabilityFor({
69
59
  name: contract.name,
@@ -75,16 +65,15 @@ export const buildCapabilityInventory = (sessionStatus, policy, clientFeatures =
75
65
  });
76
66
  const clientRequirements = clientRequirementsFor(contract.name, clientFeatures);
77
67
  const clientBlocked = clientRequirements.missing_required.length > 0;
78
- return {
68
+ const facts = {
79
69
  name: contract.name,
80
70
  surface: contract.kind,
81
- available: availability.reason === "available" && !clientBlocked,
82
- reason: clientBlocked
83
- ? "client_capability_missing"
84
- : availability.reason,
85
- remediation: clientBlocked
86
- ? `Use an MCP client that supports: ${clientRequirements.missing_required.join(", ")}.`
87
- : availability.remediation,
71
+ ...(availability.defaultModeAvailable === undefined
72
+ ? {}
73
+ : { default_mode_available: availability.defaultModeAvailable }),
74
+ ...(availability.modes === undefined
75
+ ? {}
76
+ : { modes: [...availability.modes] }),
88
77
  client_requirements: clientRequirements,
89
78
  effects: { ...contract.effects },
90
79
  annotations: {
@@ -94,24 +83,31 @@ export const buildCapabilityInventory = (sessionStatus, policy, clientFeatures =
94
83
  open_world: contract.annotations.openWorldHint ?? true,
95
84
  },
96
85
  };
86
+ if (clientBlocked)
87
+ return {
88
+ ...facts,
89
+ available: false,
90
+ reason: "client_capability_missing",
91
+ remediation: `Use an MCP client that supports: ${clientRequirements.missing_required.join(", ")}.`,
92
+ };
93
+ return availability.reason === "available"
94
+ ? {
95
+ ...facts,
96
+ available: true,
97
+ reason: availability.reason,
98
+ remediation: null,
99
+ }
100
+ : {
101
+ ...facts,
102
+ available: false,
103
+ reason: availability.reason,
104
+ remediation: availability.remediation,
105
+ };
97
106
  }).sort((left, right) => left.name.localeCompare(right.name));
98
107
  };
99
- const clientRequirementsFor = (name, clientFeatures) => {
100
- const requirements = CLIENT_FEATURE_REQUIREMENTS[name] ?? {
101
- required: [],
102
- optional: [],
103
- };
104
- return {
105
- required: [...requirements.required],
106
- optional: [...requirements.optional],
107
- missing_required: requirements.required.filter((feature) => !clientFeatures[feature]),
108
- missing_optional: requirements.optional.filter((feature) => !clientFeatures[feature]),
109
- };
110
- };
111
108
  const availabilityFor = (context) => {
112
- const sessionComposition = SESSION_COMPOSITION_REQUIREMENTS[context.name];
113
- if (sessionComposition !== undefined)
114
- return composedAvailabilityFor(sessionComposition, context.descriptors);
109
+ if (context.name === "get_navigation_context")
110
+ return navigationContextAvailability(context.descriptors);
115
111
  const javascriptApplication = javascriptApplicationAvailability(context);
116
112
  if (javascriptApplication !== null)
117
113
  return javascriptApplication;
@@ -123,14 +119,9 @@ const availabilityFor = (context) => {
123
119
  return targetDecision;
124
120
  return providerAvailability(context);
125
121
  };
126
- const javascriptApplicationAvailability = ({ name, policy, }) => {
122
+ const javascriptApplicationAvailability = ({ name, }) => {
127
123
  if (name === "analyze_javascript_application")
128
- return policy.investigationInputRoots === 0
129
- ? {
130
- reason: "policy_disabled",
131
- remediation: "Configure an exact REA_INVESTIGATION_INPUT_ROOTS_JSON root in the MCP registration, then restart the registered MCP server or client.",
132
- }
133
- : { reason: "available", remediation: null };
124
+ return { reason: "available", remediation: null };
134
125
  return name === "reconcile_javascript_runtime"
135
126
  ? { reason: "available", remediation: null }
136
127
  : null;
@@ -161,29 +152,37 @@ const policyAvailability = ({ name, kind, policy, }) => {
161
152
  return { reason: "available", remediation: null };
162
153
  if (kind === "application")
163
154
  return { reason: "available", remediation: null };
164
- if (name === "import_evidence_bundle" && policy.evidenceFileRoots === 0)
165
- return {
166
- reason: "policy_disabled",
167
- remediation: "Configure or grant an evidence_read root.",
168
- };
169
- if (kind === "electron-provider")
170
- return policy.electronObservationEnabled === true
171
- ? { reason: "available", remediation: null }
172
- : {
173
- reason: "policy_disabled",
174
- remediation: "Enable Electron observation and configure a loopback CDP endpoint and canonical file roots.",
175
- };
155
+ const electron = electronPolicyAvailability(name, kind, policy);
156
+ if (electron !== null)
157
+ return electron;
176
158
  if (kind === "runtime-provider")
177
159
  return policy.v8InspectorObservationEnabled === true
178
160
  ? { reason: "available", remediation: null }
179
161
  : {
180
162
  reason: "policy_disabled",
181
- remediation: "Enable V8 Inspector observation and configure exact loopback endpoints plus canonical file roots or exact origins.",
163
+ remediation: "Enable V8 Inspector observation; pass the user's literal-loopback Inspector endpoint to the tool.",
182
164
  };
183
165
  if (kind === "session")
184
166
  return { reason: "available", remediation: null };
185
167
  return null;
186
168
  };
169
+ const electronPolicyAvailability = (name, kind, policy) => {
170
+ if (kind !== "electron-provider")
171
+ return null;
172
+ if (name === "capture_electron_scenario")
173
+ return policy.electronAutomationEnabled === true
174
+ ? { reason: "available", remediation: null }
175
+ : {
176
+ reason: "policy_disabled",
177
+ remediation: "Enable active Electron automation and configure exact executable and application roots.",
178
+ };
179
+ return policy.electronObservationEnabled === true
180
+ ? { reason: "available", remediation: null }
181
+ : {
182
+ reason: "policy_disabled",
183
+ remediation: "Enable Electron observation; pass the user's literal-loopback CDP endpoint to the tool.",
184
+ };
185
+ };
187
186
  const browserPolicyAvailability = (name, kind, policy) => {
188
187
  if (name === "capture_browser_scenario")
189
188
  return policy.browserScenarioEnabled === true
@@ -272,3 +271,70 @@ const composedAvailabilityFor = (requirements, descriptors) => {
272
271
  };
273
272
  return { reason: "available", remediation: null };
274
273
  };
274
+ const navigationContextAvailability = (descriptors) => {
275
+ const modeResults = NAVIGATION_CONTEXT_MODES.map((mode) => {
276
+ const availability = composedAvailabilityFor(mode.requirements, descriptors);
277
+ if (availability.reason === "available")
278
+ return {
279
+ name: mode.name,
280
+ available: true,
281
+ reason: availability.reason,
282
+ missing_operations: [],
283
+ remediation: null,
284
+ };
285
+ return {
286
+ name: mode.name,
287
+ available: false,
288
+ reason: availability.reason,
289
+ missing_operations: mode.requirements.filter((operation) => {
290
+ const descriptor = descriptors.get(operation);
291
+ return descriptor === undefined || descriptor.available === false;
292
+ }),
293
+ remediation: availability.remediation,
294
+ };
295
+ });
296
+ const modes = modeResults.map((mode) => mode.available
297
+ ? {
298
+ name: mode.name,
299
+ available: true,
300
+ missing_operations: [],
301
+ remediation: null,
302
+ }
303
+ : {
304
+ name: mode.name,
305
+ available: false,
306
+ missing_operations: [...mode.missing_operations],
307
+ remediation: mode.remediation,
308
+ });
309
+ const availableMode = modeResults.find((mode) => mode.available);
310
+ const failures = modeResults.flatMap((mode) => mode.available ? [] : [mode]);
311
+ const failure = failures.sort((left, right) => navigationFailurePriority(left.reason) -
312
+ navigationFailurePriority(right.reason))[0];
313
+ const specificFailureRemediation = failure?.reason === "provider_missing" ? undefined : failure?.remediation;
314
+ const facts = {
315
+ defaultModeAvailable: modes[0]?.available ?? false,
316
+ modes,
317
+ };
318
+ if (availableMode !== undefined)
319
+ return { ...facts, reason: "available", remediation: null };
320
+ return {
321
+ ...facts,
322
+ reason: failure?.reason ?? "provider_missing",
323
+ remediation: specificFailureRemediation ??
324
+ `Configure a provider for one of: ${modes
325
+ .flatMap((mode) => mode.missing_operations)
326
+ .join(", ")}.`,
327
+ };
328
+ };
329
+ const navigationFailurePriority = (reason) => {
330
+ switch (reason) {
331
+ case "unsupported_host":
332
+ return 0;
333
+ case "provider_unavailable":
334
+ return 1;
335
+ case "provider_missing":
336
+ return 2;
337
+ default:
338
+ return 3;
339
+ }
340
+ };
@@ -0,0 +1,27 @@
1
+ import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
2
+ import { isDeepStrictEqual } from "node:util";
3
+ import { z } from "zod";
4
+ const objectSchema = z.record(z.string(), z.unknown());
5
+ /** Compare parsed configuration values without depending on parser prototypes. */
6
+ export const clientConfigurationValuesEqual = (left, right) => isDeepStrictEqual(normalizeConfigurationValue(left), normalizeConfigurationValue(right));
7
+ const normalizeConfigurationValue = (value) => {
8
+ if (Array.isArray(value))
9
+ return value.map(normalizeConfigurationValue);
10
+ if (typeof value !== "object" || value === null || value instanceof Date)
11
+ return value;
12
+ return Object.fromEntries(Object.entries(value)
13
+ .sort(([left], [right]) => left.localeCompare(right))
14
+ .map(([key, nested]) => [key, normalizeConfigurationValue(nested)]));
15
+ };
16
+ /** Parse the client format and reject malformed root or server-table values. */
17
+ export const parseClientConfiguration = (text, format) => {
18
+ const document = objectSchema.parse(format === "toml" ? parseToml(text) : JSON.parse(text));
19
+ const serversKey = format === "toml" ? "mcp_servers" : "mcpServers";
20
+ const value = document[serversKey];
21
+ const servers = value === undefined ? {} : objectSchema.parse(value);
22
+ return { document, servers, serversKey };
23
+ };
24
+ /** Serialize a validated client document using the selected format. */
25
+ export const serializeClientConfiguration = (document, format) => format === "toml"
26
+ ? stringifyToml(document)
27
+ : `${JSON.stringify(document, null, 2)}\n`;
@@ -1,11 +1,10 @@
1
+ import { parseClientConfiguration } from "./ClientConfigurationDocument.js";
1
2
  import { access, readFile } from "node:fs/promises";
2
3
  import { resolve } from "node:path";
3
- import { parse as parseToml } from "smol-toml";
4
4
  import { z } from "zod";
5
5
  import { PRODUCT_IDENTITY } from "../identity.js";
6
6
  import { MCP_STARTUP_POLICY } from "../mcpStartupPolicy.js";
7
7
  import { supportedClients } from "./SupportedClients.js";
8
- const objectSchema = z.record(z.string(), z.unknown());
9
8
  const registrationSchema = z
10
9
  .object({
11
10
  command: z.string().min(1),
@@ -21,21 +20,23 @@ export const readClientRegistrationStatuses = async (home, currentCommandPath =
21
20
  continue;
22
21
  try {
23
22
  const content = await readFile(client.configPath, "utf8");
24
- const document = objectSchema.parse(client.format === "toml" ? parseToml(content) : JSON.parse(content));
25
- const servers = objectSchema.parse(document[client.format === "toml" ? "mcp_servers" : "mcpServers"] ?? {});
23
+ const { servers } = parseClientConfiguration(content, client.format);
26
24
  const raw = servers[PRODUCT_IDENTITY.mcpServerKey];
27
25
  if (raw === undefined) {
28
- statuses.push(status(client.name, client.configPath, [], "missing"));
26
+ statuses.push(unavailableStatus(client.name, client.configPath, "missing"));
29
27
  continue;
30
28
  }
31
29
  const registration = registrationSchema.parse(raw);
32
- const command = [registration.command, ...registration.args];
33
- statuses.push(status(client.name, client.configPath, command, registrationAligned(registration, client.name, currentCommandPath)
30
+ const command = [
31
+ registration.command,
32
+ ...registration.args,
33
+ ];
34
+ statuses.push(configuredStatus(client.name, client.configPath, command, registrationAligned(registration, client.name, currentCommandPath)
34
35
  ? "aligned"
35
36
  : "stale"));
36
37
  }
37
38
  catch (cause) {
38
- statuses.push(status(client.name, client.configPath, [], isMissing(cause) ? "missing" : "invalid"));
39
+ statuses.push(unavailableStatus(client.name, client.configPath, isMissing(cause) ? "missing" : "invalid"));
39
40
  }
40
41
  }
41
42
  return statuses.sort((left, right) => left.client.localeCompare(right.client));
@@ -56,14 +57,16 @@ const registrationAligned = (registration, client, currentCommandPath) => {
56
57
  command[1] === "mcp" &&
57
58
  resolve(command[0] ?? "") === currentCommandPath);
58
59
  };
59
- const status = (client, configPath, command, state) => ({
60
+ const remediation = "Run rea setup to refresh this registration, then restart the client.";
61
+ const configuredStatus = (client, configPath, command, state) => state === "aligned"
62
+ ? { client, config_path: configPath, command, state, remediation: null }
63
+ : { client, config_path: configPath, command, state, remediation };
64
+ const unavailableStatus = (client, configPath, state) => ({
60
65
  client,
61
66
  config_path: configPath,
62
- command,
67
+ command: [],
63
68
  state,
64
- remediation: state === "aligned"
65
- ? null
66
- : "Run rea setup to refresh this registration, then restart the client.",
69
+ remediation,
67
70
  });
68
71
  const exists = async (path) => {
69
72
  if (path === undefined)
@@ -2,6 +2,19 @@ import { createServer } from "node:http";
2
2
  import { chmod, mkdir, writeFile } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  const RUNNER = `const command = process.argv[2];
5
+ const maximumTimerDelay = 2147483647;
6
+ const delay = milliseconds => new Promise(resolve => {
7
+ let remaining = milliseconds;
8
+ const schedule = () => {
9
+ const interval = Math.min(remaining, maximumTimerDelay);
10
+ setTimeout(() => {
11
+ remaining -= interval;
12
+ if (remaining === 0) resolve();
13
+ else schedule();
14
+ }, interval);
15
+ };
16
+ schedule();
17
+ });
5
18
  const response = await fetch(process.env.REA_SHIM_LEDGER_URL, {
6
19
  method: "POST",
7
20
  headers: { "content-type": "application/json" },
@@ -12,7 +25,7 @@ const route = await response.json();
12
25
  let elapsed = 0;
13
26
  for (const output of route.outputs) {
14
27
  const wait = Math.max(0, output.at_ms - elapsed);
15
- if (wait > 0) await new Promise((resolve) => setTimeout(resolve, wait));
28
+ if (wait > 0) await delay(wait);
16
29
  elapsed = output.at_ms;
17
30
  (output.stream === "stdout" ? process.stdout : process.stderr).write(output.data);
18
31
  }
@@ -1,16 +1,17 @@
1
+ import { projectPermissionFailure } from "./PermissionFailure.js";
2
+ import { artifactExtractionPermissionRequest } from "./ArtifactExtractionDestination.js";
1
3
  import { parseConfig } from "../config.js";
2
4
  import { EnhancedTools } from "./EnhancedTools.js";
3
5
  import { createBinarySession } from "./runtime.js";
4
6
  import { silentLogger } from "../logger.js";
5
7
  import { createEvidence } from "../domain/evidence.js";
6
- import { EvidenceIntegrityError, AnalysisProtocolError, PermissionRequiredError, projectAnalysisError, } from "../domain/errors.js";
8
+ import { EvidenceIntegrityError, projectAnalysisError, } from "../domain/errors.js";
7
9
  import { access } from "node:fs/promises";
8
10
  import { readAnalysisSnapshot, writeAnalysisSnapshot, } from "./AnalysisSnapshotFiles.js";
9
- import { parseBinaryTarget } from "../domain/binaryTarget.js";
11
+ import { parseBinaryTarget } from "./BinaryTargetResolver.js";
10
12
  import { snapshotEvidenceForQuery, snapshotMatchesTarget, } from "../domain/analysisSnapshot.js";
11
13
  import { err, ok } from "../domain/result.js";
12
14
  import { loadConfiguredPermissionAuthority } from "./PermissionConfiguration.js";
13
- import { authorizeFileReadWithDeferredWrite, } from "./DeferredFileAuthorization.js";
14
15
  import { REA_WORKFLOW_PROVIDER, workflowAnalysisProfile, } from "./InvestigationProviders.js";
15
16
  import { artifactInspectionResultSchema } from "../domain/artifactInspection.js";
16
17
  export { runCapabilityStatus, runProviderStatus, } from "./DirectAnalysisStatus.js";
@@ -40,26 +41,13 @@ const authorizeAnalysis = async (authority, tool, arguments_) => {
40
41
  const requests = [];
41
42
  if (tool === "extract_artifact" && typeof arguments_.output_root === "string")
42
43
  requests.push({
43
- capability: "artifact_extract",
44
- path: arguments_.output_root,
44
+ request: artifactExtractionPermissionRequest(),
45
45
  access: "write",
46
46
  });
47
47
  for (const request of requests) {
48
- const result = await authority.authorize({
49
- capability: request.capability,
50
- roots: [request.path],
51
- executables: [],
52
- environment_names: [],
53
- network: "none",
54
- mount: false,
55
- operation_identity: `${tool}:${request.capability}:${request.path}`,
56
- }, request.access);
48
+ const result = await authority.authorize(request.request, request.access);
57
49
  if (!result.ok)
58
- return err(result.error instanceof PermissionRequiredError
59
- ? result.error
60
- : new AnalysisProtocolError(result.error.message, {
61
- cause: result.error,
62
- }));
50
+ return err(projectPermissionFailure(result.error));
63
51
  }
64
52
  if (["inventory_artifact", "inspect_artifact"].includes(tool) &&
65
53
  arguments_.native_mount_approved === true) {
@@ -73,26 +61,13 @@ const authorizeAnalysis = async (authority, tool, arguments_) => {
73
61
  operation_identity: `${tool}:native_mount`,
74
62
  }, "read");
75
63
  if (!result.ok)
76
- return err(result.error instanceof PermissionRequiredError
77
- ? result.error
78
- : new AnalysisProtocolError(result.error.message, {
79
- cause: result.error,
80
- }));
64
+ return err(projectPermissionFailure(result.error));
81
65
  }
82
66
  return ok(null);
83
67
  };
84
68
  const permissionAuthorityFor = (config, supplied) => supplied === undefined
85
69
  ? loadConfiguredPermissionAuthority(config)
86
70
  : Promise.resolve(ok(supplied));
87
- const authorizeSnapshotAccess = async (authority, tool, snapshotPath) => snapshotPath === undefined
88
- ? ok(undefined)
89
- : authorizeFileReadWithDeferredWrite(authority, {
90
- path: snapshotPath,
91
- readCapability: "snapshot_read",
92
- writeCapability: "snapshot_write",
93
- operation: tool,
94
- });
95
- const authorizeDeferredWrite = (authorization) => authorization?.authorizeWrite() ?? Promise.resolve(ok(null));
96
71
  const authorizeAnalysisRun = async (input) => {
97
72
  const authority = await permissionAuthorityFor(input.config, input.suppliedAuthority);
98
73
  if (!authority.ok)
@@ -100,7 +75,7 @@ const authorizeAnalysisRun = async (input) => {
100
75
  const operation = await authorizeAnalysis(authority.value, input.tool, input.arguments);
101
76
  if (!operation.ok)
102
77
  return operation;
103
- return authorizeSnapshotAccess(authority.value, input.tool, input.snapshotPath);
78
+ return ok(null);
104
79
  };
105
80
  const runAnalysis = async (path, tool, arguments_, options) => {
106
81
  const { logger, signal, snapshotPath } = options;
@@ -112,7 +87,6 @@ const runAnalysis = async (path, tool, arguments_, options) => {
112
87
  suppliedAuthority: options.permissionAuthority,
113
88
  tool,
114
89
  arguments: arguments_,
115
- snapshotPath,
116
90
  });
117
91
  if (!authorization.ok)
118
92
  return cliError(authorization.error);
@@ -121,7 +95,6 @@ const runAnalysis = async (path, tool, arguments_, options) => {
121
95
  const prepared = await prepareSnapshot({
122
96
  path,
123
97
  snapshotPath,
124
- policy: config.value.analysisSnapshotFilePolicy,
125
98
  });
126
99
  if (!prepared.ok)
127
100
  return cliError(prepared.error);
@@ -137,7 +110,8 @@ const runAnalysis = async (path, tool, arguments_, options) => {
137
110
  return cliError(opened.error);
138
111
  const evidenceProfile = analysisProfileForEvidence(session, tool);
139
112
  const bindingProfile = session.analysisProfile();
140
- if (snapshot !== undefined &&
113
+ if (tool !== "trace_native_ui_action" &&
114
+ snapshot !== undefined &&
141
115
  evidenceProfile !== undefined &&
142
116
  bindingProfile !== undefined) {
143
117
  const cached = snapshotEvidenceForQuery(snapshot, {
@@ -151,9 +125,6 @@ const runAnalysis = async (path, tool, arguments_, options) => {
151
125
  if (cached !== undefined)
152
126
  return cached;
153
127
  }
154
- const writable = await authorizeDeferredWrite(authorization.value);
155
- if (!writable.ok)
156
- return cliError(writable.error);
157
128
  const { output, evidence } = await executeAnalysisTool({
158
129
  session,
159
130
  openedTarget: opened.value,
@@ -164,11 +135,13 @@ const runAnalysis = async (path, tool, arguments_, options) => {
164
135
  });
165
136
  if (evidence !== undefined)
166
137
  session.recordEvidence(evidence);
167
- if (snapshotPath !== undefined && evidence !== undefined) {
138
+ if (tool !== "trace_native_ui_action" &&
139
+ snapshotPath !== undefined &&
140
+ evidence !== undefined) {
168
141
  const snapshot = session.exportAnalysisSnapshot();
169
142
  if (!snapshot.ok)
170
143
  return cliError(snapshot.error);
171
- const written = await writeAnalysisSnapshot(snapshot.value, snapshotPath, true, config.value.analysisSnapshotFilePolicy);
144
+ const written = await writeAnalysisSnapshot(snapshot.value, snapshotPath, true);
172
145
  if (!written.ok)
173
146
  return cliError(written.error);
174
147
  }
@@ -183,7 +156,9 @@ const executeAnalysisTool = async (input) => {
183
156
  if (tool === "binary_overview" ||
184
157
  tool === "analyze_function" ||
185
158
  tool === "inspect_native_api" ||
186
- tool === "trace_feature") {
159
+ tool === "inspect_native_dispatch_metadata" ||
160
+ tool === "trace_feature" ||
161
+ tool === "trace_native_ui_action") {
187
162
  const result = await new EnhancedTools(session).execute(tool, input.arguments, signal);
188
163
  if (!result.ok)
189
164
  return { output: cliError(result.error) };
@@ -235,10 +210,10 @@ const withProcessCancellation = async (suppliedSignal, operation) => {
235
210
  }
236
211
  };
237
212
  const prepareSnapshot = async (options) => {
238
- const { path, snapshotPath, policy } = options;
213
+ const { path, snapshotPath } = options;
239
214
  if (snapshotPath === undefined || !(await fileExists(snapshotPath)))
240
215
  return ok({});
241
- const loaded = await readAnalysisSnapshot(snapshotPath, policy);
216
+ const loaded = await readAnalysisSnapshot(snapshotPath);
242
217
  if (!loaded.ok)
243
218
  return loaded;
244
219
  const target = await parseBinaryTarget(path);
@@ -259,7 +234,8 @@ const analysisProfileForEvidence = (session, tool) => {
259
234
  };
260
235
  const isWorkflowEvidenceTool = (tool) => tool === "binary_overview" ||
261
236
  tool === "inspect_native_api" ||
262
- tool === "trace_feature";
237
+ tool === "trace_feature" ||
238
+ tool === "trace_native_ui_action";
263
239
  const fileExists = async (path) => {
264
240
  try {
265
241
  await access(path);
@@ -1,7 +1,7 @@
1
1
  import { parseConfig } from "../config.js";
2
2
  import { projectAnalysisError } from "../domain/errors.js";
3
3
  import { jsonObjectSchema } from "../domain/jsonValue.js";
4
- import { createServerIdentity, createServerIdentitySummary, } from "../serverIdentity.js";
4
+ import { createServerIdentity } from "../serverIdentity.js";
5
5
  import { silentLogger } from "../logger.js";
6
6
  import { createBinarySession } from "./runtime.js";
7
7
  const runSessionStatus = async (logger = silentLogger) => {
@@ -21,63 +21,7 @@ const runSessionStatus = async (logger = silentLogger) => {
21
21
  await session.close();
22
22
  }
23
23
  };
24
- /** List provider identities, selection, and availability without capability bodies. */
25
- export const runProviderStatus = async (logger = silentLogger, detail = "summary") => {
26
- const fullStatus = await runSessionStatus(logger);
27
- if (detail === "full")
28
- return fullStatus;
29
- const parsedStatus = jsonObjectSchema.safeParse(fullStatus);
30
- if (!parsedStatus.success || parsedStatus.data.error !== undefined)
31
- return fullStatus;
32
- const status = parsedStatus.data;
33
- return {
34
- open: status.open ?? false,
35
- provider: status.provider ?? null,
36
- providers: status.providers ?? [],
37
- analysis_provider_binding: status.analysis_provider_binding ?? null,
38
- analysis_provider_candidates: projectJsonObjectArray(status.analysis_provider_candidates, ["provider", "availability", "target_support", "selected"]),
39
- server_identity: createServerIdentitySummary({
40
- startedAt: new Date().toISOString(),
41
- }),
42
- };
43
- };
44
- /** List concise operation availability, with explicit full descriptor opt-in. */
45
- export const runCapabilityStatus = async (logger = silentLogger, detail = "summary") => {
46
- const fullStatus = await runSessionStatus(logger);
47
- if (detail === "full")
48
- return fullStatus;
49
- const parsedStatus = jsonObjectSchema.safeParse(fullStatus);
50
- if (!parsedStatus.success || parsedStatus.data.error !== undefined)
51
- return fullStatus;
52
- const status = parsedStatus.data;
53
- const capabilities = projectJsonObjectArray(status.capabilities, [
54
- "operation",
55
- "available",
56
- "reason",
57
- ]);
58
- const available = capabilities.filter((candidate) => typeof candidate === "object" &&
59
- candidate !== null &&
60
- "available" in candidate &&
61
- candidate.available === true).length;
62
- return {
63
- open: status.open ?? false,
64
- summary: {
65
- total: capabilities.length,
66
- available,
67
- unavailable: capabilities.length - available,
68
- },
69
- capabilities,
70
- analysis_provider_binding: status.analysis_provider_binding ?? null,
71
- server_identity: createServerIdentitySummary({
72
- startedAt: new Date().toISOString(),
73
- }),
74
- };
75
- };
76
- const projectJsonObjectArray = (value, keys) => Array.isArray(value)
77
- ? value.map((candidate) => {
78
- const parsed = jsonObjectSchema.safeParse(candidate);
79
- if (!parsed.success)
80
- return candidate;
81
- return Object.fromEntries(keys.flatMap((key) => parsed.data[key] === undefined ? [] : [[key, parsed.data[key]]]));
82
- })
83
- : [];
24
+ /** List complete provider identities, capabilities, and availability. */
25
+ export const runProviderStatus = (logger = silentLogger) => runSessionStatus(logger);
26
+ /** List complete operation descriptors and availability. */
27
+ export const runCapabilityStatus = (logger = silentLogger) => runSessionStatus(logger);