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
@@ -5,9 +5,12 @@ import { createHash } from "node:crypto";
5
5
  import { isAbsolute, join, relative, sep } from "node:path";
6
6
  import { Readable, Transform } from "node:stream";
7
7
  import { pipeline } from "node:stream/promises";
8
- import { getRawHeader, listPackage, statFile, uncache } from "@electron/asar";
9
- import { ArtifactReaderFailure, } from "./ArtifactReader.js";
8
+ import { listPackage, statFile, uncache } from "@electron/asar";
9
+ import { ArtifactReaderFailure, copyArtifactEntry, sameArtifactEntry, } from "./ArtifactReader.js";
10
10
  import { closeAsarHandle, readValidatedAsarEntry } from "./AsarEntryStream.js";
11
+ import { admitAsarHeader } from "./AsarHeader.js";
12
+ import { OwnedFileHandle } from "../filesystem/OwnedFileHandle.js";
13
+ import { readFileHandleChunks } from "../filesystem/readFileHandleChunks.js";
11
14
  /**
12
15
  * Official Electron ASAR adapter with range-streamed member reads.
13
16
  *
@@ -23,8 +26,10 @@ export class AsarArtifactReader {
23
26
  #archiveSize;
24
27
  #headerSize;
25
28
  #entries = new Map();
29
+ #unpackedHandles = new Map();
26
30
  #snapshot;
27
31
  #snapshotRoot;
32
+ #snapshotOperation = Promise.resolve();
28
33
  constructor(path, openUnpackedFile = open, removeSnapshot = (path) => rm(path, { recursive: true, force: true })) {
29
34
  this.path = path;
30
35
  this.openUnpackedFile = openUnpackedFile;
@@ -37,8 +42,17 @@ export class AsarArtifactReader {
37
42
  const snapshotPath = this.#snapshotPath();
38
43
  this.#resetArchiveState();
39
44
  this.#entries.clear();
45
+ const headerHandle = await open(snapshotPath, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
46
+ try {
47
+ const admitted = await admitAsarHeader(headerHandle);
48
+ this.#archiveSize = admitted.archiveBytes;
49
+ this.#headerSize = admitted.headerBytes;
50
+ }
51
+ finally {
52
+ await headerHandle.close();
53
+ }
54
+ abortIfNeeded(signal);
40
55
  paths = listPackage(snapshotPath, { isPack: false }).sort((left, right) => left.localeCompare(right, "en"));
41
- this.#headerSize = getRawHeader(snapshotPath).headerSize;
42
56
  const archiveMetadata = await lstat(snapshotPath);
43
57
  if (!archiveMetadata.isFile() || archiveMetadata.isSymbolicLink())
44
58
  throw new ArtifactReaderFailure("format", "ASAR container is not a regular file");
@@ -109,24 +123,8 @@ export class AsarArtifactReader {
109
123
  throw new ArtifactReaderFailure("integrity", `ASAR entry metadata changed since inventory: ${state.entry.path}`);
110
124
  const { metadata } = state;
111
125
  const producedEntry = state.entry;
112
- if (producedEntry.unpacked) {
113
- const handle = await this.#openUnpackedEntry(producedEntry);
114
- try {
115
- const observed = await handle.stat();
116
- abortIfNeeded(signal);
117
- if (!observed.isFile())
118
- throw new ArtifactReaderFailure("path", `ASAR unpacked entry is not a regular file: ${producedEntry.path}`);
119
- }
120
- catch (cause) {
121
- await handle.close().catch(() => undefined);
122
- throw asarFailure(this.path, `read ${producedEntry.path}`, cause);
123
- }
124
- const source = handle.createReadStream({
125
- start: 0,
126
- autoClose: true,
127
- });
128
- return readValidatedAsarEntry(source, undefined, producedEntry.path, this.path, signal);
129
- }
126
+ if (producedEntry.unpacked)
127
+ return this.#openUnpackedStream(producedEntry, signal);
130
128
  const archiveSize = this.#archiveSize;
131
129
  const headerSize = this.#headerSize;
132
130
  const offset = metadata.offset === undefined
@@ -170,41 +168,16 @@ export class AsarArtifactReader {
170
168
  }
171
169
  /** Capture once per reader lifetime; bind all interpretation to these exact bytes. */
