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
@@ -0,0 +1,210 @@
1
+ import { numberValue } from "./CdpCaptureValues.js";
2
+ const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
3
+ const XLINK_NAMESPACE = "http://www.w3.org/1999/xlink";
4
+ const UNRESOLVED = {
5
+ svgElement: false,
6
+ xlinkHref: undefined,
7
+ };
8
+ const stringAt = (strings, index) => {
9
+ const integer = numberValue(index);
10
+ return integer === undefined ? "" : (strings[Math.trunc(integer)] ?? "");
11
+ };
12
+ const numberArray = (value) => Array.isArray(value)
13
+ ? value.flatMap((item) => {
14
+ const number = numberValue(item);
15
+ return number === undefined ? [] : [number];
16
+ })
17
+ : [];
18
+ // DOMSnapshot has no namespace URI. HTML documents use uppercase `HTML` and
19
+ // the parser's local names. XML documents preserve prefixed names and xmlns
20
+ // declarations, including those on standalone SVG roots.
21
+ const xmlDocument = (nodes) => {
22
+ const documentIndex = nodes.nodeTypes.findIndex((nodeType) => Math.trunc(nodeType) === 9);
23
+ if (documentIndex < 0)
24
+ return false;
25
+ for (let index = 0; index < nodes.nodeTypes.length; index += 1) {
26
+ if (Math.trunc(nodes.nodeTypes[index] ?? 0) !== 1)
27
+ continue;
28
+ if (Math.trunc(nodes.parents[index] ?? -1) !== documentIndex)
29
+ continue;
30
+ const name = stringAt(nodes.strings, nodes.nodeNames[index]);
31
+ if (name === "HTML")
32
+ return false;
33
+ if (name === "html" || name.includes(":"))
34
+ return true;
35
+ // Explicit namespaces also identify standalone SVG and other XML roots.
36
+ // Namespace-free synthetic snapshots retain the legacy HTML behavior.
37
+ const attributes = numberArray(nodes.attributes[index]);
38
+ return attributes.some((value, offset) => offset % 2 === 0 &&
39
+ xmlnsPrefix(stringAt(nodes.strings, value)) !== undefined);
40
+ }
41
+ return false;
42
+ };
43
+ export const createDocumentSvgAncestry = (nodes) => {
44
+ const xml = xmlDocument(nodes);
45
+ return {
46
+ xml,
47
+ nodes,
48
+ svgContexts: new Map(),
49
+ xmlLinks: xml ? resolveXmlElements(nodes) : new Map(),
50
+ };
51
+ };
52
+ export const domSvgLink = (ancestry, index) => {
53
+ if (!ancestry.xml) {
54
+ return {
55
+ svgElement: elementInSvgContext(index, ancestry.nodes, ancestry.svgContexts),
56
+ xmlDocument: false,
57
+ xlinkHref: undefined,
58
+ };
59
+ }
60
+ const resolved = ancestry.xmlLinks.get(index) ?? UNRESOLVED;
61
+ return {
62
+ svgElement: resolved.svgElement,
63
+ xmlDocument: true,
64
+ xlinkHref: resolved.xlinkHref,
65
+ };
66
+ };
67
+ // Chrome's HTML parser records SVG local names (`svg`, `foreignObject`).
68
+ // Descendants of foreignObject are HTML until a nested `svg`.
69
+ const elementInSvgContext = (index, nodes, contexts) => {
70
+ let current = index;
71
+ const seen = new Set();
72
+ let inSvg = false;
73
+ while (current >= 0 &&
74
+ current < nodes.nodeNames.length &&
75
+ !seen.has(current)) {
76
+ const cached = contexts.get(current);
77
+ if (cached !== undefined) {
78
+ inSvg = cached;
79
+ break;
80
+ }
81
+ seen.add(current);
82
+ if (stringAt(nodes.strings, nodes.nodeNames[current]) === "svg") {
83
+ inSvg = true;
84
+ break;
85
+ }
86
+ const parent = Math.trunc(nodes.parents[current] ?? -1);
87
+ if (parent < 0 || parent === current)
88
+ break;
89
+ if (stringAt(nodes.strings, nodes.nodeNames[parent]) === "foreignObject")
90
+ break;
91
+ current = parent;
92
+ }
93
+ // Cache the entire examined chain, including forward references and cycles,
94
+ // so shared ancestors are examined once per document.
95
+ for (const node of seen)
96
+ contexts.set(node, inSvg);
97
+ return inSvg;
98
+ };
99
+ // Walk parent-before-child with one mutable namespace environment. Restore
100
+ // declarations on exit so siblings retain their own scope. Only declarations
101
+ // on the active path are retained, rather than cumulative maps at every node.
102
+ const resolveXmlElements = (nodes) => {
103
+ const children = new Map();
104
+ const pending = [];
105
+ for (let node = 0; node < nodes.nodeNames.length; node += 1) {
106
+ const parent = Math.trunc(nodes.parents[node] ?? -1);
107
+ if (parent < 0)
108
+ pending.push({ node });
109
+ else if (parent < nodes.nodeNames.length && parent !== node) {
110
+ const siblings = children.get(parent);
111
+ if (siblings === undefined)
112
+ children.set(parent, [node]);
113
+ else
114
+ siblings.push(node);
115
+ }
116
+ }
117
+ const bindings = new Map();
118
+ const resolved = new Map();
119
+ while (pending.length > 0) {
120
+ const step = pending.pop();
121
+ if (step === undefined)
122
+ break;
123
+ if ("restore" in step) {
124
+ for (const { prefix, previous } of step.restore) {
125
+ if (previous === undefined)
126
+ bindings.delete(prefix);
127
+ else
128
+ bindings.set(prefix, previous);
129
+ }
130
+ continue;
131
+ }
132
+ const { node } = step;
133
+ const attributes = numberArray(nodes.attributes[node]);
134
+ const restore = applyDeclarations(bindings, attributes, nodes.strings);
135
+ const svgElement = Math.trunc(nodes.nodeTypes[node] ?? 0) === 1 &&
136
+ elementNamespace(stringAt(nodes.strings, nodes.nodeNames[node]), bindings) === SVG_NAMESPACE;
137
+ resolved.set(node, {
138
+ svgElement,
139
+ xlinkHref: svgElement
140
+ ? xlinkHrefValue(attributes, nodes.strings, bindings)
141
+ : undefined,
142
+ });
143
+ pending.push({ restore });
144
+ for (const child of children.get(node) ?? [])
145
+ pending.push({ node: child });
146
+ }
147
+ // Cycles (including self-parents) and dangling chains cannot reach a root,
148
+ // so remain unresolved instead of deriving URLs from an invalid ancestry.
149
+ return resolved;
150
+ };
151
+ const applyDeclarations = (bindings, attributes, strings) => {
152
+ const restore = [];
153
+ const seen = new Set();
154
+ for (let index = 0; index + 1 < attributes.length; index += 2) {
155
+ const prefix = xmlnsPrefix(stringAt(strings, attributes[index]));
156
+ if (prefix === undefined || seen.has(prefix))
157
+ continue;
158
+ seen.add(prefix);
159
+ restore.push({ prefix, previous: bindings.get(prefix) });
160
+ const value = stringAt(strings, attributes[index + 1]);
161
+ if (value.length === 0)
162
+ bindings.delete(prefix);
163
+ else
164
+ bindings.set(prefix, value);
165
+ }
166
+ return restore;
167
+ };
168
+ const xmlnsPrefix = (name) => {
169
+ if (name === "xmlns")
170
+ return "";
171
+ if (!name.startsWith("xmlns:"))
172
+ return undefined;
173
+ const prefix = name.slice("xmlns:".length);
174
+ if (prefix.length === 0 || prefix === "xmlns" || prefix.includes(":"))
175
+ return undefined;
176
+ return prefix;
177
+ };
178
+ const elementNamespace = (nodeName, bindings) => {
179
+ const colon = nodeName.indexOf(":");
180
+ if (colon < 0)
181
+ return bindings.get("") ?? "";
182
+ const prefix = nodeName.slice(0, colon);
183
+ const local = nodeName.slice(colon + 1);
184
+ if (prefix.length === 0 ||
185
+ local.length === 0 ||
186
+ local.includes(":") ||
187
+ prefix === "xmlns")
188
+ return "";
189
+ return bindings.get(prefix) ?? "";
190
+ };
191
+ // First prefixed href bound to the XLink namespace. Duplicate names keep the
192
+ // earlier value. Plain href is applied by the caller and wins even when empty.
193
+ const xlinkHrefValue = (attributes, strings, bindings) => {
194
+ const seen = new Set();
195
+ for (let index = 0; index + 1 < attributes.length; index += 2) {
196
+ const name = stringAt(strings, attributes[index]);
197
+ if (seen.has(name))
198
+ continue;
199
+ seen.add(name);
200
+ const colon = name.indexOf(":");
201
+ if (colon <= 0)
202
+ continue;
203
+ const prefix = name.slice(0, colon);
204
+ const local = name.slice(colon + 1);
205
+ if (local !== "href" || bindings.get(prefix) !== XLINK_NAMESPACE)
206
+ continue;
207
+ return stringAt(strings, attributes[index + 1]);
208
+ }
209
+ return undefined;
210
+ };
@@ -15,8 +15,7 @@ export const ingestResponseBodyShape = (state, requestId, value) => {
15
15
  invalidResponseBodyShape(state, requestId);
16
16
  return;
17
17
  }
