rea-agents 6.4.0 → 6.7.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 (1420) hide show
  1. package/DISCLAIMER.md +136 -0
  2. package/README.md +76 -16
  3. package/THIRD_PARTY_NOTICES.md +135 -0
  4. package/bridge/android/ReaJadxBridge.java +281 -25
  5. package/bridge/cutter/rea_bridge.py +825 -0
  6. package/bridge/ghidra/ReaGhidraAnalysisOptions.java +38 -0
  7. package/bridge/ghidra/ReaGhidraBridge.java +1232 -142
  8. package/bridge/ghidra/ReaGhidraBundleActivator.java +14 -0
  9. package/bridge/ghidra/ReaGhidraMipsSoftFloat.java +176 -0
  10. package/bridge/ghidra/ReaGhidraPrepareRaw.java +49 -0
  11. package/bridge/hopper_bridge.py +111 -69
  12. package/bridge/mitmproxy/capture.py +189 -13
  13. package/bridge/native/rea_lldb_tracer.py +88 -10
  14. package/bridge/process/ProcessRunTokenReader.swift +76 -34
  15. package/bridge/pwndbg/core_context.py +15 -2
  16. package/bridge/pwntools/layout_impl.py +5 -0
  17. package/bridge/pwntools/recorded_crash_impl.py +31 -10
  18. package/dist/adb/AdbCommand.js +148 -0
  19. package/dist/adb/AdbConfiguration.js +41 -7
  20. package/dist/adb/AdbDeviceOutput.js +59 -37
  21. package/dist/adb/AdbDirectoryListing.js +80 -0
  22. package/dist/adb/AdbHostFileName.js +34 -0
  23. package/dist/adb/AdbInputSnapshot.js +126 -0
  24. package/dist/adb/AdbProvider.js +1106 -346
  25. package/dist/adb/AdbShellOutput.js +146 -77
  26. package/dist/android/AndroidTargetSnapshot.js +7 -7
  27. package/dist/android/JadxAnalysis.js +53 -33
  28. package/dist/android/JadxConfiguration.js +283 -145
  29. package/dist/android/JadxDoctor.js +123 -0
  30. package/dist/android/JadxFailure.js +154 -0
  31. package/dist/android/JadxInterruption.js +13 -0
  32. package/dist/android/JadxJavaProbe.js +246 -0
  33. package/dist/android/JadxMcpTransport.js +53 -18
  34. package/dist/android/JadxProtocol.js +43 -2
  35. package/dist/android/JadxProvider.js +183 -102
  36. package/dist/android/JadxRelease.js +17 -2
  37. package/dist/android/JadxSession.js +35 -14
  38. package/dist/android/JadxWorkspaceRoot.js +157 -0
  39. package/dist/apktool/ApktoolCommandCleanup.js +134 -0
  40. package/dist/apktool/ApktoolCommandOutput.js +22 -0
  41. package/dist/apktool/ApktoolConfiguration.js +306 -45
  42. package/dist/apktool/ApktoolDecodeOutput.js +131 -42
  43. package/dist/apktool/ApktoolDecodedInventory.js +52 -0
  44. package/dist/apktool/ApktoolProvider.js +296 -340
  45. package/dist/apktool/ApktoolStringTables.js +178 -0
  46. package/dist/apktool/ApktoolWorkspace.js +162 -0
  47. package/dist/application/AnalysisContextQueries.js +5 -8
  48. package/dist/application/AnalysisDocument.js +19 -4
  49. package/dist/application/AnalysisProvider.js +36 -18
  50. package/dist/application/AppBundleExecutable.js +16 -9
  51. package/dist/application/BinaryTargetResolver.js +204 -40
  52. package/dist/application/BrowserEvidence.js +1 -1
  53. package/dist/application/BrowserObservationService.js +54 -9
  54. package/dist/application/BrowserScenarioCaptureService.js +26 -7
  55. package/dist/application/CallPathTracing.js +52 -13
  56. package/dist/application/CapabilityInventory.js +182 -36
  57. package/dist/application/ClaudeDesktopConfigLocation.js +152 -0
  58. package/dist/application/ClientConfigurationCleanup.js +73 -0
  59. package/dist/application/ClientConfigurationDocument.js +270 -151
  60. package/dist/application/ClientConfigurationFiles.js +51 -14
  61. package/dist/application/ClientConfigurationPublication.js +167 -0
  62. package/dist/application/ClientRegistrationEnvironment.js +40 -4
  63. package/dist/application/ClientRegistrationIdentity.js +112 -32
  64. package/dist/application/ClientRegistrationStatus.js +280 -84
  65. package/dist/application/DirectAnalysis.js +98 -30
  66. package/dist/application/DirectAnalysisCleanup.js +5 -1
  67. package/dist/application/DirectAnalysisStatus.js +13 -1
  68. package/dist/application/Doctor.js +192 -37
  69. package/dist/application/DoctorDiagnostics.js +59 -16
  70. package/dist/application/DoctorProviderIds.js +8 -0
  71. package/dist/application/DoctorScope.js +11 -2
  72. package/dist/application/DshCordisPatch.js +355 -0
  73. package/dist/application/DshCordisYaml.js +155 -0
  74. package/dist/application/EnhancedLiteralTracing.js +30 -16
  75. package/dist/application/EnhancedToolTypes.js +0 -1
  76. package/dist/application/EnhancedTools.js +154 -56
  77. package/dist/application/EvidenceBundleCommands.js +30 -7
  78. package/dist/application/EvidenceBundleFiles.js +29 -7
  79. package/dist/application/FunctionAnalysisEvidence.js +3 -0
  80. package/dist/application/GeminiClientSettings.js +25 -13
  81. package/dist/application/HermesClientHome.js +20 -0
  82. package/dist/application/HermesConfigurationYaml.js +312 -0
  83. package/dist/application/HopperDownload.js +11 -3
  84. package/dist/application/HopperReleaseFeed.js +71 -0
  85. package/dist/application/InventoryProjectionEvidence.js +0 -1
  86. package/dist/application/InvestigationProviders.js +14 -3
  87. package/dist/application/JsonFiles.js +110 -20
  88. package/dist/application/JsonInputFile.js +220 -62
  89. package/dist/application/LinuxHopper.js +218 -115
  90. package/dist/application/LinuxHopperPublisher.js +656 -0
  91. package/dist/application/MacHopper.js +203 -83
  92. package/dist/application/MacHopperPaths.js +40 -0
  93. package/dist/application/{MipsElfAbiFlags.js → MipsElfMetadata.js} +71 -10
  94. package/dist/application/MipsElfSharedLoad.js +164 -0
  95. package/dist/application/MipsGnuAttributes.js +90 -0
  96. package/dist/application/MsixPackageStorage.js +140 -0
  97. package/dist/application/ProgressReporter.js +1 -1
  98. package/dist/application/ProviderOperationExecution.js +15 -14
  99. package/dist/application/ReconstructionCoverageService.js +0 -1
  100. package/dist/application/ReconstructionObligationCandidates.js +20 -4
  101. package/dist/application/ReconstructionObligationLedgerDiagnostics.js +2 -2
  102. package/dist/application/ReconstructionObligationLedgerEvaluation.js +19 -33
  103. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -72
  104. package/dist/application/ReconstructionObligationLedgerService.js +6 -2
  105. package/dist/application/ReconstructionObligationOriginalCases.js +10 -1
  106. package/dist/application/ReferenceSourceImport.js +24 -8
  107. package/dist/application/ReferenceSourceImportEntries.js +180 -37
  108. package/dist/application/ReferenceSourceImportPolicy.js +5 -3
  109. package/dist/application/ReferenceSourceImportTypes.js +0 -1
  110. package/dist/application/ReferenceSourceVcsAdapter.js +36 -17
  111. package/dist/application/RegularFileRead.js +117 -70
  112. package/dist/application/Setup.js +59 -21
  113. package/dist/application/SetupClientConfiguration.js +301 -66
  114. package/dist/application/SetupClients.js +25 -10
  115. package/dist/application/SetupHost.js +149 -51
  116. package/dist/application/SetupInstallFailure.js +58 -3
  117. package/dist/application/SetupPlan.js +94 -55
  118. package/dist/application/SetupRecoveryBackup.js +93 -0
  119. package/dist/application/SetupRegistrationEnvironment.js +14 -1
  120. package/dist/application/SetupSkill.js +303 -76
  121. package/dist/application/SourceLimitations.js +35 -0
  122. package/dist/application/SupportedClients.js +166 -32
  123. package/dist/application/TypeScriptEmittedSourceCandidates.js +26 -0
  124. package/dist/application/Uninstall.js +356 -110
  125. package/dist/application/UninstallFailure.js +14 -0
  126. package/dist/application/Update.js +54 -25
  127. package/dist/application/UpdateCommandProgress.js +66 -0
  128. package/dist/application/UpdateFailure.js +17 -0
  129. package/dist/application/UpdateMaintenance.js +18 -31
  130. package/dist/application/UpdateRuntime.js +198 -54
  131. package/dist/application/WebModuleTraceService.js +42 -22
  132. package/dist/application/WebNetworkCaptureService.js +24 -12
  133. package/dist/application/WebRuntimeService.js +41 -8
  134. package/dist/application/WebScriptExportService.js +6 -4
  135. package/dist/application/WebSourceLocationService.js +23 -8
  136. package/dist/application/WindowsCapabilities.js +18 -15
  137. package/dist/application/WorkflowEvidence.js +31 -1
  138. package/dist/application/analysisView/AnalysisViewService.js +46 -11
  139. package/dist/application/android/AndroidAnalysisService.js +5 -4
  140. package/dist/application/android/AndroidPackageInspection.js +25 -0
  141. package/dist/application/android/AndroidSearchEvidenceSummary.js +98 -0
  142. package/dist/application/artifacts/ArtifactComparisonEvidence.js +32 -0
  143. package/dist/application/binary/AnalysisProviderEvaluation.js +14 -11
  144. package/dist/application/binary/AnalysisProviderRegistry.js +365 -60
  145. package/dist/application/binary/AnalysisSnapshotCache.js +41 -20
  146. package/dist/application/binary/AnalysisSnapshotFiles.js +75 -9
  147. package/dist/application/binary/BinarySession.js +308 -117
  148. package/dist/application/binary/BinarySessionExecution.js +5 -4
  149. package/dist/application/binary/BinarySessionOpen.js +13 -6
  150. package/dist/application/binary/BinarySessionRecords.js +36 -7
  151. package/dist/application/binary/BinarySessionStatus.js +96 -27
  152. package/dist/application/binary/BinaryTargetSummary.js +9 -0
  153. package/dist/application/binary/CompositeProvider.js +116 -28
  154. package/dist/application/binary/LazyAnalysisProvider.js +6 -66
  155. package/dist/application/binary/SessionProviderRouter.js +16 -4
  156. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +14 -5
  157. package/dist/application/binaryDiagnostics/PeResourcesService.js +25 -5
  158. package/dist/application/binaryDiagnostics/RecordedCrashService.js +17 -7
  159. package/dist/application/captures/PacketCaptureService.js +84 -0
  160. package/dist/application/closeOwnedWebResources.js +37 -0
  161. package/dist/application/electron/ElectronFusePort.js +1 -0
  162. package/dist/application/electron/ElectronFuseService.js +45 -0
  163. package/dist/application/evm/EvmInterfaceEvidence.js +11 -0
  164. package/dist/application/evm/EvmInterfaceService.js +5 -15
  165. package/dist/application/firmware/FirmwareAnalysisService.js +4 -3
  166. package/dist/application/flutter/DartAotInspection.js +26 -0
  167. package/dist/application/flutter/FlutterBuildAnalysisPort.js +1 -0
  168. package/dist/application/flutter/FlutterBuildAnalysisService.js +13 -0
  169. package/dist/application/frida/FridaInstrumentationPort.js +8 -0
  170. package/dist/application/frida/FridaInstrumentationService.js +310 -0
  171. package/dist/application/frida/fridaInputErrors.js +17 -0
  172. package/dist/application/go/GoBinaryPort.js +1 -0
  173. package/dist/application/go/GoBinaryService.js +79 -0
  174. package/dist/application/harmony/HarmonyApplicationService.js +17 -0
  175. package/dist/application/investigation/EvidenceLedger.js +43 -18
  176. package/dist/application/investigation/InvestigationRecords.js +12 -21
  177. package/dist/application/investigation/UnknownEvidence.js +22 -18
  178. package/dist/application/javascript/ElectronActiveObservationService.js +55 -25
  179. package/dist/application/javascript/ElectronBoundaryAnalysis.js +17 -3
  180. package/dist/application/javascript/ElectronBoundaryGraph.js +2 -0
  181. package/dist/application/javascript/ElectronBoundaryGraphCallPaths.js +144 -0
  182. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +26 -7
  183. package/dist/application/javascript/ElectronBoundaryGraphNative.js +1 -1
  184. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +61 -11
  185. package/dist/application/javascript/ElectronEvidence.js +1 -2
  186. package/dist/application/javascript/ElectronObservationService.js +41 -8
  187. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -0
  188. package/dist/application/javascript/JavaScriptApplicationService.js +29 -14
  189. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +0 -1
  190. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +119 -49
  191. package/dist/application/javascript/JavaScriptArtifactAnalysisTypes.js +30 -1
  192. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +51 -21
  193. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +31 -7
  194. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +28 -6
  195. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +25 -14
  196. package/dist/application/javascript/JavaScriptArtifactGraphEvidence.js +3 -3
  197. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +186 -50
  198. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +173 -14
  199. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +959 -188
  200. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +57 -32
  201. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +2 -0
  202. package/dist/application/javascript/JavaScriptModuleRelationships.js +34 -12
  203. package/dist/application/javascript/JavaScriptRecoveryService.js +29 -9
  204. package/dist/application/javascript/JavaScriptRuntimeObservationEvidence.js +1 -2
  205. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +33 -9
  206. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +0 -1
  207. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  208. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +138 -43
  209. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +13 -4
  210. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +23 -3
  211. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +18 -5
  212. package/dist/application/javascript/JavaScriptSemanticGraphElectronProjection.js +67 -0
  213. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +4 -6
  214. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +2 -3
  215. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  216. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +5 -8
  217. package/dist/application/javascript/JavaScriptSemanticTraceService.js +0 -1
  218. package/dist/application/managed/ManagedApplicationGraphService.js +0 -1
  219. package/dist/application/managed/ManagedMemberComparisonService.js +72 -54
  220. package/dist/application/managed/ManagedNativeVerificationService.js +0 -1
  221. package/dist/application/managed/ManagedReconstructionService.js +0 -1
  222. package/dist/application/native/NativeCallRoutes.js +78 -41
  223. package/dist/application/native/NativeDispatchMetadataInspection.js +6 -2
  224. package/dist/application/native/NativeUiActionTrace.js +43 -22
  225. package/dist/application/native/NativeValueTrace.js +65 -23
  226. package/dist/application/pcap/PcapAnalysisPort.js +1 -0
  227. package/dist/application/pcap/PcapAnalysisService.js +24 -0
  228. package/dist/application/process/ProcessCli.js +33 -13
  229. package/dist/application/reverse/ReverseEngineeringCommandPort.js +1 -0
  230. package/dist/application/reverse/ReverseEngineeringService.js +688 -0
  231. package/dist/application/rust/RustBinaryPort.js +1 -0
  232. package/dist/application/rust/RustBinaryService.js +82 -0
  233. package/dist/application/signals/SignalRecordingService.js +84 -0
  234. package/dist/application/sqlite/SqliteDatabaseCapability.js +30 -0
  235. package/dist/application/sqlite/SqliteDatabasePort.js +1 -0
  236. package/dist/application/sqlite/SqliteDatabaseService.js +76 -0
  237. package/dist/application/wasm/WasmArtifactPort.js +1 -0
  238. package/dist/application/wasm/WasmArtifactService.js +76 -0
  239. package/dist/application/wasm/WasmInterfaceComparisonService.js +188 -0
  240. package/dist/artifacts/AnalysisCleanupLease.js +119 -0
  241. package/dist/artifacts/ArtifactFileOperation.js +150 -0
  242. package/dist/artifacts/ArtifactHash.js +15 -3
  243. package/dist/artifacts/ArtifactPaths.js +4 -7
  244. package/dist/artifacts/ArtifactProvider.js +24 -9
  245. package/dist/artifacts/ArtifactReader.js +63 -5
  246. package/dist/artifacts/ArtifactResourceScope.js +92 -9
  247. package/dist/artifacts/AsarArtifactReader.js +186 -120
  248. package/dist/artifacts/AsarEntryStream.js +49 -17
  249. package/dist/artifacts/AsarListing.js +78 -0
  250. package/dist/artifacts/DirectoryArtifactReader.js +119 -28
  251. package/dist/artifacts/MachOSliceArtifactReader.js +153 -23
  252. package/dist/artifacts/NativeDmgArtifactReader.js +264 -62
  253. package/dist/artifacts/OrderedReads.js +57 -0
  254. package/dist/artifacts/SafeOutputTree.js +24 -7
  255. package/dist/artifacts/SafeOutputTreeCreationFailure.js +1 -0
  256. package/dist/artifacts/SafeOutputTreeReadback.js +10 -16
  257. package/dist/artifacts/ZipArtifactReader.js +150 -25
  258. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +79 -68
  259. package/dist/artifacts/apple/DylibFileAccess.js +106 -0
  260. package/dist/artifacts/apple/DylibResolutionReader.js +72 -157
  261. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +108 -29
  262. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +81 -28
  263. package/dist/artifacts/apple/KeyedArchiveReader.js +23 -13
  264. package/dist/artifacts/apple/MachoLoadCommandReader.js +77 -61
  265. package/dist/artifacts/apple/NibArchive.js +11 -4
  266. package/dist/artifacts/apple/PlistNumberLiterals.js +106 -118
  267. package/dist/artifacts/extraction/ArtifactExtraction.js +21 -19
  268. package/dist/artifacts/hostExecutableMarking.js +16 -0
  269. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +139 -41
  270. package/dist/artifacts/inventory/classify.js +36 -17
  271. package/dist/artifacts/inventory/hashStableRootArtifact.js +14 -7
  272. package/dist/artifacts/inventory/reader.js +36 -21
  273. package/dist/artifacts/inventory/scanCanonical.js +27 -21
  274. package/dist/artifacts/inventory/scanReader.js +36 -10
  275. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +166 -8
  276. package/dist/artifacts/readArtifactFileChunks.js +9 -0
  277. package/dist/artifacts/readStableArtifact.js +13 -11
  278. package/dist/browser/BrowserProcessStartup.js +20 -9
  279. package/dist/browser/BrowserScenarioPartialObservation.js +74 -92
  280. package/dist/browser/BrowserScenarioSecrets.js +176 -46
  281. package/dist/browser/CdpBrowserProvider.js +124 -102
  282. package/dist/browser/CdpCaptureDocuments.js +232 -102
  283. package/dist/browser/CdpCaptureDomSvg.js +80 -76
  284. package/dist/browser/CdpCaptureEventBodyShapes.js +9 -5
  285. package/dist/browser/CdpCaptureEventHandlers.js +23 -12
  286. package/dist/browser/CdpCaptureEvents.js +49 -10
  287. package/dist/browser/CdpCaptureStorage.js +22 -5
  288. package/dist/browser/CdpCaptureStorageFingerprints.js +54 -11
  289. package/dist/browser/CdpCaptureValues.js +12 -1
  290. package/dist/browser/CdpConnection.js +135 -30
  291. package/dist/browser/CdpElectronInspection.js +74 -64
  292. package/dist/browser/CdpElectronProvider.js +63 -6
  293. package/dist/browser/CdpElectronScriptEvents.js +4 -1
  294. package/dist/browser/CdpElectronScripts.js +4 -6
  295. package/dist/browser/CdpElectronWorkers.js +20 -4
  296. package/dist/browser/CdpEndpoint.js +143 -17
  297. package/dist/browser/CdpObservationSession.js +24 -8
  298. package/dist/browser/CdpPageCapture.js +68 -17
  299. package/dist/browser/CdpPageCaptureScripts.js +18 -13
  300. package/dist/browser/CdpPageCaptureWorkers.js +46 -11
  301. package/dist/browser/CdpSafeMetadata.js +32 -24
  302. package/dist/browser/CdpScreenshot.js +5 -14
  303. package/dist/browser/CdpSnapshotNodes.js +103 -0
  304. package/dist/browser/CdpSnapshotStrings.js +15 -0
  305. package/dist/browser/CdpTargetSession.js +76 -7
  306. package/dist/browser/CdpTargetSessionOwner.js +198 -0
  307. package/dist/browser/CdpWebMcpDiscovery.js +23 -6
  308. package/dist/browser/ElectronCaptureCleanup.js +82 -0
  309. package/dist/browser/ElectronProcessCleanup.js +91 -0
  310. package/dist/browser/PlaywrightBrowserScenarioProvider.js +75 -20
  311. package/dist/browser/PlaywrightElectronActiveActions.js +57 -9
  312. package/dist/browser/PlaywrightElectronActiveFuses.js +86 -0
  313. package/dist/browser/PlaywrightElectronActiveProjection.js +21 -4
  314. package/dist/browser/PlaywrightElectronActiveProvider.js +237 -175
  315. package/dist/browser/PlaywrightExecutionBoundary.js +6 -4
  316. package/dist/browser/PlaywrightScenarioBrowser.js +240 -91
  317. package/dist/browser/PlaywrightScenarioEvents.js +287 -38
  318. package/dist/browser/PlaywrightScenarioServiceWorkers.js +336 -0
  319. package/dist/browser/PlaywrightScenarioSession.js +151 -46
  320. package/dist/browser/PlaywrightScenarioStorage.js +15 -7
  321. package/dist/browser/StructuredFieldToken.js +53 -0
  322. package/dist/browser/WebArtifactCleanup.js +53 -0
  323. package/dist/browser/WebSourceMapFetcher.js +181 -89
  324. package/dist/browser/assets/LocalWebScriptArtifacts.js +24 -3
  325. package/dist/browser/assets/PublishWebScripts.js +13 -2
  326. package/dist/browser/assets/ScenarioScriptCapture.js +2 -1
  327. package/dist/browser/assets/WebArtifactReads.js +15 -3
  328. package/dist/browser/assets/WebSourceLocationArtifacts.js +47 -3
  329. package/dist/browser/execution/CdpRuntimeSession.js +36 -7
  330. package/dist/browser/execution/CdpWebRuntimeProvider.js +22 -4
  331. package/dist/browser/history/CaptureFailures.js +29 -10
  332. package/dist/browser/history/CaptureFormatError.js +2 -2
  333. package/dist/browser/history/{HarJson.js → CaptureJson.js} +14 -4
  334. package/dist/browser/history/CaptureRedaction.js +16 -3
  335. package/dist/browser/history/CaptureRelease.js +20 -2
  336. package/dist/browser/history/HarCapture.js +54 -30
  337. package/dist/browser/history/HarSchema.js +36 -36
  338. package/dist/browser/history/HistoricalCaptureDecoder.js +93 -25
  339. package/dist/browser/history/NodeCaptureAdapter.js +48 -0
  340. package/dist/browser/history/{HarCaptureProcess.js → NodeCaptureProcess.js} +18 -9
  341. package/dist/browser/history/QlogCapture.js +385 -0
  342. package/dist/browser/history/SazCapture.js +130 -0
  343. package/dist/browser/history/SazHttp.js +61 -0
  344. package/dist/browser/history/SazMetadata.js +55 -0
  345. package/dist/browser/history/SazProjection.js +90 -0
  346. package/dist/browser/modules/NativeModuleResolver.js +248 -131
  347. package/dist/browser/modules/WebModuleArtifacts.js +49 -3
  348. package/dist/browser/network/PlaywrightNetworkContent.js +67 -9
  349. package/dist/browser/network/PlaywrightScenarioNetwork.js +249 -26
  350. package/dist/captures/TsharkCaptureProvider.js +377 -0
  351. package/dist/captures/parseFieldDiscovery.js +66 -0
  352. package/dist/captures/parsePacketOutput.js +21 -0
  353. package/dist/catalogIdentity.js +58 -42
  354. package/dist/cli/adbCommands.js +20 -21
  355. package/dist/cli/analysisViewCommands.js +1 -1
  356. package/dist/cli/androidCommands.js +13 -16
  357. package/dist/cli/apktoolCommands.js +14 -25
  358. package/dist/cli/applicationCommands.js +44 -17
  359. package/dist/cli/artifactCommands.js +1 -1
  360. package/dist/cli/binaryDiagnosticsCommands.js +17 -13
  361. package/dist/cli/browserAdvancedCommands.js +46 -26
  362. package/dist/cli/browserCommands.js +59 -33
  363. package/dist/cli/captureCommands.js +72 -0
  364. package/dist/cli/cliResultOutput.js +274 -0
  365. package/dist/cli/coreBinaryCommands.js +77 -30
  366. package/dist/cli/coreNativeCommands.js +53 -31
  367. package/dist/cli/cutterCommands.js +88 -0
  368. package/dist/cli/electronCommands.js +76 -13
  369. package/dist/cli/evmCommands.js +9 -19
  370. package/dist/cli/finishAnalysisCommand.js +52 -0
  371. package/dist/cli/firmwareCommands.js +20 -50
  372. package/dist/cli/flutterCommands.js +53 -0
  373. package/dist/cli/fridaCommands.js +219 -0
  374. package/dist/cli/goCommands.js +20 -0
  375. package/dist/cli/interactiveSetup.js +11 -1
  376. package/dist/cli/javascriptApplicationAnalysis.js +1 -1
  377. package/dist/cli/javascriptRecoveryCommands.js +18 -23
  378. package/dist/cli/jebCommands.js +2 -14
  379. package/dist/cli/jsonOutput.js +2 -2
  380. package/dist/cli/managedCommands.js +31 -3
  381. package/dist/cli/options.js +26 -2
  382. package/dist/cli/pcapCommands.js +29 -0
  383. package/dist/cli/processCommands.js +1 -1
  384. package/dist/cli/reverseEngineeringCommands.js +268 -0
  385. package/dist/cli/rustCommands.js +20 -0
  386. package/dist/cli/setupCommands.js +41 -12
  387. package/dist/cli/signalCommands.js +72 -0
  388. package/dist/cli/sqliteCommands.js +52 -0
  389. package/dist/cli/utilityCommands.js +116 -74
  390. package/dist/cli/wasmCommands.js +50 -0
  391. package/dist/cli/webModuleCommands.js +27 -38
  392. package/dist/cli/webNetworkCaptureCommands.js +10 -9
  393. package/dist/cli/webRuntimeCommands.js +15 -6
  394. package/dist/cli/webSourceLocationCommands.js +14 -33
  395. package/dist/cli-runtime/AnalysisCleanupLease-CWfTGYKd.js +103 -0
  396. package/dist/cli-runtime/AnalysisProvider-BGrYaMVo.js +38 -0
  397. package/dist/cli-runtime/AnalysisSnapshotCache-BjRlXeUS.js +711 -0
  398. package/dist/cli-runtime/ArtifactFileOperation-Dg4BcoEM.js +122 -0
  399. package/dist/cli-runtime/ArtifactReader-DMwm42bk.js +78 -0
  400. package/dist/cli-runtime/ArtifactResourceScope-CokZGcII.js +175 -0
  401. package/dist/cli-runtime/AsarHeader-BxwU17DJ.js +31 -0
  402. package/dist/cli-runtime/BinarySessionStatus-DRhjr7Vb.js +212 -0
  403. package/dist/cli-runtime/BinaryTargetResolver-tuCTjBlQ.js +1238 -0
  404. package/dist/cli-runtime/BoundedFileBytes-DRtiQNAQ.js +43 -0
  405. package/dist/cli-runtime/CdpTargetSession-CQ08KHbh.js +925 -0
  406. package/dist/cli-runtime/ClientConfigPath-Dn-V_GUf.js +255 -0
  407. package/dist/cli-runtime/ClientConfigurationDocument-C9T8MNGc.js +2021 -0
  408. package/dist/cli-runtime/ClientRegistrationStatus-PnD29RTX.js +585 -0
  409. package/dist/cli-runtime/CurrentEntrypointPath-m7QCIVN0.js +14 -0
  410. package/dist/cli-runtime/DirectAnalysis-C5NyUryV.js +581 -0
  411. package/dist/cli-runtime/DirectoryArtifactReader-CokAJ8vo.js +448 -0
  412. package/dist/cli-runtime/Doctor-DrkWsav4.js +668 -0
  413. package/dist/cli-runtime/ElectronFileScope-AP7VoVr7.js +1109 -0
  414. package/dist/cli-runtime/ElectronFuseFailures-DsjXR7Xp.js +609 -0
  415. package/dist/cli-runtime/ExecFileOutput-D6KLYTve.js +119 -0
  416. package/dist/cli-runtime/InterfaceBuilderDecodeBudget-CW1IO3dG.js +298 -0
  417. package/dist/cli-runtime/InventoryProjectionEvidence-DTH5QAqL.js +49 -0
  418. package/dist/cli-runtime/InvestigationProviders-CFh4a64d.js +118 -0
  419. package/dist/cli-runtime/JavaScriptApplicationEvidenceGraph-gOmPB2L6.js +160 -0
  420. package/dist/cli-runtime/JavaScriptApplicationWorkflowEvidence-WZgtK_Ok.js +75 -0
  421. package/dist/cli-runtime/JavaScriptWorkerMemoryLimit-B1bwMM1a.js +86 -0
  422. package/dist/cli-runtime/JebMcpEndpoint-BEalGZh9.js +710 -0
  423. package/dist/cli-runtime/JsonFiles-uvd6ZyQi.js +600 -0
  424. package/dist/cli-runtime/KunaInstallation-P0j3x851.js +1781 -0
  425. package/dist/cli-runtime/MacCodeSignature-MgYbRK_H.js +24 -0
  426. package/dist/cli-runtime/MacHopperPaths-bGzqjF1Z.js +34 -0
  427. package/dist/cli-runtime/MachoLoadCommandReader-CZm6N5vF.js +330 -0
  428. package/dist/cli-runtime/ManagedSnapshot-CPE9C3OD.js +4481 -0
  429. package/dist/cli-runtime/OwnedCommandCleanup-BN_V6Erc.js +187 -0
  430. package/dist/cli-runtime/OwnedRegularFile-D1f5nUCx.js +256 -0
  431. package/dist/cli-runtime/OwnedStagedOutput-D31dOozz.js +126 -0
  432. package/dist/cli-runtime/PrivateRuntimeRoot-Cd23u6jd.js +296 -0
  433. package/dist/cli-runtime/ProcessOwnership-CtrNr6ee.js +545 -0
  434. package/dist/cli-runtime/ProcessOwnershipObservation-C006iCtZ.js +920 -0
  435. package/dist/cli-runtime/ProviderDeadline-rSuH4Pm8.js +148 -0
  436. package/dist/cli-runtime/ProviderOperationExecution-CmU-XrQr.js +38 -0
  437. package/dist/cli-runtime/ProviderProcess-D87A7ctp.js +770 -0
  438. package/dist/cli-runtime/RegularFileRead-mbgGYtxe.js +125 -0
  439. package/dist/cli-runtime/SafeOutputTree-i904hd_2.js +525 -0
  440. package/dist/cli-runtime/SetupHost-CMPmPraB.js +1268 -0
  441. package/dist/cli-runtime/SharedStartupAttempt-BxKyf3Uv.js +1424 -0
  442. package/dist/cli-runtime/StableFileHash-Ame_h3lY.js +61 -0
  443. package/dist/cli-runtime/SupportedClients-DMafjitv.js +1066 -0
  444. package/dist/cli-runtime/UninstallFailure-1blyKXHE.js +22 -0
  445. package/dist/cli-runtime/Update-DAsASWlE.js +143 -0
  446. package/dist/cli-runtime/UpdateFailure-BcFNxEZZ.js +24 -0
  447. package/dist/cli-runtime/WindowsBatchCommand-Cx9kaVNf.js +97 -0
  448. package/dist/cli-runtime/WindowsNativeLoader-BqyZO0ZD.js +142 -0
  449. package/dist/cli-runtime/ZipArtifactReader-Jed69LEL.js +252 -0
  450. package/dist/cli-runtime/analysisErrorCleanup-COdAmDsb.js +33 -0
  451. package/dist/cli-runtime/appleArchiveFormat-Bb3G5CCI.js +269 -0
  452. package/dist/cli-runtime/application__DirectAnalysisStatus-F74bu9oy.js +150 -0
  453. package/dist/cli-runtime/application__EnhancedTools-Bg51b0Yp.js +1820 -0
  454. package/dist/cli-runtime/application__FunctionAnalysisEvidence-DBWIaYCh.js +41 -0
  455. package/dist/cli-runtime/application__ReconstructionCoverageService-AEPNpZqJ.js +32 -0
  456. package/dist/cli-runtime/application__ReconstructionObligationLedgerService-Cl9cPEZf.js +828 -0
  457. package/dist/cli-runtime/application__Setup-DwQzEewK.js +526 -0
  458. package/dist/cli-runtime/application__Uninstall-BOf9oyvQ.js +468 -0
  459. package/dist/cli-runtime/application__UpdateRuntime-CzWkRJHa.js +435 -0
  460. package/dist/cli-runtime/application__android__AndroidApplicationService-shW_aKlj.js +31 -0
  461. package/dist/cli-runtime/application__apple__AppleApplicationService-DIv6d3wB.js +31 -0
  462. package/dist/cli-runtime/application__harmony__HarmonyApplicationService-OIUFVQFV.js +31 -0
  463. package/dist/cli-runtime/application__javascript__ElectronActiveObservationService-wvCh72hK.js +118 -0
  464. package/dist/cli-runtime/application__javascript__ElectronObservationService-SydXPCwM.js +88 -0
  465. package/dist/cli-runtime/application__javascript__JavaScriptApplicationService-o0uEsjEc.js +12254 -0
  466. package/dist/cli-runtime/application__javascript__JavaScriptApplicationWorkflowService-BAheG_71.js +2336 -0
  467. package/dist/cli-runtime/application__javascript__JavaScriptRuntimeReconciliationService-Cnn4GP8q.js +88 -0
  468. package/dist/cli-runtime/application__javascript__JavaScriptSemanticTraceService-CmvLfV1A.js +299 -0
  469. package/dist/cli-runtime/artifacts__ArtifactProvider-wx2K0F2I.js +2205 -0
  470. package/dist/cli-runtime/binary-CWVNJhAC.js +19608 -0
  471. package/dist/cli-runtime/catalogIdentity-DAEEsOdX.js +1112 -0
  472. package/dist/cli-runtime/cli.js +44469 -0
  473. package/dist/cli-runtime/cliOutput-CgSuw782.js +163 -0
  474. package/dist/cli-runtime/cliOutput.js +5 -0
  475. package/dist/cli-runtime/cliResultOutput-10sd6xGx.js +1453 -0
  476. package/dist/cli-runtime/cliResultOutput.js +6 -0
  477. package/dist/cli-runtime/composition__browserScenario-BtPb1c1y.js +3414 -0
  478. package/dist/cli-runtime/composition__electronObservation-Bk8R6DJo.js +614 -0
  479. package/dist/cli-runtime/composition__electronScenario-BVF0qStH.js +916 -0
  480. package/dist/cli-runtime/cutterToolContracts-BQtG_Nzo.js +5267 -0
  481. package/dist/cli-runtime/doctorRuntime-B__SIpm-.js +478 -0
  482. package/dist/cli-runtime/dotnet__ManagedStaticProvider-DO5Yzcp4.js +5 -0
  483. package/dist/cli-runtime/errorSchemas-Ixz_q7qt.js +655 -0
  484. package/dist/cli-runtime/homeDirectory-DC_DeJIg.js +18 -0
  485. package/dist/cli-runtime/javascriptApplicationAnalysis-Dk6yBV8g.js +2088 -0
  486. package/dist/cli-runtime/javascriptExportReturnShapeProjection-CObOIiQ6.js +78 -0
  487. package/dist/cli-runtime/javascriptExportShapeComparisonSchemas-DpwuBenh.js +1244 -0
  488. package/dist/cli-runtime/javascriptRuntimeReconciliation-C6ZgWMys.js +1509 -0
  489. package/dist/cli-runtime/javascriptRuntimeReconciliationSchemas-D6tZKUQs.js +247 -0
  490. package/dist/cli-runtime/javascriptSemanticTraceSchemas-C7m0b6_w.js +126 -0
  491. package/dist/cli-runtime/lipo-DPQ6qurH.js +394 -0
  492. package/dist/cli-runtime/logger-BuDJ9xxO.js +48 -0
  493. package/dist/cli-runtime/machoContainer-Cy98bkFm.js +352 -0
  494. package/dist/cli-runtime/managedApplicationGraph-BazVqpJv.js +1136 -0
  495. package/dist/cli-runtime/managedToolContracts-BuFkMBH5.js +99 -0
  496. package/dist/cli-runtime/mcpDoctor.js +361 -0
  497. package/dist/cli-runtime/mcpStartupPolicy-imCbM3qo.js +28 -0
  498. package/dist/cli-runtime/native__NativeMacOSProvider-DTcRhuGA.js +5502 -0
  499. package/dist/cli-runtime/officialToolContracts-CzzVLx8I.js +1522 -0
  500. package/dist/cli-runtime/peMachine-B9ggfSJJ.js +95 -0
  501. package/dist/cli-runtime/propertyListKeys-D5dSASEy.js +355 -0
  502. package/dist/cli-runtime/providerCleanupError-BhsJyAhk.js +25 -0
  503. package/dist/cli-runtime/providerIdentities-Ao1XTvwx.js +31 -0
  504. package/dist/cli-runtime/providerStartupTimeout-B2tF2LtZ.js +17 -0
  505. package/dist/cli-runtime/readArtifactFileChunks-BbTL_PtB.js +129 -0
  506. package/dist/cli-runtime/reconstructionObligationLedgerSchemas-Bi6sect1.js +22156 -0
  507. package/dist/cli-runtime/rolldown-runtime-DXoylpqc.js +121 -0
  508. package/dist/cli-runtime/runtimeVersion-CMGd0bDu.js +23 -0
  509. package/dist/cli-runtime/safeJson-DKKACtdy.js +25 -0
  510. package/dist/cli-runtime/scanCanonical-CcDFUr-w.js +2594 -0
  511. package/dist/cli-runtime/snapshotEnvironment-Yvx5qwsl.js +196 -0
  512. package/dist/cli-runtime/toolContracts-CJzEyZ38.js +3795 -0
  513. package/dist/cli-runtime/toolOutputSchemaGroups-BqdSzySu.js +12249 -0
  514. package/dist/cli-runtime/workflowInputError-BP8z9Wxl.js +26 -0
  515. package/dist/cli.js +48 -5
  516. package/dist/cliBrowserScenarioCommands.js +41 -7
  517. package/dist/cliCommandNames.js +48 -0
  518. package/dist/cliEvidenceCommands.js +0 -1
  519. package/dist/cliJavaScriptRuntimeCommands.js +16 -14
  520. package/dist/cliJsonInput.js +12 -4
  521. package/dist/cliLogging.js +66 -15
  522. package/dist/cliObservationOptions.js +9 -0
  523. package/dist/cliOutput.js +105 -7
  524. package/dist/composition/binary.js +19 -2
  525. package/dist/composition/captures.js +3 -0
  526. package/dist/composition/directAnalysis.js +36 -11
  527. package/dist/composition/electronFuses.js +4 -0
  528. package/dist/composition/evm.js +12 -0
  529. package/dist/composition/flutter.js +3 -0
  530. package/dist/composition/go.js +4 -0
  531. package/dist/composition/javascriptAnalysisWorkerProcess.js +8 -8
  532. package/dist/composition/jeb.js +45 -5
  533. package/dist/composition/pcap.js +3 -0
  534. package/dist/composition/resolveWindowsProviderExecutable.js +61 -0
  535. package/dist/composition/reverseEngineering.js +29 -0
  536. package/dist/composition/rust.js +4 -0
  537. package/dist/composition/signals.js +3 -0
  538. package/dist/composition/sqlite.js +4 -0
  539. package/dist/composition/wasm.js +22 -0
  540. package/dist/composition/webNetworkCaptures.js +7 -2
  541. package/dist/config/environment.js +79 -4
  542. package/dist/config/ghidraDisabledAnalyzers.js +25 -0
  543. package/dist/config/homeDirectory.js +9 -6
  544. package/dist/config/mcpInputSchemaProfile.js +5 -1
  545. package/dist/config/mcpOutputSchemaProfile.js +22 -0
  546. package/dist/config/parseConfig.js +28 -34
  547. package/dist/config/parsers.js +4 -3
  548. package/dist/config/{ghidraStartupTimeout.js → providerStartupTimeout.js} +7 -3
  549. package/dist/contracts/adb/adbToolContracts.js +8 -8
  550. package/dist/contracts/analysisDetail.js +6 -3
  551. package/dist/contracts/analysisViewApiSurfaceExample.js +68 -0
  552. package/dist/contracts/analysisViewToolContracts.js +65 -3
  553. package/dist/contracts/android/androidToolContracts.js +17 -8
  554. package/dist/contracts/apktool/apktoolToolContracts.js +5 -1
  555. package/dist/contracts/applicationToolContracts.js +17 -2
  556. package/dist/contracts/artifactComparisonExample.js +18 -14
  557. package/dist/contracts/artifactToolContracts.js +16 -3
  558. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  559. package/dist/contracts/browserToolContracts.js +13 -1
  560. package/dist/contracts/captures/captureToolContracts.js +42 -0
  561. package/dist/contracts/compactInputSchema.js +39 -12
  562. package/dist/contracts/cutterToolContracts.js +84 -0
  563. package/dist/contracts/enhancedToolContracts.js +2 -2
  564. package/dist/contracts/evm/evmToolContracts.js +30 -15
  565. package/dist/contracts/firmware/firmwareToolContracts.js +1 -1
  566. package/dist/contracts/flutter/flutterToolContracts.js +47 -0
  567. package/dist/contracts/fridaRemoteAddress.js +23 -0
  568. package/dist/contracts/fridaToolContracts.js +274 -0
  569. package/dist/contracts/functionComparisonExample.js +12 -1
  570. package/dist/contracts/gdbToolContracts.js +102 -0
  571. package/dist/contracts/go/goToolContracts.js +20 -0
  572. package/dist/contracts/hopperMemoryContracts.js +15 -0
  573. package/dist/contracts/inputSchemaPresentation.js +199 -38
  574. package/dist/contracts/investigationExamples.js +1 -0
  575. package/dist/contracts/javascript/electronToolContracts.js +27 -2
  576. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +1 -0
  577. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +13 -1
  578. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +1 -0
  579. package/dist/contracts/jsonSchemaKeywords.js +29 -0
  580. package/dist/contracts/managed/managedToolContracts.js +43 -4
  581. package/dist/contracts/managed/managedWorkflowExamples.js +10 -1
  582. package/dist/contracts/managed/managedWorkflowToolContracts.js +4 -30
  583. package/dist/contracts/mobileApplicationGraphExamples.js +27 -12
  584. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +3 -2
  585. package/dist/contracts/native/nativeToolContracts.js +10 -6
  586. package/dist/contracts/officialToolContracts.js +7 -7
  587. package/dist/contracts/pcap/pcapToolContracts.js +33 -0
  588. package/dist/contracts/providerSelection.js +1 -0
  589. package/dist/contracts/reconstructionReadinessExample.js +126 -119
  590. package/dist/contracts/reverseEngineeringToolContracts.js +52 -0
  591. package/dist/contracts/rizinDebugToolContracts.js +97 -0
  592. package/dist/contracts/rust/rustToolContracts.js +20 -0
  593. package/dist/contracts/sessionLifecycleInputs.js +34 -2
  594. package/dist/contracts/sessionToolContracts.js +4 -4
  595. package/dist/contracts/sessionToolSchemas.js +14 -0
  596. package/dist/contracts/signals/signalToolContracts.js +40 -0
  597. package/dist/contracts/sqlite/sqliteToolContracts.js +36 -0
  598. package/dist/contracts/toolContractExamples.js +29 -0
  599. package/dist/contracts/toolContractTypes.js +2 -0
  600. package/dist/contracts/toolContracts.js +26 -0
  601. package/dist/contracts/toolEffects.js +252 -9
  602. package/dist/contracts/toolOutputSchemaGroups.js +78 -32
  603. package/dist/contracts/toolOutputSchemaPrimitives.js +118 -10
  604. package/dist/contracts/toolSchemaMetadata.js +102 -16
  605. package/dist/contracts/unknownContractExamples.js +1 -1
  606. package/dist/contracts/wasm/wasmComparisonContracts.js +52 -0
  607. package/dist/contracts/wasm/wasmToolContracts.js +33 -0
  608. package/dist/contracts/webNetworkCaptureToolContracts.js +15 -4
  609. package/dist/cutter/CutterBridgeClient.js +760 -0
  610. package/dist/cutter/CutterBridgeService.js +187 -0
  611. package/dist/doctorRuntime.js +41 -8
  612. package/dist/domain/adb/adbDeviceAnalysis.js +45 -5
  613. package/dist/domain/analysisErrorBase.js +79 -2
  614. package/dist/domain/analysisErrorCleanup.js +4 -2
  615. package/dist/domain/analysisErrorCore.js +32 -0
  616. package/dist/domain/analysisErrorPresentation.js +80 -20
  617. package/dist/domain/analysisErrorProjection.js +72 -37
  618. package/dist/domain/analysisProfile.js +7 -3
  619. package/dist/domain/analysisSearch.js +26 -0
  620. package/dist/domain/analysisSnapshot.js +312 -185
  621. package/dist/domain/analysisView/WebNetworkApiSurfaceAccumulator.js +353 -0
  622. package/dist/domain/analysisView/analysisView.js +391 -44
  623. package/dist/domain/analysisView/analysisViewCoverage.js +32 -0
  624. package/dist/domain/analysisView/analysisViewDataAdmission.js +86 -0
  625. package/dist/domain/analysisView/analysisViewErrors.js +4 -0
  626. package/dist/domain/analysisView/analysisViewParent.js +12 -0
  627. package/dist/domain/analysisView/analysisViewText.js +29 -0
  628. package/dist/domain/analysisView/androidPackageView.js +102 -0
  629. package/dist/domain/analysisView/artifactInventoryView.js +126 -0
  630. package/dist/domain/analysisView/binaryLayoutView.js +11 -4
  631. package/dist/domain/analysisView/dartAotView.js +93 -0
  632. package/dist/domain/analysisView/evmInterfaceView.js +105 -0
  633. package/dist/domain/analysisView/interfaceBuilderView.js +182 -0
  634. package/dist/domain/analysisView/javascriptApplicationCoverage.js +27 -0
  635. package/dist/domain/analysisView/javascriptApplicationView.js +123 -49
  636. package/dist/domain/analysisView/javascriptFactsView.js +92 -0
  637. package/dist/domain/analysisView/javascriptModuleReferences.js +37 -0
  638. package/dist/domain/analysisView/machoView.js +186 -0
  639. package/dist/domain/analysisView/managedArtifactView.js +108 -0
  640. package/dist/domain/analysisView/managedMemberView.js +215 -0
  641. package/dist/domain/analysisView/nativeFunctionView.js +20 -25
  642. package/dist/domain/analysisView/pcapCaptureView.js +264 -0
  643. package/dist/domain/analysisView/qlogCaptureView.js +198 -0
  644. package/dist/domain/analysisView/wasmArtifactView.js +162 -0
  645. package/dist/domain/analysisView/webNetworkApiSurfaceView.js +123 -0
  646. package/dist/domain/analysisView/webNetworkCaptureView.js +388 -0
  647. package/dist/domain/android/androidAnalysis.js +36 -2
  648. package/dist/domain/android/androidApplication.js +37 -64
  649. package/dist/domain/apktool/apktoolResourceAnalysis.js +70 -8
  650. package/dist/domain/apple/appleApplication.js +70 -87
  651. package/dist/domain/apple/appleArchiveFormat.js +184 -0
  652. package/dist/domain/apple/appleAssetCatalog.js +15 -0
  653. package/dist/domain/apple/appleBundleAnatomy.js +57 -69
  654. package/dist/domain/apple/dyldPaths.js +9 -2
  655. package/dist/domain/apple/dylibResolution.js +24 -10
  656. package/dist/domain/apple/dylibResolutionFindings.js +8 -9
  657. package/dist/domain/apple/interfaceBuilderGraph.js +78 -33
  658. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +39 -12
  659. package/dist/domain/apple/jvmClassFile.js +226 -0
  660. package/dist/domain/apple/keyedArchive.js +39 -17
  661. package/dist/domain/apple/machoContainer.js +123 -8
  662. package/dist/domain/apple/machoCpuIdentity.js +4 -0
  663. package/dist/domain/apple/plistNumbers.js +67 -5
  664. package/dist/domain/apple/plistValue.js +95 -19
  665. package/dist/domain/artifactComparison.js +116 -37
  666. package/dist/domain/artifactDecompressionBudget.js +26 -0
  667. package/dist/domain/artifactGraph.js +18 -9
  668. package/dist/domain/artifactIdentity.js +4 -1
  669. package/dist/domain/artifactInspection.js +34 -3
  670. package/dist/domain/artifactInventoryEvidence.js +146 -40
  671. package/dist/domain/binaryTarget.js +251 -109
  672. package/dist/domain/binaryTargetTypes.js +24 -1
  673. package/dist/domain/browserNetworkEvidence.js +24 -3
  674. package/dist/domain/browserObservation.js +92 -56
  675. package/dist/domain/browserObservationError.js +4 -4
  676. package/dist/domain/browserObservationSchemas.js +4 -1
  677. package/dist/domain/browserScenarioCapture.js +11 -1
  678. package/dist/domain/browserScenarioCaptureLimits.js +34 -0
  679. package/dist/domain/browserScenarioCaptureValues.js +76 -2
  680. package/dist/domain/browserScenarioDiff.js +120 -11
  681. package/dist/domain/browserScenarioDiffEvidence.js +44 -13
  682. package/dist/domain/browserScenarioDiffValues.js +10 -3
  683. package/dist/domain/browserScenarioNetworkComparison.js +158 -0
  684. package/dist/domain/browserScenarioNormalization.js +10 -13
  685. package/dist/domain/browserScenarioValues.js +7 -13
  686. package/dist/domain/browserSession.js +2 -2
  687. package/dist/domain/bundleComparison.js +1 -5
  688. package/dist/domain/callPath.js +40 -3
  689. package/dist/domain/captures/packetCapture.js +139 -0
  690. package/dist/domain/captures/packetFields.js +81 -0
  691. package/dist/domain/changedBehavior.js +43 -41
  692. package/dist/domain/comparisonSourceEvidence.js +6 -0
  693. package/dist/domain/dosCom.js +2 -2
  694. package/dist/domain/dosMz.js +66 -19
  695. package/dist/domain/electron/electronFuseEvidence.js +42 -0
  696. package/dist/domain/electron/electronFuses.js +360 -0
  697. package/dist/domain/elfFixedHeader.js +66 -0
  698. package/dist/domain/evidence.js +105 -39
  699. package/dist/domain/evidenceBundle.js +67 -22
  700. package/dist/domain/evidenceErrors.js +5 -0
  701. package/dist/domain/evm/evmInterface.js +18 -4
  702. package/dist/domain/evm/solidityMetadata.js +70 -0
  703. package/dist/domain/explicitSensitiveFailure.js +44 -23
  704. package/dist/domain/fileSnapshotObservation.js +25 -0
  705. package/dist/domain/firmware/firmwareAnalysis.js +29 -0
  706. package/dist/domain/fixedTupleSchema.js +9 -0
  707. package/dist/domain/flutter/flutterBuildAnalysis.js +141 -0
  708. package/dist/domain/functionCallCoverage.js +60 -0
  709. package/dist/domain/functionComparisonDimensions.js +136 -18
  710. package/dist/domain/functionComparisonNormalization.js +83 -19
  711. package/dist/domain/functionComparisonResults.js +7 -6
  712. package/dist/domain/functionComparisonSchemas.js +14 -3
  713. package/dist/domain/functionDossierEvidence.js +4 -0
  714. package/dist/domain/go/goBinary.js +96 -0
  715. package/dist/domain/harmony/harmonyApplication.js +156 -0
  716. package/dist/domain/hopperErrors.js +19 -18
  717. package/dist/domain/hopperPublisher.js +12 -0
  718. package/dist/domain/hopperValues.js +135 -34
  719. package/dist/domain/javascript/electronActiveObservation.js +1 -0
  720. package/dist/domain/javascript/electronObservation.js +4 -1
  721. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +94 -33
  722. package/dist/domain/javascript/electronStaticAnalysisIpc.js +3 -1
  723. package/dist/domain/javascript/electronStaticAnalysisNative.js +19 -5
  724. package/dist/domain/javascript/electronStaticAnalysisValues.js +14 -28
  725. package/dist/domain/javascript/electronStaticOptionObjects.js +45 -0
  726. package/dist/domain/javascript/electronWrappedCallPaths.js +551 -0
  727. package/dist/domain/javascript/htmlArtifactReferences.js +94 -4
  728. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +37 -1
  729. package/dist/domain/javascript/javascriptApplicationAnalysis.js +7 -0
  730. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +10 -2
  731. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +1 -1
  732. package/dist/domain/javascript/javascriptApplicationGraph.js +17 -1
  733. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +1 -0
  734. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +8 -0
  735. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +3 -1
  736. package/dist/domain/javascript/javascriptApplicationVersionItems.js +49 -21
  737. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +31 -18
  738. package/dist/domain/javascript/javascriptArtifactFiles.js +2 -1
  739. package/dist/domain/javascript/javascriptAstFingerprint.js +89 -24
  740. package/dist/domain/javascript/javascriptAstValues.js +132 -5
  741. package/dist/domain/javascript/javascriptBootstrap.js +94 -0
  742. package/dist/domain/javascript/javascriptBootstrapIntegrity.js +372 -0
  743. package/dist/domain/javascript/javascriptBuiltinResourceMethods.js +8 -0
  744. package/dist/domain/javascript/javascriptBundledRequireOrigin.js +278 -0
  745. package/dist/domain/javascript/javascriptCommonJsExportReceivers.js +231 -0
  746. package/dist/domain/javascript/javascriptContextBridgeExposure.js +23 -0
  747. package/dist/domain/javascript/javascriptElectronMemberWrites.js +96 -22
  748. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +6 -5
  749. package/dist/domain/javascript/javascriptExportShapeVariants.js +1 -1
  750. package/dist/domain/javascript/javascriptFeatureSeed.js +34 -17
  751. package/dist/domain/javascript/javascriptFeatureTrace.js +9 -3
  752. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +42 -11
  753. package/dist/domain/javascript/javascriptGraphqlOperations.js +382 -0
  754. package/dist/domain/javascript/javascriptIntrinsicInvocation.js +132 -0
  755. package/dist/domain/javascript/javascriptModuleDeclaration.js +48 -0
  756. package/dist/domain/javascript/javascriptModuleInterop.js +618 -0
  757. package/dist/domain/javascript/javascriptModuleResolutionMode.js +18 -0
  758. package/dist/domain/javascript/javascriptModuleSpecifier.js +5 -0
  759. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -12
  760. package/dist/domain/javascript/javascriptPackageImportAliases.js +58 -0
  761. package/dist/domain/javascript/javascriptRecovery.js +12 -5
  762. package/dist/domain/javascript/javascriptRpcEndpoints.js +7 -93
  763. package/dist/domain/javascript/javascriptRuntimeLoadState.js +16 -0
  764. package/dist/domain/javascript/javascriptRuntimeObservation.js +4 -1
  765. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +45 -16
  766. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +65 -47
  767. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +0 -1
  768. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +5 -4
  769. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +113 -11
  770. package/dist/domain/javascript/javascriptSemanticAmbientWrites.js +511 -0
  771. package/dist/domain/javascript/javascriptSemanticAnalysis.js +706 -204
  772. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +54 -54
  773. package/dist/domain/javascript/javascriptSemanticCallResolution.js +59 -30
  774. package/dist/domain/javascript/javascriptSemanticCallableStack.js +52 -0
  775. package/dist/domain/javascript/javascriptSemanticCalls.js +10 -15
  776. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +163 -92
  777. package/dist/domain/javascript/javascriptSemanticCoverage.js +5 -1
  778. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +435 -45
  779. package/dist/domain/javascript/javascriptSemanticDataEffects.js +46 -29
  780. package/dist/domain/javascript/javascriptSemanticDependencies.js +69 -0
  781. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +1 -1
  782. package/dist/domain/javascript/javascriptSemanticEvaluationOrder.js +126 -0
  783. package/dist/domain/javascript/javascriptSemanticExpressionShapes.js +111 -0
  784. package/dist/domain/javascript/javascriptSemanticFingerprints.js +11 -14
  785. package/dist/domain/javascript/javascriptSemanticGetterQueries.js +147 -0
  786. package/dist/domain/javascript/javascriptSemanticGetterResults.js +264 -0
  787. package/dist/domain/javascript/javascriptSemanticGraph.js +22 -1
  788. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +13 -1
  789. package/dist/domain/javascript/javascriptSemanticIterationSources.js +5 -4
  790. package/dist/domain/javascript/javascriptSemanticMapOperations.js +51 -0
  791. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +421 -154
  792. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +500 -27
  793. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +377 -174
  794. package/dist/domain/javascript/javascriptSemanticObjects.js +53 -43
  795. package/dist/domain/javascript/javascriptSemanticOpaqueEffects.js +163 -0
  796. package/dist/domain/javascript/javascriptSemanticPrimitives.js +11 -1
  797. package/dist/domain/javascript/javascriptSemanticProjection.js +180 -95
  798. package/dist/domain/javascript/javascriptSemanticPromises.js +6 -9
  799. package/dist/domain/javascript/javascriptSemanticProvenance.js +5 -1
  800. package/dist/domain/javascript/javascriptSemanticQuery.js +7 -2
  801. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +2 -1
  802. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +1 -1
  803. package/dist/domain/javascript/javascriptSemanticReferenceSources.js +25 -0
  804. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +369 -8
  805. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +3 -19
  806. package/dist/domain/javascript/javascriptSemanticResources.js +33 -44
  807. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +81 -26
  808. package/dist/domain/javascript/javascriptSemanticReturns.js +37 -30
  809. package/dist/domain/javascript/javascriptSemanticState.js +225 -39
  810. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -4
  811. package/dist/domain/javascript/javascriptSemanticValues.js +379 -56
  812. package/dist/domain/javascript/javascriptSourceMapPaths.js +44 -17
  813. package/dist/domain/javascript/javascriptSourceParser.js +121 -7
  814. package/dist/domain/javascript/javascriptSourceSelection.js +11 -0
  815. package/dist/domain/javascript/javascriptStaticAnalysis.js +69 -24
  816. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +97 -23
  817. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +488 -48
  818. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +196 -78
  819. package/dist/domain/javascript/javascriptStaticAnalysisState.js +4 -0
  820. package/dist/domain/javascript/javascriptStaticAnalysisTypes.js +2 -1
  821. package/dist/domain/javascript/javascriptSymbolicBindings.js +1118 -0
  822. package/dist/domain/javascript/javascriptSymbolicControlFlow.js +44 -0
  823. package/dist/domain/javascript/javascriptSymbolicValues.js +45 -0
  824. package/dist/domain/javascript/sourceToBundleComparison.js +3 -1
  825. package/dist/domain/javascript/sourceToBundleComparisonSchemas.js +2 -0
  826. package/dist/domain/javascript/sourceToBundleSignals.js +50 -13
  827. package/dist/domain/jsonValue.js +37 -12
  828. package/dist/domain/localPath.js +6 -3
  829. package/dist/domain/managed/managedApplicationGraph.js +5 -0
  830. package/dist/domain/managed/managedApplicationGraphCoverage.js +6 -2
  831. package/dist/domain/managed/managedApplicationGraphNodes.js +14 -10
  832. package/dist/domain/managed/managedArtifact.js +77 -1
  833. package/dist/domain/managed/managedInspectionEvidence.js +5 -6
  834. package/dist/domain/managed/managedMemberComparison.js +6 -0
  835. package/dist/domain/managed/managedMemberComparisonCoverage.js +36 -3
  836. package/dist/domain/managed/managedMemberComparisonItems.js +135 -59
  837. package/dist/domain/managed/managedMemberComparisonMatch.js +237 -42
  838. package/dist/domain/managed/managedMemberSignatureIdentity.js +40 -0
  839. package/dist/domain/managed/managedNativeVerificationMatch.js +54 -31
  840. package/dist/domain/managed/managedNativeVerificationSchemas.js +15 -4
  841. package/dist/domain/managed/managedReconstruction.js +5 -8
  842. package/dist/domain/mobileApplicationGraphProjection.js +95 -0
  843. package/dist/domain/native/addressCoordinate.js +11 -0
  844. package/dist/domain/native/binaryLayout.js +2 -4
  845. package/dist/domain/native/bytePattern.js +121 -0
  846. package/dist/domain/native/nativeAotPe.js +31 -4
  847. package/dist/domain/native/nativeAotSnapshotObservation.js +18 -0
  848. package/dist/domain/native/nativeCallPartialObservation.js +14 -12
  849. package/dist/domain/native/nativeInspection.js +38 -4
  850. package/dist/domain/native/nativeInstruction.js +17 -2
  851. package/dist/domain/native/nativeInvestigationGraph.js +9 -5
  852. package/dist/domain/native/nativeLoadImage.js +32 -1
  853. package/dist/domain/native/nativeUiObservation.js +5 -6
  854. package/dist/domain/native/objcSwiftMetadata.js +19 -9
  855. package/dist/domain/native/peResources.js +14 -4
  856. package/dist/domain/native/recordedCrash.js +79 -10
  857. package/dist/domain/offsetDateTime.js +60 -0
  858. package/dist/domain/pcap/pcapAnalysis.js +91 -0
  859. package/dist/domain/pcap/pcapEvidence.js +15 -0
  860. package/dist/domain/peMachine.js +38 -0
  861. package/dist/domain/pngHeader.js +18 -0
  862. package/dist/domain/process/processCaptureCoverage.js +26 -3
  863. package/dist/domain/process/processCaptureExample.js +2 -0
  864. package/dist/domain/process/processCaptureValidation.js +33 -8
  865. package/dist/domain/process/processComparison.js +41 -13
  866. package/dist/domain/process/processScenario.js +7 -0
  867. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  868. package/dist/domain/process/processTraceEvaluation.js +119 -74
  869. package/dist/domain/process/processTraceSpecification.js +243 -89
  870. package/dist/domain/propertyListKeys.js +238 -23
  871. package/dist/domain/propertyListXml.js +149 -0
  872. package/dist/domain/propertyListXmlText.js +20 -4
  873. package/dist/domain/providerAdapterError.js +2 -5
  874. package/dist/domain/providerCleanupError.js +2 -4
  875. package/dist/domain/providerConfigurationRefusal.js +12 -0
  876. package/dist/domain/providerSelectionError.js +2 -1
  877. package/dist/domain/qlogCapture.js +62 -0
  878. package/dist/domain/rawBinary.js +105 -0
  879. package/dist/domain/reconstructionCoverage.js +40 -24
  880. package/dist/domain/reconstructionCoverageEvaluation.js +50 -47
  881. package/dist/domain/reconstructionCoverageEvidence.js +26 -0
  882. package/dist/domain/reconstructionCoverageVerifierResults.js +35 -0
  883. package/dist/domain/reconstructionObligationLedgerIntegrity.js +114 -0
  884. package/dist/domain/reconstructionObligationLedgerSchemas.js +104 -1
  885. package/dist/domain/reconstructionReadiness.js +4 -8
  886. package/dist/domain/reconstructionReadinessJourneyFindings.js +4 -1
  887. package/dist/domain/reconstructionUnknowns.js +9 -1
  888. package/dist/domain/reconstructionVerification.js +86 -43
  889. package/dist/domain/recordedTransportUrl.js +59 -0
  890. package/dist/domain/referenceSourceClassification.js +27 -23
  891. package/dist/domain/referenceSourceGraph.js +51 -13
  892. package/dist/domain/referenceSourceImportParsing.js +27 -13
  893. package/dist/domain/referenceSourcePathIdentity.js +13 -1
  894. package/dist/domain/referenceSourceRequireBindings.js +40 -108
  895. package/dist/domain/referenceSourceSummary.js +92 -0
  896. package/dist/domain/relationshipCoverage.js +43 -0
  897. package/dist/domain/residualUnknown.js +93 -26
  898. package/dist/domain/reverseEngineering.js +31 -0
  899. package/dist/domain/runtimeVersion.js +8 -0
  900. package/dist/domain/rust/rustBinary.js +200 -0
  901. package/dist/domain/signals/annotationTextWindow.js +31 -0
  902. package/dist/domain/signals/signalDecoders.js +69 -0
  903. package/dist/domain/signals/signalRecording.js +115 -0
  904. package/dist/domain/sourceMapContents.js +10 -3
  905. package/dist/domain/sourceMapEnvelope.js +17 -11
  906. package/dist/domain/sqlite/sqliteDatabase.js +189 -0
  907. package/dist/domain/staticRuntimeCorrelation.js +7 -9
  908. package/dist/domain/swiftSymbolClassification.js +17 -0
  909. package/dist/domain/symbolAnalysis.js +20 -7
  910. package/dist/domain/urlComponents.js +6 -0
  911. package/dist/domain/wasm/wasmArtifact.js +119 -0
  912. package/dist/domain/wasm/wasmInterface.js +89 -0
  913. package/dist/domain/webBundleAnalysis.js +14 -3
  914. package/dist/domain/webBundleAnalyzerAst.js +7 -2
  915. package/dist/domain/webBundleAnalyzerInspection.js +113 -57
  916. package/dist/domain/webBundleAnalyzerResult.js +18 -6
  917. package/dist/domain/webCaptureDiff.js +235 -51
  918. package/dist/domain/webCaptureFrameComparison.js +49 -0
  919. package/dist/domain/webInventory.js +28 -14
  920. package/dist/domain/webMcpDiscovery.js +5 -2
  921. package/dist/domain/webModuleImports.js +22 -27
  922. package/dist/domain/webModuleTrace.js +25 -8
  923. package/dist/domain/webNetworkCapture.js +101 -39
  924. package/dist/domain/webNetworkCaptureCoordinates.js +21 -0
  925. package/dist/domain/webRuntime.js +0 -1
  926. package/dist/domain/webScreenshot.js +2 -2
  927. package/dist/domain/webScriptArtifacts.js +2 -4
  928. package/dist/domain/webScriptExport.js +6 -8
  929. package/dist/domain/webScriptExportError.js +2 -3
  930. package/dist/domain/webScriptExportPlan.js +2 -2
  931. package/dist/domain/webSourceLocation.js +20 -9
  932. package/dist/domain/xmlDocument.js +41 -0
  933. package/dist/domain/zipPackageFormat.js +25 -3
  934. package/dist/dotnet/ManagedArtifactInspector.js +25 -12
  935. package/dist/dotnet/ManagedDecodeBudget.js +87 -9
  936. package/dist/dotnet/ManagedMemberInspector.js +127 -22
  937. package/dist/dotnet/ManagedMemberInspectorCore.js +408 -141
  938. package/dist/dotnet/ManagedMemberInstructionDecoder.js +109 -37
  939. package/dist/dotnet/ManagedMemberOwnership.js +65 -0
  940. package/dist/dotnet/ManagedMemberPointers.js +69 -0
  941. package/dist/dotnet/ManagedMemberRows.js +181 -48
  942. package/dist/dotnet/ManagedMetadataHeaps.js +110 -25
  943. package/dist/dotnet/ManagedMetadataInventory.js +5 -5
  944. package/dist/dotnet/ManagedMetadataInventoryRows.js +36 -52
  945. package/dist/dotnet/ManagedMetadataLayout.js +26 -16
  946. package/dist/dotnet/ManagedMetadataRowSizes.js +1 -1
  947. package/dist/dotnet/ManagedMethodBodyReader.js +29 -11
  948. package/dist/dotnet/ManagedMethodSpecs.js +78 -0
  949. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +20 -19
  950. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -21
  951. package/dist/dotnet/ManagedPeReader.js +60 -27
  952. package/dist/dotnet/ManagedReaderFailure.js +9 -0
  953. package/dist/dotnet/ManagedSnapshot.js +93 -0
  954. package/dist/dotnet/ManagedStaticProvider.js +55 -64
  955. package/dist/dotnet/ManagedTypeMemberLists.js +105 -0
  956. package/dist/dotnet/ManagedTypeNameDigests.js +177 -0
  957. package/dist/dotnet/ManagedTypeNames.js +58 -0
  958. package/dist/dotnet/ManagedTypeNesting.js +25 -0
  959. package/dist/dotnet/ManagedTypeReferences.js +94 -0
  960. package/dist/dotnet/ManagedUserStrings.js +75 -0
  961. package/dist/electron/ElectronFuseFailures.js +105 -0
  962. package/dist/electron/ElectronFusePath.js +248 -0
  963. package/dist/electron/ElectronFuseProvider.js +88 -0
  964. package/dist/electron/ElectronFuseReader.js +333 -0
  965. package/dist/evaluation/AgentEvaluationFixtures.js +194 -11
  966. package/dist/evaluation/CodexAgentEval.js +19 -40
  967. package/dist/evaluation/KnownAnswerEvaluation.js +126 -57
  968. package/dist/evm/EvmoleFailures.js +20 -14
  969. package/dist/evm/EvmoleInterfaceAdapter.js +5 -1
  970. package/dist/evm/EvmoleInterfaceProvider.js +142 -35
  971. package/dist/evm/EvmoleInterfaceWorker.js +2 -0
  972. package/dist/evm/SolidityMetadata.js +139 -0
  973. package/dist/filesystem/OwnedRegularFile.js +116 -0
  974. package/dist/filesystem/OwnedStagedOutput.js +155 -0
  975. package/dist/filesystem/RegularFile.js +65 -9
  976. package/dist/filesystem/StableFileHash.js +56 -38
  977. package/dist/filesystem/callerPath.js +26 -0
  978. package/dist/filesystem/readFileHandleChunks.js +72 -13
  979. package/dist/filesystem/readStableFileBytes.js +85 -0
  980. package/dist/firmware/FirmwareCommand.js +15 -9
  981. package/dist/firmware/FirmwareFailures.js +56 -0
  982. package/dist/firmware/FirmwareFiles.js +136 -110
  983. package/dist/firmware/FirmwareProvider.js +122 -65
  984. package/dist/firmware/FirmwarePublication.js +244 -12
  985. package/dist/firmware/FirmwareReports.js +202 -12
  986. package/dist/flutter/DartElf.js +445 -0
  987. package/dist/flutter/ElfBuildId.js +137 -0
  988. package/dist/flutter/ElfLoadMap.js +91 -0
  989. package/dist/flutter/FlutterBuildProvider.js +866 -0
  990. package/dist/flutter/FlutterPayloadScan.js +180 -0
  991. package/dist/frida/FridaInstrumentationManager.js +1104 -0
  992. package/dist/gdb/GdbSessionManager.js +1639 -0
  993. package/dist/generatedPackageMetadata.js +2 -2
  994. package/dist/ghidra/GhidraAnalysisProfile.js +146 -14
  995. package/dist/ghidra/GhidraAnalysisSeeds.js +39 -55
  996. package/dist/ghidra/GhidraBridgeSources.js +12 -0
  997. package/dist/ghidra/GhidraClient.js +501 -180
  998. package/dist/ghidra/GhidraClientStartup.js +5 -3
  999. package/dist/ghidra/GhidraClientWire.js +5 -2
  1000. package/dist/ghidra/GhidraDiagnostics.js +23 -5
  1001. package/dist/ghidra/GhidraDoctor.js +60 -26
  1002. package/dist/ghidra/GhidraDosSnapshot.js +83 -0
  1003. package/dist/ghidra/GhidraExecutableHeader.js +54 -0
  1004. package/dist/ghidra/GhidraFileArtifacts.js +93 -0
  1005. package/dist/ghidra/GhidraFunctionValues.js +50 -2
  1006. package/dist/ghidra/GhidraInstallation.js +305 -108
  1007. package/dist/ghidra/GhidraInstallationPolicy.js +94 -103
  1008. package/dist/ghidra/GhidraInstallationProperties.js +57 -0
  1009. package/dist/ghidra/GhidraInventoryValues.js +52 -6
  1010. package/dist/ghidra/GhidraJavaLaunch.js +99 -11
  1011. package/dist/ghidra/GhidraJavaProbe.js +267 -0
  1012. package/dist/ghidra/GhidraJavaProperties.js +119 -0
  1013. package/dist/ghidra/GhidraLanguageCatalog.js +83 -8
  1014. package/dist/ghidra/GhidraLauncher.js +325 -85
  1015. package/dist/ghidra/GhidraLoadImageAttest.js +82 -65
  1016. package/dist/ghidra/GhidraLoadImageValues.js +109 -27
  1017. package/dist/ghidra/GhidraMipsProfile.js +258 -14
  1018. package/dist/ghidra/GhidraNativeAotSnapshotOwner.js +221 -0
  1019. package/dist/ghidra/GhidraPeProfile.js +91 -0
  1020. package/dist/ghidra/GhidraPowerPcProfile.js +51 -0
  1021. package/dist/ghidra/GhidraProvider.js +267 -42
  1022. package/dist/ghidra/GhidraProviderCapabilities.js +29 -15
  1023. package/dist/ghidra/GhidraProviderClient.js +439 -276
  1024. package/dist/ghidra/GhidraPspExtension.js +210 -0
  1025. package/dist/ghidra/GhidraPspProfile.js +62 -0
  1026. package/dist/ghidra/GhidraRawBinaryLanguage.js +49 -0
  1027. package/dist/ghidra/GhidraReleasePolicy.js +93 -0
  1028. package/dist/ghidra/GhidraRequestQueue.js +64 -40
  1029. package/dist/ghidra/GhidraRiscvProfile.js +100 -0
  1030. package/dist/ghidra/GhidraSessionError.js +301 -24
  1031. package/dist/ghidra/GhidraSessionValues.js +76 -0
  1032. package/dist/ghidra/GhidraSocketConnection.js +25 -11
  1033. package/dist/ghidra/GhidraTargetSnapshot.js +67 -50
  1034. package/dist/ghidra/GhidraTransport.js +86 -62
  1035. package/dist/ghidra/extensions/GhidraExtensions.js +30 -45
  1036. package/dist/go/GoBinaryContainer.js +140 -0
  1037. package/dist/go/GoBinaryImage.js +210 -0
  1038. package/dist/go/GoBinaryProvider.js +180 -0
  1039. package/dist/go/GoElfImage.js +211 -0
  1040. package/dist/go/GoMachoImage.js +164 -0
  1041. package/dist/go/GoModuleText.js +217 -0
  1042. package/dist/go/GoPeImage.js +124 -0
  1043. package/dist/hopper/BridgeLauncher.js +78 -6
  1044. package/dist/hopper/HopperAnalysisProfile.js +23 -11
  1045. package/dist/hopper/HopperCleanup.js +29 -4
  1046. package/dist/hopper/HopperClient.js +317 -93
  1047. package/dist/hopper/HopperMacPublisher.js +29 -0
  1048. package/dist/hopper/HopperMachOImage.js +61 -29
  1049. package/dist/hopper/HopperProcessDiagnostic.js +27 -0
  1050. package/dist/hopper/HopperProvider.js +57 -29
  1051. package/dist/hopper/HopperProviderCapabilities.js +9 -4
  1052. package/dist/hopper/HopperRegexSearch.js +21 -60
  1053. package/dist/hopper/HopperRequestQueue.js +17 -5
  1054. package/dist/hopper/HopperSessionValues.js +10 -1
  1055. package/dist/ida/IdaBusyHealth.js +78 -0
  1056. package/dist/ida/IdaCallGraph.js +134 -0
  1057. package/dist/ida/IdaConfiguration.js +7 -2
  1058. package/dist/ida/IdaDiagnosticRedactor.js +199 -0
  1059. package/dist/ida/IdaDiagnosticWriter.js +62 -0
  1060. package/dist/ida/IdaDoctor.js +7 -5
  1061. package/dist/ida/IdaJsonDiagnostic.js +138 -0
  1062. package/dist/ida/IdaMcpConnection.js +308 -32
  1063. package/dist/ida/IdaNativeProtocol.js +85 -0
  1064. package/dist/ida/IdaOperationRunner.js +246 -61
  1065. package/dist/ida/IdaProtocolValues.js +88 -5
  1066. package/dist/ida/IdaProvider.js +45 -10
  1067. package/dist/ida/IdaProviderCapabilities.js +37 -8
  1068. package/dist/ida/IdaSessionClient.js +379 -60
  1069. package/dist/ida/IdaWorkspace.js +54 -6
  1070. package/dist/inspector/V8InspectorCaptureProjection.js +14 -2
  1071. package/dist/inspector/V8InspectorEndpoint.js +15 -13
  1072. package/dist/inspector/V8InspectorProvider.js +43 -7
  1073. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +44 -12
  1074. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +107 -32
  1075. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +7 -4
  1076. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +85 -10
  1077. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +16 -6
  1078. package/dist/javascript/recovery/RecoveryFiles.js +107 -13
  1079. package/dist/javascript/recovery/WakaruExecution.js +19 -11
  1080. package/dist/javascript/recovery/WakaruProvider.js +12 -9
  1081. package/dist/javascript/recovery/WakaruPublication.js +24 -10
  1082. package/dist/javascript/recovery/WakaruRelease.js +1 -1
  1083. package/dist/javascript/recovery/WakaruReport.js +3 -2
  1084. package/dist/javascript/sourceMaps/DecodedSourceMap.js +2 -16
  1085. package/dist/javascript/sourceMaps/SourceMapCommand.js +22 -4
  1086. package/dist/javascript/sourceMaps/SourceMapDecoder.js +22 -4
  1087. package/dist/javascript/sourceMaps/SourceMapFormat.js +25 -38
  1088. package/dist/javascript/sourceMaps/TraceSourceMap.js +34 -6
  1089. package/dist/jeb/JebMcpConnection.js +148 -82
  1090. package/dist/jeb/JebMcpConnectionOwner.js +116 -0
  1091. package/dist/jeb/JebMcpDeadline.js +46 -0
  1092. package/dist/jeb/JebMcpEndpoint.js +6 -1
  1093. package/dist/jeb/JebProvider.js +82 -58
  1094. package/dist/kuna/KunaAddress.js +11 -0
  1095. package/dist/kuna/KunaCommand.js +217 -0
  1096. package/dist/kuna/KunaConfiguration.js +90 -0
  1097. package/dist/kuna/KunaDoctor.js +198 -0
  1098. package/dist/kuna/KunaInstallation.js +137 -0
  1099. package/dist/kuna/KunaJson.js +23 -0
  1100. package/dist/kuna/KunaJsonStream.js +433 -0
  1101. package/dist/kuna/KunaLimits.js +5 -0
  1102. package/dist/kuna/KunaProjectCache.js +804 -0
  1103. package/dist/kuna/KunaProjectExport.js +202 -0
  1104. package/dist/kuna/KunaProjectFiles.js +191 -0
  1105. package/dist/kuna/KunaProjectReader.js +115 -0
  1106. package/dist/kuna/KunaProvider.js +217 -0
  1107. package/dist/kuna/KunaProviderCapabilities.js +102 -0
  1108. package/dist/kuna/KunaQueryErrors.js +12 -0
  1109. package/dist/kuna/KunaQueryWork.js +113 -0
  1110. package/dist/kuna/KunaReferenceFiles.js +258 -0
  1111. package/dist/kuna/KunaReferenceQueries.js +211 -0
  1112. package/dist/kuna/KunaRelease.js +10 -0
  1113. package/dist/kuna/KunaRunSlots.js +56 -0
  1114. package/dist/kuna/KunaSessionClient.js +1162 -0
  1115. package/dist/kuna/KunaStringInventory.js +145 -0
  1116. package/dist/kuna/KunaStringQueries.js +133 -0
  1117. package/dist/kuna/KunaTargetCommands.js +205 -0
  1118. package/dist/kuna/KunaUnavailable.js +11 -0
  1119. package/dist/logger.js +14 -1
  1120. package/dist/main/processShutdown.js +17 -0
  1121. package/dist/main/shutdown.js +3 -0
  1122. package/dist/main/transport.js +68 -4
  1123. package/dist/main.js +16 -15
  1124. package/dist/mcp/AnalysisProvider-BABWbLoM.js +38 -0
  1125. package/dist/mcp/AnalysisSnapshotFiles-BXz0c37-.js +1423 -0
  1126. package/dist/mcp/ArtifactFileOperation-64cQKI7B.js +1704 -0
  1127. package/dist/mcp/ArtifactProvider-Dx6pmil1.js +2200 -0
  1128. package/dist/mcp/ArtifactProviderMetadata-UCJr2oZW.js +167 -0
  1129. package/dist/mcp/ArtifactReader-BrnwNaKY.js +78 -0
  1130. package/dist/mcp/ArtifactResourceScope-zi3Dkqzy.js +175 -0
  1131. package/dist/mcp/AsarHeader-B_IbppTz.js +31 -0
  1132. package/dist/mcp/BinarySessionStatus-CZ9nnXMt.js +213 -0
  1133. package/dist/mcp/BinaryTargetResolver-BUncASDP.js +1358 -0
  1134. package/dist/mcp/BoundedFileBytes-DYt5q9G2.js +43 -0
  1135. package/dist/mcp/CdpCaptureDocuments-Y2uFcBpl.js +795 -0
  1136. package/dist/mcp/CdpCaptureValues-tNIg-gQK.js +97 -0
  1137. package/dist/mcp/CdpEndpoint-BrhMhpSi.js +641 -0
  1138. package/dist/mcp/CdpOptionalCommand-PZZhlqxv.js +120 -0
  1139. package/dist/mcp/CdpTargetSession-BmmDC3XO.js +290 -0
  1140. package/dist/mcp/DirectAnalysis-B9KuCHTG.js +417 -0
  1141. package/dist/mcp/DirectAnalysisStatus-BgzopkIt.js +44 -0
  1142. package/dist/mcp/ElectronFileScope-FXtK0d6I.js +110 -0
  1143. package/dist/mcp/ElectronFuseFailures-uZ_wOV6T.js +610 -0
  1144. package/dist/mcp/MachoLoadCommandReader-C2VGgHA3.js +330 -0
  1145. package/dist/mcp/ManagedStaticProvider-CZuoPme2.js +5326 -0
  1146. package/dist/mcp/NativeMacOSProvider-CMguKrvN.js +5495 -0
  1147. package/dist/mcp/NativeMacOSProviderMetadata-B_RH4KXF.js +397 -0
  1148. package/dist/mcp/OwnedCommand-BW1jBSt9.js +1241 -0
  1149. package/dist/mcp/ProcedureAddressResolution-H6Qwpb_Y.js +59 -0
  1150. package/dist/mcp/WorkflowEvidence-CO4C7ALz.js +118 -0
  1151. package/dist/mcp/analysisErrorCleanup-Q344SnTO.js +34 -0
  1152. package/dist/mcp/analysisErrorCore-BIEP7tvF.js +509 -0
  1153. package/dist/mcp/analysisErrorProjection-B8teQwwD.js +942 -0
  1154. package/dist/mcp/artifactToolContracts-C9dRDo-D.js +74 -0
  1155. package/dist/mcp/browserObservation-DUraZs62.js +4633 -0
  1156. package/dist/mcp/browserObservationError-C5okJ5el.js +63 -0
  1157. package/dist/mcp/browserObservationSchemas-DwGGxBpu.js +573 -0
  1158. package/dist/mcp/browserScenario-BRUz7yN0.js +3415 -0
  1159. package/dist/mcp/browserScenarioCapture-CiMAsMx8.js +595 -0
  1160. package/dist/mcp/callerPath-CpPnMZyN.js +678 -0
  1161. package/dist/mcp/canonicalDigest-Bi_0_zGi.js +71 -0
  1162. package/dist/mcp/electronActiveObservation-DV0Ffy9X.js +227 -0
  1163. package/dist/mcp/electronFuses-D5SS7XXw.js +367 -0
  1164. package/dist/mcp/electronObservation-DsN-NqY1.js +621 -0
  1165. package/dist/mcp/electronObservation-wOYWwqgF.js +112 -0
  1166. package/dist/mcp/electronScenario-CYrt2zBK.js +913 -0
  1167. package/dist/mcp/emptyArraySchema-C0o2Sxwp.js +140 -0
  1168. package/dist/mcp/enhancedInputs-6CCgB3VB.js +56 -0
  1169. package/dist/mcp/javascriptRuntimeObservation-BVbhkO2-.js +693 -0
  1170. package/dist/mcp/javascriptRuntimeObservation-Cu0Yedqq.js +121 -0
  1171. package/dist/mcp/jsonSerialization-V-wWiFRE.js +152 -0
  1172. package/dist/mcp/lipo-DSTgUqL1.js +395 -0
  1173. package/dist/mcp/localPath-AxvW9aPe.js +19 -0
  1174. package/dist/mcp/logger-BGdGHadX.js +48 -0
  1175. package/dist/mcp/machoContainer-CMSxUBlK.js +605 -0
  1176. package/dist/mcp/main-Cx-Z7m_n.js +80276 -0
  1177. package/dist/mcp/main.js +6 -0
  1178. package/dist/mcp/managedToolContracts-CSlbKJP-.js +101 -0
  1179. package/dist/mcp/nativeValueTrace-BEZbDieM.js +3601 -0
  1180. package/dist/mcp/officialToolContracts-CauCcSsc.js +1432 -0
  1181. package/dist/mcp/peMachine-aP1iYnHq.js +95 -0
  1182. package/dist/mcp/pngHeader-DQ-ObyY2.js +147 -0
  1183. package/dist/mcp/propertyListKeys-BfCo0k4w.js +356 -0
  1184. package/dist/mcp/providerCleanupError-DIRHxzWo.js +125 -0
  1185. package/dist/mcp/providerIdentities--ptAh481.js +31 -0
  1186. package/dist/mcp/providerIdentity-BCQ5n5tw.js +16 -0
  1187. package/dist/mcp/providerOperationHealth-9DRSGM8N.js +71 -0
  1188. package/dist/mcp/rolldown-runtime-BjeaiXFo.js +121 -0
  1189. package/dist/mcp/safeJson-NeGfpkrI.js +25 -0
  1190. package/dist/mcp/scanCanonical-CF3ATd1V.js +3788 -0
  1191. package/dist/mcp/serverIdentity-BK0Ejd_Y.js +1507 -0
  1192. package/dist/mcp/sourceMapEnvelope-DAaRUIGj.js +94 -0
  1193. package/dist/mcp/toolContracts-BPoHQdlC.js +12414 -0
  1194. package/dist/mcp/toolOutputSchemaGroups-MJ_f-PMK.js +17730 -0
  1195. package/dist/mcp/webContentArtifact-DfGkgDcI.js +269 -0
  1196. package/dist/mcp/webRuntime-ccyhkRru.js +74 -0
  1197. package/dist/mcp/webSourceLocation-DKIum0vJ.js +13167 -0
  1198. package/dist/mcpDoctor.js +95 -70
  1199. package/dist/mcpStartupPolicy.js +20 -2
  1200. package/dist/native/AppleDispatchCoverage.js +57 -17
  1201. package/dist/native/AppleDispatchMetadata.js +82 -29
  1202. package/dist/native/AppleMachoFixups.js +208 -35
  1203. package/dist/native/AppleMachoSelection.js +30 -23
  1204. package/dist/native/AppleObjcCategories.js +13 -3
  1205. package/dist/native/AppleObjcDispatchFacets.js +95 -17
  1206. package/dist/native/AppleObjcProperties.js +61 -17
  1207. package/dist/native/AppleObjcProtocols.js +25 -7
  1208. package/dist/native/AppleSwiftVtables.js +2 -0
  1209. package/dist/native/CommandRunner.js +146 -32
  1210. package/dist/native/LldbCallTracer.js +235 -179
  1211. package/dist/native/LldbReadbackFiles.js +70 -0
  1212. package/dist/native/LldbRetainedObservations.js +28 -56
  1213. package/dist/native/MachoArchitectureSelection.js +50 -0
  1214. package/dist/native/NativeCallObservation.js +55 -53
  1215. package/dist/native/NativeCallTarget.js +95 -0
  1216. package/dist/native/NativeMacOSProvider.js +318 -188
  1217. package/dist/native/NativeMachoInspection.js +155 -81
  1218. package/dist/native/NativePlistSource.js +179 -0
  1219. package/dist/native/NativeUiCleanupError.js +30 -0
  1220. package/dist/native/NativeUiHelperRuntime.js +48 -35
  1221. package/dist/native/NativeUiObservation.js +69 -47
  1222. package/dist/native/SignatureTargetBinding.js +147 -65
  1223. package/dist/native/parsers/codesign.js +27 -10
  1224. package/dist/native/parsers/demangle.js +22 -12
  1225. package/dist/native/parsers/dyldInfo.js +73 -4
  1226. package/dist/native/parsers/lipo.js +53 -19
  1227. package/dist/native/parsers/machoUuid.js +150 -0
  1228. package/dist/native/parsers/otool.js +275 -32
  1229. package/dist/native/parsers/plist.js +40 -25
  1230. package/dist/native/pe/PeResourceLayout.js +22 -7
  1231. package/dist/native/pe/PeResourceParser.js +10 -9
  1232. package/dist/native/pe/PeResourcesProvider.js +76 -15
  1233. package/dist/native/pwndbg/CoreFileMappingAuthority.js +51 -0
  1234. package/dist/native/pwndbg/PwndbgCoreContext.js +39 -28
  1235. package/dist/native/pwntools/PwntoolsDecoder.js +339 -52
  1236. package/dist/native/pwntools/PwntoolsFailures.js +19 -4
  1237. package/dist/native/pwntools/PwntoolsInputLimit.js +27 -0
  1238. package/dist/native/pwntools/PwntoolsRecordedCrashProvider.js +38 -16
  1239. package/dist/native/pwntools/PwntoolsResourceLimits.js +3 -3
  1240. package/dist/native/pwntools/RecordedCrashSourceBindings.js +12 -8
  1241. package/dist/native/pwntools/RecordedCrashStructureBindings.js +3 -1
  1242. package/dist/objdump/ObjdumpCommand.js +24 -0
  1243. package/dist/pcap/PcapCommand.js +146 -0
  1244. package/dist/pcap/PcapConfiguration.js +93 -0
  1245. package/dist/pcap/PcapNativeBound.js +58 -0
  1246. package/dist/pcap/PcapOutput.js +276 -0
  1247. package/dist/pcap/PcapProvider.js +454 -0
  1248. package/dist/pcap/PcapSnapshot.js +191 -0
  1249. package/dist/process/ArtifactAnalysisResources.js +306 -0
  1250. package/dist/process/BoundedFileBytes.js +8 -3
  1251. package/dist/process/CurrentEntrypointPath.js +8 -0
  1252. package/dist/process/DarwinProcessRunTokenReader.js +276 -61
  1253. package/dist/process/DetachedPgpSignature.js +57 -0
  1254. package/dist/process/ExecFileBoundedOutput.js +44 -0
  1255. package/dist/process/ExecFileOutput.js +44 -17
  1256. package/dist/{hopper/HopperTargetLease.js → process/HopperLease.js} +76 -19
  1257. package/dist/process/JavaScriptWorkerMemoryLimit.js +25 -0
  1258. package/dist/process/LinuxResourceLimits.js +60 -0
  1259. package/dist/process/MacCodeSignature.js +3 -0
  1260. package/dist/process/OwnedCommand.js +144 -25
  1261. package/dist/process/PrivateRuntimeRoot.js +9 -19
  1262. package/dist/process/PrivateRuntimeRootUnavailableError.js +10 -0
  1263. package/dist/process/ProcessOwnership.js +70 -17
  1264. package/dist/process/ProcessOwnershipObservation.js +35 -4
  1265. package/dist/process/ProviderDeadline.js +58 -12
  1266. package/dist/process/ProviderProcess.js +233 -17
  1267. package/dist/process/RegexMatcher.js +96 -0
  1268. package/dist/process/SharedStartupAttempt.js +59 -0
  1269. package/dist/process/WindowsAuthority.js +48 -39
  1270. package/dist/process/WindowsBatchCommand.js +46 -0
  1271. package/dist/process/boundedUtf8Text.js +13 -0
  1272. package/dist/process/capture/FilesystemSnapshot.js +63 -11
  1273. package/dist/process/capture/ProcessCaptureClock.js +2 -0
  1274. package/dist/process/capture/ProcessCaptureError.js +64 -7
  1275. package/dist/process/capture/ProcessCaptureJournal.js +2 -1
  1276. package/dist/process/capture/ProcessCaptureLifecycle.js +104 -56
  1277. package/dist/process/capture/ProcessCaptureProgress.js +7 -4
  1278. package/dist/process/capture/ProcessHarness.js +34 -17
  1279. package/dist/process/capture/ProcessNormalization.js +278 -36
  1280. package/dist/process/capture/ProcessSampling.js +3 -2
  1281. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +13 -13
  1282. package/dist/process/capture/TerminalRenderer.js +31 -10
  1283. package/dist/process/ownedDebuggerSession.js +203 -0
  1284. package/dist/process/snapshotEnvironment.js +8 -8
  1285. package/dist/{application/binary → providers}/AnalysisClientCleanup.js +3 -3
  1286. package/dist/providers/AnalysisClientCreation.js +193 -0
  1287. package/dist/providers/AnalysisClientFailure.js +191 -0
  1288. package/dist/providers/DeferredAnalysisClient.js +48 -0
  1289. package/dist/providers/OwnedCommandCleanup.js +65 -0
  1290. package/dist/providers/ProviderInspectionScope.js +10 -0
  1291. package/dist/recordedCatalogDigests.js +2 -0
  1292. package/dist/reference/ReferenceSourceReader.js +64 -1
  1293. package/dist/reference/ReferenceSourceReaderEntries.js +79 -56
  1294. package/dist/reference/ReferenceSourceReaderErrors.js +5 -1
  1295. package/dist/reference/ReferenceSourceReaderFile.js +2 -2
  1296. package/dist/reference/ReferenceSourceReaderTypes.js +1 -2
  1297. package/dist/reference/ReferenceSourceReaderValidate.js +0 -1
  1298. package/dist/rizin/RizinCommand.js +14 -0
  1299. package/dist/rizin/RizinDebugSessionManager.js +1111 -0
  1300. package/dist/rust/RustAuditableReader.js +309 -0
  1301. package/dist/rust/RustBinaryImage.js +116 -0
  1302. package/dist/rust/RustBinaryProvider.js +194 -0
  1303. package/dist/server/EvidenceMcpServer.js +160 -37
  1304. package/dist/server/admittedToolOperation.js +7 -2
  1305. package/dist/server/contractToolHandler.js +17 -4
  1306. package/dist/server/createServer.js +179 -30
  1307. package/dist/server/externalMutationAdmission.js +50 -0
  1308. package/dist/server/mcpProgress.js +4 -2
  1309. package/dist/server/promptCompletion.js +43 -28
  1310. package/dist/server/providerEnvironment.js +3 -0
  1311. package/dist/server/registerAnalysisViewTool.js +6 -2
  1312. package/dist/server/registerAndroidTools.js +22 -4
  1313. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +8 -1
  1314. package/dist/server/registerArtifactComparisonTool.js +13 -2
  1315. package/dist/server/registerArtifactTools.js +21 -1
  1316. package/dist/server/registerBrowserScenarioTool.js +7 -5
  1317. package/dist/server/registerBrowserTools.js +4 -8
  1318. package/dist/server/registerBundleComparisonTool.js +4 -4
  1319. package/dist/server/registerCaptureTools.js +12 -0
  1320. package/dist/server/registerCutterTools.js +32 -0
  1321. package/dist/server/registerElectronTools.js +13 -21
  1322. package/dist/server/registerEnhancedTools.js +7 -6
  1323. package/dist/server/registerEvidenceTools.js +14 -10
  1324. package/dist/server/registerEvmTools.js +22 -4
  1325. package/dist/server/registerFlutterTools.js +17 -0
  1326. package/dist/server/registerFridaTools.js +201 -0
  1327. package/dist/server/registerFunctionComparisonTool.js +29 -9
  1328. package/dist/server/registerGdbTools.js +64 -0
  1329. package/dist/server/registerGoTools.js +9 -0
  1330. package/dist/server/registerInvestigationTools/helpers.js +2 -2
  1331. package/dist/server/registerInvestigationTools.js +31 -27
  1332. package/dist/server/registerJavaScriptRuntimeObservationTools.js +3 -9
  1333. package/dist/server/registerManagedTools.js +11 -1
  1334. package/dist/server/registerManagedWorkflowTools/evidence.js +14 -7
  1335. package/dist/server/registerNativeTools.js +14 -0
  1336. package/dist/server/registerOfficialTools.js +5 -0
  1337. package/dist/server/registerPcapTools.js +35 -0
  1338. package/dist/server/registerProcessComparisonTool.js +12 -2
  1339. package/dist/server/registerReverseEngineeringTools.js +86 -0
  1340. package/dist/server/registerRizinDebugTools.js +53 -0
  1341. package/dist/server/registerRustTools.js +9 -0
  1342. package/dist/server/registerSessionRecordTools.js +19 -13
  1343. package/dist/server/registerSessionStatusTool.js +33 -8
  1344. package/dist/server/registerSessionTools.js +31 -31
  1345. package/dist/server/registerSignalTools.js +12 -0
  1346. package/dist/server/registerSqliteTools.js +9 -0
  1347. package/dist/server/registerWasmTools.js +46 -0
  1348. package/dist/server/registerWebNetworkCaptureTool.js +24 -10
  1349. package/dist/server/retainedSummaryDelivery.js +28 -0
  1350. package/dist/server/runDerivedOperation.js +2 -0
  1351. package/dist/server/sessionAvailabilityPolicy.js +3 -0
  1352. package/dist/server/toolRegistrationOptions.js +8 -0
  1353. package/dist/server/toolResult.js +52 -19
  1354. package/dist/server/toolResultEncoding.js +36 -3
  1355. package/dist/serverIdentity.js +17 -8
  1356. package/dist/signals/SigrokRecordingProvider.js +346 -0
  1357. package/dist/signals/parseDecoderDiscovery.js +65 -0
  1358. package/dist/sqlite/SqliteDatabaseFailures.js +147 -0
  1359. package/dist/sqlite/SqliteDatabaseInspection.js +436 -0
  1360. package/dist/sqlite/SqliteDatabaseLimits.js +16 -0
  1361. package/dist/sqlite/SqliteDatabaseProvider.js +295 -0
  1362. package/dist/sqlite/SqliteDatabaseSnapshot.js +182 -0
  1363. package/dist/sqlite/SqliteDatabaseWorker.js +46 -0
  1364. package/dist/sqlite/SqliteDatabaseWorkerExecution.js +127 -0
  1365. package/dist/wasm/WabtArtifactProvider.js +358 -0
  1366. package/dist/wasm/WabtFailures.js +119 -0
  1367. package/dist/wasm/WabtInterface.js +309 -0
  1368. package/dist/wasm/WabtOutput.js +60 -0
  1369. package/dist/wasm/WabtRelease.js +12 -0
  1370. package/dist/wasm/WabtRuntime.js +58 -0
  1371. package/dist/wasm/WabtString.js +48 -0
  1372. package/dist/wasm/WabtWat.js +147 -0
  1373. package/dist/wasm/WasmGlueAdapter.js +66 -0
  1374. package/dist/wasm/WasmInterfaceBudget.js +11 -0
  1375. package/dist/windows/WindowsNativeLoader.js +53 -9
  1376. package/dist/windows/WindowsOwnedProcess.js +150 -17
  1377. package/dist/windows/WindowsPrivateRuntime.js +66 -2
  1378. package/install.sh +157 -98
  1379. package/licenses/Apache-2.0.txt +202 -0
  1380. package/licenses/GCC-Runtime-Library-Exception-3.1.txt +73 -0
  1381. package/licenses/GPL-3.0.txt +674 -0
  1382. package/licenses/LGPL-2.0.txt +480 -0
  1383. package/licenses/MIT-template.txt +18 -0
  1384. package/licenses/MinGW-w64-runtime.txt +240 -0
  1385. package/licenses/Node-22.19.0-LICENSE.txt +2666 -0
  1386. package/licenses/README.md +68 -0
  1387. package/licenses/cfworker-MIT.txt +21 -0
  1388. package/licenses/dotnet-runtime-MIT.txt +23 -0
  1389. package/licenses/frida-17.23.2-COPYING.txt +50 -0
  1390. package/licenses/ghidra-12.1.4-DISCLAIMER.txt +13 -0
  1391. package/licenses/ghidra-12.1.4-LICENSE.txt +201 -0
  1392. package/licenses/ghidra-12.1.4-NOTICE.txt +49 -0
  1393. package/licenses/npm-dependencies.txt +3757 -0
  1394. package/licenses/npm-runtime-notices.txt +8722 -0
  1395. package/licenses/upstream-sources.json +72 -0
  1396. package/licenses/xterm-MIT.txt +21 -0
  1397. package/native/windows/README.md +130 -12
  1398. package/native/windows/build/manifest.json +2 -2
  1399. package/native/windows/build/rea-windows-x64.node +0 -0
  1400. package/package.json +97 -22
  1401. package/scripts/electron-active-hook-boundaries.cjs +15 -2
  1402. package/scripts/electron-active-hook.cjs +412 -47
  1403. package/scripts/hopper-demo-x11.py +65 -13
  1404. package/scripts/prepack.mjs +5 -0
  1405. package/scripts/rea-android-workspace-guardian.mjs +46 -0
  1406. package/scripts/rea.mjs +89 -26
  1407. package/scripts/verify-windows-native-artifact.mjs +2 -2
  1408. package/skills/reverse-engineer-anything/SKILL.md +146 -11
  1409. package/skills/reverse-engineer-anything/references/android-applications.md +3 -1
  1410. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +10 -10
  1411. package/skills/reverse-engineer-anything/references/evidence-workflows.md +23 -0
  1412. package/skills/reverse-engineer-anything/references/javascript-applications.md +72 -3
  1413. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +149 -19
  1414. package/skills/reverse-engineer-anything/references/runtime-observation.md +57 -7
  1415. package/third_party/README.md +1 -1
  1416. package/third_party/wabt/README.md +24 -0
  1417. package/dist/browser/history/HarCaptureAdapter.js +0 -20
  1418. package/dist/cli/streamedJsonOutput.js +0 -135
  1419. package/dist/hopper/HopperRegexWorker.js +0 -27
  1420. /package/dist/{application/binary → process}/AbortablePromise.js +0 -0
