rea-agents 5.0.0 → 6.1.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 (507) hide show
  1. package/README.md +168 -655
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +173 -47
  4. package/bridge/hopper_bridge.py +310 -128
  5. package/bridge/mitmproxy/capture.py +208 -0
  6. package/bridge/native/rea_lldb_tracer.py +839 -0
  7. package/bridge/process/ProcessRunTokenReader.swift +297 -0
  8. package/bridge/process/ProcessRunTokenReaderMain.swift +35 -0
  9. package/bridge/pwndbg/core_context.py +101 -0
  10. package/bridge/pwndbg/launch.py +39 -0
  11. package/bridge/pwndbg/launch_impl.py +34 -0
  12. package/bridge/pwntools/decoder_runtime.py +59 -0
  13. package/bridge/pwntools/layout.py +39 -0
  14. package/bridge/pwntools/layout_impl.py +309 -0
  15. package/bridge/pwntools/recorded_crash.py +39 -0
  16. package/bridge/pwntools/recorded_crash_impl.py +147 -0
  17. package/dist/android/JadxConfiguration.js +196 -33
  18. package/dist/android/JadxMcpTransport.js +4 -0
  19. package/dist/android/JadxProtocol.js +6 -0
  20. package/dist/android/JadxProvider.js +20 -2
  21. package/dist/android/JadxSession.js +23 -4
  22. package/dist/application/AnalysisContextQueries.js +8 -35
  23. package/dist/application/AnalysisDocument.js +32 -0
  24. package/dist/application/AppBundleExecutable.js +67 -21
  25. package/dist/application/CallPathTracing.js +19 -3
  26. package/dist/application/CapabilityInventory.js +27 -3
  27. package/dist/application/ClientConfigurationDocument.js +871 -6
  28. package/dist/application/ClientRegistrationIdentity.js +26 -5
  29. package/dist/application/ClientRegistrationStatus.js +29 -14
  30. package/dist/application/DirectAnalysis.js +97 -33
  31. package/dist/application/Doctor.js +4 -2
  32. package/dist/application/DoctorScope.js +25 -13
  33. package/dist/application/EnhancedLiteralTracing.js +22 -25
  34. package/dist/application/EnhancedTools.js +13 -11
  35. package/dist/application/EvidenceBundleFiles.js +24 -12
  36. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  37. package/dist/application/InventoryProjectionEvidence.js +4 -3
  38. package/dist/application/InvestigationProviders.js +3 -2
  39. package/dist/application/JsonFiles.js +50 -28
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/ReconstructionCoverageService.js +7 -4
  42. package/dist/application/ReconstructionObligationCandidates.js +5 -1
  43. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  44. package/dist/application/Setup.js +13 -1
  45. package/dist/application/SetupClientConfiguration.js +10 -15
  46. package/dist/application/SetupHost.js +5 -2
  47. package/dist/application/SetupPlan.js +5 -3
  48. package/dist/application/SupportedClients.js +34 -1
  49. package/dist/application/Uninstall.js +4 -3
  50. package/dist/application/Update.js +18 -3
  51. package/dist/application/UpdateRuntime.js +46 -25
  52. package/dist/application/WebModuleTraceService.js +4 -2
  53. package/dist/application/WebNetworkCapturePort.js +1 -0
  54. package/dist/application/WebNetworkCaptureService.js +134 -0
  55. package/dist/application/WebRuntimeService.js +5 -3
  56. package/dist/application/WebScriptExportService.js +2 -2
  57. package/dist/application/WebSourceLocationService.js +4 -2
  58. package/dist/application/WindowsCapabilities.js +1 -1
  59. package/dist/application/WorkflowEvidence.js +82 -0
  60. package/dist/application/binary/AnalysisProviderEvaluation.js +21 -5
  61. package/dist/application/binary/AnalysisProviderRegistry.js +2 -0
  62. package/dist/application/binary/AnalysisSnapshotCache.js +52 -12
  63. package/dist/application/binary/BinarySession.js +131 -76
  64. package/dist/application/binary/BinarySessionOpen.js +19 -6
  65. package/dist/application/binary/BinarySessionRecords.js +45 -3
  66. package/dist/application/binary/BinarySessionStatus.js +17 -1
  67. package/dist/application/binary/CompositeProvider.js +13 -0
  68. package/dist/application/binary/LazyAnalysisProvider.js +3 -0
  69. package/dist/application/binaryDiagnostics/BinaryLayoutPort.js +1 -0
  70. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +59 -0
  71. package/dist/application/binaryDiagnostics/RecordedCrashPort.js +1 -0
  72. package/dist/application/binaryDiagnostics/RecordedCrashService.js +62 -0
  73. package/dist/application/evm/EvmInterfacePort.js +1 -0
  74. package/dist/application/evm/EvmInterfaceService.js +64 -0
  75. package/dist/application/investigation/EvidenceLedger.js +21 -7
  76. package/dist/application/investigation/InvestigationRecords.js +8 -0
  77. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  78. package/dist/application/javascript/JavaScriptApplicationEvidence.js +25 -5
  79. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  80. package/dist/application/javascript/JavaScriptApplicationService.js +34 -14
  81. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  82. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +47 -27
  83. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +39 -7
  84. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +26 -2
  85. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +80 -27
  86. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +33 -12
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +37 -8
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  89. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -1
  90. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  91. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +7 -7
  92. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +149 -72
  93. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +14 -15
  94. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +41 -1
  95. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +7 -7
  96. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -9
  97. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +3 -3
  98. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +118 -12
  99. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -3
  100. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +27 -5
  101. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  102. package/dist/application/managed/ManagedMemberComparisonService.js +7 -4
  103. package/dist/application/managed/ManagedNativeVerificationService.js +4 -3
  104. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  105. package/dist/application/{ProcessCli.js → process/ProcessCli.js} +23 -15
  106. package/dist/application/{ProcessEvidence.js → process/ProcessEvidence.js} +8 -7
  107. package/dist/application/workflowInputError.js +18 -0
  108. package/dist/artifacts/ArtifactProvider.js +42 -5
  109. package/dist/artifacts/ArtifactProviderMetadata.js +2 -1
  110. package/dist/artifacts/MachOSliceArtifactReader.js +98 -14
  111. package/dist/artifacts/NativeDmgArtifactReader.js +13 -6
  112. package/dist/artifacts/ZipArtifactReader.js +3 -0
  113. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +22 -3
  114. package/dist/artifacts/apple/DylibResolutionReader.js +259 -0
  115. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  116. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  117. package/dist/artifacts/apple/KeyedArchiveReader.js +36 -22
  118. package/dist/artifacts/apple/MachoLoadCommandReader.js +355 -0
  119. package/dist/artifacts/apple/NibArchive.js +81 -14
  120. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  121. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  122. package/dist/{application → artifacts/extraction}/ArtifactExtraction.js +10 -10
  123. package/dist/{application → artifacts/inventory}/ArtifactGraphConstruction.js +16 -11
  124. package/dist/{application → artifacts/inventory}/ArtifactInventory.js +4 -4
  125. package/dist/{application/ArtifactInventory → artifacts/inventory}/classify.js +2 -2
  126. package/dist/{application/ArtifactInventory → artifacts/inventory}/reader.js +5 -5
  127. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanCanonical.js +14 -17
  128. package/dist/{application/ArtifactInventory → artifacts/inventory}/scanReader.js +5 -5
  129. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  130. package/dist/artifacts/readStableArtifact.js +20 -4
  131. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  132. package/dist/browser/CdpCaptureEventHandlers.js +165 -12
  133. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  134. package/dist/browser/CdpCaptureEvents.js +34 -0
  135. package/dist/browser/CdpConnection.js +30 -11
  136. package/dist/browser/CdpOptionalCommand.js +2 -3
  137. package/dist/browser/CdpPageCapture.js +23 -1
  138. package/dist/browser/PlaywrightElectronActiveActions.js +32 -23
  139. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  140. package/dist/browser/PlaywrightElectronActiveProvider.js +130 -122
  141. package/dist/browser/WebSourceMapFetcher.js +426 -72
  142. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  143. package/dist/browser/history/CaptureFailures.js +137 -0
  144. package/dist/browser/history/CaptureFormatError.js +10 -0
  145. package/dist/browser/history/CaptureRedaction.js +65 -0
  146. package/dist/browser/history/CaptureRelease.js +17 -0
  147. package/dist/browser/history/HarCapture.js +165 -0
  148. package/dist/browser/history/HarCaptureAdapter.js +20 -0
  149. package/dist/browser/history/HarCaptureProcess.js +57 -0
  150. package/dist/browser/history/HarJson.js +92 -0
  151. package/dist/browser/history/HarSchema.js +72 -0
  152. package/dist/browser/history/HistoricalCaptureDecoder.js +188 -0
  153. package/dist/browser/history/HistoricalCaptureFormatAdapter.js +1 -0
  154. package/dist/browser/history/MitmproxyCaptureAdapter.js +42 -0
  155. package/dist/cli/analysisSelector.js +23 -0
  156. package/dist/cli/applicationCommands.js +2 -3
  157. package/dist/cli/artifactCommands.js +26 -1
  158. package/dist/cli/binaryDiagnosticsCommands.js +39 -0
  159. package/dist/cli/coreAnalysisCommands.js +2 -2
  160. package/dist/cli/coreBinaryCommands.js +78 -20
  161. package/dist/cli/electronCommands.js +21 -13
  162. package/dist/cli/evmCommands.js +24 -0
  163. package/dist/cli/firmwareCommands.js +6 -3
  164. package/dist/cli/javascriptApplicationAnalysis.js +20 -3
  165. package/dist/cli/jsonOutput.js +38 -0
  166. package/dist/cli/nativeCallCommands.js +34 -0
  167. package/dist/cli/processCommands.js +1 -1
  168. package/dist/cli/streamedJsonOutput.js +56 -0
  169. package/dist/cli/utilityCommands.js +2 -0
  170. package/dist/cli/webNetworkCaptureCommands.js +40 -0
  171. package/dist/cli/webRuntimeCommands.js +8 -8
  172. package/dist/cli.js +11 -4
  173. package/dist/cliBrowserScenarioCommands.js +2 -2
  174. package/dist/cliCommandNames.js +6 -1
  175. package/dist/cliJsonInput.js +35 -1
  176. package/dist/cliOutput.js +21 -6
  177. package/dist/composition/binaryDiagnostics.js +8 -0
  178. package/dist/composition/evm.js +4 -0
  179. package/dist/composition/webNetworkCaptures.js +6 -0
  180. package/dist/config/environment.js +4 -0
  181. package/dist/config/ghidraStartupTimeout.js +17 -0
  182. package/dist/config/mcpResponseBudget.js +22 -0
  183. package/dist/config/parseConfig.js +2 -1
  184. package/dist/contracts/artifactToolContracts.js +6 -0
  185. package/dist/contracts/browserCaptureToolInputSchema.js +43 -0
  186. package/dist/contracts/browserToolContracts.js +4 -3
  187. package/dist/contracts/enhancedInputs.js +5 -3
  188. package/dist/contracts/enhancedToolContracts.js +3 -3
  189. package/dist/contracts/errorSchemas.js +8 -1
  190. package/dist/contracts/evm/evmToolContracts.js +20 -0
  191. package/dist/contracts/hopperMemoryContracts.js +2 -5
  192. package/dist/contracts/investigationExamples.js +2 -2
  193. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  194. package/dist/contracts/managed/managedToolContracts.js +8 -6
  195. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +42 -0
  196. package/dist/contracts/native/nativeToolContracts.js +21 -3
  197. package/dist/contracts/officialToolContracts.js +26 -24
  198. package/dist/contracts/process/processCaptureExample.js +2 -0
  199. package/dist/contracts/promptContracts.js +3 -3
  200. package/dist/contracts/sessionLifecycleInputs.js +18 -5
  201. package/dist/contracts/sessionStatusContract.js +8 -2
  202. package/dist/contracts/sessionToolContracts.js +8 -3
  203. package/dist/contracts/sessionToolSchemas.js +8 -4
  204. package/dist/contracts/toolContractExamples.js +1 -2
  205. package/dist/contracts/toolContractHelpers.js +4 -1
  206. package/dist/contracts/toolContracts.js +6 -0
  207. package/dist/contracts/toolEffects.js +30 -1
  208. package/dist/contracts/toolOutputSchemaGroups.js +33 -28
  209. package/dist/contracts/toolOutputSchemaPrimitives.js +19 -1
  210. package/dist/contracts/toolSchemaMetadata.js +69 -10
  211. package/dist/contracts/webNetworkCaptureToolContracts.js +24 -0
  212. package/dist/domain/analysisErrorBase.js +22 -2
  213. package/dist/domain/analysisErrorCore.js +61 -5
  214. package/dist/domain/analysisErrorPresentation.js +95 -12
  215. package/dist/domain/analysisErrorProjection.js +148 -19
  216. package/dist/domain/analysisSnapshot.js +166 -2
  217. package/dist/domain/android/androidAnalysis.js +2 -4
  218. package/dist/domain/android/androidApplication.js +17 -9
  219. package/dist/domain/apple/appleApplication.js +41 -14
  220. package/dist/domain/apple/dyldEnvironment.js +73 -0
  221. package/dist/domain/apple/dyldPaths.js +81 -0
  222. package/dist/domain/apple/dylibResolution.js +478 -0
  223. package/dist/domain/apple/dylibResolutionFindings.js +77 -0
  224. package/dist/domain/apple/interfaceBuilderGraph.js +25 -13
  225. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  226. package/dist/domain/apple/keyedArchive.js +9 -1
  227. package/dist/domain/apple/machoContainer.js +54 -0
  228. package/dist/domain/apple/plistNumbers.js +76 -0
  229. package/dist/domain/artifactIdentity.js +29 -0
  230. package/dist/domain/artifactInventoryEvidence.js +19 -24
  231. package/dist/domain/artifactPathSyntax.js +1 -1
  232. package/dist/domain/bridgeCandidateProjection.js +71 -0
  233. package/dist/domain/browserCompleteness.js +1 -0
  234. package/dist/domain/browserObservation.js +1 -1
  235. package/dist/domain/browserObservationError.js +24 -5
  236. package/dist/domain/browserObservationSchemas.js +13 -0
  237. package/dist/domain/browserScenarioValues.js +5 -2
  238. package/dist/domain/bundleComparison.js +3 -2
  239. package/dist/domain/callPathSchemas.js +1 -1
  240. package/dist/domain/canonicalDigest.js +13 -1
  241. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  242. package/dist/domain/canonicalOrdering.js +9 -5
  243. package/dist/domain/changedBehavior.js +9 -9
  244. package/dist/domain/comparisonSourceEvidence.js +40 -0
  245. package/dist/domain/comparisonStatus.js +2 -30
  246. package/dist/domain/configurationErrors.js +1 -1
  247. package/dist/domain/conformanceTrustGate.js +0 -16
  248. package/dist/domain/evidence.js +78 -11
  249. package/dist/domain/evidenceBundle.js +42 -1
  250. package/dist/domain/evidenceErrors.js +12 -1
  251. package/dist/domain/evm/evmInterface.js +63 -0
  252. package/dist/domain/explicitSensitiveFailure.js +108 -0
  253. package/dist/domain/explicitSensitiveValues.js +10 -0
  254. package/dist/domain/firmware/firmwareAnalysis.js +10 -4
  255. package/dist/domain/hopperErrors.js +23 -2
  256. package/dist/domain/hopperValues.js +51 -8
  257. package/dist/domain/immutableJson.js +114 -0
  258. package/dist/domain/inputIssueProjection.js +3 -0
  259. package/dist/domain/javascript/electronActiveObservation.js +37 -6
  260. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  261. package/dist/domain/javascript/htmlArtifactReferences.js +40 -0
  262. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  263. package/dist/domain/javascript/javascriptApplicationGraph.js +13 -0
  264. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  265. package/dist/domain/javascript/javascriptExportShapeComparison.js +21 -5
  266. package/dist/domain/javascript/javascriptExportShapeVariants.js +0 -10
  267. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  268. package/dist/domain/javascript/javascriptSemanticAnalysis.js +97 -2
  269. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  270. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  271. package/dist/domain/javascript/javascriptSemanticDataEffects.js +22 -5
  272. package/dist/domain/javascript/javascriptSemanticGraph.js +34 -5
  273. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  274. package/dist/domain/javascript/javascriptSemanticPrimitives.js +25 -17
  275. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  276. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  277. package/dist/domain/javascript/javascriptSemanticValues.js +83 -11
  278. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  279. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  280. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  281. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +14 -4
  282. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  283. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -16
  284. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  285. package/dist/domain/jsonSerialization.js +109 -0
  286. package/dist/domain/jsonValue.js +91 -3
  287. package/dist/domain/localPath.js +8 -0
  288. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  289. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  290. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  291. package/dist/domain/managed/managedNativeVerification.js +3 -9
  292. package/dist/domain/native/binaryLayout.js +357 -0
  293. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  294. package/dist/domain/native/nativeCallObservation.js +186 -0
  295. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  296. package/dist/domain/native/objcSwiftMetadata.js +0 -39
  297. package/dist/domain/native/recordedCrash.js +266 -0
  298. package/dist/domain/native/recordedCrashNoteCoverage.js +73 -0
  299. package/dist/domain/{processCapture.js → process/processCapture.js} +143 -2
  300. package/dist/domain/{processCaptureExample.js → process/processCaptureExample.js} +5 -0
  301. package/dist/domain/process/processCaptureParsing.js +54 -0
  302. package/dist/domain/{processCaptureValidation.js → process/processCaptureValidation.js} +18 -2
  303. package/dist/domain/{processComparison.js → process/processComparison.js} +39 -5
  304. package/dist/domain/{processObservation.js → process/processObservation.js} +1 -1
  305. package/dist/domain/{processScenario.js → process/processScenario.js} +11 -10
  306. package/dist/domain/{processTraceSpecification.js → process/processTraceSpecification.js} +1 -1
  307. package/dist/domain/propertyListKeys.js +1 -1
  308. package/dist/domain/propertyListXmlText.js +19 -0
  309. package/dist/domain/providerAdapterError.js +1 -1
  310. package/dist/domain/providerOperationHealth.js +54 -0
  311. package/dist/domain/providerSelectionError.js +4 -2
  312. package/dist/domain/reconstructionVerification.js +9 -46
  313. package/dist/domain/reconstructionVerificationSchemas.js +3 -3
  314. package/dist/domain/residualUnknown.js +3 -2
  315. package/dist/domain/staticRuntimeCorrelation.js +9 -46
  316. package/dist/domain/webBundleAnalysis.js +20 -8
  317. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  318. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  319. package/dist/domain/webCaptureDiff.js +1 -0
  320. package/dist/domain/webNetworkCapture.js +118 -0
  321. package/dist/domain/webNetworkCaptureCoordinates.js +58 -0
  322. package/dist/domain/webRuntime.js +19 -5
  323. package/dist/domain/webSourceLocation.js +1 -0
  324. package/dist/dotnet/ManagedExceptionRegionValidation.js +41 -0
  325. package/dist/dotnet/ManagedMemberInspector.js +4 -2
  326. package/dist/dotnet/ManagedMemberInspectorCore.js +38 -32
  327. package/dist/dotnet/ManagedMemberInstructionDecoder.js +23 -7
  328. package/dist/dotnet/ManagedMemberRows.js +14 -3
  329. package/dist/dotnet/ManagedMetadataHeaps.js +20 -2
  330. package/dist/dotnet/ManagedMetadataInventory.js +38 -28
  331. package/dist/dotnet/ManagedMetadataInventoryRows.js +24 -10
  332. package/dist/dotnet/ManagedMethodBodyReader.js +7 -1
  333. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +15 -3
  334. package/dist/dotnet/ManagedNativeBoundaryInspector.js +3 -1
  335. package/dist/dotnet/ManagedPeReader.js +11 -0
  336. package/dist/evm/EvmBytecodeCarrier.js +21 -0
  337. package/dist/evm/EvmWorkerLimits.js +40 -0
  338. package/dist/evm/EvmoleFailures.js +126 -0
  339. package/dist/evm/EvmoleInterfaceAdapter.js +53 -0
  340. package/dist/evm/EvmoleInterfaceProvider.js +273 -0
  341. package/dist/evm/EvmoleInterfaceWorker.js +87 -0
  342. package/dist/evm/EvmoleRelease.js +16 -0
  343. package/dist/firmware/FirmwareCommand.js +1 -0
  344. package/dist/firmware/FirmwareFiles.js +1 -1
  345. package/dist/generatedPackageMetadata.js +2 -2
  346. package/dist/ghidra/GhidraAnalysisProfile.js +5 -0
  347. package/dist/ghidra/GhidraClient.js +47 -14
  348. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  349. package/dist/ghidra/GhidraFunctionValues.js +10 -7
  350. package/dist/ghidra/GhidraInstallation.js +18 -21
  351. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  352. package/dist/ghidra/GhidraJavaLaunch.js +62 -0
  353. package/dist/ghidra/GhidraLauncher.js +34 -16
  354. package/dist/ghidra/GhidraProvider.js +2 -2
  355. package/dist/ghidra/GhidraProviderCapabilities.js +15 -3
  356. package/dist/ghidra/GhidraProviderClient.js +23 -12
  357. package/dist/ghidra/GhidraSessionError.js +11 -7
  358. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  359. package/dist/ghidra/GhidraTransport.js +20 -0
  360. package/dist/hopper/BridgeLauncher.js +33 -11
  361. package/dist/hopper/HopperAnalysisProfile.js +62 -4
  362. package/dist/hopper/HopperCleanup.js +15 -3
  363. package/dist/hopper/HopperClient.js +222 -14
  364. package/dist/hopper/HopperFileOffset.js +237 -0
  365. package/dist/hopper/HopperMachOImage.js +196 -0
  366. package/dist/hopper/HopperOperationStage.js +6 -0
  367. package/dist/hopper/HopperProvider.js +63 -9
  368. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  369. package/dist/hopper/HopperRegexSearch.js +137 -0
  370. package/dist/hopper/HopperRegexWorker.js +27 -0
  371. package/dist/hopper/HopperRequestQueue.js +68 -19
  372. package/dist/hopper/HopperTargetLease.js +3 -2
  373. package/dist/hopper/LinuxPrivateDisplayProbe.js +4 -2
  374. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  375. package/dist/inspector/V8InspectorCaptureProjection.js +8 -3
  376. package/dist/inspector/V8InspectorProvider.js +47 -11
  377. package/dist/javascript/recovery/WakaruCommand.js +3 -0
  378. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  379. package/dist/javascript/sourceMaps/SourceMapCommand.js +17 -0
  380. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  381. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  382. package/dist/mcpDoctor.js +62 -2
  383. package/dist/native/AppleDispatchCoverage.js +47 -6
  384. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  385. package/dist/native/AppleDispatchMetadata.js +6 -3
  386. package/dist/native/AppleMachoFixups.js +48 -24
  387. package/dist/native/AppleMachoSelection.js +32 -16
  388. package/dist/native/AppleObjcCategories.js +6 -2
  389. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  390. package/dist/native/AppleObjcProperties.js +2 -1
  391. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  392. package/dist/native/AppleSwiftVtables.js +21 -15
  393. package/dist/native/CommandRunner.js +82 -84
  394. package/dist/native/LldbCallTracer.js +541 -0
  395. package/dist/native/LldbRetainedObservations.js +178 -0
  396. package/dist/native/NativeCallObservation.js +194 -0
  397. package/dist/native/NativeMacOSProvider.js +117 -20
  398. package/dist/native/NativeMacOSProviderMetadata.js +8 -3
  399. package/dist/native/SignatureTargetBinding.js +155 -0
  400. package/dist/native/parsers/lipo.js +71 -1
  401. package/dist/native/pwndbg/PwndbgCoreContext.js +180 -0
  402. package/dist/native/pwntools/PwntoolsDecoder.js +203 -0
  403. package/dist/native/pwntools/PwntoolsFailures.js +180 -0
  404. package/dist/native/pwntools/PwntoolsLayoutProvider.js +36 -0
  405. package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +75 -0
  406. package/dist/native/pwntools/PwntoolsRelease.js +19 -0
  407. package/dist/native/pwntools/PwntoolsResourceLimits.js +76 -0
  408. package/dist/native/pwntools/RecordedCrashSourceBindings.js +46 -0
  409. package/dist/native/pwntools/RecordedCrashStructureBindings.js +103 -0
  410. package/dist/process/DarwinProcessRunTokenReader.js +293 -0
  411. package/dist/process/ExecFileOutput.js +20 -0
  412. package/dist/process/OwnedCommand.js +118 -0
  413. package/dist/process/ProcessOwnership.js +431 -51
  414. package/dist/process/ProcessOwnershipObservation.js +209 -27
  415. package/dist/process/ProviderProcess.js +68 -10
  416. package/dist/{application → process/capture}/ProcessCaptureCapability.js +15 -0
  417. package/dist/{application → process/capture}/ProcessCaptureError.js +18 -2
  418. package/dist/process/capture/ProcessCaptureLifecycle.js +681 -0
  419. package/dist/{application → process/capture}/ProcessHarness.js +195 -29
  420. package/dist/{application → process/capture}/ProcessSampling.js +2 -2
  421. package/dist/server/EvidenceMcpServer.js +146 -0
  422. package/dist/server/createServer.js +37 -8
  423. package/dist/server/promptCompletion.js +10 -3
  424. package/dist/server/registerAndroidTools.js +2 -4
  425. package/dist/server/registerApplicationTools/helpers.js +2 -4
  426. package/dist/server/registerArtifactComparisonTool.js +11 -7
  427. package/dist/server/registerBinaryDiagnosticsTools.js +15 -0
  428. package/dist/server/registerBrowserScenarioTool.js +2 -4
  429. package/dist/server/registerBrowserTools.js +2 -4
  430. package/dist/server/registerBundleComparisonTool.js +2 -3
  431. package/dist/server/registerCloseLifecycleTool.js +8 -18
  432. package/dist/server/registerElectronTools.js +2 -4
  433. package/dist/server/registerEnhancedTools.js +18 -59
  434. package/dist/server/registerEvidenceTools.js +3 -5
  435. package/dist/server/registerEvmTools.js +15 -0
  436. package/dist/server/registerFirmwareTools.js +2 -4
  437. package/dist/server/registerFunctionComparisonTool.js +10 -6
  438. package/dist/server/registerInvestigationTools.js +7 -7
  439. package/dist/server/registerJavaScriptRecoveryTool.js +2 -4
  440. package/dist/server/registerJavaScriptRuntimeObservationTools.js +2 -4
  441. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +2 -4
  442. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +2 -4
  443. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +2 -4
  444. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +2 -4
  445. package/dist/server/registerOfficialTools.js +2 -4
  446. package/dist/server/registerProcessComparisonTool.js +72 -46
  447. package/dist/server/registerRecordedCrashTools.js +15 -0
  448. package/dist/server/registerSessionRecordTools.js +5 -6
  449. package/dist/server/registerSessionStatusTool.js +17 -3
  450. package/dist/server/registerSessionTools.js +13 -5
  451. package/dist/server/registerWebModuleTool.js +2 -4
  452. package/dist/server/registerWebNetworkCaptureTool.js +26 -0
  453. package/dist/server/registerWebRuntimeTools.js +3 -7
  454. package/dist/server/registerWebScriptTool.js +2 -4
  455. package/dist/server/registerWebSourceLocationTool.js +2 -4
  456. package/dist/server/runDerivedOperation.js +15 -3
  457. package/dist/server/sessionAvailabilityPolicy.js +3 -1
  458. package/dist/server/sessionToolPolicies.js +1 -1
  459. package/dist/server/toolRegistrationOptions.js +2 -2
  460. package/dist/server/toolResult.js +63 -11
  461. package/dist/server/toolResultEncoding.js +33 -0
  462. package/install.sh +1 -1
  463. package/native/windows/build/manifest.json +2 -2
  464. package/native/windows/build/rea-windows-x64.node +0 -0
  465. package/package.json +42 -9
  466. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  467. package/scripts/electron-active-hook.cjs +241 -37
  468. package/scripts/rea.mjs +11 -3
  469. package/skills/reverse-engineer-anything/SKILL.md +32 -4
  470. package/skills/reverse-engineer-anything/references/javascript-applications.md +8 -1
  471. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +29 -0
  472. package/third_party/README.md +60 -0
  473. package/third_party/evmole/LICENSE +21 -0
  474. package/third_party/evmole/README.md +22 -0
  475. package/third_party/pwndbg/LICENSE.md +21 -0
  476. package/third_party/pwndbg/README.md +23 -0
  477. package/third_party/pwntools/README.md +40 -0
  478. package/dist/application/AuthorizedArtifactInventory.js +0 -7
  479. package/dist/application/ProcessCaptureLifecycle.js +0 -299
  480. package/dist/application/StoreFileLock.js +0 -124
  481. package/dist/contracts/processCaptureExample.js +0 -2
  482. package/dist/domain/bytecodeProvider.js +0 -178
  483. package/dist/domain/customProtocolCapture.js +0 -137
  484. package/dist/domain/eventProcessTree.js +0 -225
  485. package/dist/domain/mobileApplicationInvestigation.js +0 -159
  486. package/dist/domain/packageAnalysis.js +0 -123
  487. package/dist/domain/peInspection.js +0 -197
  488. package/dist/domain/processCaptureParsing.js +0 -21
  489. package/dist/domain/protocolCapture.js +0 -217
  490. package/dist/domain/runtimeIdentification.js +0 -212
  491. package/dist/generatedMcpToolCatalog.js +0 -37
  492. package/dist/ghidra/GhidraDefaults.js +0 -2
  493. /package/dist/application/{ArtifactExtractionDestination.js → artifacts/ArtifactExtractionDestination.js} +0 -0
  494. /package/dist/{application/ArtifactInventory → artifacts/inventory}/policy.js +0 -0
  495. /package/dist/{application/ArtifactInventory → artifacts/inventory}/types.js +0 -0
  496. /package/dist/domain/{processEvidenceProvider.js → process/processEvidenceProvider.js} +0 -0
  497. /package/dist/domain/{processTraceComparison.js → process/processTraceComparison.js} +0 -0
  498. /package/dist/domain/{processTraceDimensionProjection.js → process/processTraceDimensionProjection.js} +0 -0
  499. /package/dist/domain/{processTraceEvaluation.js → process/processTraceEvaluation.js} +0 -0
  500. /package/dist/{application → process/capture}/FilesystemSnapshot.js +0 -0
  501. /package/dist/{application → process/capture}/ProcessCaptureEnvironment.js +0 -0
  502. /package/dist/{application → process/capture}/ProcessCaptureJournal.js +0 -0
  503. /package/dist/{application → process/capture}/ProcessFilesystemEffects.js +0 -0
  504. /package/dist/{application → process/capture}/ProcessNormalization.js +0 -0
  505. /package/dist/{application → process/capture}/ProcessScenarioRuntimeValidation.js +0 -0
  506. /package/dist/{application → process/capture}/ProcessTimer.js +0 -0
  507. /package/dist/{application → process/capture}/TerminalRenderer.js +0 -0
