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
@@ -1,18 +1,25 @@
1
- import { spawn } from "node:child_process";
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
2
+ import { randomUUID } from "node:crypto";
2
3
  import { open, readFile, writeFile } from "node:fs/promises";
3
4
  import { join } from "node:path";
4
5
  import { fileURLToPath } from "node:url";
5
6
  import { z } from "zod";
6
7
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
8
+ import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
7
9
  import { nativeCallEventSchema, nativeCodeLocationSchema, } from "../domain/native/nativeCallObservation.js";
8
10
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
9
11
  import { err, ok } from "../domain/result.js";
10
12
  import { safeParseJson } from "../domain/safeJson.js";
11
- import { execFileOutput } from "../process/ExecFileOutput.js";
13
+ import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../process/ProviderProcess.js";
14
+ import { cleanupOwnedProcessGroup } from "../process/ProcessOwnership.js";
15
+ import { observeProcessStartIdentity, prepareProcessOwnershipInspection, signalProcessWithStartIdentity, } from "../process/ProcessOwnershipObservation.js";
16
+ import { ProviderStartupDeadline, waitForAbortableDelay, } from "../process/ProviderDeadline.js";
12
17
  import { PrivateRuntimeRoot } from "../process/PrivateRuntimeRoot.js";
13
18
  import { resolveXcrunTool } from "./CommandRunner.js";
19
+ import { readLldbObservationJournal, readBoundedPrefix, readPartialCapture, projectLldbPartialObservation, } from "./LldbRetainedObservations.js";
14
20
  const OPERATION = "observe_native_calls";
15
21
  const PROVIDER = "native-macos";
22
+ const LLDB_REQUIREMENT = "LLDB from Xcode or the Command Line Tools is not available";
16
23
  /** Captured target output kept per stream; the rest is counted, not stored. */
17
24
  const MAX_OUTPUT_BYTES = 1024 * 1024;
18
25
  /** LLDB startup, symbol loading and teardown beyond the observation window. */
