rea-agents 6.3.0 → 6.4.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 (487) hide show
  1. package/README.md +7 -4
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/dist/adb/AdbConfiguration.js +88 -0
  6. package/dist/adb/AdbDeviceOutput.js +186 -0
  7. package/dist/adb/AdbProvider.js +1190 -0
  8. package/dist/adb/AdbShellOutput.js +309 -0
  9. package/dist/android/AndroidTargetSnapshot.js +104 -22
  10. package/dist/android/JadxConfiguration.js +44 -24
  11. package/dist/android/JadxProvider.js +51 -19
  12. package/dist/apktool/ApktoolConfiguration.js +84 -0
  13. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  14. package/dist/apktool/ApktoolProvider.js +506 -0
  15. package/dist/application/AnalysisProvider.js +8 -2
  16. package/dist/application/AppBundleExecutable.js +27 -22
  17. package/dist/application/BinaryTargetResolver.js +22 -2
  18. package/dist/application/CapabilityInventory.js +11 -1
  19. package/dist/application/ClientConfigurationDocument.js +70 -0
  20. package/dist/application/ClientConfigurationFiles.js +91 -0
  21. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  22. package/dist/application/ClientRegistrationStatus.js +66 -31
  23. package/dist/application/DirectAnalysis.js +2 -2
  24. package/dist/application/DirectAnalysisCleanup.js +1 -1
  25. package/dist/application/DirectAnalysisStatus.js +1 -1
  26. package/dist/application/Doctor.js +5 -3
  27. package/dist/application/DoctorDiagnostics.js +1 -1
  28. package/dist/application/EvidenceBundleCommands.js +6 -12
  29. package/dist/application/GeminiClientSettings.js +139 -0
  30. package/dist/application/HermesClientHome.js +115 -0
  31. package/dist/application/HopperDownload.js +39 -0
  32. package/dist/application/InvestigationProviders.js +6 -0
  33. package/dist/application/JsonFiles.js +6 -5
  34. package/dist/{cliJsonFile.js → application/JsonInputFile.js} +108 -35
  35. package/dist/application/LinuxHopper.js +4 -12
  36. package/dist/application/MacHopper.js +172 -149
  37. package/dist/application/MipsElfAbiFlags.js +140 -0
  38. package/dist/application/ProviderOperationExecution.js +31 -0
  39. package/dist/application/ReconstructionObligationCandidates.js +9 -3
  40. package/dist/application/ReferenceSourceImport.js +76 -29
  41. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  42. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  43. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  44. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  45. package/dist/application/RegularFileRead.js +93 -7
  46. package/dist/application/Setup.js +54 -6
  47. package/dist/application/SetupClientConfiguration.js +116 -16
  48. package/dist/application/SetupHost.js +102 -24
  49. package/dist/application/SetupPlan.js +5 -8
  50. package/dist/application/SetupSkill.js +58 -39
  51. package/dist/application/SupportedClients.js +290 -65
  52. package/dist/application/Uninstall.js +158 -10
  53. package/dist/application/UpdateMaintenance.js +17 -21
  54. package/dist/application/Utf8JsonInput.js +7 -0
  55. package/dist/application/WebScriptExportService.js +131 -65
  56. package/dist/application/WebSourceLocationService.js +3 -0
  57. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  58. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  59. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  60. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  61. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  62. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  63. package/dist/application/binary/BinarySession.js +2 -1
  64. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  65. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  66. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  67. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  68. package/dist/application/evm/EvmInterfaceService.js +3 -0
  69. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  70. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  71. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  72. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  73. package/dist/application/javascript/ElectronBoundaryGraphNative.js +19 -6
  74. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  75. package/dist/application/javascript/JavaScriptApplicationService.js +22 -11
  76. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  77. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -30
  78. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  79. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +67 -19
  80. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  81. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  82. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +19 -16
  83. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  84. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +258 -235
  85. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +115 -26
  86. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -1
  87. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -4
  88. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  89. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +9 -3
  90. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +199 -61
  91. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +12 -19
  92. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +4 -1
  93. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +5 -3
  94. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +5 -3
  95. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +19 -8
  96. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  97. package/dist/application/jeb/JebAnalysisService.js +13 -0
  98. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  99. package/dist/application/native/NativeUiActionTrace.js +16 -8
  100. package/dist/application/native/NativeValueTrace.js +23 -6
  101. package/dist/application/process/ProcessCli.js +25 -20
  102. package/dist/artifacts/ArtifactPaths.js +129 -8
  103. package/dist/artifacts/ArtifactProvider.js +20 -15
  104. package/dist/artifacts/ArtifactReader.js +23 -0
  105. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  106. package/dist/artifacts/AsarArtifactReader.js +176 -102
  107. package/dist/artifacts/AsarHeader.js +24 -0
  108. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  109. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  110. package/dist/artifacts/NativeDmgArtifactReader.js +29 -22
  111. package/dist/artifacts/SafeOutputTree.js +245 -70
  112. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  113. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  114. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  115. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  116. package/dist/artifacts/ZipArtifactReader.js +77 -27
  117. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  118. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  119. package/dist/artifacts/apple/KeyedArchiveReader.js +32 -13
  120. package/dist/artifacts/extraction/ArtifactExtraction.js +110 -86
  121. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +110 -43
  122. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  123. package/dist/artifacts/inventory/classify.js +75 -32
  124. package/dist/artifacts/inventory/hashStableRootArtifact.js +48 -15
  125. package/dist/artifacts/inventory/reader.js +13 -5
  126. package/dist/artifacts/inventory/scanCanonical.js +62 -25
  127. package/dist/artifacts/inventory/scanReader.js +38 -11
  128. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +15 -9
  129. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  130. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  131. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  132. package/dist/browser/CdpBrowserProvider.js +5 -0
  133. package/dist/browser/CdpCaptureDocuments.js +40 -6
  134. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  135. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  136. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  137. package/dist/browser/CdpCaptureEvents.js +4 -9
  138. package/dist/browser/CdpConnection.js +22 -5
  139. package/dist/browser/CdpPageCapture.js +1 -1
  140. package/dist/browser/CdpTargetSession.js +30 -34
  141. package/dist/browser/CdpWebMcpDiscovery.js +32 -10
  142. package/dist/browser/ElectronFileScope.js +99 -9
  143. package/dist/browser/PlaywrightBrowserScenarioProvider.js +60 -4
  144. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  145. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  146. package/dist/browser/PlaywrightScenarioBrowser.js +69 -7
  147. package/dist/browser/PlaywrightScenarioSession.js +127 -54
  148. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  149. package/dist/browser/PngVisualDiff.js +198 -29
  150. package/dist/browser/WebSourceMapFetcher.js +3 -3
  151. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  152. package/dist/browser/assets/PublishWebScripts.js +75 -20
  153. package/dist/browser/assets/WebArtifactReads.js +23 -1
  154. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  155. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  156. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  157. package/dist/browser/history/HarCapture.js +14 -0
  158. package/dist/browser/history/HarCaptureProcess.js +2 -10
  159. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  160. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  161. package/dist/cli/adbCommands.js +337 -0
  162. package/dist/cli/analysisViewCommands.js +39 -1
  163. package/dist/cli/apktoolCommands.js +53 -0
  164. package/dist/cli/artifactCommands.js +8 -11
  165. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  166. package/dist/cli/browserAdvancedCommands.js +65 -36
  167. package/dist/cli/coreBinaryCommands.js +0 -5
  168. package/dist/cli/coreNativeCommands.js +1 -14
  169. package/dist/cli/electronCommands.js +6 -1
  170. package/dist/cli/evmCommands.js +13 -4
  171. package/dist/cli/firmwareCommands.js +7 -2
  172. package/dist/cli/javascriptApplicationAnalysis.js +17 -1
  173. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  174. package/dist/cli/jebCommands.js +99 -0
  175. package/dist/cli/jsonOutput.js +11 -4
  176. package/dist/cli/referenceSourceImportStatus.js +7 -0
  177. package/dist/cli/setupCommands.js +15 -3
  178. package/dist/cli/utilityCommands.js +66 -18
  179. package/dist/cli/webScriptCommands.js +20 -1
  180. package/dist/cli/webSourceLocationCommands.js +21 -9
  181. package/dist/cli.js +6 -0
  182. package/dist/cliBrowserScenarioCommands.js +2 -1
  183. package/dist/cliCommandNames.js +32 -0
  184. package/dist/cliJsonInput.js +2 -2
  185. package/dist/cliObservationOptions.js +3 -0
  186. package/dist/composition/adb.js +3 -0
  187. package/dist/composition/apktool.js +3 -0
  188. package/dist/composition/binaryDiagnostics.js +4 -0
  189. package/dist/composition/directAnalysis.js +12 -4
  190. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  191. package/dist/composition/jeb.js +6 -0
  192. package/dist/config/environment.js +10 -0
  193. package/dist/config/ghidraLanguageOverride.js +9 -0
  194. package/dist/config/mcpInputSchemaProfile.js +27 -0
  195. package/dist/config/parseConfig.js +28 -1
  196. package/dist/contracts/adb/adbToolContracts.js +353 -0
  197. package/dist/contracts/advertisedInputExamples.js +48 -0
  198. package/dist/contracts/analysisDetail.js +10 -0
  199. package/dist/contracts/analysisViewToolContracts.js +17 -2
  200. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  201. package/dist/contracts/artifactToolContracts.js +8 -5
  202. package/dist/contracts/browserToolContracts.js +1 -1
  203. package/dist/contracts/compactInputSchema.js +256 -0
  204. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  205. package/dist/contracts/inputSchemaPresentation.js +10 -10
  206. package/dist/contracts/javascript/electronToolContracts.js +15 -3
  207. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  208. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  209. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  210. package/dist/contracts/officialToolContracts.js +5 -5
  211. package/dist/contracts/sessionToolContracts.js +2 -2
  212. package/dist/contracts/sessionToolSchemas.js +6 -2
  213. package/dist/contracts/toolContractExamples.js +6 -0
  214. package/dist/contracts/toolContractTypes.js +3 -0
  215. package/dist/contracts/toolContracts.js +6 -0
  216. package/dist/contracts/toolEffects.js +167 -0
  217. package/dist/contracts/toolOutputSchemaGroups.js +5 -3
  218. package/dist/contracts/toolSchemaMetadata.js +82 -7
  219. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  220. package/dist/domain/analysisErrorCleanup.js +29 -0
  221. package/dist/domain/analysisErrorPresentation.js +18 -6
  222. package/dist/domain/analysisErrorProjection.js +4 -1
  223. package/dist/domain/analysisSnapshot.js +2 -1
  224. package/dist/domain/analysisView/analysisView.js +52 -2
  225. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  226. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  227. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  228. package/dist/domain/android/androidApplication.js +25 -20
  229. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  230. package/dist/domain/apple/appleApplication.js +40 -23
  231. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  232. package/dist/domain/apple/dyldPaths.js +9 -1
  233. package/dist/domain/apple/dylibResolution.js +2 -2
  234. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  235. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  236. package/dist/domain/artifactComparison.js +35 -7
  237. package/dist/domain/artifactGraph.js +5 -3
  238. package/dist/domain/artifactIdentity.js +30 -2
  239. package/dist/domain/artifactInspection.js +3 -43
  240. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  241. package/dist/domain/artifactInventoryEvidence.js +11 -12
  242. package/dist/domain/artifactPathSyntax.js +1 -1
  243. package/dist/domain/binaryTarget.js +16 -0
  244. package/dist/domain/binaryTargetTypes.js +8 -1
  245. package/dist/domain/browserObservationSchemas.js +8 -4
  246. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  247. package/dist/domain/compactStringIdentity.js +9 -0
  248. package/dist/domain/evidence.js +2 -1
  249. package/dist/domain/evidenceRecordSummary.js +144 -0
  250. package/dist/domain/inputIssueProjection.js +16 -1
  251. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -13
  252. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -20
  253. package/dist/domain/javascript/electronStaticAnalysisNative.js +70 -40
  254. package/dist/domain/javascript/electronStaticAnalysisValues.js +16 -0
  255. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  256. package/dist/domain/javascript/javascriptApplicationAnalysis.js +4 -1
  257. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +6 -6
  258. package/dist/domain/javascript/javascriptApplicationGraph.js +79 -18
  259. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  260. package/dist/domain/javascript/javascriptApplicationVersionItems.js +28 -12
  261. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -1
  262. package/dist/domain/javascript/javascriptAstFingerprint.js +58 -31
  263. package/dist/domain/javascript/javascriptAstValues.js +32 -0
  264. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  265. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  266. package/dist/domain/javascript/javascriptNativeHandoff.js +6 -1
  267. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  268. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  269. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +7 -2
  270. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +8 -11
  271. package/dist/domain/javascript/javascriptSemanticAnalysis.js +190 -33
  272. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  273. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  274. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  275. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  276. package/dist/domain/javascript/javascriptSemanticFingerprints.js +42 -41
  277. package/dist/domain/javascript/javascriptSemanticGraph.js +69 -23
  278. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +2 -10
  279. package/dist/domain/javascript/javascriptSemanticIterationSources.js +40 -7
  280. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +341 -87
  281. package/dist/domain/javascript/javascriptSemanticMutationValues.js +78 -35
  282. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  283. package/dist/domain/javascript/javascriptSemanticObjects.js +7 -1
  284. package/dist/domain/javascript/javascriptSemanticProjection.js +52 -14
  285. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +77 -0
  286. package/dist/domain/javascript/javascriptSemanticQuery.js +27 -29
  287. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +1 -3
  288. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  289. package/dist/domain/javascript/javascriptSemanticReturns.js +13 -23
  290. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  291. package/dist/domain/javascript/javascriptSemanticTraversal.js +19 -1
  292. package/dist/domain/javascript/javascriptSemanticValues.js +47 -19
  293. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  294. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  295. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +8 -6
  296. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  297. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  298. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  299. package/dist/domain/jeb/jebAnalysis.js +114 -0
  300. package/dist/domain/jsonShape.js +63 -52
  301. package/dist/domain/jsonValue.js +3 -0
  302. package/dist/domain/managed/managedApplicationGraph.js +37 -0
  303. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  304. package/dist/domain/managed/managedApplicationGraphNodes.js +32 -22
  305. package/dist/domain/managed/managedArtifact.js +1 -0
  306. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  307. package/dist/domain/native/nativeAotPe.js +1408 -0
  308. package/dist/domain/native/nativeInstruction.js +21 -0
  309. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  310. package/dist/domain/native/peResources.js +94 -0
  311. package/dist/domain/nativeConvention.js +33 -0
  312. package/dist/domain/process/processCapture.js +91 -1
  313. package/dist/domain/process/processCaptureExample.js +24 -0
  314. package/dist/domain/process/processCaptureValidation.js +79 -0
  315. package/dist/domain/process/processScenario.js +59 -7
  316. package/dist/domain/propertyListKeys.js +3 -1
  317. package/dist/domain/referenceSourceGraph.js +25 -16
  318. package/dist/domain/referenceSourceImportParsing.js +6 -3
  319. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  320. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  321. package/dist/domain/webBundleAnalyzerInspection.js +14 -2
  322. package/dist/domain/webCaptureDiff.js +102 -4
  323. package/dist/domain/webScriptExportError.js +10 -4
  324. package/dist/domain/webScriptExportPlan.js +7 -13
  325. package/dist/domain/zipPackageFormat.js +4 -1
  326. package/dist/domain/zodCollectionSteps.js +24 -0
  327. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  328. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  329. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  330. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  331. package/dist/dotnet/ManagedMemberInstructionDecoder.js +4 -2
  332. package/dist/dotnet/ManagedMemberRows.js +9 -4
  333. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  334. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  335. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  336. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  337. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  338. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  339. package/dist/dotnet/ManagedPeReader.js +41 -25
  340. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  341. package/dist/dotnet/ManagedStaticProvider.js +55 -24
  342. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  343. package/dist/evaluation/CodexAgentEval.js +43 -13
  344. package/dist/evm/EvmoleFailures.js +0 -2
  345. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  346. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  347. package/dist/filesystem/OwnedFileHandle.js +36 -0
  348. package/dist/filesystem/RegularFile.js +33 -1
  349. package/dist/filesystem/StableFileHash.js +46 -0
  350. package/dist/filesystem/readFileHandleChunks.js +26 -0
  351. package/dist/firmware/FirmwareCommand.js +25 -3
  352. package/dist/firmware/FirmwareFiles.js +23 -8
  353. package/dist/firmware/FirmwareProvider.js +156 -32
  354. package/dist/firmware/FirmwarePublication.js +24 -3
  355. package/dist/firmware/FirmwareRelease.js +1 -0
  356. package/dist/generatedPackageMetadata.js +2 -2
  357. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  358. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  359. package/dist/ghidra/GhidraClient.js +76 -4
  360. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  361. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  362. package/dist/ghidra/GhidraInstallation.js +1 -1
  363. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  364. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  365. package/dist/ghidra/GhidraLauncher.js +80 -39
  366. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  367. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  368. package/dist/ghidra/GhidraProvider.js +57 -9
  369. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  370. package/dist/ghidra/GhidraProviderClient.js +282 -21
  371. package/dist/ghidra/GhidraSessionValues.js +9 -2
  372. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  373. package/dist/hopper/HopperClient.js +15 -6
  374. package/dist/hopper/HopperMachOImage.js +2 -0
  375. package/dist/hopper/HopperProvider.js +13 -2
  376. package/dist/ida/IdaOperationRunner.js +8 -2
  377. package/dist/ida/IdaProvider.js +7 -0
  378. package/dist/ida/IdaSessionClient.js +3 -1
  379. package/dist/ida/IdaWorkspace.js +4 -2
  380. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  381. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  382. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  383. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  384. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  385. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  386. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  387. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  388. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  389. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  390. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  391. package/dist/javascript/recovery/WakaruReport.js +12 -7
  392. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  393. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  394. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  395. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  396. package/dist/jeb/JebMcpConnection.js +179 -0
  397. package/dist/jeb/JebMcpEndpoint.js +40 -0
  398. package/dist/jeb/JebProvider.js +299 -0
  399. package/dist/mcpDoctor.js +15 -6
  400. package/dist/native/AppleDispatchCoverage.js +25 -12
  401. package/dist/native/AppleDispatchMetadata.js +14 -7
  402. package/dist/native/AppleMachoFixups.js +71 -15
  403. package/dist/native/AppleMachoSelection.js +23 -3
  404. package/dist/native/NativeMacOSProvider.js +91 -16
  405. package/dist/native/NativeMachoInspection.js +11 -7
  406. package/dist/native/NativeUiHelperRuntime.js +6 -1
  407. package/dist/native/NativeUiObservation.js +4 -3
  408. package/dist/native/pe/PeResourceLayout.js +120 -0
  409. package/dist/native/pe/PeResourceParser.js +286 -0
  410. package/dist/native/pe/PeResourcesProvider.js +63 -0
  411. package/dist/process/BoundedFileBytes.js +30 -7
  412. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  413. package/dist/process/OwnedCommand.js +4 -3
  414. package/dist/process/ProcessOwnership.js +104 -112
  415. package/dist/process/ProcessOwnershipObservation.js +96 -39
  416. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  417. package/dist/process/ProcessRunTokenObservations.js +48 -0
  418. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  419. package/dist/process/ProviderProcess.js +4 -3
  420. package/dist/process/capture/FilesystemSnapshot.js +28 -4
  421. package/dist/process/capture/ProcessCaptureLifecycle.js +350 -59
  422. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  423. package/dist/process/capture/ProcessHarness.js +194 -26
  424. package/dist/process/capture/ProcessNormalization.js +3 -1
  425. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  426. package/dist/process/capture/TerminalRenderer.js +24 -7
  427. package/dist/reference/ReferenceSourceReader.js +22 -5
  428. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  429. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  430. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  431. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  432. package/dist/server/EvidenceMcpServer.js +36 -1
  433. package/dist/server/admittedToolOperation.js +9 -0
  434. package/dist/server/contractToolHandler.js +21 -0
  435. package/dist/server/createServer.js +97 -25
  436. package/dist/server/registerAdbTools.js +36 -0
  437. package/dist/server/registerAnalysisViewTool.js +4 -9
  438. package/dist/server/registerAndroidTools.js +3 -12
  439. package/dist/server/registerApktoolTools.js +14 -0
  440. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -6
  441. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  442. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  443. package/dist/server/registerApplicationTools/coverage.js +3 -2
  444. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  445. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  446. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  447. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  448. package/dist/server/registerArtifactComparisonTool.js +5 -2
  449. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  450. package/dist/server/registerBrowserScenarioTool.js +10 -7
  451. package/dist/server/registerBrowserTools.js +12 -9
  452. package/dist/server/registerBundleComparisonTool.js +16 -2
  453. package/dist/server/registerCloseLifecycleTool.js +32 -3
  454. package/dist/server/registerElectronTools.js +28 -10
  455. package/dist/server/registerEvmTools.js +4 -9
  456. package/dist/server/registerFirmwareTools.js +3 -11
  457. package/dist/server/registerFunctionComparisonTool.js +5 -2
  458. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  459. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  460. package/dist/server/registerJebTools.js +16 -0
  461. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  462. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  463. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  464. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  465. package/dist/server/registerPeResourcesTool.js +9 -0
  466. package/dist/server/registerProcessComparisonTool.js +5 -2
  467. package/dist/server/registerRecordedCrashTools.js +4 -9
  468. package/dist/server/registerSessionRecordTools.js +2 -1
  469. package/dist/server/registerSessionTools.js +49 -18
  470. package/dist/server/registerWebModuleTool.js +4 -9
  471. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  472. package/dist/server/registerWebRuntimeTools.js +6 -5
  473. package/dist/server/registerWebScriptTool.js +6 -3
  474. package/dist/server/registerWebSourceLocationTool.js +4 -9
  475. package/dist/server/toolResult.js +21 -2
  476. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  477. package/install.sh +7 -4
  478. package/licenses/nativeaot-parser-MIT.txt +28 -0
  479. package/native/windows/build/manifest.json +2 -2
  480. package/native/windows/build/rea-windows-x64.node +0 -0
  481. package/package.json +33 -5
  482. package/scripts/rea.mjs +16 -1
  483. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  484. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  485. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  486. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  487. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +22 -1