18
- const inferred = inferBodyShape(decoded);
19
- updateResponseBodyShape(state, requestId, inferred.shape);
18
+ updateResponseBodyShape(state, requestId, inferJsonShape(decoded));
20
19
  };
21
20
  export const requestBodyShape = (state, request) => {
22
21
  if (!state.input.include_json_body_shapes)
@@ -24,10 +23,10 @@ export const requestBodyShape = (state, request) => {
24
23
  const body = cdpStringValue(request.postData);
25
24
  if (!isJsonContentType(recordValue(request.headers)) || body === undefined)
26
25
  return { status: "unavailable", request: null, response: null };
27
- const inferred = inferBodyShape(body);
26
+ const shape = inferJsonShape(body);
28
27
  return {
29
- status: inferred.shape === null ? "unavailable" : "included",
30
- request: inferred.shape,
28
+ status: shape === null ? "unavailable" : "included",
29
+ request: shape,
31
30
  response: null,
32
31
  };
33
32
  };
@@ -46,9 +45,6 @@ export const updateResponseBodyShape = (state, requestId, response) => {
46
45
  body_shapes: { status, request, response },
47
46
  });
48
47
  };
49
- const inferBodyShape = (text) => {
50
- return { shape: inferJsonShape(text) };
51
- };
52
48
  const invalidResponseBodyShape = (state, requestId) => {
53
49
  updateResponseBodyShape(state, requestId, null);
54
50
  state.completeness.exclude("json_body_shapes", "invalid_protocol_value");
@@ -1,3 +1,4 @@
1
+ import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
1
2
  import { inferJsonShape } from "../domain/jsonShape.js";
2
3
  import { safeResponseMetadata } from "./CdpSafeMetadata.js";
3
4
  import { allowedSanitizedUrl, isHttpUrl, numberValue, recordValue, recordsValue, scriptMetadataValues, cdpStringValue, } from "./CdpCaptureValues.js";
@@ -13,6 +14,7 @@ export const handleExecutionContextCreated = (state, params) => {
13
14
  frameId === undefined)
14
15
  return;
15
16
  const key = String(identifier);
17
+ // New contexts may reuse an id. Scripts already parsed keep the frame stored on them.
16
18
  state.executionContextFrames.set(key, frameId);
17
19
  };
