rea-agents 3.1.0 → 3.2.1

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 (590) hide show
  1. package/README.md +72 -95
  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/AnalysisSnapshotCache.js +0 -1
  6. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  7. package/dist/application/AndroidApplicationService.js +1 -1
  8. package/dist/application/AppleApplicationService.js +1 -1
  9. package/dist/application/ArtifactExtraction.js +35 -54
  10. package/dist/application/ArtifactExtractionDestination.js +17 -0
  11. package/dist/application/ArtifactGraphConstruction.js +2 -17
  12. package/dist/application/ArtifactInventory/classify.js +2 -6
  13. package/dist/application/ArtifactInventory/hash.js +2 -20
  14. package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
  15. package/dist/application/ArtifactInventory/scanReader.js +69 -51
  16. package/dist/application/ArtifactInventory.js +6 -14
  17. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  18. package/dist/application/BinarySession.js +41 -13
  19. package/dist/application/BinarySessionComposition.js +0 -11
  20. package/dist/application/BinarySessionOpen.js +2 -1
  21. package/dist/application/BinarySessionRecords.js +5 -93
  22. package/dist/application/BinarySessionStatus.js +5 -16
  23. package/dist/application/BinaryTargetResolver.js +216 -0
  24. package/dist/application/BrowserEvidence.js +42 -58
  25. package/dist/application/BrowserObservationService.js +3 -6
  26. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  27. package/dist/application/BrowserScenarioEvidence.js +3 -3
  28. package/dist/application/CallPathTracing.js +2 -36
  29. package/dist/application/CapabilityInventory.js +10 -15
  30. package/dist/application/ClientConfigurationDocument.js +27 -0
  31. package/dist/application/ClientRegistrationStatus.js +16 -13
  32. package/dist/application/CommandShimReplay.js +14 -1
  33. package/dist/application/DirectAnalysis.js +22 -46
  34. package/dist/application/DirectAnalysisStatus.js +5 -61
  35. package/dist/application/Doctor.js +11 -32
  36. package/dist/application/DoctorDiagnostics.js +1 -2
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/ElectronActiveEvidence.js +3 -8
  39. package/dist/application/ElectronActiveObservationService.js +3 -6
  40. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  41. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  42. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  43. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  44. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  45. package/dist/application/ElectronEvidence.js +4 -7
  46. package/dist/application/ElectronObservationService.js +5 -9
  47. package/dist/application/EnhancedLiteralTracing.js +42 -65
  48. package/dist/application/EnhancedTools.js +76 -44
  49. package/dist/application/EvidenceBundleCommands.js +11 -11
  50. package/dist/application/EvidenceBundleFiles.js +9 -15
  51. package/dist/application/EvidenceLedger.js +6 -41
  52. package/dist/application/FilesystemSnapshot.js +2 -3
  53. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  54. package/dist/application/InventoryProjectionEvidence.js +4 -2
  55. package/dist/application/InvestigationProviders.js +1 -1
  56. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  57. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  58. package/dist/application/JavaScriptApplicationService.js +6 -29
  59. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  60. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  61. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  62. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  63. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  64. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  65. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  66. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  67. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  68. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  69. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  70. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  71. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  72. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  73. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  74. package/dist/application/JavaScriptJsonModules.js +2 -2
  75. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  76. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  77. package/dist/application/JavaScriptReplayService.js +6 -32
  78. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  79. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  80. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  81. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  82. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  83. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  84. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  85. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  86. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  87. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  88. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  89. package/dist/application/JsonFiles.js +79 -0
  90. package/dist/application/LinuxHopper.js +11 -9
  91. package/dist/application/LoopbackReplay.js +26 -23
  92. package/dist/application/LoopbackReplayRecorder.js +29 -1
  93. package/dist/application/ManagedApplicationGraphService.js +1 -2
  94. package/dist/application/ManagedMemberComparisonService.js +11 -41
  95. package/dist/application/ManagedNativeVerificationService.js +1 -2
  96. package/dist/application/ManagedReconstructionService.js +1 -1
  97. package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
  98. package/dist/application/NativeApiInspection.js +2 -7
  99. package/dist/application/NativeUiActionTrace.js +394 -0
  100. package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
  101. package/dist/application/PermissionAuthority.js +15 -7
  102. package/dist/application/PermissionFailure.js +5 -0
  103. package/dist/application/ProcessCaptureAuthority.js +5 -7
  104. package/dist/application/ProcessCaptureJournal.js +3 -2
  105. package/dist/application/ProcessCaptureLifecycle.js +5 -12
  106. package/dist/application/ProcessCheckpoints.js +29 -11
  107. package/dist/application/ProcessCli.js +6 -16
  108. package/dist/application/ProcessEvidence.js +5 -7
  109. package/dist/application/ProcessHarness.js +52 -17
  110. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  111. package/dist/application/ProcessReactiveEffects.js +9 -3
  112. package/dist/application/ProcessReactiveHarness.js +13 -7
  113. package/dist/application/ProcessSampling.js +2 -4
  114. package/dist/application/ProcessTimer.js +39 -0
  115. package/dist/application/ProjectPermissionStore.js +39 -96
  116. package/dist/application/RealHopperAssertions.js +20 -66
  117. package/dist/application/ReconstructionCoverageService.js +12 -58
  118. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  119. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  120. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  121. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  122. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  123. package/dist/application/ReferenceSourceImport.js +19 -45
  124. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  125. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  126. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  127. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  128. package/dist/application/SessionProviderRouter.js +2 -2
  129. package/dist/application/Setup.js +1 -3
  130. package/dist/application/SetupClientConfiguration.js +22 -93
  131. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  132. package/dist/application/StoreFileLock.js +119 -0
  133. package/dist/application/TerminalRenderer.js +2 -3
  134. package/dist/application/Uninstall.js +9 -14
  135. package/dist/application/UnknownEvidence.js +1 -1
  136. package/dist/artifacts/ArtifactPaths.js +2 -5
  137. package/dist/artifacts/ArtifactProvider.js +36 -58
  138. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  139. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  140. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  141. package/dist/artifacts/NibArchive.js +269 -0
  142. package/dist/artifacts/SafeOutputTree.js +15 -24
  143. package/dist/browser/BrowserProcessStartup.js +1 -2
  144. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  145. package/dist/browser/CdpBrowserProvider.js +3 -13
  146. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  147. package/dist/browser/CdpCaptureDocuments.js +28 -76
  148. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  149. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  150. package/dist/browser/CdpCaptureEvents.js +2 -8
  151. package/dist/browser/CdpCaptureStorage.js +9 -20
  152. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
  153. package/dist/browser/CdpCaptureValues.js +21 -21
  154. package/dist/browser/CdpConnection.js +10 -25
  155. package/dist/browser/CdpElectronInspection.js +26 -50
  156. package/dist/browser/CdpElectronProvider.js +10 -35
  157. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  158. package/dist/browser/CdpElectronScripts.js +6 -35
  159. package/dist/browser/CdpElectronWorkers.js +6 -10
  160. package/dist/browser/CdpEndpoint.js +25 -41
  161. package/dist/browser/CdpObservationSession.js +14 -26
  162. package/dist/browser/CdpPageCapture.js +34 -48
  163. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  164. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  165. package/dist/browser/CdpSafeMetadata.js +19 -22
  166. package/dist/browser/CdpScreenshot.js +3 -5
  167. package/dist/browser/CdpTargetSession.js +1 -2
  168. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  169. package/dist/browser/ElectronFileScope.js +8 -19
  170. package/dist/browser/JavaScriptRuntimeScope.js +9 -14
  171. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  172. package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
  174. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  175. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  176. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  177. package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
  178. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  179. package/dist/browser/PlaywrightScenarioSession.js +14 -30
  180. package/dist/browser/PngVisualDiff.js +22 -14
  181. package/dist/browser/SensitiveTextCapture.js +0 -17
  182. package/dist/browser/V8InspectorCaptureProjection.js +7 -8
  183. package/dist/browser/V8InspectorEndpoint.js +12 -14
  184. package/dist/browser/V8InspectorProvider.js +20 -61
  185. package/dist/browser/WebSourceMapFetcher.js +56 -176
  186. package/dist/catalogIdentity.js +0 -54
  187. package/dist/cli/artifactCommands.js +49 -77
  188. package/dist/cli/coreAnalysisCommands.js +83 -133
  189. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  190. package/dist/cli/managedCommands.js +5 -270
  191. package/dist/cli/setupCommands.js +3 -12
  192. package/dist/cli/utilityCommands.js +7 -41
  193. package/dist/cli.js +0 -2
  194. package/dist/cliApplicationCommands.js +42 -112
  195. package/dist/cliBrowserAdvancedCommands.js +10 -106
  196. package/dist/cliBrowserCommands.js +15 -127
  197. package/dist/cliBrowserContext.js +30 -0
  198. package/dist/cliCommandNames.js +4 -5
  199. package/dist/cliElectronCommands.js +8 -72
  200. package/dist/cliEvidenceCommands.js +8 -77
  201. package/dist/cliJavaScriptRuntimeCommands.js +9 -91
  202. package/dist/cliJsonInput.js +4 -14
  203. package/dist/cliObservationOptions.js +11 -96
  204. package/dist/cliPolicyCommands.js +2 -17
  205. package/dist/cliProcessCommands.js +3 -3
  206. package/dist/cliSetup.js +0 -13
  207. package/dist/config/browserScenario.js +2 -2
  208. package/dist/config/environment.js +0 -9
  209. package/dist/config/parseConfig.js +1 -33
  210. package/dist/config/parsers.js +6 -27
  211. package/dist/config/passiveObservation.js +7 -77
  212. package/dist/config/permissions.js +0 -7
  213. package/dist/contracts/analysisSearchContract.js +2 -5
  214. package/dist/contracts/applicationToolContracts.js +56 -109
  215. package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
  216. package/dist/contracts/artifactComparisonExample.js +58 -60
  217. package/dist/contracts/artifactToolContracts.js +20 -67
  218. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  219. package/dist/contracts/browserToolContracts.js +8 -73
  220. package/dist/contracts/electronToolContracts.js +8 -108
  221. package/dist/contracts/enhancedInputs.js +23 -54
  222. package/dist/contracts/errorSchemas.js +0 -1
  223. package/dist/contracts/functionComparisonExample.js +10 -24
  224. package/dist/contracts/functionInstructionContract.js +1 -3
  225. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  226. package/dist/contracts/hopperMemoryContracts.js +3 -3
  227. package/dist/contracts/investigationExamples.js +14 -11
  228. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  229. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  230. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  231. package/dist/contracts/managedToolContracts.js +6 -95
  232. package/dist/contracts/managedWorkflowExamples.js +77 -128
  233. package/dist/contracts/managedWorkflowToolContracts.js +51 -77
  234. package/dist/contracts/nativeToolContracts.js +7 -11
  235. package/dist/contracts/processCaptureExample.js +2 -69
  236. package/dist/contracts/promptContracts.js +49 -67
  237. package/dist/contracts/providerSelection.js +0 -1
  238. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  239. package/dist/contracts/sessionStatusContract.js +1 -17
  240. package/dist/contracts/sessionToolSchemas.js +6 -15
  241. package/dist/contracts/toolContractExamples.js +11 -11
  242. package/dist/contracts/toolContractHelpers.js +0 -4
  243. package/dist/contracts/toolContracts.js +60 -71
  244. package/dist/contracts/toolEffects.js +5 -13
  245. package/dist/contracts/toolOutputSchemaGroups.js +37 -91
  246. package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
  247. package/dist/contracts/toolSchemaMetadata.js +8 -19
  248. package/dist/contracts/unknownContractExamples.js +0 -2
  249. package/dist/domain/analysisErrorPresentation.js +46 -54
  250. package/dist/domain/analysisErrorProjection.js +28 -37
  251. package/dist/domain/analysisProfile.js +3 -31
  252. package/dist/domain/analysisSnapshot.js +3 -12
  253. package/dist/domain/androidApplication.js +15 -54
  254. package/dist/domain/appleApplication.js +24 -67
  255. package/dist/domain/artifactComparison.js +11 -29
  256. package/dist/domain/artifactGraph.js +14 -44
  257. package/dist/domain/artifactInspection.js +38 -69
  258. package/dist/domain/artifactInventoryEvidence.js +27 -21
  259. package/dist/domain/binaryTarget.js +2 -221
  260. package/dist/domain/browserCaptureComparison.js +47 -24
  261. package/dist/domain/browserObservation.js +28 -193
  262. package/dist/domain/browserObservationSchemas.js +5 -23
  263. package/dist/domain/browserScenario.js +11 -14
  264. package/dist/domain/browserScenarioCapture.js +11 -12
  265. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  266. package/dist/domain/browserScenarioDiff.js +2 -59
  267. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  268. package/dist/domain/browserScenarioDiffValues.js +21 -38
  269. package/dist/domain/browserScenarioValues.js +80 -109
  270. package/dist/domain/browserSession.js +4 -7
  271. package/dist/domain/bundleComparison.js +6 -32
  272. package/dist/domain/bytecodeProvider.js +20 -19
  273. package/dist/domain/callPath.js +47 -167
  274. package/dist/domain/callPathSchemas.js +79 -0
  275. package/dist/domain/changedBehavior.js +34 -60
  276. package/dist/domain/completionLedgerGeneration.js +8 -14
  277. package/dist/domain/conformancePackage.js +126 -97
  278. package/dist/domain/conformanceReplay.js +36 -8
  279. package/dist/domain/conformanceTrustGate.js +23 -14
  280. package/dist/domain/customProtocolCapture.js +1 -1
  281. package/dist/domain/electronActiveObservation.js +70 -103
  282. package/dist/domain/electronObservation.js +14 -80
  283. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  284. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  285. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  286. package/dist/domain/electronStaticAnalysisValues.js +10 -17
  287. package/dist/domain/errors.js +33 -54
  288. package/dist/domain/eventProcessTree.js +20 -12
  289. package/dist/domain/evidence.js +2 -10
  290. package/dist/domain/evidenceBundle.js +3 -5
  291. package/dist/domain/evidenceCompletionLedger.js +6 -8
  292. package/dist/domain/functionComparison.js +4 -14
  293. package/dist/domain/functionComparisonNormalization.js +4 -11
  294. package/dist/domain/functionComparisonResults.js +25 -15
  295. package/dist/domain/functionComparisonSchemas.js +49 -33
  296. package/dist/domain/functionDossierEvidence.js +31 -156
  297. package/dist/domain/hopperStartupFailure.js +1 -1
  298. package/dist/domain/hopperValues.js +15 -136
  299. package/dist/domain/interfaceBuilderGraph.js +654 -0
  300. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  301. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  302. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  303. package/dist/domain/javascriptApplicationGraph.js +3 -13
  304. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  305. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  306. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  307. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  308. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  309. package/dist/domain/javascriptAstFingerprint.js +25 -58
  310. package/dist/domain/javascriptAstValues.js +9 -0
  311. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  312. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  313. package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
  314. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  315. package/dist/domain/javascriptFeatureSeed.js +20 -12
  316. package/dist/domain/javascriptFeatureTrace.js +13 -67
  317. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  318. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  319. package/dist/domain/javascriptNativeHandoff.js +1 -1
  320. package/dist/domain/javascriptReplay.js +24 -41
  321. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  322. package/dist/domain/javascriptRuntimeObservation.js +42 -103
  323. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  324. package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
  325. package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
  326. package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
  327. package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
  328. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
  329. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  330. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
  331. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  332. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  333. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  334. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  335. package/dist/domain/javascriptSemanticCalls.js +5 -32
  336. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  337. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  338. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  339. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  340. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  341. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  342. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  343. package/dist/domain/javascriptSemanticIr.js +1 -29
  344. package/dist/domain/javascriptSemanticObjects.js +1 -5
  345. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  346. package/dist/domain/javascriptSemanticProjection.js +0 -18
  347. package/dist/domain/javascriptSemanticPromises.js +9 -16
  348. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  349. package/dist/domain/javascriptSemanticQuery.js +17 -139
  350. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  351. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  352. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  353. package/dist/domain/javascriptSemanticResources.js +1 -6
  354. package/dist/domain/javascriptSemanticReturns.js +10 -27
  355. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  356. package/dist/domain/javascriptSemanticValues.js +44 -62
  357. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  358. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  359. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  360. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  361. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  362. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  363. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  364. package/dist/domain/jsonShape.js +7 -33
  365. package/dist/domain/localPath.js +7 -0
  366. package/dist/domain/managedApplicationGraph.js +9 -41
  367. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  368. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  369. package/dist/domain/managedArtifact.js +14 -27
  370. package/dist/domain/managedMemberComparison.js +90 -92
  371. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  372. package/dist/domain/managedMemberComparisonItems.js +221 -0
  373. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  374. package/dist/domain/managedNativeVerification.js +3 -6
  375. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  376. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  377. package/dist/domain/managedReconstruction.js +19 -23
  378. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  379. package/dist/domain/nativeApiBoundary.js +2 -7
  380. package/dist/domain/nativeInspection.js +0 -2
  381. package/dist/domain/nativeInvestigationGraph.js +351 -0
  382. package/dist/domain/nativeValueFlow.js +61 -0
  383. package/dist/domain/nodeRuntimeCharacterization.js +1 -5
  384. package/dist/domain/objcSwiftMetadata.js +254 -0
  385. package/dist/domain/peInspection.js +1 -1
  386. package/dist/domain/permissionPolicy.js +13 -0
  387. package/dist/domain/processCapture.js +76 -113
  388. package/dist/domain/processCaptureExample.js +68 -0
  389. package/dist/domain/processCaptureParsing.js +21 -0
  390. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  391. package/dist/domain/processCaptureValidation.js +1 -7
  392. package/dist/domain/processComparison.js +3 -12
  393. package/dist/domain/processReactiveMatching.js +29 -50
  394. package/dist/domain/processReactiveRuntime.js +4 -8
  395. package/dist/domain/processReactiveScenario.js +28 -94
  396. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  397. package/dist/domain/processReactiveTransition.js +33 -18
  398. package/dist/domain/processScenario.js +56 -90
  399. package/dist/domain/processTraceComparison.js +0 -8
  400. package/dist/domain/processTraceEvaluation.js +14 -4
  401. package/dist/domain/processTraceSpecification.js +11 -17
  402. package/dist/domain/protocolCapture.js +3 -3
  403. package/dist/domain/reconstructionCoverage.js +62 -129
  404. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  405. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  406. package/dist/domain/reconstructionReadiness.js +1 -2
  407. package/dist/domain/reconstructionReadinessSchemas.js +36 -38
  408. package/dist/domain/reconstructionUnknowns.js +3 -3
  409. package/dist/domain/reconstructionVerification.js +13 -47
  410. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  411. package/dist/domain/referenceSourceGraph.js +53 -61
  412. package/dist/domain/referenceSourceImportParsing.js +1 -5
  413. package/dist/domain/replayMachine.js +19 -31
  414. package/dist/domain/replayMachineRun.js +15 -63
  415. package/dist/domain/replayMachineRuntime.js +41 -41
  416. package/dist/domain/replayMachineValues.js +84 -0
  417. package/dist/domain/residualUnknown.js +25 -30
  418. package/dist/domain/runtimeCharacterization.js +15 -16
  419. package/dist/domain/runtimeIdentification.js +48 -47
  420. package/dist/domain/sourceToBundleComparison.js +9 -85
  421. package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
  422. package/dist/domain/sourceToBundleSignals.js +4 -15
  423. package/dist/domain/staticRuntimeCorrelation.js +37 -49
  424. package/dist/domain/symbolAnalysis.js +10 -19
  425. package/dist/domain/unicodeCodePointOrder.js +12 -0
  426. package/dist/domain/webBundleAnalysis.js +70 -99
  427. package/dist/domain/webBundleAnalyzer.js +2 -4
  428. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  429. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  430. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  431. package/dist/domain/webCaptureDiff.js +33 -73
  432. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  433. package/dist/domain/webContentArtifact.js +1 -10
  434. package/dist/domain/webMcpDiscovery.js +3 -14
  435. package/dist/domain/webScreenshot.js +58 -34
  436. package/dist/domain/zipPackageFormat.js +7 -0
  437. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  438. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  439. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  440. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  441. package/dist/dotnet/ManagedMemberRows.js +16 -16
  442. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  443. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  444. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  445. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  446. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  447. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  448. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
  449. package/dist/dotnet/ManagedPeReader.js +2 -2
  450. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  451. package/dist/generatedMcpToolCatalog.js +1 -1
  452. package/dist/generatedPackageMetadata.js +1 -1
  453. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  454. package/dist/ghidra/GhidraClient.js +4 -12
  455. package/dist/ghidra/GhidraClientWire.js +9 -5
  456. package/dist/ghidra/GhidraDefaults.js +0 -18
  457. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  458. package/dist/ghidra/GhidraDoctor.js +16 -12
  459. package/dist/ghidra/GhidraFunctionValues.js +65 -108
  460. package/dist/ghidra/GhidraInstallation.js +98 -42
  461. package/dist/ghidra/GhidraInventoryValues.js +16 -85
  462. package/dist/ghidra/GhidraLauncher.js +0 -8
  463. package/dist/ghidra/GhidraProvider.js +15 -22
  464. package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
  465. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  466. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  467. package/dist/ghidra/GhidraSessionValues.js +0 -2
  468. package/dist/ghidra/GhidraTransport.js +4 -7
  469. package/dist/ghidra/protocol.js +2 -2
  470. package/dist/hopper/BridgeLauncher.js +112 -36
  471. package/dist/hopper/HopperAnalysisProfile.js +1 -1
  472. package/dist/hopper/HopperCleanup.js +6 -3
  473. package/dist/hopper/HopperClient.js +4 -7
  474. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  475. package/dist/hopper/HopperProvider.js +0 -16
  476. package/dist/hopper/HopperRequestQueue.js +21 -40
  477. package/dist/hopper/HopperResponseStream.js +1 -9
  478. package/dist/hopper/HopperSessionValues.js +3 -2
  479. package/dist/hopper/HopperTargetLease.js +119 -0
  480. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  481. package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
  482. package/dist/hopper/protocol.js +6 -4
  483. package/dist/main/reload.js +0 -3
  484. package/dist/main/shutdown.js +1 -1
  485. package/dist/main/state.js +0 -9
  486. package/dist/main/transport.js +0 -5
  487. package/dist/mcpDoctor.js +25 -45
  488. package/dist/native/CommandRunner.js +18 -25
  489. package/dist/native/NativeMacOSProvider.js +13 -38
  490. package/dist/native/NativeMachoInspection.js +1 -1
  491. package/dist/process/BoundedFileBytes.js +17 -0
  492. package/dist/process/ExecFileOutput.js +11 -0
  493. package/dist/process/PendingOperations.js +8 -6
  494. package/dist/process/ProcessOwnership.js +3 -2
  495. package/dist/process/ProcessOwnershipObservation.js +0 -1
  496. package/dist/process/ProviderProcess.js +7 -28
  497. package/dist/reference/ReferenceSourceReader.js +8 -24
  498. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  499. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  500. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  501. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  502. package/dist/replay/JavaScriptReplayWorker.js +3 -5
  503. package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
  504. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  505. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  506. package/dist/replay/ReplayOutcome.js +1 -3
  507. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  508. package/dist/replay/ReplaySeccompFile.js +29 -0
  509. package/dist/replay/ReplayWorkerProtocol.js +0 -2
  510. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  511. package/dist/server/ProcessCaptureElicitation.js +4 -8
  512. package/dist/server/createServer.js +6 -44
  513. package/dist/server/promptCompletion.js +37 -61
  514. package/dist/server/recordDerivedEvidence.js +1 -1
  515. package/dist/server/registerApplicationTools/characterization.js +4 -8
  516. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
  517. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
  518. package/dist/server/registerApplicationTools/compareVersions.js +5 -10
  519. package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
  520. package/dist/server/registerApplicationTools/coverage.js +6 -71
  521. package/dist/server/registerApplicationTools/helpers.js +1 -13
  522. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  523. package/dist/server/registerApplicationTools/traceFeature.js +5 -9
  524. package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
  525. package/dist/server/registerApplicationTools.js +0 -2
  526. package/dist/server/registerArtifactComparisonTool.js +23 -27
  527. package/dist/server/registerBrowserScenarioTool.js +4 -4
  528. package/dist/server/registerBrowserTools.js +5 -8
  529. package/dist/server/registerBundleComparisonTool.js +5 -7
  530. package/dist/server/registerCloseLifecycleTool.js +2 -16
  531. package/dist/server/registerElectronTools.js +10 -29
  532. package/dist/server/registerEnhancedTools.js +10 -11
  533. package/dist/server/registerEvidenceTools.js +15 -22
  534. package/dist/server/registerFunctionComparisonTool.js +30 -25
  535. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  536. package/dist/server/registerInvestigationTools.js +20 -116
  537. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
  538. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
  539. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  540. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  541. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  542. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
  543. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
  544. package/dist/server/registerOfficialTools.js +1 -43
  545. package/dist/server/registerProcessComparisonTool.js +33 -23
  546. package/dist/server/registerPrompts.js +19 -17
  547. package/dist/server/registerSessionRecordTools.js +10 -156
  548. package/dist/server/registerSessionStatusTool.js +6 -69
  549. package/dist/server/registerSessionTools.js +10 -51
  550. package/dist/server/sessionAvailabilityPolicy.js +0 -2
  551. package/dist/server/sessionEvidence.js +9 -15
  552. package/dist/server/sessionToolPolicies.js +0 -8
  553. package/dist/server/toolResult.js +14 -50
  554. package/dist/serverIdentity.js +0 -20
  555. package/install.sh +1 -1
  556. package/package.json +11 -7
  557. package/scripts/electron-active-hook.cjs +23 -55
  558. package/scripts/hopper-demo-x11.py +13 -32
  559. package/skills/reverse-engineer-anything/SKILL.md +47 -12
  560. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  561. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  562. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  563. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
  564. package/dist/application/BoundedJsonFiles.js +0 -86
  565. package/dist/application/CrossVersionInventory.js +0 -129
  566. package/dist/application/CrossVersionInvestigation.js +0 -301
  567. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  568. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  569. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  570. package/dist/application/DeferredFileAuthorization.js +0 -61
  571. package/dist/application/DoctorProjection.js +0 -43
  572. package/dist/application/EnhancedToolPagination.js +0 -22
  573. package/dist/application/EvidenceReferenceResolver.js +0 -26
  574. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  575. package/dist/application/ProcessPairedExperiment.js +0 -72
  576. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  577. package/dist/application/ReconstructionReadinessService.js +0 -48
  578. package/dist/cliInvestigationCommands.js +0 -173
  579. package/dist/domain/boundedCartesianProjection.js +0 -15
  580. package/dist/domain/investigationWorkspace.js +0 -347
  581. package/dist/domain/jsonLimits.js +0 -26
  582. package/dist/domain/knownPageCoverage.js +0 -29
  583. package/dist/domain/processPairedExperiment.js +0 -128
  584. package/dist/server/javascriptApplicationResult.js +0 -106
  585. package/dist/server/permissionFailure.js +0 -12
  586. package/dist/server/registerApplicationTools/readiness.js +0 -50
  587. package/dist/server/registerEvidenceResources.js +0 -315
  588. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  589. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  590. package/dist/server/registerReconstructionReadinessResource.js +0 -32
