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
@@ -77,11 +77,26 @@ const entrySchema = z.object({
77
77
  subject: subjectSchema.nullable(),
78
78
  }),
79
79
  });
80
+ const workflowEntrySchema = z.object({
81
+ query_id: prefixedDigestSchema("query"),
82
+ operation: z.string().min(1),
83
+ parameters: jsonObjectSchema,
84
+ execution: z.object({
85
+ result: jsonValueSchema,
86
+ raw_result: jsonValueSchema.nullable(),
87
+ provider: committedProviderSchema,
88
+ analysis_profile: analysisProfileSchema,
89
+ limitations: z.array(z.string()),
90
+ locations: z.array(evidenceLocationSchema),
91
+ subject: subjectSchema.nullable(),
92
+ }),
93
+ });
80
94
  /** Provider- and profile-exact cache of successful immutable analysis calls. */
81
95
  export const analysisSnapshotSchema = z.object({
82
96
  target: targetSchema,
83
97
  binding: bindingSchema,
84
98
  entries: z.array(entrySchema),
99
+ workflow_entries: z.array(workflowEntrySchema).optional(),
85
100
  evidence_bundle: evidenceBundleSchema,
86
101
  });
87
102
  const canonicalJson = (value) => {
@@ -122,6 +137,11 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
122
137
  if (!snapshotMatchesBinding(snapshot, target, bindingProfile))
123
138
  return undefined;
124
139
  const encodedParameters = canonicalJson(parameters);
140
+ const queryId = analysisQueryId(snapshot.target, snapshot.binding, operation, parameters);
141
+ const entry = snapshot.entries.find((candidate) => candidate.query_id === queryId);
142
+ const workflowEntry = snapshot.workflow_entries?.find((candidate) => candidate.query_id === queryId);
143
+ if (entry === undefined && workflowEntry === undefined)
144
+ return undefined;
125
145
  return snapshot.evidence_bundle.records.find((record) => record.subject?.digest.sha256 === target.sha256 &&
126
146
  record.operation === operation &&
127
147
  record.provider.id === provider.id &&
@@ -129,8 +149,54 @@ export const snapshotEvidenceForQuery = (snapshot, query) => {
129
149
  record.provider.version === provider.version &&
130
150
  "analysis_profile" in record &&
131
151
  analysisProfilesEqual(record.analysis_profile, evidenceProfile) &&
132
- canonicalJson(record.parameters) === encodedParameters);
152
+ canonicalJson(record.parameters) === encodedParameters &&
153
+ ((entry !== undefined && evidenceMatchesEntry(record, entry, snapshot)) ||
154
+ (workflowEntry !== undefined &&
155
+ evidenceMatchesWorkflowEntry(record, workflowEntry, snapshot))));
156
+ };
157
+ /** Create one exact replay record for a derived application workflow result. */
158
+ export const createAnalysisSnapshotWorkflowEntry = (input) => {
159
+ const { target, binding, operation, parameters, execution } = input;
160
+ if (execution.provider.id !== execution.analysisProfile.provider.id ||
161
+ execution.provider.name !== execution.analysisProfile.provider.name ||
162
+ execution.provider.version !== execution.analysisProfile.provider.version)
163
+ throw new TypeError("Workflow snapshot execution provider does not match its profile");
164
+ return {
165
+ query_id: analysisQueryId(target, binding, operation, parameters),
166
+ operation,
167
+ parameters: jsonObjectSchema.parse(parameters),
168
+ execution: {
169
+ result: execution.result,
170
+ raw_result: execution.rawResult,
171
+ provider: execution.analysisProfile.provider,
172
+ analysis_profile: execution.analysisProfile,
173
+ limitations: [...execution.limitations],
174
+ locations: [...execution.locations],
175
+ subject: execution.subject === null
176
+ ? null
177
+ : {
178
+ ...execution.subject,
179
+ architecture: execution.subject.architecture ?? null,
180
+ },
181
+ },
182
+ };
133
183
  };