@@ -3,12 +3,13 @@ import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
4
  import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
5
5
  import { analysisProfileSchema, analysisProfilesEqual, committedProviderSchema, } from "./analysisProfile.js";
6
+ import { BINARY_ARCHITECTURES, } from "./binaryTargetTypes.js";
6
7
  import { evidenceBundleForTarget, evidenceBundleSchema, parseEvidenceBundle, } from "./evidenceBundle.js";
7
8
  import { evidenceLocationSchema, } from "./evidence.js";
8
9
  import { jsonObjectSchema, jsonValueSchema, } from "./jsonValue.js";
9
10
  import { digestSchema } from "./../domain/digests.js";
10
11
  import { prefixedDigestSchema } from "./../domain/digests.js";
11
- const architectureSchema = z.enum(["x86", "x86_64", "arm", "arm64"]);
12
+ const architectureSchema = z.enum(BINARY_ARCHITECTURES);
12
13
  const formatSchema = z.enum([
13
14
  "analysis-database",
14
15
  "mach-o",
@@ -6,10 +6,12 @@ import { evidenceSchema } from "../evidence.js";
6
6
  import { jsonObjectSchema, jsonValueSchema } from "../jsonValue.js";
7
7
  import { err, ok } from "../result.js";
8
8
  import { binaryLayoutSchema } from "../native/binaryLayout.js";
9
+ import { functionDossierSchema } from "../hopperValues.js";
9
10
  import { parseOwnedJavaScriptApplicationAnalysisSteps, } from "../javascript/javascriptApplicationAnalysis.js";
10
11
  import { analysisInputErrorFromIssues } from "../inputIssueProjection.js";
11
12
  import { projectBinaryLayoutView } from "./binaryLayoutView.js";
12
13
  import { projectJavaScriptApplicationView } from "./javascriptApplicationView.js";
14
+ import { projectNativeFunctionView } from "./nativeFunctionView.js";
13
15
  /** Public name of the selected-view workflow. */
14
16
  export const INSPECT_ANALYSIS_VIEW_OPERATION = "inspect_analysis_view";
15
17
  const summaryViewSchema = z.strictObject({ kind: z.literal("summary") });
@@ -57,12 +59,40 @@ const pageViewSchema = z.strictObject({
57
59
  offset: z.number().int().nonnegative(),
58
60
  limit: z.number().int().positive(),
59
61
  });
62
+ /** Bounded native function facets of already authenticated analyze_function Evidence. */
63
+ const nativeViewSchema = z.strictObject({
64
+ kind: z.literal("native"),
65
+ facet: z.enum([
66
+ "procedure",
67
+ "pseudocode",
68
+ "assembly",
69
+ "basic_blocks",
70
+ "comments",
71
+ "callers",
72
+ "callees",
73
+ "incoming_references",
74
+ "outgoing_references",
75
+ "unresolved_calls",
76
+ "referenced_strings",
77
+ "referenced_names",
78
+ "native_api",
79
+ "value_flow_summary",
80
+ "value_flow_operations",
81
+ "value_flow_def_use",
82
+ "value_flow_effects",
83
+ "value_flow_parameters",
84
+ "value_flow_parameter_uses",
85
+ ]),
86
+ offset: z.number().int().nonnegative().default(0),
87
+ limit: z.number().int().positive().default(64),
88
+ });
60
89
  /** Caller-selected projection of already completed analysis Evidence. */
61
90
  export const analysisViewRequestSchema = z.discriminatedUnion("kind", [
62
91
  summaryViewSchema,
63
92
  facetViewSchema,
64
93
  itemViewSchema,
65
94
  pageViewSchema,
95
+ nativeViewSchema,
66
96
  ]);
67
97
  /** Inline Evidence or an exact same-session retained reference. */
68
98
  export const analysisViewSourceSchema = z.discriminatedUnion("kind", [
@@ -88,7 +118,9 @@ const coverageSchema = z.strictObject({
88
118
  exhausted: z.boolean(),
89
119
  });
90
120
  const artifactSchema = z.strictObject({
91
- path: z.string().min(1),
121
+ path: z
122
+ .string()
123
+ .describe("Exact recorded artifact path, including an empty string."),
92
124
  sha256: digestSchema,
93
125
  });
94
126
  const layoutSummarySchema = z.strictObject({
@@ -127,6 +159,7 @@ const viewResultBase = {
127
159
  parent_operation: z.enum([
128
160
  "inspect_binary_layout",
129
161
  "analyze_javascript_application",
162
+ "analyze_function",
130
163
  ]),
131
164
  parent_digest: digestSchema,
132
165
  view_digest: digestSchema,
@@ -161,6 +194,13 @@ export const analysisViewResultSchema = z.discriminatedUnion("kind", [
161
194
  items: z.array(jsonValueSchema),
162
195
  ...viewResultBase,
163
196
  }),
197
+ z.strictObject({
198
+ kind: z.literal("native"),
199
+ view: nativeViewSchema,
200
+ procedure_address: z.string().nullable(),
201
+ item: jsonValueSchema,
202
+ ...viewResultBase,
203
+ }),
164
204
  ]);
165
205
  /** Construct a typed input failure for one selected-view constraint. */
166
206
  export const analysisViewInputError = (issues) => new AnalysisInputError(INSPECT_ANALYSIS_VIEW_OPERATION, undefined, issues);
@@ -189,7 +229,7 @@ const parseJavaScriptParent = (input) => {
189
229
  })), { source: { normalized_result: input } }, { cause }));
190
230
  }