@@ -0,0 +1,3414 @@
1
+ import { __esmMin } from "./rolldown-runtime-DXoylpqc.js";
2
+ import { DEFAULT_BROWSER_SCENARIO_CAPTURE_LIMITS, PLAYWRIGHT_RESPONSE_BODY_PROVENANCE_LIMITATION, browserObservationEndpointSchema, browserScenarioCaptureSchema, browserScenarioEventSchema, browserScenarioStepSchema, browserStepArtifactsSchema, classifyBrowserScenarioCompleteness, err, init_browserNetworkEvidence, init_browserObservation, init_browserScenarioCapture, init_browserScenarioCaptureLimits, init_browserScenarioCaptureValues, init_result, isLiteralLoopbackHostname, ok, sanitizeBrowserUrl } from "./reconstructionObligationLedgerSchemas-Bi6sect1.js";
3
+ import { AnalysisCancelledError, AnalysisError, AnalysisTimeoutError, init_analysisErrorBase, init_analysisErrorCore } from "./errorSchemas-Ixz_q7qt.js";
4
+ import { AnalysisCleanupLease, AnalysisCleanupLeaseGroup, init_AnalysisCleanupLease } from "./AnalysisCleanupLease-CWfTGYKd.js";
5
+ import { BrowserObservationError, ProviderAdapterError, init_browserObservationError, init_providerAdapterError } from "./cliResultOutput-10sd6xGx.js";
6
+ import { analysisErrorWithCleanupFailure, init_analysisErrorCleanup } from "./analysisErrorCleanup-COdAmDsb.js";
7
+ import { ProviderCleanupError, init_providerCleanupError } from "./providerCleanupError-BhsJyAhk.js";
8
+ import { CdpConnection, attachCdpTargetSession, init_CdpConnection, init_CdpEndpoint, init_CdpTargetSession, openCdpEndpoint, withCdpDiscoveryDeadline } from "./CdpTargetSession-CQ08KHbh.js";
9
+ import { PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY, init_providerIdentities } from "./providerIdentities-Ao1XTvwx.js";
10
+ import { z } from "zod";
11
+ import { join, resolve } from "node:path";
12
+ import { createHash, randomUUID } from "node:crypto";
13
+ import { tmpdir } from "node:os";
14
+ import { chmod, mkdtemp, rm } from "node:fs/promises";
15
+
16
+ //#region dist/browser/PlaywrightExecutionBoundary.js
17
+ var OPERATION$5, PLAYWRIGHT_CLEANUP_CONFIRMATION_TIMEOUT_MS, withPlaywrightExecutionBoundary;
18
+ function init_PlaywrightExecutionBoundary() {
19
+ return (init_PlaywrightExecutionBoundary = __esmMin((() => {
20
+ init_analysisErrorCore();
21
+ OPERATION$5 = "capture_browser_scenario";
22
+ PLAYWRIGHT_CLEANUP_CONFIRMATION_TIMEOUT_MS = 3e4;
23
+ withPlaywrightExecutionBoundary = (work, timeoutMs, signal) => {
24
+ if (timeoutMs !== undefined && timeoutMs <= 0) return Promise.reject(new AnalysisTimeoutError(OPERATION$5, timeoutMs));
25
+ if (signal?.aborted === true) return Promise.reject(new AnalysisCancelledError(OPERATION$5, { cause: signal.reason }));
26
+ return new Promise((resolve, reject) => {
27
+ let settled = false;
28
+ let timer;
29
+ const deadline = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
30
+ const scheduleTimeout = () => {
31
+ if (deadline === undefined) return;
32
+ const remaining = deadline - performance.now();
33
+ if (remaining <= 0) {
34
+ fail(new AnalysisTimeoutError(OPERATION$5, timeoutMs ?? 0));
35
+ return;
36
+ }
37
+ timer = setTimeout(scheduleTimeout, Math.min(remaining, 2147483647));
38
+ timer.unref();
39
+ };
40
+ const cleanup = () => {
41
+ if (timer !== undefined) clearTimeout(timer);
42
+ signal?.removeEventListener("abort", onAbort);
43
+ };
44
+ const succeed = (value) => {
45
+ if (settled) return;
46
+ settled = true;
47
+ cleanup();
48
+ resolve(value);
49
+ };
50
+ const fail = (error) => {
51
+ if (settled) return;
52
+ settled = true;
53
+ cleanup();
54
+ reject(error);
55
+ };
56
+ const onAbort = () => {
57
+ fail(new AnalysisCancelledError(OPERATION$5, { cause: signal?.reason }));
58
+ };
59
+ scheduleTimeout();
60
+ signal?.addEventListener("abort", onAbort, { once: true });
61
+ if (signal?.aborted === true) {
62
+ onAbort();
63
+ return;
64
+ }
65
+ void work().then(succeed, fail);
66
+ });
67
+ };
68
+ })))();
69
+ }
70
+
71
+ //#endregion
72
+ //#region dist/browser/BrowserScenarioPartialObservation.js
73
+ var OPERATION$4, browserScenarioLimitations, browserScenarioCaptureData, browserScenarioCleanupObservation, browserScenarioOperationFailure;
74
+ function init_BrowserScenarioPartialObservation() {
75
+ return (init_BrowserScenarioPartialObservation = __esmMin((() => {
76
+ init_browserNetworkEvidence();
77
+ init_analysisErrorBase();
78
+ init_analysisErrorCleanup();
79
+ init_providerCleanupError();
80
+ init_providerAdapterError();
81
+ init_providerIdentities();
82
+ OPERATION$4 = "capture_browser_scenario";
83
+ browserScenarioLimitations = (session, scenario, events) => {
84
+ const capturedResponseBody = scenario.capture.network.response_body && events.some((event) => event.kind === "network-content" && event.phase === "response" && event.body.state === "captured" && (event.body.representation === "playwright-response-body-bytes" || event.body.representation === "browser-decoded-response-bytes"));
85
+ return [
86
+ "Event sequence records provider receipt order; simultaneous browser causality is not inferred.",
87
+ "Network content is retained only when selected; Playwright response-body bytes are API results and are not guaranteed to match wire bytes.",
88
+ "Request bytes are limited to what Playwright exposes; not_exposed does not establish body absence or multipart file coverage.",
89
+ "Network content reads settle within 5 seconds each and the observer does not request bodies from unfinished responses.",
90
+ ...capturedResponseBody ? [PLAYWRIGHT_RESPONSE_BODY_PROVENANCE_LIMITATION] : [],
91
+ "Playwright scenario events do not expose request initiator stacks; receipt order does not prove causality.",
92
+ "Storage values are hashed only after declared-secret redaction.",
93
+ ...scenario.storage.local_storage.length === 0 && scenario.storage.session_storage.length === 0 ? [] : ["Non-cookie storage seeds use CDP pre-script instrumentation; only pauses in the scenario's private seed script are resumed by this observer."],
94
+ ...session.eventLimitations?.() ?? [],
95
+ ...session.mode === "connect" ? [
96
+ "CDP attachment cannot recover pre-attach events or guarantee launch-time context options.",
97
+ `Attached locale ${scenario.environment.locale} applies to Intl formatting only; navigator.language(s) and Accept-Language remain caller-controlled. Use launch mode for matching page and request languages.`,
98
+ "Detaching a CDP page session may clear caller-owned navigator.platform emulation. REA cannot snapshot the caller's complete user-agent/client-hint state before attachment; use launch mode to avoid mutating that external browser."
99
+ ] : []
100
+ ];
101
+ };
102
+ browserScenarioCaptureData = (input) => {
103
+ const events = input.session.events();
104
+ return {
105
+ browser: {
106
+ mode: input.session.mode,
107
+ process_ownership: input.session.processOwnership,
108
+ cleanup: input.cleanup,
109
+ product: input.session.product,
110
+ version: input.session.version
111
+ },
112
+ scenario: {
113
+ start_origin: new URL(input.scenario.start_url.url).origin,
114
+ action_count: input.scenario.actions.length,
115
+ secret_references: input.scenario.secrets.map(({ secret_id: id }) => id).sort(),
116
+ network_content: input.scenario.capture.network,
117
+ event_families: [...new Set(input.scenario.capture.events)].sort(),
118
+ limits: input.scenario.capture.limits
119
+ },
120
+ duration_ms: Math.max(0, Math.round(performance.now() - input.startedAt)),
121
+ steps: [...input.steps],
122
+ events,
123
+ limitations: [...browserScenarioLimitations(input.session, input.scenario, events.items), ...input.limitations ?? []]
124
+ };
125
+ };
126
+ browserScenarioCleanupObservation = (cause) => cause instanceof AnalysisError && cause.cleanup !== undefined ? cause.cleanup : {
127
+ reason: cause instanceof Error ? cause.message : String(cause),
128
+ resources: cause instanceof AnalysisError && cause.cleanupResources.length > 0 ? cause.cleanupResources : ["browser_transport"]
129
+ };
130
+ browserScenarioOperationFailure = (cause, partialObservation, cleanupFailure) => {
131
+ const primary = cause instanceof AnalysisError ? cause : new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, OPERATION$4, { cause });
132
+ primary.retainPartialObservation(partialObservation);
133
+ if (cleanupFailure === undefined) return primary;
134
+ const observation = browserScenarioCleanupObservation(cleanupFailure.cause);
135
+ const cleanup = cleanupFailure.cause instanceof AnalysisError && cleanupFailure.cause.cleanupIncomplete ? cleanupFailure.cause : new ProviderCleanupError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, observation.resources, { reason: observation.reason }, {
136
+ operation: "close_browser_scenario",
137
+ cause: cleanupFailure.cause
138
+ });
139
+ return analysisErrorWithCleanupFailure(primary, cleanup, OPERATION$4).bindCleanupDependencies([primary, cleanup]);
140
+ };
141
+ })))();
142
+ }
143
+
144
+ //#endregion
145
+ //#region dist/browser/PlaywrightBrowserScenarioProvider.js
146
+ var OPERATION$3, signalIsAborted, SNAPSHOT_KINDS, requestedForStep, unavailableArtifacts, stepCompleteness, createStep, initialStep, executeStep, globalCompleteness, runScenario, PlaywrightBrowserScenarioProvider;
147
+ function init_PlaywrightBrowserScenarioProvider() {
148
+ return (init_PlaywrightBrowserScenarioProvider = __esmMin((() => {
149
+ init_PlaywrightExecutionBoundary();
150
+ init_analysisErrorCleanup();
151
+ init_AnalysisCleanupLease();
152
+ init_providerCleanupError();
153
+ init_browserScenarioCapture();
154
+ init_browserScenarioCaptureValues();
155
+ init_analysisErrorBase();
156
+ init_analysisErrorCore();
157
+ init_browserObservationError();
158
+ init_providerAdapterError();
159
+ init_result();
160
+ init_BrowserScenarioPartialObservation();
161
+ init_providerIdentities();
162
+ OPERATION$3 = "capture_browser_scenario";
163
+ signalIsAborted = (signal) => signal?.aborted === true;
164
+ SNAPSHOT_KINDS = [
165
+ "screenshot",
166
+ "dom",
167
+ "accessibility",
168
+ "url",
169
+ "history",
170
+ "storage"
171
+ ];
172
+ requestedForStep = (scenario, stepIndex) => new Set([...scenario.capture.after_each_step, ...stepIndex === scenario.actions.length ? scenario.capture.at_end : []]);
173
+ unavailableArtifacts = (requested, reason) => {
174
+ const state = (kind) => requested.has(kind) ? {
175
+ state: "missing",
176
+ reason
177
+ } : { state: "not_requested" };
178
+ return browserStepArtifactsSchema.parse({
179
+ screenshot: state("screenshot"),
180
+ dom: state("dom"),
181
+ accessibility: state("accessibility"),
182
+ url: state("url"),
183
+ history: state("history"),
184
+ storage: state("storage")
185
+ });
186
+ };
187
+ stepCompleteness = (artifacts, status) => {
188
+ const missing = SNAPSHOT_KINDS.filter((section) => artifacts[section].state === "missing");
189
+ const truncated = SNAPSHOT_KINDS.filter((section) => artifacts[section].state === "truncated");
190
+ if (status !== "completed") missing.push("action");
191
+ return classifyBrowserScenarioCompleteness(missing, truncated);
192
+ };
193
+ createStep = (input) => browserScenarioStepSchema.parse({
194
+ step_index: input.stepIndex,
195
+ step_id: input.stepId,
196
+ action: input.action,
197
+ status: input.status,
198
+ elapsed_ms: input.elapsedMs,
199
+ before_url: input.beforeUrl,
200
+ after_url: input.afterUrl,
201
+ error: input.error,
202
+ event_sequence_start: input.eventStart,
203
+ event_sequence_end: input.eventEnd,
204
+ artifacts: input.artifacts,
205
+ completeness: stepCompleteness(input.artifacts, input.status)
206
+ });
207
+ initialStep = async (input) => {
208
+ const { session, scenario, elapsedMs, signal } = input;
209
+ const artifacts = await session.capture(requestedForStep(scenario, 0), signal);
210
+ return createStep({
211
+ stepIndex: 0,
212
+ stepId: "scenario_start",
213
+ action: "goto_start",
214
+ status: "completed",
215
+ elapsedMs,
216
+ beforeUrl: session.sanitizeUrl(session.initialUrl),
217
+ afterUrl: session.sanitizeUrl(session.currentUrl()),
218
+ error: null,
219
+ eventStart: 1,
220
+ eventEnd: session.lastEventSequence(),
221
+ artifacts
222
+ });
223
+ };
224
+ executeStep = async (input) => {
225
+ const { session, scenario, action, stepIndex, priorFailure, signal } = input;
226
+ const beforeUrl = session.sanitizeUrl(session.currentUrl());
227
+ const eventStart = session.nextEventSequence();
228
+ const requested = requestedForStep(scenario, stepIndex);
229
+ if (priorFailure) return createStep({
230
+ stepIndex,
231
+ stepId: action.step_id,
232
+ action: action.action,
233
+ status: "cancelled",
234
+ elapsedMs: 0,
235
+ beforeUrl,
236
+ afterUrl: beforeUrl,
237
+ error: "not executed after an earlier action failure",
238
+ eventStart,
239
+ eventEnd: session.lastEventSequence(),
240
+ artifacts: unavailableArtifacts(requested, "action was not executed after an earlier failure")
241
+ });
242
+ const actionStartedAt = performance.now();
243
+ session.setStep(stepIndex);
244
+ const requestCancelled = () => signal?.aborted === true;
245
+ let outcome = {
246
+ status: "completed",
247
+ error: null
248
+ };
249
+ if (requestCancelled()) {
250
+ outcome = {
251
+ status: "cancelled",
252
+ error: "scenario request cancelled"
253
+ };
254
+ } else {
255
+ try {
256
+ await session.perform(action, signal);
257
+ } catch (cause) {
258
+ outcome = {
259
+ status: requestCancelled() ? "cancelled" : "failed",
260
+ error: session.redactError(cause)
261
+ };
262
+ }
263
+ }
264
+ const artifacts = outcome.status === "cancelled" ? unavailableArtifacts(requested, "scenario request cancelled") : await session.capture(requested, signal);
265
+ return createStep({
266
+ stepIndex,
267
+ stepId: action.step_id,
268
+ action: action.action,
269
+ ...outcome,
270
+ elapsedMs: Math.max(0, Math.round(performance.now() - actionStartedAt)),
271
+ beforeUrl,
272
+ afterUrl: session.sanitizeUrl(session.currentUrl()),
273
+ eventStart,
274
+ eventEnd: session.lastEventSequence(),
275
+ artifacts
276
+ });
277
+ };
278
+ globalCompleteness = (scenario, session, steps) => {
279
+ const missing = steps.flatMap(({ completeness }) => completeness.missing_sections);
280
+ const truncated = steps.flatMap(({ completeness }) => completeness.truncated_sections);
281
+ if (session.mode === "connect") missing.push("events");
282
+ if ((session.eventLimitations?.().length ?? 0) > 0) missing.push("events");
283
+ return classifyBrowserScenarioCompleteness(missing, truncated);
284
+ };
285
+ runScenario = async (openSession, scenario, options, retainCleanup) => {
286
+ if (options.signal?.aborted) throw new BrowserObservationError(OPERATION$3, "cancelled", { cause: options.signal.reason });
287
+ const startedAt = performance.now();
288
+ const session = await openSession(scenario, {
289
+ ...options.signal === undefined ? {} : { signal: options.signal },
290
+ retainCleanup
291
+ });
292
+ const steps = [];
293
+ let operationOutcome = { ok: true };
294
+ try {
295
+ steps.push(await initialStep({
296
+ session,
297
+ scenario,
298
+ elapsedMs: Math.max(0, Math.round(performance.now() - startedAt)),
299
+ signal: options.signal
300
+ }));
301
+ let failed = false;
302
+ for (const [offset, action] of scenario.actions.entries()) {
303
+ const step = await executeStep({
304
+ session,
305
+ scenario,
306
+ action,
307
+ stepIndex: offset + 1,
308
+ priorFailure: failed,
309
+ signal: options.signal
310
+ });
311
+ steps.push(step);
312
+ failed ||= step.status !== "completed";
313
+ }
314
+ } catch (cause) {
315
+ operationOutcome = {
316
+ ok: false,
317
+ cause
318
+ };
319
+ }
320
+ let cleanupOutcome;
321
+ try {
322
+ cleanupOutcome = {
323
+ ok: true,
324
+ cleanup: await session.close()
325
+ };
326
+ } catch (cause) {
327
+ const cleanup = browserScenarioCleanupObservation(cause);
328
+ const failure = new BrowserObservationError(OPERATION$3, "cleanup_failed", {
329
+ cause,
330
+ cleanup
331
+ });
332
+ retainCleanup(session.cleanupLease);
333
+ new AnalysisCleanupLeaseGroup(failure, [session.cleanupLease]);
334
+ cleanupOutcome = {
335
+ ok: false,
336
+ cause: failure
337
+ };
338
+ }
339
+ if (!cleanupOutcome.ok) {
340
+ if (operationOutcome.ok && options.signal?.aborted) operationOutcome = {
341
+ ok: false,
342
+ cause: new AnalysisCancelledError(OPERATION$3, { cause: options.signal.reason })
343
+ };
344
+ const cleanup = browserScenarioCleanupObservation(cleanupOutcome.cause);
345
+ const partialObservation = {
346
+ kind: "browser-scenario-observation",
347
+ capture: browserScenarioCaptureData({
348
+ session,
349
+ scenario,
350
+ startedAt,
351
+ steps,
352
+ cleanup: "incomplete",
353
+ limitations: ["Scenario observations are partial because browser cleanup could not be confirmed."]
354
+ })
355
+ };
356
+ if (!operationOutcome.ok) throw browserScenarioOperationFailure(operationOutcome.cause, partialObservation, { cause: cleanupOutcome.cause });
357
+ const failure = new BrowserObservationError(OPERATION$3, "cleanup_failed", {
358
+ cause: cleanupOutcome.cause,
359
+ cleanup,
360
+ partialObservation,
361
+ detail: `Browser scenario cleanup could not be confirmed: ${cleanup.reason}. Collected steps and events are retained in partial_observation. Review the reported resources before retrying.`
362
+ });
363
+ if (cleanupOutcome.cause instanceof AnalysisError && cleanupOutcome.cause.cleanupIncomplete) failure.bindCleanupDependencies([cleanupOutcome.cause]);
364
+ throw failure;
365
+ }
366
+ if (!operationOutcome.ok) throw browserScenarioOperationFailure(operationOutcome.cause, {
367
+ kind: "browser-scenario-observation",
368
+ capture: browserScenarioCaptureData({
369
+ session,
370
+ scenario,
371
+ startedAt,
372
+ steps,
373
+ cleanup: cleanupOutcome.cleanup,
374
+ limitations: ["Scenario capture ended after an operation failed; uncollected steps are not represented."]
375
+ })
376
+ });
377
+ const completeness = globalCompleteness(scenario, session, steps);
378
+ const capture = browserScenarioCaptureSchema.parse({
379
+ ...browserScenarioCaptureData({
380
+ session,
381
+ scenario,
382
+ startedAt,
383
+ steps,
384
+ cleanup: cleanupOutcome.cleanup
385
+ }),
386
+ completeness
387
+ });
388
+ if (signalIsAborted(options.signal)) throw new AnalysisCancelledError(OPERATION$3, {
389
+ cause: options.signal?.reason,
390
+ partialObservation: {
391
+ kind: "browser-scenario-observation",
392
+ capture: {
393
+ ...capture,
394
+ limitations: [...capture.limitations, "Scenario capture was cancelled; collected steps, observations, and cleanup state are retained."]
395
+ }
396
+ }
397
+ });
398
+ return capture;
399
+ };
400
+ PlaywrightBrowserScenarioProvider = class {
401
+ openSession;
402
+ #tail = Promise.resolve();
403
+ #closing = false;
404
+ #closePromise;
405
+ #pendingCleanup = new Set();
406
+ constructor(openSession) {
407
+ this.openSession = openSession;
408
+ }
409
+ identity() {
410
+ return PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY;
411
+ }
412
+ captureScenario(scenario, options = {}) {
413
+ if (this.#closing) return Promise.resolve(err(this.#closedError()));
414
+ const operation = this.#tail.then(() => this.#closing ? err(this.#closedError()) : this.#captureScenario(scenario, options));
415
+ this.#tail = operation.then(() => undefined, () => undefined);
416
+ return operation;
417
+ }
418
+ async #captureScenario(scenario, options) {
419
+ const pending = await this.#retryCleanup();
420
+ if (pending !== undefined) return err(pending);
421
+ const retained = [];
422
+ try {
423
+ return ok(await runScenario(this.openSession, scenario, options, (lease) => {
424
+ this.#pendingCleanup.add(lease);
425
+ retained.push(lease);
426
+ }));
427
+ } catch (cause) {
428
+ const primary = cause instanceof AnalysisError ? cause : new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, OPERATION$3, { cause });
429
+ if (retained.length === 0) return err(primary);
430
+ const cleanup = new ProviderCleanupError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, retained.flatMap((lease) => lease.cleanupResources ?? []), { reason: "Browser scenario cleanup capabilities remain retained." }, {
431
+ operation: OPERATION$3,
432
+ cause
433
+ });
434
+ new AnalysisCleanupLeaseGroup(cleanup, retained);
435
+ return err(analysisErrorWithCleanupFailure(primary, cleanup, OPERATION$3).bindCleanupDependencies([primary, cleanup]));
436
+ }
437
+ }
438
+ async close() {
439
+ this.#closing = true;
440
+ this.#closePromise ??= this.#tail.then(async () => {
441
+ const failure = await this.#retryCleanup();
442
+ if (failure !== undefined) throw failure;
443
+ }).catch((cause) => {
444
+ this.#closePromise = undefined;
445
+ throw cause;
446
+ });
447
+ return this.#closePromise;
448
+ }
449
+ #closedError() {
450
+ return new BrowserObservationError(OPERATION$3, "cleanup_failed", {
451
+ detail: "Browser scenario provider is closing.",
452
+ cleanup: {
453
+ reason: "Provider is closing",
454
+ resources: []
455
+ }
456
+ });
457
+ }
458
+ async #retryCleanup() {
459
+ const failures = [];
460
+ for (const pending of this.#pendingCleanup) {
461
+ try {
462
+ await withPlaywrightExecutionBoundary(() => pending.release(), PLAYWRIGHT_CLEANUP_CONFIRMATION_TIMEOUT_MS);
463
+ this.#pendingCleanup.delete(pending);
464
+ } catch (cause) {
465
+ const failure = new ProviderCleanupError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, pending.cleanupResources ?? [], { reason: cause instanceof Error ? cause.message : String(cause) }, {
466
+ operation: OPERATION$3,
467
+ cause
468
+ });
469
+ new AnalysisCleanupLeaseGroup(failure, [pending]);
470
+ failures.push(failure);
471
+ }
472
+ }
473
+ if (failures.length === 0) return undefined;
474
+ if (failures.length === 1) return failures[0];
475
+ return new ProviderCleanupError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, failures.flatMap((failure) => failure.cleanupResources), { reason: "One or more browser scenario resources remain owned." }, {
476
+ operation: OPERATION$3,
477
+ cause: new AggregateError(failures, "Browser scenario cleanup failed")
478
+ }).bindCleanupDependencies(failures);
479
+ }
480
+ };
481
+ })))();
482
+ }
483
+
484
+ //#endregion
485
+ //#region dist/browser/BrowserScenarioSecrets.js
486
+ var REDACTION_PREFIX, encodedSecretValues, normalizePercentEscapes, secretPatterns, declaredPatterns, secretReplacements, normalizePercentEscapesBytes, isHexByte, lowercaseHexByte, patternMatches, containsSecretPattern, containsSecretBytePattern, redactionMarker, replaceSecretLiterals, secretNeedles, BrowserScenarioSecrets;
487
+ function init_BrowserScenarioSecrets() {
488
+ return (init_BrowserScenarioSecrets = __esmMin((() => {
489
+ init_browserObservation();
490
+ REDACTION_PREFIX = "[REDACTED:";
491
+ encodedSecretValues = (secret) => new Set([encodeURIComponent(secret), new URLSearchParams([["value", secret]]).toString().slice("value=".length)]);
492
+ normalizePercentEscapes = (value) => {
493
+ if (!value.includes("%")) return value;
494
+ return value.replace(/%[0-9a-f]{2}/giu, (escape) => escape.toLowerCase());
495
+ };
496
+ secretPatterns = (secret, spellings) => {
497
+ if (secret === "") return [];
498
+ const patterns = [{
499
+ text: secret,
500
+ searchText: secret,
501
+ percentInsensitive: false
502
+ }, ...[...encodedSecretValues(secret)].map((text) => ({
503
+ text,
504
+ searchText: normalizePercentEscapes(text),
505
+ percentInsensitive: true
506
+ }))];
507
+ if (spellings === "text") patterns.push({
508
+ text: JSON.stringify(secret).slice(1, -1),
509
+ searchText: JSON.stringify(secret).slice(1, -1),
510
+ percentInsensitive: false
511
+ });
512
+ const seen = new Set();
513
+ return patterns.filter(({ text, percentInsensitive }) => {
514
+ if (text === "") return false;
515
+ const key = `${percentInsensitive ? "percent" : "literal"}:${text}`;
516
+ if (seen.has(key)) return false;
517
+ seen.add(key);
518
+ return true;
519
+ });
520
+ };
521
+ declaredPatterns = (values, spellings) => {
522
+ const seen = new Set();
523
+ return [...values.values()].flatMap((secret) => secretPatterns(secret, spellings)).filter(({ text, percentInsensitive }) => {
524
+ const key = `${percentInsensitive ? "percent" : "literal"}:${text}`;
525
+ if (seen.has(key)) return false;
526
+ seen.add(key);
527
+ return true;
528
+ });
529
+ };
530
+ secretReplacements = (values, spellings) => [...values].flatMap(([id, secret]) => secretPatterns(secret, spellings).map((pattern) => ({
531
+ id,
532
+ ...pattern
533
+ }))).sort((left, right) => right.text.length - left.text.length || (left.id < right.id ? -1 : left.id > right.id ? 1 : 0));
534
+ normalizePercentEscapesBytes = (value) => {
535
+ if (value.indexOf(37) < 0) return value;
536
+ const normalized = Buffer.from(value);
537
+ for (let index = 0; index + 2 < normalized.length; index += 1) if (normalized[index] === 37 && isHexByte(normalized[index + 1]) && isHexByte(normalized[index + 2])) {
538
+ normalized[index + 1] = lowercaseHexByte(normalized[index + 1]);
539
+ normalized[index + 2] = lowercaseHexByte(normalized[index + 2]);
540
+ index += 2;
541
+ }
542
+ return normalized;
543
+ };
544
+ isHexByte = (value) => value !== undefined && (value >= 48 && value <= 57 || value >= 65 && value <= 70 || value >= 97 && value <= 102);
545
+ lowercaseHexByte = (value) => value >= 65 && value <= 70 ? value + 32 : value;
546
+ patternMatches = (value, normalizedValue, pattern) => (pattern.percentInsensitive ? normalizedValue : value).includes(pattern.searchText);
547
+ containsSecretPattern = (value, normalizedValue, patterns) => {
548
+ if (patterns.length === 0) return false;
549
+ return patterns.some((pattern) => patternMatches(value, normalizedValue, pattern));
550
+ };
551
+ containsSecretBytePattern = (value, normalizedValue, needles) => needles.some((needle) => (needle.percentInsensitive ? normalizedValue : value).includes(needle.needle));
552
+ redactionMarker = (id, patterns) => {
553
+ const candidates = [
554
+ `${REDACTION_PREFIX}${id}]`,
555
+ "[REDACTED]",
556
+ "…",
557
+ ""
558
+ ];
559
+ return candidates.find((candidate) => patterns.every((pattern) => !patternMatches(candidate, normalizePercentEscapes(candidate), pattern))) ?? "";
560
+ };
561
+ replaceSecretLiterals = (value, replacements, patterns) => {
562
+ const normalizedValue = replacements.some(({ percentInsensitive }) => percentInsensitive) ? normalizePercentEscapes(value) : value;
563
+ const parts = [];
564
+ let offset = 0;
565
+ while (offset < value.length) {
566
+ let next;
567
+ for (const replacement of replacements) {
568
+ const search = replacement.searchText;
569
+ const view = replacement.percentInsensitive ? normalizedValue : value;
570
+ const index = view.indexOf(search, offset);
571
+ if (index >= 0 && (next === undefined || index < next.index || index === next.index && replacement.text.length > next.text.length)) next = {
572
+ ...replacement,
573
+ index
574
+ };
575
+ }
576
+ if (next === undefined) break;
577
+ const marker = redactionMarker(next.id, patterns);
578
+ parts.push(value.slice(offset, next.index), marker);
579
+ offset = next.index + next.text.length;
580
+ }
581
+ if (parts.length === 0) return value;
582
+ parts.push(value.slice(offset));
583
+ return parts.join("");
584
+ };
585
+ secretNeedles = (replacements, patterns) => replacements.map((pattern) => ({
586
+ id: pattern.id,
587
+ needle: Buffer.from(pattern.searchText),
588
+ percentInsensitive: pattern.percentInsensitive,
589
+ marker: Buffer.from(redactionMarker(pattern.id, patterns))
590
+ }));
591
+ BrowserScenarioSecrets = class BrowserScenarioSecrets {
592
+ values;
593
+ urlPatterns;
594
+ textPatterns;
595
+ urlReplacements;
596
+ textReplacements;
597
+ textNeedles;
598
+ redactionCostPerCharacter;
599
+ constructor(values) {
600
+ this.values = values;
601
+ this.urlPatterns = declaredPatterns(values, "url");
602
+ this.textPatterns = declaredPatterns(values, "text");
603
+ this.urlReplacements = secretReplacements(values, "url");
604
+ this.textReplacements = secretReplacements(values, "text");
605
+ this.textNeedles = secretNeedles(this.textReplacements, this.textPatterns);
606
+ this.redactionCostPerCharacter = 8;
607
+ for (const [replacements, patterns] of [[this.textReplacements, this.textPatterns], [this.urlReplacements, this.urlPatterns]]) for (const replacement of replacements) this.redactionCostPerCharacter = Math.max(this.redactionCostPerCharacter, 8 + (Buffer.byteLength(redactionMarker(replacement.id, patterns)) * 8 + 128) / replacement.text.length);
608
+ }
609
+ static resolve(scenario, environment) {
610
+ const values = new Map();
611
+ for (const declaration of scenario.secrets) {
612
+ const value = environment[declaration.environment_variable];
613
+ if (!Object.hasOwn(environment, declaration.environment_variable) || typeof value !== "string") return undefined;
614
+ values.set(declaration.secret_id, value);
615
+ }
616
+ return new BrowserScenarioSecrets(values);
617
+ }
618
+ value(source) {
619
+ if (source.source === "literal") return source.value;
620
+ const value = this.values.get(source.secret_id);
621
+ if (value === undefined) throw new Error("Validated browser secret was not resolved");
622
+ return value;
623
+ }
624
+ url(destination) {
625
+ const url = new URL(destination.url);
626
+ for (const { name, value } of destination.query) url.searchParams.append(name, this.value(value));
627
+ return url.href;
628
+ }
629
+ /** Conservative preflight for output expansion and per-match part arrays.
630
+ * Callers measuring untrusted observations must reserve this cost before
631
+ * invoking redaction. A one-byte secret can otherwise expand every byte.
632
+ */
633
+ redactionAllocationCost(length) {
634
+ return Math.ceil(length * this.redactionCostPerCharacter);
635
+ }
636
+ redact(value) {
637
+ const patterns = this.textPatterns;
638
+ if (patterns.length === 0) return value;
639
+ const output = replaceSecretLiterals(value, this.textReplacements, patterns);
640
+ return containsSecretPattern(output, normalizePercentEscapes(output), patterns) ? "" : output;
641
+ }
642
+ /** Replace declared UTF-8, URI/form, and JSON-escaped secret spellings. */
643
+ redactBytes(value) {
644
+ const patterns = this.textPatterns;
645
+ if (patterns.length === 0) return value;
646
+ const candidates = this.textNeedles;
647
+ const hasPercentPatterns = candidates.some(({ percentInsensitive }) => percentInsensitive);
648
+ const normalizedValue = hasPercentPatterns && value.indexOf(37) >= 0 ? normalizePercentEscapesBytes(value) : value;
649
+ const sortedCandidates = candidates.map((candidate) => ({
650
+ ...candidate,
651
+ index: (candidate.percentInsensitive ? normalizedValue : value).indexOf(candidate.needle)
652
+ })).sort((left, right) => right.needle.length - left.needle.length || (left.id < right.id ? -1 : left.id > right.id ? 1 : 0));
653
+ const parts = [];
654
+ let offset = 0;
655
+ while (true) {
656
+ let next;
657
+ for (const candidate of sortedCandidates) {
658
+ if (candidate.index >= 0 && candidate.index < offset) candidate.index = (candidate.percentInsensitive ? normalizedValue : value).indexOf(candidate.needle, offset);
659
+ if (candidate.index >= 0 && (next === undefined || candidate.index < next.index || candidate.index === next.index && candidate.needle.length > next.needle.length)) next = candidate;
660
+ }
661
+ if (next === undefined) break;
662
+ parts.push(value.subarray(offset, next.index), next.marker);
663
+ offset = next.index + next.needle.length;
664
+ }
665
+ if (parts.length === 0) return value;
666
+ parts.push(value.subarray(offset));
667
+ const redacted = Buffer.concat(parts);
668
+ const normalizedRedacted = hasPercentPatterns && redacted.indexOf(37) >= 0 ? normalizePercentEscapesBytes(redacted) : redacted;
669
+ return containsSecretBytePattern(redacted, normalizedRedacted, candidates) ? Buffer.alloc(0) : redacted;
670
+ }
671
+ /** Remove only declared secret values from one URL and report that action. */
672
+ sanitizeUrl(value) {
673
+ const patterns = this.urlPatterns;
674
+ if (patterns.length === 0) return sanitizeBrowserUrl(value);
675
+ const output = replaceSecretLiterals(value, this.urlReplacements, patterns);
676
+ if (containsSecretPattern(output, normalizePercentEscapes(output), patterns)) return {
677
+ url: "",
678
+ origin: null,
679
+ query_parameter_names: [],
680
+ redacted: true
681
+ };
682
+ const sanitized = sanitizeBrowserUrl(output);
683
+ return {
684
+ ...sanitized,
685
+ redacted: sanitized.redacted || output !== value
686
+ };
687
+ }
688
+ fingerprint(value) {
689
+ const patterns = this.textPatterns;
690
+ if (patterns.length > 0 && containsSecretPattern(value, normalizePercentEscapes(value), patterns)) return {
691
+ value_state: "redacted-secret",
692
+ value_sha256: null
693
+ };
694
+ return {
695
+ value_state: "hashed",
696
+ value_sha256: createHash("sha256").update(value).digest("hex")
697
+ };
698
+ }
699
+ };
700
+ })))();
701
+ }
702
+
703
+ //#endregion
704
+ //#region dist/browser/PlaywrightScenarioBrowser.js
705
+ var OPERATION$2, throwIfScenarioCancelled$1, PlaywrightScenarioBrowserCleanupOwner, attachedScenarioAdmissions, releaseAttachedScenario, createAttachedScenarioRelease, attachedScenarioLeaseKey, acquireAttachedScenario, allowedBrowserEnvironment, findConnectedPage, AttachedScenarioEnvironmentOwner, failBrowserScenarioOperation, openAttachedScenarioBrowser, openPlaywrightScenarioBrowser;
706
+ function init_PlaywrightScenarioBrowser() {
707
+ return (init_PlaywrightScenarioBrowser = __esmMin((() => {
708
+ init_providerIdentities();
709
+ init_analysisErrorCleanup();
710
+ init_providerAdapterError();
711
+ init_AnalysisCleanupLease();
712
+ init_analysisErrorBase();
713
+ init_browserObservation();
714
+ init_browserObservationError();
715
+ init_PlaywrightExecutionBoundary();
716
+ OPERATION$2 = "capture_browser_scenario";
717
+ throwIfScenarioCancelled$1 = (signal) => {
718
+ if (signal?.aborted === true) throw new BrowserObservationError(OPERATION$2, "cancelled", { cause: signal?.reason });
719
+ };
720
+ PlaywrightScenarioBrowserCleanupOwner = class {
721
+ resources;
722
+ #browserClosed = false;
723
+ #profileRemoved;
724
+ #eventFinalizationPromise;
725
+ #eventsFinalized = false;
726
+ cleanupLease;
727
+ /** Keep the narrow provider actions needed to release one opened browser. */
728
+ constructor(resources) {
729
+ this.resources = resources;
730
+ this.#profileRemoved = resources.removeProfile === undefined;
731
+ this.cleanupLease = new AnalysisCleanupLease(() => this.#closeResources().finally(() => this.resources.onSettled?.(this.#browserClosed)), this);
732
+ }
733
+ get browserClosed() {
734
+ return this.#browserClosed;
735
+ }
736
+ get cleanupResources() {
737
+ return [
738
+ ...!this.#eventsFinalized ? ["browser_events"] : [],
739
+ ...!this.#browserClosed ? ["browser_transport"] : [],
740
+ ...!this.#profileRemoved ? ["browser_profile"] : []
741
+ ];
742
+ }
743
+ /** Await actual resource release, including a late browser acknowledgement. */
744
+ release(finishEvents) {
745
+ this.#prepareEvents(finishEvents);
746
+ return this.cleanupLease.release();
747
+ }
748
+ close(finishEvents) {
749
+ return this.#awaitCleanup(this.release(finishEvents));
750
+ }
751
+ #prepareEvents(finishEvents) {
752
+ this.#eventFinalizationPromise ??= Promise.resolve().then(async () => {
753
+ await finishEvents?.();
754
+ this.#eventsFinalized = true;
755
+ });
756
+ }
757
+ async #awaitCleanup(cleanup) {
758
+ try {
759
+ await withPlaywrightExecutionBoundary(() => cleanup, PLAYWRIGHT_CLEANUP_CONFIRMATION_TIMEOUT_MS);
760
+ } catch (cause) {
761
+ const failure = new BrowserObservationError(OPERATION$2, "cleanup_failed", {
762
+ cause,
763
+ cleanup: {
764
+ reason: cause instanceof Error ? cause.message : String(cause),
765
+ resources: this.cleanupResources
766
+ }
767
+ });
768
+ new AnalysisCleanupLeaseGroup(failure, [this.cleanupLease]);
769
+ throw failure;
770
+ }
771
+ }
772
+ async #closeResources() {
773
+ const failures = [];
774
+ this.#prepareEvents();
775
+ try {
776
+ await this.#eventFinalizationPromise;
777
+ } catch (cause) {
778
+ failures.push(cause);
779
+ }
780
+ if (!this.#browserClosed) {
781
+ try {
782
+ await this.resources.closeBrowser();
783
+ this.#browserClosed = true;
784
+ } catch (cause) {
785
+ failures.push(cause);
786
+ }
787
+ }
788
+ if (this.#browserClosed && !this.#profileRemoved && this.resources.removeProfile !== undefined) {
789
+ try {
790
+ await this.resources.removeProfile();
791
+ this.#profileRemoved = true;
792
+ } catch (cause) {
793
+ failures.push(cause);
794
+ }
795
+ }
796
+ if (failures.length === 1) throw failures[0];
797
+ if (failures.length > 1) throw new AggregateError(failures, "Browser session cleanup failed");
798
+ }
799
+ };
800
+ attachedScenarioAdmissions = new Map();
801
+ releaseAttachedScenario = (key, admission) => {
802
+ const waiter = admission.waiters.shift();
803
+ if (waiter === undefined) {
804
+ admission.active = false;
805
+ if (admission.cleanupOwner === undefined && attachedScenarioAdmissions.get(key) === admission) attachedScenarioAdmissions.delete(key);
806
+ return;
807
+ }
808
+ if (waiter.onAbort !== undefined) waiter.signal?.removeEventListener("abort", waiter.onAbort);
809
+ if (waiter.signal?.aborted === true) {
810
+ waiter.reject(new BrowserObservationError(OPERATION$2, "cancelled", { cause: waiter.signal.reason }));
811
+ releaseAttachedScenario(key, admission);
812
+ return;
813
+ }
814
+ waiter.resolve(createAttachedScenarioRelease(key, admission));
815
+ };
816
+ createAttachedScenarioRelease = (key, admission) => {
817
+ let released = false;
818
+ return () => {
819
+ if (released) return;
820
+ released = true;
821
+ releaseAttachedScenario(key, admission);
822
+ };
823
+ };
824
+ attachedScenarioLeaseKey = (endpoint, targetId) => {
825
+ const discovery = new URL("/json/version", endpoint);
826
+ if (isLiteralLoopbackHostname(discovery.hostname)) discovery.hostname = "127.0.0.1";
827
+ return JSON.stringify([discovery.href, targetId]);
828
+ };
829
+ acquireAttachedScenario = (scenario, signal) => {
830
+ if (signal?.aborted === true) return Promise.reject(new BrowserObservationError(OPERATION$2, "cancelled", { cause: signal?.reason }));
831
+ const key = attachedScenarioLeaseKey(scenario.cdp_endpoint, scenario.target_id);
832
+ const admission = attachedScenarioAdmissions.get(key) ?? {
833
+ active: false,
834
+ waiters: [],
835
+ cleanupOwner: undefined
836
+ };
837
+ attachedScenarioAdmissions.set(key, admission);
838
+ return new Promise((resolve, reject) => {
839
+ const grant = (release) => resolve({
840
+ admission,
841
+ release
842
+ });
843
+ if (!admission.active) {
844
+ admission.active = true;
845
+ grant(createAttachedScenarioRelease(key, admission));
846
+ return;
847
+ }
848
+ const waiter = {
849
+ signal,
850
+ resolve: (release) => grant(release),
851
+ reject,
852
+ onAbort: undefined
853
+ };
854
+ admission.waiters.push(waiter);
855
+ if (signal !== undefined) {
856
+ const onAbort = () => {
857
+ const index = admission.waiters.indexOf(waiter);
858
+ if (index < 0) return;
859
+ admission.waiters.splice(index, 1);
860
+ signal.removeEventListener("abort", onAbort);
861
+ reject(new BrowserObservationError(OPERATION$2, "cancelled", { cause: signal?.reason }));
862
+ if (!admission.active && admission.waiters.length === 0) releaseAttachedScenario(key, admission);
863
+ };
864
+ waiter.onAbort = onAbort;
865
+ signal.addEventListener("abort", onAbort, { once: true });
866
+ if (signal.aborted) {
867
+ onAbort();
868
+ return;
869
+ }
870
+ }
871
+ });
872
+ };
873
+ allowedBrowserEnvironment = (environment) => {
874
+ const allowed = [
875
+ "DBUS_SESSION_BUS_ADDRESS",
876
+ "DISPLAY",
877
+ "HOME",
878
+ "LANG",
879
+ "LD_LIBRARY_PATH",
880
+ "PATH",
881
+ "SystemRoot",
882
+ "TEMP",
883
+ "TMP",
884
+ "TMPDIR",
885
+ "WAYLAND_DISPLAY",
886
+ "XAUTHORITY",
887
+ "XDG_RUNTIME_DIR"
888
+ ];
889
+ const selected = Object.fromEntries(allowed.map((name) => [name, environment[name]]).filter((entry) => entry[1] !== undefined));
890
+ if (process.platform !== "android") return selected;
891
+ const prefix = environment.PREFIX;
892
+ if (prefix === undefined) return selected;
893
+ return {
894
+ ...selected,
895
+ LD_PRELOAD: `${prefix}/lib/libtermux-exec.so`,
896
+ TERMUX_EXEC__PROC_SELF_EXE: process.execPath
897
+ };
898
+ };
899
+ findConnectedPage = async (browser, targetId, signal) => {
900
+ for (const context of browser.contexts()) for (const page of context.pages()) {
901
+ const session = await context.newCDPSession(page);
902
+ try {
903
+ throwIfScenarioCancelled$1(signal);
904
+ const { targetInfo } = await session.send("Target.getTargetInfo");
905
+ throwIfScenarioCancelled$1(signal);
906
+ if (targetInfo.targetId !== targetId) continue;
907
+ return {
908
+ context,
909
+ page
910
+ };
911
+ } finally {
912
+ await session.detach();
913
+ }
914
+ }
915
+ throw new BrowserObservationError(OPERATION$2, "target_not_found");
916
+ };
917
+ AttachedScenarioEnvironmentOwner = class AttachedScenarioEnvironmentOwner {
918
+ page;
919
+ session;
920
+ #mediaOverride = false;
921
+ #deviceMetricsOverride = false;
922
+ #localeOverride = false;
923
+ #timezoneOverride = false;
924
+ #detached = false;
925
+ #application;
926
+ constructor(page, session) {
927
+ this.page = page;
928
+ this.session = session;
929
+ }
930
+ static async create(context, page) {
931
+ return new AttachedScenarioEnvironmentOwner(page, await context.newCDPSession(page));
932
+ }
933
+ get restored() {
934
+ return !this.#mediaOverride && !this.#deviceMetricsOverride && !this.#localeOverride && !this.#timezoneOverride;
935
+ }
936
+ get targetClosed() {
937
+ return this.page.isClosed();
938
+ }
939
+ apply(environment, signal) {
940
+ const application = this.#application ?? this.#applyEnvironment(environment, signal);
941
+ this.#application = application;
942
+ return application;
943
+ }
944
+ async #applyEnvironment(environment, signal) {
945
+ await this.page.emulateMedia({
946
+ colorScheme: environment.color_scheme,
947
+ reducedMotion: environment.reduced_motion
948
+ });
949
+ this.#mediaOverride = true;
950
+ throwIfScenarioCancelled$1(signal);
951
+ await this.session.send("Emulation.setDeviceMetricsOverride", {
952
+ width: environment.viewport.width,
953
+ height: environment.viewport.height,
954
+ deviceScaleFactor: environment.viewport.device_scale_factor,
955
+ mobile: false,
956
+ dontSetVisibleSize: true
957
+ });
958
+ this.#deviceMetricsOverride = true;
959
+ throwIfScenarioCancelled$1(signal);
960
+ await this.session.send("Emulation.setLocaleOverride", { locale: environment.locale });
961
+ this.#localeOverride = true;
962
+ throwIfScenarioCancelled$1(signal);
963
+ await this.session.send("Emulation.setTimezoneOverride", { timezoneId: environment.timezone });
964
+ this.#timezoneOverride = true;
965
+ throwIfScenarioCancelled$1(signal);
966
+ }
967
+ async close() {
968
+ if (this.#detached) return;
969
+ try {
970
+ await this.#application;
971
+ } catch {}
972
+ const failures = [];
973
+ if (this.#timezoneOverride) {
974
+ try {
975
+ await this.session.send("Emulation.setTimezoneOverride", { timezoneId: "" });
976
+ this.#timezoneOverride = false;
977
+ } catch (cause) {
978
+ failures.push(cause);
979
+ }
980
+ }
981
+ if (this.#localeOverride) {
982
+ try {
983
+ await this.session.send("Emulation.setLocaleOverride", { locale: "" });
984
+ this.#localeOverride = false;
985
+ } catch (cause) {
986
+ failures.push(cause);
987
+ }
988
+ }
989
+ if (this.#deviceMetricsOverride) {
990
+ try {
991
+ await this.session.send("Emulation.clearDeviceMetricsOverride");
992
+ this.#deviceMetricsOverride = false;
993
+ } catch (cause) {
994
+ failures.push(cause);
995
+ }
996
+ }
997
+ if (this.#mediaOverride) {
998
+ try {
999
+ await this.page.emulateMedia({
1000
+ colorScheme: null,
1001
+ reducedMotion: null
1002
+ });
1003
+ this.#mediaOverride = false;
1004
+ } catch (cause) {
1005
+ failures.push(cause);
1006
+ }
1007
+ }
1008
+ if (failures.length === 1) throw failures[0];
1009
+ if (failures.length > 1) throw new AggregateError(failures, "Attached browser environment restoration failed");
1010
+ await this.session.detach();
1011
+ this.#detached = true;
1012
+ }
1013
+ };
1014
+ failBrowserScenarioOperation = async (cleanup, primaryFailure) => {
1015
+ try {
1016
+ await withPlaywrightExecutionBoundary(() => cleanup.release(), PLAYWRIGHT_CLEANUP_CONFIRMATION_TIMEOUT_MS);
1017
+ } catch (cause) {
1018
+ const primary = primaryFailure instanceof AnalysisError ? primaryFailure : new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, OPERATION$2, { cause: primaryFailure });
1019
+ const failure = new BrowserObservationError(OPERATION$2, "cleanup_failed", {
1020
+ cause,
1021
+ cleanup: {
1022
+ reason: cause instanceof Error ? cause.message : String(cause),
1023
+ resources: cleanup.cleanupResources ?? []
1024
+ }
1025
+ });
1026
+ new AnalysisCleanupLeaseGroup(failure, [cleanup]);
1027
+ throw analysisErrorWithCleanupFailure(primary, failure, OPERATION$2).bindCleanupDependencies([primary, failure]);
1028
+ }
1029
+ throw primaryFailure;
1030
+ };
1031
+ openAttachedScenarioBrowser = async (browserRequest, environment, launcher, signal, retainCleanup) => {
1032
+ const lease = await acquireAttachedScenario(browserRequest, signal);
1033
+ let cleanupOwner;
1034
+ let environmentOwner;
1035
+ try {
1036
+ const priorOwner = lease.admission.cleanupOwner;
1037
+ if (priorOwner !== undefined) await priorOwner.close();
1038
+ throwIfScenarioCancelled$1(signal);
1039
+ const browser = await launcher.connectOverCDP(browserRequest.cdp_endpoint);
1040
+ const cleanup = new PlaywrightScenarioBrowserCleanupOwner({
1041
+ closeBrowser: async () => {
1042
+ let environmentFailure;
1043
+ const ownedEnvironment = environmentOwner;
1044
+ if (ownedEnvironment !== undefined) {
1045
+ try {
1046
+ await ownedEnvironment.close();
1047
+ environmentOwner = undefined;
1048
+ } catch (cause) {
1049
+ environmentFailure = cause;
1050
+ const browserConnected = browser.isConnected();
1051
+ if (ownedEnvironment.targetClosed || !browserConnected) {
1052
+ environmentOwner = undefined;
1053
+ if (!browserConnected) return;
1054
+ } else if (!ownedEnvironment.restored) {
1055
+ throw cause;
1056
+ }
1057
+ }
1058
+ }
1059
+ try {
1060
+ await browser.close();
1061
+ environmentOwner = undefined;
1062
+ } catch (browserFailure) {
1063
+ if (environmentFailure !== undefined) throw new AggregateError([environmentFailure, browserFailure], "Attached browser environment cleanup failed");
1064
+ throw browserFailure;
1065
+ }
1066
+ },
1067
+ onSettled: (browserClosed) => {
1068
+ if (browserClosed && lease.admission.cleanupOwner === cleanup) lease.admission.cleanupOwner = undefined;
1069
+ lease.release();
1070
+ },
1071
+ removeProfile: undefined
1072
+ });
1073
+ cleanupOwner = cleanup;
1074
+ lease.admission.cleanupOwner = cleanup;
1075
+ throwIfScenarioCancelled$1(signal);
1076
+ const target = await withPlaywrightExecutionBoundary(() => findConnectedPage(browser, browserRequest.target_id, signal), undefined, signal);
1077
+ throwIfScenarioCancelled$1(signal);
1078
+ const configuredEnvironment = await withPlaywrightExecutionBoundary(() => AttachedScenarioEnvironmentOwner.create(target.context, target.page), undefined, signal);
1079
+ environmentOwner = configuredEnvironment;
1080
+ await withPlaywrightExecutionBoundary(() => configuredEnvironment.apply(environment, signal), undefined, signal);
1081
+ return {
1082
+ ...target,
1083
+ browser,
1084
+ profilePath: undefined,
1085
+ cleanup
1086
+ };
1087
+ } catch (cause) {
1088
+ if (cleanupOwner === undefined) {
1089
+ lease.release();
1090
+ throw cause;
1091
+ }
1092
+ const cleanup = cleanupOwner;
1093
+ const recovery = cleanup.cleanupLease;
1094
+ try {
1095
+ return await failBrowserScenarioOperation(recovery, cause);
1096
+ } catch (failure) {
1097
+ if (failure !== cause) retainCleanup?.(recovery);
1098
+ throw failure;
1099
+ }
1100
+ }
1101
+ };
1102
+ openPlaywrightScenarioBrowser = async (scenario, environment, options = {}) => {
1103
+ const launcher = options.launcher ?? (await import("playwright-core")).chromium;
1104
+ if (scenario.browser.mode === "connect") return openAttachedScenarioBrowser(scenario.browser, scenario.environment, launcher, options.signal, options.retainCleanup);
1105
+ const profilePath = await mkdtemp(join(tmpdir(), "rea-browser-scenario-"));
1106
+ let context;
1107
+ try {
1108
+ await chmod(profilePath, 448);
1109
+ context = await launcher.launchPersistentContext(profilePath, {
1110
+ executablePath: resolve(scenario.browser.executable_path),
1111
+ headless: scenario.browser.headless,
1112
+ acceptDownloads: false,
1113
+ viewport: {
1114
+ width: scenario.environment.viewport.width,
1115
+ height: scenario.environment.viewport.height
1116
+ },
1117
+ deviceScaleFactor: scenario.environment.viewport.device_scale_factor,
1118
+ locale: scenario.environment.locale,
1119
+ timezoneId: scenario.environment.timezone,
1120
+ colorScheme: scenario.environment.color_scheme,
1121
+ reducedMotion: scenario.environment.reduced_motion,
1122
+ serviceWorkers: scenario.environment.service_workers,
1123
+ env: allowedBrowserEnvironment(environment),
1124
+ handleSIGHUP: false,
1125
+ handleSIGINT: false,
1126
+ handleSIGTERM: false,
1127
+ timeout: 0,
1128
+ args: process.platform === "android" ? ["--no-sandbox", "--single-process"] : []
1129
+ });
1130
+ } catch (cause) {
1131
+ const cleanup = new AnalysisCleanupLease(() => rm(profilePath, {
1132
+ recursive: true,
1133
+ force: true,
1134
+ maxRetries: 3
1135
+ }), ["browser_profile"]);
1136
+ try {
1137
+ return await failBrowserScenarioOperation(cleanup, cause);
1138
+ } catch (failure) {
1139
+ if (failure !== cause) options.retainCleanup?.(cleanup);
1140
+ throw failure;
1141
+ }
1142
+ }
1143
+ const cleanup = new PlaywrightScenarioBrowserCleanupOwner({
1144
+ closeBrowser: () => context.close(),
1145
+ removeProfile: () => rm(profilePath, {
1146
+ recursive: true,
1147
+ force: true,
1148
+ maxRetries: 3
1149
+ })
1150
+ });
1151
+ try {
1152
+ const browser = context.browser();
1153
+ if (browser === null) throw new BrowserObservationError(OPERATION$2, "protocol_error");
1154
+ const page = context.pages()[0] ?? await context.newPage();
1155
+ return {
1156
+ context,
1157
+ page,
1158
+ browser,
1159
+ profilePath,
1160
+ cleanup
1161
+ };
1162
+ } catch (cause) {
1163
+ const recovery = cleanup.cleanupLease;
1164
+ try {
1165
+ return await failBrowserScenarioOperation(recovery, cause);
1166
+ } catch (failure) {
1167
+ if (failure !== cause) options.retainCleanup?.(recovery);
1168
+ throw failure;
1169
+ }
1170
+ }
1171
+ };
1172
+ })))();
1173
+ }
1174
+
1175
+ //#endregion
1176
+ //#region dist/browser/PlaywrightScenarioActions.js
1177
+ var resolveLocator, resolveValue, performPlaywrightScenarioAction;
1178
+ function init_PlaywrightScenarioActions() {
1179
+ return (init_PlaywrightScenarioActions = __esmMin((() => {
1180
+ resolveLocator = (page, locator) => {
1181
+ switch (locator.kind) {
1182
+ case "test_id": return page.getByTestId(locator.value);
1183
+ case "role": return page.getByRole(locator.role, {
1184
+ name: locator.name,
1185
+ exact: true
1186
+ });
1187
+ case "css": return page.locator(locator.selector);
1188
+ }
1189
+ };
1190
+ resolveValue = (value, secrets) => secrets.value(value);
1191
+ performPlaywrightScenarioAction = async (input) => {
1192
+ const { page, action, secrets } = input;
1193
+ const timeout = "timeout_ms" in action ? action.timeout_ms : undefined;
1194
+ const options = timeout === undefined ? {} : { timeout };
1195
+ switch (action.action) {
1196
+ case "goto":
1197
+ await page.goto(secrets.url(action.destination), {
1198
+ ...options,
1199
+ waitUntil: action.wait_until
1200
+ });
1201
+ return;
1202
+ case "click":
1203
+ await resolveLocator(page, action.locator).click({
1204
+ ...options,
1205
+ button: action.button,
1206
+ clickCount: action.click_count
1207
+ });
1208
+ return;
1209
+ case "fill":
1210
+ await resolveLocator(page, action.locator).fill(resolveValue(action.value, secrets), options);
1211
+ return;
1212
+ case "press":
1213
+ await resolveLocator(page, action.locator).press(action.key, options);
1214
+ return;
1215
+ case "select_option":
1216
+ await resolveLocator(page, action.locator).selectOption(resolveValue(action.value, secrets), options);
1217
+ return;
1218
+ case "check":
1219
+ await resolveLocator(page, action.locator).check(options);
1220
+ return;
1221
+ case "uncheck":
1222
+ await resolveLocator(page, action.locator).uncheck(options);
1223
+ return;
1224
+ case "wait_for":
1225
+ await resolveLocator(page, action.locator).waitFor({
1226
+ ...options,
1227
+ state: action.state
1228
+ });
1229
+ return;
1230
+ case "wait_for_timeout": await page.waitForTimeout(action.duration_ms);
1231
+ }
1232
+ };
1233
+ })))();
1234
+ }
1235
+
1236
+ //#endregion
1237
+ //#region dist/browser/PlaywrightScenarioArtifacts.js
1238
+ var historyValueSchema, storageValueSchema, notRequested, missing, textArtifact, captureScreenshot, captureDom, captureAccessibility, navigationType, captureHistory, captureStorage, capturePlaywrightStepArtifacts;
1239
+ function init_PlaywrightScenarioArtifacts() {
1240
+ return (init_PlaywrightScenarioArtifacts = __esmMin((() => {
1241
+ init_browserScenarioCaptureValues();
1242
+ historyValueSchema = z.strictObject({
1243
+ length: z.number().int().min(0),
1244
+ navigation_entries: z.array(z.strictObject({
1245
+ type: z.string(),
1246
+ name: z.string()
1247
+ }))
1248
+ });
1249
+ storageValueSchema = z.strictObject({
1250
+ local_storage: z.array(z.tuple([z.string(), z.string()])),
1251
+ session_storage: z.array(z.tuple([z.string(), z.string()]))
1252
+ });
1253
+ notRequested = () => ({ state: "not_requested" });
1254
+ missing = (reason) => ({
1255
+ state: "missing",
1256
+ reason
1257
+ });
1258
+ textArtifact = (text) => {
1259
+ const bytes = Buffer.from(text);
1260
+ return {
1261
+ state: "captured",
1262
+ value: {
1263
+ sha256: createHash("sha256").update(bytes).digest("hex"),
1264
+ bytes: bytes.byteLength,
1265
+ text
1266
+ }
1267
+ };
1268
+ };
1269
+ captureScreenshot = async (page) => {
1270
+ try {
1271
+ const bytes = await page.screenshot({
1272
+ type: "png",
1273
+ fullPage: false,
1274
+ animations: "disabled",
1275
+ caret: "hide"
1276
+ });
1277
+ const sha256 = createHash("sha256").update(bytes).digest("hex");
1278
+ return {
1279
+ state: "captured",
1280
+ value: {
1281
+ sha256,
1282
+ bytes: bytes.byteLength,
1283
+ media_type: "image/png",
1284
+ data_base64: bytes.toString("base64")
1285
+ }
1286
+ };
1287
+ } catch (cause) {
1288
+ void cause;
1289
+ return missing("screenshot capture failed");
1290
+ }
1291
+ };
1292
+ captureDom = async (input) => {
1293
+ const { page, secrets } = input;
1294
+ try {
1295
+ return textArtifact(secrets.redact(await page.content()));
1296
+ } catch (cause) {
1297
+ void cause;
1298
+ return missing("DOM capture failed");
1299
+ }
1300
+ };
1301
+ captureAccessibility = async (input) => {
1302
+ const { page, secrets } = input;
1303
+ try {
1304
+ const text = await page.locator("html").ariaSnapshot();
1305
+ return textArtifact(secrets.redact(text));
1306
+ } catch (cause) {
1307
+ void cause;
1308
+ return missing("accessibility capture failed");
1309
+ }
1310
+ };
1311
+ navigationType = (value) => {
1312
+ switch (value) {
1313
+ case "navigate":
1314
+ case "reload":
1315
+ case "back_forward":
1316
+ case "prerender": return value;
1317
+ default: return "unknown";
1318
+ }
1319
+ };
1320
+ captureHistory = async (page, secrets) => {
1321
+ try {
1322
+ const raw = historyValueSchema.parse(await page.evaluate(`(() => ({
1323
+ length: window.history.length,
1324
+ navigation_entries: performance.getEntriesByType("navigation").map(
1325
+ entry => ({
1326
+ type: typeof entry.type === "string" ? entry.type : "unknown",
1327
+ name: entry.name
1328
+ })
1329
+ )
1330
+ }))()`));
1331
+ const value = {
1332
+ length: raw.length,
1333
+ current_url: secrets.sanitizeUrl(page.url()),
1334
+ navigation_entries: raw.navigation_entries.map(({ type, name }) => ({
1335
+ type: navigationType(type),
1336
+ name: secrets.sanitizeUrl(name)
1337
+ }))
1338
+ };
1339
+ return {
1340
+ state: "captured",
1341
+ value
1342
+ };
1343
+ } catch (cause) {
1344
+ void cause;
1345
+ return missing("history capture failed");
1346
+ }
1347
+ };
1348
+ captureStorage = async (input) => {
1349
+ const { context, page, secrets } = input;
1350
+ try {
1351
+ const pageUrl = new URL(page.url());
1352
+ const cookies = pageUrl.protocol === "http:" || pageUrl.protocol === "https:" ? await context.cookies(pageUrl.href) : [];
1353
+ const pageStorage = storageValueSchema.parse(await page.evaluate(`(() => ({
1354
+ local_storage: Object.entries(window.localStorage),
1355
+ session_storage: Object.entries(window.sessionStorage)
1356
+ }))()`));
1357
+ const value = {
1358
+ cookies: cookies.map((cookie) => ({
1359
+ name: secrets.redact(cookie.name),
1360
+ domain: secrets.redact(cookie.domain),
1361
+ path: secrets.redact(cookie.path),
1362
+ secure: cookie.secure,
1363
+ http_only: cookie.httpOnly,
1364
+ same_site: cookie.sameSite,
1365
+ ...secrets.fingerprint(cookie.value)
1366
+ })),
1367
+ local_storage: pageStorage.local_storage.map(([name, value]) => ({
1368
+ name: secrets.redact(name),
1369
+ ...secrets.fingerprint(value)
1370
+ })),
1371
+ session_storage: pageStorage.session_storage.map(([name, value]) => ({
1372
+ name: secrets.redact(name),
1373
+ ...secrets.fingerprint(value)
1374
+ }))
1375
+ };
1376
+ return {
1377
+ state: "captured",
1378
+ value
1379
+ };
1380
+ } catch (cause) {
1381
+ void cause;
1382
+ return missing("storage capture failed");
1383
+ }
1384
+ };
1385
+ capturePlaywrightStepArtifacts = async (input) => {
1386
+ const { context, page, secrets, requested } = input;
1387
+ const state = (kind, capture) => !requested.has(kind) ? Promise.resolve(notRequested()) : capture();
1388
+ return browserStepArtifactsSchema.parse({
1389
+ screenshot: await state("screenshot", () => captureScreenshot(page)),
1390
+ dom: await state("dom", () => captureDom({
1391
+ page,
1392
+ secrets
1393
+ })),
1394
+ accessibility: await state("accessibility", () => captureAccessibility({
1395
+ page,
1396
+ secrets
1397
+ })),
1398
+ url: await state("url", async () => ({
1399
+ state: "captured",
1400
+ value: secrets.sanitizeUrl(page.url())
1401
+ })),
1402
+ history: await state("history", () => captureHistory(page, secrets)),
1403
+ storage: await state("storage", () => captureStorage({
1404
+ context,
1405
+ page,
1406
+ secrets
1407
+ }))
1408
+ });
1409
+ };
1410
+ })))();
1411
+ }
1412
+
1413
+ //#endregion
1414
+ //#region dist/browser/network/PlaywrightNetworkContent.js
1415
+ var credentialHeaders, errorMessage, captureNetworkHeaders, captureNetworkBody;
1416
+ function init_PlaywrightNetworkContent() {
1417
+ return (init_PlaywrightNetworkContent = __esmMin((() => {
1418
+ init_analysisErrorCore();
1419
+ init_PlaywrightExecutionBoundary();
1420
+ credentialHeaders = new Set([
1421
+ "authorization",
1422
+ "proxy-authorization",
1423
+ "cookie",
1424
+ "set-cookie"
1425
+ ]);
1426
+ errorMessage = (cause, secrets, maxMetadataAllocationBytes) => {
1427
+ const message = cause instanceof Error && cause.message !== "" ? cause.message : "Network read failed";
1428
+ return secrets.redactionAllocationCost(message.length) <= maxMetadataAllocationBytes ? secrets.redact(message) : "Network read failed; diagnostic exceeds the allocation budget.";
1429
+ };
1430
+ captureNetworkHeaders = async (source, secrets, options) => {
1431
+ try {
1432
+ const headers = await withPlaywrightExecutionBoundary(() => source.headersArray(), options.timeoutMs, options.signal);
1433
+ let cost = 0;
1434
+ for (const { name, value } of headers) {
1435
+ cost += secrets.redactionAllocationCost(name.length + value.length) + 128;
1436
+ if (cost > options.maxHeaderAllocationBytes) return {
1437
+ state: "unavailable",
1438
+ message: `Headers exceed the ${String(options.maxHeaderAllocationBytes)}-byte allocation budget.`
1439
+ };
1440
+ }
1441
+ return {
1442
+ state: "captured",
1443
+ items: headers.map(({ name, value }) => {
1444
+ const safeName = secrets.redact(name);
1445
+ const credential = credentialHeaders.has(name.toLowerCase());
1446
+ const safeValue = credential ? null : secrets.redactBytes(Buffer.from(value)).toString("utf8");
1447
+ return {
1448
+ name: safeName,
1449
+ value: safeValue,
1450
+ redacted: credential || safeName !== name || safeValue !== value
1451
+ };
1452
+ })
1453
+ };
1454
+ } catch (cause) {
1455
+ return {
1456
+ state: "unavailable",
1457
+ message: errorMessage(cause, secrets, options.maxMetadataAllocationBytes)
1458
+ };
1459
+ }
1460
+ };
1461
+ captureNetworkBody = async (read, phase, source, secrets, options, preflight) => {
1462
+ try {
1463
+ const observed = await withPlaywrightExecutionBoundary(read, options.timeoutMs, options.signal);
1464
+ if (observed === null) return { state: "not_exposed" };
1465
+ const maxBodyBytes = options.maxBodyBytes;
1466
+ if (observed.length > maxBodyBytes) return {
1467
+ state: "unavailable",
1468
+ reason: "body-size-limit",
1469
+ message: `Playwright materialized the body before its ${String(maxBodyBytes)}-byte retained-body budget was checked.`,
1470
+ limit_bytes: maxBodyBytes,
1471
+ observed_bytes: observed.length
1472
+ };
1473
+ const bodyAllocationCost = secrets.redactionAllocationCost(observed.length);
1474
+ const base64AllocationCost = Math.ceil(observed.length / 3) * 4 * 8 + 2;
1475
+ const maxBodyAllocationBytes = options.maxBodyAllocationBytes;
1476
+ const observedBodyAllocationBytes = Math.max(bodyAllocationCost, base64AllocationCost);
1477
+ if (observedBodyAllocationBytes > maxBodyAllocationBytes) return {
1478
+ state: "unavailable",
1479
+ reason: "body-allocation-limit",
1480
+ message: "Body redaction exceeds the selected network body allocation budget.",
1481
+ limit_allocation_bytes: maxBodyAllocationBytes,
1482
+ observed_allocation_bytes: observedBodyAllocationBytes
1483
+ };
1484
+ const contentType = source.headers()["content-type"];
1485
+ if (contentType !== undefined && secrets.redactionAllocationCost(contentType.length) > options.maxHeaderAllocationBytes) return {
1486
+ state: "unavailable",
1487
+ reason: "body-allocation-limit",
1488
+ message: "Content type exceeds the selected network header allocation budget.",
1489
+ limit_allocation_bytes: options.maxHeaderAllocationBytes,
1490
+ observed_allocation_bytes: secrets.redactionAllocationCost(contentType.length)
1491
+ };
1492
+ const admission = preflight?.({
1493
+ observedBytes: observed.length,
1494
+ allocationBytes: observedBodyAllocationBytes,
1495
+ mediaType: contentType
1496
+ });
1497
+ if (admission?.status === "omitted") return {
1498
+ state: "omitted",
1499
+ reason: admission.reason
1500
+ };
1501
+ const retained = secrets.redactBytes(observed);
1502
+ return {
1503
+ state: "captured",
1504
+ representation: phase === "request" ? "browser-exposed-request-bytes" : "playwright-response-body-bytes",
1505
+ encoding: "base64",
1506
+ content: retained.toString("base64"),
1507
+ bytes: retained.length,
1508
+ sha256: createHash("sha256").update(retained).digest("hex"),
1509
+ media_type: contentType === undefined ? null : secrets.redactBytes(Buffer.from(contentType)).toString("utf8"),
1510
+ redacted: !retained.equals(observed)
1511
+ };
1512
+ } catch (cause) {
1513
+ return {
1514
+ state: "unavailable",
1515
+ reason: cause instanceof AnalysisCancelledError ? "cancelled" : cause instanceof AnalysisTimeoutError ? "body-read-timeout" : "body-read-failed",
1516
+ message: errorMessage(cause, secrets, options.maxMetadataAllocationBytes)
1517
+ };
1518
+ }
1519
+ };
1520
+ })))();
1521
+ }
1522
+
1523
+ //#endregion
1524
+ //#region dist/browser/network/PlaywrightScenarioNetwork.js
1525
+ var PlaywrightScenarioNetwork;
1526
+ function init_PlaywrightScenarioNetwork() {
1527
+ return (init_PlaywrightScenarioNetwork = __esmMin((() => {
1528
+ init_PlaywrightNetworkContent();
1529
+ PlaywrightScenarioNetwork = class {
1530
+ options;
1531
+ transactions = new Map();
1532
+ omittedRequests = new WeakSet();
1533
+ omittedPhases = new WeakMap();
1534
+ totalTransactions = 0;
1535
+ omittedTransactionCount = 0;
1536
+ firstOmittedTransaction = 0;
1537
+ lastOmittedTransaction = 0;
1538
+ /** One request and one response-content job at most per admitted transaction. */
1539
+ pending = [];
1540
+ queuedReads = [];
1541
+ gaps = new Set();
1542
+ accepting = true;
1543
+ activeReads = 0;
1544
+ readOptions;
1545
+ limits;
1546
+ constructor(options) {
1547
+ this.options = options;
1548
+ this.limits = options.limits;
1549
+ this.readOptions = {
1550
+ timeoutMs: options.readTimeoutMs ?? 5e3,
1551
+ maxBodyBytes: this.limits.max_network_body_bytes,
1552
+ maxBodyAllocationBytes: this.limits.max_network_body_allocation_bytes,
1553
+ maxHeaderAllocationBytes: this.limits.max_network_header_allocation_bytes,
1554
+ maxMetadataAllocationBytes: this.limits.max_network_metadata_allocation_bytes,
1555
+ ...options.signal === undefined ? {} : { signal: options.signal }
1556
+ };
1557
+ }
1558
+ /** Observe a request start, retaining the producer's redirect relationship when known. */
1559
+ request(request) {
1560
+ if (!this.accepting) return;
1561
+ const transaction = this.transaction(request);
1562
+ if (transaction === undefined) {
1563
+ this.omitOmittedTransactionPhase(request, "request");
1564
+ if (this.options.selection.request_body || this.options.selection.header_values) this.omitOmittedTransactionContent(request, "request");
1565
+ return;
1566
+ }
1567
+ if (transaction.requestObserved) return;
1568
+ if (!this.admitMetadata(transaction, "request", request)) return;
1569
+ transaction.requestObserved = true;
1570
+ const admission = this.options.emit({
1571
+ ...this.metadata(request, transaction),
1572
+ kind: "request",
1573
+ status: null,
1574
+ failure: null
1575
+ });
1576
+ if (admission.status === "omitted") {
1577
+ this.options.omitNetwork(transaction.id, "request", admission.reason);
1578
+ return;
1579
+ }
1580
+ const sequence = admission.sequence;
1581
+ if (this.options.selection.request_body || this.options.selection.header_values) this.collect(transaction, sequence, "request", request, (headers) => this.options.selection.request_body ? captureNetworkBody(async () => request.postDataBuffer(), "request", request, this.options.secrets, this.readOptions, (body) => this.options.admitContentBody({
1582
+ transactionId: transaction.id,
1583
+ sourceEventSequence: sequence,
1584
+ phase: "request",
1585
+ headers,
1586
+ observedBytes: body.observedBytes,
1587
+ allocationBytes: body.allocationBytes,
1588
+ mediaType: body.mediaType
1589
+ })) : Promise.resolve({ state: "not_requested" }), this.options.selection.header_values);
1590
+ }
1591
+ /** Observe response metadata without starting a potentially unfinished body read. */
1592
+ response(response) {
1593
+ if (!this.accepting) return;
1594
+ const request = response.request();
1595
+ const transaction = this.transaction(request);
1596
+ if (transaction === undefined) {
1597
+ this.omitOmittedTransactionPhase(request, "response");
1598
+ this.observeOmittedTransactionPhase(request, "response");
1599
+ return;
1600
+ }
1601
+ if (!this.admitMetadata(transaction, "response", request, undefined, [], [{
1602
+ source: response,
1603
+ url: response.url()
1604
+ }])) return;
1605
+ const admission = this.options.emit({
1606
+ ...this.metadata(request, transaction),
1607
+ kind: "response",
1608
+ url: this.options.secrets.sanitizeUrl(response.url()),
1609
+ status: response.status(),
1610
+ header_names: this.headerNames(response),
1611
+ failure: null
1612
+ });
1613
+ if (admission.status === "omitted") {
1614
+ this.options.omitNetwork(transaction.id, "response", admission.reason);
1615
+ return;
1616
+ }
1617
+ const sequence = admission.sequence;
1618
+ transaction.response = {
1619
+ source: response,
1620
+ sequence
1621
+ };
1622
+ }
1623
+ /** Record completion and read selected content through the response API. */
1624
+ finished(request) {
1625
+ if (!this.accepting) return;
1626
+ const transaction = this.transaction(request);
1627
+ if (transaction === undefined) {
1628
+ this.omitOmittedTransactionPhase(request, "request-finished");
1629
+ const observed = this.omittedPhases.get(request);
1630
+ if (observed?.has("response") && (this.options.selection.response_body || this.options.selection.header_values)) this.omitOmittedTransactionContent(request, "response");
1631
+ return;
1632
+ }
1633
+ if (!this.admitMetadata(transaction, "request-finished", request)) return;
1634
+ transaction.terminal = "finished";
1635
+ const admission = this.options.emit({
1636
+ ...this.metadata(request, transaction),
1637
+ kind: "request-finished",
1638
+ status: null,
1639
+ failure: null
1640
+ });
1641
+ if (admission.status === "omitted") {
1642
+ this.options.omitNetwork(transaction.id, "request-finished", admission.reason);
1643
+ transaction.responseScheduled = true;
1644
+ return;
1645
+ }
1646
+ this.responseContent(transaction);
1647
+ }
1648
+ /** Preserve request failure separately from missing or unreadable response content. */
1649
+ failed(request) {
1650
+ if (!this.accepting) return;
1651
+ const transaction = this.transaction(request);
1652
+ if (transaction === undefined) {
1653
+ this.omitOmittedTransactionPhase(request, "request-failed");
1654
+ return;
1655
+ }
1656
+ transaction.terminal = "failed";
1657
+ const failure = request.failure()?.errorText || "Unknown request failure";
1658
+ if (!this.admitMetadata(transaction, "request-failed", request, undefined, [failure])) return;
1659
+ const message = this.options.secrets.redact(failure);
1660
+ const admission = this.options.emit({
1661
+ ...this.metadata(request, transaction),
1662
+ kind: "request-failed",
1663
+ status: null,
1664
+ failure: message
1665
+ });
1666
+ if (admission.status === "omitted") {
1667
+ this.options.omitNetwork(transaction.id, "request-failed", admission.reason);
1668
+ transaction.responseScheduled = true;
1669
+ return;
1670
+ }
1671
+ this.responseContent(transaction, {
1672
+ state: "unavailable",
1673
+ reason: "request-failed",
1674
+ message
1675
+ });
1676
+ }
1677
+ /** Stop observing, mark unfinished transactions, and drain admitted content reads. */
1678
+ async finish() {
1679
+ if (!this.accepting) {
1680
+ await this.settlePendingReads();
1681
+ return;
1682
+ }
1683
+ this.accepting = false;
1684
+ for (const [request, transaction] of this.transactions) {
1685
+ if (transaction.terminal === undefined) {
1686
+ if (!this.admitMetadata(transaction, "request-unfinished", request)) continue;
1687
+ this.gaps.add("Some network requests had not completed when capture ended; later activity is unknown.");
1688
+ const admission = this.options.emit({
1689
+ ...this.metadata(request, transaction),
1690
+ kind: "request-unfinished",
1691
+ status: null,
1692
+ failure: null,
1693
+ reason: this.options.signal?.aborted === true ? "cancelled" : "capture-ended"
1694
+ });
1695
+ if (admission.status === "omitted") {
1696
+ this.options.omitNetwork(transaction.id, "request-unfinished", admission.reason);
1697
+ transaction.responseScheduled = true;
1698
+ continue;
1699
+ }
1700
+ this.responseContent(transaction, {
1701
+ state: "unavailable",
1702
+ reason: this.options.signal?.aborted === true ? "cancelled" : "response-unfinished",
1703
+ message: "The response had not finished at the capture cutoff; no body read or refetch was attempted."
1704
+ });
1705
+ }
1706
+ }
1707
+ await this.settlePendingReads();
1708
+ }
1709
+ async settlePendingReads() {
1710
+ const results = await Promise.allSettled(this.pending);
1711
+ const failed = results.find((result) => result.status === "rejected");
1712
+ if (failed !== undefined) throw failed.reason;
1713
+ }
1714
+ /** Missing selected content contributes to aggregate completeness. */
1715
+ limitations() {
1716
+ return [...this.gaps];
1717
+ }
1718
+ omittedTransactionRange() {
1719
+ return this.omittedTransactionCount === 0 ? null : {
1720
+ first_transaction_id: `request-${String(this.firstOmittedTransaction)}`,
1721
+ last_transaction_id: `request-${String(this.lastOmittedTransaction)}`,
1722
+ count: this.omittedTransactionCount,
1723
+ reason: "max-network-transactions"
1724
+ };
1725
+ }
1726
+ transaction(request) {
1727
+ const known = this.transactions.get(request);
1728
+ if (known !== undefined) return known;
1729
+ if (this.omittedRequests.has(request)) return undefined;
1730
+ this.totalTransactions += 1;
1731
+ const id = `request-${String(this.totalTransactions)}`;
1732
+ if (this.transactions.size >= this.limits.max_network_transactions) {
1733
+ this.omittedRequests.add(request);
1734
+ if (this.omittedTransactionCount === 0) this.firstOmittedTransaction = this.totalTransactions;
1735
+ this.lastOmittedTransaction = this.totalTransactions;
1736
+ this.omittedTransactionCount += 1;
1737
+ this.gaps.add(`Network collection reached its ${String(this.limits.max_network_transactions)}-transaction resource budget; omitted transaction IDs are listed in events.omissions.network_transaction_range.`);
1738
+ return undefined;
1739
+ }
1740
+ const predecessor = request.redirectedFrom();
1741
+ const predecessorTransaction = predecessor === null ? undefined : this.transactions.get(predecessor);
1742
+ const transaction = {
1743
+ id,
1744
+ redirectedFrom: predecessorTransaction?.id ?? null,
1745
+ redirectedFromState: predecessor === null ? "root" : predecessorTransaction === undefined ? "unknown" : undefined,
1746
+ responseScheduled: false,
1747
+ requestObserved: false
1748
+ };
1749
+ this.transactions.set(request, transaction);
1750
+ return transaction;
1751
+ }
1752
+ admitProducerStrings(transaction, kind, values) {
1753
+ const admission = this.options.admitText(kind, values);
1754
+ if (admission.status === "retained") return true;
1755
+ this.options.omitNetwork(transaction.id, kind, admission.reason);
1756
+ this.gaps.add(`Network ${kind} metadata was omitted for ${transaction.id} because ${admission.reason} was reached; network coverage is incomplete.`);
1757
+ return false;
1758
+ }
1759
+ omitOmittedTransactionPhase(request, kind) {
1760
+ if (!this.omittedRequests.has(request)) return;
1761
+ if (!this.observeOmittedTransactionPhase(request, kind)) return;
1762
+ this.options.omitEvent(kind, "max-network-transactions");
1763
+ }
1764
+ observeOmittedTransactionPhase(request, phase) {
1765
+ let observed = this.omittedPhases.get(request);
1766
+ if (observed === undefined) {
1767
+ observed = new Set();
1768
+ this.omittedPhases.set(request, observed);
1769
+ }
1770
+ if (observed.has(phase)) return false;
1771
+ observed.add(phase);
1772
+ return true;
1773
+ }
1774
+ omitOmittedTransactionContent(request, phase) {
1775
+ if (!this.omittedRequests.has(request)) return;
1776
+ if (!this.observeOmittedTransactionPhase(request, `network-content:${phase}`)) return;
1777
+ this.options.omitEvent("network-content", "max-network-transactions");
1778
+ }
1779
+ admitMetadata(transaction, kind, source, url, additionalStrings = [], additionalSources = []) {
1780
+ return this.admitProducerStrings(transaction, kind, this.metadataStrings(source, url, additionalStrings, additionalSources));
1781
+ }
1782
+ *metadataStrings(source, url, additionalStrings, additionalSources) {
1783
+ yield* this.retainedMetadataStrings(source, source.headers(), url);
1784
+ yield* additionalStrings;
1785
+ for (const extra of additionalSources) yield* this.retainedMetadataStrings(extra.source, extra.source.headers(), extra.url);
1786
+ }
1787
+ *retainedMetadataStrings(source, headers, url) {
1788
+ if (url !== undefined) yield url;
1789
+ for (const name in headers) {
1790
+ if (!Object.hasOwn(headers, name)) continue;
1791
+ yield name;
1792
+ if (this.options.selection.header_values) yield headers[name];
1793
+ }
1794
+ if ("method" in source) {
1795
+ const request = source;
1796
+ yield request.method();
1797
+ yield request.url();
1798
+ yield request.resourceType();
1799
+ }
1800
+ }
1801
+ headerNames(source) {
1802
+ return Object.keys(source.headers()).map((name) => this.options.secrets.redact(name)).sort();
1803
+ }
1804
+ metadata(request, transaction) {
1805
+ return {
1806
+ transaction_id: transaction.id,
1807
+ redirected_from_transaction_id: transaction.redirectedFrom,
1808
+ ...transaction.redirectedFromState === undefined ? {} : { redirected_from_transaction_state: transaction.redirectedFromState },
1809
+ method: this.options.secrets.redact(request.method()),
1810
+ url: this.options.secrets.sanitizeUrl(request.url()),
1811
+ resource_type: this.options.secrets.redact(request.resourceType()),
1812
+ header_names: this.headerNames(request)
1813
+ };
1814
+ }
1815
+ responseContent(transaction, unavailable) {
1816
+ const response = transaction.response;
1817
+ if (response === undefined || transaction.responseScheduled || !this.options.selection.response_body && !this.options.selection.header_values) return;
1818
+ transaction.responseScheduled = true;
1819
+ this.collect(transaction, response.sequence, "response", response.source, (headers) => this.options.selection.response_body ? unavailable === undefined ? captureNetworkBody(() => response.source.body(), "response", response.source, this.options.secrets, this.readOptions, (body) => this.options.admitContentBody({
1820
+ transactionId: transaction.id,
1821
+ sourceEventSequence: response.sequence,
1822
+ phase: "response",
1823
+ headers,
1824
+ observedBytes: body.observedBytes,
1825
+ allocationBytes: body.allocationBytes,
1826
+ mediaType: body.mediaType
1827
+ })) : Promise.resolve(unavailable) : Promise.resolve({ state: "not_requested" }), this.options.selection.header_values);
1828
+ }
1829
+ collect(transaction, sequence, phase, source, body, includeHeaders) {
1830
+ const collect = async () => {
1831
+ const retainedHeaders = includeHeaders ? await captureNetworkHeaders(source, this.options.secrets, this.readOptions) : { state: "not_requested" };
1832
+ const retainedBody = await body(retainedHeaders);
1833
+ if (retainedBody.state === "omitted") {
1834
+ this.options.omitNetwork(transaction.id, "network-content", retainedBody.reason);
1835
+ return;
1836
+ }
1837
+ if (retainedHeaders.state === "unavailable" || retainedBody.state === "unavailable" || retainedBody.state === "not_exposed") this.gaps.add("Some selected network content was unavailable; per-transaction content states retain the reason.");
1838
+ const admission = this.options.emit({
1839
+ kind: "network-content",
1840
+ transaction_id: transaction.id,
1841
+ source_event_sequence: sequence,
1842
+ phase,
1843
+ headers: retainedHeaders,
1844
+ body: retainedBody
1845
+ });
1846
+ if (admission.status === "omitted") this.options.omitNetwork(transaction.id, "network-content", admission.reason);
1847
+ };
1848
+ this.pending.push(new Promise((resolve, reject) => {
1849
+ this.queuedReads.push({
1850
+ run: collect,
1851
+ resolve,
1852
+ reject
1853
+ });
1854
+ this.pumpContentReads();
1855
+ }));
1856
+ }
1857
+ pumpContentReads() {
1858
+ while (this.activeReads < 16 && this.queuedReads.length > 0) {
1859
+ const job = this.queuedReads.shift();
1860
+ if (job === undefined) return;
1861
+ this.activeReads += 1;
1862
+ void job.run().then(job.resolve, job.reject).finally(() => {
1863
+ this.activeReads -= 1;
1864
+ this.pumpContentReads();
1865
+ });
1866
+ }
1867
+ }
1868
+ };
1869
+ })))();
1870
+ }
1871
+
1872
+ //#endregion
1873
+ //#region dist/browser/PlaywrightScenarioEvents.js
1874
+ var MAX_LISTENER_OWNERS, allocationCost, PlaywrightScenarioEvents;
1875
+ function init_PlaywrightScenarioEvents() {
1876
+ return (init_PlaywrightScenarioEvents = __esmMin((() => {
1877
+ init_browserScenarioCaptureValues();
1878
+ init_browserScenarioCaptureLimits();
1879
+ init_PlaywrightScenarioNetwork();
1880
+ MAX_LISTENER_OWNERS = 2048;
1881
+ allocationCost = (value, remaining) => {
1882
+ if (typeof value === "string") return value.length * 8 + 2;
1883
+ if (value === null || typeof value !== "object") return 32;
1884
+ let cost = 2;
1885
+ for (const key in value) {
1886
+ if (!Object.hasOwn(value, key)) continue;
1887
+ const item = value[key];
1888
+ cost += key.length * 8 + 4 + allocationCost(item, remaining - cost);
1889
+ if (cost > remaining) break;
1890
+ }
1891
+ return cost;
1892
+ };
1893
+ PlaywrightScenarioEvents = class {
1894
+ items = [];
1895
+ retainedCost = 0;
1896
+ dropped = 0;
1897
+ omittedKinds = new Map();
1898
+ omittedNetwork = new Map();
1899
+ stepIndex = 0;
1900
+ sequence = 0;
1901
+ enabled;
1902
+ secrets;
1903
+ limits;
1904
+ ownsContext;
1905
+ pages = new WeakSet();
1906
+ incompleteFamilies = new Set();
1907
+ network;
1908
+ stopNetwork;
1909
+ stopListeners = new Map();
1910
+ sealed = false;
1911
+ constructor(options) {
1912
+ const network = options.network ?? {
1913
+ request_body: false,
1914
+ response_body: false,
1915
+ header_values: false
1916
+ };
1917
+ this.enabled = new Set(options.enabled);
1918
+ if (network.request_body || network.response_body || network.header_values) this.enabled = new Set([...this.enabled, "network"]);
1919
+ this.secrets = options.secrets;
1920
+ this.limits = options.limits ?? DEFAULT_BROWSER_SCENARIO_CAPTURE_LIMITS;
1921
+ this.ownsContext = options.ownsContext === true;
1922
+ this.pages.add(options.page);
1923
+ if (this.ownsContext && this.enabled.size > 0) {
1924
+ const context = options.context ?? options.page.context();
1925
+ const onPage = (page) => this.popup(page);
1926
+ context.on("page", onPage);
1927
+ this.retainListener(context, () => context.off("page", onPage));
1928
+ }
1929
+ if (this.enabled.has("network")) {
1930
+ const context = options.context ?? options.page.context();
1931
+ const collector = new PlaywrightScenarioNetwork({
1932
+ selection: network,
1933
+ limits: this.limits,
1934
+ secrets: options.secrets,
1935
+ emit: (event) => this.push(event),
1936
+ admitText: (kind, values) => this.admitProducerText(kind, values, true),
1937
+ admitContentBody: (input) => this.admitContentBody(input),
1938
+ omitNetwork: (id, kind, reason) => this.omitNetwork(id, kind, reason),
1939
+ omitEvent: (kind, reason) => this.omitEvent(kind, reason),
1940
+ ...options.signal === undefined ? {} : { signal: options.signal }
1941
+ });
1942
+ this.network = collector;
1943
+ const inScope = (request) => {
1944
+ if (this.ownsContext) return true;
1945
+ try {
1946
+ return this.pages.has(request.frame().page());
1947
+ } catch (cause) {
1948
+ void cause;
1949
+ return false;
1950
+ }
1951
+ };
1952
+ const onRequest = (request) => {
1953
+ if (inScope(request)) collector.request(request);
1954
+ };
1955
+ const onResponse = (response) => {
1956
+ if (inScope(response.request())) collector.response(response);
1957
+ };
1958
+ const onFailed = (request) => {
1959
+ if (inScope(request)) collector.failed(request);
1960
+ };
1961
+ const onFinished = (request) => {
1962
+ if (inScope(request)) collector.finished(request);
1963
+ };
1964
+ context.on("request", onRequest);
1965
+ context.on("response", onResponse);
1966
+ context.on("requestfailed", onFailed);
1967
+ context.on("requestfinished", onFinished);
1968
+ this.stopNetwork = () => {
1969
+ context.off("request", onRequest);
1970
+ context.off("response", onResponse);
1971
+ context.off("requestfailed", onFailed);
1972
+ context.off("requestfinished", onFinished);
1973
+ };
1974
+ }
1975
+ this.observePage(options.page);
1976
+ }
1977
+ setStep(index) {
1978
+ this.stepIndex = index;
1979
+ }
1980
+ nextSequence() {
1981
+ return this.sequence + 1;
1982
+ }
1983
+ lastSequence() {
1984
+ return this.sequence;
1985
+ }
1986
+ /** Drain selected network content and freeze the result before browser teardown. */
1987
+ async finish() {
1988
+ this.stopNetwork?.();
1989
+ this.stopNetwork = undefined;
1990
+ for (const owner of this.stopListeners.keys()) this.releaseListeners(owner);
1991
+ this.pages = new WeakSet();
1992
+ try {
1993
+ await this.network?.finish();
1994
+ } finally {
1995
+ this.sealed = true;
1996
+ }
1997
+ }
1998
+ /** Report selected popup event families with unrecoverable pre-discovery gaps. */
1999
+ limitations() {
2000
+ const popupGaps = [...this.incompleteFamilies].map((family) => `Popup ${family} events before Page discovery are unavailable; later events are retained.`);
2001
+ const gaps = [...popupGaps, ...this.network?.limitations() ?? []];
2002
+ if (this.dropped > 0) gaps.push("Browser event collection reached a selected resource budget; per-kind omissions and affected network transaction IDs are listed in events.omissions, and event coverage is incomplete.");
2003
+ return this.enabled.has("network") && !this.ownsContext ? ["Shared-context network capture excludes requests without a known root or descendant Page frame.", ...gaps] : gaps;
2004
+ }
2005
+ result() {
2006
+ const omittedKinds = new Map([...this.omittedKinds].map(([kind, omission]) => [kind, {
2007
+ count: omission.count,
2008
+ reasons: new Set(omission.reasons)
2009
+ }]));
2010
+ return {
2011
+ retained: this.items.length,
2012
+ dropped: this.dropped,
2013
+ items: this.items,
2014
+ omissions: {
2015
+ by_kind: [...omittedKinds].sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([kind, omission]) => ({
2016
+ kind,
2017
+ count: omission.count,
2018
+ reasons: [...omission.reasons].sort()
2019
+ })),
2020
+ network_transactions: [...this.omittedNetwork].sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([transaction_id, omission]) => ({
2021
+ transaction_id,
2022
+ omitted_kinds: [...omission.kinds].sort(),
2023
+ reasons: [...omission.reasons].sort()
2024
+ })),
2025
+ network_transaction_range: this.network?.omittedTransactionRange() ?? null
2026
+ }
2027
+ };
2028
+ }
2029
+ push(event) {
2030
+ this.sequence += 1;
2031
+ const cost = allocationCost(event, this.limits.max_event_allocation_bytes) + 128;
2032
+ const reason = this.admissionReason(cost);
2033
+ if (this.sealed || reason !== undefined) {
2034
+ const finalReason = reason ?? "max-events";
2035
+ this.omitEvent(event.kind, finalReason);
2036
+ return {
2037
+ status: "omitted",
2038
+ sequence: this.sequence,
2039
+ reason: finalReason
2040
+ };
2041
+ }
2042
+ this.retainedCost += cost;
2043
+ const parsed = browserScenarioEventSchema.parse({
2044
+ ...event,
2045
+ sequence: this.sequence,
2046
+ step_index: this.stepIndex
2047
+ });
2048
+ this.items.push(parsed);
2049
+ return {
2050
+ status: "retained",
2051
+ sequence: this.sequence
2052
+ };
2053
+ }
2054
+ admitText(kind, ...values) {
2055
+ return this.admitProducerText(kind, values, false).status === "retained";
2056
+ }
2057
+ /** Admit conservative output cost before running redaction or cloning. */
2058
+ admitProducerText(kind, values, networkMetadata) {
2059
+ let cost = 4096;
2060
+ for (const value of values) {
2061
+ cost += this.secrets.redactionAllocationCost(value.length);
2062
+ }
2063
+ const reason = networkMetadata && cost > this.limits.max_network_metadata_allocation_bytes ? "max-network-metadata-allocation-bytes" : this.admissionReason(cost);
2064
+ if (reason !== undefined) {
2065
+ this.sequence += 1;
2066
+ this.omitEvent(kind, reason);
2067
+ return {
2068
+ status: "omitted",
2069
+ sequence: this.sequence,
2070
+ reason
2071
+ };
2072
+ }
2073
+ return {
2074
+ status: "retained",
2075
+ sequence: this.sequence + 1
2076
+ };
2077
+ }
2078
+ admissionReason(cost) {
2079
+ if (this.sealed || this.items.length >= this.limits.max_events) return "max-events";
2080
+ if (cost > this.limits.max_event_allocation_bytes) return "max-event-allocation-bytes";
2081
+ if (cost > this.limits.max_total_event_allocation_bytes - this.retainedCost) return "max-total-event-allocation-bytes";
2082
+ return undefined;
2083
+ }
2084
+ admitContentBody(input) {
2085
+ const kind = "network-content";
2086
+ const eventCost = allocationCost({
2087
+ kind,
2088
+ sequence: this.sequence + 1,
2089
+ step_index: this.stepIndex,
2090
+ transaction_id: input.transactionId,
2091
+ source_event_sequence: input.sourceEventSequence,
2092
+ phase: input.phase,
2093
+ headers: input.headers,
2094
+ body: {
2095
+ state: "captured",
2096
+ representation: input.phase === "request" ? "browser-exposed-request-bytes" : "playwright-response-body-bytes",
2097
+ encoding: "base64",
2098
+ content: null,
2099
+ bytes: input.observedBytes,
2100
+ sha256: "0".repeat(64),
2101
+ media_type: null,
2102
+ redacted: false
2103
+ }
2104
+ }, this.limits.max_event_allocation_bytes) - 64 + input.allocationBytes + (input.mediaType === undefined ? 0 : Math.max(input.mediaType.length * 8 + 2, this.secrets.redactionAllocationCost(input.mediaType.length))) + 128;
2105
+ const reason = this.admissionReason(eventCost);
2106
+ if (reason !== undefined) {
2107
+ this.sequence += 1;
2108
+ this.omitEvent(kind, reason);
2109
+ return {
2110
+ status: "omitted",
2111
+ sequence: this.sequence,
2112
+ reason
2113
+ };
2114
+ }
2115
+ return {
2116
+ status: "retained",
2117
+ sequence: this.sequence + 1
2118
+ };
2119
+ }
2120
+ omitEvent(kind, reason) {
2121
+ this.dropped += 1;
2122
+ let omission = this.omittedKinds.get(kind);
2123
+ if (omission === undefined) {
2124
+ omission = {
2125
+ count: 0,
2126
+ reasons: new Set()
2127
+ };
2128
+ this.omittedKinds.set(kind, omission);
2129
+ }
2130
+ omission.count += 1;
2131
+ omission.reasons.add(reason);
2132
+ }
2133
+ omitNetwork(transactionId, kind, reason) {
2134
+ let omission = this.omittedNetwork.get(transactionId);
2135
+ if (omission === undefined) {
2136
+ omission = {
2137
+ kinds: new Set(),
2138
+ reasons: new Set()
2139
+ };
2140
+ this.omittedNetwork.set(transactionId, omission);
2141
+ }
2142
+ omission.kinds.add(kind);
2143
+ omission.reasons.add(reason);
2144
+ }
2145
+ admitOwner(kind) {
2146
+ if (this.stopListeners.size < MAX_LISTENER_OWNERS) return true;
2147
+ this.sequence += 1;
2148
+ this.omitEvent(kind, "max-listener-owners");
2149
+ return false;
2150
+ }
2151
+ retainListener(owner, stop) {
2152
+ let stops = this.stopListeners.get(owner);
2153
+ if (stops === undefined) {
2154
+ stops = new Set();
2155
+ this.stopListeners.set(owner, stops);
2156
+ }
2157
+ stops.add(stop);
2158
+ }
2159
+ releaseListeners(owner) {
2160
+ const stops = this.stopListeners.get(owner);
2161
+ this.stopListeners.delete(owner);
2162
+ for (const stop of stops ?? []) stop();
2163
+ }
2164
+ observePage(page) {
2165
+ if (this.enabled.size > 0) {
2166
+ const onClose = () => {
2167
+ this.releaseListeners(page);
2168
+ };
2169
+ page.on("close", onClose);
2170
+ this.retainListener(page, () => page.off("close", onClose));
2171
+ }
2172
+ if (this.enabled.has("console")) {
2173
+ const onConsole = (message) => this.console(message);
2174
+ page.on("console", onConsole);
2175
+ this.retainListener(page, () => page.off("console", onConsole));
2176
+ }
2177
+ if (this.enabled.has("page-errors")) {
2178
+ const onError = (error) => {
2179
+ if (!this.admitText("page-error", error.message, error.stack ?? "")) return;
2180
+ this.push({
2181
+ kind: "page-error",
2182
+ message: this.secrets.redact(error.message),
2183
+ stack: error.stack === undefined ? null : this.secrets.redact(error.stack)
2184
+ });
2185
+ };
2186
+ page.on("pageerror", onError);
2187
+ this.retainListener(page, () => page.off("pageerror", onError));
2188
+ }
2189
+ if (this.enabled.has("websockets")) {
2190
+ const onWebSocket = (socket) => this.webSocket(socket);
2191
+ page.on("websocket", onWebSocket);
2192
+ this.retainListener(page, () => page.off("websocket", onWebSocket));
2193
+ }
2194
+ if (this.enabled.has("frames")) {
2195
+ const onAttached = (frame) => this.frame("frame-attached", frame);
2196
+ const onDetached = (frame) => this.frame("frame-detached", frame);
2197
+ const onNavigated = (frame) => this.frame("frame-navigated", frame);
2198
+ page.on("frameattached", onAttached);
2199
+ page.on("framedetached", onDetached);
2200
+ page.on("framenavigated", onNavigated);
2201
+ this.retainListener(page, () => page.off("frameattached", onAttached));
2202
+ this.retainListener(page, () => page.off("framedetached", onDetached));
2203
+ this.retainListener(page, () => page.off("framenavigated", onNavigated));
2204
+ }
2205
+ if (this.enabled.has("workers")) {
2206
+ const onWorker = (worker) => this.worker(worker);
2207
+ page.on("worker", onWorker);
2208
+ this.retainListener(page, () => page.off("worker", onWorker));
2209
+ }
2210
+ if (this.enabled.size > 0) {
2211
+ const onPopup = (popup) => this.popup(popup);
2212
+ page.on("popup", onPopup);
2213
+ this.retainListener(page, () => page.off("popup", onPopup));
2214
+ }
2215
+ if (this.enabled.has("downloads")) {
2216
+ const onDownload = (download) => this.download(download);
2217
+ page.on("download", onDownload);
2218
+ this.retainListener(page, () => page.off("download", onDownload));
2219
+ }
2220
+ }
2221
+ safeUrl(value) {
2222
+ return this.secrets.sanitizeUrl(value);
2223
+ }
2224
+ console(message) {
2225
+ const rawText = message.text();
2226
+ const location = message.location();
2227
+ if (!this.admitText("console", rawText, location.url, message.type())) return;
2228
+ this.push({
2229
+ kind: "console",
2230
+ level: this.secrets.redact(message.type()),
2231
+ text: this.secrets.redact(rawText),
2232
+ url: location.url === "" ? null : this.safeUrl(location.url)
2233
+ });
2234
+ }
2235
+ webSocket(socket) {
2236
+ if (!this.admitOwner("websocket-opened")) return;
2237
+ if (!this.admitText("websocket-opened", socket.url())) return;
2238
+ const url = this.safeUrl(socket.url());
2239
+ this.push({
2240
+ kind: "websocket-opened",
2241
+ url
2242
+ });
2243
+ const onSent = ({ payload }) => this.webSocketFrame("websocket-frame-sent", url, payload);
2244
+ const onReceived = ({ payload }) => this.webSocketFrame("websocket-frame-received", url, payload);
2245
+ const onClose = () => {
2246
+ this.push({
2247
+ kind: "websocket-closed",
2248
+ url
2249
+ });
2250
+ this.releaseListeners(socket);
2251
+ };
2252
+ socket.on("framesent", onSent);
2253
+ socket.on("framereceived", onReceived);
2254
+ socket.on("close", onClose);
2255
+ this.retainListener(socket, () => socket.off("framesent", onSent));
2256
+ this.retainListener(socket, () => socket.off("framereceived", onReceived));
2257
+ this.retainListener(socket, () => socket.off("close", onClose));
2258
+ }
2259
+ webSocketFrame(kind, url, payload) {
2260
+ const bytes = Buffer.byteLength(payload);
2261
+ const isText = typeof payload === "string";
2262
+ if (!isText) {
2263
+ this.push({
2264
+ kind,
2265
+ url,
2266
+ payload_type: "binary",
2267
+ payload_bytes: bytes,
2268
+ payload_text: null,
2269
+ truncated: false
2270
+ });
2271
+ return;
2272
+ }
2273
+ if (!this.admitText(kind, payload)) return;
2274
+ const text = this.secrets.redact(payload);
2275
+ this.push({
2276
+ kind,
2277
+ url,
2278
+ payload_type: "text",
2279
+ payload_bytes: bytes,
2280
+ payload_text: text,
2281
+ truncated: false
2282
+ });
2283
+ }
2284
+ frame(kind, frame) {
2285
+ if (!this.admitText(kind, frame.url(), frame.name())) return;
2286
+ this.push({
2287
+ kind,
2288
+ url: frame.url() === "" ? null : this.safeUrl(frame.url()),
2289
+ name: frame.name() === "" ? null : this.secrets.redact(frame.name())
2290
+ });
2291
+ }
2292
+ worker(worker) {
2293
+ if (!this.admitOwner("worker-created") || !this.admitText("worker-created", worker.url())) return;
2294
+ const details = {
2295
+ url: this.safeUrl(worker.url()),
2296
+ name: null
2297
+ };
2298
+ this.push({
2299
+ kind: "worker-created",
2300
+ ...details
2301
+ });
2302
+ const onClose = () => {
2303
+ this.push({
2304
+ kind: "worker-closed",
2305
+ ...details
2306
+ });
2307
+ this.releaseListeners(worker);
2308
+ };
2309
+ worker.on("close", onClose);
2310
+ this.retainListener(worker, () => worker.off("close", onClose));
2311
+ }
2312
+ popup(page) {
2313
+ if (this.pages.has(page)) return;
2314
+ if (!this.admitOwner("popup-opened") || !this.admitText("popup-opened", page.url())) return;
2315
+ this.pages.add(page);
2316
+ for (const family of [
2317
+ "frames",
2318
+ "workers",
2319
+ "websockets",
2320
+ "downloads"
2321
+ ]) if (this.enabled.has(family)) this.incompleteFamilies.add(family);
2322
+ const opened = {
2323
+ url: page.url() === "" ? null : this.safeUrl(page.url()),
2324
+ name: null
2325
+ };
2326
+ if (this.enabled.has("popups")) {
2327
+ this.push({
2328
+ kind: "popup-opened",
2329
+ ...opened
2330
+ });
2331
+ const onClose = () => {
2332
+ if (!this.admitText("popup-closed", page.url())) return;
2333
+ this.push({
2334
+ kind: "popup-closed",
2335
+ url: page.url() === "" ? null : this.safeUrl(page.url()),
2336
+ name: null
2337
+ });
2338
+ };
2339
+ page.on("close", onClose);
2340
+ this.retainListener(page, () => page.off("close", onClose));
2341
+ }
2342
+ this.observePage(page);
2343
+ }
2344
+ download(download) {
2345
+ if (this.admitText("download-cancelled", download.suggestedFilename(), download.url())) this.push({
2346
+ kind: "download-cancelled",
2347
+ suggested_filename: this.secrets.redact(download.suggestedFilename()),
2348
+ url: this.safeUrl(download.url())
2349
+ });
2350
+ void download.cancel().catch((cause) => {
2351
+ void cause;
2352
+ });
2353
+ }
2354
+ };
2355
+ })))();
2356
+ }
2357
+
2358
+ //#endregion
2359
+ //#region dist/browser/PlaywrightScenarioStorage.js
2360
+ var breakpointResponse, scriptIdentifierResponse, storageKeyResponse, targetInfoResponse, STORAGE_EVENT_METHODS, attachedTargetEvent, targetSessionEvent, nestedMessageEvent, nestedProtocolMessage, executionContextEvent, scriptParsedEvent, pausedEvent, evaluationResponse, STORAGE_CLEANUP_TIMEOUT_MS, PlaywrightScenarioStorage;
2361
+ function init_PlaywrightScenarioStorage() {
2362
+ return (init_PlaywrightScenarioStorage = __esmMin((() => {
2363
+ init_AnalysisCleanupLease();
2364
+ init_browserObservationError();
2365
+ init_PlaywrightExecutionBoundary();
2366
+ breakpointResponse = z.object({ breakpointId: z.string() });
2367
+ scriptIdentifierResponse = z.object({ identifier: z.string() });
2368
+ storageKeyResponse = z.object({ storageKey: z.string() });
2369
+ targetInfoResponse = z.object({ targetInfo: z.object({ targetId: z.string() }) });
2370
+ STORAGE_EVENT_METHODS = new Set([
2371
+ "Runtime.executionContextCreated",
2372
+ "Runtime.executionContextDestroyed",
2373
+ "Runtime.executionContextsCleared",
2374
+ "Debugger.scriptParsed",
2375
+ "Debugger.paused",
2376
+ "Target.attachedToTarget",
2377
+ "Target.detachedFromTarget",
2378
+ "Target.receivedMessageFromTarget"
2379
+ ]);
2380
+ attachedTargetEvent = z.object({
2381
+ sessionId: z.string(),
2382
+ targetInfo: z.object({
2383
+ type: z.string(),
2384
+ targetId: z.string()
2385
+ })
2386
+ });
2387
+ targetSessionEvent = z.object({ sessionId: z.string() });
2388
+ nestedMessageEvent = z.object({
2389
+ sessionId: z.string(),
2390
+ message: z.string()
2391
+ });
2392
+ nestedProtocolMessage = z.object({
2393
+ id: z.number().optional(),
2394
+ method: z.string().optional(),
2395
+ params: z.unknown().optional(),
2396
+ result: z.unknown().optional(),
2397
+ error: z.object({ message: z.string() }).optional()
2398
+ });
2399
+ executionContextEvent = z.object({ context: z.object({
2400
+ id: z.number(),
2401
+ origin: z.string(),
2402
+ name: z.string(),
2403
+ auxData: z.object({ frameId: z.string().optional() }).optional()
2404
+ }) });
2405
+ scriptParsedEvent = z.object({
2406
+ scriptId: z.string(),
2407
+ executionContextId: z.number(),
2408
+ url: z.string()
2409
+ });
2410
+ pausedEvent = z.object({ callFrames: z.array(z.object({
2411
+ callFrameId: z.string(),
2412
+ location: z.object({ scriptId: z.string() })
2413
+ })) });
2414
+ evaluationResponse = z.object({ exceptionDetails: z.unknown().optional() });
2415
+ STORAGE_CLEANUP_TIMEOUT_MS = 1e3;
2416
+ PlaywrightScenarioStorage = class PlaywrightScenarioStorage {
2417
+ cdp;
2418
+ signal;
2419
+ #seeds = new Map();
2420
+ #initializedLocal = new Set();
2421
+ #initializedSession = new Set();
2422
+ #targets = new Map();
2423
+ #replies = new Map();
2424
+ #sourceUrl = `rea-storage-${randomUUID()}`;
2425
+ #listeners = [];
2426
+ #sequence = 0;
2427
+ #generation = 0;
2428
+ #closed = false;
2429
+ #cleanupCompleted = false;
2430
+ #loadingStopped = false;
2431
+ #failure;
2432
+ #closePromise;
2433
+ #detachPromise;
2434
+ #rootInitialization;
2435
+ #work = Promise.resolve();
2436
+ #removeListeners = () => undefined;
2437
+ constructor(cdp, signal) {
2438
+ this.cdp = cdp;
2439
+ this.signal = signal;
2440
+ }
2441
+ static async create(storagePage, scenario, secrets, options = {}) {
2442
+ const { signal, retainCleanup } = options;
2443
+ const { context, page } = storagePage;
2444
+ if (scenario.storage.local_storage.length === 0 && scenario.storage.session_storage.length === 0) return undefined;
2445
+ const connection = context.newCDPSession(page);
2446
+ let cdp;
2447
+ try {
2448
+ cdp = await withPlaywrightExecutionBoundary(() => connection, undefined, signal);
2449
+ } catch (cause) {
2450
+ if (signal?.aborted === true) {
2451
+ let detached = false;
2452
+ const lateCleanup = async () => {
2453
+ let session;
2454
+ try {
2455
+ session = await connection;
2456
+ } catch {
2457
+ return;
2458
+ }
2459
+ if (!detached) {
2460
+ await session.detach();
2461
+ detached = true;
2462
+ }
2463
+ };
2464
+ const cleanup = new AnalysisCleanupLease(lateCleanup, ["browser_storage_transport"]);
2465
+ retainCleanup?.(cleanup);
2466
+ void withPlaywrightExecutionBoundary(() => cleanup.release(), STORAGE_CLEANUP_TIMEOUT_MS).catch(() => undefined);
2467
+ }
2468
+ throw cause;
2469
+ }
2470
+ const owner = new PlaywrightScenarioStorage(cdp, signal);
2471
+ owner.addSeeds(scenario.storage.local_storage, "local", secrets);
2472
+ owner.addSeeds(scenario.storage.session_storage, "session", secrets);
2473
+ return owner;
2474
+ }
2475
+ async initialize(page, context) {
2476
+ const initialization = this.initializeRoot(page, context);
2477
+ this.#rootInitialization = initialization;
2478
+ await withPlaywrightExecutionBoundary(() => initialization, undefined, this.signal);
2479
+ }
2480
+ async initializeRoot(page, context) {
2481
+ const rootInfo = targetInfoResponse.parse(await this.cdp.send("Target.getTargetInfo"));
2482
+ if (this.#closed) return;
2483
+ const root = this.createTarget(undefined, rootInfo.targetInfo.targetId, (method, params) => this.cdp.send(method, params));
2484
+ this.#targets.set("", root);
2485
+ this.listen(page, context);
2486
+ const ready = this.initializeTarget(root);
2487
+ root.ready = ready;
2488
+ await ready;
2489
+ }
2490
+ addSeeds(blocks, kind, secrets) {
2491
+ for (const { origin, entries } of blocks) {
2492
+ const seed = this.#seeds.get(origin) ?? {
2493
+ local: [],
2494
+ session: []
2495
+ };
2496
+ seed[kind].push(...entries.map(({ name, value }) => [name, secrets.value(value)]));
2497
+ this.#seeds.set(origin, seed);
2498
+ }
2499
+ }
2500
+ listen(page, context) {
2501
+ const browser = context.browser();
2502
+ const detached = () => this.targetDetached("");
2503
+ page.on("close", detached);
2504
+ context.on("close", detached);
2505
+ browser?.on("disconnected", detached);
2506
+ this.#removeListeners = () => {
2507
+ page.off("close", detached);
2508
+ context.off("close", detached);
2509
+ browser?.off("disconnected", detached);
2510
+ };
2511
+ for (const method of [
2512
+ "Runtime.executionContextCreated",
2513
+ "Runtime.executionContextDestroyed",
2514
+ "Runtime.executionContextsCleared",
2515
+ "Debugger.scriptParsed",
2516
+ "Debugger.paused",
2517
+ "Target.attachedToTarget",
2518
+ "Target.detachedFromTarget",
2519
+ "Target.receivedMessageFromTarget"
2520
+ ]) {
2521
+ const listener = (params) => this.event("", method, params);
2522
+ this.#listeners.push({
2523
+ method,
2524
+ listener
2525
+ });
2526
+ this.cdp.on(method, listener);
2527
+ }
2528
+ }
2529
+ createTarget(parentId, topLevelTargetId, send) {
2530
+ return {
2531
+ parentId,
2532
+ topLevelTargetId,
2533
+ send,
2534
+ contexts: new Map(),
2535
+ scripts: new Map(),
2536
+ ready: Promise.resolve(),
2537
+ waitingForDebugger: false
2538
+ };
2539
+ }
2540
+ async initializeTarget(target) {
2541
+ if (this.#closed) return;
2542
+ await target.send("Page.enable");
2543
+ if (this.#closed) return;
2544
+ await target.send("Runtime.enable");
2545
+ if (this.#closed) return;
2546
+ await target.send("Debugger.enable");
2547
+ if (this.#closed) return;
2548
+ breakpointResponse.parse(await target.send("Debugger.setBreakpointByUrl", {
2549
+ url: this.#sourceUrl,
2550
+ lineNumber: 1
2551
+ }));
2552
+ if (this.#closed) return;
2553
+ scriptIdentifierResponse.parse(await target.send("Page.addScriptToEvaluateOnNewDocument", {
2554
+ worldName: this.#sourceUrl,
2555
+ source: `(() => {\n void 0;\n})()\n//# sourceURL=${this.#sourceUrl}`
2556
+ }));
2557
+ if (this.#closed) return;
2558
+ await target.send("Target.setAutoAttach", {
2559
+ autoAttach: true,
2560
+ waitForDebuggerOnStart: true,
2561
+ flatten: false
2562
+ });
2563
+ }
2564
+ sendObserved(target, method, params) {
2565
+ return withPlaywrightExecutionBoundary(() => target.send(method, params), undefined, this.signal);
2566
+ }
2567
+ event(sessionId, method, params) {
2568
+ if (this.#closed) return;
2569
+ const target = this.#targets.get(sessionId);
2570
+ if (target === undefined) return;
2571
+ try {
2572
+ if (method === "Runtime.executionContextCreated") {
2573
+ const { context } = executionContextEvent.parse(params);
2574
+ if (context.name === this.#sourceUrl) target.contexts.set(context.id, context);
2575
+ } else if (method === "Runtime.executionContextDestroyed") {
2576
+ const { executionContextId } = z.object({ executionContextId: z.number() }).parse(params);
2577
+ target.contexts.delete(executionContextId);
2578
+ } else if (method === "Runtime.executionContextsCleared") {
2579
+ target.contexts.clear();
2580
+ target.scripts.clear();
2581
+ } else if (method === "Debugger.scriptParsed") {
2582
+ const script = scriptParsedEvent.parse(params);
2583
+ if (script.url === this.#sourceUrl) target.scripts.set(script.scriptId, script.executionContextId);
2584
+ } else if (method === "Debugger.paused") {
2585
+ const pause = pausedEvent.parse(params);
2586
+ const frame = pause.callFrames[0];
2587
+ if (frame === undefined || !target.scripts.has(frame.location.scriptId)) return;
2588
+ this.#generation += 1;
2589
+ this.#work = this.#work.then(() => this.seed(target, pause)).catch((cause) => {
2590
+ if (sessionId === "" || this.#targets.get(sessionId) === target) this.fail(cause);
2591
+ });
2592
+ } else if (method === "Target.attachedToTarget") {
2593
+ this.#generation += 1;
2594
+ this.attach(sessionId, attachedTargetEvent.parse(params));
2595
+ } else if (method === "Target.detachedFromTarget") {
2596
+ this.#generation += 1;
2597
+ this.targetDetached(targetSessionEvent.parse(params).sessionId);
2598
+ } else if (method === "Target.receivedMessageFromTarget") {
2599
+ this.nestedMessage(nestedMessageEvent.parse(params));
2600
+ }
2601
+ } catch (cause) {
2602
+ this.fail(cause);
2603
+ }
2604
+ }
2605
+ nestedMessage(event) {
2606
+ const reply = nestedProtocolMessage.parse(JSON.parse(event.message));
2607
+ if (reply.id !== undefined) {
2608
+ const waiter = this.#replies.get(reply.id);
2609
+ if (waiter?.sessionId !== event.sessionId) return;
2610
+ this.#replies.delete(reply.id);
2611
+ if (reply.error !== undefined) waiter.reject(new Error(reply.error.message));
2612
+ else waiter.resolve(reply.result);
2613
+ return;
2614
+ }
2615
+ if (reply.method !== undefined && STORAGE_EVENT_METHODS.has(reply.method)) this.event(event.sessionId, reply.method, reply.params);
2616
+ }
2617
+ fail(cause) {
2618
+ this.#generation += 1;
2619
+ this.#failure ??= new BrowserObservationError("capture_browser_scenario", "protocol_error", { cause });
2620
+ }
2621
+ async seedPausedFrame(target, frame) {
2622
+ const contextId = target.scripts.get(frame.location.scriptId);
2623
+ const context = contextId === undefined ? undefined : target.contexts.get(contextId);
2624
+ const seed = context === undefined ? undefined : this.#seeds.get(context.origin);
2625
+ if (this.#closed || seed === undefined || context?.auxData?.frameId === undefined) return;
2626
+ const storageKey = storageKeyResponse.parse(await this.sendObserved(target, "Storage.getStorageKey", { frameId: context.auxData.frameId })).storageKey;
2627
+ const sessionKey = JSON.stringify([target.topLevelTargetId, storageKey]);
2628
+ const local = this.#initializedLocal.has(storageKey) || seed.local.length === 0 ? [] : seed.local;
2629
+ const session = this.#initializedSession.has(sessionKey) || seed.session.length === 0 ? [] : seed.session;
2630
+ if (local.length === 0 && session.length === 0) return;
2631
+ const payload = JSON.stringify({
2632
+ local,
2633
+ session
2634
+ }).replaceAll("<", "\\u003c");
2635
+ const response = evaluationResponse.parse(await this.sendObserved(target, "Debugger.evaluateOnCallFrame", {
2636
+ callFrameId: frame.callFrameId,
2637
+ expression: `(() => { const seed = ${payload}; for (const [name, value] of seed.local) localStorage.setItem(name, value); for (const [name, value] of seed.session) sessionStorage.setItem(name, value); })()`,
2638
+ returnByValue: true
2639
+ }));
2640
+ if (response.exceptionDetails !== undefined) throw new BrowserObservationError("capture_browser_scenario", "protocol_error", { detail: "The browser denied initial storage initialization." });
2641
+ if (local.length > 0) this.#initializedLocal.add(storageKey);
2642
+ if (session.length > 0) this.#initializedSession.add(sessionKey);
2643
+ }
2644
+ async seed(target, pause) {
2645
+ const frame = pause.callFrames[0];
2646
+ if (frame === undefined) return;
2647
+ let primaryFailure;
2648
+ let hasPrimaryFailure = false;
2649
+ try {
2650
+ await this.seedPausedFrame(target, frame);
2651
+ } catch (cause) {
2652
+ primaryFailure = cause;
2653
+ hasPrimaryFailure = true;
2654
+ }
2655
+ let resumeFailure;
2656
+ try {
2657
+ await withPlaywrightExecutionBoundary(() => target.send("Debugger.resume"), STORAGE_CLEANUP_TIMEOUT_MS);
2658
+ } catch (cause) {
2659
+ resumeFailure = cause;
2660
+ }
2661
+ if (hasPrimaryFailure && resumeFailure !== undefined) throw new AggregateError([primaryFailure, resumeFailure], "Storage initialization and debugger resume both failed", { cause: primaryFailure });
2662
+ if (this.signal?.aborted === true && resumeFailure === undefined) return;
2663
+ if (hasPrimaryFailure) throw primaryFailure;
2664
+ if (resumeFailure !== undefined) throw resumeFailure;
2665
+ }
2666
+ attach(parentId, event) {
2667
+ const parent = this.#targets.get(parentId);
2668
+ if (parent === undefined) return;
2669
+ const { sessionId, targetInfo } = event;
2670
+ const target = this.createTarget(parentId, event.targetInfo.type === "iframe" ? parent.topLevelTargetId : event.targetInfo.targetId, async (method, params = {}) => {
2671
+ const id = ++this.#sequence;
2672
+ const reply = new Promise((resolve, reject) => this.#replies.set(id, {
2673
+ sessionId,
2674
+ resolve,
2675
+ reject
2676
+ }));
2677
+ try {
2678
+ const sent = parent.send("Target.sendMessageToTarget", {
2679
+ sessionId,
2680
+ message: JSON.stringify({
2681
+ id,
2682
+ method,
2683
+ params
2684
+ })
2685
+ });
2686
+ const [, result] = await Promise.all([sent, reply]);
2687
+ return result;
2688
+ } finally {
2689
+ this.#replies.delete(id);
2690
+ }
2691
+ });
2692
+ target.waitingForDebugger = true;
2693
+ this.#targets.set(sessionId, target);
2694
+ target.ready = (async () => {
2695
+ try {
2696
+ if (!this.#closed && (targetInfo.type === "iframe" || targetInfo.type === "page")) await this.initializeTarget(target);
2697
+ } catch (cause) {
2698
+ if (this.signal?.aborted !== true && !this.#closed && this.#targets.get(sessionId) === target) this.fail(cause);
2699
+ }
2700
+ if (this.#targets.get(sessionId) !== target) return;
2701
+ try {
2702
+ await withPlaywrightExecutionBoundary(() => target.send("Runtime.runIfWaitingForDebugger"), STORAGE_CLEANUP_TIMEOUT_MS);
2703
+ target.waitingForDebugger = false;
2704
+ } catch (cause) {
2705
+ if (this.signal?.aborted !== true && !this.#closed && this.#targets.get(sessionId) === target) this.fail(cause);
2706
+ }
2707
+ })();
2708
+ }
2709
+ targetDetached(sessionId) {
2710
+ for (const [id, target] of this.#targets) if (target.parentId === sessionId) this.targetDetached(id);
2711
+ this.#targets.delete(sessionId);
2712
+ for (const [id, reply] of this.#replies) if (reply.sessionId === sessionId) {
2713
+ this.#replies.delete(id);
2714
+ reply.reject(new BrowserObservationError("capture_browser_scenario", "disconnected"));
2715
+ }
2716
+ this.#generation += 1;
2717
+ }
2718
+ async settle() {
2719
+ for (;;) {
2720
+ const generation = this.#generation;
2721
+ const work = this.#work;
2722
+ const targets = [...this.#targets.entries()];
2723
+ await withPlaywrightExecutionBoundary(() => Promise.all(targets.map(([, target]) => target.ready)), undefined, this.signal);
2724
+ await withPlaywrightExecutionBoundary(() => work, undefined, this.signal);
2725
+ await Promise.resolve();
2726
+ if (this.#failure !== undefined) throw this.#failure;
2727
+ if (generation === this.#generation && work === this.#work && targets.every(([id, target]) => this.#targets.get(id) === target)) return;
2728
+ }
2729
+ }
2730
+ close(stopLoading = false) {
2731
+ if (this.#cleanupCompleted) return Promise.resolve({ loadingStopped: this.#loadingStopped });
2732
+ if (this.#closePromise !== undefined) return this.#closePromise;
2733
+ const closing = this.closeResources(stopLoading).catch((cause) => {
2734
+ throw new BrowserObservationError("capture_browser_scenario", "cleanup_failed", {
2735
+ cause,
2736
+ cleanup: {
2737
+ reason: cause instanceof Error ? cause.message : String(cause),
2738
+ resources: ["browser_transport", "browser_storage_bootstrap"]
2739
+ }
2740
+ });
2741
+ });
2742
+ this.#closePromise = closing;
2743
+ void closing.catch(() => {
2744
+ if (this.#closePromise === closing) this.#closePromise = undefined;
2745
+ });
2746
+ return closing;
2747
+ }
2748
+ async closeResources(stopLoading) {
2749
+ this.#closed = true;
2750
+ let stopLoadingFailure;
2751
+ if (stopLoading && !this.#loadingStopped) {
2752
+ try {
2753
+ const root = this.#targets.get("");
2754
+ if (root !== undefined) {
2755
+ await withPlaywrightExecutionBoundary(() => root.send("Page.stopLoading"), STORAGE_CLEANUP_TIMEOUT_MS);
2756
+ this.#loadingStopped = true;
2757
+ }
2758
+ } catch (cause) {
2759
+ stopLoadingFailure = { cause };
2760
+ }
2761
+ }
2762
+ const work = this.#work;
2763
+ const rootInitialization = this.#rootInitialization;
2764
+ const targets = [...this.#targets.values()];
2765
+ try {
2766
+ await withPlaywrightExecutionBoundary(() => Promise.all([
2767
+ work.catch(() => undefined),
2768
+ ...rootInitialization === undefined ? [] : [rootInitialization.catch(() => undefined)],
2769
+ ...targets.map((target) => target.ready.catch(() => undefined))
2770
+ ]), STORAGE_CLEANUP_TIMEOUT_MS);
2771
+ } catch {}
2772
+ let detach = this.#detachPromise;
2773
+ if (detach === undefined) {
2774
+ detach = Promise.resolve().then(() => this.cdp.detach());
2775
+ this.#detachPromise = detach;
2776
+ void detach.catch(() => {
2777
+ if (this.#detachPromise === detach) this.#detachPromise = undefined;
2778
+ });
2779
+ }
2780
+ await withPlaywrightExecutionBoundary(() => detach, STORAGE_CLEANUP_TIMEOUT_MS);
2781
+ for (const { method, listener } of this.#listeners) this.cdp.off(method, listener);
2782
+ this.#removeListeners();
2783
+ for (const reply of this.#replies.values()) reply.reject(new BrowserObservationError("capture_browser_scenario", "disconnected"));
2784
+ this.#targets.clear();
2785
+ this.#replies.clear();
2786
+ this.#cleanupCompleted = true;
2787
+ if (stopLoadingFailure !== undefined) throw stopLoadingFailure.cause;
2788
+ return { loadingStopped: this.#loadingStopped };
2789
+ }
2790
+ };
2791
+ })))();
2792
+ }
2793
+
2794
+ //#endregion
2795
+ //#region dist/browser/PlaywrightScenarioServiceWorkers.js
2796
+ var OPERATION$1, POLICY_CLEANUP_CONFIRMATION_TIMEOUT_MS, scriptResponse, restorationResponse, attachedEvent, detachedEvent, PlaywrightScenarioServiceWorkers;
2797
+ function init_PlaywrightScenarioServiceWorkers() {
2798
+ return (init_PlaywrightScenarioServiceWorkers = __esmMin((() => {
2799
+ init_browserObservation();
2800
+ init_browserObservationError();
2801
+ init_CdpConnection();
2802
+ init_CdpEndpoint();
2803
+ init_CdpTargetSession();
2804
+ init_PlaywrightExecutionBoundary();
2805
+ OPERATION$1 = "capture_browser_scenario";
2806
+ POLICY_CLEANUP_CONFIRMATION_TIMEOUT_MS = 5e3;
2807
+ scriptResponse = z.object({ identifier: z.string() });
2808
+ restorationResponse = z.object({ result: z.object({ value: z.literal("policy_owned").nullable() }) });
2809
+ attachedEvent = z.object({
2810
+ sessionId: z.string(),
2811
+ targetInfo: z.object({ type: z.string() })
2812
+ });
2813
+ detachedEvent = z.object({ sessionId: z.string() });
2814
+ PlaywrightScenarioServiceWorkers = class {
2815
+ page;
2816
+ endpoint;
2817
+ targetId;
2818
+ marker = JSON.stringify(`rea-service-workers-${randomUUID()}`);
2819
+ restoreKey = JSON.stringify(`rea-restore-${randomUUID()}`);
2820
+ secret = JSON.stringify(randomUUID());
2821
+ #initialization;
2822
+ #restoration;
2823
+ #session;
2824
+ #targets = new Map();
2825
+ #closed = false;
2826
+ #released = false;
2827
+ #detached = false;
2828
+ #loadingStopped = false;
2829
+ #removeListener;
2830
+ #setup = new AbortController();
2831
+ constructor(page, endpoint, targetId) {
2832
+ this.page = page;
2833
+ this.endpoint = endpoint;
2834
+ this.targetId = targetId;
2835
+ }
2836
+ initialize() {
2837
+ return this.#initialization ??= this.install();
2838
+ }
2839
+ async install() {
2840
+ this.#session = await withCdpDiscoveryDeadline(OPERATION$1, this.#setup.signal, async (signal) => {
2841
+ await withPlaywrightExecutionBoundary(() => this.assertBlocked(), undefined, signal);
2842
+ const opened = await openCdpEndpoint(browserObservationEndpointSchema.parse(this.endpoint), OPERATION$1, signal);
2843
+ const target = opened.discovery.targets.find(({ id }) => id === this.targetId);
2844
+ if (target === undefined) {
2845
+ await opened.connection?.close();
2846
+ throw new BrowserObservationError(OPERATION$1, "target_not_found");
2847
+ }
2848
+ const connection = opened.connection ?? await CdpConnection.connect(opened.discovery.webSocket.url, OPERATION$1, signal);
2849
+ return await attachCdpTargetSession(connection, target, OPERATION$1, signal);
2850
+ });
2851
+ const connection = this.#session.connection;
2852
+ this.#removeListener = connection.onEvent((event) => {
2853
+ if (event.method === "Target.attachedToTarget" && this.#targets.has(event.sessionId ?? "")) {
2854
+ const { sessionId, targetInfo } = attachedEvent.parse(event.params);
2855
+ if (targetInfo.type === "iframe") this.addTarget(sessionId);
2856
+ } else if (event.method === "Target.detachedFromTarget") {
2857
+ const id = detachedEvent.parse(event.params).sessionId;
2858
+ this.#targets.get(id)?.markDetached();
2859
+ this.#targets.delete(id);
2860
+ if (id === this.#session?.sessionId) this.#detached = true;
2861
+ }
2862
+ });
2863
+ const id = this.#session.sessionId;
2864
+ if (id === undefined) throw new BrowserObservationError(OPERATION$1, "protocol_error");
2865
+ this.addTarget(id);
2866
+ await this.settle();
2867
+ await withPlaywrightExecutionBoundary(() => this.assertBlocked(), undefined, this.#setup.signal);
2868
+ }
2869
+ addTarget(id) {
2870
+ this.#targets.get(id)?.markDetached();
2871
+ let markDetached = () => undefined;
2872
+ const detached = new Promise((resolve) => {
2873
+ markDetached = resolve;
2874
+ });
2875
+ const target = {
2876
+ id,
2877
+ detached,
2878
+ markDetached,
2879
+ ready: Promise.resolve()
2880
+ };
2881
+ this.#targets.set(id, target);
2882
+ const ready = this.initializeTarget(target);
2883
+ target.ready = ready;
2884
+ void ready.catch(() => undefined);
2885
+ }
2886
+ async initializeTarget(target) {
2887
+ try {
2888
+ if (this.#closed) return;
2889
+ await this.send(target.id, "Page.enable");
2890
+ if (this.#closed) return;
2891
+ const added = scriptResponse.parse(await this.send(target.id, "Page.addScriptToEvaluateOnNewDocument", {
2892
+ runImmediately: true,
2893
+ source: `(() => {
2894
+ if (!("serviceWorker" in navigator)) return;
2895
+ const prototype = ServiceWorkerContainer.prototype;
2896
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, "register");
2897
+ if (typeof descriptor?.value === "function" && Object.hasOwn(descriptor.value, Symbol.for(${this.marker}))) return;
2898
+ const register = () => Promise.reject(new Error("service workers are blocked by scenario policy"));
2899
+ Object.defineProperty(register, Symbol.for(${this.marker}), { value: true });
2900
+ const secret = ${this.secret};
2901
+ Object.defineProperty(globalThis, ${this.restoreKey}, { configurable: true, value: (provided) => {
2902
+ if (provided !== secret) return false;
2903
+ if (Object.getOwnPropertyDescriptor(prototype, "register")?.value === register) {
2904
+ if (descriptor === undefined) delete prototype.register;
2905
+ else Object.defineProperty(prototype, "register", descriptor);
2906
+ }
2907
+ delete globalThis[${this.restoreKey}];
2908
+ return true;
2909
+ }});
2910
+ Object.defineProperty(prototype, "register", { ...descriptor, configurable: true, value: register });
2911
+ })()`
2912
+ }));
2913
+ target.identifier = added.identifier;
2914
+ if (!this.#closed) await this.send(target.id, "Target.setAutoAttach", {
2915
+ autoAttach: true,
2916
+ waitForDebuggerOnStart: true,
2917
+ flatten: true,
2918
+ filter: [{
2919
+ type: "iframe",
2920
+ exclude: false
2921
+ }, { exclude: true }]
2922
+ });
2923
+ } finally {
2924
+ if (this.#targets.has(target.id) && target.id !== this.#session?.sessionId) await this.send(target.id, "Runtime.runIfWaitingForDebugger");
2925
+ }
2926
+ }
2927
+ send(id, method, params = {}) {
2928
+ if (this.#session === undefined) throw new BrowserObservationError(OPERATION$1, "disconnected");
2929
+ return this.#session.connection.send(method, params, id);
2930
+ }
2931
+ async settle() {
2932
+ for (;;) {
2933
+ const targets = [...this.#targets.values()];
2934
+ await Promise.all(targets.map((target) => this.settleTarget(target)));
2935
+ if (targets.length === this.#targets.size && targets.every((target) => this.#targets.get(target.id) === target)) return;
2936
+ }
2937
+ }
2938
+ async settleTarget(target) {
2939
+ try {
2940
+ await Promise.race([target.ready, target.detached]);
2941
+ } catch (cause) {
2942
+ if (this.#targets.get(target.id) === target) throw cause;
2943
+ }
2944
+ }
2945
+ async settleTargetForRestore(target) {
2946
+ try {
2947
+ await Promise.race([target.ready, target.detached]);
2948
+ } catch {}
2949
+ }
2950
+ restorationScript() {
2951
+ return `(() => {
2952
+ const restore = globalThis[${this.restoreKey}];
2953
+ if (typeof restore === "function" && restore(${this.secret}) === true) return null;
2954
+ const register = globalThis.ServiceWorkerContainer?.prototype.register;
2955
+ return typeof register === "function" && Object.hasOwn(register, Symbol.for(${this.marker}))
2956
+ ? "policy_owned"
2957
+ : null;
2958
+ })()`;
2959
+ }
2960
+ async restoreMainFrame(id) {
2961
+ const { result } = restorationResponse.parse(await this.send(id, "Runtime.evaluate", {
2962
+ expression: this.restorationScript(),
2963
+ returnByValue: true
2964
+ }));
2965
+ if (result.value === "policy_owned") throw new Error("service-worker policy restoration could not be confirmed");
2966
+ }
2967
+ async restorePlaywrightFrame(frame) {
2968
+ try {
2969
+ const failure = await frame.evaluate(this.restorationScript());
2970
+ if (failure === "policy_owned") throw new Error("service-worker policy restoration could not be confirmed");
2971
+ if (failure !== null) throw new BrowserObservationError(OPERATION$1, "protocol_error");
2972
+ } catch (cause) {
2973
+ if (!this.page.isClosed() && !frame.isDetached()) throw cause;
2974
+ }
2975
+ }
2976
+ async stopMainFrame(frame) {
2977
+ try {
2978
+ await frame.evaluate("globalThis.stop()");
2979
+ this.#loadingStopped = true;
2980
+ } catch (cause) {
2981
+ if (!this.page.isClosed() && !frame.isDetached()) throw cause;
2982
+ }
2983
+ }
2984
+ async assertBlocked() {
2985
+ if (this.#session !== undefined) await this.settle();
2986
+ for (const frame of this.page.frames()) {
2987
+ let failure;
2988
+ try {
2989
+ failure = await frame.evaluate(`(async () => {
2990
+ if (!("serviceWorker" in navigator)) return null;
2991
+ const serviceWorker = navigator.serviceWorker;
2992
+ if (${this.#session !== undefined} &&
2993
+ (!Object.hasOwn(serviceWorker.register, Symbol.for(${this.marker})) ||
2994
+ typeof globalThis[${this.restoreKey}] !== "function")) return "policy_unprotected";
2995
+ if (serviceWorker.controller !== null) return "service_worker_blocked";
2996
+ return (await serviceWorker.getRegistrations()).length > 0
2997
+ ? "service_worker_blocked"
2998
+ : null;
2999
+ })()`);
3000
+ } catch (cause) {
3001
+ if (frame.isDetached()) continue;
3002
+ throw cause;
3003
+ }
3004
+ if (failure === "policy_unprotected") throw new BrowserObservationError(OPERATION$1, "target_not_allowed");
3005
+ if (failure === "service_worker_blocked") throw new BrowserObservationError(OPERATION$1, "service_worker_blocked");
3006
+ if (failure !== null) throw new BrowserObservationError(OPERATION$1, "protocol_error");
3007
+ }
3008
+ }
3009
+ close(stopLoading = false) {
3010
+ this.#closed = true;
3011
+ this.#setup.abort();
3012
+ const restoration = this.#restoration ??= this.restore(stopLoading);
3013
+ void restoration.then(() => {
3014
+ if (this.#restoration === restoration) this.#restoration = undefined;
3015
+ }, () => {
3016
+ if (this.#restoration === restoration) this.#restoration = undefined;
3017
+ });
3018
+ return withPlaywrightExecutionBoundary(() => restoration, POLICY_CLEANUP_CONFIRMATION_TIMEOUT_MS);
3019
+ }
3020
+ async restore(stopLoading) {
3021
+ await this.#initialization?.catch(() => undefined);
3022
+ if (this.#released) return;
3023
+ const session = this.#session;
3024
+ if (session === undefined) return;
3025
+ if (!this.page.isClosed()) {
3026
+ const mainFrame = this.page.mainFrame();
3027
+ if (stopLoading && !this.#loadingStopped) {
3028
+ if (!this.#detached && session.sessionId !== undefined) {
3029
+ await this.send(session.sessionId, "Page.stopLoading");
3030
+ this.#loadingStopped = true;
3031
+ } else {
3032
+ await this.stopMainFrame(mainFrame);
3033
+ }
3034
+ }
3035
+ await Promise.all([...this.#targets.values()].map((target) => this.settleTargetForRestore(target)));
3036
+ for (const target of this.#targets.values()) {
3037
+ if (!this.#detached && target.identifier !== undefined) {
3038
+ try {
3039
+ await this.send(target.id, "Page.removeScriptToEvaluateOnNewDocument", { identifier: target.identifier });
3040
+ } catch (cause) {
3041
+ if (this.#targets.get(target.id) === target) throw cause;
3042
+ }
3043
+ delete target.identifier;
3044
+ }
3045
+ }
3046
+ if (!this.#detached && session.sessionId !== undefined) {
3047
+ await this.restoreMainFrame(session.sessionId);
3048
+ } else {
3049
+ await this.restorePlaywrightFrame(mainFrame);
3050
+ }
3051
+ for (const frame of this.page.frames()) {
3052
+ if (frame === mainFrame) continue;
3053
+ if (frame.isDetached()) continue;
3054
+ if (frame.url().length === 0) continue;
3055
+ await this.restorePlaywrightFrame(frame);
3056
+ }
3057
+ }
3058
+ if (!this.page.isClosed() && !this.#detached && session.sessionId !== undefined) {
3059
+ await session.connection.send("Target.detachFromTarget", { sessionId: session.sessionId });
3060
+ this.#detached = true;
3061
+ }
3062
+ this.#removeListener?.();
3063
+ await session.connection.close();
3064
+ this.#released = true;
3065
+ }
3066
+ };
3067
+ })))();
3068
+ }
3069
+
3070
+ //#endregion
3071
+ //#region dist/browser/PlaywrightScenarioSession.js
3072
+ var OPERATION, throwIfScenarioCancelled, throwCleanupFailures, installCookies, initializePage, PlaywrightScenarioSession;
3073
+ function init_PlaywrightScenarioSession() {
3074
+ return (init_PlaywrightScenarioSession = __esmMin((() => {
3075
+ init_AnalysisCleanupLease();
3076
+ init_analysisErrorBase();
3077
+ init_browserObservationError();
3078
+ init_BrowserScenarioSecrets();
3079
+ init_PlaywrightScenarioBrowser();
3080
+ init_PlaywrightScenarioActions();
3081
+ init_PlaywrightScenarioArtifacts();
3082
+ init_PlaywrightScenarioEvents();
3083
+ init_PlaywrightScenarioStorage();
3084
+ init_PlaywrightScenarioServiceWorkers();
3085
+ init_PlaywrightExecutionBoundary();
3086
+ init_BrowserScenarioPartialObservation();
3087
+ OPERATION = "capture_browser_scenario";
3088
+ throwIfScenarioCancelled = (signal) => {
3089
+ if (signal?.aborted === true) throw new BrowserObservationError(OPERATION, "cancelled", { cause: signal?.reason });
3090
+ };
3091
+ throwCleanupFailures = (failures) => {
3092
+ if (failures.length === 1) throw failures[0];
3093
+ if (failures.length > 1) throw new AggregateError(failures, "Browser scenario cleanup failed");
3094
+ };
3095
+ installCookies = async (context, scenario, secrets) => {
3096
+ await context.addCookies(scenario.storage.cookies.map((cookie) => ({
3097
+ name: cookie.name,
3098
+ value: secrets.value(cookie.value),
3099
+ url: secrets.url(cookie.destination),
3100
+ httpOnly: cookie.http_only,
3101
+ secure: cookie.secure,
3102
+ sameSite: cookie.same_site
3103
+ })));
3104
+ };
3105
+ initializePage = async (context, scenario, secrets) => {
3106
+ context.setDefaultTimeout(0);
3107
+ context.setDefaultNavigationTimeout(0);
3108
+ await installCookies(context, scenario, secrets);
3109
+ };
3110
+ PlaywrightScenarioSession = class PlaywrightScenarioSession {
3111
+ opened;
3112
+ mode;
3113
+ processOwnership;
3114
+ product = "Chromium";
3115
+ version;
3116
+ initialUrl;
3117
+ secrets;
3118
+ eventCapture;
3119
+ storage;
3120
+ serviceWorkers;
3121
+ signal;
3122
+ #storageReleased = false;
3123
+ #stopLoading = false;
3124
+ cleanupLease;
3125
+ #policyStopsLoading = false;
3126
+ constructor(opened, options) {
3127
+ this.opened = opened;
3128
+ this.mode = options.mode;
3129
+ this.processOwnership = options.mode === "launch" ? "provider-owned" : "external";
3130
+ this.secrets = options.secrets;
3131
+ this.eventCapture = options.eventCapture;
3132
+ this.storage = options.storage;
3133
+ this.serviceWorkers = options.serviceWorkers;
3134
+ this.signal = options.signal;
3135
+ this.version = opened.browser.version();
3136
+ this.initialUrl = opened.page.url();
3137
+ this.cleanupLease = new AnalysisCleanupLease(async () => {
3138
+ await this.#closeResources();
3139
+ }, { get cleanupResources() {
3140
+ return opened.cleanup.cleanupResources;
3141
+ } });
3142
+ }
3143
+ static async open(scenario, environment, options) {
3144
+ throwIfScenarioCancelled(options.signal);
3145
+ const secrets = BrowserScenarioSecrets.resolve(scenario, environment);
3146
+ if (secrets === undefined) throw new BrowserObservationError(OPERATION, "secret_unavailable");
3147
+ const startedAt = performance.now();
3148
+ const openingCleanup = new Set();
3149
+ const opening = openPlaywrightScenarioBrowser(scenario, environment, {
3150
+ signal: options.signal,
3151
+ retainCleanup: (lease) => {
3152
+ openingCleanup.add(lease);
3153
+ options.retainCleanup?.(lease);
3154
+ }
3155
+ });
3156
+ let opened;
3157
+ try {
3158
+ opened = await withPlaywrightExecutionBoundary(() => opening, undefined, options.signal);
3159
+ } catch (cause) {
3160
+ let lateOpened;
3161
+ let openingFailure;
3162
+ const cleanup = new AnalysisCleanupLease(async () => {
3163
+ try {
3164
+ lateOpened = await opening;
3165
+ } catch (cause) {
3166
+ openingFailure = cause instanceof AnalysisError && !(options.signal?.aborted === true && cause === options.signal.reason) ? cause : undefined;
3167
+ const results = await Promise.allSettled([...openingCleanup].map((lease) => lease.release()));
3168
+ const failures = results.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
3169
+ throwCleanupFailures(failures);
3170
+ if (openingFailure?.cleanupIncomplete === true) throw openingFailure;
3171
+ return;
3172
+ }
3173
+ await lateOpened.cleanup.release();
3174
+ }, { get cleanupResources() {
3175
+ return lateOpened?.cleanup.cleanupResources ?? openingFailure?.cleanupResources;
3176
+ } });
3177
+ options.retainCleanup?.(cleanup);
3178
+ void withPlaywrightExecutionBoundary(() => cleanup.release(), 1e3).catch(() => undefined);
3179
+ throw cause;
3180
+ }
3181
+ const session = await this.initializeSession(opened, scenario, secrets, options);
3182
+ try {
3183
+ await withPlaywrightExecutionBoundary(() => opened.page.goto(secrets.url(scenario.start_url), {
3184
+ waitUntil: "load",
3185
+ timeout: 0
3186
+ }), undefined, options.signal);
3187
+ await withPlaywrightExecutionBoundary(() => session.serviceWorkers?.assertBlocked() ?? Promise.resolve(), undefined, options.signal);
3188
+ await withPlaywrightExecutionBoundary(() => session.storage?.settle() ?? Promise.resolve(), undefined, options.signal);
3189
+ return session;
3190
+ } catch (cause) {
3191
+ let cleanup;
3192
+ let cleanupFailure;
3193
+ try {
3194
+ cleanup = await session.close(true);
3195
+ } catch (failure) {
3196
+ cleanup = "incomplete";
3197
+ cleanupFailure = { cause: failure };
3198
+ options.retainCleanup?.(session.cleanupLease);
3199
+ }
3200
+ throw browserScenarioOperationFailure(cause, {
3201
+ kind: "browser-scenario-observation",
3202
+ capture: browserScenarioCaptureData({
3203
+ session,
3204
+ scenario,
3205
+ startedAt,
3206
+ steps: [],
3207
+ cleanup,
3208
+ limitations: ["Scenario navigation failed before the initial state was captured."]
3209
+ })
3210
+ }, cleanupFailure);
3211
+ }
3212
+ }
3213
+ static async initializeSession(opened, scenario, secrets, options) {
3214
+ let events;
3215
+ let storage;
3216
+ const serviceWorkers = scenario.browser.mode === "connect" && scenario.environment.service_workers === "block" ? new PlaywrightScenarioServiceWorkers(opened.page, scenario.browser.cdp_endpoint, scenario.browser.target_id) : undefined;
3217
+ try {
3218
+ await withPlaywrightExecutionBoundary(async () => {
3219
+ await serviceWorkers?.initialize();
3220
+ await initializePage(opened.context, scenario, secrets);
3221
+ }, undefined, options.signal);
3222
+ storage = await PlaywrightScenarioStorage.create(opened, scenario, secrets, {
3223
+ ...options.signal === undefined ? {} : { signal: options.signal },
3224
+ ...options.retainCleanup === undefined ? {} : { retainCleanup: options.retainCleanup }
3225
+ });
3226
+ await storage?.initialize(opened.page, opened.context);
3227
+ throwIfScenarioCancelled(options.signal);
3228
+ events = new PlaywrightScenarioEvents({
3229
+ page: opened.page,
3230
+ context: opened.context,
3231
+ ownsContext: scenario.browser.mode === "launch",
3232
+ enabled: new Set(scenario.capture.events),
3233
+ secrets,
3234
+ network: scenario.capture.network,
3235
+ limits: scenario.capture.limits,
3236
+ ...options.signal === undefined ? {} : { signal: options.signal }
3237
+ });
3238
+ return new PlaywrightScenarioSession(opened, {
3239
+ mode: scenario.browser.mode,
3240
+ secrets,
3241
+ eventCapture: events,
3242
+ storage,
3243
+ serviceWorkers,
3244
+ signal: options.signal
3245
+ });
3246
+ } catch (cause) {
3247
+ let storageReleased = false;
3248
+ const storageStopsLoading = storage !== undefined && options.signal?.aborted === true;
3249
+ let policyStopsLoading = !storageStopsLoading;
3250
+ const cleanup = async () => {
3251
+ let storageFailure;
3252
+ let policyFailure;
3253
+ let browserFailure;
3254
+ if (!storageReleased) {
3255
+ try {
3256
+ const result = await storage?.close(storageStopsLoading);
3257
+ if (storageStopsLoading && result?.loadingStopped !== true) policyStopsLoading = true;
3258
+ } catch (failure) {
3259
+ storageFailure = { cause: failure };
3260
+ policyStopsLoading = true;
3261
+ }
3262
+ }
3263
+ try {
3264
+ if (!opened.cleanup.browserClosed) await serviceWorkers?.close(policyStopsLoading);
3265
+ } catch (failure) {
3266
+ policyFailure = { cause: failure };
3267
+ }
3268
+ if (policyFailure === undefined) {
3269
+ try {
3270
+ await opened.cleanup.release(events === undefined ? undefined : () => events?.finish() ?? Promise.resolve());
3271
+ } catch (failure) {
3272
+ browserFailure = { cause: failure };
3273
+ }
3274
+ } else {
3275
+ try {
3276
+ await events?.finish();
3277
+ } catch (failure) {
3278
+ browserFailure = { cause: failure };
3279
+ }
3280
+ }
3281
+ if (opened.cleanup.browserClosed) storageReleased = true;
3282
+ throwCleanupFailures([
3283
+ ...policyFailure === undefined ? [] : [policyFailure.cause],
3284
+ ...storageReleased || storageFailure === undefined ? [] : [storageFailure.cause],
3285
+ ...browserFailure === undefined ? [] : [browserFailure.cause]
3286
+ ]);
3287
+ };
3288
+ const recovery = new AnalysisCleanupLease(cleanup, opened.cleanup);
3289
+ try {
3290
+ return await failBrowserScenarioOperation(recovery, cause);
3291
+ } catch (failure) {
3292
+ if (failure !== cause) options.retainCleanup?.(recovery);
3293
+ throw failure;
3294
+ }
3295
+ }
3296
+ }
3297
+ currentUrl() {
3298
+ return this.opened.page.url();
3299
+ }
3300
+ sanitizeUrl(value) {
3301
+ return this.secrets.sanitizeUrl(value);
3302
+ }
3303
+ setStep(index) {
3304
+ this.eventCapture.setStep(index);
3305
+ }
3306
+ nextEventSequence() {
3307
+ return this.eventCapture.nextSequence();
3308
+ }
3309
+ lastEventSequence() {
3310
+ return this.eventCapture.lastSequence();
3311
+ }
3312
+ events() {
3313
+ return this.eventCapture.result();
3314
+ }
3315
+ /** Preserve event coverage gaps for the aggregate capture's completeness. */
3316
+ eventLimitations() {
3317
+ return this.eventCapture.limitations();
3318
+ }
3319
+ async perform(action, signal) {
3320
+ await withPlaywrightExecutionBoundary(() => performPlaywrightScenarioAction({
3321
+ page: this.opened.page,
3322
+ action,
3323
+ secrets: this.secrets
3324
+ }), "timeout_ms" in action ? action.timeout_ms : undefined, signal);
3325
+ await withPlaywrightExecutionBoundary(() => this.storage?.settle() ?? Promise.resolve(), undefined, signal);
3326
+ }
3327
+ async capture(requested, signal) {
3328
+ await withPlaywrightExecutionBoundary(() => this.serviceWorkers?.assertBlocked() ?? Promise.resolve(), undefined, signal);
3329
+ await withPlaywrightExecutionBoundary(() => this.storage?.settle() ?? Promise.resolve(), undefined, signal);
3330
+ return withPlaywrightExecutionBoundary(() => capturePlaywrightStepArtifacts({
3331
+ context: this.opened.context,
3332
+ page: this.opened.page,
3333
+ secrets: this.secrets,
3334
+ requested
3335
+ }), undefined, signal);
3336
+ }
3337
+ async close(stopLoading = this.signal?.aborted === true) {
3338
+ this.#stopLoading ||= stopLoading;
3339
+ try {
3340
+ await withPlaywrightExecutionBoundary(() => this.cleanupLease.release(), PLAYWRIGHT_CLEANUP_CONFIRMATION_TIMEOUT_MS);
3341
+ } catch (cause) {
3342
+ const error = new BrowserObservationError(OPERATION, "cleanup_failed", {
3343
+ cause,
3344
+ cleanup: {
3345
+ reason: cause instanceof Error ? cause.message : String(cause),
3346
+ resources: this.cleanupLease.cleanupResources ?? []
3347
+ }
3348
+ });
3349
+ new AnalysisCleanupLeaseGroup(error, [this.cleanupLease]);
3350
+ throw error;
3351
+ }
3352
+ return this.mode === "launch" ? "terminated-owned-process" : "disconnected-external";
3353
+ }
3354
+ async #closeResources() {
3355
+ const stopLoading = this.#stopLoading || this.signal?.aborted === true;
3356
+ let storageFailure;
3357
+ let policyFailure;
3358
+ let browserFailure;
3359
+ if (stopLoading && this.storage === undefined) this.#policyStopsLoading = true;
3360
+ if (!this.#storageReleased) {
3361
+ try {
3362
+ const result = await this.storage?.close(stopLoading);
3363
+ if (stopLoading && result?.loadingStopped !== true) this.#policyStopsLoading = true;
3364
+ } catch (failure) {
3365
+ storageFailure = { cause: failure };
3366
+ if (stopLoading) this.#policyStopsLoading = true;
3367
+ }
3368
+ }
3369
+ try {
3370
+ if (!this.opened.cleanup.browserClosed) await this.serviceWorkers?.close(this.#policyStopsLoading);
3371
+ } catch (failure) {
3372
+ policyFailure = { cause: failure };
3373
+ }
3374
+ if (policyFailure === undefined) {
3375
+ try {
3376
+ await this.opened.cleanup.release(() => this.eventCapture.finish());
3377
+ } catch (failure) {
3378
+ browserFailure = { cause: failure };
3379
+ }
3380
+ } else {
3381
+ try {
3382
+ await this.eventCapture.finish();
3383
+ } catch (failure) {
3384
+ browserFailure = { cause: failure };
3385
+ }
3386
+ }
3387
+ if (this.opened.cleanup.browserClosed) this.#storageReleased = true;
3388
+ throwCleanupFailures([
3389
+ ...policyFailure === undefined ? [] : [policyFailure.cause],
3390
+ ...this.#storageReleased || storageFailure === undefined ? [] : [storageFailure.cause],
3391
+ ...browserFailure === undefined ? [] : [browserFailure.cause]
3392
+ ]);
3393
+ }
3394
+ redactError(error) {
3395
+ return this.secrets.redact(error instanceof Error ? error.message : "browser action failed");
3396
+ }
3397
+ };
3398
+ })))();
3399
+ }
3400
+
3401
+ //#endregion
3402
+ //#region dist/composition/browserScenario.js
3403
+ var createBrowserScenarioProvider;
3404
+ function init_browserScenario() {
3405
+ return (init_browserScenario = __esmMin((() => {
3406
+ init_PlaywrightBrowserScenarioProvider();
3407
+ init_PlaywrightScenarioSession();
3408
+ createBrowserScenarioProvider = (environment) => new PlaywrightBrowserScenarioProvider((scenario, options) => PlaywrightScenarioSession.open(scenario, environment, options));
3409
+ })))();
3410
+ }
3411
+
3412
+ //#endregion
3413
+ init_browserScenario();
3414
+ export { createBrowserScenarioProvider };