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
@@ -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
+ };
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { open } from "node:fs/promises";
3
3
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, } from "../domain/analysisErrorCore.js";
4
4
  import { EvidenceIntegrityError } from "../domain/evidenceErrors.js";
5
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
5
6
  import { nativeCallObservationInputSchema, nativeCallObservationResultSchema, } from "../domain/native/nativeCallObservation.js";
6
7
  import { err, ok } from "../domain/result.js";
7
8
  const OPERATION = "observe_native_calls";
@@ -15,26 +16,42 @@ export const NATIVE_CALL_OBSERVATION_LIMITATIONS = [
15
16
  "The observation window is checked about once a second, and recording pauses the process at every entry, which slows it.",
16
17
  ];
17
18
  /** Launch the active Mach-O under LLDB, record requested call entries, then stop it. */
18
- export const observeNativeCalls = async (target, parameters, tracer, signal) => {
19
+ export const observeNativeCalls = async (target, parameters, tracer, signal, readTargetDigest = fileSha256) => {
19
20
  if (target.kind !== "executable" || target.format !== "mach-o")
20
21
  return err(new AnalysisCapabilityUnavailableError("native-macos", OPERATION, "Native call observation launches a Mach-O executable; the active target is not one"));
21
22
  const parsed = nativeCallObservationInputSchema.safeParse(parameters);
22
23
  if (!parsed.success)
23
24
  return err(new AnalysisInputError(OPERATION, { cause: parsed.error }));
24
25
  // Observe the bytes the session's other Evidence describes.
25
- if ((await fileSha256(target.path, signal)) !== target.sha256)
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)
26
41
  return err(new EvidenceIntegrityError("Native call observation target digest changed after session binding"));
27
42
  if (signal?.aborted === true)
28
43
  return err(new AnalysisCancelledError(OPERATION));
29
44
  const traced = await tracer.trace({
30
45
  executable: target.path,
31
46
  architecture: target.architecture,
47
+ expectedSha256: target.sha256,
32
48
  input: parsed.data,
33
49
  }, signal);
34
50
  if (!traced.ok)
35
51
  return traced;
36
52
  return ok(projectNativeCalls(target, parsed.data, traced.value));
37
53
  };
54
+ const isAbortError = (cause) => cause instanceof Error && cause.name === "AbortError";
38
55
  /** Join the request, the tracer's run and REA's own checks into the result contract. */