@@ -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,
@@ -54,12 +52,11 @@ const runElectronInspection = async (context, state, startedAt) => {
54
52
  await assertStableMainFrame(context, state, main.file_path);
55
53
  await report(context.progress, 3, "Electron inspection complete");
56
54
  return {
57
- schema_version: 1,
58
55
  browser: context.discovery.version,
59
56
  target: {
60
57
  target_id: context.target.id,
61
58
  type: context.target.type,
62
- title: context.target.title.slice(0, 16_384),
59
+ title: context.target.title,
63
60
  file_path: main.file_path,
64
61
  attached: context.target.attached,
65
62
  },
@@ -78,26 +75,25 @@ const authorizeInitialFrames = async (context, state) => {
78
75
  await report(context.progress, 1, "Authorizing Electron file frames");
79
76
  await context.connection.send("Page.enable", {}, context.sessionId, context.signal);
80
77
  const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
81
- const frames = await captureFrames(result, state.roots, context.input.limits.max_frames, state.completeness);
78
+ const frames = await captureFrames(result, state.completeness);
82
79
  if (frames[0] === undefined)
83
80
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
84
81
  return frames;
85
82
  };
86
83
  const enableElectronCapture = async (context) => {
87
84
  await context.connection.send("Runtime.enable", {}, context.sessionId, context.signal);
88
- 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);
89
86
  };
90
87
  const captureElectronContent = async (context, state, frames) => {
91
88
  await report(context.progress, 2, "Capturing Electron structure");
92
89
  const frameIds = new Set(frames.map((frame) => frame.frame_id));
93
- const resources = await captureResources(context, state.roots, state.completeness);
94
- 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);
95
92
  const scripts = await captureElectronScripts({
96
93
  connection: context.connection,
97
94
  sessionId: context.sessionId,
98
95
  ...(context.signal === undefined ? {} : { signal: context.signal }),
99
96
  request: context.input,
100
- roots: state.roots,
101
97
  scripts: state.scripts,
102
98
  executionContextFrames: state.executionContextFrames,
103
99
  frameIds,
@@ -108,7 +104,6 @@ const captureElectronContent = async (context, state, frames) => {
108
104
  ...(context.signal === undefined ? {} : { signal: context.signal }),
109
105
  target: context.target,
110
106
  request: context.input,
111
- roots: state.roots,
112
107
  frameIds,
113
108
  completeness: state.completeness,
114
109
  limitations: state.limitations,
@@ -117,7 +112,7 @@ const captureElectronContent = async (context, state, frames) => {
117
112
  };
118
113
  const assertStableMainFrame = async (context, state, expectedPath) => {
119
114
  const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
120
- const afterPath = await mainFilePath(result, state.roots);
115
+ const afterPath = await mainFilePath(result);
121
116
  if (afterPath === undefined)
122
117
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
123
118
  if (state.navigationDuringCapture || afterPath !== expectedPath)
@@ -133,7 +128,7 @@ const navigatedFrameId = (event) => {
133
128
  return stringValue(params.frameId);
134
129
  return undefined;
135
130
  };
136
- const captureFrames = async (result, roots, maximum, completeness) => {
131
+ const captureFrames = async (result, completeness) => {
137
132
  const frameTree = recordValue(requiredRecord(result).frameTree);
138
133
  if (frameTree === undefined)
139
134
  throw new BrowserObservationError("inspect_web_page", "protocol_error");
@@ -145,26 +140,22 @@ const captureFrames = async (result, roots, maximum, completeness) => {
145
140
  break;
146
141
  const frame = recordValue(current.tree.frame);
147
142
  const frameId = stringValue(frame?.id);
148
- const path = await authorizedElectronFile(stringValue(frame?.url) ?? "", roots);
143
+ const path = await authorizedElectronFile(stringValue(frame?.url) ?? "");
149
144
  if (frameId === undefined || path === undefined) {
150
145
  completeness.exclude("frames", "out_of_target_scope");
151
146
  continue;
152
147
  }
153
- if (frames.length >= maximum) {
154
- completeness.truncate("frames");
155
- continue;
156
- }
157
148
  frames.push({
158
- frame_id: frameId.slice(0, 256),
149
+ frame_id: frameId,
159
150
  parent_frame_id: current.parent,
160
151
  file_path: path,
161
152
  });
162
153
  for (const child of recordsValue(current.tree.childFrames))
163
- pending.push({ tree: child, parent: frameId.slice(0, 256) });
154
+ pending.push({ tree: child, parent: frameId });
164
155
  }
165
156
  return frames;
166
157
  };
167
- const captureResources = async (context, roots, completeness) => {
158
+ const captureResources = async (context, completeness) => {
168
159
  const result = await context.connection.send("Page.getResourceTree", {}, context.sessionId, context.signal);
169
160
  const root = recordValue(requiredRecord(result).frameTree);
170
161
  if (root === undefined)
@@ -177,27 +168,23 @@ const captureResources = async (context, roots, completeness) => {
177
168
  if (tree === undefined)
178
169
  break;
179
170
  for (const resource of recordsValue(tree.resources)) {
180
- const path = await authorizedElectronFile(stringValue(resource.url) ?? "", roots);
171
+ const path = await authorizedElectronFile(stringValue(resource.url) ?? "");
181
172
  if (path === undefined) {
182
173
  completeness.exclude("resources", "out_of_target_scope");
183
174
  continue;
184
175
  }
185
176
  const item = {
186
177
  file_path: path,
187
- type: (stringValue(resource.type) ?? "Other").slice(0, 100),
188
- mime_type: (stringValue(resource.mimeType) ?? "").slice(0, 256),
178
+ type: stringValue(resource.type) ?? "Other",
179
+ mime_type: stringValue(resource.mimeType) ?? "",
189
180
  content_size: numberValue(resource.contentSize) === undefined
190
181
  ? null
191
182
  : Math.max(0, numberValue(resource.contentSize) ?? 0),
192
183
  };
193
- const resourceKey = `electron_resource_${digest(item)}`;
184
+ const resourceKey = `electron_resource_${canonicalJsonDigest(item)}`;
194
185
  if (seen.has(resourceKey))
195
186
  continue;
196
187
  seen.add(resourceKey);
197
- if (resources.length >= context.input.limits.max_resources) {
198
- completeness.truncate("resources");
199
- continue;
200
- }
201
188
  resources.push({
202
189
  resource_key: resourceKey,
203
190
  ...item,
@@ -207,7 +194,7 @@ const captureResources = async (context, roots, completeness) => {
207
194
  }
208
195
  return resources.sort((left, right) => left.resource_key.localeCompare(right.resource_key));
209
196
  };
210
- const captureDom = async (context, roots, completeness) => {
197
+ const captureDom = async (context, completeness) => {
211
198
  const result = requiredRecord(await context.connection.send("DOMSnapshot.captureSnapshot", { computedStyles: [], includePaintOrder: false, includeDOMRects: false }, context.sessionId, context.signal));
212
199
  const strings = Array.isArray(result.strings)
213
200
  ? result.strings.map((value) => (typeof value === "string" ? value : ""))
@@ -216,7 +203,7 @@ const captureDom = async (context, roots, completeness) => {
216
203
  let total = 0;
217
204
  for (const document of recordsValue(result.documents)) {
218
205
  const documentUrl = stringAt(strings, document.documentURL);
219
- if ((await authorizedElectronFile(documentUrl, roots)) === undefined) {
206
+ if ((await authorizedElectronFile(documentUrl)) === undefined) {
220
207
  completeness.exclude("dom", "out_of_target_scope");
221
208
  continue;
222
209
  }
@@ -229,31 +216,26 @@ const captureDom = async (context, roots, completeness) => {
229
216
  const baseIndex = nodes.length;
230
217
  total += nodeTypes.length;
231
218
  for (let index = 0; index < nodeTypes.length; index += 1) {
232
- if (nodes.length >= context.input.limits.max_dom_nodes)
233
- continue;
234
219
  const attributeIndexes = arrayValue(attributes[index]);
235
220
  const parent = integer(parents[index], -1);
236
221
  nodes.push({
237
222
  index: nodes.length,
238
223
  parent_index: parent < 0 ? -1 : baseIndex + parent,
239
224
  node_type: integer(nodeTypes[index], 0),
240
- node_name: stringAt(strings, nodeNames[index]).slice(0, 1_024),
225
+ node_name: stringAt(strings, nodeNames[index]),
241
226
  node_value_length: Buffer.byteLength(stringAt(strings, nodeValues[index])),
242
227
  attribute_names: attributeIndexes
243
228
  .filter((_value, attributeIndex) => attributeIndex % 2 === 0)
244
- .map((value) => stringAt(strings, value).slice(0, 1_024))
245
- .slice(0, 256),
229
+ .map((value) => stringAt(strings, value)),
246
230
  });
247
231
  }
248
232
  }
249
- if (total > nodes.length)
250
- completeness.truncate("dom");
251
233
  return { total_nodes: total, nodes };
252
234
  };
253
- const mainFilePath = async (result, roots) => {
235
+ const mainFilePath = async (result) => {
254
236
  const frameTree = recordValue(requiredRecord(result).frameTree);
255
237
  const frame = recordValue(frameTree?.frame);
256
- return await authorizedElectronFile(stringValue(frame?.url) ?? "", roots);
238
+ return await authorizedElectronFile(stringValue(frame?.url) ?? "");
257
239
  };
258
240
  const arrayValue = (value) => Array.isArray(value) ? value : [];
259
241
  const stringAt = (strings, value) => strings[integer(value, -1)] ?? "";
@@ -261,12 +243,6 @@ const integer = (value, fallback) => {
261
243
  const number = numberValue(value);
262
244
  return number === undefined ? fallback : Math.trunc(number);
263
245
  };
264
- const digest = (value) => {
265
- const encoded = canonicalize(value);
266
- if (encoded === undefined)
267
- throw new TypeError("Expected canonical JSON");
268
- return createHash("sha256").update(encoded).digest("hex");
269
- };
270
246
  const report = async (progress, completed, message) => await progress?.report({
271
247
  phase: "browser_observation",
272
248
  completed,
@@ -4,7 +4,7 @@ import { err, ok } from "../domain/result.js";
4
4
  import { discoverCdpEndpoint, hasCdpTargetWebSocket, } from "./CdpEndpoint.js";
5
5
  import { closeCdpTargetSession, openCdpTargetSession, } from "./CdpTargetSession.js";
6
6
  import { inspectCdpElectronPage } from "./CdpElectronInspection.js";
7
- import { authorizedElectronFile, canonicalElectronRoots, } from "./ElectronFileScope.js";
7
+ import { authorizedElectronFile } from "./ElectronFileScope.js";
8
8
  /** Public identity committed by passive Electron observations. */
9
9
  export const CDP_ELECTRON_PROVIDER_IDENTITY = Object.freeze({
10
10
  id: "rea-cdp-electron",
@@ -12,17 +12,15 @@ export const CDP_ELECTRON_PROVIDER_IDENTITY = Object.freeze({
12
12
  version: "1",
13
13
  });
14
14
  const IDENTITY = CDP_ELECTRON_PROVIDER_IDENTITY;
15
- /** Passive Electron provider with canonical file-root confinement. */
15
+ /** Passive Electron provider for local file pages exposed by loopback CDP. */
16
16
  export class CdpElectronProvider {
17
17
  identity() {
18
18
  return IDENTITY;
19
19
  }
20
20
  async listTargets(input, options = {}) {
21
21
  try {
22
- const roots = await canonicalElectronRoots(input.allowed_file_roots);
23
22
  const discovery = await discoverCdpEndpoint(input.cdp_endpoint, "list_electron_targets", options.signal);
24
23
  const allowed = [];
25
- let outsideRoot = 0;
26
24
  let unsupportedUrl = 0;
27
25
  let nonPage = 0;
28
26
  let unconnectable = 0;
@@ -31,12 +29,9 @@ export class CdpElectronProvider {
31
29
  nonPage += 1;
32
30
  continue;
33
31
  }
34
- const path = await authorizedElectronFile(target.url, roots);
32
+ const path = await authorizedElectronFile(target.url);
35
33
  if (path === undefined) {
36
- if (isFileUrl(target.url))
37
- outsideRoot += 1;
38
- else
39
- unsupportedUrl += 1;
34
+ unsupportedUrl += 1;
40
35
  continue;
41
36
  }
42
37
  if (!hasCdpTargetWebSocket(discovery, target)) {
@@ -46,32 +41,21 @@ export class CdpElectronProvider {
46
41
  allowed.push({
47
42
  target_id: target.id,
48
43
  type: target.type,
49
- title: target.title.slice(0, 16_384),
44
+ title: target.title,
50
45
  file_path: path,
51
46
  attached: target.attached,
52
47
  });
53
48
  }
54
49
  allowed.sort((left, right) => left.target_id.localeCompare(right.target_id));
55
- const items = allowed.slice(input.offset, input.offset + input.limit);
56
- const next = input.offset + items.length;
57
50
  return ok(electronTargetListSchema.parse({
58
- schema_version: 1,
59
51
  browser: discovery.version,
60
- targets: {
61
- items,
62
- offset: input.offset,
63
- limit: input.limit,
64
- total: allowed.length,
65
- next_offset: next < allowed.length ? next : null,
66
- has_more: next < allowed.length,
67
- },
52
+ targets: allowed,
68
53
  excluded: {
69
- outside_root: outsideRoot,
70
54
  unsupported_url: unsupportedUrl,
71
55
  non_page: nonPage,
72
56
  },
73
57
  limitations: [
74
- "Only page targets whose canonical file path is contained by an approved root are listed.",
58
+ "Every local file page exposed by the selected loopback CDP endpoint is eligible for listing.",
75
59
  ...(unconnectable === 0
76
60
  ? []
77
61
  : [
@@ -87,9 +71,8 @@ export class CdpElectronProvider {
87
71
  async inspectPage(input, options = {}) {
88
72
  let targetSession;
89
73
  try {
90
- const roots = await canonicalElectronRoots(input.allowed_file_roots);
91
74
  const discovery = await discoverCdpEndpoint(input.cdp_endpoint, "inspect_electron_page", options.signal);
92
- const target = await authorizeTarget(discovery.targets, input.target_id, roots);
75
+ const target = await authorizeTarget(discovery.targets, input.target_id);
93
76
  targetSession = await openCdpTargetSession(discovery, target, "inspect_electron_page", options.signal);
94
77
  return ok(electronPageInspectionSchema.parse(await inspectCdpElectronPage({
95
78
  connection: targetSession.connection,
@@ -116,23 +99,15 @@ export class CdpElectronProvider {
116
99
  }
117
100
  }
118
101
  }
119
- const authorizeTarget = async (targets, targetId, roots) => {
102
+ const authorizeTarget = async (targets, targetId) => {
120
103
  const target = targets.find(({ id }) => id === targetId);
121
104
  if (target === undefined)
122
105
  throw new BrowserObservationError("inspect_web_page", "target_not_found");
123
106
  if (target.type !== "page" ||
124
- (await authorizedElectronFile(target.url, roots)) === undefined)
107
+ (await authorizedElectronFile(target.url)) === undefined)
125
108
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
126
109
  return target;
127
110
  };
128
- const isFileUrl = (value) => {
129
- try {
130
- return new URL(value).protocol === "file:";
131
- }
132
- catch {
133
- return false;
134
- }
135
- };
136
111
  const providerError = (cause, operation) => cause instanceof BrowserObservationError && cause.operation !== operation
137
112
  ? new BrowserObservationError(operation, cause.reason, { cause })
138
113
  : cause instanceof AnalysisError
@@ -1,6 +1,6 @@
1
1
  import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
2
- import { boundedText, numberValue, recordValue, stringValue, } from "./CdpCaptureValues.js";
3
- /** Retain only bounded script/frame metadata from passive Electron events. */
2
+ import { numberValue, recordValue, stringValue } from "./CdpCaptureValues.js";
3
+ /** Retain script/frame metadata from passive Electron events. */
4
4
  export const ingestElectronScriptEvent = (input) => {
5
5
  if (input.event.method === "Runtime.executionContextsCleared") {
6
6
  input.executionContextFrames.clear();
@@ -14,7 +14,7 @@ export const ingestElectronScriptEvent = (input) => {
14
14
  return;
15
15
  }
16
16
  if (input.event.method === "Runtime.executionContextCreated") {
17
- retainExecutionContext(input.event, input.executionContextFrames, input.completeness);
17
+ retainExecutionContext(input.event, input.executionContextFrames);
18
18
  return;
19
19
  }
20
20
  if (input.event.method !== "Debugger.scriptParsed")
@@ -22,7 +22,7 @@ export const ingestElectronScriptEvent = (input) => {
22
22
  const value = recordValue(input.event.params);
23
23
  const scriptId = stringValue(value?.scriptId);
24
24
  const rawUrl = stringValue(value?.url);
25
- if (scriptId === undefined || scriptId.length > 256) {
25
+ if (scriptId === undefined) {
26
26
  input.completeness.exclude("scripts", "invalid_protocol_value");
27
27
  return;
28
28
  }
@@ -30,31 +30,23 @@ export const ingestElectronScriptEvent = (input) => {
30
30
  input.completeness.exclude("scripts", "unattributed_origin");
31
31
  return;
32
32
  }
33
- if (input.scripts.length >= 2_000) {
34
- input.completeness.drop("scripts");
35
- return;
36
- }
37
33
  input.scripts.push({
38
34
  scriptId,
39
35
  rawUrl,
40
- hash: (stringValue(value?.hash) ?? "").slice(0, 512),
36
+ hash: stringValue(value?.hash) ?? "",
41
37
  length: nonnegativeInteger(value?.length),
42
38
  isModule: value?.isModule === true,
43
- language: boundedText(value?.scriptLanguage, 100),
39
+ language: stringValue(value?.scriptLanguage) ?? null,
44
40
  executionContextKey: executionContextKey(value?.executionContextId),
45
41
  });
46
42
  };
47
- const retainExecutionContext = (event, frames, completeness) => {
43
+ const retainExecutionContext = (event, frames) => {
48
44
  const parameters = recordValue(event.params);
49
45
  const runtimeContext = recordValue(parameters?.context);
50
46
  const contextKey = executionContextKey(runtimeContext?.id);
51
47
  const frameId = stringValue(recordValue(runtimeContext?.auxData)?.frameId);
52
- if (contextKey === null || frameId === undefined || frameId.length > 256)
48
+ if (contextKey === null || frameId === undefined)
53
49
  return;
54
- if (frames.size >= 2_000 && !frames.has(contextKey)) {
55
- completeness.truncate("scripts");
56
- return;
57
- }
58
50
  frames.set(contextKey, frameId);
59
51
  };
60
52
  const nonnegativeInteger = (value) => {
@@ -1,17 +1,15 @@
1
- import { createHash } from "node:crypto";
2
- import canonicalize from "canonicalize";
3
1
  import { createWebTextArtifact } from "../domain/webContentArtifact.js";
4
2
  import { CdpCaptureCompleteness } from "./CdpCaptureCompleteness.js";
3
+ import { canonicalJsonDigest } from "./CdpCanonicalJsonDigest.js";
5
4
  import { requiredRecord, stringValue } from "./CdpCaptureValues.js";
6
5
  import { authorizedElectronFile } from "./ElectronFileScope.js";
7
- /** Normalize root-confined script metadata and optionally approved source. */
6
+ /** Normalize local script metadata and optionally approved source. */
8
7
  export const captureElectronScripts = async (input) => {
9
8
  let total = 0;
10
- let sourceBytes = 0;
11
9
  const items = [];
12
10
  const seen = new Set();
13
11
  for (const script of input.scripts) {
14
- const path = await authorizedElectronFile(script.rawUrl, input.roots);
12
+ const path = await authorizedElectronFile(script.rawUrl);
15
13
  if (path === undefined) {
16
14
  input.completeness.exclude("scripts", "out_of_target_scope");
17
15
  continue;
@@ -29,17 +27,12 @@ export const captureElectronScripts = async (input) => {
29
27
  is_module: script.isModule,
30
28
  language: script.language,
31
29
  };
32
- const scriptKey = `electron_script_${digest(identity)}`;
30
+ const scriptKey = `electron_script_${canonicalJsonDigest(identity)}`;
33
31
  if (seen.has(scriptKey))
34
32
  continue;
35
33
  seen.add(scriptKey);
36
34
  total += 1;
37
- if (items.length >= input.request.limits.max_scripts) {
38
- input.completeness.drop("scripts");
39
- continue;
40
- }
41
- const capturedSource = await captureScriptSource(input, script, sourceBytes);
42
- sourceBytes += capturedSource.bytes;
35
+ const capturedSource = await captureScriptSource(input, script);
43
36
  items.push({
44
37
  script_key: scriptKey,
45
38
  ...identity,
@@ -53,42 +46,20 @@ export const captureElectronScripts = async (input) => {
53
46
  items: items.sort((left, right) => left.script_key.localeCompare(right.script_key)),
54
47
  };
55
48
  };
56
- const captureScriptSource = async (input, script, sourceBytes) => {
49
+ const captureScriptSource = async (input, script) => {
57
50
  if (!input.request.include_script_sources)
58
51
  return {
59
52
  source: {
60
53
  included: false,
61
54
  reason: "source capture was not approved",
62
55
  },
63
- bytes: 0,
64
56
  };
65
- if (sourceLimitReached(input.request.limits, script.length, sourceBytes))
66
- return sourceLimitResult(input.completeness);
67
57
  const result = requiredRecord(await input.connection.send("Debugger.getScriptSource", { scriptId: script.scriptId }, input.sessionId, input.signal));
68
58
  const text = stringValue(result.scriptSource) ?? "";
69
- const bytes = Buffer.byteLength(text);
70
- if (sourceLimitReached(input.request.limits, bytes, sourceBytes))
71
- return sourceLimitResult(input.completeness);
72
59
  return {
73
60
  source: {
74
61
  included: true,
75
62
  artifact: createWebTextArtifact(text, "text/javascript"),
76
63
  },
77
- bytes,
78
- };
79
- };
80
- const sourceLimitReached = (limits, bytes, previousBytes) => bytes > limits.max_script_source_bytes ||
81
- previousBytes + bytes > limits.max_total_script_source_bytes;
82
- const sourceLimitResult = (completeness) => {
83
- completeness.truncate("script_sources");
84
- return {
85
- source: { included: false, reason: "script source byte limit reached" },
86
- bytes: 0,
87
64
  };
88
65
  };
89
- const digest = (value) => {
90
- const encoded = canonicalize(value);
91
- if (encoded === undefined)
92
- throw new TypeError("Expected canonical JSON");
93
- return createHash("sha256").update(encoded).digest("hex");
94
- };