@@ -0,0 +1,178 @@
1
+ import { open } from "node:fs/promises";
2
+ import { nativeCallEventSchema } from "../domain/native/nativeCallObservation.js";
3
+ /** Maximum journal size enforced by the LLDB bridge. */
4
+ export const LLDB_OBSERVATION_JOURNAL_MAX_BYTES = 8 * 1024 * 1024;
5
+ const MAX_CAPTURE_BYTES = 1024 * 1024;
6
+ /** Join safely retained journal and process evidence into its failure contract. */
7
+ export const projectLldbPartialObservation = (input) => ({
8
+ kind: "native-call-observation",
9
+ target: input.target,
10
+ process: {
11
+ pid: input.pid ?? null,
12
+ stdout: input.stdout,
13
+ stderr: input.stderr,
14
+ other_stops: input.journal.otherStops,
15
+ },
16
+ debugger: { version: input.version },
17
+ events: input.journal.events,
18
+ coverage: { status: "partial", reason: input.reason },
19
+ limitations: [
20
+ "The LLDB run did not produce a complete native call observation result.",
21
+ "The target SHA-256 identifies the selected artifact; LLDB did not verify the bytes loaded into the process.",
22
+ "Captured output byte counts are observed lower bounds because LLDB did not report final stream counters.",
23
+ ...input.journal.limitations,
24
+ ...(input.journalLimitations ?? []),
25
+ ...(input.limitations ?? []),
26
+ ...(input.pid === undefined ? ["The target PID was unavailable."] : []),
27
+ ...(input.stdout === null
28
+ ? ["The target stdout capture was unavailable."]
29
+ : []),
30
+ ...(input.stderr === null
31
+ ? ["The target stderr capture was unavailable."]
32
+ : []),
33
+ ],
34
+ });
35
+ /** Parse completed JSONL records while retaining valid records around bad ones. */
36
+ export const parseLldbObservationJournal = (bytes) => {
37
+ const completeText = Buffer.from(bytes).toString("utf8");
38
+ const newline = completeText.lastIndexOf("\n");
39
+ const hasTornTail = newline !== completeText.length - 1;
40
+ const events = [];
41
+ const otherStops = [];
42
+ const limitations = [];
43
+ let malformedCount = 0;
44
+ let firstMalformedRow;
45
+ let start = 0;
46
+ let rowNumber = 0;
47
+ while (start <= newline && newline >= 0) {
48
+ const end = completeText.indexOf("\n", start);
49
+ if (end < 0 || end > newline)
50
+ break;
51
+ const line = completeText.slice(start, end);
52
+ start = end + 1;
53
+ if (line.length === 0)
54
+ continue;
55
+ rowNumber += 1;
56
+ const markMalformed = () => {
57
+ malformedCount += 1;
58
+ firstMalformedRow ??= rowNumber;
59
+ };
60
+ let row;
61
+ try {
62
+ row = JSON.parse(line);
63
+ }
64
+ catch {
65
+ markMalformed();
66
+ continue;
67
+ }
68
+ if (typeof row !== "object" ||
69
+ row === null ||
70
+ !("kind" in row) ||
71
+ typeof row.kind !== "string") {
72
+ markMalformed();
73
+ continue;
74
+ }
75
+ if (row.kind === "event" && "event" in row) {
76
+ const event = nativeCallEventSchema.safeParse(row.event);
77
+ if (event.success)
78
+ events.push(event.data);
79
+ else
80
+ markMalformed();
81
+ }
82
+ else if (row.kind === "other-stop" &&
83
+ "reason" in row &&
84
+ typeof row.reason === "string") {
85
+ otherStops.push(row.reason);
86
+ }
87
+ else {
88
+ markMalformed();
89
+ }
90
+ }
91
+ if (malformedCount > 0)
92
+ limitations.push(`${malformedCount} observation journal row(s) were malformed or invalid and ignored (first at row ${String(firstMalformedRow)}).`);
93
+ if (hasTornTail)
94
+ limitations.push("The final observation journal record was incomplete and was ignored.");
95
+ return { events, otherStops, limitations };
96
+ };
97
+ /** Keep reading a bounded prefix across short reads until EOF or the bound. */
98
+ export const readBoundedPrefix = async (requestedBytes, readChunk) => {
99
+ const buffer = Buffer.alloc(requestedBytes);
100
+ let bytesRead = 0;
101
+ while (bytesRead < requestedBytes) {
102
+ const count = await readChunk(buffer, bytesRead, requestedBytes - bytesRead, bytesRead);
103
+ if (count === 0)
104
+ break;
105
+ if (count > requestedBytes - bytesRead)
106
+ throw new Error("The bounded read returned more bytes than requested");
107
+ bytesRead += count;
108
+ }
109
+ return { buffer, bytesRead };
110
+ };
111
+ const readPrefix = (handle, requestedBytes) => readBoundedPrefix(requestedBytes, async (buffer, offset, length, position) => (await handle.read(buffer, offset, length, position)).bytesRead);
112
+ /** Read at most the bridge's journal bound, checking size before allocation. */
113
+ export const readLldbObservationJournal = async (path) => {
114
+ let handle;
115
+ try {
116
+ handle = await open(path, "r");
117
+ const { size } = await handle.stat();
118
+ const length = Math.min(size, LLDB_OBSERVATION_JOURNAL_MAX_BYTES);
119
+ const { buffer, bytesRead } = await readPrefix(handle, length);
120
+ const parsed = parseLldbObservationJournal(buffer.subarray(0, bytesRead));
121
+ const limitations = [
122
+ ...(size > LLDB_OBSERVATION_JOURNAL_MAX_BYTES
123
+ ? [
124
+ "The observation journal exceeded 8 MiB; only its bounded prefix was read.",
125
+ ]
126
+ : []),
127
+ ...(bytesRead < length
128
+ ? [
129
+ "The observation journal became shorter while being read; the available prefix was parsed.",
130
+ ]
131
+ : []),
132
+ ];
133
+ return {
134
+ parsed,
135
+ limitations,
136
+ };
137
+ }
138
+ catch (cause) {
139
+ return {
140
+ parsed: { events: [], otherStops: [], limitations: [] },
141
+ limitations: [
142
+ `The observation journal could not be read: ${cause instanceof Error ? cause.message : String(cause)}`,
143
+ ],
144
+ };
145
+ }
146
+ finally {
147
+ await handle?.close().catch(() => undefined);
148
+ }
149
+ };
150
+ /** Retain an available output prefix without claiming an unreported total. */
151
+ export const readPartialCapture = async (path) => {
152
+ let handle;
153
+ try {
154
+ handle = await open(path, "r");
155
+ const { size } = await handle.stat();
156
+ const length = Math.min(size, MAX_CAPTURE_BYTES);
157
+ const { buffer, bytesRead } = await readPrefix(handle, length);
158
+ return {
159
+ capture: {
160
+ text: buffer.subarray(0, bytesRead).toString("utf8"),
161
+ bytes: Math.max(size, bytesRead),
162
+ truncated: true,
163
+ complete: false,
164
+ },
165
+ limitations: bytesRead < length
166
+ ? [
167
+ "A target output capture became shorter while being read; its retained prefix may be incomplete.",
168
+ ]
169
+ : [],
170
+ };
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ finally {
176
+ await handle?.close().catch(() => undefined);
177
+ }
178
+ };
@@ -0,0 +1,194 @@
1
+ import { createHash } from "node:crypto";
2
+ import { open } from "node:fs/promises";
3
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
4
+ import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
5
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
6
+ import { nativeCallObservationInputSchema, nativeCallObservationResultSchema, } from "../domain/native/nativeCallObservation.js";
7
+ import { err, ok } from "../domain/result.js";
8
+ const OPERATION = "observe_native_calls";
9
+ /** What every call observation leaves unobserved or approximated. */
10
+ export const NATIVE_CALL_OBSERVATION_LIMITATIONS = [
11
+ "Only entries are observed; return values, floating-point and stack-passed arguments are not captured.",
12
+ "Registers are the raw integer argument registers at entry. For Objective-C methods the first two hold the receiver and the selector.",
13
+ "Receiver classes come from LLDB's Objective-C runtime reader without running target code; they are null for class methods and for receivers LLDB cannot classify.",
14
+ "Calls that never reach a symbol's entry, such as inlined code or objc_direct methods called directly, are not observed.",
15
+ "The target is launched directly under LLDB, not through LaunchServices; LLDB disables ASLR for it, so load addresses can equal file addresses.",
16
+ "The observation window is checked about once a second, and recording pauses the process at every entry, which slows it.",
17
+ ];
18
+ /** Launch the active Mach-O under LLDB, record requested call entries, then stop it. */
19
+ export const observeNativeCalls = async (target, parameters, tracer, signal, readTargetDigest = fileSha256) => {
20
+ if (target.kind !== "executable" || target.format !== "mach-o")
21
+ return err(new AnalysisCapabilityUnavailableError("native-macos", OPERATION, "Native call observation launches a Mach-O executable; the active target is not one"));
22
+ const parsed = nativeCallObservationInputSchema.safeParse(parameters);
23
+ if (!parsed.success)
24
+ return err(new AnalysisInputError(OPERATION, { cause: parsed.error }));
25
+ // Observe the bytes the session's other Evidence describes.
26
+ let digest;
27
+ try {
28
+ digest = await readTargetDigest(target.path, signal);
29
+ }
30
+ catch (cause) {
31
+ if (signal?.aborted === true || isAbortError(cause))
32
+ return err(new AnalysisCancelledError(OPERATION));
33
+ return err(new ProviderAdapterError("native-macos", OPERATION, {
34
+ diagnostics: {
35
+ reason: "Unable to verify the selected target digest",
36
+ detail: cause instanceof Error ? cause.message : String(cause),
37
+ },
38
+ }));
39
+ }
40
+ if (digest !== target.sha256)
41
+ return err(new EvidenceIntegrityError("Native call observation target digest changed after session binding"));
42
+ if (signal?.aborted === true)
43
+ return err(new AnalysisCancelledError(OPERATION));
44
+ const traced = await tracer.trace({
45
+ executable: target.path,
46
+ architecture: target.architecture,
47
+ expectedSha256: target.sha256,
48
+ input: parsed.data,
49
+ }, signal);
50
+ if (!traced.ok)
51
+ return traced;
52
+ return ok(projectNativeCalls(target, parsed.data, traced.value));
53
+ };
54
+ const isAbortError = (cause) => cause instanceof Error && cause.name === "AbortError";
55
+ /** Join the request, the tracer's run and REA's own checks into the result contract. */
56
+ export const projectNativeCalls = (target, input, trace) => {
57
+ const { run } = trace;
58
+ const unresolved = run.breakpoints
59
+ .filter(({ location_count: count }) => count === 0)
60
+ .map(({ index }) => index);
61
+ const eventLimit = run.outcome === "event-limit";
62
+ const resourceLimit = run.outcome === "resource-limit";
63
+ const breakpointLocationLimit = run.breakpoint_locations_truncated === true;
64
+ const partial = eventLimit ||
65
+ resourceLimit ||
66
+ breakpointLocationLimit ||
67
+ run.outcome === "duration-elapsed" ||
68
+ run.outcome === "stop-limit" ||
69
+ unresolved.length > 0;
70
+ return nativeCallObservationResultSchema.parse({
71
+ target: {
72
+ path: target.path,
73
+ sha256: target.sha256,
74
+ architecture: target.architecture,
75
+ arguments: input.arguments,
76
+ environment: input.environment,
77
+ working_directory: input.working_directory ?? null,
78
+ launch_identity: {
79
+ loaded_image_sha256: run.target_identity.loaded_image_sha256,
80
+ file_device: run.target_identity.file_device,
81
+ file_inode: run.target_identity.file_inode,
82
+ selected_file_sha256: run.target_identity.selected_file_sha256,
83
+ module_path: run.target_identity.module_path,
84
+ module_uuid: run.target_identity.module_uuid,
85
+ stable: run.target_identity.stable,
86
+ },
87
+ },
88
+ debugger: trace.debugger,
89
+ process: {
90
+ pid: run.pid,
91
+ outcome: run.outcome,
92
+ exit_status: run.exit_status,
93
+ exit_description: run.exit_description,
94
+ terminated: run.terminated && trace.terminated,
95
+ elapsed_ms: run.elapsed_ms,
96
+ stdout: trace.stdout,
97
+ stderr: trace.stderr,
98
+ other_stops: run.other_stops,
99
+ },
100
+ breakpoints: input.breakpoints.map((request, index) => ({
101
+ index,
102
+ request: request.kind === "function"
103
+ ? { ...request, module: request.module ?? null }
104
+ : { ...request, class_name: request.class_name ?? null },
105
+ location_count: run.breakpoints[index]?.location_count ?? 0,
106
+ locations: run.breakpoints[index]?.locations ?? [],
107
+ })),
108
+ events: run.events,
109
+ coverage: {
110
+ status: partial ? "partial" : "complete",
111
+ event_limit_reached: eventLimit,
112
+ resource_limit_reached: resourceLimit,
113
+ ...(breakpointLocationLimit
114
+ ? { breakpoint_locations_truncated: true }
115
+ : {}),
116
+ unresolved_breakpoints: unresolved,
117
+ },
118
+ limitations: [
119
+ ...NATIVE_CALL_OBSERVATION_LIMITATIONS,
120
+ "The selected pathname digest and LLDB module identity are checked around launch. No immutable executable snapshot is used; concurrent in-place mutation or replacement and restoration cannot be ruled out, so the loaded-image digest remains unknown.",
121
+ ...(eventLimit
122
+ ? [
123
+ `Observation stopped at max_events (${input.max_events}); later calls were not recorded and the process was killed.`,
124
+ ]
125
+ : []),
126
+ ...(resourceLimit
127
+ ? [
128
+ "Observation stopped before retaining the next complete event because the estimated 8 MiB trace-payload or 65,536-frame aggregate budget was reached; the process was killed.",
129
+ ]
130
+ : []),
131
+ ...(run.outcome === "duration-elapsed"
132
+ ? [
133
+ `The process was still running after duration_ms (${input.duration_ms}) and was killed.`,
134
+ ]
135
+ : []),
136
+ ...(run.target_identity.stable
137
+ ? []
138
+ : [
139
+ "LLDB did not provide enough module identity evidence to confirm pathname and module continuity around launch.",
140
+ ]),
141
+ ...(run.outcome === "stop-limit"
142
+ ? [
143
+ "Observation stopped after repeated signal or exception stops; the process was killed.",
144
+ ]
145
+ : []),
146
+ ...(unresolved.length === 0
147
+ ? []
148
+ : [
149
+ `Breakpoints ${unresolved.join(", ")} matched no code in any image loaded while observing; their calls could not be observed.`,
150
+ ]),
151
+ ...(run.breakpoints.some(({ location_count: count, locations }) => locations.length < count)
152
+ ? [
153
+ "Breakpoints with many matching locations list only the first 64; location_count gives the total.",
154
+ ]
155
+ : []),
156
+ ...(breakpointLocationLimit
157
+ ? [
158
+ "Resolved breakpoint locations exceeded the aggregate 8 MiB metadata budget; omitted locations are counted in location_count. This metadata limit does not change the process outcome.",
159
+ ]
160
+ : []),
161
+ ...(trace.stdout.truncated || trace.stderr.truncated
162
+ ? ["Target output beyond 1 MiB per stream is counted but not kept."]
163
+ : []),
164
+ ...(!trace.stdout.complete || !trace.stderr.complete
165
+ ? [
166
+ "Target output draining did not complete; reported byte counts are observed lower bounds, not stream totals.",
167
+ ]
168
+ : []),
169
+ ...(run.terminated && trace.terminated
170
+ ? []
171
+ : [
172
+ `REA could not confirm that process ${run.pid} exited; check for it before relying on host state.`,
173
+ ]),
174
+ ],
175
+ });
176
+ };
177
+ const fileSha256 = async (path, signal) => {
178
+ const handle = await open(path, "r");
179
+ try {
180
+ const hash = createHash("sha256");
181
+ const buffer = new Uint8Array(1024 * 1024);
182
+ for (;;) {
183
+ signal?.throwIfAborted();
184
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, null);
185
+ if (bytesRead === 0)
186
+ break;
187
+ hash.update(buffer.subarray(0, bytesRead));
188
+ }
189
+ return hash.digest("hex");
190
+ }
191
+ finally {
192
+ await handle.close();
193
+ }
194
+ };
@@ -2,12 +2,14 @@ import { NATIVE_MACOS_PROVIDER_IDENTITY as IDENTITY, nativeMacOSCapabilities, }
2
2
  export { NATIVE_MACOS_PROVIDER_IDENTITY } from "./NativeMacOSProviderMetadata.js";