172
170
  async prepareContainer(expectedSha256, signal) {
173
- abortIfNeeded(signal);
174
- if (this.#snapshot === undefined && this.#snapshotRoot !== undefined)
175
- await this.close();
176
- if (this.#snapshot === undefined) {
177
- try {
178
- this.#snapshotRoot = await mkdtemp(join(tmpdir(), "rea-asar-snapshot-"));
179
- const snapshotPath = join(this.#snapshotRoot, "container.asar");
180
- const hash = createHash("sha256");
181
- const handle = await open(this.path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
182
- const source = handle.createReadStream();
183
- const digesting = new Transform({
184
- transform(chunk, _encoding, callback) {
185
- hash.update(chunk);
186
- callback(null, chunk);
187
- },
188
- });
189
- await pipeline(source, digesting, createWriteStream(snapshotPath, { flags: "wx", mode: 0o600 }), signal === undefined ? {} : { signal });
190
- this.#snapshot = { path: snapshotPath, sha256: hash.digest("hex") };
191
- }
192
- catch (cause) {
193
- const primary = signal?.aborted === true
194
- ? new ArtifactReaderFailure("cancelled", "ASAR operation cancelled", { cause })
195
- : asarFailure(this.path, "snapshot", cause);
196
- try {
197
- await this.close();
198
- }
199
- catch (cleanupCause) {
200
- throw ArtifactReaderFailure.withCleanup(primary, ArtifactReaderFailure.cleanupObservation(cleanupCause, this.path));
201
- }
202
- throw primary;
203
- }
204
- }
205
- if (expectedSha256 !== undefined &&
206
- this.#snapshot.sha256 !== expectedSha256)
207
- throw new ArtifactReaderFailure("integrity", `ASAR container changed before interpretation: ${this.path}`);
171
+ await this.#withSnapshotOperation(async () => {
172
+ abortIfNeeded(signal);
173
+ if (this.#snapshot === undefined && this.#snapshotRoot !== undefined)
174
+ await this.#closeSnapshot();
175
+ if (this.#snapshot === undefined)
176
+ await this.#captureSnapshot(signal);
177
+ if (expectedSha256 !== undefined &&
178
+ this.#snapshot?.sha256 !== expectedSha256)
179
+ throw new ArtifactReaderFailure("integrity", `ASAR container changed before interpretation: ${this.path}`);
180
+ }, signal);
208
181
  }
209
182
  /** Read the same captured container that supplies headers and packed members. */
210
183
  async openContainer(signal) {
@@ -212,10 +185,64 @@ export class AsarArtifactReader {
212
185
  return createReadStream(this.#snapshotPath(), signal === undefined ? {} : { signal });
213
186
  }
214
187
  async close() {
188
+ await this.#withSnapshotOperation(async () => {
189
+ let cleanupFailure;
190
+ for (const [handle, { path }] of this.#unpackedHandles) {
191
+ try {
192
+ await this.#closeUnpackedHandle(handle);
193
+ }
194
+ catch (cause) {
195
+ cleanupFailure = ArtifactReaderFailure.withCleanup(cleanupFailure ?? cause, ArtifactReaderFailure.cleanupObservation(cause, path));
196
+ }
197
+ }
198
+ try {
199
+ await this.#closeSnapshot();
200
+ }
201
+ catch (cause) {
202
+ cleanupFailure = ArtifactReaderFailure.withCleanup(cleanupFailure ?? cause, ArtifactReaderFailure.cleanupObservation(cause, this.path));
203
+ }
204
+ if (cleanupFailure !== undefined)
205
+ throw cleanupFailure;
206
+ });
207
+ }
208
+ async #captureSnapshot(signal) {
209
+ try {
210
+ this.#snapshotRoot = await mkdtemp(join(tmpdir(), "rea-asar-snapshot-"));
211
+ const snapshotPath = join(this.#snapshotRoot, "container.asar");
212
+ const hash = createHash("sha256");
213
+ const handle = await open(this.path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
214
+ const source = handle.createReadStream();
215
+ const digesting = new Transform({
216
+ transform(chunk, _encoding, callback) {
217
+ hash.update(chunk);
218
+ callback(null, chunk);
219
+ },
220
+ });
221
+ await pipeline(source, digesting, createWriteStream(snapshotPath, { flags: "wx", mode: 0o600 }), signal === undefined ? {} : { signal });
222
+ this.#snapshot = { path: snapshotPath, sha256: hash.digest("hex") };
223
+ }
224
+ catch (cause) {
225
+ const primary = signal?.aborted === true
226
+ ? new ArtifactReaderFailure("cancelled", "ASAR operation cancelled", {
227
+ cause,
228
+ })
229
+ : asarFailure(this.path, "snapshot", cause);
230
+ try {
231
+ await this.#closeSnapshot();
232
+ }
233
+ catch (cleanupCause) {
234
+ throw ArtifactReaderFailure.withCleanup(primary, ArtifactReaderFailure.cleanupObservation(cleanupCause, this.#snapshotRoot ?? this.path));
235
+ }
236
+ throw primary;
237
+ }
238
+ }
239
+ async #closeSnapshot() {
215
240
  const root = this.#snapshotRoot;
216
241
  if (root !== undefined) {
217
242
  try {
218
243
  await this.removeSnapshot(root);
244
+ if (this.#snapshotRoot === root)
245
+ this.#snapshotRoot = undefined;
219
246
  }
220
247
  catch (cause) {
221
248
  throw ArtifactReaderFailure.withCleanup(cause, {
@@ -223,13 +250,35 @@ export class AsarArtifactReader {
223
250
  resources: [root],
224
251
  });
225
252
  }
226
- this.#snapshotRoot = undefined;
227
253
  }
228
- if (this.#snapshot !== undefined)
229
- uncache(this.#snapshot.path);
230
- this.#snapshot = undefined;
231
- this.#resetArchiveState();
232
- this.#entries.clear();
254
+ if (root === undefined || this.#snapshotRoot === undefined) {
255
+ if (this.#snapshot !== undefined)
256
+ uncache(this.#snapshot.path);
257
+ this.#snapshot = undefined;
258
+ this.#resetArchiveState();
259
+ this.#entries.clear();
260
+ }
261
+ }
262
+ async #withSnapshotOperation(operation, signal) {
263
+ const previous = this.#snapshotOperation;
264
+ let release;
265
+ this.#snapshotOperation = new Promise((resolve) => {
266
+ release = resolve;
267
+ });
268
+ try {
269
+ await waitForOperation(previous, signal);
270
+ }
271
+ catch (cause) {
272
+ void previous.then(release, release);
273
+ throw cause;
274
+ }
275
+ try {
276
+ abortIfNeeded(signal);
277
+ return await operation();
278
+ }
279
+ finally {
280
+ release();
281
+ }
233
282
  }
234
283
  #snapshotPath() {
235
284
  if (this.#snapshot === undefined)
@@ -239,8 +288,9 @@ export class AsarArtifactReader {
239
288
  provenance() {
240
289
  return [];
241
290
  }
242
- async #openUnpackedEntry(entry) {
291
+ async #openUnpackedStream(entry, signal) {
243
292
  const unpackedRoot = `${this.path}.unpacked`;
293
+ let handle;
244
294
  try {
245
295
  const rootMetadata = await lstat(unpackedRoot);
246
296
  if (!rootMetadata.isDirectory() || rootMetadata.isSymbolicLink())
@@ -256,17 +306,16 @@ export class AsarArtifactReader {
256
306
  const pathMetadata = await lstat(candidate);
257
307
  if (!pathMetadata.isFile() || pathMetadata.isSymbolicLink())
258
308
  throw new ArtifactReaderFailure("path", `ASAR unpacked entry is not a regular file: ${entry.path}`);
259
- const handle = await this.openUnpackedFile(canonical, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
260
- const openedMetadata = await handle
261
- .stat()
262
- .catch(async (cause) => {
263
- await handle.close().catch(() => undefined);
264
- throw cause;
309
+ handle = await this.openUnpackedFile(canonical, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
310
+ const openedHandle = handle;
311
+ this.#unpackedHandles.set(openedHandle, {
312
+ path: canonical,
313
+ owner: new OwnedFileHandle(openedHandle),
265
314
  });
315
+ const openedMetadata = await openedHandle.stat();
266
316
  if (!openedMetadata.isFile() ||
267
317
  openedMetadata.dev !== pathMetadata.dev ||
268
318
  openedMetadata.ino !== pathMetadata.ino) {
269
- await handle.close();
270
319
  throw new ArtifactReaderFailure("integrity", `ASAR unpacked entry changed before read: ${entry.path}`, {}, {
271
320
  logicalPath: entry.path,
272
321
  declaredSha256: entry.declaredSha256,
@@ -274,47 +323,52 @@ export class AsarArtifactReader {
274
323
  unpacked: true,
275
324
  });
276
325
  }
277
- return handle;
326
+ abortIfNeeded(signal);
327
+ const source = readFileHandleChunks(openedHandle, {
328
+ start: 0,
329
+ });
330
+ source.once("close", () => {
331
+ void this.#closeUnpackedHandle(openedHandle).catch(() => undefined);
332
+ });
333
+ return readValidatedAsarEntry(source, undefined, entry.path, this.path, signal);
278
334
  }
279
335
  catch (cause) {
280
- if (cause instanceof ArtifactReaderFailure)
281
- throw cause;
282
- if (entry.unpacked && isMissingFile(cause))
283
- throw new ArtifactReaderFailure("unavailable", `ASAR unpacked entry bytes are unavailable: ${entry.path}`, { cause }, {
284
- logicalPath: entry.path,
285
- declaredSha256: entry.declaredSha256,
286
- calculatedSha256: null,
287
- unpacked: true,
288
- });
289
- throw asarFailure(this.path, `read ${entry.path}`, cause);
336
+ let failure = asarUnpackedEntryFailure(this.path, entry, cause);
337
+ if (handle !== undefined && this.#unpackedHandles.has(handle)) {
338
+ try {
339
+ await this.#closeUnpackedHandle(handle);
340
+ }
341
+ catch (cleanupCause) {
342
+ failure = ArtifactReaderFailure.withCleanup(failure, ArtifactReaderFailure.cleanupObservation(cleanupCause, this.#unpackedHandles.get(handle)?.path ?? entry.path));
343
+ }
344
+ }
345
+ throw failure;
290
346
  }
291
347
  }
348
+ async #closeUnpackedHandle(handle) {
349
+ const owned = this.#unpackedHandles.get(handle);
350
+ if (owned === undefined)
351
+ return;
352
+ await owned.owner.close();
353
+ this.#unpackedHandles.delete(handle);
354
+ }
292
355
  #resetArchiveState() {
293
356
  this.#archiveSize = undefined;
294
357
  this.#headerSize = undefined;
295
358
  }
296
359
  }
297
- const copyArtifactEntry = (entry) => ({
298
- ...entry,
299
- limitations: [...entry.limitations],
300
- ...(entry.sourceIdentity === undefined
301
- ? {}
302
- : { sourceIdentity: { ...entry.sourceIdentity } }),
303
- });
304
- const sameArtifactEntry = (entry, produced) => entry.path === produced.path &&
305
- entry.kind === produced.kind &&
306
- entry.declaredSize === produced.declaredSize &&
307
- entry.compressedSize === produced.compressedSize &&
308
- entry.executable === produced.executable &&
309
- entry.encrypted === produced.encrypted &&
310
- entry.byteOffset === produced.byteOffset &&
311
- entry.declaredSha256 === produced.declaredSha256 &&
312
- entry.unpacked === produced.unpacked &&
313
- entry.adapterKey === produced.adapterKey &&
314
- entry.limitations.length === produced.limitations.length &&
315
- entry.limitations.every((limitation, index) => limitation === produced.limitations[index]) &&
316
- entry.sourceIdentity?.device === produced.sourceIdentity?.device &&
317
- entry.sourceIdentity?.inode === produced.sourceIdentity?.inode;
360
+ const asarUnpackedEntryFailure = (archivePath, entry, cause) => {
361
+ if (cause instanceof ArtifactReaderFailure)
362
+ return cause;
363
+ if (entry.unpacked && isMissingFile(cause))
364
+ return new ArtifactReaderFailure("unavailable", `ASAR unpacked entry bytes are unavailable: ${entry.path}`, { cause }, {
365
+ logicalPath: entry.path,
366
+ declaredSha256: entry.declaredSha256,
367
+ calculatedSha256: null,
368
+ unpacked: true,
369
+ });
370
+ return asarFailure(archivePath, `read ${entry.path}`, cause);
371
+ };
318
372
  const isAsarFileMetadata = (metadata) => "size" in metadata &&
319
373
  typeof metadata.size === "number" &&
320
374
  !("files" in metadata) &&
@@ -329,6 +383,26 @@ const abortIfNeeded = (signal) => {
329
383
  if (signal?.aborted === true)
330
384
  throw new ArtifactReaderFailure("cancelled", "ASAR operation cancelled");
331
385
  };
386
+ const waitForOperation = async (operation, signal) => {
387
+ if (signal === undefined)
388
+ return operation;
389
+ abortIfNeeded(signal);
390
+ await new Promise((resolve, reject) => {
391
+ const removeAbortListener = () => signal.removeEventListener("abort", onAbort);
392
+ const onAbort = () => {
393
+ removeAbortListener();
394
+ reject(new ArtifactReaderFailure("cancelled", "ASAR operation cancelled"));
395
+ };
396
+ signal.addEventListener("abort", onAbort, { once: true });
397
+ operation.then(() => {
398
+ removeAbortListener();
399
+ resolve();
400
+ }, (cause) => {
401
+ removeAbortListener();
402
+ reject(cause);
403
+ });
404
+ });
405
+ };
332
406
  const toArtifactPath = (listed) => {
333
407
  const portable = sep === "\\" ? listed.replaceAll("\\", "/") : listed;
334
408
  return portable.replace(/^\/+|\/+$/gu, "");
@@ -0,0 +1,24 @@
1
+ import { ArtifactReaderFailure } from "./ArtifactReader.js";
2
+ /** Shared resource budget for the eagerly decoded ASAR header, not member bytes. */
3
+ export const MAX_ASAR_HEADER_BYTES = 16 * 1024 * 1024;
4
+ /** Admit both Chromium pickle extents before an upstream decoder allocates them. */
5
+ export const admitAsarHeader = async (handle) => {
6
+ const observed = await handle.stat();
7
+ if (!observed.isFile())
8
+ throw new ArtifactReaderFailure("format", "ASAR container is not a regular file");
9
+ const prefix = Buffer.alloc(16);
10
+ const read = await handle.read(prefix, 0, prefix.length, 0);
11
+ if (read.bytesRead !== prefix.length || prefix.readUInt32LE(0) !== 4)
12
+ throw new ArtifactReaderFailure("format", "Truncated or invalid ASAR size pickle");
13
+ const headerBytes = prefix.readUInt32LE(4);
14
+ const payloadBytes = prefix.readUInt32LE(8);
15
+ const jsonBytes = prefix.readUInt32LE(12);
16
+ if (headerBytes < 8 ||
17
+ headerBytes > observed.size - 8 ||
18
+ payloadBytes !== headerBytes - 4 ||
19
+ jsonBytes > payloadBytes - 4)
20
+ throw new ArtifactReaderFailure("format", "ASAR header leaves its container or has invalid pickle extents");
21
+ if (headerBytes > MAX_ASAR_HEADER_BYTES)
22
+ throw new ArtifactReaderFailure("limit", `ASAR header exceeds the ${String(MAX_ASAR_HEADER_BYTES)} byte decode budget`);
23
+ return { archiveBytes: observed.size, headerBytes, jsonBytes };
24
+ };