@@ -24,11 +31,39 @@ const tracedSchema = z.strictObject({
24
31
  status: z.literal("traced"),
25
32
  version: z.string(),
26
33
  pid: z.number().int().positive(),
27
- outcome: z.enum(["exited", "duration-elapsed", "event-limit", "stop-limit"]),
34
+ outcome: z.enum([
35
+ "exited",
36
+ "duration-elapsed",
37
+ "event-limit",
38
+ "stop-limit",
39
+ "resource-limit",
40
+ ]),
28
41
  exit_status: z.number().int().nullable(),
29
42
  exit_description: z.string().nullable(),
30
43
  killed: z.boolean(),
31
44
  terminated: z.boolean(),
45
+ target_identity: z.strictObject({
46
+ loaded_image_sha256: z.null(),
47
+ selected_file_sha256: z
48
+ .string()
49
+ .regex(/^[0-9a-f]{64}$/u)
50
+ .nullable(),
51
+ file_device: z.string().nullable(),
52
+ file_inode: z.string().nullable(),
53
+ module_path: z.string().nullable(),
54
+ module_uuid: z.string().nullable(),
55
+ stable: z.boolean(),
56
+ }),
57
+ resource_limit_reached: z.boolean(),
58
+ breakpoint_locations_truncated: z.boolean().optional(),
59
+ target_output: z.strictObject({
60
+ stdout_bytes: z.number().int().nonnegative(),
61
+ stderr_bytes: z.number().int().nonnegative(),
62
+ stdout_truncated: z.boolean(),
63
+ stderr_truncated: z.boolean(),
64
+ stdout_complete: z.boolean(),
65
+ stderr_complete: z.boolean(),
66
+ }),
32
67
  elapsed_ms: z.number().nonnegative(),
33
68
  breakpoints: z.array(z.strictObject({
34
69
  index: z.number().int().nonnegative(),
@@ -41,7 +76,13 @@ const tracedSchema = z.strictObject({
41
76
  const tracerOutputSchema = z.discriminatedUnion("status", [
42
77
  tracedSchema,
43
78
  z.strictObject({
44
- status: z.enum(["target-error", "launch-error", "tracer-error"]),
79
+ status: z.enum([
80
+ "target-error",
81
+ "target-integrity-error",
82
+ "target-identity-unavailable",
83
+ "launch-error",
84
+ "tracer-error",
85
+ ]),
45
86
  error: z.string().nullable(),
46
87
  }),
47
88
  ]);
@@ -49,12 +90,20 @@ const tracerOutputSchema = z.discriminatedUnion("status", [
49
90
  const ATTACH_REMEDIATION = "Allow debugging for this user (Developer Tools access: `DevToolsSecurity -enable`, or membership in the _developer group). A hardened-runtime target is debuggable only with the com.apple.security.get-task-allow entitlement; see inspect_signature's debugger-attach facet.";
50
91
  /** Production tracer: `lldb --batch` running the REA LLDB bridge. */
51
92
  export class LldbCallTracer {
93
+ launch;
94
+ resolveTool;
95
+ environment;
96
+ constructor(environment, launch = runLldb, resolveTool = (tool, signal) => resolveXcrunTool(tool, this.environment, signal)) {
97
+ this.launch = launch;
98
+ this.resolveTool = resolveTool;
99
+ this.environment = snapshotEnvironment(environment);
100
+ }
52
101
  async trace(request, signal) {
53
- const lldb = await resolveXcrunTool("lldb", signal);
102
+ const lldb = await this.resolveTool("lldb", signal);
54
103
  if (!lldb.ok)
55
104
  return err(lldb.error.reason === "cancelled"
56
105
  ? new AnalysisCancelledError(OPERATION)
57
- : new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, "LLDB from Xcode or the Command Line Tools is not available"));
106
+ : new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, LLDB_REQUIREMENT, { userMessage: LLDB_REQUIREMENT }));
58
107
  const root = await PrivateRuntimeRoot.create({ prefix: "rea-lldb-" });
59
108
  try {
60
109
  return await this.#run(lldb.value, root.path, request, signal);
@@ -68,13 +117,18 @@ export class LldbCallTracer {
68
117
  config: join(directory, "config.json"),
69
118
  result: join(directory, "result.json"),
70
119
  pid: join(directory, "pid"),
120
+ identityAck: join(directory, "identity.ack"),
71
121
  stdout: join(directory, "stdout"),
72
122
  stderr: join(directory, "stderr"),
123
+ stdoutCapture: join(directory, "stdout.capture"),
124
+ stderrCapture: join(directory, "stderr.capture"),
125
+ observations: join(directory, "observations.jsonl"),
73
126
  };
74
127
  const { input } = request;
75
128
  await writeFile(paths.config, JSON.stringify({
76
129
  executable: request.executable,
77
130
  architecture: request.architecture,
131
+ expected_sha256: request.expectedSha256,
78
132
  arguments: input.arguments,
79
133
  environment: input.environment,
80
134
  working_directory: input.working_directory ?? null,
@@ -85,12 +139,18 @@ export class LldbCallTracer {
85
139
  max_events: input.max_events,
86
140
  argument_registers: input.argument_registers,
87
141
  backtrace_frames: input.backtrace_frames,
142
+ max_output_bytes: MAX_OUTPUT_BYTES,
88
143
  stdout_path: paths.stdout,
89
144
  stderr_path: paths.stderr,
145
+ stdout_capture_path: paths.stdoutCapture,
146
+ stderr_capture_path: paths.stderrCapture,
90
147
  result_path: paths.result,
91
148
  pid_path: paths.pid,
149
+ identity_ack_path: paths.identityAck,
150
+ observation_path: paths.observations,
92
151
  }), { mode: 0o600 });
93
- const exited = await runLldb(lldb.path, [
152
+ await prepareProcessOwnershipInspection(signal);
153
+ const exited = await this.launch(lldb.path, [
94
154
  "--batch",
95
155
  "--no-lldbinit",
96
156
  "--no-use-colors",
@@ -100,47 +160,190 @@ export class LldbCallTracer {
100
160
  `rea_trace ${paths.config}`,
101
161
  ], {
102
162
  deadlineMs: input.duration_ms + DEADLINE_GRACE_MS,
163
+ pidPath: paths.pid,
164
+ identityAckPath: paths.identityAck,
165
+ environment: this.environment,
103
166
  ...(signal === undefined ? {} : { signal }),
104
167
  });
105
- const terminated = await ensureTerminated(paths.pid, request.executable);
168
+ const output = exited.kind === "exited"
169
+ ? await readTracerOutput(paths.result)
170
+ : undefined;
171
+ let targetTermination = await ensureTerminated(paths.pid, exited.targetIdentity, true);
172
+ // These two bridge outcomes are emitted before a target process exists.
173
+ // Other missing-PID cases, including a missing result, remain unknown.
174
+ if (output !== undefined &&
175
+ (output.status === "target-error" || output.status === "launch-error") &&
176
+ (await readTargetPid(paths.pid)) === undefined)
177
+ targetTermination = "terminated";
178
+ const terminated = targetTermination === "terminated";
179
+ const cleanupDetails = [
180
+ exited.cleanupFailure,
181
+ ...(terminated ? [] : [targetTerminationReason(targetTermination)]),
182
+ ].filter((detail) => detail !== undefined);
183
+ const lifecycleCleanup = cleanupDetails.length === 0
184
+ ? undefined
185
+ : {
186
+ reason: cleanupDetails.join("; "),
187
+ resources: [
188
+ ...(exited.cleanupFailure === undefined
189
+ ? []
190
+ : ["lldb-process-group"]),
191
+ ...(terminated
192
+ ? []
193
+ : [
194
+ `native-target:${String((await readTargetPid(paths.pid)) ?? "unknown")}`,
195
+ ]),
196
+ ],
197
+ };
198
+ const partialReason = exited.kind === "cancelled"
199
+ ? "cancelled"
200
+ : exited.kind === "timeout"
201
+ ? "timeout"
202
+ : exited.cleanupFailure !== undefined
203
+ ? "cleanup-failure"
204
+ : "tracer-failure";
205
+ const getPartialObservation = (reason = partialReason) => partialNativeObservation({
206
+ request,
207
+ pidPath: paths.pid,
208
+ stdoutPath: paths.stdoutCapture,
209
+ stderrPath: paths.stderrCapture,
210
+ observationPath: paths.observations,
211
+ version: output?.status === "traced" ? output.version : null,
212
+ reason,
213
+ });
106
214
  if (exited.kind === "cancelled")
107
- return err(new AnalysisCancelledError(OPERATION));
215
+ return err(new AnalysisCancelledError(OPERATION, {
216
+ ...(lifecycleCleanup === undefined
217
+ ? {}
218
+ : { cleanup: lifecycleCleanup }),
219
+ partialObservation: await getPartialObservation(),
220
+ }));
108
221
  if (exited.kind === "timeout")
109
- return err(new AnalysisTimeoutError(OPERATION, input.duration_ms + DEADLINE_GRACE_MS));
110
- const output = await readTracerOutput(paths.result);
222
+ return err(new AnalysisTimeoutError(OPERATION, input.duration_ms + DEADLINE_GRACE_MS, {
223
+ ...(lifecycleCleanup === undefined
224
+ ? {}
225
+ : { cleanup: lifecycleCleanup }),
226
+ partialObservation: await getPartialObservation(),
227
+ }));
228
+ if (output !== undefined && output.status !== "traced")
229
+ return err(tracerFailure(output, lifecycleCleanup, await getPartialObservation()));
230
+ if (exited.cleanupFailure !== undefined)
231
+ return err(new ProviderAdapterError(PROVIDER, OPERATION, {
232
+ cleanup: lifecycleCleanup ?? {
233
+ reason: exited.cleanupFailure,
234
+ resources: ["lldb-process-group"],
235
+ },
236
+ diagnostics: {
237
+ reason: "LLDB process-group cleanup could not be verified",
238
+ cleanup_failure: exited.cleanupFailure,
239
+ ...(lifecycleCleanup === undefined
240
+ ? {}
241
+ : { target_cleanup: lifecycleCleanup }),
242
+ },
243
+ partialObservation: await getPartialObservation(),
244
+ }));
111
245
  if (output === undefined)
112
246
  return err(new ProviderAdapterError(PROVIDER, OPERATION, {
113
247
  diagnostics: {
114
248
  reason: "LLDB exited without a tracer result",
115
249
  exit_code: exited.exitCode,
116
250
  lldb_output: exited.output,
251
+ ...(lifecycleCleanup === undefined
252
+ ? {}
253
+ : { target_cleanup: lifecycleCleanup }),
117
254
  },
255
+ partialObservation: await getPartialObservation(),
256
+ ...(lifecycleCleanup === undefined
257
+ ? {}
258
+ : { cleanup: lifecycleCleanup }),
118
259
  }));
119
- if (output.status !== "traced")
120
- return err(tracerFailure(output));
260
+ const stdout = await capturedOutput(paths.stdoutCapture, output.target_output.stdout_bytes, output.target_output.stdout_truncated, output.target_output.stdout_complete);
261
+ const stderr = await capturedOutput(paths.stderrCapture, output.target_output.stderr_bytes, output.target_output.stderr_truncated, output.target_output.stderr_complete);
262
+ if (!stdout.ok || !stderr.ok) {
263
+ const partial = await getPartialObservation("capture-failure");
264
+ return err(new ProviderAdapterError(PROVIDER, OPERATION, {
265
+ partialObservation: partial,
266
+ diagnostics: {
267
+ reason: "LLDB target output capture could not be read",
268
+ ...(stdout.ok ? {} : { stdout_capture_error: stdout.error }),
269
+ ...(stderr.ok ? {} : { stderr_capture_error: stderr.error }),
270
+ ...(lifecycleCleanup === undefined
271
+ ? {}
272
+ : { target_cleanup: lifecycleCleanup }),
273
+ },
274
+ ...(lifecycleCleanup === undefined
275
+ ? {}
276
+ : { cleanup: lifecycleCleanup }),
277
+ }));
278
+ }
121
279
  return ok({
122
280
  debugger: { ...lldb, version: output.version },
123
281
  run: output,
124
- stdout: await capturedOutput(paths.stdout),
125
- stderr: await capturedOutput(paths.stderr),
282
+ stdout: stdout.value,
283
+ stderr: stderr.value,
126
284
  terminated,
127
285
  });
128
286
  }
129
287
  }
130
288
  /** LLDB command arguments are quoted; the bridge path is REA's own install path. */
131
289
  const quote = (value) => `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
132
- const tracerFailure = (output) => {
290
+ /** Preserve a decoded bridge failure's type independently of cleanup outcome. */
291
+ const tracerFailure = (output, cleanup, partialObservation) => {
292
+ const options = {
293
+ ...(cleanup === undefined ? {} : { cleanup }),
294
+ ...(partialObservation === undefined ? {} : { partialObservation }),
295
+ };
133
296
  const message = output.error ?? "no LLDB error text";
297
+ if (output.status === "target-integrity-error")
298
+ return new EvidenceIntegrityError(message || "The launched native target did not match its session digest", options);
299
+ if (output.status === "target-identity-unavailable")
300
+ return new ProviderAdapterError(PROVIDER, OPERATION, {
301
+ ...options,
302
+ diagnostics: {
303
+ reason: message,
304
+ constraint: "target process start identity could not be verified",
305
+ },
306
+ });
134
307
  if (output.status === "tracer-error")
135
308
  return new ProviderAdapterError(PROVIDER, OPERATION, {
309
+ ...options,
136
310
  diagnostics: { reason: `LLDB bridge failed: ${message}` },
137
311
  });
138
312
  if (output.status === "target-error")
139
- return new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, `lldb-target-unloadable: ${message}`);
313
+ return new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, `lldb-target-unloadable: ${message}`, options);
140
314
  // debugserver reports denied task access as an attach failure.
141
315
  return /attach|not allowed|permission|denied|debugserver/iu.test(message)
142
- ? new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, `debugger-attach-denied: ${message}`, { userMessage: ATTACH_REMEDIATION })
143
- : new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, `launch-failed: ${message}`);
316
+ ? new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, `debugger-attach-denied: ${message}`, { userMessage: ATTACH_REMEDIATION, ...options })
317
+ : new AnalysisCapabilityUnavailableError(PROVIDER, OPERATION, `launch-failed: ${message}`, options);
318
+ };
319
+ const partialNativeObservation = async (options) => {
320
+ const [journal, pid, stdout, stderr] = await Promise.all([
321
+ readLldbObservationJournal(options.observationPath),
322
+ readTargetPid(options.pidPath),
323
+ readPartialCapture(options.stdoutPath),
324
+ readPartialCapture(options.stderrPath),
325
+ ]);
326
+ return projectLldbPartialObservation({
327
+ target: {
328
+ path: options.request.executable,
329
+ sha256: options.request.expectedSha256,
330
+ architecture: options.request.architecture,
331
+ arguments: options.request.input.arguments,
332
+ environment: options.request.input.environment,
333
+ working_directory: options.request.input.working_directory ?? null,
334
+ },
335
+ pid,
336
+ stdout: stdout?.capture ?? null,
337
+ stderr: stderr?.capture ?? null,
338
+ version: options.version,
339
+ journal: journal.parsed,
340
+ journalLimitations: journal.limitations,
341
+ limitations: [
342
+ ...(stdout?.limitations ?? []),
343
+ ...(stderr?.limitations ?? []),
344
+ ],
345
+ reason: options.reason,
346
+ });
144
347
  };
145
348
  const readTracerOutput = async (path) => {
146
349
  let text;
@@ -156,105 +359,180 @@ const readTracerOutput = async (path) => {
156
359
  const output = tracerOutputSchema.safeParse(parsed.value);
157
360
  return output.success ? output.data : undefined;
158
361
  };
159
- const capturedOutput = async (path) => {
362
+ const capturedOutput = async (path, observedBytes, truncated, complete) => {
160
363
  let handle;
161
364
  try {
162
365
  handle = await open(path, "r");
366
+ const { size } = await handle.stat();
367
+ const captureHandle = handle;
368
+ const { buffer, bytesRead } = await readBoundedPrefix(Math.min(size, MAX_OUTPUT_BYTES), async (target, offset, length, position) => (await captureHandle.read(target, offset, length, position)).bytesRead);
369
+ const captured = {
370
+ text: buffer.subarray(0, bytesRead).toString("utf8"),
371
+ bytes: observedBytes,
372
+ truncated: truncated || size > MAX_OUTPUT_BYTES,
373
+ complete: complete && bytesRead >= Math.min(observedBytes, MAX_OUTPUT_BYTES),
374
+ };
375
+ await handle.close();
376
+ handle = undefined;
377
+ return ok(captured);
163
378
  }
164
- catch {
165
- return { text: "", bytes: 0, truncated: false };
379
+ catch (cause) {
380
+ const failure = cause instanceof Error ? cause.message : String(cause);
381
+ if (handle !== undefined) {
382
+ try {
383
+ await handle.close();
384
+ }
385
+ catch (closeCause) {
386
+ return err(`${failure}; closing capture file failed: ${closeCause instanceof Error ? closeCause.message : String(closeCause)}`);
387
+ }
388
+ }
389
+ return err(failure);
166
390
  }
391
+ };
392
+ /** Supervise LLDB as an owned process group while observing its target PID identity. */
393
+ const runLldb = async (executable, arguments_, options) => {
394
+ if (options.signal?.aborted === true)
395
+ return {
396
+ kind: "cancelled",
397
+ targetIdentity: undefined,
398
+ cleanupFailure: undefined,
399
+ };
400
+ const deadline = new ProviderStartupDeadline(options.deadlineMs, options.signal);
401
+ let targetIdentity;
402
+ let supervisor;
167
403
  try {
168
- const { size } = await handle.stat();
169
- const buffer = Buffer.alloc(Math.min(size, MAX_OUTPUT_BYTES));
170
- const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
404
+ const launched = await spawnOwnedProviderProcess({
405
+ command: executable,
406
+ arguments: arguments_,
407
+ runId: randomUUID(),
408
+ expectedCommand: executable,
409
+ signal: deadline.signal,
410
+ hostEnvironment: options.environment,
411
+ });
412
+ supervisor = new ProviderProcessSupervisor({
413
+ ...launched,
414
+ ownsProcessLifetime: true,
415
+ cleanup: () => cleanupOwnedProcessGroup(launched.ownership),
416
+ }, { maxDiagnosticBytes: DIAGNOSTIC_BYTES });
417
+ let identityAckWritten = false;
418
+ while (!(await supervisor.waitForOutputClose(20))) {
419
+ const pid = await readTargetPid(options.pidPath);
420
+ if (pid !== undefined && !identityAckWritten) {
421
+ let observation;
422
+ try {
423
+ observation = await observeProcessStartIdentity(pid);
424
+ }
425
+ catch {
426
+ observation = undefined;
427
+ }
428
+ if (observation?.state === "readable")
429
+ targetIdentity = observation.identity;
430
+ await writeFile(options.identityAckPath, observation?.state === "readable" ? "readable" : "unavailable", { mode: 0o600 });
431
+ identityAckWritten = true;
432
+ }
433
+ const interruption = deadline.interruption;
434
+ if (interruption !== undefined) {
435
+ const stopped = await supervisor.stop();
436
+ const cleanupFailure = stopped.status === "incomplete" ? stopped.reason : undefined;
437
+ return interruption === "cancelled"
438
+ ? { kind: "cancelled", targetIdentity, cleanupFailure }
439
+ : { kind: "timeout", targetIdentity, cleanupFailure };
440
+ }
441
+ await waitForAbortableDelay(20, deadline.signal);
442
+ }
443
+ const snapshot = supervisor.snapshot();
444
+ const stopped = await supervisor.stop();
445
+ const cleanupFailure = stopped.status === "incomplete" ? stopped.reason : undefined;
446
+ const interruption = deadline.interruption;
447
+ if (interruption === "cancelled")
448
+ return { kind: "cancelled", targetIdentity, cleanupFailure };
449
+ if (interruption === "timeout")
450
+ return { kind: "timeout", targetIdentity, cleanupFailure };
171
451
  return {
172
- text: buffer.subarray(0, bytesRead).toString("utf8"),
173
- bytes: size,
174
- truncated: size > MAX_OUTPUT_BYTES,
452
+ kind: "exited",
453
+ exitCode: snapshot.exitCode ?? null,
454
+ output: `${snapshot.stdout.text}${snapshot.stderr.text}`.slice(-DIAGNOSTIC_BYTES),
455
+ targetIdentity,
456
+ cleanupFailure,
175
457
  };
176
458
  }
459
+ catch (cause) {
460
+ const interruption = deadline.interruption;
461
+ const stopped = await supervisor?.stop();
462
+ const cleanupFailure = stopped?.status === "incomplete" ? stopped.reason : undefined;
463
+ return interruption === "timeout"
464
+ ? { kind: "timeout", targetIdentity, cleanupFailure }
465
+ : interruption === "cancelled"
466
+ ? { kind: "cancelled", targetIdentity, cleanupFailure }
467
+ : {
468
+ kind: "exited",
469
+ exitCode: null,
470
+ output: cause instanceof Error ? cause.message : String(cause),
471
+ targetIdentity,
472
+ cleanupFailure,
473
+ };
474
+ }
177
475
  finally {
178
- await handle.close();
476
+ supervisor?.dispose();
477
+ deadline.dispose();
179
478
  }
180
479
  };
181
- /** Run LLDB in its own process group so cancellation can stop it and debugserver. */
182
- const runLldb = (executable, arguments_, options) => new Promise((resolve) => {
183
- if (options.signal?.aborted === true) {
184
- resolve({ kind: "cancelled" });
185
- return;
186
- }
187
- const child = spawn(executable, [...arguments_], {
188
- shell: false,
189
- detached: true,
190
- stdio: ["ignore", "pipe", "pipe"],
191
- });
192
- let output = "";
193
- let stopped;
194
- const keep = (chunk) => {
195
- output = (output + chunk.toString("utf8")).slice(-DIAGNOSTIC_BYTES);
196
- };
197
- child.stdout.on("data", keep);
198
- child.stderr.on("data", keep);
199
- const kill = (reason) => {
200
- stopped ??= reason;
201
- if (child.pid !== undefined)
202
- try {
203
- process.kill(-child.pid, "SIGKILL");
204
- }
205
- catch {
206
- // The group already exited.
207
- }
208
- };
209
- const timer = setTimeout(() => {
210
- kill("timeout");
211
- }, options.deadlineMs);
212
- const onAbort = () => {
213
- kill("cancelled");
214
- };
215
- options.signal?.addEventListener("abort", onAbort, { once: true });
216
- const finish = (exitCode) => {
217
- clearTimeout(timer);
218
- options.signal?.removeEventListener("abort", onAbort);
219
- resolve(stopped === undefined
220
- ? { kind: "exited", exitCode, output }
221
- : { kind: stopped });
222
- };
223
- child.on("error", () => {
224
- finish(null);
225
- });
226
- child.on("close", (code) => {
227
- finish(code);
228
- });
229
- });
230
480
  /**
231
- * debugserver kills the traced process when LLDB exits. Confirm it, and kill a
232
- * survivor only when its executable is still the traced one.
481
+ * Confirm target exit, and signal a survivor only when its OS start identity
482
+ * still matches the one captured while it was stopped at entry.
233
483
  */
234
- const ensureTerminated = async (pidPath, executable) => {
235
- let pid;
484
+ const readTargetPid = async (pidPath) => {
236
485
  try {
237
- pid = Number.parseInt(await readFile(pidPath, "utf8"), 10);
486
+ const pid = Number.parseInt(await readFile(pidPath, "utf8"), 10);
487
+ return Number.isSafeInteger(pid) && pid > 0 ? pid : undefined;
238
488
  }
239
489
  catch {
240
- // LLDB never launched the target.
241
- return true;
490
+ return undefined;
242
491
  }
492
+ };
493
+ /** Only signal a surviving target when its captured OS start identity still matches. */
494
+ const ensureTerminated = async (pidPath, identity, missingPidIsUnknown) => {
495
+ const pid = await readTargetPid(pidPath);
496
+ if (pid === undefined)
497
+ return missingPidIsUnknown ? "identity-unavailable" : "terminated";
243
498
  if (!Number.isSafeInteger(pid) || pid <= 0)
244
- return false;
499
+ return "identity-unavailable";
500
+ let signalDisposition;
245
501
  for (let attempt = 0; attempt < 20; attempt++) {
246
502
  if (!alive(pid))
247
- return true;
248
- if (attempt === 10 && (await commandOf(pid)) === executable)
249
- try {
250
- process.kill(pid, "SIGKILL");
251
- }
252
- catch {
253
- // It exited between the checks.
503
+ return "terminated";
504
+ if (attempt === 10) {
505
+ if (identity === undefined)
506
+ signalDisposition = "identity-unavailable";
507
+ else {
508
+ const result = await signalProcessWithStartIdentity(pid, identity, "SIGKILL");
509
+ if (result === "gone")
510
+ return "terminated";
511
+ if (result === "identity-changed")
512
+ signalDisposition = "identity-changed";
513
+ else if (result === "unverified")
514
+ signalDisposition = "identity-unavailable";
515
+ else if (result === "signaled")
516
+ signalDisposition = "signal-did-not-stop";
254
517
  }
518
+ }
255
519
  await new Promise((resolve) => setTimeout(resolve, 100));
256
520
  }
257
- return !alive(pid);
521
+ return !alive(pid)
522
+ ? "terminated"
523
+ : (signalDisposition ?? "identity-unavailable");
524
+ };
525
+ const targetTerminationReason = (termination) => {
526
+ switch (termination) {
527
+ case "terminated":
528
+ return "target process terminated";
529
+ case "identity-unavailable":
530
+ return "target process start identity was unavailable; survivor was left untouched";
531
+ case "identity-changed":
532
+ return "target PID start identity changed; replacement process was left untouched";
533
+ case "signal-did-not-stop":
534
+ return "verified target did not exit after SIGKILL";
535
+ }
258
536
  };
259
537
  const alive = (pid) => {
260
538
  try {
@@ -267,12 +545,3 @@ const alive = (pid) => {
267
545
  cause.code === "ESRCH");
268
546
  }
269
547
  };
270
- const commandOf = async (pid) => {
271
- try {
272
- const { stdout } = await execFileOutput("/bin/ps", ["-o", "comm=", "-p", String(pid)], { timeout: 5_000 });
273
- return stdout.trim();
274
- }
275
- catch {
276
- return undefined;
277
- }
278
- };