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
@@ -6,7 +6,6 @@ import { parseLinuxPrivateDisplayDiagnostic } from "./LinuxPrivateDisplayDiagnos
6
6
  const PYTHON_PATH = "/usr/bin/python3";
7
7
  const UNSHARE_PATH = "/usr/bin/unshare";
8
8
  const DEFAULT_PROBE_TIMEOUT_MS = 5_000;
9
- const PROBE_OUTPUT_LIMIT_BYTES = 64 * 1024;
10
9
  /** Probe the exact Xvfb boundary and select the least-privileged viable strategy. */
11
10
  export const selectLinuxPrivateDisplayStrategy = async (options) => {
12
11
  const timeoutMs = options.timeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS;
@@ -26,7 +25,6 @@ export const selectLinuxPrivateDisplayStrategy = async (options) => {
26
25
  effective_socket_directory_mode: isolated.diagnostic.effective_socket_directory_mode,
27
26
  effective_mount_read_only: isolated.diagnostic.effective_mount_read_only,
28
27
  xvfb_stderr_bytes: isolated.diagnostic.xvfb_stderr_bytes,
29
- xvfb_stderr_truncated: isolated.diagnostic.xvfb_stderr_truncated,
30
28
  });
31
29
  return {
32
30
  ok: true,
@@ -39,10 +37,10 @@ export const selectLinuxPrivateDisplayStrategy = async (options) => {
39
37
  },
40
38
  };
41
39
  };
42
- /** Run one helper probe in an owned process group with a hard output bound. */
40
+ /** Run one helper probe in an owned process group and retain its full diagnostics. */
43
41
  export const runLinuxPrivateDisplayProbe = async (strategy, options) => {
44
42
  if (options.signal?.aborted === true)
45
- return emptyProcessResult({ cancelled: true });
43
+ return emptyProcessResult("cancelled");
46
44
  const command = privateDisplayProbeCommand(options.helperPath, strategy);
47
45
  let started;
48
46
  try {
@@ -54,16 +52,14 @@ export const runLinuxPrivateDisplayProbe = async (strategy, options) => {
54
52
  });
55
53
  }
56
54
  catch {
57
- return emptyProcessResult();
55
+ return emptyProcessResult("launch-failed");
58
56
  }
59
57
  const launch = {
60
58
  process: started.process,
61
59
  ownsProcessLifetime: true,
62
60
  cleanup: () => cleanupOwnedProcessGroup(started.ownership),
63
61
  };
64
- const supervisor = new ProviderProcessSupervisor(launch, {
65
- maxOutputBytesPerStream: PROBE_OUTPUT_LIMIT_BYTES,
66
- });
62
+ const supervisor = new ProviderProcessSupervisor(launch);
67
63
  const outcome = await waitForProbeExit(supervisor, options.timeoutMs, options.signal);
68
64
  let cleanupIncomplete = false;
69
65
  if (outcome !== "exit") {
@@ -74,12 +70,14 @@ export const runLinuxPrivateDisplayProbe = async (strategy, options) => {
74
70
  supervisor.dispose();
75
71
  const snapshot = supervisor.snapshot();
76
72
  return {
73
+ outcome: outcome === "exit"
74
+ ? "exited"
75
+ : outcome === "timeout"
76
+ ? "timed-out"
77
+ : "cancelled",
77
78
  exitCode: snapshot.exitCode,
78
79
  stderr: snapshot.stderr.text,
79
80
  stderrBytes: snapshot.stderr.bytes,
80
- stderrTruncated: snapshot.stderr.truncated,
81
- timedOut: outcome === "timeout",
82
- cancelled: outcome === "cancelled",
83
81
  cleanupIncomplete,
84
82
  };
85
83
  };
@@ -119,22 +117,27 @@ const evaluatedProbe = async (strategy, options, timeoutMs, runner) => {
119
117
  diagnostic: syntheticDiagnostic(strategy, "probe_failed"),
120
118
  };
121
119
  }
122
- if (processResult.cancelled)
120
+ if (processResult.outcome === "cancelled")
123
121
  return {
124
122
  ok: false,
125
123
  diagnostic: syntheticDiagnostic(strategy, "cancelled"),
126
124
  };
