rea-agents 3.0.0 → 3.2.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 (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -3,14 +3,11 @@ import canonicalize from "canonicalize";
3
3
  import { CdpConnection } from "./CdpConnection.js";
4
4
  import { optionalCdpCommand } from "./CdpOptionalCommand.js";
5
5
  import { recordValue, recordsValue, stringValue } from "./CdpCaptureValues.js";
6
- const MAX_CACHE_BODY_BYTES = 64 * 1_024;
7
6
  /** Capture stable hashes of approved storage content without returning values. */
8
7
  export const captureStorageFingerprints = async ({ context, origin, local, session, indexedDbNames, caches, limitations, }) => {
9
8
  const state = {
10
9
  items: [],
11
- maximum: context.input.limits.max_storage_keys,
12
10
  complete: local.complete && session.complete,
13
- truncated: false,
14
11
  };
15
12
  const run = { context, limitations, state };
16
13
  addStorageItems(state, "local_storage", local.items);
@@ -19,13 +16,8 @@ export const captureStorageFingerprints = async ({ context, origin, local, sessi
19
16
  await addIndexedDb(run, origin, indexedDbNames);
20
17
  await addCaches(run, caches);
21
18
  state.items.sort((left, right) => compareCodePoints(`${left.scope}:${left.identity_sha256}`, `${right.scope}:${right.identity_sha256}`));
22
- return {
23
- items: state.items,
24
- complete: state.complete &&
25
- !state.truncated &&
26
- state.items.every(({ complete }) => complete),
27
- truncated: state.truncated,
28
- };
19
+ const complete = state.complete && state.items.every(({ complete }) => complete);
20
+ return { items: state.items, complete };
29
21
  };
30
22
  const addStorageItems = (state, scope, items) => {
31
23
  for (const item of items)
@@ -77,10 +69,6 @@ const addCookies = async (run, origin) => {
77
69
  };
78
70
  const addIndexedDb = async (run, origin, names) => {
79
71
  for (const databaseName of names) {
80
- if (run.state.items.length >= run.state.maximum) {
81
- run.state.truncated = true;
82
- return;
83
- }
84
72
  const raw = await optionalCdpCommand(run.context, "IndexedDB.requestDatabase", { securityOrigin: origin, databaseName }, run.limitations);
85
73
  const database = recordValue(recordValue(raw)?.databaseWithObjectStores);
86
74
  if (raw === undefined || database === undefined) {
@@ -139,76 +127,88 @@ const indexedDbSchemaComplete = (stores) => stores.every((store) => stringValue(
139
127
  typeof index.unique === "boolean" &&
140
128
  typeof index.multiEntry === "boolean"));
141
129
  const addIndexedDbRecords = async (run, input) => {
142
- const remaining = run.state.maximum - run.state.items.length;
143
- if (remaining <= 0) {
144
- run.state.truncated = true;
145
- return;
146
- }
147
- const raw = await optionalCdpCommand(run.context, "IndexedDB.requestData", {
148
- securityOrigin: input.origin,
149
- databaseName: input.databaseName,
150
- objectStoreName: input.objectStoreName,
151
- indexName: "",
152
- skipCount: 0,
153
- pageSize: remaining,
154
- }, run.limitations);
155
- const result = recordValue(raw);
156
- if (raw === undefined || result === undefined) {
157
- run.state.complete = false;
158
- return;
159
- }
160
- if (!Array.isArray(result.objectStoreDataEntries) ||
161
- typeof result.hasMore !== "boolean") {
162
- run.state.complete = false;
163
- return;
164
- }
165
- const entries = recordsValue(result.objectStoreDataEntries);
166
- if (entries.length !== result.objectStoreDataEntries.length)
167
- run.state.complete = false;
168
- for (const entry of entries) {
169
- const key = stableValue(entry.key);
170
- const primaryKey = stableValue(entry.primaryKey);
171
- const value = stableValue(entry.value);
172
- addFingerprint(run.state, {
173
- scope: "indexed_db_record",
174
- identity: {
175
- database: input.databaseName,
176
- store: input.objectStoreName,
177
- key,
178
- primaryKey,
179
- },
180
- value,
181
- complete: remoteObjectComplete(entry.value),
182
- });
183
- }
184
- if (result.hasMore === true || entries.length > remaining)
185
- run.state.truncated = true;
186
- };
187
- const addCaches = async (run, caches) => {
188
- for (const cache of caches) {
189
- const remaining = run.state.maximum - run.state.items.length;
190
- if (remaining <= 0) {
191
- run.state.truncated = true;
192
- return;
193
- }
194
- const raw = await optionalCdpCommand(run.context, "CacheStorage.requestEntries", { cacheId: cache.id, skipCount: 0, pageSize: remaining }, run.limitations);
130
+ let skipCount = 0;
131
+ while (true) {
132
+ const raw = await optionalCdpCommand(run.context, "IndexedDB.requestData", {
133
+ securityOrigin: input.origin,
134
+ databaseName: input.databaseName,
135
+ objectStoreName: input.objectStoreName,
136
+ indexName: "",
137
+ skipCount,
138
+ pageSize: STORAGE_ENTRY_PAGE_SIZE,
139
+ }, run.limitations);
195
140
  const result = recordValue(raw);
196
141
  if (raw === undefined || result === undefined) {
197
142
  run.state.complete = false;
198
- continue;
143
+ return;
199
144
  }
200
- if (!Array.isArray(result.cacheDataEntries) ||
201
- typeof result.returnCount !== "number") {
145
+ if (!Array.isArray(result.objectStoreDataEntries) ||
146
+ typeof result.hasMore !== "boolean") {
202
147
  run.state.complete = false;
203
- continue;
148
+ return;
149
+ }
150
+ const entries = recordsValue(result.objectStoreDataEntries);
151
+ if (entries.length !== result.objectStoreDataEntries.length)
152
+ run.state.complete = false;
153
+ for (const entry of entries) {
154
+ const key = stableValue(entry.key);
155
+ const primaryKey = stableValue(entry.primaryKey);
156
+ const value = stableValue(entry.value);
157
+ addFingerprint(run.state, {
158
+ scope: "indexed_db_record",
159
+ identity: {
160
+ database: input.databaseName,
161
+ store: input.objectStoreName,
162
+ key,
163
+ primaryKey,
164
+ },
165
+ value,
166
+ complete: remoteObjectComplete(entry.value),
167
+ });
204
168
  }
205
- const entries = recordsValue(result.cacheDataEntries);
206
- if (entries.length !== result.cacheDataEntries.length)
169
+ if (result.hasMore !== true)
170
+ return;
171
+ if (entries.length === 0 ||
172
+ skipCount > Number.MAX_SAFE_INTEGER - entries.length) {
207
173
  run.state.complete = false;
208
- for (const entry of entries)
209
- await addCacheEntry(run, cache, entry);
210
- if (result.returnCount > entries.length)
211
- run.state.truncated = true;
174
+ return;
175
+ }
176
+ skipCount += entries.length;
177
+ }
178
+ };
179
+ const addCaches = async (run, caches) => {
180
+ for (const cache of caches) {
181
+ let skipCount = 0;
182
+ let returnCount;
183
+ while (returnCount === undefined || skipCount < returnCount) {
184
+ const raw = await optionalCdpCommand(run.context, "CacheStorage.requestEntries", { cacheId: cache.id, skipCount, pageSize: STORAGE_ENTRY_PAGE_SIZE }, run.limitations);
185
+ const result = recordValue(raw);
186
+ if (raw === undefined || result === undefined) {
187
+ run.state.complete = false;
188
+ break;
189
+ }
190
+ if (!Array.isArray(result.cacheDataEntries) ||
191
+ typeof result.returnCount !== "number" ||
192
+ !Number.isSafeInteger(result.returnCount) ||
193
+ result.returnCount < 0) {
194
+ run.state.complete = false;
195
+ break;
196
+ }
197
+ const entries = recordsValue(result.cacheDataEntries);
198
+ if (entries.length !== result.cacheDataEntries.length)
199
+ run.state.complete = false;
200
+ for (const entry of entries)
201
+ await addCacheEntry(run, cache, entry);
202
+ returnCount = result.returnCount;
203
+ if (skipCount + entries.length >= returnCount)
204
+ break;
205
+ if (entries.length === 0 ||
206
+ skipCount > Number.MAX_SAFE_INTEGER - entries.length) {
207
+ run.state.complete = false;
208
+ break;
209
+ }
210
+ skipCount += entries.length;
211
+ }
212
212
  }
213
213
  };
214
214
  const addCacheEntry = async (run, cache, entry) => {
@@ -236,7 +236,7 @@ const addCacheEntry = async (run, cache, entry) => {
236
236
  const raw = await optionalCdpCommand(run.context, "CacheStorage.requestCachedResponse", { cacheId: cache.id, requestURL, requestHeaders }, run.limitations);
237
237
  const body = stringValue(recordValue(recordValue(raw)?.response)?.body);
238
238
  const decoded = body === undefined ? null : decodeBase64(body);
239
- const complete = decoded !== null && decoded.byteLength <= MAX_CACHE_BODY_BYTES;
239
+ const complete = decoded !== null;
240
240
  if (!complete)
241
241
  run.state.complete = false;
242
242
  addFingerprint(run.state, {
@@ -247,10 +247,6 @@ const addCacheEntry = async (run, cache, entry) => {
247
247
  });
248
248
  };
249
249
  const addFingerprint = (state, input) => {
250
- if (state.items.length >= state.maximum) {
251
- state.truncated = true;
252
- return;
253
- }
254
250
  state.items.push({
255
251
  scope: input.scope,
256
252
  identity_sha256: digest(input.identity),
@@ -260,6 +256,7 @@ const addFingerprint = (state, input) => {
260
256
  stableValueComplete(input.value),
261
257
  });
262
258
  };
259
+ const STORAGE_ENTRY_PAGE_SIZE = 1_000;
263
260
  const digest = (value) => createHash("sha256").update(encodedValue(value)).digest("hex");
264
261
  const encodedValue = (value) => {
265
262
  if (value instanceof Uint8Array)
@@ -269,26 +266,23 @@ const encodedValue = (value) => {
269
266
  throw new TypeError("Expected canonical JSON");
270
267
  return encoded;
271
268
  };
272
- const stableValue = (value, depth = 0) => {
269
+ const stableValue = (value) => {
273
270
  if (value === null ||
274
271
  typeof value === "string" ||
275
272
  typeof value === "number" ||
276
273
  typeof value === "boolean")
277
274
  return value;
278
- if (depth >= 8)
279
- return "<depth-limit>";
280
275
  if (Array.isArray(value))
281
- return value.slice(0, 64).map((item) => stableValue(item, depth + 1));
276
+ return value.map((item) => stableValue(item));
282
277
  const record = recordValue(value);
283
278
  if (record === undefined)
284
279
  return String(value);
285
280
  return Object.fromEntries(Object.entries(record)
286
281
  .filter(([key]) => key !== "objectId" && key !== "customPreview")
287
282
  .sort(([left], [right]) => compareCodePoints(left, right))
288
- .slice(0, 64)
289
- .map(([key, item]) => [key, stableValue(item, depth + 1)]));
283
+ .map(([key, item]) => [key, stableValue(item)]));
290
284
  };
291
- const stableValueComplete = (value, depth = 0) => {
285
+ const stableValueComplete = (value) => {
292
286
  if (value instanceof Uint8Array)
293
287
  return true;
294
288
  if (value === null ||
@@ -297,17 +291,13 @@ const stableValueComplete = (value, depth = 0) => {
297
291
  typeof value === "number" ||
298
292
  typeof value === "boolean")
299
293
  return true;
300
- if (depth >= 8)
301
- return false;
302
294
  if (Array.isArray(value))
303
- return (value.length <= 64 &&
304
- value.every((item) => stableValueComplete(item, depth + 1)));
295
+ return value.every((item) => stableValueComplete(item));
305
296
  const record = recordValue(value);
306
297
  if (record === undefined)
307
298
  return false;
308
299
  const entries = Object.entries(record).filter(([key]) => key !== "objectId" && key !== "customPreview");
309
- return (entries.length <= 64 &&
310
- entries.every(([, item]) => stableValueComplete(item, depth + 1)));
300
+ return entries.every(([, item]) => stableValueComplete(item));
311
301
  };
312
302
  const remoteObjectComplete = (value) => {
313
303
  const record = recordValue(value);
@@ -17,10 +17,6 @@ export const requiredRecord = (value) => {
17
17
  throw new BrowserObservationError("inspect_web_page", "protocol_error");
18
18
  return record;
19
19
  };
20
- export const boundedText = (value, maximum = 1_024) => {
21
- const text = stringValue(value);
22
- return text === undefined ? null : text.slice(0, maximum);
23
- };
24
20
  export const isHttpUrl = (value) => {
25
21
  if (value === undefined)
26
22
  return false;
@@ -47,22 +43,26 @@ export const sourceResult = (source) => ({
47
43
  });
48
44
  export const sourceExcluded = (reason) => ({ included: false, reason });
49
45
  export const delayWithCancellation = async (durationMs, operation, signal) => {
50
- if (durationMs === 0)
51
- return;
52
- if (signal?.aborted === true)
53
- throw new AnalysisCancelledError(operation);
54
- await new Promise((resolve, reject) => {
55
- const timer = setTimeout(() => {
56
- signal?.removeEventListener("abort", onAbort);
57
- resolve();
58
- }, durationMs);
59
- const onAbort = () => {
60
- clearTimeout(timer);
61
- signal?.removeEventListener("abort", onAbort);
62
- reject(new AnalysisCancelledError(operation));
63
- };
64
- signal?.addEventListener("abort", onAbort, { once: true });
46
+ const maximumTimerDelay = 2_147_483_647;
47
+ let remaining = durationMs;
48
+ while (remaining > 0) {
65
49
  if (signal?.aborted === true)
66
- onAbort();
67
- });
50
+ throw new AnalysisCancelledError(operation);
51
+ const delay = Math.min(remaining, maximumTimerDelay);
52
+ await new Promise((resolve, reject) => {
53
+ const timer = setTimeout(() => {
54
+ signal?.removeEventListener("abort", onAbort);
55
+ resolve();
56
+ }, delay);
57
+ const onAbort = () => {
58
+ clearTimeout(timer);
59
+ signal?.removeEventListener("abort", onAbort);
60
+ reject(new AnalysisCancelledError(operation));
61
+ };
62
+ signal?.addEventListener("abort", onAbort, { once: true });
63
+ if (signal?.aborted === true)
64
+ onAbort();
65
+ });
66
+ remaining -= delay;
67
+ }
68
68
  };
@@ -1,10 +1,6 @@
1
1
  import WebSocket, {} from "ws";
2
- import { AnalysisCancelledError, AnalysisError, AnalysisTimeoutError, BrowserObservationError, } from "../domain/errors.js";
3
- const CONNECT_TIMEOUT_MS = 5_000;
4
- const COMMAND_TIMEOUT_MS = 5_000;
5
- const MAX_PAYLOAD_BYTES = 16 * 1_024 * 1_024;
6
- const MAX_PENDING_COMMANDS = 128;
7
- /** Correlated, bounded JSON-RPC transport for one CDP target operation. */
2
+ import { AnalysisCancelledError, AnalysisError, BrowserObservationError, } from "../domain/errors.js";
3
+ /** Correlated JSON-RPC transport for one CDP target operation. */
8
4
  export class CdpConnection {
9
5
  socket;
10
6
  operation;
@@ -26,8 +22,8 @@ export class CdpConnection {
26
22
  if (signal?.aborted === true)
27
23
  throw new AnalysisCancelledError(operation);
28
24
  const socket = new WebSocket(url, {
29
- handshakeTimeout: CONNECT_TIMEOUT_MS,
30
- maxPayload: MAX_PAYLOAD_BYTES,
25
+ handshakeTimeout: 0,
26
+ maxPayload: 0,
31
27
  perMessageDeflate: false,
32
28
  });
33
29
  await waitForOpen(socket, operation, signal);
@@ -47,14 +43,12 @@ export class CdpConnection {
47
43
  this.#disconnectListeners.add(listener);
48
44
  return () => this.#disconnectListeners.delete(listener);
49
45
  }
50
- /** Execute one bounded command, optionally within a flat target session. */
46
+ /** Execute one command, optionally within a flat target session. */
51
47
  async send(method, params = {}, sessionId, signal) {
52
48
  if (this.#protocolFailed)
53
49
  throw new BrowserObservationError(this.operation, "protocol_error");
54
50
  if (this.#closed || this.socket.readyState !== WebSocket.OPEN)
55
51
  throw new BrowserObservationError(this.operation, "disconnected");
56
- if (this.#pending.size >= MAX_PENDING_COMMANDS)
57
- throw new BrowserObservationError(this.operation, "payload_limit");
58
52
  if (signal?.aborted === true)
59
53
  throw new AnalysisCancelledError(this.operation);
60
54
  const id = this.#nextId;
@@ -64,21 +58,14 @@ export class CdpConnection {
64
58
  const pending = this.#pending.get(id);
65
59
  if (pending === undefined)
66
60
  return;
67
- clearTimeout(pending.timer);
68
61
  pending.removeAbort();
69
62
  this.#pending.delete(id);
70
63
  reject(new AnalysisCancelledError(this.operation));
71
64
  };
72
65
  signal?.addEventListener("abort", onAbort, { once: true });
73
- const timer = setTimeout(() => {
74
- signal?.removeEventListener("abort", onAbort);
75
- this.#pending.delete(id);
76
- reject(new AnalysisTimeoutError(this.operation, COMMAND_TIMEOUT_MS));
77
- }, COMMAND_TIMEOUT_MS);
78
66
  this.#pending.set(id, {
79
67
  resolve,
80
68
  reject,
81
- timer,
82
69
  removeAbort: () => signal?.removeEventListener("abort", onAbort),
83
70
  });
84
71
  this.socket.send(JSON.stringify({
@@ -171,7 +158,6 @@ export class CdpConnection {
171
158
  pending.resolve("result" in message ? message.result : {});
172
159
  }
173
160
  #complete(id, pending) {
174
- clearTimeout(pending.timer);
175
161
  pending.removeAbort();
176
162
  this.#pending.delete(id);
177
163
  }
@@ -202,11 +188,6 @@ const rawText = (data) => Array.isArray(data)
202
188
  : Buffer.from(data).toString("utf8");
203
189
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
204
190
  const waitForOpen = async (socket, operation, signal) => await new Promise((resolve, reject) => {
205
- const timer = setTimeout(() => {
206
- cleanup();
207
- terminateSocket(socket);
208
- reject(new AnalysisTimeoutError(operation, CONNECT_TIMEOUT_MS));
209
- }, CONNECT_TIMEOUT_MS);
210
191
  const onOpen = () => {
211
192
  cleanup();
212
193
  resolve();
@@ -219,18 +200,22 @@ const waitForOpen = async (socket, operation, signal) => await new Promise((reso
219
200
  cause,
220
201
  }));
221
202
  };
203
+ const onClose = (code, reason) => {
204
+ onFailure(new Error(`CDP WebSocket closed before opening (${code}: ${reason.toString("utf8")})`));
205
+ };
222
206
  const onAbort = () => {
223
207
  terminateSocket(socket);
224
208
  onFailure(new AnalysisCancelledError(operation));
225
209
  };
226
210
  const cleanup = () => {
227
- clearTimeout(timer);
228
211
  socket.off("open", onOpen);
229
212
  socket.off("error", onFailure);
213
+ socket.off("close", onClose);
230
214
  signal?.removeEventListener("abort", onAbort);
231
215
  };
232
216
  socket.once("open", onOpen);
233
217
  socket.once("error", onFailure);
218
+ socket.once("close", onClose);
234
219
  signal?.addEventListener("abort", onAbort, { once: true });
235
220
  if (signal?.aborted === true)
236
221
  onAbort();
@@ -1,23 +1,21 @@
1
- import { createHash } from "node:crypto";
2
- import canonicalize from "canonicalize";
3
1
  import { BrowserObservationError } from "../domain/errors.js";
4
2
  import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
3
+ import { canonicalJsonDigest } from "./CdpCanonicalJsonDigest.js";
5
4
  import { delayWithCancellation, numberValue, recordValue, recordsValue, requiredRecord, stringValue, } from "./CdpCaptureValues.js";
6
5
  import { ingestElectronScriptEvent, } from "./CdpElectronScriptEvents.js";
7
6
  import { captureElectronScripts } from "./CdpElectronScripts.js";
8
7
  import { captureElectronWorkers } from "./CdpElectronWorkers.js";
9
- import { authorizedElectronFile, canonicalElectronRoots, } from "./ElectronFileScope.js";
10
- /** Passively inspect one root-confined Electron file page. */
8
+ import { authorizedElectronFile } from "./ElectronFileScope.js";
9
+ /** Passively inspect one Electron file page from the selected CDP endpoint. */
11
10
  export const inspectCdpElectronPage = async (context) => {
12
11
  const state = {
13
- roots: await canonicalElectronRoots(context.input.allowed_file_roots),
14
12
  completeness: new CdpCaptureCompleteness(),
15
13
  scripts: [],
16
14
  executionContextFrames: new Map(),
17
15
  limitations: [
18
- "Only canonical file paths contained by an approved root are retained.",
16
+ "Local file paths exposed by the selected CDP target are retained in the observation.",
19
17
  "REA does not evaluate renderer JavaScript, invoke Electron APIs, navigate, click, or close the page.",
20
- "Script contents require separate source-capture approval and remain byte bounded.",
18
+ "Script contents require separate source-capture approval.",
21
19
  ],
22
20
  mainFrameId: undefined,
23
21
  navigationDuringCapture: false,
@@ -44,7 +42,9 @@ export const inspectCdpElectronPage = async (context) => {
44
42
  };
45
43
  const runElectronInspection = async (context, state, startedAt) => {
46
44
  const frames = await authorizeInitialFrames(context, state);
47
- const main = frames[0];
45
+ const main = frames.at(0);
46
+ if (main === undefined)
47
+ throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
48
48
  state.mainFrameId = main.frame_id;
49
49
  await enableElectronCapture(context);
50
50
  await delayWithCancellation(context.input.observation_ms, "inspect_electron_page", context.signal);
@@ -52,12 +52,11 @@ const runElectronInspection = async (context, state, startedAt) => {
52
52
  await assertStableMainFrame(context, state, main.file_path);
53
53
  await report(context.progress, 3, "Electron inspection complete");
54
54
  return {
55
- schema_version: 1,
56
55
  browser: context.discovery.version,
57
56
  target: {
58
57
  target_id: context.target.id,
59
58
  type: context.target.type,
60
- title: context.target.title.slice(0, 16_384),
59
+ title: context.target.title,
61
60
  file_path: main.file_path,
62
61
  attached: context.target.attached,
63
62
  },
@@ -76,26 +75,25 @@ const authorizeInitialFrames = async (context, state) => {
76
75
  await report(context.progress, 1, "Authorizing Electron file frames");
77
76
  await context.connection.send("Page.enable", {}, context.sessionId, context.signal);
78
77
  const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
79
- const frames = await captureFrames(result, state.roots, context.input.limits.max_frames, state.completeness);
78
+ const frames = await captureFrames(result, state.completeness);
80
79
  if (frames[0] === undefined)
81
80
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
82
81
  return frames;
83
82
  };
84
83
  const enableElectronCapture = async (context) => {
85
84
  await context.connection.send("Runtime.enable", {}, context.sessionId, context.signal);
86
- await context.connection.send("Debugger.enable", { maxScriptsCacheSize: 4 * 1_024 * 1_024 }, context.sessionId, context.signal);
85
+ await context.connection.send("Debugger.enable", {}, context.sessionId, context.signal);
87
86
  };
88
87
  const captureElectronContent = async (context, state, frames) => {
89
88
  await report(context.progress, 2, "Capturing Electron structure");
90
89
  const frameIds = new Set(frames.map((frame) => frame.frame_id));
91
- const resources = await captureResources(context, state.roots, state.completeness);
92
- const dom = await captureDom(context, state.roots, state.completeness);
90
+ const resources = await captureResources(context, state.completeness);
91
+ const dom = await captureDom(context, state.completeness);
93
92
  const scripts = await captureElectronScripts({
94
93
  connection: context.connection,
95
94
  sessionId: context.sessionId,
96
95
  ...(context.signal === undefined ? {} : { signal: context.signal }),
97
96
  request: context.input,
98
- roots: state.roots,
99
97
  scripts: state.scripts,
100
98
  executionContextFrames: state.executionContextFrames,
101
99
  frameIds,
@@ -106,7 +104,6 @@ const captureElectronContent = async (context, state, frames) => {
106
104
  ...(context.signal === undefined ? {} : { signal: context.signal }),
107
105
  target: context.target,
108
106
  request: context.input,
109
- roots: state.roots,
110
107
  frameIds,
111
108
  completeness: state.completeness,
112
109
  limitations: state.limitations,
@@ -115,7 +112,7 @@ const captureElectronContent = async (context, state, frames) => {
115
112
  };
116
113
  const assertStableMainFrame = async (context, state, expectedPath) => {
117
114
  const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
118
- const afterPath = await mainFilePath(result, state.roots);
115
+ const afterPath = await mainFilePath(result);
119
116
  if (afterPath === undefined)
120
117
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
121
118
  if (state.navigationDuringCapture || afterPath !== expectedPath)
@@ -131,7 +128,7 @@ const navigatedFrameId = (event) => {
131
128
  return stringValue(params.frameId);
132
129
  return undefined;
133
130
  };
134
- const captureFrames = async (result, roots, maximum, completeness) => {
131
+ const captureFrames = async (result, completeness) => {
135
132
  const frameTree = recordValue(requiredRecord(result).frameTree);
136
133
  if (frameTree === undefined)
137
134
  throw new BrowserObservationError("inspect_web_page", "protocol_error");
@@ -143,26 +140,22 @@ const captureFrames = async (result, roots, maximum, completeness) => {
143
140
  break;
144
141
  const frame = recordValue(current.tree.frame);
145
142
  const frameId = stringValue(frame?.id);
146
- const path = await authorizedElectronFile(stringValue(frame?.url) ?? "", roots);
143
+ const path = await authorizedElectronFile(stringValue(frame?.url) ?? "");
147
144
  if (frameId === undefined || path === undefined) {
148
145
  completeness.exclude("frames", "out_of_target_scope");
149
146
  continue;
150
147
  }
151
- if (frames.length >= maximum) {
152
- completeness.truncate("frames");
153
- continue;
154
- }
155
148
  frames.push({
156
- frame_id: frameId.slice(0, 256),
149
+ frame_id: frameId,
157
150
  parent_frame_id: current.parent,
158
151
  file_path: path,
159
152
  });
160
153
  for (const child of recordsValue(current.tree.childFrames))
161
- pending.push({ tree: child, parent: frameId.slice(0, 256) });
154
+ pending.push({ tree: child, parent: frameId });
162
155
  }
163
156
  return frames;
164
157
  };
165
- const captureResources = async (context, roots, completeness) => {
158
+ const captureResources = async (context, completeness) => {
166
159
  const result = await context.connection.send("Page.getResourceTree", {}, context.sessionId, context.signal);
167
160
  const root = recordValue(requiredRecord(result).frameTree);
168
161
  if (root === undefined)
@@ -175,27 +168,23 @@ const captureResources = async (context, roots, completeness) => {
175
168
  if (tree === undefined)
176
169
  break;
177
170
  for (const resource of recordsValue(tree.resources)) {
178
- const path = await authorizedElectronFile(stringValue(resource.url) ?? "", roots);
171
+ const path = await authorizedElectronFile(stringValue(resource.url) ?? "");
179
172
  if (path === undefined) {
180
173
  completeness.exclude("resources", "out_of_target_scope");
181
174
  continue;
182
175
  }
183
176
  const item = {
184
177
  file_path: path,
185
- type: (stringValue(resource.type) ?? "Other").slice(0, 100),
186
- mime_type: (stringValue(resource.mimeType) ?? "").slice(0, 256),
178
+ type: stringValue(resource.type) ?? "Other",
179
+ mime_type: stringValue(resource.mimeType) ?? "",
187
180
  content_size: numberValue(resource.contentSize) === undefined
188
181
  ? null
189
182
  : Math.max(0, numberValue(resource.contentSize) ?? 0),
190
183
  };
191
- const resourceKey = `electron_resource_${digest(item)}`;
184
+ const resourceKey = `electron_resource_${canonicalJsonDigest(item)}`;
192
185
  if (seen.has(resourceKey))
193
186
  continue;
194
187
  seen.add(resourceKey);
195
- if (resources.length >= context.input.limits.max_resources) {
196
- completeness.truncate("resources");
197
- continue;
198
- }
199
188
  resources.push({
200
189
  resource_key: resourceKey,
201
190
  ...item,
@@ -205,7 +194,7 @@ const captureResources = async (context, roots, completeness) => {
205
194
  }
206
195
  return resources.sort((left, right) => left.resource_key.localeCompare(right.resource_key));
207
196
  };
208
- const captureDom = async (context, roots, completeness) => {
197
+ const captureDom = async (context, completeness) => {
209
198
  const result = requiredRecord(await context.connection.send("DOMSnapshot.captureSnapshot", { computedStyles: [], includePaintOrder: false, includeDOMRects: false }, context.sessionId, context.signal));
210
199
  const strings = Array.isArray(result.strings)
211
200
  ? result.strings.map((value) => (typeof value === "string" ? value : ""))
@@ -214,7 +203,7 @@ const captureDom = async (context, roots, completeness) => {
214
203
  let total = 0;
215
204
  for (const document of recordsValue(result.documents)) {
216
205
  const documentUrl = stringAt(strings, document.documentURL);
217
- if ((await authorizedElectronFile(documentUrl, roots)) === undefined) {
206
+ if ((await authorizedElectronFile(documentUrl)) === undefined) {
218
207
  completeness.exclude("dom", "out_of_target_scope");
219
208
  continue;
220
209
  }
@@ -227,31 +216,26 @@ const captureDom = async (context, roots, completeness) => {
227
216
  const baseIndex = nodes.length;
228
217
  total += nodeTypes.length;
229
218
  for (let index = 0; index < nodeTypes.length; index += 1) {
230
- if (nodes.length >= context.input.limits.max_dom_nodes)
231
- continue;
232
219
  const attributeIndexes = arrayValue(attributes[index]);
233
220
  const parent = integer(parents[index], -1);
234
221
  nodes.push({
235
222
  index: nodes.length,
236
223
  parent_index: parent < 0 ? -1 : baseIndex + parent,
237
224
  node_type: integer(nodeTypes[index], 0),
238
- node_name: stringAt(strings, nodeNames[index]).slice(0, 1_024),
225
+ node_name: stringAt(strings, nodeNames[index]),
239
226
  node_value_length: Buffer.byteLength(stringAt(strings, nodeValues[index])),
240
227
  attribute_names: attributeIndexes
241
228
  .filter((_value, attributeIndex) => attributeIndex % 2 === 0)
242
- .map((value) => stringAt(strings, value).slice(0, 1_024))
243
- .slice(0, 256),
229
+ .map((value) => stringAt(strings, value)),
244
230
  });
245
231
  }
246
232
  }
247
- if (total > nodes.length)
248
- completeness.truncate("dom");
249
233
  return { total_nodes: total, nodes };
250
234
  };
251
- const mainFilePath = async (result, roots) => {
235
+ const mainFilePath = async (result) => {
252
236
  const frameTree = recordValue(requiredRecord(result).frameTree);
253
237
  const frame = recordValue(frameTree?.frame);
254
- return await authorizedElectronFile(stringValue(frame?.url) ?? "", roots);
238
+ return await authorizedElectronFile(stringValue(frame?.url) ?? "");
255
239
  };
256
240
  const arrayValue = (value) => Array.isArray(value) ? value : [];
257
241
  const stringAt = (strings, value) => strings[integer(value, -1)] ?? "";
@@ -259,12 +243,6 @@ const integer = (value, fallback) => {
259
243
  const number = numberValue(value);
260
244
  return number === undefined ? fallback : Math.trunc(number);
261
245
  };
262
- const digest = (value) => {
263
- const encoded = canonicalize(value);
264
- if (encoded === undefined)
265
- throw new TypeError("Expected canonical JSON");
266
- return createHash("sha256").update(encoded).digest("hex");
267
- };
268
246
  const report = async (progress, completed, message) => await progress?.report({
269
247
  phase: "browser_observation",
270
248
  completed,