rea-agents 6.2.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 (636) hide show
  1. package/README.md +24 -23
  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/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { constants } from "node:fs";
3
- import { access, realpath } from "node:fs/promises";
3
+ import { access, realpath, stat } from "node:fs/promises";
4
4
  import { isAbsolute } from "node:path";
5
5
  import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisOutputError, } from "../../domain/analysisErrorCore.js";
6
6
  import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
@@ -10,7 +10,24 @@ import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../../pro
10
10
  import { checkRecoveryDeadline, inventoryRecoveryFiles, fingerprintRecoveryFile, recoveryFailureMessage, } from "./RecoveryFiles.js";
11
11
  import { RECOVERY_LIMITS } from "./WakaruRelease.js";
12
12
  const OPERATION = "recover_javascript_sources";
13
- const WAKARU_REQUIREMENT = "Provide an absolute REA_WAKARU_COMMAND pointing to Wakaru 1.13.0 on Linux x64; no tool is installed by REA";
13
+ const WAKARU_REQUIREMENT = "Provide an absolute REA_WAKARU_COMMAND pointing to a Wakaru ^1.13.0 Linux x64 binary (verified with 1.14.0); no tool is installed by REA. See docs/javascript-recovery.md#install-wakaru.";
14
+ /** Cleanup failure carrying the live supervisor so the provider can retry it. */
15
+ export class WakaruCleanupFailure extends ProviderCleanupError {
16
+ cleanupOwner;
17
+ runId;
18
+ cwd;
19
+ constructor(cleanupOwner, runId, cwd, reason, previousError, snapshot) {
20
+ super("wakaru", [runId, cwd], {
21
+ reason,
22
+ previous_error: previousError instanceof Error ? previousError.message : null,
23
+ exit_code: snapshot.exitCode ?? null,
24
+ signal: snapshot.signal ?? null,
25
+ }, { operation: OPERATION, cause: previousError });
26
+ this.cleanupOwner = cleanupOwner;
27
+ this.runId = runId;
28
+ this.cwd = cwd;
29
+ }
30
+ }
14
31
  /** Resolve and fingerprint explicitly configured tools; acquire nothing at startup. */