127
- if (processResult.timedOut)
125
+ if (processResult.outcome === "timed-out")
128
126
  return {
129
127
  ok: false,
130
128
  diagnostic: syntheticDiagnostic(strategy, "probe_timeout"),
131
129
  };
130
+ if (processResult.outcome === "launch-failed")
131
+ return {
132
+ ok: false,
133
+ diagnostic: syntheticDiagnostic(strategy, "probe_failed"),
134
+ };
132
135
  if (processResult.cleanupIncomplete)
133
136
  return {
134
137
  ok: false,
135
138
  diagnostic: syntheticDiagnostic(strategy, "cleanup_incomplete"),
136
139
  };
137
- const parsed = parseLinuxPrivateDisplayDiagnostic(processResult.stderr, processResult.stderrTruncated);
140
+ const parsed = parseLinuxPrivateDisplayDiagnostic(processResult.stderr);
138
141
  if (!parsed.ok)
139
142
  return {
140
143
  ok: false,
@@ -154,10 +157,8 @@ const evaluatedProbe = async (strategy, options, timeoutMs, runner) => {
154
157
  };
155
158
  const exitMatchesDiagnostic = (exitCode, diagnostic) => diagnostic.status === "ready"
156
159
  ? exitCode === 0
157
- : diagnostic.failure_code !== null &&
158
- hopperStartupExitCode(diagnostic.failure_code) === exitCode;
160
+ : hopperStartupExitCode(diagnostic.failure_code) === exitCode;
159
161
  const syntheticDiagnostic = (strategy, reason, failureCode = "private_display_unavailable") => ({
160
- schema_version: 1,
161
162
  component: "hopper_private_display",
162
163
  operation: "probe",
163
164
  status: "error",
@@ -172,25 +173,19 @@ const syntheticDiagnostic = (strategy, reason, failureCode = "private_display_un
172
173
  strategy,
173
174
  fallback_reason: null,
174
175
  xvfb_stderr_bytes: 0,
175
- xvfb_stderr_truncated: false,
176
176
  });
177
177
  const unavailable = (diagnostic) => ({
178
178
  ok: false,
179
179
  strategy: "unavailable",
180
- exitCode: diagnostic.failure_code === null
181
- ? 70
182
- : (hopperStartupExitCode(diagnostic.failure_code) ?? 70),
180
+ exitCode: hopperStartupExitCode(diagnostic.failure_code) ?? 70,
183
181
  diagnostic: { ...diagnostic, strategy: "unavailable" },
184
182
  });
185
- const emptyProcessResult = (overrides = {}) => ({
183
+ const emptyProcessResult = (outcome) => ({
184
+ outcome,
186
185
  exitCode: undefined,
187
186
  stderr: "",
188
187
  stderrBytes: 0,
189
- stderrTruncated: false,
190
- timedOut: false,
191
- cancelled: false,
192
188
  cleanupIncomplete: false,
193
- ...overrides,
194
189
  });
195
190
  const waitForProbeExit = async (supervisor, timeoutMs, signal) => {
196
191
  if (signal?.aborted === true)
@@ -5,7 +5,7 @@ import { err, ok } from "../domain/result.js";
5
5
  const remoteErrorSchema = z
6
6
  .object({
7
7
  code: z.number().int(),
8
- message: z.string().max(512),
8
+ message: z.string(),
9
9
  type: z
10
10
  .enum([
11
11
  "remote",
@@ -38,10 +38,10 @@ const eventSchema = z
38
38
  z
39
39
  .object({
40
40
  type: z.literal("progress"),
41
- phase: z.string().min(1).max(64),
41
+ phase: z.string().min(1),
42
42
  completed: z.number().nonnegative().finite(),
43
43
  total: z.number().nonnegative().finite().nullable(),
44
- message: z.string().min(1).max(512),
44
+ message: z.string().min(1),
45
45
  terminal: z.boolean().optional(),
46
46
  })
47
47
  .strict(),
@@ -82,5 +82,7 @@ export const parseBridgeMessageLine = (line) => {
82
82
  };
83
83
  /** Project a parsed response into its result or expected remote failure. */
84
84
  export const responseResult = (response) => "error" in response
85
- ? err(new HopperRemoteError(response.error.code, response.error.message, response.error.type))
85
+ ? err(new HopperRemoteError(response.error.code, response.error.message, {
86
+ diagnosticType: response.error.type,
87
+ }))
86
88
  : ok(response.result);
@@ -2,7 +2,7 @@ import { parseConfig } from "../config.js";
2
2
  import { readProjectPermissionStore } from "../application/ProjectPermissionStore.js";
3
3
  import { MCP_PERMISSION_RELOAD_FAILED } from "./messages.js";
4
4
  export const registerConfigReload = (input) => {
5
- const { dependencies, permissionAuthority, runtimeState, liveServers, serverLogger, } = input;
5
+ const { dependencies, permissionAuthority, runtimeState, serverLogger } = input;
6
6
  let reloadQueue = Promise.resolve();
7
7
  return (dependencies.registerReload?.(() => {
8
8
  const refreshed = parseConfig(dependencies.env);
@@ -33,14 +33,6 @@ export const registerConfigReload = (input) => {
33
33
  return;
34
34
  }
35
35
  runtimeState.currentConfig = refreshed.value;
36
- Object.assign(runtimeState.processPolicy, refreshed.value.processExecutionPolicy);
37
- Object.assign(runtimeState.evidencePolicy, refreshed.value.evidenceFilePolicy);
38
- Object.assign(runtimeState.snapshotPolicy, refreshed.value.analysisSnapshotFilePolicy);
39
- runtimeState.investigationRoots.splice(0, runtimeState.investigationRoots.length, ...refreshed.value.investigationInputRoots);
40
- Object.assign(runtimeState.javascriptReplayPolicy, refreshed.value.javascriptReplayPolicy);
41
- Object.assign(runtimeState.managedRuntimePolicy, refreshed.value.managedRuntimePolicy);
42
- for (const server of liveServers)
43
- server.sendToolListChanged();
44
36
  })
45
37
  .catch(() => {
46
38
  serverLogger.error(MCP_PERMISSION_RELOAD_FAILED);
@@ -8,7 +8,7 @@ export const createShutdown = (input) => {
8
8
  unregisterReload();
9
9
  unregisterShutdown();
10
10
  await handle.close();
11
- await session.close();
11
+ await session.close({ retainProviderDocuments: true });
12
12
  permissionAuthority.clearSessionGrants();
13
13
  })();
14
14
  return shutdownPromise;
@@ -1,26 +1,3 @@
1
1
  export const createRuntimeState = (config) => ({
2
2
  currentConfig: config,
3
- processPolicy: {
4
- ...config.processExecutionPolicy,
5
- executableRoots: [...config.processExecutionPolicy.executableRoots],
6
- workingRoots: [...config.processExecutionPolicy.workingRoots],
7
- allowedEnvironment: [...config.processExecutionPolicy.allowedEnvironment],
8
- },
9
- evidencePolicy: {
10
- ...config.evidenceFilePolicy,
11
- roots: [...config.evidenceFilePolicy.roots],
12
- },
13
- snapshotPolicy: {
14
- ...config.analysisSnapshotFilePolicy,
15
- roots: [...config.analysisSnapshotFilePolicy.roots],
16
- },
17
- investigationRoots: [...config.investigationInputRoots],
18
- javascriptReplayPolicy: {
19
- ...config.javascriptReplayPolicy,
20
- roots: [...config.javascriptReplayPolicy.roots],
21
- },
22
- managedRuntimePolicy: {
23
- ...config.managedRuntimePolicy,
24
- roots: [...config.managedRuntimePolicy.roots],
25
- },
26
3
  });
@@ -1,28 +1,27 @@
1
1
  import { createServer, } from "../server/createServer.js";
2
2
  import { MCP_CONNECTION_LOST, MCP_CONNECTION_START_FAILED, } from "./messages.js";
3
3
  export const startMcpTransport = async (dependencies, session, serverContext) => {
4
- const liveServers = new Set();
5
4
  const { serverLogger } = serverContext;
5
+ let optionalProviders = {};
6
+ try {
7
+ optionalProviders = await serverContext.loadOptionalProviders();
8
+ }
9
+ catch {
10
+ serverLogger.warn("Optional MCP providers could not load; affected tools remain unavailable");
11
+ }
6
12
  let handle;
7
13
  try {
8
- handle = dependencies.serve(() => {
9
- const server = (dependencies.createServer ?? createServer)(session, session, {
10
- logger: serverContext.logger,
11
- processPolicy: serverContext.runtimeState.processPolicy,
12
- evidenceFilePolicy: serverContext.runtimeState.evidencePolicy,
13
- investigationInputRoots: serverContext.runtimeState.investigationRoots,
14
- analysisSnapshotFilePolicy: serverContext.runtimeState.snapshotPolicy,
15
- permissionAuthority: serverContext.permissionAuthority,
16
- loadOptionalProviders: serverContext.loadOptionalProviders,
17
- artifactIntegrityContinueEnabled: () => serverContext.runtimeState.currentConfig
18
- .artifactIntegrityContinueEnabled,
19
- javascriptReplayPolicy: serverContext.runtimeState.javascriptReplayPolicy,
20
- managedRuntimePolicy: serverContext.runtimeState.managedRuntimePolicy,
21
- availabilityPolicy: () => runtimeAvailability(serverContext.runtimeState),
22
- });
23
- liveServers.add(server);
24
- return server;
25
- }, {
14
+ handle = dependencies.serve(() => (dependencies.createServer ?? createServer)(session, session, {
15
+ logger: serverContext.logger,
16
+ processPolicy: () => serverContext.runtimeState.currentConfig.processExecutionPolicy,
17
+ permissionAuthority: serverContext.permissionAuthority,
18
+ ...optionalProviders,
19
+ artifactIntegrityContinueEnabled: () => serverContext.runtimeState.currentConfig
20
+ .artifactIntegrityContinueEnabled,
21
+ javascriptReplayPolicy: () => serverContext.runtimeState.currentConfig.javascriptReplayPolicy,
22
+ managedRuntimePolicy: () => serverContext.runtimeState.currentConfig.managedRuntimePolicy,
23
+ availabilityPolicy: () => runtimeAvailability(serverContext.runtimeState),
24
+ }), {
26
25
  onerror: () => {
27
26
  serverLogger.error(MCP_CONNECTION_LOST);
28
27
  dependencies.writeStderr(`${MCP_CONNECTION_LOST}\n`);
@@ -35,26 +34,15 @@ export const startMcpTransport = async (dependencies, session, serverContext) =>
35
34
  dependencies.writeStderr(`${MCP_CONNECTION_START_FAILED}\n`);
36
35
  return { ok: false };
37
36
  }
38
- return { ok: true, handle, liveServers };
37
+ return { ok: true, handle };
39
38
  };
40
39
  const runtimeAvailability = (state) => ({
41
- processCaptureEnabled: state.currentConfig.processExecutionPolicy.enabled,
42
- evidenceFileRoots: state.currentConfig.evidenceFilePolicy.roots.length,
43
- investigationInputRoots: state.currentConfig.investigationInputRoots.length,
44
- browserObservationEnabled: state.currentConfig.browserObservationEnabled &&
45
- state.currentConfig.browserCdpEndpoints.length > 0 &&
46
- state.currentConfig.browserAllowedOrigins.length > 0,
47
- browserScenarioEnabled: state.currentConfig.browserScenarioPolicy.enabled &&
48
- state.currentConfig.browserScenarioPolicy.allowedOrigins.length > 0 &&
49
- (state.currentConfig.browserScenarioPolicy.executableRoots.length > 0 ||
50
- state.currentConfig.browserScenarioPolicy.cdpEndpoints.length > 0),
51
- electronObservationEnabled: state.currentConfig.electronObservationEnabled &&
52
- state.currentConfig.electronCdpEndpoints.length > 0 &&
53
- state.currentConfig.electronFileRoots.length > 0,
54
- v8InspectorObservationEnabled: state.currentConfig.v8InspectorObservationEnabled &&
55
- state.currentConfig.v8InspectorEndpoints.length > 0 &&
56
- (state.currentConfig.v8InspectorFileRoots.length > 0 ||
57
- state.currentConfig.v8InspectorAllowedOrigins.length > 0),
58
- javascriptReplayEnabled: state.currentConfig.javascriptReplayPolicy.enabled,
59
- managedRuntimeEnabled: state.currentConfig.managedRuntimePolicy.enabled,
40
+ processCaptureEnabled: state.currentConfig.processExecutionPolicy.status === "enabled",
41
+ browserObservationEnabled: state.currentConfig.browserObservationPolicy.status === "enabled",
42
+ browserScenarioEnabled: state.currentConfig.browserScenarioPolicy.status === "enabled",
43
+ electronObservationEnabled: state.currentConfig.electronObservationPolicy.status === "enabled",
44
+ electronAutomationEnabled: state.currentConfig.electronAutomationPolicy.status === "enabled",
45
+ v8InspectorObservationEnabled: state.currentConfig.v8InspectorObservationPolicy.status === "enabled",
46
+ javascriptReplayEnabled: state.currentConfig.javascriptReplayPolicy.status === "enabled",
47
+ managedRuntimeEnabled: state.currentConfig.managedRuntimePolicy.status === "enabled",
60
48
  });
package/dist/main.js CHANGED
@@ -63,20 +63,23 @@ export const run = async (dependencies = runtimeDependencies()) => {
63
63
  const transport = await startMcpTransport(dependencies, session, {
64
64
  logger,
65
65
  serverLogger,
66
- loadOptionalProviders: async () => {
67
- const [{ CdpBrowserProvider }, { PlaywrightBrowserScenarioProvider }, { CdpElectronProvider }, { V8InspectorProvider },] = await Promise.all([
68
- import("./browser/CdpBrowserProvider.js"),
69
- import("./browser/PlaywrightBrowserScenarioProvider.js"),
70
- import("./browser/CdpElectronProvider.js"),
71
- import("./browser/V8InspectorProvider.js"),
72
- ]);
73
- return {
74
- browserObservation: new CdpBrowserProvider(),
75
- browserScenarioCapture: new PlaywrightBrowserScenarioProvider(),
76
- electronObservation: new CdpElectronProvider(),
77
- javascriptRuntimeObservation: new V8InspectorProvider(),
78
- };
79
- },
66
+ loadOptionalProviders: dependencies.loadOptionalProviders ??
67
+ (async () => {
68
+ const [{ CdpBrowserProvider }, { PlaywrightBrowserScenarioProvider }, { CdpElectronProvider }, { PlaywrightElectronActiveProvider }, { V8InspectorProvider },] = await Promise.all([
69
+ import("./browser/CdpBrowserProvider.js"),
70
+ import("./browser/PlaywrightBrowserScenarioProvider.js"),
71
+ import("./browser/CdpElectronProvider.js"),
72
+ import("./browser/PlaywrightElectronActiveProvider.js"),
73
+ import("./browser/V8InspectorProvider.js"),
74
+ ]);
75
+ return {
76
+ browserObservation: new CdpBrowserProvider(),
77
+ browserScenarioCapture: new PlaywrightBrowserScenarioProvider(),
78
+ electronObservation: new CdpElectronProvider(),
79
+ electronActiveObservation: new PlaywrightElectronActiveProvider(),
80
+ javascriptRuntimeObservation: new V8InspectorProvider(),
81
+ };
82
+ }),
80
83
  permissionAuthority: permissionAuthority.value,
81
84
  runtimeState,
82
85
  });
@@ -86,7 +89,6 @@ export const run = async (dependencies = runtimeDependencies()) => {
86
89
  dependencies,
87
90
  permissionAuthority: permissionAuthority.value,
88
91
  runtimeState,
89
- liveServers: transport.liveServers,
90
92
  serverLogger,
91
93
  });
92
94
  createShutdown({
package/dist/mcpDoctor.js CHANGED
@@ -2,18 +2,18 @@ import { Client } from "@modelcontextprotocol/client";
2
2
  import { StdioClientTransport } from "@modelcontextprotocol/client/stdio";
3
3
  import { Formatter } from "incur";
4
4
  import { resolve } from "node:path";
5
- import { CATALOG_IDENTITY, MCP_RESOURCE_CATALOG, MCP_RESOURCE_TEMPLATE_CATALOG, } from "./catalogIdentity.js";
5
+ import { CATALOG_IDENTITY } from "./catalogIdentity.js";
6
6
  import { PROMPT_CONTRACTS } from "./contracts/promptContracts.js";
7
+ import { TOOL_CONTRACTS } from "./contracts/toolContracts.js";
7
8
  import { PRODUCT_IDENTITY } from "./identity.js";
8
9
  import { MCP_STARTUP_POLICY } from "./mcpStartupPolicy.js";
9
- const STDERR_LIMIT_BYTES = 64 * 1_024;
10
10
  const OUTPUT_FORMATS = ["toon", "json", "yaml", "md", "jsonl"];
11
- /** Diagnose the actual production stdio adapter with one bounded SDK session. */
11
+ /** Diagnose the actual production stdio adapter with one startup-bounded SDK session. */
12
12
  export const runProductionMcpDoctor = async (options) => {
13
13
  const deadline = Date.now() + (options.deadlineMs ?? MCP_STARTUP_POLICY.doctorDeadlineMs);
14
14
  const controller = new AbortController();
15
15
  const timer = setTimeout(() => controller.abort(new Error("Production MCP doctor deadline expired")), Math.max(1, deadline - Date.now()));
16
- const stderr = boundedStderr();
16
+ const stderr = captureStderr();
17
17
  const transport = new TrackedStdioClientTransport({
18
18
  command: options.command,
19
19
  args: [...options.args],
@@ -55,22 +55,16 @@ export const runProductionMcpDoctor = async (options) => {
55
55
  };
56
56
  const inspectProductionMcpSession = async (client, deadline, signal) => {
57
57
  const request = requestOptions(deadline, signal);
58
- const [tools, prompts, resources, templates, identity, requestFlow] = await Promise.all([
58
+ const [tools, prompts, requestFlow] = await Promise.all([
59
59
  client.listTools(undefined, request),
60
60
  client.listPrompts(undefined, request),
61
- client.listResources(undefined, request),
62
- client.listResourceTemplates(undefined, request),
63
- client.readResource({ uri: "rea://server/identity" }, request),
64
- client.callTool({ name: "binary_session", arguments: { detail: "full" } }, request),
61
+ client.callTool({ name: "binary_session", arguments: {} }, request),
65
62
  ]);
66
- const expectedToolNames = availableToolNames(requestFlow.structuredContent) ?? [];
67
63
  const inventory = {
68
- tools: compareInventory(expectedToolNames, tools.tools.map(({ name }) => name)),
64
+ tools: compareInventory(TOOL_CONTRACTS.map(({ name }) => name), tools.tools.map(({ name }) => name)),
69
65
  prompts: compareInventory(PROMPT_CONTRACTS.map(({ name }) => name), prompts.prompts.map(({ name }) => name)),
70
- resources: compareInventory(MCP_RESOURCE_CATALOG.map(({ name }) => name), resources.resources.map(({ name }) => name)),
71
- resource_templates: compareInventory(MCP_RESOURCE_TEMPLATE_CATALOG.map(({ name }) => name), templates.resourceTemplates.map(({ name }) => name)),
72
66
  };
73
- const observedIdentity = parseIdentityResource(identity.contents);
67
+ const observedIdentity = parseIdentityToolResult(requestFlow.structuredContent);
74
68
  const serverVersion = client.getServerVersion();
75
69
  const protocolVersion = client.getNegotiatedProtocolVersion();
76
70
  const checks = [
@@ -117,28 +111,6 @@ const inspectProductionMcpSession = async (client, deadline, signal) => {
117
111
  checks,
118
112
  };
119
113
  };
120
- const availableToolNames = (structuredContent) => {
121
- if (typeof structuredContent !== "object" || structuredContent === null)
122
- return undefined;
123
- const result = Reflect.get(structuredContent, "result");
124
- if (typeof result !== "object" || result === null)
125
- return undefined;
126
- const availability = Reflect.get(result, "tool_availability");
127
- if (!Array.isArray(availability))
128
- return undefined;
129
- const names = [];
130
- for (const item of availability) {
131
- if (typeof item !== "object" || item === null)
132
- return undefined;
133
- const name = Reflect.get(item, "name");
134
- const available = Reflect.get(item, "available");
135
- if (typeof name !== "string" || typeof available !== "boolean")
136
- return undefined;
137
- if (available)
138
- names.push(name);
139
- }
140
- return names;
141
- };
142
114
  /**
143
115
  * Dispatcher entry for `rea mcp doctor`, kept separate from Incur MCP setup.
144
116
  * @public
@@ -183,29 +155,23 @@ const inventoryCheck = (name, comparison) => ({
183
155
  comparison.duplicates.length === 0,
184
156
  detail: `expected=${String(comparison.expected)} observed=${String(comparison.observed)} missing=${comparison.missing.join(",") || "none"} unexpected=${comparison.unexpected.join(",") || "none"} duplicates=${comparison.duplicates.join(",") || "none"}`,
185
157
  });
186
- const parseIdentityResource = (contents) => {
187
- const first = contents.find((candidate) => isRecord(candidate) && typeof candidate.text === "string");
188
- if (!isRecord(first) || typeof first.text !== "string")
158
+ const parseIdentityToolResult = (input) => {
159
+ if (!isRecord(input) || !isRecord(input.result))
189
160
  return { packageVersion: null, catalogDigest: null };
190
- try {
191
- const identity = JSON.parse(first.text);
192
- if (!isRecord(identity))
193
- return { packageVersion: null, catalogDigest: null };
194
- const packageIdentity = identity.package;
195
- const catalog = identity.catalog;
196
- const digests = isRecord(catalog) ? catalog.digests : undefined;
197
- return {
198
- packageVersion: isRecord(packageIdentity) && typeof packageIdentity.version === "string"
199
- ? packageIdentity.version
200
- : null,
201
- catalogDigest: isRecord(digests) && typeof digests.combined_sha256 === "string"
202
- ? digests.combined_sha256
203
- : null,
204
- };
205
- }
206
- catch {
161
+ const identity = input.result.server_identity;
162
+ if (!isRecord(identity))
207
163
  return { packageVersion: null, catalogDigest: null };
208
- }
164
+ const packageIdentity = identity.package;
165
+ const catalog = identity.catalog;
166
+ const digests = isRecord(catalog) ? catalog.digests : undefined;
167
+ return {
168
+ packageVersion: isRecord(packageIdentity) && typeof packageIdentity.version === "string"
169
+ ? packageIdentity.version
170
+ : null,
171
+ catalogDigest: isRecord(digests) && typeof digests.combined_sha256 === "string"
172
+ ? digests.combined_sha256
173
+ : null,
174
+ };
209
175
  };
210
176
  const parseOutputArguments = (arguments_) => {
211
177
  let format = "toon";
@@ -256,28 +222,20 @@ const targetFreeEnvironment = (environment) => {
256
222
  delete result[name];
257
223
  return result;
258
224
  };
259
- const boundedStderr = () => {
260
- let text = "";
225
+ const captureStderr = () => {
226
+ const chunks = [];
261
227
  let bytes = 0;
262
- let truncated = false;
263
228
  return {
264
229
  append(chunk) {
265
230
  const buffer = Buffer.isBuffer(chunk)
266
231
  ? chunk
267
232
  : Buffer.from(String(chunk), "utf8");
268
233
  bytes += buffer.byteLength;
269
- const retained = Buffer.byteLength(text, "utf8");
270
- if (retained < STDERR_LIMIT_BYTES)
271
- text += buffer
272
- .subarray(0, STDERR_LIMIT_BYTES - retained)
273
- .toString("utf8");
274
- if (bytes > STDERR_LIMIT_BYTES)
275
- truncated = true;
234
+ chunks.push(Buffer.from(buffer));
276
235
  },
277
236
  value: () => ({
278
- stderr: text,
237
+ stderr: Buffer.concat(chunks, bytes).toString("utf8"),
279
238
  stderr_bytes: bytes,
280
- stderr_truncated: truncated,
281
239
  }),
282
240
  };
283
241
  };
@@ -14,17 +14,17 @@ export class NativeCommandFailure extends Error {
14
14
  this.exitCode = exitCode;
15
15
  }
16
16
  }
17
- /** Run allowlisted Xcode tools directly with bounded output and no shell. */
17
+ /** Run allowlisted Xcode tools directly without a shell. */
18
18
  export class XcrunCommandRunner {
19
19
  resolveTool;
20
20
  #resolved = new Map();
21
- constructor(resolveTool = (tool) => resolveXcrunTool(tool)) {
21
+ constructor(resolveTool = (tool, signal) => resolveXcrunTool(tool, signal)) {
22
22
  this.resolveTool = resolveTool;
23
23
  }
24
24
  run(tool, arguments_, options) {
25
25
  if (!ALLOWED_TOOLS.has(tool))
26
26
  return Promise.resolve(err(new NativeCommandFailure(tool, "unavailable")));
27
- return this.#resolve(tool).then(async (resolved) => {
27
+ return this.#resolve(tool, options.signal).then(async (resolved) => {
28
28
  if (!resolved.ok)
29
29
  return resolved;
30
30
  const captured = await captureProcess(resolved.value.path, arguments_, tool, options);
@@ -41,15 +41,13 @@ export class XcrunCommandRunner {
41
41
  : captured;
42
42
  });
43
43
  }
44
- async #resolve(tool) {
44
+ async #resolve(tool, signal) {
45
45
  const existing = this.#resolved.get(tool);
46
46
  if (existing !== undefined)
47
- return existing;
48
- const pending = this.resolveTool(tool);
49
- this.#resolved.set(tool, pending);
50
- const resolved = await pending;
51
- if (!resolved.ok && this.#resolved.get(tool) === pending)
52
- this.#resolved.delete(tool);
47
+ return ok(existing);
48
+ const resolved = await this.resolveTool(tool, signal);
49
+ if (resolved.ok)
50
+ this.#resolved.set(tool, resolved.value);
53
51
  return resolved;
54
52
  }
55
53
  }
@@ -66,9 +64,14 @@ const ALLOWED_TOOLS = new Set([
66
64
  "swift-demangle",
67
65
  "vtool",
68
66
  ]);
69
- const resolveXcrunTool = async (tool) => {
70
- const found = await captureProcess("/usr/bin/xcrun", ["--find", tool], "xcrun", { timeoutMs: 5_000, maxOutputBytes: 64 * 1024 });
71
- if (!found.ok || found.value.exitCode !== 0)
67
+ const resolveXcrunTool = async (tool, signal) => {
68
+ const found = await captureProcess("/usr/bin/xcrun", ["--find", tool], "xcrun", signal === undefined ? {} : { signal });
69
+ if (!found.ok) {
70
+ if (found.error.reason === "cancelled")
71
+ return err(new NativeCommandFailure(tool, "cancelled"));
72
+ return err(new NativeCommandFailure(tool, "unavailable"));
73
+ }
74
+ if (found.value.exitCode !== 0)
72
75
  return err(new NativeCommandFailure(tool, "unavailable"));
73
76
  const candidate = found.value.stdout.trim();
74
77
  if (!candidate.startsWith("/"))
@@ -107,7 +110,6 @@ const captureProcess = (executable, arguments_, tool, options) => new Promise((r
107
110
  if (settled)
108
111
  return;
109
112
  settled = true;
110
- clearTimeout(timeout);
111
113
  options.signal?.removeEventListener("abort", onAbort);
112
114
  resolve(result);
113
115
  };
@@ -117,20 +119,13 @@ const captureProcess = (executable, arguments_, tool, options) => new Promise((r
117
119
  };
118
120
  const onAbort = () => stop("cancelled");
119
121
  options.signal?.addEventListener("abort", onAbort, { once: true });
120
- const timeout = setTimeout(() => stop("timeout"), options.timeoutMs);
121
122
  child.stdout.on("data", (chunk) => {
122
123
  stdoutBytes += chunk.length;
123
- if (stdoutBytes + stderrBytes > options.maxOutputBytes)
124
- stop("output-limit");
125
- else
126
- stdout.push(chunk);
124
+ stdout.push(chunk);
127
125
  });
128
126
  child.stderr.on("data", (chunk) => {
129
127
  stderrBytes += chunk.length;
130
- if (stdoutBytes + stderrBytes > options.maxOutputBytes)
131
- stop("output-limit");
132
- else
133
- stderr.push(chunk);
128
+ stderr.push(chunk);
134
129
  });
135
130
  child.once("error", (cause) => finish(err(new NativeCommandFailure(tool, "io", null, { cause }))));
136
131
  child.once("close", (code, signal) => {
@@ -147,8 +142,6 @@ const captureProcess = (executable, arguments_, tool, options) => new Promise((r
147
142
  stderr: Buffer.concat(stderr).toString("utf8"),
148
143
  stdoutBytes,
149
144
  stderrBytes,
150
- stdoutTruncated: false,
151
- stderrTruncated: false,
152
145
  exitCode: code,
153
146
  signal,
154
147
  }));