184
+ const evidenceMatchesEntry = (evidence, entry, snapshot) => isCorrespondingEvidence(evidence, snapshot) &&
185
+ canonicalJson({
186
+ query: evidenceQueryKey(evidence),
187
+ normalized_result: evidence.normalized_result,
188
+ raw_result: evidence.raw_result,
189
+ limitations: evidence.limitations,
190
+ locations: evidence.locations,
191
+ subject: evidence.subject === null
192
+ ? null
193
+ : {
194
+ local_path: evidence.subject.local_path,
195
+ sha256: evidence.subject.digest.sha256,
196
+ format: evidence.subject.format,
197
+ architecture: evidence.subject.architecture,
198
+ },
199
+ }) === entryEvidenceKey(entry, snapshot.binding);
134
200
  /** Compute the stable lookup key for one provider/profile-specific query. */
135
201
  export const analysisQueryId = (target, binding, operation, parameters) => `query_${createHash("sha256")
136
202
  .update(canonicalJson({ target, binding, operation, parameters }))
@@ -171,7 +237,9 @@ export const parseAnalysisSnapshot = (input) => {
171
237
  throw new TypeError("Analysis snapshot evidence contains records for another target");
172
238
  const ids = new Set();
173
239
  const boundEntries = [];
240
+ const boundWorkflowEntries = [];
174
241
  const index = createEvidenceIndex(parsed);
242
+ const workflowIndex = createWorkflowEvidenceIndex(parsed);
175
243
  for (const entry of parsed.entries) {
176
244
  if (entry.execution.provider.id !== parsed.binding.provider.id ||
177
245
  entry.execution.provider.name !== parsed.binding.provider.name ||
@@ -192,10 +260,41 @@ export const parseAnalysisSnapshot = (input) => {
192
260
  }
193
261
  boundEntries.push(entry);
194
262
  }
263
+ for (const entry of parsed.workflow_entries ?? []) {
264
+ if (entry.execution.provider.id !==
265
+ entry.execution.analysis_profile.provider.id ||
266
+ entry.execution.provider.name !==
267
+ entry.execution.analysis_profile.provider.name ||
268
+ entry.execution.provider.version !==
269
+ entry.execution.analysis_profile.provider.version)
270
+ throw new TypeError("Analysis snapshot workflow entry provider does not match its profile");
271
+ const expected = analysisQueryId(parsed.target, parsed.binding, entry.operation, entry.parameters);
272
+ if (entry.query_id !== expected)
273
+ throw new TypeError("Analysis snapshot workflow query identifier does not match");
274
+ if (ids.has(entry.query_id))
275
+ throw new TypeError("Analysis snapshot contains duplicate queries");
276
+ ids.add(entry.query_id);
277
+ if (!workflowEntryHasMatchingEvidence(entry, workflowIndex)) {
278
+ if (workflowEntryHasCorrespondingEvidence(entry, workflowIndex))
279
+ throw new TypeError(`Analysis snapshot workflow entry ${entry.operation} differs from its Evidence record`);
280
+ continue;
281
+ }
282
+ boundWorkflowEntries.push(entry);
283
+ }
195
284
  const sorted = [...parsed.entries].sort((left, right) => left.query_id.localeCompare(right.query_id));
196
285
  if (JSON.stringify(parsed.entries) !== JSON.stringify(sorted))
197
286
  throw new TypeError("Analysis snapshot entries are not canonical");
198
- return { ...parsed, entries: boundEntries };
287
+ const sortedWorkflows = [...(parsed.workflow_entries ?? [])].sort((left, right) => left.query_id.localeCompare(right.query_id));
288
+ if (parsed.workflow_entries !== undefined &&
289
+ JSON.stringify(parsed.workflow_entries) !== JSON.stringify(sortedWorkflows))
290
+ throw new TypeError("Analysis snapshot workflow entries are not canonical");
291
+ return {
292
+ ...parsed,
293
+ entries: boundEntries,
294
+ ...(parsed.workflow_entries === undefined
295
+ ? {}
296
+ : { workflow_entries: boundWorkflowEntries }),
297
+ };
199
298
  };
200
299
  const createEvidenceIndex = (snapshot) => {
201
300
  const matching = new Set();
@@ -259,5 +358,70 @@ const entryEvidenceKey = (entry, binding) => canonicalJson({
259
358
  architecture: entry.execution.subject.architecture,
260
359
  },
261
360
  });
361
+ const workflowEntryQueryKey = (entry) => canonicalJson({
362
+ operation: entry.operation,
363
+ parameters: entry.parameters,
364
+ provider: entry.execution.provider,
365
+ analysis_profile: entry.execution.analysis_profile,
366
+ });
367
+ const workflowEntryEvidenceKey = (entry) => canonicalJson({
368
+ query: workflowEntryQueryKey(entry),
369
+ normalized_result: entry.execution.result,
370
+ raw_result: entry.execution.raw_result,
371
+ limitations: entry.execution.limitations,
372
+ locations: entry.execution.locations,
373
+ subject: entry.execution.subject === null
374
+ ? null
375
+ : {
376
+ local_path: entry.execution.subject.path,
377
+ sha256: entry.execution.subject.sha256,
378
+ format: entry.execution.subject.format,
379
+ architecture: entry.execution.subject.architecture,
380
+ },
381
+ });
382
+ const isWorkflowEvidence = (evidence, snapshot, entry) => evidence.predicate_type === "rea.analysis" &&
383
+ evidence.confidence === "derived" &&
384
+ evidence.authority === "shipped-artifact" &&
385
+ evidence.subject?.digest.sha256 === snapshot.target.sha256 &&
386
+ "analysis_profile" in evidence &&
387
+ analysisProfilesEqual(evidence.analysis_profile, entry.execution.analysis_profile) &&
388
+ evidence.provider.id === entry.execution.provider.id &&
389
+ evidence.provider.name === entry.execution.provider.name &&
390
+ evidence.provider.version === entry.execution.provider.version;
391
+ const createWorkflowEvidenceIndex = (snapshot) => {
392
+ const matching = new Set();
393
+ const corresponding = new Set();
394
+ for (const evidence of snapshot.evidence_bundle.records) {
395
+ if (evidence.predicate_type !== "rea.analysis" ||
396
+ evidence.confidence !== "derived" ||
397
+ evidence.authority !== "shipped-artifact" ||
398
+ evidence.subject?.digest.sha256 !== snapshot.target.sha256 ||
399
+ !("analysis_profile" in evidence))
400
+ continue;
401
+ corresponding.add(evidenceQueryKey(evidence));
402
+ matching.add(canonicalJson(evidenceContentProjection(evidence)));
403
+ }
404
+ return { matching, corresponding };
405
+ };
406
+ const workflowEntryHasMatchingEvidence = (entry, index) => index.matching.has(workflowEntryEvidenceKey(entry));
407
+ const workflowEntryHasCorrespondingEvidence = (entry, index) => index.corresponding.has(workflowEntryQueryKey(entry));
408
+ const evidenceMatchesWorkflowEntry = (evidence, entry, snapshot) => isWorkflowEvidence(evidence, snapshot, entry) &&
409
+ canonicalJson(evidenceContentProjection(evidence)) ===
410
+ workflowEntryEvidenceKey(entry);
411
+ const evidenceContentProjection = (evidence) => ({
412
+ query: evidenceQueryKey(evidence),
413
+ normalized_result: evidence.normalized_result,
414
+ raw_result: evidence.raw_result,
415
+ limitations: evidence.limitations,
416
+ locations: evidence.locations,
417
+ subject: evidence.subject === null
418
+ ? null
419
+ : {
420
+ local_path: evidence.subject.local_path,
421
+ sha256: evidence.subject.digest.sha256,
422
+ format: evidence.subject.format,
423
+ architecture: evidence.subject.architecture,
424
+ },
425
+ });
262
426
  /** Serialize a validated snapshot with byte-stable canonical entry ordering. */
263
427
  export const serializeAnalysisSnapshot = (snapshot) => `${canonicalJson(parseAnalysisSnapshot(snapshot))}\n`;
@@ -1,9 +1,7 @@
1
1
  import { z } from "zod";
2
+ import { localPathStringSchema } from "../localPath.js";
2
3
  const target = {
3
- path: z
4
- .string()
5
- .min(1)
6
- .describe("Local APK path; the target is never executed"),
4
+ path: localPathStringSchema.describe("Local APK path; the target is never executed"),
7
5
  };
8
6
  const classTarget = {
9
7
  ...target,
@@ -5,6 +5,7 @@ import { parseArtifactInventoryEvidence } from "../artifactInventoryEvidence.js"
5
5
  import { evidenceSchema } from "../evidence.js";
6
6
  import { digestSchema } from "../digests.js";
7
7
  import { prefixedDigestSchema } from "../digests.js";
8
+ import { bridgeCandidateCoverageSchema, projectCartesianCandidates, } from "../bridgeCandidateProjection.js";
8
9
  const evidenceIdSchema = prefixedDigestSchema("ev");
9
10
  const pathSchema = z.string().min(1);
10
11
  const componentSchema = z.strictObject({
@@ -52,6 +53,7 @@ export const androidApplicationProjectionResultSchema = z.strictObject({
52
53
  "unity-convention",
53
54
  ]),
54
55
  })),
56
+ bridge_candidate_coverage: bridgeCandidateCoverageSchema,
55
57
  coverage: z.strictObject({
56
58
  status: z.enum(["complete-within-inventory", "partial"]),
57
59
  inventory_complete: z.boolean(),
@@ -88,6 +90,11 @@ export const projectAndroidApplication = (input) => {
88
90
  "Manifest, resource, signing, and bytecode semantics require a dedicated Android provider; this projection reports exact inventory paths and hashes only.",
89
91
  "Runtime families are inferred from inventory formats and paths; filename suffixes do not establish valid DEX or JVM class bytes.",
90
92
  "Bridge candidates are path-based hypotheses, not decoded JNI declarations or observed runtime calls.",
93
+ ...(bridgeProjection.coverage.status === "partial"
94
+ ? [
95
+ `Bridge candidate pairs exceeded the projection safety budget; ${bridgeProjection.coverage.omitted_candidates} hypotheses are omitted. Component arrays still include every component from the supplied inventory pages.`,
96
+ ]
97
+ : []),
91
98
  ];
92
99
  const withoutId = {
93
100
  root_sha256: inventory.manifest.root_sha256,
@@ -98,8 +105,9 @@ export const projectAndroidApplication = (input) => {
98
105
  components,
99
106
  runtime_families: runtimeFamilies(all),
100
107
  bridge_candidates: bridgeProjection.candidates,
108
+ bridge_candidate_coverage: bridgeProjection.coverage,
101
109
  coverage: {
102
- status: inventory.complete
110
+ status: inventory.complete && bridgeProjection.coverage.status === "complete"
103
111
  ? "complete-within-inventory"
104
112
  : "partial",
105
113
  inventory_complete: inventory.complete,
@@ -141,14 +149,14 @@ const runtimeFamilies = (all) => {
141
149
  return [...families].sort(compare);
142
150
  };
143
151
  const bridgeCandidates = (managed, native) => {
144
- const candidates = managed.flatMap((source) => native.map((target) => ({
145
- managed_path: source.path,
146
- native_path: target.path,
147
- basis: bridgeBasis(target.path),
148
- })));
149
- return {
150
- candidates,
151
- };
152
+ return projectCartesianCandidates({
153
+ groups: [{ left: managed, right: native }],
154
+ createCandidate: (managed_path, target) => ({
155
+ managed_path,
156
+ native_path: target.path,
157
+ basis: bridgeBasis(target.path),
158
+ }),
159
+ });
152
160
  };
153
161
  const bridgeBasis = (path) => {
154
162
  const lower = path.toLowerCase();
@@ -6,6 +6,7 @@ import { parseArtifactInventoryEvidence } from "../artifactInventoryEvidence.js"
6
6
  import { evidenceSchema } from "../evidence.js";
7
7
  import { digestSchema } from "../digests.js";
8
8
  import { prefixedDigestSchema } from "../digests.js";
9
+ import { bridgeCandidateCoverageSchema, projectCartesianCandidates, } from "../bridgeCandidateProjection.js";
9
10
  const evidenceIdSchema = prefixedDigestSchema("ev");
10
11
  const pathSchema = z.string().min(1);
11
12
  const APPLE_ROOT_FORMATS = ["ipa", "directory", "zip", "dmg"];
@@ -52,6 +53,7 @@ export const appleApplicationProjectionResultSchema = z.strictObject({
52
53
  "unity-convention",
53
54
  ]),
54
55
  })),
56
+ bridge_candidate_coverage: bridgeCandidateCoverageSchema,
55
57
  coverage: z.strictObject({
56
58
  status: z.enum(["complete-within-inventory", "partial"]),
57
59
  inventory_complete: z.boolean(),
@@ -110,6 +112,7 @@ export const projectAppleApplication = (input) => {
110
112
  sidecars: entries.some(({ path }) => isSidecar(path)),
111
113
  symlinks: entries.some(({ kind }) => kind === "symlink"),
112
114
  unattributed,
115
+ bridgeCandidateCoverage: bridgeProjection.coverage,
113
116
  });
114
117
  const withoutId = {
115
118
  root_sha256: inventory.manifest.root_sha256,
@@ -127,8 +130,9 @@ export const projectAppleApplication = (input) => {
127
130
  .sort(compare),
128
131
  runtime_families: runtimeFamilies,
129
132
  bridge_candidates: bridgeProjection.candidates,
133
+ bridge_candidate_coverage: bridgeProjection.coverage,
130
134
  coverage: {
131
- status: complete
135
+ status: complete && bridgeProjection.coverage.status === "complete"
132
136
  ? "complete-within-inventory"
133
137
  : "partial",
134
138
  inventory_complete: inventory.complete,
@@ -137,9 +141,11 @@ export const projectAppleApplication = (input) => {
137
141
  };
138
142
  return appleApplicationProjectionResultSchema.parse({
139
143
  ...withoutId,
140
- projection_id: `aap_${digest(withoutId)}`,
144
+ projection_id: appleProjectionId(withoutId),
141
145
  });
142
146
  };
147
+ /** Identify the complete projection, including source Evidence provenance. */
148
+ export const appleProjectionId = (projection) => `aap_${digest(projection)}`;
143
149
  /**
144
150
  * IPA projection keeps every archive component, as before. Directory, ZIP,
145
151
  * and DMG inventories can hold installers and other siblings, so only
@@ -204,21 +210,37 @@ const identifyRuntimeFamilies = (all) => {
204
210
  families.add("unity");
205
211
  return [...families].sort(compare);
206
212
  };
207
- /** Pair scripts and native code only within the same application root. */
213
+ /** Pair scripts and native code within matching application-root groups. */
208
214
  const identifyBridgeCandidates = (scripts, native, roots) => {
209
215
  const owner = (path) => roots.find((root) => isWithin(path, root)) ?? null;
210
- return {
211
- candidates: scripts.flatMap((script) => {
212
- const root = owner(script.path);
213
- return native
214
- .filter(({ path }) => owner(path) === root)
215
- .map((item) => ({
216
- source_path: script.path,
217
- native_path: item.path,
218
- basis: bridgeBasis(item.path),
219
- }));
216
+ const scriptGroups = [];
217
+ for (const script of scripts) {
218
+ const root = owner(script.path);
219
+ const last = scriptGroups.at(-1);
220
+ if (last?.root === root)
221
+ last.left.push(script);
222
+ else
223
+ scriptGroups.push({ root, left: [script] });
224
+ }
225
+ const nativeByRoot = new Map();
226
+ for (const item of native) {
227
+ const root = owner(item.path);
228
+ const scoped = nativeByRoot.get(root) ?? [];
229
+ scoped.push(item);
230
+ nativeByRoot.set(root, scoped);
231
+ }
232
+ const groups = scriptGroups.map(({ root, left }) => ({
233
+ left,
234
+ right: nativeByRoot.get(root) ?? [],
235
+ }));
236
+ return projectCartesianCandidates({
237
+ groups,
238
+ createCandidate: (source_path, item) => ({
239
+ source_path,
240
+ native_path: item.path,
241
+ basis: bridgeBasis(item.path),
220
242
  }),
221
- };
243
+ });
222
244
  };
223
245
  const bridgeBasis = (path) => {
224
246
  const lower = path.toLowerCase();
@@ -264,6 +286,11 @@ const projectionLimitations = (facts) => [
264
286
  "AppleDouble sidecar entries (._* files and __MACOSX/) describe neighbouring files and are excluded from bundle roles.",
265
287
  ]
266
288
  : []),
289
+ ...(facts.bridgeCandidateCoverage.status === "partial"
290
+ ? [
291
+ `Bridge candidate pairs exceeded the projection safety budget; ${facts.bridgeCandidateCoverage.omitted_candidates} hypotheses are omitted. Component arrays still include every component from the supplied inventory pages.`,
292
+ ]
293
+ : []),
267
294
  "Bundle roles follow path conventions. Read each info_plist_path with inspect_plist for CFBundleExecutable, identifiers, and declared services.",
268
295
  "Bundle identifiers and signing claims require dedicated plist and CMS parsing; this projection reports only exact paths and hashes.",
269
296
  "Bridge candidates are path-based hypotheses, not observed runtime calls.",
@@ -0,0 +1,73 @@
1
+ /** Retain recognized image-selection settings separately from diagnostic observations. */
2
+ export const embeddedDyldOverrides = (environment, platforms) => {
3
+ const overrides = [];
4
+ for (const setting of environment) {
5
+ const delimiter = setting.indexOf("=");
6
+ if (delimiter <= 0)
7
+ continue;
8
+ const variable = setting.slice(0, delimiter);
9
+ const value = setting.slice(delimiter + 1);
10
+ const effect = overrideEffect(variable, value);
11
+ if (effect === undefined)
12
+ continue;
13
+ // ROOT_PATH is accepted only for simulator processes. Missing or unknown
14
+ // platform metadata cannot establish that dyld ignores it.
15
+ if (variable === "DYLD_ROOT_PATH" &&
16
+ platforms.length > 0 &&
17
+ platforms.every((platform) => platform >= 1 && platform <= 12) &&
18
+ !platforms.some((platform) => [7, 8, 9, 12].includes(platform)))
19
+ continue;
20
+ overrides.push({ variable, value, ...effect });
21
+ }
22
+ return overrides;
23
+ };
24
+ const overrideEffect = (variable, value) => {
25
+ switch (variable) {
26
+ // Empty directory components still produce /leaf candidates in dyld.
27
+ // In particular, an empty fallback value is not a no-op.
28
+ case "DYLD_LIBRARY_PATH":
29
+ return { phase: "override", scope: "library" };
30
+ case "DYLD_FRAMEWORK_PATH":
31
+ return { phase: "override", scope: "framework" };
32
+ case "DYLD_FALLBACK_LIBRARY_PATH":
33
+ return { phase: "fallback", scope: "library" };
34
+ case "DYLD_FALLBACK_FRAMEWORK_PATH":
35
+ return { phase: "fallback", scope: "framework" };
36
+ // Versioned paths map discovered images to their reported install names,
37
+ // so the directory's kind does not establish the replaced image's kind.
38
+ case "DYLD_VERSIONED_LIBRARY_PATH":
39
+ case "DYLD_VERSIONED_FRAMEWORK_PATH":
40
+ case "DYLD_IMAGE_SUFFIX":
41
+ // Versioned paths scan directories; suffixes create path variants.
42
+ // Empty directories cannot be scanned and empty suffixes repeat a path.
43
+ return /[^:]/u.test(value)
44
+ ? { phase: "override", scope: "all" }
45
+ : undefined;
46
+ case "DYLD_INSERT_LIBRARIES":
47
+ return value === "" ? undefined : { phase: "override", scope: "all" };
48
+ case "DYLD_ROOT_PATH":
49
+ case "DYLD_OVERLAY_PATH":
50
+ return value === "" ? undefined : { phase: "override", scope: "prefix" };
51
+ default:
52
+ return undefined;
53
+ }
54
+ };
55
+ const isFrameworkInstallName = (name, overrides) => {
56
+ const separator = name.lastIndexOf(".framework/");
57
+ if (separator < 0)
58
+ return false;
59
+ const framework = name.slice(0, separator).split("/").at(-1);
60
+ const leaf = name.slice(name.lastIndexOf("/") + 1);
61
+ return (leaf === framework ||
62
+ overrides.some(({ variable, value }) => variable === "DYLD_IMAGE_SUFFIX" && leaf === `${framework}${value}`));
63
+ };
64
+ /** Select only settings that can affect this dependency at its reached search phase. */
65
+ export const hasApplicableDyldOverrides = (overrides, installName, ordinarySearchFoundImage) => {
66
+ const kind = isFrameworkInstallName(installName, overrides)
67
+ ? "framework"
68
+ : "library";
69
+ return overrides.some(({ phase, scope }) => (phase === "override" || !ordinarySearchFoundImage) &&
70
+ (scope === "all" ||
71
+ scope === kind ||
72
+ (scope === "prefix" && !installName.startsWith("@"))));
73
+ };
@@ -0,0 +1,81 @@
1
+ const MAX_SYMLINK_HOPS = 32;
2
+ /**
3
+ * Resolve a root-relative path one segment at a time, as `open` would:
4
+ * symlinks are followed inside the root, `..` applies to the real parent,
5
+ * and any escape above the root or through an absolute link stops.
6
+ */
7
+ export const resolveTreePath = async (view, input) => {
8
+ const pending = segmentsOf(input);
9
+ const resolved = [];
10
+ let last;
11
+ let hops = 0;
12
+ while (pending.length > 0) {
13
+ const segment = pending.shift() ?? "";
14
+ if (segment === "..") {
15
+ if (resolved.length === 0)
16
+ return { kind: "escapes" };
17
+ resolved.pop();
18
+ last = { kind: "directory" };
19
+ continue;
20
+ }
21
+ const path = [...resolved, segment].join("/");
22
+ const entry = await view.entry(path);
23
+ if (entry === undefined)
24
+ return { kind: "absent" };
25
+ if (entry.kind === "symlink") {
26
+ hops += 1;
27
+ if (hops > MAX_SYMLINK_HOPS)
28
+ return { kind: "absent" };
29
+ if (entry.target.startsWith("/"))
30
+ return { kind: "escapes" };
31
+ pending.unshift(...segmentsOf(entry.target));
32
+ continue;
33
+ }
34
+ if (entry.kind === "file" && pending.length > 0)
35
+ return { kind: "absent" };
36
+ resolved.push(segment);
37
+ last = entry;
38
+ }
39
+ return last?.kind === "file"
40
+ ? { kind: "file", path: resolved.join("/") }
41
+ : { kind: "not-file" };
42
+ };
43
+ const segmentsOf = (path) => path.split("/").filter((segment) => segment !== "" && segment !== ".");
44
+ export const directoryOf = (path) => {
45
+ const index = path.lastIndexOf("/");
46
+ return index < 0 ? "" : path.slice(0, index);
47
+ };
48
+ export const joinPath = (directory, rest) => directory === "" ? rest : rest === "" ? directory : `${directory}/${rest}`;
49
+ /** Expand one dyld path prefix relative to its owning image. */
50
+ export const expandPrefix = (raw, context) => {
51
+ const variable = /^@(executable_path|loader_path)(?:\/(.*))?$/u.exec(raw);
52
+ if (variable !== null) {
53
+ const rest = variable[2] ?? "";
54
+ if (variable[1] === "loader_path")
55
+ return { scope: "target", path: joinPath(context.ownerDirectory, rest) };
56
+ return context.executable === null
57
+ ? { scope: "undetermined", path: raw }
58
+ : {
59
+ scope: "target",
60
+ path: joinPath(directoryOf(context.executable), rest),
61
+ };
62
+ }
63
+ if (raw.startsWith("/"))
64
+ return { scope: "outside", path: raw };
65
+ return { scope: "undetermined", path: raw };
66
+ };
67
+ /**
68
+ * Slices a process may load, best first, following dyld's graded
69
+ * architectures: an x86_64h process also accepts generic x86_64.
70
+ */
71
+ const COMPATIBLE_ARCHITECTURES = {
72
+ x86_64h: ["x86_64h", "x86_64"],
73
+ };
74
+ export const compatibleSlice = (slices, process) => {
75
+ for (const architecture of COMPATIBLE_ARCHITECTURES[process] ?? [process]) {
76
+ const slice = slices.find((item) => item.architecture === architecture);
77
+ if (slice !== undefined)
78
+ return slice;
79
+ }
80
+ return undefined;
81
+ };