191
231
  };
192
- const unsupportedParent = (parent) => new AnalysisUnsupportedTargetError(INSPECT_ANALYSIS_VIEW_OPERATION, parentArtifactPath(parent), `Parent Evidence operation ${JSON.stringify(parent.operation)} is not inspect_binary_layout or analyze_javascript_application.`);
232
+ const unsupportedParent = (parent) => new AnalysisUnsupportedTargetError(INSPECT_ANALYSIS_VIEW_OPERATION, parentArtifactPath(parent), `Parent Evidence operation ${JSON.stringify(parent.operation)} is not inspect_binary_layout, analyze_javascript_application or analyze_function.`);
193
233
  const parentArtifactPath = (parent) => {
194
234
  if (typeof parent.normalizedResult === "object" &&
195
235
  parent.normalizedResult !== null &&
@@ -237,5 +277,15 @@ export const projectAnalysisView = (parent, view) => {
237
277
  const projected = projectJavaScriptApplicationView(parent, analysis.value, view);
238
278
  return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
239
279
  }
280
+ if (parent.operation === "analyze_function") {
281
+ const native = functionDossierSchema.safeParse(parent.normalizedResult);
282
+ if (!native.success)
283
+ return err(analysisInputErrorFromIssues(INSPECT_ANALYSIS_VIEW_OPERATION, native.error.issues.map((issue) => ({
284
+ ...issue,
285
+ path: ["source", "normalized_result", ...issue.path],
286
+ })), { source: { normalized_result: parent.normalizedResult } }, { cause: native.error }));
287
+ const projected = projectNativeFunctionView(parent, native.data, view);
288
+ return projected.ok ? ok(sealAnalysisView(projected.value)) : projected;
289
+ }
240
290
  return err(unsupportedParent(parent));
241
291
  };
@@ -96,6 +96,8 @@ const layoutSummary = (layout) => ({
96
96
  /** Project one layout view without re-running the decoder. */
97
97
  export const projectBinaryLayoutView = (parent, layout, view) => {
98
98
  const shared = parentFields(parent, layout);
99
+ if (view.kind === "native")
100
+ return err(layoutIncompatible("Native views require analyze_function Evidence."));
99
101
  if (view.kind === "summary")
100
102
  return ok({
101
103
  kind: "summary",
@@ -176,6 +176,8 @@ const selectModule = (modules, selector) => {
176
176
  export const projectJavaScriptApplicationView = (parent, analysis, view) => {
177
177
  const shared = parentFields(parent, analysis);
178
178
  const modules = moduleEntries(analysis.graph.nodes);
179
+ if (view.kind === "native")
180
+ return err(jsIncompatible("Native views require analyze_function Evidence."));
179
181
  if (view.kind === "summary")
180
182
  return ok({
181
183
  kind: "summary",
@@ -0,0 +1,155 @@
1
+ import { uniqueSorted } from "../canonicalOrdering.js";
2
+ import { jsonValueSchema } from "../jsonValue.js";
3
+ import { err, ok } from "../result.js";
4
+ import { analysisViewInputError, } from "./analysisView.js";
5
+ import { completeWithinViewCoverage, pageViewCoverage, } from "./analysisViewCoverage.js";
6
+ const viewError = (message) => analysisViewInputError([
7
+ { path: ["view"], reason: "invalid_value", message },
8
+ ]);
9
+ const parentFields = (parent, dossier, artifact) => {
10
+ const flow = dossier.native_value_flow;
11
+ const api = dossier.native_api;
12
+ const unknowns = [];
13
+ if (flow === null)
14
+ unknowns.push("native_value_flow was not recorded");
15
+ else if (!flow.available)
16
+ unknowns.push("native_value_flow unavailable: " + flow.reason);
17
+ else if (flow.truncated)
18
+ unknowns.push("native_value_flow is truncated; omitted observations remain unknown");
19
+ if (api === null)
20
+ unknowns.push("native_api was not recorded");
21
+ else if (!api.available)
22
+ unknowns.push("native_api unavailable: " + api.reason, ...api.residual_unknowns);
23
+ return {
24
+ parent_evidence_id: parent.evidenceId,
25
+ parent_operation: "analyze_function",
26
+ parent_digest: parent.evidenceId.slice(3),
27
+ procedure_address: dossier.procedure.address,
28
+ artifact,
29
+ limitations: uniqueSorted([
30
+ ...parent.limitations,
31
+ ...dossier.limitations,
32
+ ...(flow?.limitations ?? []),
33
+ ...(api?.available ? api.limitations : []),
34
+ ]),
35
+ unknowns: uniqueSorted(unknowns),
36
+ };
37
+ };
38
+ const pseudocodePage = (body, offset, limit) => {
39
+ const start = Math.min(offset, body.length);
40
+ const high = (n) => n >= 0xd800 && n <= 0xdbff;
41
+ const low = (n) => n >= 0xdc00 && n <= 0xdfff;
42
+ if (start > 0 &&
43
+ start < body.length &&
44
+ high(body.charCodeAt(start - 1)) &&
45
+ low(body.charCodeAt(start)))
46
+ return err(viewError("Pseudocode offset splits a UTF-16 surrogate pair."));
47
+ let end = Math.min(start + limit, body.length);
48
+ if (end > start &&
49
+ end < body.length &&
50
+ high(body.charCodeAt(end - 1)) &&
51
+ low(body.charCodeAt(end)))
52
+ end--;
53
+ if (end === start && start < body.length)
54
+ return err(viewError("Increase pseudocode limit to include the next complete Unicode character."));
55
+ return ok({
56
+ item: { text: body.slice(start, end), unit: "utf16-code-units" },
57
+ coverage: pageViewCoverage(start, end - start, body.length),
58
+ });
59
+ };
60
+ const nativeRows = (dossier, facet) => {
61
+ const sourceFlow = dossier.native_value_flow;
62
+ const flow = sourceFlow?.available ? sourceFlow : undefined;
63
+ return {
64
+ assembly: dossier.assembly,
65
+ basic_blocks: dossier.basic_blocks,
66
+ comments: dossier.comments,
67
+ callers: dossier.callers,
68
+ callees: dossier.callees,
69
+ incoming_references: dossier.incoming_references,
70
+ outgoing_references: dossier.outgoing_references,
71
+ unresolved_calls: dossier.unresolved_calls,
72
+ referenced_strings: dossier.referenced_strings,
73
+ referenced_names: dossier.referenced_names,
74
+ value_flow_operations: flow?.operations,
75
+ value_flow_def_use: flow?.def_use,
76
+ value_flow_effects: flow?.effects,
77
+ value_flow_parameters: flow?.parameters,
78
+ value_flow_parameter_uses: flow?.parameter_uses,
79
+ }[facet];
80
+ };
81
+ /** Project bounded native function facets from complete retained Evidence without reanalysis. */
82
+ export const projectNativeFunctionView = (parent, dossier, view) => {
83
+ if (view.kind !== "native")
84
+ return err(viewError("analyze_function Evidence requires a native view."));
85
+ const artifact = parent.artifact;
86
+ if (!artifact)
87
+ return err(analysisViewInputError([
88
+ {
89
+ path: ["source", "subject"],
90
+ reason: "invalid_value",
91
+ message: "Native function Evidence requires an artifact-bound subject.",
92
+ },
93
+ ]));
94
+ const common = parentFields(parent, dossier, artifact);
95
+ const singleton = (item) => ({
96
+ kind: "native",
97
+ view,
98
+ item: jsonValueSchema.parse(item),
99
+ coverage: completeWithinViewCoverage(1, 1),
100
+ ...common,
101
+ });
102
+ const flow = dossier.native_value_flow;
103
+ if (view.facet === "procedure" ||
104
+ view.facet === "native_api" ||
105
+ view.facet === "value_flow_summary") {
106
+ if (view.offset !== 0)
107
+ return err(viewError("Singleton native facets require offset 0."));
108
+ if (view.facet === "procedure")
109
+ return ok(singleton(dossier.procedure));
110
+ if (view.facet === "native_api")
111
+ return ok(singleton(dossier.native_api ?? { available: false, reason: "not recorded" }));
112
+ const status = flow === null
113
+ ? { available: false, reason: "not recorded" }
114
+ : !flow.available
115
+ ? { available: false, reason: flow.reason }
116
+ : {
117
+ available: true,
118
+ provenance: flow.provenance,
119
+ truncated: flow.truncated,
120
+ omitted_operations_lower_bound: flow.omitted_operations_lower_bound,
121
+ known_omitted_inputs: flow.known_omitted_inputs,
122
+ known_omitted_edges: flow.known_omitted_edges,
123
+ operations: flow.operations.length,
124
+ def_use: flow.def_use.length,
125
+ effects: flow.effects.length,
126
+ parameters: flow.parameters.length,
127
+ parameter_uses: flow.parameter_uses.length,
128
+ };
129
+ return ok(singleton(status));
130
+ }
131
+ if (view.facet === "pseudocode") {
132
+ const page = pseudocodePage(dossier.pseudocode, view.offset, view.limit);
133
+ return page.ok
134
+ ? ok({ kind: "native", view, ...page.value, ...common })
135
+ : page;
136
+ }
137
+ const rows = nativeRows(dossier, view.facet);
138
+ if (rows === undefined)
139
+ return ok(singleton({
140
+ available: false,
141
+ // Only value-flow facets inherit the value-flow failure reason; an
142
+ // older dossier simply has no unresolved_calls record.
143
+ reason: view.facet.startsWith("value_flow_") && flow?.available === false
144
+ ? flow.reason
145
+ : "not recorded",
146
+ }));
147
+ const items = rows.slice(view.offset, view.offset + view.limit);
148
+ return ok({
149
+ kind: "native",
150
+ view,
151
+ item: jsonValueSchema.parse(items),
152
+ coverage: pageViewCoverage(view.offset, items.length, rows.length),
153
+ ...common,
154
+ });
155
+ };
@@ -6,6 +6,7 @@ import { evidenceSchema } from "../evidence.js";
6
6
  import { digestSchema } from "../digests.js";
7
7
  import { prefixedDigestSchema } from "../digests.js";
8
8
  import { bridgeCandidateCoverageSchema, projectCartesianCandidates, } from "../bridgeCandidateProjection.js";
9
+ import { nativeRuntimeConvention } from "../nativeConvention.js";
9
10
  const evidenceIdSchema = prefixedDigestSchema("ev");
10
11
  const pathSchema = z.string().min(1);
11
12
  const componentSchema = z.strictObject({
@@ -65,7 +66,7 @@ export const projectAndroidApplication = (input) => {
65
66
  const parsed = androidApplicationProjectionInputSchema.parse(input);
66
67
  const { evidence, inventory } = parseArtifactInventoryEvidence(parsed.inventory_evidence);
67
68
  if (inventory.manifest.root_format !== "apk")
68
- throw new TypeError("Android application projection requires APK Evidence");
69
+ throw new TypeError(`Android application projection requires APK inventory Evidence; the inventory root format is ${inventory.manifest.root_format}. APK is chosen for a ZIP archive whose name ends in .apk.`);
69
70
  const nodes = new Map(inventory.nodes.map((node) => [node.artifact_id, node]));
70
71
  const all = inventory.occurrences
71
72
  .filter((occurrence) => occurrence.artifact_id !== null && occurrence.logical_path !== ".")
@@ -90,6 +91,13 @@ export const projectAndroidApplication = (input) => {
90
91
  "Manifest, resource, signing, and bytecode semantics require a dedicated Android provider; this projection reports exact inventory paths and hashes only.",
91
92
  "Runtime families are inferred from inventory formats and paths; filename suffixes do not establish valid DEX or JVM class bytes.",
92
93
  "Bridge candidates are path-based hypotheses, not decoded JNI declarations or observed runtime calls.",
94
+ "A bridge basis is inferred from the native path and is repeated for every managed component.",
95
+ "ZIP inventory cannot see the APK Signing Block, so an empty signing array does not mean the APK is unsigned.",
96
+ ...(all.some(({ path }) => path === "AndroidManifest.xml")
97
+ ? []
98
+ : [
99
+ "No root AndroidManifest.xml occurrence was observed. The APK family comes from the .apk suffix of a ZIP archive, so these bytes may not be an APK.",
100
+ ]),
93
101
  ...(bridgeProjection.coverage.status === "partial"
94
102
  ? [
95
103
  `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.`,
@@ -120,32 +128,29 @@ export const projectAndroidApplication = (input) => {
120
128
  });
121
129
  };
122
130
  const classify = (all) => ({
123
- manifests: all.filter(({ path, format }) => format === "android-manifest" ||
124
- /(?:^|\/)AndroidManifest\.xml$/u.test(path)),
125
- resources: all.filter(({ path, format }) => format === "android-resources" || /(?:^|\/)resources\.arsc$/u.test(path)),
126
- dex: all.filter(({ path, format }) => format === "dex" || /(?:^|\/)[^/]+\.dex$/iu.test(path)),
127
- jvm_classes: all.filter(({ path, format }) => format === "jvm-class" || /(?:^|\/)[^/]+\.class$/iu.test(path)),
131
+ manifests: all.filter(({ path }) => /(?:^|\/)AndroidManifest\.xml$/u.test(path)),
132
+ resources: all.filter(({ path }) => /(?:^|\/)resources\.arsc$/u.test(path)),
133
+ dex: all.filter(({ path }) => /(?:^|\/)[^/]+\.dex$/iu.test(path)),
134
+ jvm_classes: all.filter(({ path }) => /(?:^|\/)[^/]+\.class$/iu.test(path)),
128
135
  native_libraries: all.filter(({ path, format }) => format === "elf" || /(?:^|\/)lib\/[^/]+\/[^/]+\.so$/iu.test(path)),
129
136
  javascript: all.filter(({ format }) => format === "javascript-bundle"),
130
137
  signing: all.filter(({ path }) => /^META-INF\/[^/]+\.(?:MF|RSA|DSA|EC|SF)$/iu.test(path)),
131
138
  });
132
139
  const runtimeFamilies = (all) => {
133
- const paths = all.map(({ path }) => path.toLowerCase());
134
140
  const families = new Set();
135
- if (all.some(({ path, format }) => format === "dex" || path.toLowerCase().endsWith(".dex")))
141
+ if (all.some(({ path }) => path.toLowerCase().endsWith(".dex")))
136
142
  families.add("dalvik-art");
137
- if (all.some(({ path, format }) => format === "jvm-class" || path.toLowerCase().endsWith(".class")))
143
+ if (all.some(({ path }) => path.toLowerCase().endsWith(".class")))
138
144
  families.add("java-kotlin");
139
145
  if (all.some(({ format }) => format === "elf"))
140
146
  families.add("native");
141
147
  if (all.some(({ format }) => format === "javascript-bundle"))
142
148
  families.add("javascript");
143
- if (paths.some((path) => path.includes("reactnative") || path.includes("hermes")))
144
- families.add("react-native");
145
- if (paths.some((path) => path.includes("libflutter.so")))
146
- families.add("flutter");
147
- if (paths.some((path) => path.includes("libunity.so")))
148
- families.add("unity");
149
+ for (const { path } of all) {
150
+ const convention = nativeRuntimeConvention(path);
151
+ if (convention !== null)
152
+ families.add(convention);
153
+ }
149
154
  return [...families].sort(compare);
150
155
  };
151
156
  const bridgeCandidates = (managed, native) => {
@@ -159,14 +164,14 @@ const bridgeCandidates = (managed, native) => {
159
164
  });
160
165
  };
161
166
  const bridgeBasis = (path) => {
162
- const lower = path.toLowerCase();
163
- if (lower.includes("react") || lower.includes("hermes"))
167
+ const convention = nativeRuntimeConvention(path);
168
+ if (convention === "react-native")
164
169
  return "react-native-convention";
165
- if (lower.includes("flutter"))
170
+ if (convention === "flutter")
166
171
  return "flutter-convention";
167
- if (lower.includes("unity"))
172
+ if (convention === "unity")
168
173
  return "unity-convention";
169
- if (/lib\/[^/]+\/lib[^/]+\.so$/u.test(lower))
174
+ if (/(?:^|\/)lib\/[^/]+\/lib[^/]+\.so$/iu.test(path))
170
175
  return "jni-library-convention";
171
176
  return "managed-and-native-content";
172
177
  };
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+ import { localPathStringSchema } from "../localPath.js";
3
+ import { digestSchema } from "../digests.js";
4
+ /** Upper bound for one decoded resource projection in one response. */
5
+ const MAX_MANIFEST_BYTES = 512 * 1024;
6
+ const MAX_STRINGS = 2_000;
7
+ /**
8
+ * Caller intent for Apktool-backed resource decoding. Apktool is
9
+ * bring-your-own: REA never installs it, and decoding happens in a
10
+ * provider-owned workspace that is removed after the facts are projected.
11
+ */
12
+ export const apktoolInputSchemas = {
13
+ inspect_apktool_client: z.strictObject({}),
14
+ decode_android_resources: z.strictObject({
15
+ path: localPathStringSchema.describe("Local APK file to decode"),
16
+ include_strings: z
17
+ .boolean()
18
+ .default(true)
19
+ .describe(`Project res/values/strings.xml entries (bounded to ${String(MAX_STRINGS)} entries)`),
20
+ locale: z
21
+ .string()
22
+ .min(2)
23
+ .max(16)
24
+ .regex(/^(?:[a-z]{2,3}(?:-(?:r?[A-Z]{2}|r?[0-9]{3}))?|b\+[a-z]{2,3}(?:\+[A-Za-z0-9]{2,8})*)$/u, "Locale must look like de, pt-BR, pt-rBR, or b+zh+Hans+CN")
25
+ .optional()
26
+ .describe("Project strings from res/values-<locale>/strings.xml instead of the default table"),
27
+ }),
28
+ };
29
+ /** Validate operation and input together so their types remain correlated. */
30
+ export const apktoolRequestSchema = z.discriminatedUnion("operation", [
31
+ z.strictObject({
32
+ operation: z.literal("inspect_apktool_client"),
33
+ input: apktoolInputSchemas.inspect_apktool_client,
34
+ }),
35
+ z.strictObject({
36
+ operation: z.literal("decode_android_resources"),
37
+ input: apktoolInputSchemas.decode_android_resources,
38
+ }),
39
+ ]);
40
+ const client = z.strictObject({
41
+ command: z.string().min(1),
42
+ command_source: z.enum(["environment", "path"]),
43
+ apktool_version: z.string().min(1).nullable(),
44
+ });
45
+ /** Portable Apktool observations with explicit coverage limitations. */
46
+ export const apktoolResultSchemas = {
47
+ inspect_apktool_client: z.strictObject({
48
+ client,
49
+ }),
50
+ decode_android_resources: z.strictObject({
51
+ client,
52
+ target: z.strictObject({
53
+ path: localPathStringSchema,
54
+ bytes: z.number().int().nonnegative(),
55
+ sha256: digestSchema,
56
+ }),
57
+ metadata: z.strictObject({
58
+ version_name: z.string().nullable(),
59
+ version_code: z
60
+ .string()
61
+ .nullable()
62
+ .describe("Version code exactly as apktool.yml prints it, e.g. '45' or '45.1'"),
63
+ min_sdk_version: z.string().nullable(),
64
+ target_sdk_version: z.string().nullable(),
65
+ package_name: z.string().nullable(),
66
+ }),
67
+ manifest: z.string().nullable(),
68
+ strings: z.array(z.strictObject({
69
+ name: z.string().min(1),
70
+ value: z.string(),
71
+ })),
72
+ locale: z.string().nullable(),
73
+ locales: z.array(z.string().min(1)),
74
+ decoded_file_count: z.number().int().nonnegative(),
75
+ coverage: z.enum(["complete", "partial"]),
76
+ }),
77
+ };
@@ -1,7 +1,8 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
- import { appleBundleSchema, appleComponentSchema, applicationRoots, detectBundles, isMachOFormat, isSidecar, isWithin, platformsOf, } from "./appleBundleAnatomy.js";
4
+ import { anatomyNameIs, anatomyTailMatches, appleBundleSchema, appleComponentSchema, applicationRoots, detectBundles, isMachOFormat, isSidecar, isWithin, platformsOf, } from "./appleBundleAnatomy.js";
5
+ import { isSwiftRuntimeLibrary, nativeRuntimeConvention, } from "../nativeConvention.js";
5
6
  import { parseArtifactInventoryEvidence } from "../artifactInventoryEvidence.js";
6
7
  import { evidenceSchema } from "../evidence.js";
7
8
  import { digestSchema } from "../digests.js";
@@ -166,48 +167,61 @@ const appleRootFormat = (format) => {
166
167
  };
167
168
  const classifyComponents = (entries, all, roots) => {
168
169
  const withinApp = (path) => roots.some((root) => isWithin(path, root));
169
- const anatomy = (pattern) => entries.flatMap(({ path, kind, component }) => kind === "file" &&
170
+ const matching = (predicate) => entries.flatMap(({ path, kind, component }) => kind === "file" &&
170
171
  component !== undefined &&
171
172
  !isSidecar(path) &&
172
173
  withinApp(path) &&
173
- pattern.test(path)
174
+ predicate(path)
174
175
  ? [component]
175
176
  : []);
177
+ const lastSegment = (path) => path.split("/").at(-1) ?? "";
176
178
  return {
177
- bundle_metadata: all.filter(({ path }) => /(?:^|\/)Info\.plist$/u.test(path)),
179
+ bundle_metadata: all.filter(({ path }) => anatomyNameIs(lastSegment(path), "Info.plist")),
178
180
  executables: all.filter(({ path, format }) => withinApp(path) && isMachOFormat(format)),
179
181
  frameworks: all.filter(({ path }) => /\.framework\//u.test(path)),
180
182
  native_libraries: all.filter(({ path }) => /\.(?:dylib|so)$/iu.test(path)),
181
183
  javascript: all.filter(({ format }) => format === "javascript-bundle"),
182
- signing: all.filter(({ path }) => /(?:^|\/)(?:embedded\.(?:mobileprovision|provisionprofile)|_CodeSignature\/CodeResources)$/u.test(path)),
183
- privileged_helpers: anatomy(/(?:^|\/)Contents\/Library\/LaunchServices\/[^/]+$/u),
184
- launchd_plists: anatomy(/(?:^|\/)Contents\/Library\/Launch(?:Agents|Daemons)\/[^/]+\.plist$/u).map((component) => ({
184
+ signing: all.filter(({ path }) => anatomyTailMatches(path, ["_CodeSignature", "CodeResources"]) ||
185
+ anatomyNameIs(lastSegment(path), "embedded.mobileprovision") ||
186
+ anatomyNameIs(lastSegment(path), "embedded.provisionprofile")),
187
+ privileged_helpers: matching((path) => anatomyTailMatches(path, ["Contents", "Library", "LaunchServices", "*"])),
188
+ launchd_plists: matching((path) => path.endsWith(".plist") &&
189
+ (anatomyTailMatches(path, [
190
+ "Contents",
191
+ "Library",
192
+ "LaunchAgents",
193
+ "*",
194
+ ]) ||
195
+ anatomyTailMatches(path, [
196
+ "Contents",
197
+ "Library",
198
+ "LaunchDaemons",
199
+ "*",
200
+ ]))).map((component) => ({
185
201
  ...component,
186
- domain: component.path.includes("/LaunchDaemons/")
202
+ domain: component.path
203
+ .split("/")
204
+ .some((segment) => anatomyNameIs(segment, "LaunchDaemons"))
187
205
  ? "daemon"
188
206
  : "agent",
189
207
  })),
190
- helpers: anatomy(/(?:^|\/)Contents\/Helpers\/[^/]+$/u),
208
+ helpers: matching((path) => anatomyTailMatches(path, ["Contents", "Helpers", "*"])),
191
209
  };
192
210
  };
193
211
  const deduplicateComponents = (values) => [...new Map(values.map((value) => [value.path, value])).values()].sort((left, right) => compare(left.path, right.path));
194
212
  const identifyRuntimeFamilies = (all) => {
195
- const paths = all.map(({ path }) => path.toLowerCase());
196
213
  const families = new Set();
197
214
  if (all.some(({ format }) => ["mach-o", "mach-o-universal"].includes(format)))
198
215
  families.add("native");
199
- if (paths.some((path) => /\.(?:dylib|framework\/[^/]+)$/u.test(path)))
216
+ if (all.some(({ path }) => isSwiftRuntimeLibrary(path)))
200
217
  families.add("swift-objective-c");
201
218
  if (all.some(({ format }) => format === "javascript-bundle"))
202
219
  families.add("javascript");
203
- if (paths.some((path) => path.includes("reactnative") ||
204
- path.includes("react.framework") ||
205
- path.includes("hermes")))
206
- families.add("react-native");
207
- if (paths.some((path) => path.includes("flutter.framework") || path.includes("app.framework")))
208
- families.add("flutter");
209
- if (paths.some((path) => path.includes("unityframework.framework")))
210
- families.add("unity");
220
+ for (const { path } of all) {
221
+ const convention = nativeRuntimeConvention(path);
222
+ if (convention !== null)
223
+ families.add(convention);
224
+ }
211
225
  return [...families].sort(compare);
212
226
  };
213
227
  /** Pair scripts and native code within matching application-root groups. */
@@ -243,12 +257,12 @@ const identifyBridgeCandidates = (scripts, native, roots) => {
243
257
  });
244
258
  };
245
259
  const bridgeBasis = (path) => {
246
- const lower = path.toLowerCase();
247
- if (lower.includes("react"))
260
+ const convention = nativeRuntimeConvention(path);
261
+ if (convention === "react-native")
248
262
  return "react-native-convention";
249
- if (lower.includes("flutter") || lower.includes("app.framework"))
263
+ if (convention === "flutter")
250
264
  return "flutter-convention";
251
- if (lower.includes("unity"))
265
+ if (convention === "unity")
252
266
  return "unity-convention";
253
267
  return "javascript-and-native-content";
254
268
  };
@@ -293,7 +307,10 @@ const projectionLimitations = (facts) => [
293
307
  : []),
294
308
  "Bundle roles follow path conventions. Read each info_plist_path with inspect_plist for CFBundleExecutable, identifiers, and declared services.",
295
309
  "Bundle identifiers and signing claims require dedicated plist and CMS parsing; this projection reports only exact paths and hashes.",
310
+ "Runtime families are inferred from inventory formats and bounded framework path conventions, not observed runtime loading.",
311
+ "Generic framework and dylib paths do not establish Swift or Objective-C; this inventory projection does not decode language metadata.",
296
312
  "Bridge candidates are path-based hypotheses, not observed runtime calls.",
313
+ "A bridge basis is inferred from the native path and is repeated for every managed component.",
297
314
  ];
298
315
  const compare = (left, right) => left < right ? -1 : left > right ? 1 : 0;
299
316
  const digest = (value) => {