rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -141,7 +141,7 @@ export class IdaOperationRunner {
141
141
  offset,
142
142
  max_lines: 100,
143
143
  }));
144
- if (page.code === null)
144
+ if (page.code === null || page.error !== undefined)
145
145
  throw new AnalysisProtocolError(`IDA decompilation failed: ${page.error ?? "missing code"}`);
146
146
  result.push(page.code);
147
147
  offset = nextOffset(page.cursor, offset);
@@ -152,7 +152,7 @@ export class IdaOperationRunner {
152
152
  if (this.protocol === "legacy")
153
153
  return legacyXrefsSchema.parse(await this.call("get_xrefs_to", { address }));
154
154
  const page = modernXrefsSchema.parse(await this.call("xrefs_to", { addrs: [address], limit: 1000 }))[0];
155
- if (page?.xrefs == null)
155
+ if (page?.xrefs == null || page.error !== undefined)
156
156
  throw new AnalysisProtocolError(`IDA xrefs failed: ${page?.error ?? "missing references"}`);
157
157
  if (page.more === true)
158
158
  this.limitations.push("Upstream xrefs_to capped results at 1000 references; additional references remain unknown.");
@@ -183,7 +183,7 @@ export class IdaOperationRunner {
183
183
  }
184
184
  else {
185
185
  const page = modernCalleesSchema.parse(await this.call("callees", { addrs: [fn.address], limit: 500 }))[0];
186
- if (page?.callees == null)
186
+ if (page?.callees == null || page.error !== undefined)
187
187
  throw new AnalysisProtocolError(`IDA callees failed: ${page?.error ?? "missing callees"}`);
188
188
  if (page.more === true)
189
189
  this.limitations.push("Upstream callees capped results at 500; additional callees remain unknown.");
@@ -1,23 +1,24 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { createAnalysisProfile } from "../domain/analysisProfile.js";
2
3
  import { err, ok } from "../domain/result.js";
3
4
  import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
4
- import { ConfigurationError } from "../domain/configurationErrors.js";
5
5
  import { createHash } from "node:crypto";
6
6
  import canonicalize from "canonicalize";
7
- import { readIdaConfiguration, } from "./IdaConfiguration.js";
7
+ import { readIdaConfiguration, idaConfigurationError, } from "./IdaConfiguration.js";
8
8
  import { createIdaMcpConnection, } from "./IdaMcpConnection.js";
9
9
  import { idaCapabilities, IDA_PROVIDER_IDENTITY, } from "./IdaProviderCapabilities.js";
10
10
  import { IdaSessionClient } from "./IdaSessionClient.js";
11
11
  import { privateRuntimeRootCapability } from "../process/PrivateRuntimeRoot.js";
12
- export { IDA_PROVIDER_IDENTITY } from "./IdaProviderCapabilities.js";
13
12
  /** Bring-your-own IDA MCP candidate; discovery performs no provider startup. */
14
13
  export class IdaProvider {
15
14
  config;
16
15
  connectionFactory;
17
16
  #registration;
18
- constructor(config, connectionFactory = createIdaMcpConnection) {
17
+ environment;
18
+ constructor(config, environment, connectionFactory = createIdaMcpConnection) {
19
19
  this.config = config;
20
20
  this.connectionFactory = connectionFactory;
21
+ this.environment = snapshotEnvironment(environment);
21
22
  }
22
23
  identity() {
23
24
  return IDA_PROVIDER_IDENTITY;
@@ -99,11 +100,6 @@ export class IdaProvider {
99
100
  .update(canonicalize(config.value) ?? "")
100
101
  .digest("hex"),
101
102
  }),
102
- compatibility: {
103
- mode: config.value.mode,
104
- engine_version: null,
105
- upstream_distribution_version: null,
106
- },
107
103
  });
108
104
  }
109
105
  createClient(target, profile) {
@@ -111,9 +107,9 @@ export class IdaProvider {
111
107
  if (!config.ok)
112
108
  return {
113
109
  execute: async () => err(config.error),
114
- close: async () => undefined,
110
+ close: async () => ok(null),
115
111
  };
116
- return new IdaSessionClient(config.value, target, this.connectionFactory(config.value), profile);
112
+ return new IdaSessionClient(config.value, target, this.connectionFactory(config.value, this.environment), profile);
117
113
  }
118
114
  #configuration() {
119
115
  this.#registration ??=
@@ -123,4 +119,4 @@ export class IdaProvider {
123
119
  return this.#registration;
124
120
  }
125
121
  }
126
- const readIdaConfigurationNotConfigured = () => err(new ConfigurationError("Set REA_IDA_MCP_CONFIG to an upstream IDA MCP JSON registration; see docs/ida-provider.md."));
122
+ const readIdaConfigurationNotConfigured = () => err(idaConfigurationError("Set REA_IDA_MCP_CONFIG to an upstream IDA MCP JSON registration; see docs/ida-provider.md."));
@@ -46,7 +46,8 @@ class IdaCleanupError extends ProviderAdapterError {
46
46
  super("ida", "close", {
47
47
  cause,
48
48
  diagnostics: {
49
- reason: "IDA worker release could not be verified. The private workspace was retained.",
49
+ reason: "IDA cleanup could not be verified; the remaining connection or private workspace is retained for retry.",
50
+ failure_reason: cause instanceof Error ? cause.message : String(cause),
50
51
  workspace: path,
51
52
  },
52
53
  });
@@ -66,6 +67,7 @@ export class IdaSessionClient {
66
67
  #closePromise;
67
68
  #workspace;
68
69
  #database;
70
+ #databaseCloseAcknowledged = false;
69
71
  #openAttempted = false;
70
72
  #openCompleted = false;
71
73
  #initialIdentity;
@@ -185,7 +187,8 @@ export class IdaSessionClient {
185
187
  if (missing.length > 0)
186
188
  throw new AnalysisProtocolError(`IDA MCP ${this.config.mode} compatibility profile is missing tools: ${missing.join(", ")}. Attached mode requires the legacy 1.4 profile; headless mode requires the database supervisor profile. See docs/ida-provider.md.`);
187
189
  if (this.config.mode === "headless") {
188
- this.#workspace = await IdaWorkspace.create(this.target, this.config.workspaceRoot);
190
+ this.#workspace = await IdaWorkspace.allocate(this.target, this.config.workspaceRoot);
191
+ await this.#workspace.copyInput();
189
192
  this.#openAttempted = true;
190
193
  const raw = await this.connection.call("idb_open", {
191
194
  input_path: this.#workspace.inputPath,
@@ -253,7 +256,7 @@ export class IdaSessionClient {
253
256
  this.#initialIdentity = identity;
254
257
  return this.#metadata;
255
258
  }
256
- async closeWithOutcome() {
259
+ async close() {
257
260
  if (this.#closePromise !== undefined)
258
261
  return this.#closePromise;
259
262
  const closing = this.#closeOnce();
@@ -283,22 +286,27 @@ export class IdaSessionClient {
283
286
  throw new AnalysisProtocolError("An unowned worker still uses the private workspace; it was retained.");
284
287
  }
285
288
  if (this.#database !== undefined) {
286
- const closed = closeDatabaseSchema.parse(await this.connection.call("idb_close", {
287
- database: this.#database,
288
- save: false,
289
- }));
290
- if (closed.session_id !== this.#database ||
291
- closed.saved === true ||
292
- closed.owned !== true ||
293
- closed.backend !== "worker")
294
- throw new AnalysisProtocolError("IDA database close did not confirm the requested owned, unsaved session release.");
289
+ if (!this.#databaseCloseAcknowledged) {
290
+ const closed = closeDatabaseSchema.parse(await this.connection.call("idb_close", {
291
+ database: this.#database,
292
+ save: false,
293
+ }));
294
+ if (closed.session_id !== this.#database ||
295
+ closed.saved === true ||
296
+ closed.owned !== true ||
297
+ closed.backend !== "worker")
298
+ throw new AnalysisProtocolError("IDA database close did not confirm the requested owned, unsaved session release.");
299
+ this.#databaseCloseAcknowledged = true;
300
+ }
295
301
  const inventory = databaseListSchema.parse(await this.connection.call("idb_list", {}));
296
302
  if (inventory.sessions.some((entry) => entry.session_id === this.#database ||
297
303
  sameIdaHostPath(entry.input_path, this.#workspace?.inputPath ?? "")))
298
304
  throw new AnalysisProtocolError("IDA worker remains registered after close.");
305
+ this.#database = undefined;
299
306
  }
300
307
  if (!this.#openCompleted)
301
308
  throw new AnalysisProtocolError("IDA database open did not return a completed response. Worker inventory cannot prove that the request has stopped; the private workspace was retained.");
309
+ this.#openAttempted = false;
302
310
  }
303
311
  await this.connection.close();
304
312
  await this.#workspace?.remove();
@@ -306,13 +314,7 @@ export class IdaSessionClient {
306
314
  return ok(null);
307
315
  }
308
316
  catch (cause) {
309
- await this.connection.close().catch(() => undefined);
310
317
  return err(new IdaCleanupError(this.#workspace?.directory ?? "IDA MCP connection", cause));
311
318
  }
312
319
  }
313
- async close() {
314
- const result = await this.closeWithOutcome();
315
- if (!result.ok)
316
- throw result.error;
317
- }
318
320
  }
@@ -20,32 +20,31 @@ export const sameIdaHostPath = (left, right) => process.platform === "win32"
20
20
  export class IdaWorkspace {
21
21
  runtime;
22
22
  inputPath;
23
+ target;
23
24
  sessionId = `rea-${randomUUID()}`;
24
- constructor(runtime, inputPath) {
25
+ constructor(runtime, inputPath, target) {
25
26
  this.runtime = runtime;
26
27
  this.inputPath = inputPath;
28
+ this.target = target;
27
29
  }
28
30
  /** Filesystem root owned exclusively by this headless session. */
29
31
  get directory() {
30
32
  return this.runtime.path;
31
33
  }
32
- /** Allocate a protected workspace and copy the admitted input with digest verification. */
33
- static async create(target, root = tmpdir()) {
34
+ /** Allocate a protected workspace so its owner can retain it before input preparation. */
35
+ static async allocate(target, root = tmpdir()) {
34
36
  const runtime = await PrivateRuntimeRoot.create({
35
37
  parent: normalize(root),
36
38
  prefix: "rea-ida-",
37
39
  });
38
40
  const inputPath = join(runtime.path, basename(target.path));
39
- try {
40
- await copyFile(target.path, inputPath, constants.COPYFILE_EXCL);
41
- if ((await idaFileDigest(inputPath)) !== target.sha256)
42
- throw new AnalysisProtocolError("IDA target changed between admission and the private input copy; reopen the target.");
43
- return new IdaWorkspace(runtime, inputPath);
44
- }
45
- catch (cause) {
46
- await runtime.close();
47
- throw cause;
48
- }
41
+ return new IdaWorkspace(runtime, inputPath, target);
42
+ }
43
+ /** Copy and verify admitted bytes after the session owns this workspace's cleanup. */
44
+ async copyInput() {
45
+ await copyFile(this.target.path, this.inputPath, constants.COPYFILE_EXCL);
46
+ if ((await idaFileDigest(this.inputPath)) !== this.target.sha256)
47
+ throw new AnalysisProtocolError("IDA target changed between admission and the private input copy; reopen the target.");
49
48
  }
50
49
  /** Delete only this object's privately allocated directory after worker cleanup. */
51
50
  async remove() {
@@ -1,6 +1,12 @@
1
1
  import { pathToFileURL } from "node:url";
2
2
  import { browserOriginSchema, sanitizeBrowserUrl, } from "../domain/browserObservation.js";
3
+ import { AnalysisCancelledError } from "../domain/analysisErrorCore.js";
3
4
  import { authorizedElectronFile } from "../browser/ElectronFileScope.js";
5
+ /** Throw the operation's typed cancellation error whenever its signal is aborted. */
6
+ export const throwIfRuntimeObservationCancelled = (signal) => {
7
+ if (signal?.aborted === true)
8
+ throw new AnalysisCancelledError("observe_javascript_runtime");
9
+ };
4
10
  /**
5
11
  * Wire bucket for inspector script exclusions. The V8 observation schemas
6
12
  * fix the `unsupported_location` key, so every canonical denial reason maps
@@ -13,7 +19,8 @@ export const inspectorExclusionKey = (reason) => {
13
19
  return "unsupported_location";
14
20
  };
15
21
  /** Resolve a protocol location exposed by the explicitly selected Inspector endpoint. */
16
- export const authorizeRuntimeLocation = async (value) => {
22
+ export const authorizeRuntimeLocation = async (value, signal) => {
23
+ throwIfRuntimeObservationCancelled(signal);
17
24
  if (value.startsWith("node:") && value.length > 0)
18
25
  return {
19
26
  allowed: true,
@@ -21,6 +28,7 @@ export const authorizeRuntimeLocation = async (value) => {
21
28
  };
22
29
  if (value.startsWith("file:")) {
23
30
  const filePath = await authorizedElectronFile(value);
31
+ throwIfRuntimeObservationCancelled(signal);
24
32
  return filePath === undefined
25
33
  ? { allowed: false, reason: "not_approved" }
26
34
  : { allowed: true, location: { kind: "file", file_path: filePath } };
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { authorizeRuntimeLocation, inspectorExclusionKey, } from "./JavaScriptRuntimeScope.js";
2
+ import { authorizeRuntimeLocation, inspectorExclusionKey, throwIfRuntimeObservationCancelled, } from "./JavaScriptRuntimeScope.js";
3
3
  /** Empty durable-location exclusion counters. */
4
4
  export const createInspectorExclusionCounts = () => ({
5
5
  unsupported_location: 0,
@@ -15,7 +15,8 @@ export const describeInspectorTargetLimitations = () => [
15
15
  ];
16
16
  const LOCATION_AUTHORIZATION_WORKERS = 8;
17
17
  /** Canonically authorize, deduplicate, and sort one bounded raw capture. */
18
- export const finalizeInspectorCapture = async ({ input, runtime, target, state, authorizeLocation = authorizeRuntimeLocation, }) => {
18
+ export const finalizeInspectorCapture = async ({ input, runtime, target, state, authorizeLocation = authorizeRuntimeLocation, signal, }) => {
19
+ throwIfRuntimeObservationCancelled(signal);
19
20
  const exclusions = createInspectorExclusionCounts();
20
21
  const scripts = new Map();
21
22
  const draftsByUrl = new Map();
@@ -31,6 +32,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
31
32
  const worker = async () => {
32
33
  try {
33
34
  for (;;) {
35
+ throwIfRuntimeObservationCancelled(signal);
34
36
  if (stopScheduling)
35
37
  return;
36
38
  const index = nextGroup;
@@ -41,8 +43,9 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
41
43
  const [rawUrl, drafts] = group;
42
44
  authorizedGroups[index] = {
43
45
  drafts,
44
- decision: await authorizeLocation(rawUrl),
46
+ decision: await authorizeLocation(rawUrl, signal),
45
47
  };
48
+ throwIfRuntimeObservationCancelled(signal);
46
49
  }
47
50
  }
48
51
  catch (cause) {
@@ -52,6 +55,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
52
55
  };
53
56
  const workerResults = await Promise.allSettled(Array.from({ length: Math.min(LOCATION_AUTHORIZATION_WORKERS, groups.length) }, worker));
54
57
  const failedWorker = workerResults.find((result) => result.status === "rejected");
58
+ throwIfRuntimeObservationCancelled(signal);
55
59
  if (failedWorker?.status === "rejected")
56
60
  throw failedWorker.reason;
57
61
  for (const { drafts, decision } of authorizedGroups) {
@@ -73,7 +77,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
73
77
  .map((context) => ({
74
78
  context_key: context.contextKey,
75
79
  state: context.state,
76
- name: null,
80
+ name: context.name,
77
81
  origin: context.origin,
78
82
  }))
79
83
  .sort((left, right) => left.context_key < right.context_key
@@ -81,6 +85,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
81
85
  : left.context_key > right.context_key
82
86
  ? 1
83
87
  : 0);
88
+ throwIfRuntimeObservationCancelled(signal);
84
89
  return {
85
90
  runtime,
86
91
  target: {
@@ -4,14 +4,17 @@ import { BrowserObservationError } from "../domain/browserObservationError.js";
4
4
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
5
5
  import {} from "../domain/browserObservationErrors.js";
6
6
  import { err, ok } from "../domain/result.js";
7
- import { numberValue, recordValue, cdpStringValue, delayWithCancellation, } from "../browser/CdpCaptureValues.js";
7
+ import { numberValue, recordValue, cdpStringValue, scriptMetadataValues, delayWithCancellation, } from "../browser/CdpCaptureValues.js";
8
8
  import { CdpConnection } from "../browser/CdpConnection.js";
9
9
  import { authorizeRuntimeTargetLocation, inspectorExclusionKey, } from "./JavaScriptRuntimeScope.js";
10
10
  import { createInspectorExclusionCounts, describeInspectorTargetLimitations, finalizeInspectorCapture, } from "./V8InspectorCaptureProjection.js";
11
11
  import { discoverV8Inspector, } from "./V8InspectorEndpoint.js";
12
- /** Public identity committed by passive V8 Inspector observations. */
13
- export { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentity.js";
14
12
  import { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentity.js";
13
+ /** Maximum decoded CDP message accepted while observing one Inspector target. */
14
+ export const INSPECTOR_MAX_PAYLOAD_BYTES = 16 * 1024 * 1024;
15
+ /** Aggregate retained metadata budget, including an estimate of JS object overhead. */
16
+ export const INSPECTOR_MAX_RETAINED_METADATA_BYTES = 8 * 1024 * 1024;
17
+ const RETAINED_OBJECT_OVERHEAD_BYTES = 512;
15
18
  /** Attach-only provider; sends only Runtime.enable and Debugger.enable. */
16
19
  export class V8InspectorProvider {
17
20
  identity() {
@@ -61,9 +64,9 @@ export class V8InspectorProvider {
61
64
  const target = await authorizedTarget(discovery.targets, input, discovery.runtime.product);
62
65
  if (input.runtime_kind !== undefined)
63
66
  assertRuntimeKind(target, input.runtime_kind);
64
- connection = await CdpConnection.connect(target.webSocketUrl, "observe_javascript_runtime", options.signal);
67
+ connection = await CdpConnection.connect(target.webSocketUrl, "observe_javascript_runtime", options.signal, { maxPayloadBytes: INSPECTOR_MAX_PAYLOAD_BYTES });
65
68
  const state = emptyCaptureState();
66
- const removeListener = connection.onEvent((event) => ingestEvent(event, input, state));
69
+ const removeListener = connection.onEvent((event) => ingestEvent(event, state));
67
70
  try {
68
71
  await connection.send("Runtime.enable", {}, undefined, options.signal);
69
72
  await connection.send("Debugger.enable", {}, undefined, options.signal);
@@ -77,6 +80,7 @@ export class V8InspectorProvider {
77
80
  runtime: discovery.runtime,
78
81
  target,
79
82
  state,
83
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
80
84
  });
81
85
  outcome = ok(javascriptRuntimeObservationSchema.parse(result));
82
86
  }
@@ -96,7 +100,11 @@ export class V8InspectorProvider {
96
100
  }
97
101
  }
98
102
  if (cleanupFailed) {
99
- return err(inspectorCleanupError(primaryFailure, cleanupFailure, failed));
103
+ return err(inspectorCleanupError(primaryFailure, cleanupFailure, failed, outcome?.ok === true
104
+ ? outcome.value
105
+ : outcome?.ok === false
106
+ ? outcome.error.partialObservation
107
+ : undefined));
100
108
  }
101
109
  return (outcome ??
102
110
  err(new BrowserObservationError("observe_javascript_runtime", "protocol_error")));
@@ -126,11 +134,21 @@ export const closeInspectorConnection = async (connection, signal) => {
126
134
  signal.removeEventListener("abort", onAbort);
127
135
  }
128
136
  };
129
- export const inspectorCleanupError = (primaryFailure, cleanupFailure, hasPrimaryFailure) => {
137
+ export const inspectorCleanupError = (primaryFailure, cleanupFailure, hasPrimaryFailure, partialObservation) => {
130
138
  const cause = hasPrimaryFailure
131
139
  ? new AggregateError([primaryFailure, cleanupFailure], "Inspector observation and cleanup both failed")
132
140
  : cleanupFailure;
133
- return new BrowserObservationError("observe_javascript_runtime", "cleanup_failed", { cause });
141
+ const cleanupReason = cleanupFailure instanceof Error
142
+ ? cleanupFailure.message
143
+ : String(cleanupFailure);
144
+ return new BrowserObservationError("observe_javascript_runtime", "cleanup_failed", {
145
+ cause,
146
+ cleanup: {
147
+ reason: cleanupReason,
148
+ resources: ["browser_transport"],
149
+ },
150
+ ...(partialObservation === undefined ? {} : { partialObservation }),
151
+ });
134
152
  };
135
153
  const projectTarget = (target) => ({
136
154
  target_id: target.id,
@@ -171,7 +189,7 @@ const emptyCaptureState = () => ({
171
189
  truncated: false,
172
190
  truncationReasons: new Set(),
173
191
  });
174
- const ingestEvent = (event, input, state) => {
192
+ const ingestEvent = (event, state) => {
175
193
  if (event.method !== "Debugger.scriptParsed" &&
176
194
  event.method !== "Debugger.scriptFailedToParse" &&
177
195
  event.method !== "Runtime.executionContextCreated" &&
@@ -180,7 +198,7 @@ const ingestEvent = (event, input, state) => {
180
198
  return;
181
199
  state.eventsObserved += 1;
182
200
  if (event.method === "Debugger.scriptParsed") {
183
- ingestScript(event, input, state);
201
+ ingestScript(event, state);
184
202
  return;
185
203
  }
186
204
  if (event.method === "Debugger.scriptFailedToParse") {
@@ -188,9 +206,9 @@ const ingestEvent = (event, input, state) => {
188
206
  retainEvent(state, 0);
189
207
  return;
190
208
  }
191
- ingestContext(event, input, state);
209
+ ingestContext(event, state);
192
210
  };
193
- const ingestScript = (event, input, state) => {
211
+ const ingestScript = (event, state) => {
194
212
  state.scriptsObserved += 1;
195
213
  const value = recordValue(event.params);
196
214
  const rawUrl = cdpStringValue(value?.url);
@@ -199,22 +217,32 @@ const ingestScript = (event, input, state) => {
199
217
  retainEvent(state, 0);
200
218
  return;
201
219
  }
220
+ const metadata = scriptMetadataValues(value);
202
221
  const draft = {
203
222
  rawUrl,
204
223
  executionContextKey: contextKey(value?.executionContextId),
205
- cdpHash: cdpStringValue(value?.hash) ?? null,
206
- length: nonnegativeInteger(value?.length),
207
- isModule: value?.isModule === true,
224
+ cdpHash: metadata.hash,
225
+ length: metadata.length,
226
+ isModule: metadata.isModule,
208
227
  };
209
- const bytes = metadataBytes(draft);
210
- retainEvent(state, bytes);
228
+ const bytes = retainedMetadataBytes(draft);
229
+ if (!retainEvent(state, bytes))
230
+ return;
211
231
  state.scripts.push(draft);
212
232
  };
213
- const ingestContext = (event, input, state) => {
233
+ const ingestContext = (event, state) => {
214
234
  if (event.method === "Runtime.executionContextsCleared") {
215
- for (const context of state.contexts.values())
216
- context.state = "cleared";
217
- retainEvent(state, 0);
235
+ let byteDelta = 0;
236
+ for (const context of state.contexts.values()) {
237
+ byteDelta +=
238
+ retainedMetadataBytes({ ...context, state: "cleared" }) -
239
+ retainedMetadataBytes(context);
240
+ }
241
+ if (replaceRetainedMetadata(state, byteDelta)) {
242
+ for (const context of state.contexts.values())
243
+ context.state = "cleared";
244
+ retainEvent(state, 0);
245
+ }
218
246
  return;
219
247
  }
220
248
  const parameters = recordValue(event.params);
@@ -228,28 +256,44 @@ const ingestContext = (event, input, state) => {
228
256
  retainEvent(state, 0);
229
257
  return;
230
258
  }
231
- const origin = event.method === "Runtime.executionContextCreated"
232
- ? (cdpStringValue(runtimeContext?.origin) ?? null)
233
- : null;
259
+ const previous = state.contexts.get(key);
260
+ const created = event.method === "Runtime.executionContextCreated";
234
261
  const draft = {
235
262
  contextKey: key,
236
- state: event.method === "Runtime.executionContextCreated"
237
- ? "created"
238
- : "destroyed",
239
- origin: origin === "" ? null : origin,
263
+ state: created ? "created" : "destroyed",
264
+ name: created
265
+ ? (cdpStringValue(runtimeContext?.name) ?? null)
266
+ : (previous?.name ?? null),
267
+ origin: created
268
+ ? (cdpStringValue(runtimeContext?.origin) ?? null)
269
+ : (previous?.origin ?? null),
240
270
  };
241
- const bytes = metadataBytes(draft);
242
- retainEvent(state, bytes);
271
+ const bytes = retainedMetadataBytes(draft) -
272
+ (previous === undefined ? 0 : retainedMetadataBytes(previous));
273
+ if (!retainEvent(state, bytes))
274
+ return;
243
275
  state.contexts.set(key, draft);
244
276
  };
245
277
  const retainEvent = (state, bytes) => {
246
- state.metadataBytes += bytes;
278
+ if (!replaceRetainedMetadata(state, bytes))
279
+ return false;
247
280
  state.eventsRetained += 1;
281
+ return true;
282
+ };
283
+ const replaceRetainedMetadata = (state, byteDelta) => {
284
+ if (state.metadataBytes + byteDelta > INSPECTOR_MAX_RETAINED_METADATA_BYTES) {
285
+ state.eventsDropped += 1;
286
+ state.truncated = true;
287
+ state.truncationReasons.add("retained_metadata_budget_exceeded");
288
+ return false;
289
+ }
290
+ state.metadataBytes += byteDelta;
291
+ return true;
248
292
  };
249
293
  const waitForCapture = async (connection, observationMs, signal) => {
250
294
  let removeDisconnect = () => undefined;
251
295
  const disconnected = new Promise((_resolve, reject) => {
252
- removeDisconnect = connection.onDisconnect(() => reject(new BrowserObservationError("observe_javascript_runtime", "disconnected")));
296
+ removeDisconnect = connection.onDisconnect((error) => reject(error));
253
297
  });
254
298
  try {
255
299
  await Promise.race([
@@ -261,10 +305,12 @@ const waitForCapture = async (connection, observationMs, signal) => {
261
305
  removeDisconnect();
262
306
  }
263
307
  };
264
- const metadataBytes = (value) => Buffer.byteLength(JSON.stringify(value));
265
- const nonnegativeInteger = (value) => {
266
- const parsed = numberValue(value);
267
- return parsed === undefined ? 0 : Math.max(0, Math.trunc(parsed));
308
+ const retainedMetadataBytes = (value) => {
309
+ const strings = "rawUrl" in value
310
+ ? [value.rawUrl, value.rawUrl, value.executionContextKey, value.cdpHash]
311
+ : [value.contextKey, value.name, value.origin];
312
+ return (RETAINED_OBJECT_OVERHEAD_BYTES +
313
+ strings.reduce((total, text) => total + (text?.length ?? 0) * 2, 0));
268
314
  };
269
315
  const contextKey = (value) => {
270
316
  const identifier = numberValue(value);
@@ -10,6 +10,7 @@ import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../../pro
10
10
  import { checkRecoveryDeadline, inventoryRecoveryFiles, fingerprintRecoveryFile, recoveryFailureMessage, } from "./RecoveryFiles.js";
11
11
  import { RECOVERY_LIMITS } from "./WakaruRelease.js";
12
12
  const OPERATION = "recover_javascript_sources";
13
+ const WAKARU_REQUIREMENT = "Provide an absolute REA_WAKARU_COMMAND pointing to Wakaru 1.13.0 on Linux x64; no tool is installed by REA";
13
14
  /** Resolve and fingerprint explicitly configured tools; acquire nothing at startup. */
14
15
  export const resolveWakaruCommand = async (environment) => {
15
16
  const configured = environment.REA_WAKARU_COMMAND;
@@ -17,7 +18,7 @@ export const resolveWakaruCommand = async (environment) => {
17
18
  process.arch !== "x64" ||
18
19
  configured === undefined ||
19
20
  !isAbsolute(configured))
20
- throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, "Provide an absolute REA_WAKARU_COMMAND pointing to Wakaru 1.13.0 on Linux x64; no tool is installed by REA");
21
+ throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, WAKARU_REQUIREMENT, { userMessage: WAKARU_REQUIREMENT });
21
22
  try {
22
23
  const command = await realpath(configured);
23
24
  await access(command, constants.R_OK | constants.X_OK);
@@ -29,7 +30,11 @@ export const resolveWakaruCommand = async (environment) => {
29
30
  return { command, limiter, ...fingerprint };
30
31
  }
31
32
  catch (cause) {
32
- throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, `Configured Wakaru or util-linux prlimit is unavailable: ${recoveryFailureMessage(cause)}`, { cause });
33
+ const reason = `Configured Wakaru or util-linux prlimit is unavailable: ${recoveryFailureMessage(cause)}`;
34
+ throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, reason, {
35
+ cause,
36
+ userMessage: reason,
37
+ });
33
38
  }
34
39
  };
35
40
  /** Run one bounded command and verify cleanup before consuming its output. */
@@ -30,8 +30,11 @@ const executeWakaruRecovery = async (context) => {
30
30
  arguments: ["--version"],
31
31
  });
32
32
  if (version.exit_code !== 0 ||
33
- version.stdout.trim() !== `wakaru ${WAKARU_RELEASE.version}`)
34
- throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, `This adapter requires Wakaru ${WAKARU_RELEASE.version}; reported version: ${version.stdout.trim()}; exit: ${String(version.exit_code)}; stderr: ${version.stderr}`);
33
+ version.stdout.trim() !== `wakaru ${WAKARU_RELEASE.version}`) {
34
+ // The message names the mismatch; the reason also keeps the tool's stderr.
35
+ const mismatch = `This adapter requires Wakaru ${WAKARU_RELEASE.version}; reported version: ${version.stdout.trim()}; exit: ${String(version.exit_code)}`;
36
+ throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, `${mismatch}; stderr: ${version.stderr}`, { userMessage: `${mismatch}.` });
37
+ }
35
38
  const run = await runWakaruCommand({
36
39
  ...commandContext,
37
40
  staging,
@@ -0,0 +1,47 @@
1
+ import { TraceMap, decodedMappings } from "@jridgewell/trace-mapping";
2
+ import { SourceMapFormatFailure, } from "./SourceMapFormat.js";
3
+ /** Determine whether a leaf-local mapping falls before its enclosing boundary. */
4
+ export const isBeforeSourceMapLeafStop = (leaf, line, column) => {
5
+ if (leaf.stop === null)
6
+ return true;
7
+ const generatedLine = leaf.offset.line + line;
8
+ const generatedColumn = column + (line === 0 ? leaf.offset.column : 0);
9
+ return (generatedLine < leaf.stop.line ||
10
+ (generatedLine === leaf.stop.line && generatedColumn < leaf.stop.column));
11
+ };
12
+ /** Resolve one declaration with the same pinned upstream implementation used by full maps. */
13
+ export const resolveSourceMapSource = (source, sourceRoot, mapUrl) => {
14
+ const map = new TraceMap({
15
+ version: 3,
16
+ names: [],
17
+ sources: [source ?? ""],
18
+ ...(sourceRoot == null ? {} : { sourceRoot }),
19
+ mappings: "",
20
+ }, mapUrl);
21
+ const resolved = map.resolvedSources[0];
22
+ if (resolved === undefined)
23
+ throw new SourceMapFormatFailure("format", "Source-map resolver did not return the requested source identity.");
24
+ return resolved;
25
+ };
26
+ /** Decode leaf mappings and validate producer indices before any consumer publishes them. */
27
+ export const decodeValidatedSourceMapLeaves = (leaves, mapUrl, check) => leaves.map((leaf) => {
28
+ check?.();
29
+ const map = new TraceMap(JSON.stringify(leaf.map), mapUrl);
30
+ const rows = decodedMappings(map);
31
+ for (const [line, row] of rows.entries()) {
32
+ if ((line & 255) === 0)
33
+ check?.();
34
+ for (const segment of row) {
35
+ const generatedLine = leaf.offset.line + line;
36
+ const generatedColumn = segment[0] + (line === 0 ? leaf.offset.column : 0);
37
+ if (!Number.isSafeInteger(generatedLine) ||
38
+ !Number.isSafeInteger(generatedColumn) ||
39
+ ![1, 4, 5].includes(segment.length) ||
40
+ segment.some((value) => !Number.isSafeInteger(value) || value < 0) ||
41
+ (segment.length !== 1 && segment[1] >= leaf.map.sources.length) ||
42
+ (segment.length === 5 && segment[4] >= leaf.map.names.length))
43
+ throw new SourceMapFormatFailure("format", "Decoded local or absolute position, source index or name index is invalid.");
44
+ }
45
+ }
46
+ return { leaf, rows, resolvedSources: map.resolvedSources };
47
+ });
@@ -12,10 +12,26 @@ import { PrivateRuntimeRoot, PrivateRuntimeRootUnavailableError, } from "../../p
12
12
  import { ProviderStartupDeadline } from "../../process/ProviderDeadline.js";
13
13
  import { cleanupOwnedProcessGroup } from "../../process/ProcessOwnership.js";
14
14
  import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../../process/ProviderProcess.js";
15
+ import { prepareProcessOwnershipInspection } from "../../process/ProcessOwnershipObservation.js";
15
16
  const OPERATION = "trace_web_source_location";
16
17
  const PROVIDER = "source-map-decoder";
17
18
  /** Run a trusted codec command and release its process/root before returning output. */
18
19
  export const runSourceMapCommand = async (request, path, options, dependencies) => {
20
+ try {
21
+ await (dependencies.prepareOwnership ?? prepareProcessOwnershipInspection)(options?.signal);
22
+ }
23
+ catch (cause) {
24
+ return err(options?.signal?.aborted === true
25
+ ? new AnalysisCancelledError(OPERATION)
26
+ : new ProviderAdapterError(PROVIDER, OPERATION, {
27
+ cause,
28
+ diagnostics: {
29
+ map_path: path,
30
+ error_message: message(cause),
31
+ phase: "process_ownership_preparation",
32
+ },
33
+ }));
34
+ }
19
35
  const deadline = new ProviderStartupDeadline(WEB_SOURCE_MAP_LIMITS.decodeTimeoutMs, options?.signal);
20
36
  const command = new OwnedCodec(path, dependencies, deadline);
21
37
  let result;