3
3
  import { inspectAppleDispatchMetadata } from "./AppleDispatchMetadata.js";
4
4
  import { observeNativeUi } from "./NativeUiObservation.js";
5
+ import { LldbCallTracer } from "./LldbCallTracer.js";
6
+ import { observeNativeCalls } from "./NativeCallObservation.js";
5
7
  import { dirname, isAbsolute, resolve } from "node:path";
6
8
  import { open, realpath, stat } from "node:fs/promises";
7
9
  import { z } from "zod";
8
10
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
9
11
  import { NATIVE_TOOL_CONTRACTS, } from "../contracts/native/nativeToolContracts.js";
10
- import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
12
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, AnalysisResourceConstraintError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
11
13
  import { BinaryTargetError } from "../domain/configurationErrors.js";
12
14
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
13
15
  import { AnalysisError } from "../domain/analysisErrorBase.js";
@@ -15,7 +17,8 @@ import { jsonValueSchema } from "../domain/jsonValue.js";
15
17
  import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../domain/propertyListKeys.js";
16
18
  import { demangleSwiftSchema, inspectPlistSchema, inspectSignatureSchema, listArchitecturesSchema, } from "../domain/native/nativeInspection.js";
17
19
  import { err, ok } from "../domain/result.js";
18
- import { NativeCommandFailure, XcrunCommandRunner, } from "./CommandRunner.js";
20
+ import { NATIVE_COMMAND_TIMEOUT_MS, NATIVE_COMMAND_OUTPUT_BUDGET_BYTES, NativeCommandFailure, XcrunCommandRunner, } from "./CommandRunner.js";
21
+ import { withSignatureTarget, verifySignatureTarget, } from "./SignatureTargetBinding.js";
19
22
  import { parseCodeSignature } from "./parsers/codesign.js";