39
56
  export const projectNativeCalls = (target, input, trace) => {
40
57
  const { run } = trace;
@@ -42,14 +59,31 @@ export const projectNativeCalls = (target, input, trace) => {
42
59
  .filter(({ location_count: count }) => count === 0)
43
60
  .map(({ index }) => index);
44
61
  const eventLimit = run.outcome === "event-limit";
45
- const partial = eventLimit || run.outcome === "stop-limit" || unresolved.length > 0;
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;
46
70
  return nativeCallObservationResultSchema.parse({
47
71
  target: {
48
72
  path: target.path,
49
73
  sha256: target.sha256,
50
74
  architecture: target.architecture,
51
75
  arguments: input.arguments,
76
+ environment: input.environment,
52
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
+ },
53
87
  },
54
88
  debugger: trace.debugger,
55
89
  process: {
@@ -75,20 +109,35 @@ export const projectNativeCalls = (target, input, trace) => {
75
109
  coverage: {
76
110
  status: partial ? "partial" : "complete",
77
111
  event_limit_reached: eventLimit,
112
+ resource_limit_reached: resourceLimit,
113
+ ...(breakpointLocationLimit
114
+ ? { breakpoint_locations_truncated: true }
115
+ : {}),
78
116
  unresolved_breakpoints: unresolved,
79
117
  },
80
118
  limitations: [
81
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.",
82
121
  ...(eventLimit
83
122
  ? [
84
123
  `Observation stopped at max_events (${input.max_events}); later calls were not recorded and the process was killed.`,
85
124
  ]
86
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
+ : []),
87
131
  ...(run.outcome === "duration-elapsed"
88
132
  ? [
89
133
  `The process was still running after duration_ms (${input.duration_ms}) and was killed.`,
90
134
  ]
91
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
+ ]),
92
141
  ...(run.outcome === "stop-limit"
93
142
  ? [
94
143
  "Observation stopped after repeated signal or exception stops; the process was killed.",
@@ -104,9 +153,19 @@ export const projectNativeCalls = (target, input, trace) => {
104
153
  "Breakpoints with many matching locations list only the first 64; location_count gives the total.",
105
154
  ]
106
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
+ : []),
107
161
  ...(trace.stdout.truncated || trace.stderr.truncated
108
162
  ? ["Target output beyond 1 MiB per stream is counted but not kept."]
109
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
+ : []),
110
169
  ...(run.terminated && trace.terminated
111
170
  ? []
112
171
  : [
@@ -1,5 +1,5 @@
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
1
2
  import { NATIVE_MACOS_PROVIDER_IDENTITY as IDENTITY, nativeMacOSCapabilities, } from "./NativeMacOSProviderMetadata.js";
2
- export { NATIVE_MACOS_PROVIDER_IDENTITY } from "./NativeMacOSProviderMetadata.js";
3
3
  import { inspectAppleDispatchMetadata } from "./AppleDispatchMetadata.js";
4
4
  import { observeNativeUi } from "./NativeUiObservation.js";
5
5
  import { LldbCallTracer } from "./LldbCallTracer.js";
@@ -9,7 +9,9 @@ import { open, realpath, stat } from "node:fs/promises";
9
9
  import { z } from "zod";
10
10
  import { createAnalysisExecution, } from "../application/AnalysisProvider.js";
11
11
  import { NATIVE_TOOL_CONTRACTS, } from "../contracts/native/nativeToolContracts.js";
12
- import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
12
+ import { toolContract } from "../contracts/toolContracts.js";
13
+ import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
14
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, AnalysisResourceConstraintError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
13
15
  import { BinaryTargetError } from "../domain/configurationErrors.js";
14
16
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
15
17
  import { AnalysisError } from "../domain/analysisErrorBase.js";
@@ -17,7 +19,8 @@ import { jsonValueSchema } from "../domain/jsonValue.js";
17
19
  import { omittedPrototypeKeysLimitation, parseXmlPropertyList, } from "../domain/propertyListKeys.js";
18
20
  import { demangleSwiftSchema, inspectPlistSchema, inspectSignatureSchema, listArchitecturesSchema, } from "../domain/native/nativeInspection.js";
19
21
  import { err, ok } from "../domain/result.js";
20
- import { NativeCommandFailure, XcrunCommandRunner, } from "./CommandRunner.js";
22
+ import { NATIVE_COMMAND_TIMEOUT_MS, NATIVE_COMMAND_OUTPUT_BUDGET_BYTES, NativeCommandFailure, XcrunCommandRunner, } from "./CommandRunner.js";
23
+ import { withSignatureTarget, verifySignatureTarget, } from "./SignatureTargetBinding.js";
21
24
  import { parseCodeSignature } from "./parsers/codesign.js";
22
25
  import { parseDemangledSymbols } from "./parsers/demangle.js";
23
26
  import { parseLipoArchitectures } from "./parsers/lipo.js";
@@ -28,9 +31,11 @@ export class NativeMacOSProvider {
28
31
  runner;
29
32
  tracer;
30
33
  #capabilities;
31
- constructor(runner = new XcrunCommandRunner(), platform = process.platform, tracer = new LldbCallTracer()) {
34
+ #environment;
35
+ constructor(environment, runner = new XcrunCommandRunner(environment), platform = process.platform, tracer = new LldbCallTracer(environment)) {
32
36
  this.runner = runner;
33
37
  this.tracer = tracer;
38
+ this.#environment = snapshotEnvironment(environment, platform);
34
39
  this.#capabilities = nativeMacOSCapabilities(platform);
35
40
  }
36
41
  identity() {
@@ -40,17 +45,19 @@ export class NativeMacOSProvider {
40
45
  return this.#capabilities;
41
46
  }
42
47
  createClient(target) {
43
- return new NativeMacOSClient(target, this.runner, this.tracer);
48
+ return new NativeMacOSClient(target, this.runner, this.tracer, this.#environment);
44
49
  }
45
50
  }
46
51
  class NativeMacOSClient {
47
52
  target;
48
53
  runner;
49
54
  tracer;
50
- constructor(target, runner, tracer) {
55
+ environment;
56
+ constructor(target, runner, tracer, environment) {
51
57
  this.target = target;
52
58
  this.runner = runner;
53
59
  this.tracer = tracer;
60
+ this.environment = environment;
54
61
  }
55
62
  async execute(operation, parameters, options) {
56
63
  if (options?.signal?.aborted === true)
@@ -58,16 +65,15 @@ class NativeMacOSClient {
58
65
  if (operation === "health")
59
66
  return ok(createAnalysisExecution(null, IDENTITY));
60
67
  if (operation === "inspect_native_dispatch_metadata") {
68
+ const input = toolContract(operation).inputSchema.safeParse(parameters);
69
+ if (!input.success)
70
+ return err(analysisInputErrorFromIssues(operation, input.error.issues, parameters, {
71
+ cause: input.error,
72
+ }));
61
73
  if (this.target.kind !== "executable" || this.target.format !== "mach-o")
62
74
  return err(new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, "Binary Apple metadata requires Mach-O; other providers can report symbol-only metadata"));
63
75
  try {
64
- const maxRecords = z
65
- .number()
66
- .int()
67
- .min(1)
68
- .max(20000)
69
- .parse(parameters.max_records ?? 5000);
70
- const result = await inspectAppleDispatchMetadata(this.target, maxRecords, options?.signal);
76
+ const result = await inspectAppleDispatchMetadata(this.target, input.data.max_records, options?.signal);
71
77
  return ok(createAnalysisExecution(result, result.provider, {
72
78
  locations: [{ kind: "artifact-path", path: this.target.path }],
73
79
  limitations: result.result.coverage.flatMap(({ reason }) => reason === null ? [] : [reason]),
@@ -101,6 +107,7 @@ class NativeMacOSClient {
101
107
  if (operation === "observe_native_ui" ||
102
108
  operation === "capture_native_ui_scenario") {
103
109
  const result = await observeNativeUi(this.target, operation, parameters, {
110
+ environment: this.environment,
104
111
  signal: options?.signal,
105
112
  });
106
113
  return result.ok
@@ -126,7 +133,7 @@ class NativeMacOSClient {
126
133
  }
127
134
  }
128
135
  close() {
129
- return Promise.resolve();
136
+ return Promise.resolve(ok(null));
130
137
  }
131
138
  #dispatch(operation, parameters, signal) {
132
139
  switch (operation) {
@@ -192,20 +199,23 @@ class NativeMacOSClient {
192
199
  });
193
200
  }
194
201
  async #inspectSignature(signal) {
195
- const display = await this.#run("inspect_signature", "codesign", ["-d", "--verbose=4", this.target.path], { signal, acceptNonZero: true });
202
+ return withSignatureTarget(this.target, (binding) => this.#inspectBoundSignature(binding, signal), signal);
203
+ }
204
+ async #inspectBoundSignature(binding, signal) {
205
+ const display = await this.#captureSignature(binding, ["-d", "--verbose=4"], signal);
196
206
  if (!display.ok)
197
207
  return display;
198
208
  const unsigned = isNonzeroUnsignedObservation(display.value);
199
209
  const displayFailure = codeSignCaptureFailure(display.value);
200
210
  if (displayFailure !== null)
201
211
  return err(displayFailure);
202
- const requirements = await this.#run("inspect_signature", "codesign", ["-d", "-r-", this.target.path], { signal, acceptNonZero: true });
212
+ const requirements = await this.#captureSignature(binding, ["-d", "-r-"], signal);
203
213
  if (!requirements.ok)
204
214
  return requirements;
205
215
  const requirementsFailure = codeSignCaptureFailure(requirements.value);
206
216
  if (requirementsFailure !== null)
207
217
  return err(requirementsFailure);
208
- const entitlements = await this.#run("inspect_signature", "codesign", ["-d", "--entitlements", ":-", this.target.path], { signal, acceptNonZero: true });
218
+ const entitlements = await this.#captureSignature(binding, ["-d", "--entitlements", ":-"], signal);
209
219
  if (!entitlements.ok)
210
220
  return entitlements;
211
221
  const entitlementsFailure = codeSignCaptureFailure(entitlements.value);
@@ -213,8 +223,8 @@ class NativeMacOSClient {
213
223
  return err(entitlementsFailure);
214
224
  // codesign echoes the resolved executable path in its diagnostics.
215
225
  const parsed = parseCodeSignature(display.value.stderr, unsigned, [
216
- this.target.path,
217
- ...(await canonicalPath(this.target.path)),
226
+ binding.snapshotPath,
227
+ ...(await canonicalPath(binding.snapshotPath)),
218
228
  ]);
219
229
  // The requirement is printed to stdout; stderr echoes the path.
220
230
  const requirementText = /designated\s*=>\s*(.+)$/mu.exec(requirements.value.stdout)?.[1] ?? null;
@@ -223,6 +233,7 @@ class NativeMacOSClient {
223
233
  const captures = [display.value, requirements.value, entitlements.value];
224
234
  const limitations = [
225
235
  ...parsed.limitations,
236
+ "Inspected a digest-verified Mach-O byte snapshot; filesystem-bound signing context and trust validation are not examined.",
226
237
  ...(entitlementValue.omittedPrototypeKeys === 0
227
238
  ? []
228
239
  : [
@@ -233,13 +244,19 @@ class NativeMacOSClient {
233
244
  (isNonzeroUnsignedObservation(requirements.value) ||
234
245
  isNonzeroUnsignedObservation(entitlements.value));
235
246
  if (mixedSigning) {
236
- const slices = await this.#inspectMixedSignatureSlices(parsed.format, requirements.value.exitCode !== 0, entitlements.value.exitCode !== 0, signal);
247
+ const slices = await this.#inspectMixedSignatureSlices(binding, parsed.format, {
248
+ requirements: requirements.value.exitCode,
249
+ entitlements: entitlements.value.exitCode,
250
+ }, signal);
237
251
  if (!slices.ok)
238
252
  return slices;
239
253
  captures.push(...slices.value.captures);
240
254
  limitations.push(...slices.value.limitations);
241
255
  }
242
- const provenance = captures.map((capture) => invocation(capture, this.target.path));
256
+ const provenance = captures.map((capture) => invocation(capture, binding.snapshotPath));
257
+ const version = await verifySignatureTarget(this.target, binding, signal);
258
+ if (!version.ok)
259
+ return version;
243
260
  const result = inspectSignatureSchema.parse({
244
261
  ...parsed,
245
262
  designated_requirement: requirementText,
@@ -254,12 +271,12 @@ class NativeMacOSClient {
254
271
  locations: [],
255
272
  });
256
273
  }
257
- async #inspectMixedSignatureSlices(format, requirementsUnavailable, entitlementsUnavailable, signal) {
274
+ async #inspectMixedSignatureSlices(binding, format, aggregateExits, signal) {
258
275
  const captures = [];
259
276
  const unsigned = [];
260
277
  const unclassified = [];
261
278
  for (const architecture of codeSignArchitectures(format, this.target)) {
262
- const slice = await this.#run("inspect_signature", "codesign", ["-d", "-a", architecture, "--verbose=4", this.target.path], { signal, acceptNonZero: true });
279
+ const slice = await this.#captureSignature(binding, ["-d", "-a", architecture, "--verbose=4"], signal);
263
280
  if (!slice.ok)
264
281
  return slice;
265
282
  captures.push(slice.value);
@@ -277,12 +294,38 @@ class NativeMacOSClient {
277
294
  ];
278
295
  if (unclassified.length > 0)
279
296
  limitations.push(`Signature state could not be classified for Mach-O slices: ${unclassified.join(", ")}.`);
280
- if (requirementsUnavailable)
297
+ if (aggregateExits.requirements !== 0)
281
298
  limitations.push("The aggregate designated requirement is unavailable because Mach-O slices have mixed signing states.");
282
- if (entitlementsUnavailable)
299
+ if (aggregateExits.entitlements !== 0)
283
300
  limitations.push("The aggregate entitlements are unavailable because Mach-O slices have mixed signing states.");
284
301
  return ok({ captures, limitations });
285
302
  }
303
+ async #captureSignature(binding, args, signal) {
304
+ const before = await verifySignatureTarget(this.target, binding, signal);
305
+ if (!before.ok)
306
+ return before;
307
+ let capture;
308
+ try {
309
+ capture = await this.#run("inspect_signature", "codesign", [...args, binding.snapshotPath], {
310
+ signal,
311
+ acceptNonZero: true,
312
+ });
313
+ }
314
+ catch (cause) {
315
+ capture = err(new ProviderAdapterError(IDENTITY.id, "inspect_signature", {
316
+ cause,
317
+ diagnostics: {
318
+ phase: "codesign-capture",
319
+ path: this.target.path,
320
+ reason: cause instanceof Error ? cause.message : String(cause),
321
+ },
322
+ }));
323
+ }
324
+ // Verify failed captures too: a disappearing target is not a codesign
325
+ // execution failure, and later captures must never use another version.
326
+ const after = await verifySignatureTarget(this.target, binding, signal);
327
+ return after.ok ? capture : after;
328
+ }
286
329
  async #inspectPlist(parameters, signal) {
287
330
  const requested = parameters.path;
288
331
  if (requested !== undefined && typeof requested !== "string")
@@ -366,13 +409,59 @@ class NativeMacOSClient {
366
409
  }
367
410
  const isNativeOperation = (operation) => NATIVE_TOOL_CONTRACTS.some(({ name }) => name === operation);
368
411
  const translateCommandFailure = (operation, failure) => {
369
- if (failure.reason === "unavailable")
370
- return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, `${failure.tool} is unavailable through xcrun.`);
412
+ const capturedOutput = failure.capture === null
413
+ ? undefined
414
+ : {
415
+ stdout: failure.capture.stdout,
416
+ stderr: failure.capture.stderr,
417
+ truncated: failure.capture.truncated,
418
+ stdout_bytes: failure.capture.stdoutBytes,
419
+ stderr_bytes: failure.capture.stderrBytes,
420
+ exit_code: failure.capture.exitCode,
421
+ signal: failure.capture.signal,
422
+ };
423
+ const cleanup = failure.cleanupFailure === null
424
+ ? undefined
425
+ : {
426
+ reason: failure.cleanupFailure,
427
+ resources: [...failure.cleanupResources],
428
+ };
429
+ const errorOptions = {
430
+ ...(capturedOutput === undefined ? {} : { capturedOutput }),
431
+ ...(cleanup === undefined ? {} : { cleanup }),
432
+ };
433
+ if (failure.reason === "unavailable") {
434
+ const reason = `${failure.tool} is unavailable through xcrun.`;
435
+ return new AnalysisCapabilityUnavailableError(IDENTITY.id, operation, reason, { ...errorOptions, userMessage: reason });
436
+ }
371
437
  if (failure.reason === "cancelled")
372
- return new AnalysisCancelledError(operation);
373
- return new ProviderAdapterError(IDENTITY.id, operation, { cause: failure });
438
+ return new AnalysisCancelledError(operation, errorOptions);
439
+ if (failure.reason === "timeout")
440
+ return new AnalysisTimeoutError(operation, NATIVE_COMMAND_TIMEOUT_MS, errorOptions);
441
+ if (failure.reason === "output-limit")
442
+ 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);
443
+ return new ProviderAdapterError(IDENTITY.id, operation, {
444
+ cause: failure,
445
+ ...errorOptions,
446
+ diagnostics: {
447
+ tool: failure.tool,
448
+ reason: failure.reason,
449
+ exit_code: failure.capture?.exitCode ?? failure.exitCode,
450
+ signal: failure.capture?.signal ?? null,
451
+ stdout_bytes: failure.capture?.stdoutBytes ?? 0,
452
+ stderr_bytes: failure.capture?.stderrBytes ?? 0,
453
+ },
454
+ });
374
455
  };
375
- const translateCodeSignExitFailure = (capture) => translateCommandFailure("inspect_signature", new NativeCommandFailure("codesign", "nonzero-exit", capture.exitCode));
456
+ const translateCodeSignExitFailure = (capture) => translateCommandFailure("inspect_signature", new NativeCommandFailure("codesign", "nonzero-exit", capture.exitCode, undefined, {
457
+ stdout: capture.stdout,
458
+ stderr: capture.stderr,
459
+ stdoutBytes: capture.stdoutBytes,
460
+ stderrBytes: capture.stderrBytes,
461
+ exitCode: capture.exitCode,
462
+ signal: capture.signal,
463
+ truncated: false,
464
+ }));
376
465
  const commandOutput = (capture) => `${capture.stdout}\n${capture.stderr}`;
377
466
  /**
378
467
  * A signed artifact exits zero; its diagnostics can still contain this text
@@ -432,8 +521,10 @@ const parseEntitlements = (output) => {
432
521
  */
433
522
  const unreadablePlist = (path, requested, reason) => {
434
523
  const sentence = reason.endsWith(".") ? reason : `${reason}.`;
524
+ // Name the default that is missing and the selection that still works.
525
+ const missingDefault = `The target has no readable Contents/Info.plist at ${path}: ${sentence} Select another plist in the target with the path input (CLI: --relative-path).`;
435
526
  return requested === undefined
436
- ? new AnalysisCapabilityUnavailableError(IDENTITY.id, "inspect_plist", `The target has no readable Contents/Info.plist at ${path}: ${sentence} Pass path to inspect another plist.`)
527
+ ? new AnalysisCapabilityUnavailableError(IDENTITY.id, "inspect_plist", missingDefault, { userMessage: missingDefault })
437
528
  : new AnalysisInputError("inspect_plist", undefined, [
438
529
  {
439
530
  path: ["path"],
@@ -1,12 +1,15 @@
1
- import { mkdtemp, rm, symlink } from "node:fs/promises";
1
+ import { snapshotEnvironment } from "../process/snapshotEnvironment.js";
2
+ import { mkdir, mkdtemp, rm, symlink } from "node:fs/promises";
2
3
  import { tmpdir } from "node:os";
3
4
  import { join } from "node:path";
4
5
  import { fileURLToPath } from "node:url";
6
+ import { SWIFTC_INTERRUPT } from "../process/DarwinProcessRunTokenReader.js";
5
7
  import { execFileOutput } from "../process/ExecFileOutput.js";
6
8
  import { safeParseJson } from "../domain/safeJson.js";
7
9
  import { NATIVE_UI_HELPER_MAX_BUFFER } from "./NativeUiOutputBudget.js";
8
10
  /** Lazily compile one owned helper per observation/scenario and remove its compiler cache. */
9
- export const createNativeUiHelperRuntime = () => {
11
+ export const createNativeUiHelperRuntime = (environment) => {
12
+ const selectedEnvironment = snapshotEnvironment(environment);
10
13
  let root;
11
14
  let executable;
12
15
  const invoke = async (parameters, signal) => {
@@ -15,6 +18,9 @@ export const createNativeUiHelperRuntime = () => {
15
18
  const output = join(root, "observer");
16
19
  const main = join(root, "main.swift");
17
20
  await symlink(fileURLToPath(new URL("../../bridge/native/ReaNativeUI.swift", import.meta.url)), main);
21
+ // Keep swiftc's intermediate objects inside the removable root.
22
+ const compilerTemporary = join(root, "tmp");
23
+ await mkdir(compilerTemporary);
18
24
  await execFileOutput("/usr/bin/xcrun", [
19
25
  "swiftc",
20
26
  "-module-cache-path",
@@ -26,6 +32,8 @@ export const createNativeUiHelperRuntime = () => {
26
32
  ], {
27
33
  timeout: 60_000,
28
34
  maxBuffer: 1024 * 1024,
35
+ stopSignal: SWIFTC_INTERRUPT,
36
+ env: { ...selectedEnvironment, TMPDIR: compilerTemporary },
29
37
  ...(signal === undefined ? {} : { signal }),
30
38
  });
31
39
  executable = output;
@@ -33,6 +41,7 @@ export const createNativeUiHelperRuntime = () => {
33
41
  const output = await execFileOutput(executable, [JSON.stringify(parameters)], {
34
42
  timeout: 30_000,
35
43
  maxBuffer: NATIVE_UI_HELPER_MAX_BUFFER,
44
+ env: selectedEnvironment,
36
45
  ...(signal === undefined ? {} : { signal }),
37
46
  });
38
47
  const parsed = safeParseJson(output.stdout);