18
20
  export const handleExecutionContextDestroyed = (state, params) => {
@@ -39,6 +41,7 @@ export const handleScriptParsed = (state, params) => {
39
41
  state.completeness.exclude("scripts", exclusionReasonForUrl(rawUrl));
40
42
  return;
41
43
  }
44
+ const executionContext = executionContextKey(params.executionContextId);
42
45
  const baseScript = {
43
46
  scriptId,
44
47
  rawUrl,
@@ -46,7 +49,10 @@ export const handleScriptParsed = (state, params) => {
46
49
  origin: sanitized.origin,
47
50
  ...scriptMetadataValues(params),
48
51
  language: cdpStringValue(params.scriptLanguage) ?? null,
49
- executionContextKey: executionContextKey(params.executionContextId),
52
+ executionContextKey: executionContext,
53
+ frameId: executionContext === null
54
+ ? null
55
+ : (state.executionContextFrames.get(executionContext) ?? null),
50
56
  };
51
57
  const baseBytes = scriptMetadataStringBytes(baseScript);
52
58
  const sourceMapDeclared = typeof params.sourceMapURL === "string" && params.sourceMapURL.length > 0;
@@ -79,7 +85,8 @@ const scriptMetadataStringBytes = (script) => stringByteLength(script.scriptId)
79
85
  stringByteLength(script.origin) +
80
86
  stringByteLength(script.hash) +
81
87
  stringByteLength(script.language) +
82
- stringByteLength(script.executionContextKey);
88
+ stringByteLength(script.executionContextKey) +
89
+ stringByteLength(script.frameId);
83
90
  const stringByteLength = (value) => value === null ? 0 : Buffer.byteLength(value, "utf8");
84
91
  const sourceMapForScript = (value, scriptUrl, state, remainingBytes) => {
85
92
  const declaredUrl = cdpStringValue(value);
@@ -350,8 +357,10 @@ const captureConsoleText = (state, arguments_) => {
350
357
  };
351
358
  export const handleWebSocketFrame = (state, params, direction) => {
352
359
  const requestId = cdpStringValue(params.requestId);
353
- if (requestId === undefined ||
354
- (!state.network.has(requestId) && !state.allowedWebSockets.has(requestId)))
360
+ if (requestId === undefined)
361
+ return;
362
+ const connection = state.webSocketConnectionsById.get(requestId);
363
+ if (connection === undefined)
355
364
  return;
356
365
  const response = recordValue(params.response);
357
366
  const payload = cdpStringValue(response?.payloadData) ?? "";
@@ -359,11 +368,10 @@ export const handleWebSocketFrame = (state, params, direction) => {
359
368
  const decoded = opcode === 1 ? undefined : decodeBase64(payload);
360
369
  if (opcode !== 1 && decoded === undefined)
361
370
  state.completeness.exclude("websocket_frames", "invalid_protocol_value");
362
- state.websockets.push({
363
- request_id: requestId,
371
+ connection.events.push({
364
372
  direction,
365
373
  opcode,
366
- payload_bytes: opcode === 1 ? Buffer.byteLength(payload) : (decoded?.byteLength ?? 0),
374
+ payload_bytes: opcode === 1 ? Buffer.byteLength(payload) : (decoded?.byteLength ?? null),
367
375
  payload_shape: captureWebSocketShape(state, payload, opcode),
368
376
  });
369
377
  };
@@ -389,9 +397,10 @@ export const handleWebSocketCreated = (state, params) => {
389
397
  state.completeness.exclude("websocket_connections", "invalid_protocol_value");
390
398
  return;
391
399
  }
400
+ const sourceUrl = sanitizeBrowserUrl(rawUrl).url;
392
401
  let parsed;
393
402
  try {
394
- parsed = new URL(rawUrl);
403
+ parsed = new URL(sourceUrl);
395
404
  }
396
405
  catch (cause) {
397
406
  // Unparseable URLs are recorded as unsupported, not as failures.
@@ -411,7 +420,15 @@ export const handleWebSocketCreated = (state, params) => {
411
420
  state.completeness.exclude("websocket_connections", "disallowed_origin");
412
421
  return;
413
422
  }
414
- state.allowedWebSockets.add(requestId);
423
+ if (state.webSocketConnectionsById.has(requestId)) {
424
+ state.completeness.exclude("websocket_connections", "invalid_protocol_value");
425
+ return;
426
+ }
427
+ state.webSocketConnectionsById.set(requestId, {
428
+ request_id: requestId,
429
+ url: sourceUrl,
430
+ events: [],
431
+ });
415
432
  };
416
433
  export const handleFrameNavigated = (state, params) => {
417
434
  const frame = recordValue(params.frame);
@@ -16,9 +16,8 @@ export class CdpCaptureEvents {
16
16
  network = new Map();
17
17
  networkRequestTimestamps = new Map();
18
18
  malformedRedirectRequestIds = new Set();
19
- allowedWebSockets = new Set();
19
+ webSocketConnectionsById = new Map();
20
20
  console = [];
21
- websockets = [];
22
21
  responseMetadata = [];
23
22
  agentHints = [];
24
23
  completeness = new CdpCaptureCompleteness([
@@ -54,9 +53,8 @@ export class CdpCaptureEvents {
54
53
  this.network.clear();
55
54
  this.networkRequestTimestamps.clear();
56
55
  this.malformedRedirectRequestIds.clear();
57
- this.allowedWebSockets.clear();
56
+ this.webSocketConnectionsById.clear();
58
57
  this.console.length = 0;
59
- this.websockets.length = 0;
60
58
  this.responseMetadata.length = 0;
61
59
  this.agentHints.length = 0;
62
60
  this.completeness.reset();
@@ -136,11 +134,8 @@ export class CdpCaptureEvents {
136
134
  }
137
135
  /** Resolve a transient execution context to one already authorized frame. */
138
136
  frameForScript(script, allowedFrameIds) {
139
- if (script.executionContextKey === null)
140
- return null;
141
- const frameId = this.executionContextFrames.get(script.executionContextKey);
142
- return frameId !== undefined && allowedFrameIds.has(frameId)
143
- ? frameId
137
+ return script.frameId !== null && allowedFrameIds.has(script.frameId)
138
+ ? script.frameId
144
139
  : null;
145
140
  }
146
141
  responseBodyRequestIds() {
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
- import { compareCodePoints } from "../domain/canonicalOrdering.js";
3
+ import { compareUnicodeCodePoints } from "../domain/unicodeCodePointOrder.js";
4
4
  import { CdpConnection } from "./CdpConnection.js";
5
5
  import { optionalCdpCommand } from "./CdpOptionalCommand.js";
6
6
  import { recordValue, recordsValue, cdpStringValue, } from "./CdpCaptureValues.js";
@@ -16,7 +16,7 @@ export const captureStorageFingerprints = async ({ context, origin, cookieUrl, l
16
16
  await addCookies(run, cookieUrl);
17
17
  await addIndexedDb(run, origin, indexedDbNames);
18
18
  await addCaches(run, caches);
19
- state.items.sort((left, right) => compareCodePoints(`${left.scope}:${left.identity_sha256}`, `${right.scope}:${right.identity_sha256}`));
19
+ state.items.sort((left, right) => compareUnicodeCodePoints(`${left.scope}:${left.identity_sha256}`, `${right.scope}:${right.identity_sha256}`));
20
20
  const complete = state.complete && state.items.every(({ complete }) => complete);
21
21
  return { items: state.items, complete };
22
22
  };
@@ -282,7 +282,7 @@ const stableValue = (value) => {
282
282
  return String(value);
283
283
  return Object.fromEntries(Object.entries(record)
284
284
  .filter(([key]) => key !== "objectId" && key !== "customPreview")
285
- .sort(([left], [right]) => compareCodePoints(left, right))
285
+ .sort(([left], [right]) => compareUnicodeCodePoints(left, right))
286
286
  .map(([key, item]) => [key, stableValue(item)]));
287
287
  };
288
288
  const stableValueComplete = (value) => {
@@ -5,6 +5,10 @@ import { BrowserObservationError } from "../domain/browserObservationError.js";
5
5
  import { CdpCommandRejection } from "./CdpCommandRejection.js";
6
6
  import {} from "../domain/browserObservationErrors.js";
7
7
  import { safeParseJson } from "../domain/safeJson.js";
8
+ import { WEB_RUNTIME_LIMITS } from "../domain/webRuntime.js";
9
+ // ws currently stores maxPayload as a signed 32-bit integer. Larger values can
10
+ // wrap to a negative number, which disables its limit check.
11
+ const MAX_WEBSOCKET_PAYLOAD_BYTES = 0x7fff_ffff;
8
12
  /** Correlated JSON-RPC transport for one CDP target operation. */
9
13
  export class CdpConnection {
10
14
  socket;
@@ -16,6 +20,7 @@ export class CdpConnection {
16
20
  #protocolFailureListeners = new Set();
17
21
  #nextId = 1;
18
22
  #closed = false;
23
+ #closePromise;
19
24
  #protocolFailed = false;
20
25
  #transportFailure = "disconnected";
21
26
  constructor(socket, operation, maxPayloadBytes) {
@@ -32,13 +37,20 @@ export class CdpConnection {
32
37
  static async connect(url, operation, signal, limits) {
33
38
  if (signal?.aborted === true)
34
39
  throw new AnalysisCancelledError(operation);
40
+ const maxPayloadBytes = limits === undefined
41
+ ? WEB_RUNTIME_LIMITS.protocolBytes
42
+ : limits.maxPayloadBytes;
43
+ if (!Number.isSafeInteger(maxPayloadBytes) ||
44
+ maxPayloadBytes <= 0 ||
45
+ maxPayloadBytes > MAX_WEBSOCKET_PAYLOAD_BYTES)
46
+ throw new RangeError(`CDP maxPayloadBytes must be a positive safe integer no greater than ${String(MAX_WEBSOCKET_PAYLOAD_BYTES)}.`);
35
47
  const socket = new WebSocket(url, {
36
48
  handshakeTimeout: 0,
37
- maxPayload: limits?.maxPayloadBytes ?? 0,
49
+ maxPayload: maxPayloadBytes,
38
50
  perMessageDeflate: false,
39
51
  });
40
52
  await waitForOpen(socket, operation, signal);
41
- return new CdpConnection(socket, operation, limits?.maxPayloadBytes ?? 0);
53
+ return new CdpConnection(socket, operation, maxPayloadBytes);
42
54
  }
43
55
  /** Subscribe to validated CDP event envelopes. */
44
56
  onEvent(listener) {
@@ -109,9 +121,14 @@ export class CdpConnection {
109
121
  });
110
122
  }
111
123
  /** Close only REA's socket; never close the browser or selected page. */
112
- async close() {
113
- if (this.#closed)
114
- return;
124
+ close() {
125
+ this.#closePromise ??= this.#closeTransport().catch((cause) => {
126
+ this.#closePromise = undefined;
127
+ throw cause;
128
+ });
129
+ return this.#closePromise;
130
+ }
131
+ async #closeTransport() {
115
132
  this.#closed = true;
116
133
  this.#failPending("disconnected");
117
134
  if (this.socket.readyState === WebSocket.CLOSED)
@@ -1,4 +1,4 @@
1
- import { canonicalDigest } from "../domain/comparisonSemantics.js";
1
+ import { digestCanonicalValue } from "../domain/canonicalDigest.js";
2
2
  import { BrowserObservationError } from "../domain/browserObservationError.js";
3
3
  import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
4
4
  import { delayWithCancellation, numberValue, recordValue, recordsValue, requiredRecord, cdpStringValue, } from "./CdpCaptureValues.js";
@@ -176,7 +176,7 @@ const captureResources = async (context, completeness) => {
176
176
  ? null
177
177
  : Math.max(0, numberValue(resource.contentSize) ?? 0),
178
178
  };
179
- const resourceKey = `electron_resource_${canonicalDigest(item, "CDP capture")}`;
179
+ const resourceKey = `electron_resource_${digestCanonicalValue(item, "CDP capture")}`;
180
180
  if (seen.has(resourceKey))
181
181
  continue;
182
182
  seen.add(resourceKey);
@@ -9,11 +9,10 @@ import { closeCdpTargetSession, openCdpTargetSession, } from "./CdpTargetSession
9
9
  import { inspectCdpElectronPage } from "./CdpElectronInspection.js";
10
10
  import { authorizedElectronFile } from "./ElectronFileScope.js";
11
11
  import { CDP_ELECTRON_PROVIDER_IDENTITY } from "./providerIdentities.js";
12
- const IDENTITY = CDP_ELECTRON_PROVIDER_IDENTITY;
13
12
  /** Passive Electron provider for local file pages exposed by loopback CDP. */
14
13
  export class CdpElectronProvider {
15
14
  identity() {
16
- return IDENTITY;
15
+ return CDP_ELECTRON_PROVIDER_IDENTITY;
17
16
  }
18
17
  async listTargets(input, options = {}) {
19
18
  try {
@@ -106,4 +105,6 @@ const providerError = (cause, operation) => cause instanceof BrowserObservationE
106
105
  ? new BrowserObservationError(operation, cause.reason, { cause })
107
106
  : cause instanceof AnalysisError
108
107
  ? cause
109
- : new ProviderAdapterError(IDENTITY.id, operation, { cause });
108
+ : new ProviderAdapterError(CDP_ELECTRON_PROVIDER_IDENTITY.id, operation, {
109
+ cause,
110
+ });
@@ -1,4 +1,4 @@
1
- import { canonicalDigest } from "../domain/comparisonSemantics.js";
1
+ import { digestCanonicalValue } from "../domain/canonicalDigest.js";
2
2
  import { createWebTextArtifact } from "../domain/webContentArtifact.js";
3
3
  import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
4
4
  import { requiredScriptSource } from "./CdpCaptureValues.js";
@@ -27,7 +27,7 @@ export const captureElectronScripts = async (input) => {
27
27
  is_module: script.isModule,
28
28
  language: script.language,
29
29
  };
30
- const scriptKey = `electron_script_${canonicalDigest(identity, "CDP capture")}`;
30
+ const scriptKey = `electron_script_${digestCanonicalValue(identity, "CDP capture")}`;
31
31
  if (seen.has(scriptKey))
32
32
  continue;
33
33
  seen.add(scriptKey);
@@ -188,7 +188,7 @@ const normalizedInspection = (state, captured) => ({
188
188
  resources: [...captured.resources],
189
189
  network: {
190
190
  requests: [...state.events.network.values()],
191
- websocket_events: [...state.events.websockets],
191
+ websocket_connections: [...state.events.webSocketConnectionsById.values()],
192
192
  coverage_started_at: state.startedAt,
193
193
  prior_activity_available: false,
194
194
  },
@@ -20,43 +20,39 @@ export const openCdpTargetSession = async (discovery, target, operation, signal,
20
20
  /** Disable enabled domains, detach browser sessions, and close REA's socket. */
21
21
  export const closeCdpTargetSession = async (targetSession, enabledDomains, signal) => {
22
22
  const { connection, sessionId } = targetSession;
23
- for (const [index, domain] of enabledDomains.entries()) {
24
- if (signal?.aborted === true) {
25
- await closeCancelledTargetSession(targetSession, enabledDomains.slice(index));
26
- return;
27
- }
28
- try {
29
- await connection.send(`${domain}.disable`, {}, sessionId, signal);
30
- }
31
- catch (cause) {
32
- // best-effort cleanup: domain disable continues to detach/close boundary.
33
- void cause;
34
- }
35
- }
36
- if (signal?.aborted === true) {
37
- await closeCancelledTargetSession(targetSession, []);
38
- return;
39
- }
40
- if (sessionId !== undefined)
41
- try {
42
- await connection.send("Target.detachFromTarget", { sessionId }, undefined, signal);
43
- }
44
- catch (cause) {
45
- // best-effort cleanup: closing REA's socket is the final cleanup boundary.
46
- void cause;
47
- }
48
- await connection.close();
49
- };
50
- const closeCancelledTargetSession = async ({ connection, sessionId }, enabledDomains) => {
51
- const commands = enabledDomains.map((domain) => connection.send(`${domain}.disable`, {}, sessionId));
52
- if (sessionId !== undefined)
53
- commands.push(connection.send("Target.detachFromTarget", { sessionId }));
54
- const settled = Promise.allSettled(commands);
23
+ const cleanup = new AbortController();
24
+ const domainSignal = signal === undefined
25
+ ? cleanup.signal
26
+ : AbortSignal.any([cleanup.signal, signal]);
27
+ const timeout = setTimeout(() => cleanup.abort(), 1_000);
28
+ timeout.unref();
55
29
  try {
56
- await connection.close();
30
+ if (signal?.aborted !== true) {
31
+ for (const domain of enabledDomains) {
32
+ if (domainSignal.aborted)
33
+ break;
34
+ try {
35
+ await connection.send(`${domain}.disable`, {}, sessionId, domainSignal);
36
+ }
37
+ catch {
38
+ // Best-effort domain cleanup; transport close is the definitive boundary.
39
+ }
40
+ }
41
+ }
42
+ // Cancellation skips optional domain shutdown but still releases the
43
+ // attached session using its independent, bounded cleanup signal.
44
+ if (!cleanup.signal.aborted && sessionId !== undefined)
45
+ try {
46
+ await connection.send("Target.detachFromTarget", { sessionId }, undefined, cleanup.signal);
47
+ }
48
+ catch {
49
+ // Best-effort detach; transport close is the definitive boundary.
50
+ }
57
51
  }
58
52
  finally {
59
- await settled;
53
+ clearTimeout(timeout);
54
+ cleanup.abort();
55
+ await connection.close();
60
56
  }
61
57
  };
62
58
  const attachedSessionId = (value, operation) => {