20
23
  import { parseDemangledSymbols } from "./parsers/demangle.js";
21
24
  import { parseLipoArchitectures } from "./parsers/lipo.js";
@@ -24,9 +27,11 @@ import { architectureLocations, inspectNativeMacho, } from "./NativeMachoInspect
24
27
  /** Read-only semantic provider composed from Xcode command-line utilities. */
25
28
  export class NativeMacOSProvider {
26
29
  runner;
30
+ tracer;
27
31
  #capabilities;
28
- constructor(runner = new XcrunCommandRunner(), platform = process.platform) {
32
+ constructor(runner = new XcrunCommandRunner(), platform = process.platform, tracer = new LldbCallTracer()) {
29
33
  this.runner = runner;
34
+ this.tracer = tracer;
30
35
  this.#capabilities = nativeMacOSCapabilities(platform);
31
36
  }
32
37
  identity() {
@@ -36,15 +41,17 @@ export class NativeMacOSProvider {
36
41
  return this.#capabilities;
37
42
  }
38
43
  createClient(target) {
39
- return new NativeMacOSClient(target, this.runner);
44
+ return new NativeMacOSClient(target, this.runner, this.tracer);
40
45
  }
41
46
  }
42
47
  class NativeMacOSClient {
43
48
  target;
44
49
  runner;
45
- constructor(target, runner) {
50
+ tracer;
51
+ constructor(target, runner, tracer) {
46
52
  this.target = target;
47
53
  this.runner = runner;
54
+ this.tracer = tracer;
48
55
  }
49
56
  async execute(operation, parameters, options) {
50
57
  if (options?.signal?.aborted === true)
@@ -83,6 +90,15 @@ class NativeMacOSClient {
83
90
  }
84
91
  if (!isNativeOperation(operation))
85
92
  return err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "Operation is not implemented by native macOS tools."));
93
+ if (operation === "observe_native_calls") {
94
+ const result = await observeNativeCalls(this.target, parameters, this.tracer, options?.signal);
95
+ return result.ok
96
+ ? ok(createAnalysisExecution(result.value, IDENTITY, {
97
+ limitations: result.value.limitations,
98
+ locations: [{ kind: "artifact-path", path: this.target.path }],
99
+ }))
100
+ : result;
101
+ }
86
102
  if (operation === "observe_native_ui" ||
87
103
  operation === "capture_native_ui_scenario") {
88
104
  const result = await observeNativeUi(this.target, operation, parameters, {
@@ -117,6 +133,7 @@ class NativeMacOSClient {
117
133
  switch (operation) {
118
134
  case "observe_native_ui":
119
135
  case "capture_native_ui_scenario":
136
+ case "observe_native_calls":
120
137
  return Promise.resolve(err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "UI observation uses its explicit authority boundary")));
121
138
  case "inspect_macho":
122
139
  return this.#inspectMacho(signal);
@@ -176,20 +193,23 @@ class NativeMacOSClient {
176
193
  });
177
194
  }
178
195
  async #inspectSignature(signal) {
179
- const display = await this.#run("inspect_signature", "codesign", ["-d", "--verbose=4", this.target.path], { signal, acceptNonZero: true });
196
+ return withSignatureTarget(this.target, (binding) => this.#inspectBoundSignature(binding, signal), signal);
197
+ }
198
+ async #inspectBoundSignature(binding, signal) {
199
+ const display = await this.#captureSignature(binding, ["-d", "--verbose=4"], signal);
180
200
  if (!display.ok)
181
201
  return display;
182
202
  const unsigned = isNonzeroUnsignedObservation(display.value);
183
203
  const displayFailure = codeSignCaptureFailure(display.value);
184
204
  if (displayFailure !== null)
185
205
  return err(displayFailure);
186
- const requirements = await this.#run("inspect_signature", "codesign", ["-d", "-r-", this.target.path], { signal, acceptNonZero: true });
206
+ const requirements = await this.#captureSignature(binding, ["-d", "-r-"], signal);
187
207
  if (!requirements.ok)
188
208
  return requirements;
189
209
  const requirementsFailure = codeSignCaptureFailure(requirements.value);
190
210
  if (requirementsFailure !== null)
191
211
  return err(requirementsFailure);
192
- const entitlements = await this.#run("inspect_signature", "codesign", ["-d", "--entitlements", ":-", this.target.path], { signal, acceptNonZero: true });
212
+ const entitlements = await this.#captureSignature(binding, ["-d", "--entitlements", ":-"], signal);
193
213
  if (!entitlements.ok)
194
214
  return entitlements;
195
215
  const entitlementsFailure = codeSignCaptureFailure(entitlements.value);
@@ -197,8 +217,8 @@ class NativeMacOSClient {
197
217
  return err(entitlementsFailure);
198
218
  // codesign echoes the resolved executable path in its diagnostics.
199
219
  const parsed = parseCodeSignature(display.value.stderr, unsigned, [
200
- this.target.path,
201
- ...(await canonicalPath(this.target.path)),
220
+ binding.snapshotPath,
221
+ ...(await canonicalPath(binding.snapshotPath)),
202
222
  ]);
203
223
  // The requirement is printed to stdout; stderr echoes the path.
204
224
  const requirementText = /designated\s*=>\s*(.+)$/mu.exec(requirements.value.stdout)?.[1] ?? null;
@@ -207,6 +227,7 @@ class NativeMacOSClient {
207
227
  const captures = [display.value, requirements.value, entitlements.value];
208
228
  const limitations = [
209
229
  ...parsed.limitations,
230
+ "Inspected a digest-verified Mach-O byte snapshot; filesystem-bound signing context and trust validation are not examined.",
210
231
  ...(entitlementValue.omittedPrototypeKeys === 0
211
232
  ? []
212
233
  : [
@@ -217,13 +238,19 @@ class NativeMacOSClient {
217
238
  (isNonzeroUnsignedObservation(requirements.value) ||
218
239
  isNonzeroUnsignedObservation(entitlements.value));
219
240
  if (mixedSigning) {
220
- const slices = await this.#inspectMixedSignatureSlices(parsed.format, requirements.value.exitCode !== 0, entitlements.value.exitCode !== 0, signal);
241
+ const slices = await this.#inspectMixedSignatureSlices(binding, parsed.format, {
242
+ requirements: requirements.value.exitCode,
243
+ entitlements: entitlements.value.exitCode,
244
+ }, signal);
221
245
  if (!slices.ok)
222
246
  return slices;
223
247
  captures.push(...slices.value.captures);
224
248
  limitations.push(...slices.value.limitations);
225
249
  }
226
- const provenance = captures.map((capture) => invocation(capture, this.target.path));
250
+ const provenance = captures.map((capture) => invocation(capture, binding.snapshotPath));
251
+ const version = await verifySignatureTarget(this.target, binding, signal);
252
+ if (!version.ok)
253
+ return version;
227
254
  const result = inspectSignatureSchema.parse({
228
255
  ...parsed,
229
256
  designated_requirement: requirementText,
@@ -238,12 +265,12 @@ class NativeMacOSClient {
238
265
  locations: [],
239
266
  });
240
267
  }
241
- async #inspectMixedSignatureSlices(format, requirementsUnavailable, entitlementsUnavailable, signal) {
268
+ async #inspectMixedSignatureSlices(binding, format, aggregateExits, signal) {
242
269
  const captures = [];
243
270
  const unsigned = [];
244
271
  const unclassified = [];
245
272
  for (const architecture of codeSignArchitectures(format, this.target)) {
246
- const slice = await this.#run("inspect_signature", "codesign", ["-d", "-a", architecture, "--verbose=4", this.target.path], { signal, acceptNonZero: true });
273
+ const slice = await this.#captureSignature(binding, ["-d", "-a", architecture, "--verbose=4"], signal);
247
274
  if (!slice.ok)
248
275
  return slice;
249
276
  captures.push(slice.value);
@@ -261,12 +288,38 @@ class NativeMacOSClient {
261
288
  ];
262
289
  if (unclassified.length > 0)
263
290
  limitations.push(`Signature state could not be classified for Mach-O slices: ${unclassified.join(", ")}.`);
264
- if (requirementsUnavailable)
291
+ if (aggregateExits.requirements !== 0)
265
292
  limitations.push("The aggregate designated requirement is unavailable because Mach-O slices have mixed signing states.");
266
- if (entitlementsUnavailable)
293
+ if (aggregateExits.entitlements !== 0)
267
294
  limitations.push("The aggregate entitlements are unavailable because Mach-O slices have mixed signing states.");
268
295
  return ok({ captures, limitations });
269
296
  }
297
+ async #captureSignature(binding, args, signal) {
298
+ const before = await verifySignatureTarget(this.target, binding, signal);
299
+ if (!before.ok)
300
+ return before;
301
+ let capture;
302
+ try {
303
+ capture = await this.#run("inspect_signature", "codesign", [...args, binding.snapshotPath], {
304
+ signal,
305
+ acceptNonZero: true,
306
+ });
307
+ }
308
+ catch (cause) {
309
+ capture = err(new ProviderAdapterError(IDENTITY.id, "inspect_signature", {
310
+ cause,
311
+ diagnostics: {
312
+ phase: "codesign-capture",
313
+ path: this.target.path,
314
+ reason: cause instanceof Error ? cause.message : String(cause),
315
+ },
316
+ }));
317
+ }
318
+ // Verify failed captures too: a disappearing target is not a codesign
319
+ // execution failure, and later captures must never use another version.
320
+ const after = await verifySignatureTarget(this.target, binding, signal);
321
+ return after.ok ? capture : after;
322
+ }
270
323
  async #inspectPlist(parameters, signal) {
271
324
  const requested = parameters.path;
272
325
  if (requested !== undefined && typeof requested !== "string")
@@ -350,13 +403,57 @@ class NativeMacOSClient {
350
403
  }
351
404
  const isNativeOperation = (operation) => NATIVE_TOOL_CONTRACTS.some(({ name }) => name === operation);
352
405
  const translateCommandFailure = (operation, failure) => {
406
+ const capturedOutput = failure.capture === null
407
+ ? undefined
408
+ : {
409
+ stdout: failure.capture.stdout,
410
+ stderr: failure.capture.stderr,
411
+ truncated: failure.capture.truncated,
412
+ stdout_bytes: failure.capture.stdoutBytes,
413
+ stderr_bytes: failure.capture.stderrBytes,
414
+ exit_code: failure.capture.exitCode,
415
+ signal: failure.capture.signal,
416
+ };
417
+ const cleanup = failure.cleanupFailure === null
418
+ ? undefined
419
+ : {
420
+ reason: failure.cleanupFailure,
421
+ resources: [...failure.cleanupResources],
422
+ };
423
+ const errorOptions = {
424
+ ...(capturedOutput === undefined ? {} : { capturedOutput }),
425
+ ...(cleanup === undefined ? {} : { cleanup }),
426
+ };
353
427
  if (failure.reason === "unavailable")
354
- return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, `${failure.tool} is unavailable through xcrun.`);
428
+ return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, `${failure.tool} is unavailable through xcrun.`, errorOptions);
355
429
  if (failure.reason === "cancelled")
356
- return new AnalysisCancelledError(operation);
357
- return new ProviderAdapterError(IDENTITY.id, operation, { cause: failure });
430
+ return new AnalysisCancelledError(operation, errorOptions);
431
+ if (failure.reason === "timeout")
432
+ return new AnalysisTimeoutError(operation, NATIVE_COMMAND_TIMEOUT_MS, errorOptions);
433
+ if (failure.reason === "output-limit")
434
+ return new AnalysisResourceConstraintError(operation, "memory", `Native command output exceeded ${String(NATIVE_COMMAND_OUTPUT_BUDGET_BYTES)} bytes; complete output is required for analysis.`, { max_output_bytes: NATIVE_COMMAND_OUTPUT_BUDGET_BYTES }, errorOptions);
435
+ return new ProviderAdapterError(IDENTITY.id, operation, {
436
+ cause: failure,
437
+ ...errorOptions,
438
+ diagnostics: {
439
+ tool: failure.tool,
440
+ reason: failure.reason,
441
+ exit_code: failure.capture?.exitCode ?? failure.exitCode,
442
+ signal: failure.capture?.signal ?? null,
443
+ stdout_bytes: failure.capture?.stdoutBytes ?? 0,
444
+ stderr_bytes: failure.capture?.stderrBytes ?? 0,
445
+ },
446
+ });
358
447
  };
359
- const translateCodeSignExitFailure = (capture) => translateCommandFailure("inspect_signature", new NativeCommandFailure("codesign", "nonzero-exit", capture.exitCode));
448
+ const translateCodeSignExitFailure = (capture) => translateCommandFailure("inspect_signature", new NativeCommandFailure("codesign", "nonzero-exit", capture.exitCode, undefined, {
449
+ stdout: capture.stdout,
450
+ stderr: capture.stderr,
451
+ stdoutBytes: capture.stdoutBytes,
452
+ stderrBytes: capture.stderrBytes,
453
+ exitCode: capture.exitCode,
454
+ signal: capture.signal,
455
+ truncated: false,
456
+ }));
360
457
  const commandOutput = (capture) => `${capture.stdout}\n${capture.stderr}`;
361
458
  /**
362
459
  * A signed artifact exits zero; its diagnostics can still contain this text
@@ -6,6 +6,11 @@ export const NATIVE_MACOS_PROVIDER_IDENTITY = Object.freeze({
6
6
  version: null,
7
7
  });
8
8
  const IDENTITY = NATIVE_MACOS_PROVIDER_IDENTITY;
9
+ /** Operations whose target process can show UI, use the network and write files. */
10
+ const OWNED_PROCESS_OPERATIONS = new Set([
11
+ "capture_native_ui_scenario",
12
+ "observe_native_calls",
13
+ ]);
9
14
  /** Declare native host coverage without creating a command runner. */
10
15
  export const nativeMacOSCapabilities = (platform = process.platform) => {
11
16
  const available = platform === "darwin";
@@ -27,9 +32,9 @@ export const nativeMacOSCapabilities = (platform = process.platform) => {
27
32
  effects: Object.freeze({
28
33
  mutatesArtifact: false,
29
34
  launchesProcess: contract.name !== "inspect_native_dispatch_metadata",
30
- mayShowUi: contract.name === "capture_native_ui_scenario",
31
- mayAccessNetwork: contract.name === "capture_native_ui_scenario",
32
- mayWriteFilesystem: contract.name === "capture_native_ui_scenario" ||
35
+ mayShowUi: OWNED_PROCESS_OPERATIONS.has(contract.name),
36
+ mayAccessNetwork: OWNED_PROCESS_OPERATIONS.has(contract.name),
37
+ mayWriteFilesystem: OWNED_PROCESS_OPERATIONS.has(contract.name) ||
33
38
  contract.name === "observe_native_ui",
34
39
  changesPermissions: false,
35
40
  requiresRoot: false,