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,13 +5,16 @@ import { readReferenceSource } from "../reference/ReferenceSourceReader.js";
5
5
  import { parseReferenceSourceEntries } from "./ReferenceSourceImportEntries.js";
6
6
  import { readReferenceSourceVcs } from "./ReferenceSourceVcsAdapter.js";
7
7
  import {} from "./ReferenceSourceImportTypes.js";
8
- import { prepareReferenceSourceImport } from "./ReferenceSourceImportPolicy.js";
8
+ import { prepareReferenceSourceImport, } from "./ReferenceSourceImportPolicy.js";
9
9
  const failure = (code, message) => ({
10
10
  tag: "reference-source-import",
11
11
  code,
12
12
  message,
13
13
  });
14
- const cancelled = () => failure("cancelled", "Reference source import cancelled");
14
+ const cancelled = (partial) => ({
15
+ ...failure("cancelled", "Reference source import cancelled"),
16
+ ...(partial === undefined ? {} : { partial }),
17
+ });
15
18
  const isAborted = (signal) => signal?.aborted === true;
16
19
  const relationshipKey = (relationship) => `${relationship.from_path}\u0000${relationship.to}\u0000${relationship.kind}\u0000${relationship.resolution}\u0000${relationship.parse_state}`;
17
20
  const deduplicateRelationships = (relationships) => {
@@ -65,8 +68,37 @@ const sortExclusions = (exclusions) => [...exclusions].sort((left, right) => {
65
68
  const byPath = compareUnicodeCodePoints(left.path, right.path);
66
69
  if (byPath !== 0)
67
70
  return byPath;
68
- return compareUnicodeCodePoints(left.reason, right.reason);
71
+ const byReason = compareUnicodeCodePoints(left.reason, right.reason);
72
+ if (byReason !== 0)
73
+ return byReason;
74
+ return compareUnicodeCodePoints("pattern" in left ? left.pattern : "", "pattern" in right ? right.pattern : "");
69
75
  });
76
+ const createShouldExclude = (exclusions, secrets, ignored) => (path, kind) => {
77
+ const patternPath = kind === "directory" ? `${path}/` : path;
78
+ const secretMatch = secrets.test(patternPath);
79
+ if (secretMatch.ignored) {
80
+ if (!secretMatch.rule)
81
+ throw new Error(`Ignored secret path has no matching rule: ${path}`);
82
+ exclusions.push({
83
+ path,
84
+ reason: "configured-secret",
85
+ pattern: secretMatch.rule.pattern,
86
+ });
87
+ return true;
88
+ }
89
+ const match = ignored.test(patternPath);
90
+ if (!match.ignored)
91
+ return false;
92
+ if (!match.rule)
93
+ throw new Error(`Ignored path has no matching rule: ${path}`);
94
+ const reason = match.rule.mark;
95
+ if (reason !== "project-ignored" &&
96
+ reason !== "default-ignored" &&
97
+ reason !== "caller-excluded")
98
+ throw new Error(`Ignored path has unknown rule origin: ${path}`);
99
+ exclusions.push({ path, reason, pattern: match.rule.pattern });
100
+ return true;
101
+ };
70
102
  /**
71
103
  * Import a reference source directory into a committed historical source graph.
72
104
  *
@@ -74,51 +106,38 @@ const sortExclusions = (exclusions) => [...exclusions].sort((left, right) => {
74
106
  * git subprocesses, or network requests. Paths explicitly excluded by the
75
107
  * caller's reference-source policy are omitted from the graph.
76
108
  */
77
- export const importReferenceSource = async (options) => {
109
+ export const importReferenceSource = async (options, resources) => {
78
110
  if (isAborted(options.signal))
79
111
  return err(cancelled());
80
- const prepared = await prepareReferenceSourceImport(options);
112
+ const prepared = await prepareReferenceSourceImport(options, resources);
81
113
  if (!prepared.ok)
82
114
  return prepared;
83
115
  const { ignored, root, secrets } = prepared.value;
84
116
  if (isAborted(options.signal))
85
117
  return err(cancelled());
86
118
  const exclusions = [];
87
- const shouldExclude = (path) => {
88
- if (secrets.ignores(path)) {
89
- exclusions.push({ path, reason: "configured-secret" });
90
- return true;
91
- }
92
- if (ignored.ignores(path)) {
93
- exclusions.push({ path, reason: "caller-excluded" });
94
- return true;
95
- }
96
- return false;
97
- };
98
- const [readResult, vcs] = await Promise.all([
99
- readReferenceSource(root, {
119
+ const shouldExclude = createShouldExclude(exclusions, secrets, ignored);
120
+ const [readResult, vcsResult] = await Promise.all([
121
+ readReferenceSource(root, resources, {
100
122
  ...(options.signal === undefined ? {} : { signal: options.signal }),
101
123
  shouldExclude,
102
124
  }),
103
- readReferenceSourceVcs(root, options.signal),
125
+ readReferenceSourceVcs(root, resources, options.signal),
104
126
  ]);
105
- if (!readResult.ok) {
106
- const error = readResult.error;
107
- if (error.code === "cancelled")
108
- return err(cancelled());
109
- if (error.code === "unsupported")
110
- return err(failure("unsupported", error.message));
111
- return err(failure("io", error.message));
112
- }
127
+ if (!readResult.ok)
128
+ return err(combineReadFailures(readResult.error, vcsResult.ok ? undefined : vcsResult.error, readResult.error.partial));
129
+ if (!vcsResult.ok)
130
+ return err(combineReadFailures(vcsResult.error, undefined, readResult.value));
131
+ const vcs = vcsResult.value;
113
132
  if (isAborted(options.signal))
114
- return err(cancelled());
133
+ return err(cancelled(readResult.value));
115
134
  const read = readResult.value;
116
135
  const filePaths = new Set(read.entries
117
136
  .filter((entry) => entry.status === "read" && entry.kind === "file")
118
137
  .map((entry) => entry.path));
119
138
  const { entries, relationships, parseFailures, limitations } = parseReferenceSourceEntries(read, filePaths, options.signal);
120
139
  if (isAborted(options.signal))
121
- return err(cancelled());
140
+ return err(cancelled(read));
122
141
  const uniqueRelationships = deduplicateRelationships(relationships);
123
142
  const uniqueFailures = normalizeHistoricalSourceParseFailures(parseFailures);
124
143
  const sortedEntries = [...entries].sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
@@ -152,3 +171,31 @@ export const importReferenceSource = async (options) => {
152
171
  return err(failure("parse", cause instanceof Error ? cause.message : "Graph failed validation"));
153
172
  }
154
173
  };
174
+ const combineReadFailures = (primary, other, partial) => {
175
+ const code = primary.code === "cancelled" || other?.code === "cancelled"
176
+ ? "cancelled"
177
+ : primary.code;
178
+ const cleanup = mergeCleanup(primary.cleanup, other?.cleanup);
179
+ const message = other === undefined
180
+ ? primary.message
181
+ : `${primary.message}; additional reference metadata failure: ${other.message}`;
182
+ const cause = other === undefined
183
+ ? primary.cause
184
+ : new AggregateError([primary, other], "Reference source inventory and metadata both failed", { cause: primary });
185
+ return {
186
+ ...failure(code, message),
187
+ ...(cleanup === undefined ? {} : { cleanup }),
188
+ ...(partial === undefined ? {} : { partial }),
189
+ ...(cause === undefined ? {} : { cause }),
190
+ };
191
+ };
192
+ const mergeCleanup = (first, second) => {
193
+ if (first === undefined)
194
+ return second;
195
+ if (second === undefined)
196
+ return first;
197
+ return {
198
+ reason: `${first.reason}; ${second.reason}`,
199
+ resources: [...new Set([...first.resources, ...second.resources])],
200
+ };
201
+ };
@@ -1,5 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { posix } from "node:path";
3
+ import { logicalPathEscapesRoot } from "../domain/artifactIdentity.js";
4
+ import { createReferenceSourcePathLookup, isPortableAbsoluteReferenceTarget, } from "../domain/referenceSourcePathIdentity.js";
3
5
  import { classifyReferenceSourcePath, detectReferenceSourceLanguage, } from "../domain/referenceSourceClassification.js";
4
6
  import { parseReferenceSourceImports } from "../domain/referenceSourceImportParsing.js";
5
7
  import { PARSEABLE_REFERENCE_SOURCE_LANGUAGES } from "./ReferenceSourceImportTypes.js";
@@ -48,11 +50,11 @@ const failedEntry = (entry) => {
48
50
  limitations: [limitation],
49
51
  };
50
52
  };
51
- const resolveInternalSpecifier = (fromPath, specifier, filePaths) => {
53
+ const resolveInternalSpecifier = (fromPath, specifier, lookupPath) => {
52
54
  if (posix.isAbsolute(specifier))
53
55
  return { to: specifier, resolution: "unresolved" };
54
56
  const normalized = posix.normalize(posix.join(posix.dirname(fromPath), specifier));
55
- if (normalized.startsWith("../") || normalized === "..")
57
+ if (logicalPathEscapesRoot(normalized))
56
58
  return { to: normalized, resolution: "unresolved" };
57
59
  const suffixes = ["", ".ts", ".js", ".mjs", ".cjs", ".tsx", ".jsx"];
58
60
  const candidates = suffixes.flatMap((suffix) => [
@@ -75,12 +77,12 @@ const resolveInternalSpecifier = (fromPath, specifier, filePaths) => {
75
77
  const stem = normalized.slice(0, -posix.extname(normalized).length);
76
78
  candidates.push(...sourceSuffixes.map((suffix) => `${stem}${suffix}`));
77
79
  }
78
- const match = candidates.find((candidate) => filePaths.has(candidate));
80
+ const match = lookupPath.resolveCandidates(candidates);
79
81
  return match === undefined
80
82
  ? { to: normalized, resolution: "unresolved" }
81
83
  : { to: match, resolution: "internal" };
82
84
  };
83
- const appendFile = (entry, filePaths, output) => {
85
+ const appendFile = (entry, lookupPath, output) => {
84
86
  const language = detectReferenceSourceLanguage(entry.path);
85
87
  output.entries.push({
86
88
  path: entry.path,
@@ -100,7 +102,7 @@ const appendFile = (entry, filePaths, output) => {
100
102
  output.relationships.push(relationship);
101
103
  continue;
102
104
  }
103
- const resolved = resolveInternalSpecifier(relationship.from_path, relationship.to, filePaths);
105
+ const resolved = resolveInternalSpecifier(relationship.from_path, relationship.to, lookupPath);
104
106
  output.relationships.push({
105
107
  ...relationship,
106
108
  to: resolved.to,
@@ -109,9 +111,9 @@ const appendFile = (entry, filePaths, output) => {
109
111
  }
110
112
  output.parseFailures.push(...parsed.parse_failures);
111
113
  };
112
- const appendReadEntry = (entry, filePaths, output) => {
114
+ const appendReadEntry = (entry, lookupPath, output) => {
113
115
  if (entry.kind === "file") {
114
- appendFile(entry, filePaths, output);
116
+ appendFile(entry, lookupPath, output);
115
117
  return;
116
118
  }
117
119
  const classifications = classifyReferenceSourcePath(entry.path);
@@ -128,7 +130,13 @@ const appendReadEntry = (entry, filePaths, output) => {
128
130
  output.entries.push({
129
131
  path: entry.path,
130
132
  kind: "symlink",
131
- target: entry.target,
133
+ // The reader resolves inventory identities from its root; the persisted
134
+ // graph represents relative symlink targets from the link's directory.
135
+ target: entry.targetState === "internal" ||
136
+ (entry.targetState === "missing" &&
137
+ !isPortableAbsoluteReferenceTarget(entry.target))
138
+ ? posix.relative(posix.dirname(entry.path), entry.target) || "."
139
+ : entry.target,
132
140
  target_state: entry.targetState,
133
141
  classifications,
134
142
  limitations: [],
@@ -142,13 +150,14 @@ export const parseReferenceSourceEntries = (read, filePaths, signal) => {
142
150
  parseFailures: [],
143
151
  limitations: [...read.limitations],
144
152
  };
153
+ const lookupPath = createReferenceSourcePathLookup(filePaths);
145
154
  for (const entry of read.entries) {
146
155
  if (signal?.aborted === true)
147
156
  break;
148
157
  if (entry.status === "failed")
149
158
  output.entries.push(failedEntry(entry));
150
159
  else
151
- appendReadEntry(entry, filePaths, output);
160
+ appendReadEntry(entry, lookupPath, output);
152
161
  }
153
162
  return output;
154
163
  };
@@ -1,49 +1,125 @@
1
- import { readFile, realpath, stat } from "node:fs/promises";
1
+ import { lstat, realpath, stat } from "node:fs/promises";
2
2
  import { join, resolve } from "node:path";
3
3
  import ignore from "ignore";
4
+ import { readRegularFileText, RegularFileCleanupFailure, retryRegularFileCleanup, } from "./RegularFileRead.js";
4
5
  import { err, ok } from "../domain/result.js";
6
+ import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
5
7
  import { DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS, } from "./ReferenceSourceImportTypes.js";
8
+ import { rootFilesystemFailure } from "../reference/ReferenceSourceReaderErrors.js";
6
9
  const failure = (code, message) => ({
7
10
  tag: "reference-source-import",
8
11
  code,
9
12
  message,
10
13
  });
11
- const resolveRoot = async (requestedRoot) => {
14
+ const isAborted = (signal) => signal?.aborted === true;
15
+ const addMarkedPatterns = (matcher, patterns, mark) => {
16
+ for (const pattern of patterns)
17
+ for (const line of pattern.split(/\r?\n/u))
18
+ matcher.add({ pattern: line, mark });
19
+ };
20
+ const resolveRoot = async (requestedRoot, signal) => {
21
+ if (isAborted(signal))
22
+ return err(failure("cancelled", "Reference source import cancelled"));
12
23
  try {
13
- if (!(await stat(requestedRoot)).isDirectory())
14
- return err(failure("invalid-root", "Reference source root is not a directory"));
24
+ const metadata = await stat(requestedRoot);
25
+ if (isAborted(signal))
26
+ return err(failure("cancelled", "Reference source import cancelled"));
27
+ if (!metadata.isDirectory())
28
+ return err(failure("invalid-root", `Reference source root is not a directory: ${requestedRoot}`));
15
29
  const canonicalRoot = await realpath(resolve(requestedRoot));
30
+ if (isAborted(signal))
31
+ return err(failure("cancelled", "Reference source import cancelled"));
16
32
  return ok(canonicalRoot);
17
33
  }
18
34
  catch (cause) {
19
- void cause;
20
- return err(failure("invalid-root", "Reference source root could not be resolved"));
35
+ if (isAborted(signal))
36
+ return err(failure("cancelled", "Reference source import cancelled"));
37
+ const rootFailure = rootFilesystemFailure(cause, "Reference source root could not be resolved");
38
+ if (rootFailure === undefined)
39
+ throw cause;
40
+ return err({ ...failure(rootFailure.code, rootFailure.message), cause });
21
41
  }
22
42
  };
23
- const buildIgnored = async (root, excludePaths) => {
43
+ const buildIgnored = async (root, excludePaths, resources, signal) => {
24
44
  const ignored = ignore();
45
+ const policyPath = join(root, ".gitignore");
46
+ let present = true;
25
47
  try {
26
- ignored.add(await readFile(join(root, ".gitignore"), "utf8"));
48
+ await lstat(policyPath);
27
49
  }
28
50
  catch (cause) {
29
- // Missing or unreadable ignore file does not authorize broader access.
30
- void cause;
51
+ if (!(typeof cause === "object" &&
52
+ cause !== null &&
53
+ "code" in cause &&
54
+ cause.code === "ENOENT"))
55
+ throw cause;
56
+ present = false;
57
+ }
58
+ signal?.throwIfAborted();
59
+ if (present) {
60
+ let text;
61
+ try {
62
+ text = await readRegularFileText(policyPath, { signal });
63
+ }
64
+ catch (cause) {
65
+ if (!(cause instanceof RegularFileCleanupFailure))
66
+ throw cause;
67
+ const retry = await retryRegularFileCleanup(cause, resources);
68
+ if (retry.cleanup !== undefined) {
69
+ const primary = cause.outcome.kind === "failed"
70
+ ? cause.outcome.cause
71
+ : cause.cleanupCause;
72
+ return err({
73
+ ...failure(signal?.aborted === true ? "cancelled" : "io", `Reference source ignore policy could not be read at ${policyPath}: ${errorMessage(primary)}`),
74
+ cleanup: retry.cleanup,
75
+ cause: primary,
76
+ });
77
+ }
78
+ if (retry.outcome.kind === "failed")
79
+ throw retry.outcome.cause;
80
+ text = retry.outcome.value;
81
+ }
82
+ addMarkedPatterns(ignored, [text], "project-ignored");
31
83
  }
32
- ignored.add([...DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS]);
84
+ addMarkedPatterns(ignored, DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS, "default-ignored");
33
85
  for (const path of excludePaths) {
34
- ignored.add(path);
35
- ignored.add(`${path}/`);
86
+ addMarkedPatterns(ignored, [path, `${path}/`], "caller-excluded");
36
87
  }
37
- return ignored;
88
+ return ok(ignored);
38
89
  };
39
90
  /** Resolve the caller-selected directory and build path filters. */
40
- export const prepareReferenceSourceImport = async (options) => {
41
- const root = await resolveRoot(options.root);
42
- if (!root.ok)
43
- return root;
44
- return ok({
45
- root: root.value,
46
- ignored: await buildIgnored(root.value, options.excludePaths ?? []),
47
- secrets: ignore().add([...options.policy.secretPatterns]),
48
- });
91
+ export const prepareReferenceSourceImport = async (options, resources) => {
92
+ try {
93
+ return await resources.run(async () => {
94
+ const root = await resolveRoot(options.root, options.signal);
95
+ if (!root.ok)
96
+ return root;
97
+ try {
98
+ const ignored = await buildIgnored(root.value, options.excludePaths ?? [], resources, options.signal);
99
+ if (!ignored.ok)
100
+ return ignored;
101
+ return ok({
102
+ root: root.value,
103
+ ignored: ignored.value,
104
+ secrets: ignore().add([...options.policy.secretPatterns]),
105
+ });
106
+ }
107
+ catch (cause) {
108
+ return err({
109
+ ...failure(options.signal?.aborted === true ? "cancelled" : "io", `Reference source ignore policy could not be read at ${join(root.value, ".gitignore")}: ${errorMessage(cause)}`),
110
+ cause,
111
+ });
112
+ }
113
+ });
114
+ }
115
+ catch (cause) {
116
+ if (!(cause instanceof ArtifactReaderFailure))
117
+ throw cause;
118
+ return err({
119
+ ...failure(cause.reason === "cancelled" ? "cancelled" : "io", cause.message),
120
+ ...(cause.cleanup === undefined ? {} : { cleanup: cause.cleanup }),
121
+ cause,
122
+ });
123
+ }
49
124
  };
125
+ const errorMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
@@ -1,28 +1,36 @@
1
+ const IMPORT_FAILURE_GUIDANCE = {
2
+ cancelled: {
3
+ category: "cancelled",
4
+ message: "Reference source import was cancelled. Start it again when ready.",
5
+ },
6
+ "invalid-root": {
7
+ category: "invalid_input",
8
+ message: "Reference source directory could not be opened. Check that the path exists, is readable, and points to a directory.",
9
+ },
10
+ unsupported: {
11
+ category: "unsupported_host",
12
+ message: "Safe no-follow file opens are unavailable on this host. Import the source tree with REA on Linux (including WSL) or macOS.",
13
+ },
14
+ io: {
15
+ category: "execution_failure",
16
+ message: "Reference source files could not be read. Check directory permissions and try again.",
17
+ },
18
+ parse: {
19
+ category: "execution_failure",
20
+ message: "Reference source could not be indexed. Check that the source tree is readable, then try again.",
21
+ },
22
+ };
1
23
  /** Safe CLI projection for a historical-source import failure. */
2
24
  export const projectReferenceSourceImportError = (error) => {
3
- if (error.code === "cancelled")
4
- return {
5
- category: "cancelled",
6
- message: "Reference source import was cancelled. Start it again when ready.",
7
- };
8
- if (error.code === "invalid-root")
9
- return {
10
- category: "invalid_input",
11
- message: "Reference source directory could not be opened. Check that the path exists, is readable, and points to a directory.",
12
- };
13
- if (error.code === "unsupported")
14
- return {
15
- category: "unsupported_host",
16
- message: "Safe no-follow file opens are unavailable on this host. Import the source tree with REA on Linux (including WSL) or macOS.",
17
- };
18
- if (error.code === "io")
19
- return {
20
- category: "execution_failure",
21
- message: "Reference source files could not be read. Check directory permissions and try again.",
22
- };
25
+ const primary = IMPORT_FAILURE_GUIDANCE[error.code];
26
+ const cleanupMessage = error.cleanup === undefined
27
+ ? ""
28
+ : ` Cleanup failed during import for ${error.cleanup.resources.join(", ")}: ${error.cleanup.reason}.`;
23
29
  return {
24
- category: "execution_failure",
25
- message: "Reference source could not be indexed. Check that the source tree is readable, then try again.",
30
+ category: primary.category,
31
+ message: `${error.message} ${primary.message}${cleanupMessage}`,
32
+ ...(error.cleanup === undefined ? {} : { cleanup: error.cleanup }),
33
+ ...(error.partial === undefined ? {} : { partial: error.partial }),
26
34
  };
27
35
  };
28
36
  export const DEFAULT_REFERENCE_SOURCE_IGNORE_PATTERNS = [
@@ -1,60 +1,174 @@
1
1
  import fs from "node:fs";
2
- import { lstat, readFile } from "node:fs/promises";
2
+ import { lstat } from "node:fs/promises";
3
3
  import { join, resolve } from "node:path";
4
- import { resolveRef } from "isomorphic-git";
4
+ import { err, ok } from "../domain/result.js";
5
+ import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
6
+ import { readRegularFile, RegularFileCleanupFailure, retryRegularFileCleanup, } from "./RegularFileRead.js";
5
7
  /**
6
8
  * Read Git metadata for a directory using isomorphic-git.
7
9
  *
8
10
  * No git subprocess or network is used; only the local `.git` object store is read.
9
11
  */
10
- export const readReferenceSourceVcs = async (root, signal) => {
11
- if (isAborted(signal))
12
- return { kind: "unknown", head: null, dirty: null };
12
+ export const readReferenceSourceVcs = async (root, resources, signal) => {
13
13
  try {
14
- await lstat(join(root, ".git"));
14
+ return await resources.run(async () => {
15
+ if (isAborted(signal))
16
+ return ok(unknownVcs());
17
+ try {
18
+ await lstat(join(root, ".git"));
19
+ }
20
+ catch (cause) {
21
+ return ok(errorCode(cause) === "ENOENT"
22
+ ? { kind: "none", head: null, dirty: null }
23
+ : unknownVcs());
24
+ }
25
+ try {
26
+ const head = await resolveSourceHead(root, resources, signal);
27
+ if (isAborted(signal))
28
+ return ok(unknownVcs());
29
+ return ok({ kind: "git", head, dirty: null });
30
+ }
31
+ catch (cause) {
32
+ if (cause instanceof ArtifactReaderFailure)
33
+ throw cause;
34
+ return ok(unknownVcs());
35
+ }
36
+ });
15
37
  }
16
38
  catch (cause) {
17
- return errorCode(cause) === "ENOENT"
18
- ? { kind: "none", head: null, dirty: null }
19
- : { kind: "unknown", head: null, dirty: null };
20
- }
21
- try {
22
- const head = await resolveSourceHead(root);
23
- if (isAborted(signal))
24
- return { kind: "unknown", head: null, dirty: null };
25
- return { kind: "git", head, dirty: null };
26
- }
27
- catch (cause) {
28
- // Unresolvable refs mean VCS state is unknown, not absent.
29
- void cause;
30
- return { kind: "unknown", head: null, dirty: null };
39
+ if (!(cause instanceof ArtifactReaderFailure))
40
+ throw cause;
41
+ return err({
42
+ tag: "reference-source-reader",
43
+ code: cause.reason === "cancelled" ? "cancelled" : "io",
44
+ message: cause.message,
45
+ ...(cause.cleanup === undefined ? {} : { cleanup: cause.cleanup }),
46
+ cause,
47
+ });
31
48
  }
32
49
  };
33
- const resolveSourceHead = async (root) => {
50
+ const unknownVcs = () => ({
51
+ kind: "unknown",
52
+ head: null,
53
+ dirty: null,
54
+ });
55
+ const resolveSourceHead = async (root, resources, signal) => {
56
+ // isomorphic-git is loaded on first use so CLI and MCP startup skip it.
57
+ const { resolveRef } = await import("isomorphic-git");
58
+ let failedRead;
59
+ const cleanupFailures = [];
60
+ const readMetadataBytes = async (path) => {
61
+ try {
62
+ return await readRegularFile(path, { signal });
63
+ }
64
+ catch (cause) {
65
+ if (!(cause instanceof RegularFileCleanupFailure))
66
+ throw cause;
67
+ const retry = await retryRegularFileCleanup(cause, resources);
68
+ if (retry.outcome.kind === "failed" &&
69
+ errorCode(retry.outcome.cause) !== "ENOENT")
70
+ failedRead ??= { cause: retry.outcome.cause };
71
+ if (retry.cleanup === undefined &&
72
+ retry.outcome.kind === "failed" &&
73
+ !isAborted(signal))
74
+ throw retry.outcome.cause;
75
+ const primary = retry.outcome.kind === "failed"
76
+ ? retry.outcome.cause
77
+ : cause.cleanupCause;
78
+ throw new ArtifactReaderFailure(isAborted(signal) ? "cancelled" : "io", `Git metadata could not be read safely: ${errorMessage(primary)}`, {
79
+ cause: primary,
80
+ ...(retry.cleanup === undefined ? {} : { cleanup: retry.cleanup }),
81
+ });
82
+ }
83
+ };
84
+ const readMetadataText = async (path) => (await readMetadataBytes(path)).toString("utf8");
85
+ const throwCleanupFailures = (primary) => {
86
+ const observations = cleanupFailures.flatMap((failure) => failure.cleanup === undefined ? [] : [failure.cleanup]);
87
+ throw new ArtifactReaderFailure(isAborted(signal) ? "cancelled" : "io", `Git metadata could not be read safely: ${errorMessage(primary)}`, {
88
+ cause: new AggregateError([primary, ...cleanupFailures], "Git metadata reads and cleanup failed", { cause: primary }),
89
+ ...(observations.length === 0
90
+ ? {}
91
+ : {
92
+ cleanup: {
93
+ reason: observations.map(({ reason }) => reason).join("; "),
94
+ resources: [
95
+ ...new Set(observations.flatMap(({ resources }) => resources)),
96
+ ],
97
+ },
98
+ }),
99
+ });
100
+ };
101
+ const referenceFs = {
102
+ ...fs,
103
+ promises: {
104
+ ...fs.promises,
105
+ // Let isomorphic-git continue from a failed loose ref to packed-refs,
106
+ // then report the original read failure after resolution. This preserves
107
+ // both observations when packed metadata also fails cleanup.
108
+ readFile: async (path, options = null) => {
109
+ // The library probes readFile() without a path to detect promise APIs.
110
+ // Reject that invocation without attributing it to a source read.
111
+ if (path === undefined)
112
+ throw new TypeError("Git filesystem read requires a path");
113
+ try {
114
+ const bytes = await readMetadataBytes(path);
115
+ const encoding = typeof options === "string" ? options : options?.encoding;
116
+ return encoding === undefined || encoding === null
117
+ ? bytes
118
+ : bytes.toString(encoding);
119
+ }
120
+ catch (cause) {
121
+ if (cause instanceof ArtifactReaderFailure) {
122
+ cleanupFailures.push(cause);
123
+ }
124
+ else if (errorCode(cause) !== "ENOENT")
125
+ failedRead ??= { cause };
126
+ throw cause;
127
+ }
128
+ },
129
+ },
130
+ };
131
+ const readRef = async (options) => {
132
+ let head;
133
+ try {
134
+ head = await resolveRef({ fs: referenceFs, dir: root, ...options });
135
+ }
136
+ catch (cause) {
137
+ if (cleanupFailures.length > 0)
138
+ throwCleanupFailures(failedRead?.cause ?? cause);
139
+ if (failedRead !== undefined)
140
+ throw failedRead.cause;
141
+ throw cause;
142
+ }
143
+ if (cleanupFailures.length > 0)
144
+ throwCleanupFailures(failedRead?.cause ?? cleanupFailures[0]?.cause);
145
+ signal?.throwIfAborted();
146
+ if (failedRead !== undefined)
147
+ throw failedRead.cause;
148
+ return head;
149
+ };
34
150
  const dotgit = join(root, ".git");
35
151
  if (!(await lstat(dotgit)).isFile())
36
- return resolveRef({ fs, dir: root, ref: "HEAD" });
37
- const pointer = (await readFile(dotgit, "utf8")).replace(/\r?\n$/u, "");
152
+ return readRef({ ref: "HEAD" });
153
+ const pointer = (await readMetadataText(dotgit)).replace(/\r?\n$/u, "");
38
154
  if (!pointer.startsWith("gitdir: ") || pointer.length === 8)
39
155
  throw new Error("Invalid Git directory pointer");
40
156
  const gitdir = resolve(root, pointer.slice(8));
41
157
  let commonDirectory;
42
158
  try {
43
- commonDirectory = resolve(gitdir, (await readFile(join(gitdir, "commondir"), "utf8")).replace(/\r?\n$/u, ""));
159
+ commonDirectory = resolve(gitdir, (await readMetadataText(join(gitdir, "commondir"))).replace(/\r?\n$/u, ""));
44
160
  }
45
161
  catch (cause) {
46
162
  if (errorCode(cause) !== "ENOENT")
47
163
  throw cause;
48
- return resolveRef({ fs, dir: root, gitdir, ref: "HEAD" });
164
+ return readRef({ gitdir, ref: "HEAD" });
49
165
  }
50
- const head = (await readFile(join(gitdir, "HEAD"), "utf8")).trim();
166
+ const head = (await readMetadataText(join(gitdir, "HEAD"))).trim();
51
167
  if (!head.startsWith("ref: "))
52
- return resolveRef({ fs, dir: root, gitdir, ref: "HEAD" });
168
+ return readRef({ gitdir, ref: "HEAD" });
53
169
  const ref = head.slice(5);
54
170
  const privateRef = ["refs/bisect/", "refs/rewritten/", "refs/worktree/"].some((prefix) => ref.startsWith(prefix));
55
- return resolveRef({
56
- fs,
57
- dir: root,
171
+ return readRef({
58
172
  gitdir: privateRef ? gitdir : commonDirectory,
59
173
  ref,
60
174
  });
@@ -62,4 +176,5 @@ const resolveSourceHead = async (root) => {
62
176
  const errorCode = (cause) => typeof cause === "object" && cause !== null && "code" in cause
63
177
  ? String(cause.code)
64
178
  : undefined;
179
+ const errorMessage = (cause) => cause instanceof Error ? cause.message : String(cause);
65
180
  const isAborted = (signal) => signal?.aborted === true;