15
32
  export const resolveWakaruCommand = async (environment) => {
16
33
  const configured = environment.REA_WAKARU_COMMAND;
@@ -27,6 +44,8 @@ export const resolveWakaruCommand = async (environment) => {
27
44
  if (!isAbsolute(limiter))
28
45
  throw new TypeError("REA_JAVASCRIPT_PRLIMIT_COMMAND must be absolute");
29
46
  await access(limiter, constants.X_OK);
47
+ if (!(await stat(limiter)).isFile())
48
+ throw new TypeError(`Resource limiter is not a regular file: ${limiter}`);
30
49
  return { command, limiter, ...fingerprint };
31
50
  }
32
51
  catch (cause) {
@@ -100,14 +119,8 @@ export const runWakaruCommand = async (context) => {
100
119
  }
101
120
  const stopped = await supervisor.stop();
102
121
  const snapshot = supervisor.snapshot();
103
- supervisor.dispose();
104
122
  if (stopped.status === "incomplete")
105
- throw new ProviderCleanupError("wakaru", [runId, context.cwd], {
106
- reason: stopped.reason,
107
- previous_error: failure instanceof Error ? failure.message : null,
108
- exit_code: snapshot.exitCode ?? null,
109
- signal: snapshot.signal ?? null,
110
- });
123
+ throw new WakaruCleanupFailure(supervisor, runId, context.cwd, stopped.reason, failure, snapshot);
111
124
  if (failure !== undefined)
112
125
  throw failure;
113
126
  if (context.signal?.aborted === true)
@@ -6,7 +6,8 @@ import { fingerprintRecoveryFile, inventoryRecoveryFiles, readRecoveryFile, reco
6
6
  import { runWakaruCommand, } from "./WakaruCommand.js";
7
7
  import { parseWakaruReports } from "./WakaruReport.js";
8
8
  import { publishWakaruArtifacts } from "./WakaruPublication.js";
9
- import { RECOVERY_LIMITS, WAKARU_RELEASE, WAKARU_PROVIDER_IDENTITY, } from "./WakaruRelease.js";
9
+ import { RECOVERY_LIMITS, WAKARU_PROVIDER_IDENTITY } from "./WakaruRelease.js";
10
+ import { admitWakaruVersion } from "./WakaruVersion.js";
10
11
  const OPERATION = "recover_javascript_sources";
11
12
  const MODES = {
12
13
  structural: "strict",
@@ -29,10 +30,12 @@ const executeWakaruRecovery = async (context) => {
29
30
  ...commandContext,
30
31
  arguments: ["--version"],
31
32
  });
32
- if (version.exit_code !== 0 ||
33
- version.stdout.trim() !== `wakaru ${WAKARU_RELEASE.version}`) {
33
+ const admitted = version.exit_code === 0
34
+ ? admitWakaruVersion(version.stdout.trim())
35
+ : undefined;
36
+ if (admitted === undefined || admitted.status === "unsupported") {
34
37
  // The message names the mismatch; the reason also keeps the tool's stderr.
35
- const mismatch = `This adapter requires Wakaru ${WAKARU_RELEASE.version}; reported version: ${version.stdout.trim()}; exit: ${String(version.exit_code)}`;
38
+ const mismatch = `${admitted?.message ?? `Wakaru --version failed; reported version: ${version.stdout.trim()}`}; exit: ${String(version.exit_code)}`;
36
39
  throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, `${mismatch}; stderr: ${version.stderr}`, { userMessage: `${mismatch}.` });
37
40
  }
38
41
  const run = await runWakaruCommand({
@@ -58,19 +61,20 @@ const executeWakaruRecovery = async (context) => {
58
61
  sourceBytes: snapshot,
59
62
  files,
60
63
  });
61
- return { version, run, parsed };
64
+ return { version, admitted, run, parsed };
62
65
  };
63
66
  /** Publish validated recovery and retain exact source and engine bindings. */
64
67
  export const prepareWakaruExecution = async (context) => {
65
68
  const { root, tree, input, source, engine, options } = context;
66
69
  const staging = join(root, "modules");
67
- const { version, run, parsed } = await executeWakaruRecovery(context);
70
+ const { version, admitted, run, parsed } = await executeWakaruRecovery(context);
68
71
  const result = await publishWakaruArtifacts({
69
72
  tree,
70
73
  staging,
71
74
  input,
72
75
  source,
73
76
  engine,
77
+ admitted,
74
78
  parsed,
75
79
  execution: run,
76
80
  ...(options?.signal === undefined ? {} : { signal: options.signal }),
@@ -79,7 +83,7 @@ export const prepareWakaruExecution = async (context) => {
79
83
  throw new AnalysisOutputError(OPERATION, `Original input changed during recovery: ${input.path}`);
80
84
  if ((await fingerprintRecoveryFile(engine.command, RECOVERY_LIMITS.outputBytes, options?.signal)).sha256 !== engine.sha256)
81
85
  throw new AnalysisOutputError(OPERATION, "Configured engine bytes changed during recovery");
82
- return createAnalysisExecution(result, WAKARU_PROVIDER_IDENTITY, {
86
+ return createAnalysisExecution(result, { ...WAKARU_PROVIDER_IDENTITY, version: admitted.version }, {
83
87
  rawResult: jsonValueSchema.parse({
84
88
  version,
85
89
  execution: run,
@@ -3,29 +3,47 @@ import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import {} from "../../application/AnalysisProvider.js";
5
5
  import { SafeOutputTree } from "../../artifacts/SafeOutputTree.js";
6
+ import { SafeOutputTreeCreationFailure } from "../../artifacts/SafeOutputTreeCreationFailure.js";
6
7
  import { AnalysisError } from "../../domain/analysisErrorBase.js";
7
8
  import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
9
+ import { javascriptRecoveryResultSchema, } from "../../domain/javascript/javascriptRecovery.js";
8
10
  import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
9
11
  import { ProviderCleanupError } from "../../domain/providerCleanupError.js";
10
12
  import { err, ok } from "../../domain/result.js";
11
13
  import { checkRecoveryCancellation, checkRecoveryDeadline, recoveryFailureMessage, recoveryInputFailure, snapshotRecoveryInput, } from "./RecoveryFiles.js";
12
- import { resolveWakaruCommand } from "./WakaruCommand.js";
14
+ import { resolveWakaruCommand, WakaruCleanupFailure, } from "./WakaruCommand.js";
13
15
  import { prepareWakaruExecution } from "./WakaruExecution.js";
14
16
  import { RECOVERY_LIMITS } from "./WakaruRelease.js";
15
17
  const OPERATION = "recover_javascript_sources";
16
- /** Stateless adapter; each recovery owns its snapshot, process and publication. */
18
+ /** Serialized recovery adapter retaining failed process, workspace and publication cleanup. */
17
19
  export class WakaruProvider {
18
20
  environment;
19
21
  launcher;
22
+ #tail = Promise.resolve();
23
+ #closing = false;
24
+ #closePromise;
25
+ #pendingCleanup;
20
26
  constructor(environment = process.env, launcher) {
21
27
  this.environment = environment;
22
28
  this.launcher = launcher;
23
29
  }
24
30
  /** Recover one script using validated upstream reports and verified output bytes. */
25
- async recover(input, options) {
31
+ recover(input, options) {
32
+ if (this.#closing)
33
+ return Promise.resolve(err(new ProviderCleanupError("wakaru", [], { reason: "Provider is closing" }, { operation: OPERATION })));
34
+ const operation = this.#tail.then(() => this.#closing
35
+ ? err(new ProviderCleanupError("wakaru", [], { reason: "Provider is closing" }, { operation: OPERATION }))
36
+ : this.#recover(input, options));
37
+ this.#tail = operation.then(() => undefined, () => undefined);
38
+ return operation;
39
+ }
40
+ async #recover(input, options) {
41
+ const pending = await this.#retire();
42
+ if (pending !== undefined)
43
+ return err(pending);
26
44
  let root;
27
45
  let tree;
28
- let failure;
46
+ let failed;
29
47
  let execution;
30
48
  const deadline = Date.now() + RECOVERY_LIMITS.timeoutMs;
31
49
  try {
@@ -37,9 +55,14 @@ export class WakaruProvider {
37
55
  await mkdir(inputs, { mode: 0o700 });
38
56
  await mkdir(staging, { mode: 0o700 });
39
57
  const source = await snapshotRecoveryInput(input.path, join(inputs, "bundle.js"), options?.signal);
40
- tree = await SafeOutputTree.create(input.output_directory).catch((cause) => {
58
+ try {
59
+ tree = await SafeOutputTree.create(input.output_directory);
60
+ }
61
+ catch (cause) {
62
+ if (cause instanceof SafeOutputTreeCreationFailure)
63
+ tree = cause.tree;
41
64
  throw recoveryInputFailure("output_directory", `Cannot create new recovery directory ${input.output_directory}: ${recoveryFailureMessage(cause)}`, cause);
42
- });
65
+ }
43
66
  execution = await prepareWakaruExecution({
44
67
  root,
45
68
  tree,
@@ -58,30 +81,80 @@ export class WakaruProvider {
58
81
  await tree.commit();
59
82
  }
60
83
  catch (cause) {
61
- failure = cause;
84
+ failed = { cause };
62
85
  }
63
- if (failure !== undefined) {
86
+ if (failed !== undefined) {
87
+ const failure = failed.cause;
64
88
  const residuals = [];
89
+ const cleanupFailures = [];
90
+ const cleanupOwner = failure instanceof WakaruCleanupFailure
91
+ ? failure.cleanupOwner
92
+ : undefined;
93
+ let failedTree;
65
94
  try {
66
95
  await tree?.rollback();
67
96
  }
68
- catch {
69
- if (tree !== undefined)
97
+ catch (cause) {
98
+ if (tree !== undefined) {
99
+ failedTree = tree;
70
100
  residuals.push(tree.outputRoot);
101
+ cleanupFailures.push({
102
+ resource: tree.outputRoot,
103
+ reason: recoveryFailureMessage(cause),
104
+ });
105
+ }
71
106
  }
72
- if (root !== undefined &&
73
- !(failure instanceof AnalysisError && failure.cleanupIncomplete)) {
107
+ if (cleanupOwner !== undefined)
108
+ residuals.push(cleanupOwner.launch.ownership?.runId ?? "wakaru-worker");
109
+ if (root !== undefined && cleanupOwner === undefined) {
110
+ const failedRoot = root;
74
111
  try {
75
- await rm(root, { recursive: true, force: true });
112
+ await rm(failedRoot, { recursive: true, force: true });
113
+ root = undefined;
76
114
  }
77
- catch {
78
- residuals.push(root);
115
+ catch (cause) {
116
+ residuals.push(failedRoot);
117
+ cleanupFailures.push({
118
+ resource: failedRoot,
119
+ reason: recoveryFailureMessage(cause),
120
+ });
79
121
  }
80
122
  }
123
+ if (cleanupOwner !== undefined ||
124
+ failedTree !== undefined ||
125
+ root !== undefined) {
126
+ this.#pendingCleanup = {
127
+ root,
128
+ process: cleanupOwner,
129
+ tree: failedTree,
130
+ };
131
+ if (root !== undefined)
132
+ residuals.push(root);
133
+ root = undefined;
134
+ }
81
135
  if (residuals.length > 0)
82
136
  return err(new ProviderCleanupError("wakaru", residuals, {
83
- previous_error: recoveryFailureMessage(failure),
137
+ ...(failure instanceof WakaruCleanupFailure
138
+ ? failure.diagnostics
139
+ : {}),
140
+ previous_error: failure instanceof WakaruCleanupFailure
141
+ ? (failure.diagnostics?.previous_error ?? null)
142
+ : recoveryFailureMessage(failure),
143
+ cleanup_failures: cleanupFailures,
144
+ }, {
145
+ operation: OPERATION,
146
+ cause: failure,
147
+ ...(tree?.published && execution !== undefined
148
+ ? {
149
+ partialObservation: {
150
+ kind: "javascript-recovery",
151
+ result: javascriptRecoveryResultSchema.parse(execution.result),
152
+ },
153
+ }
154
+ : {}),
84
155
  }));
156
+ if (tree?.published === true && execution !== undefined)
157
+ return ok(execution);
85
158
  return err(failure instanceof AnalysisError
86
159
  ? failure
87
160
  : new ProviderAdapterError("wakaru", OPERATION, {
@@ -93,4 +166,54 @@ export class WakaruProvider {
93
166
  ? err(new AnalysisOutputError(OPERATION, "Recovery returned no execution"))
94
167
  : ok(execution);
95
168
  }
169
+ async close() {
170
+ this.#closing = true;
171
+ this.#closePromise ??= this.#tail
172
+ .then(async () => {
173
+ const failure = await this.#retire();
174
+ if (failure !== undefined)
175
+ throw failure;
176
+ })
177
+ .catch((cause) => {
178
+ this.#closePromise = undefined;
179
+ throw cause;
180
+ });
181
+ return this.#closePromise;
182
+ }
183
+ async #retire() {
184
+ const pending = this.#pendingCleanup;
185
+ if (pending === undefined)
186
+ return undefined;
187
+ if (pending.process !== undefined) {
188
+ const stopped = await pending.process.stop();
189
+ if (stopped.status === "incomplete")
190
+ return new ProviderCleanupError("wakaru", [
191
+ pending.process.launch.ownership?.runId ?? "wakaru-worker",
192
+ ...(pending.root === undefined ? [] : [pending.root]),
193
+ ], { reason: stopped.reason }, { operation: OPERATION });
194
+ pending.process = undefined;
195
+ }
196
+ if (pending.tree !== undefined) {
197
+ const tree = pending.tree;
198
+ try {
199
+ await tree.rollback();
200
+ pending.tree = undefined;
201
+ }
202
+ catch (cause) {
203
+ return new ProviderCleanupError("wakaru", [tree.outputRoot], { reason: recoveryFailureMessage(cause) }, { operation: OPERATION, cause });
204
+ }
205
+ }
206
+ if (pending.root !== undefined) {
207
+ const root = pending.root;
208
+ try {
209
+ await rm(root, { recursive: true, force: true });
210
+ pending.root = undefined;
211
+ }
212
+ catch (cause) {
213
+ return new ProviderCleanupError("wakaru", [root], { reason: recoveryFailureMessage(cause) }, { operation: OPERATION, cause });
214
+ }
215
+ }
216
+ this.#pendingCleanup = undefined;
217
+ return undefined;
218
+ }
96
219
  }
@@ -10,7 +10,7 @@ export const publishWakaruArtifacts = async (context) => {
10
10
  const { tree, source, parsed, staging, signal } = context;
11
11
  const write = async (path, bytes) => {
12
12
  const sha256 = recoveryDigest(bytes);
13
- const file = await tree.write(path, Readable.from([bytes]), sha256, signal);
13
+ const file = await tree.write(path, Readable.from([bytes]), { sha256, bytes: bytes.byteLength }, signal);
14
14
  return {
15
15
  path: join(tree.outputRoot, file.relativePath),
16
16
  sha256: file.sha256,
@@ -31,7 +31,7 @@ export const publishWakaruArtifacts = async (context) => {
31
31
  source: { ...source, published_copy: publishedCopy },
32
32
  engine: {
33
33
  id: "wakaru",
34
- version: WAKARU_RELEASE.version,
34
+ version: context.admitted.version,
35
35
  executable: {
36
36
  path: context.engine.command,
37
37
  sha256: context.engine.sha256,
@@ -52,7 +52,12 @@ export const publishWakaruArtifacts = async (context) => {
52
52
  total: parsed.report.total,
53
53
  failed: parsed.report.failed,
54
54
  modules,
55
- warnings: parsed.report.warnings,
55
+ warnings: parsed.report.warnings.map(({ filename, kind, is_error, message }) => ({
56
+ filename,
57
+ kind,
58
+ is_error,
59
+ message,
60
+ })),
56
61
  report,
57
62
  provenance,
58
63
  analysis_input: modules.length === 0
@@ -62,7 +67,12 @@ export const publishWakaruArtifacts = async (context) => {
62
67
  format: "directory",
63
68
  },
64
69
  runtime_equivalence: "unknown",
65
- limitations: [...RECOVERY_LIMITATIONS],
70
+ limitations: [
71
+ ...RECOVERY_LIMITATIONS,
72
+ ...(context.admitted.status === "compatible"
73
+ ? [context.admitted.limitation]
74
+ : []),
75
+ ],
66
76
  };
67
77
  const manifest = await write("manifest.json", Buffer.from(`${JSON.stringify(details, null, 2)}\n`));
68
78
  return javascriptRecoveryResultSchema.parse({ ...details, manifest });
@@ -1,10 +1,17 @@
1
1
  /** Unchanged upstream source pin; executed bytes are identified separately. */
2
2
  export const WAKARU_RELEASE = {
3
- version: "1.13.0",
4
- revision: "6070266d24b32951fa2fe1d2dad5b4313bd5c81b",
3
+ version: "1.14.0",
4
+ revision: "8219bf5016a063d7fb215101a8c45d5959ec733f",
5
5
  repository: "https://github.com/pionxzh/wakaru",
6
6
  };
7
- /** Exact provider identity shared by executions and the generated catalog. */
7
+ /**
8
+ * Releases the report parser accepts. Wakaru changes `--version`, `--json`
9
+ * and `provenance.json` only by addition within a major version
10
+ * (https://github.com/pionxzh/wakaru/blob/v1.14.0/docs/cli.md#machine-readable-output-compatibility);
11
+ * 1.13.0 is the first release this adapter verified.
12
+ */
13
+ export const WAKARU_ACCEPTED_RANGE = "^1.13.0";
14
+ /** Catalog identity for the verified Wakaru release. Evidence replaces version with the observed banner. */
8
15
  export const WAKARU_PROVIDER_IDENTITY = {
9
16
  id: "wakaru",
10
17
  name: "Wakaru",
@@ -4,19 +4,19 @@ import { AnalysisOutputError } from "../../domain/analysisErrorCore.js";
4
4
  import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
5
5
  import { readRecoveryFile, recoveryFailureMessage } from "./RecoveryFiles.js";
6
6
  import { RECOVERY_LIMITS } from "./WakaruRelease.js";
7
- const warningSchema = z.strictObject({
7
+ const warningSchema = z.looseObject({
8
8
  filename: z.string(),
9
9
  kind: z.string(),
10
10
  is_error: z.boolean(),
11
11
  message: z.string(),
12
12
  });
13
- const reportSchema = z.strictObject({
13
+ const reportSchema = z.looseObject({
14
14
  detected_formats: z.array(z.string()),
15
15
  safety: z.string(),
16
- modules: z.array(z.strictObject({
16
+ modules: z.array(z.looseObject({
17
17
  filename: z.string().min(1),
18
18
  kind: z.literal("javascript"),
19
- status: z.literal("decompiled"),
19
+ status: z.string().min(1),
20
20
  })),
21
21
  warnings: z.array(warningSchema),
22
22
  total: z.number().int().nonnegative(),
@@ -27,10 +27,10 @@ const rangeSchema = z.tuple([
27
27
  z.number().int().nonnegative(),
28
28
  z.number().int().nonnegative(),
29
29
  ]);
30
- const provenanceSchema = z.strictObject({
30
+ const provenanceSchema = z.looseObject({
31
31
  format: z.string(),
32
32
  strategy: z.string(),
33
- modules: z.record(z.string(), z.strictObject({
33
+ modules: z.record(z.string(), z.looseObject({
34
34
  input: z.string(),
35
35
  ranges: z.array(rangeSchema),
36
36
  extraction: z.string(),
@@ -38,7 +38,12 @@ const provenanceSchema = z.strictObject({
38
38
  })),
39
39
  });
40
40
  const OPERATION = "recover_javascript_sources";
41
- /** Parse exact pinned producer JSON before projecting provider-neutral artifacts. */
41
+ /**
42
+ * Parse producer JSON before projecting provider-neutral artifacts. Wakaru adds
43
+ * fields and category values within a major version, so unknown keys are kept
44
+ * and `status` stays the reported string; identity, path, range and file-set
45
+ * checks below remain exact.
46
+ */
42
47
  export const parseWakaruReports = async (context) => {
43
48
  const { execution, provenancePath } = context;
44
49
  try {
@@ -0,0 +1,24 @@
1
+ import { satisfies, valid } from "semver";
2
+ import { WAKARU_ACCEPTED_RANGE, WAKARU_RELEASE } from "./WakaruRelease.js";
3
+ /** Caller-facing accepted releases, naming the verified build. */
4
+ export const wakaruReleaseLine = () => `Wakaru ${WAKARU_ACCEPTED_RANGE} (verified with ${WAKARU_RELEASE.version})`;
5
+ /** Classify a `wakaru <version>` banner against the accepted release range. */
6
+ export const admitWakaruVersion = (banner) => {
7
+ const token = banner.startsWith("wakaru ")
8
+ ? banner.slice("wakaru ".length)
9
+ : undefined;
10
+ if (token === undefined ||
11
+ valid(token) !== token ||
12
+ !satisfies(token, WAKARU_ACCEPTED_RANGE))
13
+ return {
14
+ status: "unsupported",
15
+ message: `Unsupported Wakaru version ${banner.length === 0 ? "missing" : banner}; accepted releases are ${wakaruReleaseLine()}`,
16
+ };
17
+ if (token === WAKARU_RELEASE.version)
18
+ return { status: "verified", version: token };
19
+ return {
20
+ status: "compatible",
21
+ version: token,
22
+ limitation: `This session uses Wakaru ${token}. The report parser is verified against ${WAKARU_RELEASE.version}; other ${WAKARU_ACCEPTED_RANGE} releases are accepted and the observed version is reported.`,
23
+ };
24
+ };
@@ -15,6 +15,13 @@ import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../../pro
15
15
  import { prepareProcessOwnershipInspection } from "../../process/ProcessOwnershipObservation.js";
16
16
  const OPERATION = "trace_web_source_location";
17
17
  const PROVIDER = "source-map-decoder";
18
+ export class SourceMapCleanupFailure extends ProviderCleanupError {
19
+ cleanupOwner;
20
+ constructor(cleanupOwner, resources, diagnostics) {
21
+ super(PROVIDER, resources, diagnostics, { operation: OPERATION });
22
+ this.cleanupOwner = cleanupOwner;
23
+ }
24
+ }
18
25
  /** Run a trusted codec command and release its process/root before returning output. */
19
26
  export const runSourceMapCommand = async (request, path, options, dependencies) => {
20
27
  try {
@@ -164,14 +171,20 @@ class OwnedCodec {
164
171
  }
165
172
  async close(previousError) {
166
173
  const failures = [];
174
+ let processReleased = this.#supervisor === undefined;
167
175
  if (this.#supervisor !== undefined) {
168
176
  const stopped = await this.#supervisor.stop();
169
177
  if (stopped.status === "incomplete")
170
178
  failures.push(stopped.reason);
179
+ else {
180
+ processReleased = true;
181
+ this.#supervisor = undefined;
182
+ }
171
183
  }
172
- if (this.#runtime !== undefined) {
184
+ if (processReleased && this.#runtime !== undefined) {
173
185
  try {
174
186
  await this.#runtime.close();
187
+ this.#runtime = undefined;
175
188
  }
176
189
  catch (cause) {
177
190
  failures.push(message(cause));
@@ -179,7 +192,7 @@ class OwnedCodec {
179
192
  }
180
193
  return failures.length === 0
181
194
  ? undefined
182
- : new ProviderCleanupError(PROVIDER, [
195
+ : new SourceMapCleanupFailure(this, [
183
196
  this.#runId,
184
197
  ...(this.#runtime === undefined ? [] : [this.#runtime.path]),
185
198
  ], {
@@ -187,7 +200,7 @@ class OwnedCodec {
187
200
  cleanup_failures: failures,
188
201
  previous_error: previousError,
189
202
  codec_pid: this.#supervisor?.launch.process.pid ?? null,
190
- }, { operation: OPERATION });
203
+ });
191
204
  }
192
205
  }
193
206
  const message = (cause) => cause instanceof Error ? cause.message : String(cause);
@@ -3,16 +3,34 @@ import { ArtifactOperationError } from "../../domain/artifactOperationError.js";
3
3
  import { err, ok } from "../../domain/result.js";
4
4
  import { WEB_SOURCE_MAP_LIMITS, } from "../../domain/webSourceLocation.js";
5
5
  import { sourceMapCodecInputSchema, sourceMapCodecReplySchema, } from "./SourceMapCodecProtocol.js";
6
- import { runSourceMapCommand, } from "./SourceMapCommand.js";
6
+ import { SourceMapCleanupFailure, runSourceMapCommand, } from "./SourceMapCommand.js";
7
+ import { ProviderCleanupError } from "../../domain/providerCleanupError.js";
8
+ import { jsonParts } from "../../domain/jsonSerialization.js";
7
9
  const OPERATION = "trace_web_source_location";
8
10
  /** Integrate the pinned upstream codec through an independently bounded owned process. */
9
11
  export class SourceMapDecoder {
10
12
  dependencies;
13
+ #tail = Promise.resolve();
14
+ #closing = false;
15
+ #closePromise;
16
+ #pendingCleanup;
11
17
  constructor(dependencies = {}) {
12
18
  this.dependencies = dependencies;
13
19
  }
14
20
  /** Return complete point evidence after process and private-root cleanup. */
15
- async trace(input, options) {
21
+ trace(input, options) {
22
+ if (this.#closing)
23
+ return Promise.resolve(err(new ProviderCleanupError("source-map-decoder", [], { reason: "Provider is closing" }, { operation: OPERATION })));
24
+ const operation = this.#tail.then(() => this.#closing
25
+ ? err(new ProviderCleanupError("source-map-decoder", [], { reason: "Provider is closing" }, { operation: OPERATION }))
26
+ : this.#trace(input, options));
27
+ this.#tail = operation.then(() => undefined, () => undefined);
28
+ return operation;
29
+ }
30
+ async #trace(input, options) {
31
+ const cleanupFailure = await this.#retryCleanup();
32
+ if (cleanupFailure !== undefined)
33
+ return err(cleanupFailure);
16
34
  if (options?.signal?.aborted)
17
35
  return err(new AnalysisCancelledError(OPERATION));
18
36
  const request = sourceMapCodecInputSchema.safeParse({
@@ -22,13 +40,27 @@ export class SourceMapDecoder {
22
40
  });
23
41
  if (!request.success)
24
42
  return err(new AnalysisInputError(OPERATION, { cause: request.error }));
25
- const serialized = JSON.stringify(request.data);
26
- if (Buffer.byteLength(input.text) > WEB_SOURCE_MAP_LIMITS.mapBytes ||
27
- Buffer.byteLength(serialized) > WEB_SOURCE_MAP_LIMITS.outputBytes)
28
- return err(new ArtifactOperationError(OPERATION, "limit", undefined, `${input.path}: Source-map input exceeds the 4 MiB map or 32 MiB encoded request budget.`));
43
+ const capacityFailure = () => new ArtifactOperationError(OPERATION, "limit", undefined, `${input.path}: Source-map input exceeds the 4 MiB map or 32 MiB encoded request budget.`);
44
+ if (Buffer.byteLength(input.text) > WEB_SOURCE_MAP_LIMITS.mapBytes)
45
+ return err(capacityFailure());
46
+ const encoded = [];
47
+ let encodedBytes = 0;
48
+ for (const part of jsonParts(request.data)) {
49
+ const bytes = Buffer.byteLength(part);
50
+ if (bytes > WEB_SOURCE_MAP_LIMITS.outputBytes - encodedBytes)
51
+ return err(capacityFailure());
52
+ encoded.push(part);
53
+ encodedBytes += bytes;
54
+ }
55
+ if (options?.signal?.aborted)
56
+ return err(new AnalysisCancelledError(OPERATION));
57
+ const serialized = encoded.join("");
29
58
  const response = await runSourceMapCommand(serialized, input.path, options, this.dependencies);
30
- if (!response.ok)
59
+ if (!response.ok) {
60
+ if (response.error instanceof SourceMapCleanupFailure)
61
+ this.#pendingCleanup = response.error.cleanupOwner;
31
62
  return response;
63
+ }
32
64
  let value;
33
65
  try {
34
66
  value = JSON.parse(response.value);
@@ -47,6 +79,30 @@ export class SourceMapDecoder {
47
79
  return err(new AnalysisOutputError(OPERATION, "Codec reported a V8 heap limit exceeding its independent process budget."));
48
80
  return ok(reply.data.report);
49
81
  }
82
+ async close() {
83
+ this.#closing = true;
84
+ this.#closePromise ??= this.#tail
85
+ .then(async () => {
86
+ const failure = await this.#retryCleanup();
87
+ if (failure !== undefined)
88
+ throw failure;
89
+ })
90
+ .catch((cause) => {
91
+ this.#closePromise = undefined;
92
+ throw cause;
93
+ });
94
+ return this.#closePromise;
95
+ }
96
+ async #retryCleanup() {
97
+ const pending = this.#pendingCleanup;
98
+ if (pending === undefined)
99
+ return undefined;
100
+ const failure = await pending.close(null);
101
+ if (failure !== undefined)
102
+ return failure;
103
+ this.#pendingCleanup = undefined;
104
+ return undefined;
105
+ }
50
106
  }
51
107
  const codecFailure = (path, reason, detail) => err(reason === "limit"
52
108
  ? new ArtifactOperationError(OPERATION, "limit", undefined, `${path}: ${detail}`)
@@ -168,12 +168,23 @@ const inspectLeaf = (node, budget, options) => {
168
168
  throw new SourceMapFormatFailure("limit", "Source-map layout exceeds the 262144 segment/generated-row decoder budget.");
169
169
  return leaf;
170
170
  };
171
+ /**
172
+ * Return the JSON view of source-map text without changing the source evidence.
173
+ * ECMA-426 §11.2.1 permits HTTP(S) responses to start with `)]}'`; the line
174
+ * through the first HTTP newline is transport framing, not map content. Local
175
+ * point tracing shares this parser and has historically accepted the same
176
+ * framing. https://tc39.es/ecma426/#sec-fetchsourcemap
177
+ */
178
+ export const sourceMapJsonText = (text) => {
179
+ const withoutBom = text.replace(/^\uFEFF/u, "");
180
+ if (!withoutBom.startsWith(")]}'"))
181
+ return withoutBom;
182
+ const newline = withoutBom.search(/[\r\n]/u);
183
+ return newline === -1 ? "" : withoutBom.slice(newline);
184
+ };
171
185
  /** Validate structure before allocation, retaining raw declarations and section boundaries. */
172
186
  export const inspectSourceMap = (text) => {
173
- const withoutBom = text.replace(/^\uFEFF/u, "");
174
- const jsonText = withoutBom.startsWith(")]}'")
175
- ? withoutBom.slice(withoutBom.indexOf("\n") + 1)
176
- : withoutBom;
187
+ const jsonText = sourceMapJsonText(text);
177
188
  const value = JSON.parse(jsonText);
178
189
  const inspected = inspectSourceMapValue(value);
179
190
  const normalized = inspected.format === "regular"