rea-agents 3.1.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 (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
@@ -1,28 +1,23 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { constants } from "node:fs";
3
- import { lstat, mkdir, open, realpath, rm } from "node:fs/promises";
3
+ import { lstat, mkdir, open, realpath, rm, } from "node:fs/promises";
4
4
  import { basename, dirname, isAbsolute, join, resolve } from "node:path";
5
5
  import { streamChunkToBuffer } from "./StreamBytes.js";
6
6
  import { ArtifactPathRegistry, normalizeArtifactPath, } from "./ArtifactPaths.js";
7
- import { ArtifactReaderFailure, } from "./ArtifactReader.js";
7
+ import { ArtifactReaderFailure } from "./ArtifactReader.js";
8
8
  /** Symlink-resistant materialization in an exclusively owned, initially absent tree. */
9
9
  export class SafeOutputTree {
10
10
  #registry = new ArtifactPathRegistry();
11
- #limits;
12
11
  #outputRoot;
13
- #stagingRoot;
14
- #totalBytes = 0;
15
12
  #published = false;
16
13
  #cleanup = {
17
14
  status: "not-required",
18
15
  };
19
- constructor(outputRoot, stagingRoot, limits) {
16
+ constructor(outputRoot) {
20
17
  this.#outputRoot = outputRoot;
21
- this.#stagingRoot = stagingRoot;
22
- this.#limits = limits;
23
18
  }
24
19
  /** Exclusively create the absent destination as this operation's owned tree. */
25
- static async create(outputRoot, limits) {
20
+ static async create(outputRoot) {
26
21
  if (!isAbsolute(outputRoot))
27
22
  throw new ArtifactReaderFailure("path", "Extraction output root must be absolute");
28
23
  const requested = resolve(outputRoot);
@@ -46,7 +41,7 @@ export class SafeOutputTree {
46
41
  finally {
47
42
  await stagingHandle.close();
48
43
  }
49
- return new SafeOutputTree(canonicalOutput, canonicalOutput, limits);
44
+ return new SafeOutputTree(canonicalOutput);
50
45
  }
51
46
  catch (cause) {
52
47
  await rm(canonicalOutput, { recursive: true, force: true });
@@ -59,10 +54,10 @@ export class SafeOutputTree {
59
54
  get cleanup() {
60
55
  return structuredClone(this.#cleanup);
61
56
  }
62
- /** Stream one selected regular file with exact byte and digest verification. */
57
+ /** Stream one regular file with exact byte and digest verification. */
63
58
  async write(relativePath, source, expectedSha256, signal) {
64
59
  this.#assertWritable();
65
- const path = normalizeArtifactPath(relativePath, this.#limits);
60
+ const path = normalizeArtifactPath(relativePath);
66
61
  this.#registry.add(path, "file");
67
62
  const destination = await this.#prepareParent(path);
68
63
  const handle = await open(destination, constants.O_CREAT |
@@ -78,10 +73,6 @@ export class SafeOutputTree {
78
73
  abortIfNeeded(signal);
79
74
  const chunk = streamChunkToBuffer(raw);
80
75
  bytes += chunk.length;
81
- if (bytes > this.#limits.maxEntryBytes)
82
- throw new ArtifactReaderFailure("limit", `Observed entry bytes exceed limit: ${path}`);
83
- if (this.#totalBytes + bytes > this.#limits.maxTotalBytes)
84
- throw new ArtifactReaderFailure("limit", "Observed extraction bytes exceed cumulative limit");
85
76
  hash.update(chunk);
86
77
  await writeAll(handle, chunk);
87
78
  }
@@ -93,7 +84,6 @@ export class SafeOutputTree {
93
84
  const readback = await hashFile(destination, bytes, signal);
94
85
  if (readback.sha256 !== sha256 || readback.bytes !== bytes)
95
86
  throw new ArtifactReaderFailure("integrity", `Durable readback verification failed: ${path}`);
96
- this.#totalBytes += bytes;
97
87
  return { relativePath: path, sha256, bytesWritten: bytes };
98
88
  }
99
89
  catch (cause) {
@@ -105,9 +95,10 @@ export class SafeOutputTree {
105
95
  async commit() {
106
96
  this.#assertWritable();
107
97
  const parent = await open(dirname(this.#outputRoot), constants.O_RDONLY | constants.O_DIRECTORY);
108
- const staging = await open(this.#stagingRoot, constants.O_RDONLY | constants.O_DIRECTORY);
98
+ let output;
109
99
  try {
110
- await staging.sync();
100
+ output = await open(this.#outputRoot, constants.O_RDONLY | constants.O_DIRECTORY);
101
+ await output.sync();
111
102
  await parent.sync();
112
103
  this.#published = true;
113
104
  }
@@ -115,20 +106,20 @@ export class SafeOutputTree {
115
106
  throw new ArtifactReaderFailure("path", "Could not durably sync extraction output", { cause });
116
107
  }
117
108
  finally {
118
- await Promise.allSettled([parent.close(), staging.close()]);
109
+ await Promise.allSettled([parent.close(), output?.close()]);
119
110
  }
120
111
  }
121
112
  /** Remove only this operation's unsealed tree and verify absence. */
122
113
  async rollback() {
123
114
  if (this.#published)
124
115
  return structuredClone(this.#cleanup);
125
- await rm(this.#stagingRoot, { recursive: true, force: true });
126
- const absent = await isAbsent(this.#stagingRoot);
116
+ await rm(this.#outputRoot, { recursive: true, force: true });
117
+ const absent = await isAbsent(this.#outputRoot);
127
118
  this.#cleanup = absent
128
119
  ? { status: "complete", residualPaths: [] }
129
120
  : {
130
121
  status: "incomplete",
131
- residualPaths: [basename(this.#stagingRoot)],
122
+ residualPaths: [basename(this.#outputRoot)],
132
123
  };
133
124
  if (!absent)
134
125
  throw new ArtifactReaderFailure("integrity", "Extraction output cleanup could not be verified");
@@ -139,7 +130,7 @@ export class SafeOutputTree {
139
130
  const fileName = parts.pop();
140
131
  if (fileName === undefined)
141
132
  throw new ArtifactReaderFailure("path", "Invalid extraction path");
142
- let current = this.#stagingRoot;
133
+ let current = this.#outputRoot;
143
134
  for (const part of parts) {
144
135
  current = join(current, part);
145
136
  await mkdir(current, { mode: 0o700 }).catch((cause) => {
@@ -69,7 +69,7 @@ const startupError = (options, startedAt, state) => new BrowserStartupError({
69
69
  elapsedMs: Math.max(0, Math.round(performance.now() - startedAt)),
70
70
  exitCode: options.child.exitCode,
71
71
  signalCode: options.child.signalCode,
72
- stderr: boundedStderr(options.stderr()),
72
+ stderr: options.stderr(),
73
73
  }, state.failure === "spawn-error" ? { cause: state.cause } : undefined);
74
74
  const readDevtoolsPort = async (path) => {
75
75
  try {
@@ -83,6 +83,5 @@ const readDevtoolsPort = async (path) => {
83
83
  return null;
84
84
  }
85
85
  };
86
- const boundedStderr = (stderr) => stderr.length <= 65_536 ? stderr : stderr.slice(-65_536);
87
86
  const delay = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
88
87
  const browserStartupMessage = (failure, diagnostics) => `Chrome CDP startup ${failure}; executable=${diagnostics.executable}; elapsed_ms=${String(diagnostics.elapsedMs)}; exit_code=${diagnostics.exitCode === null ? "null" : String(diagnostics.exitCode)}; signal=${diagnostics.signalCode ?? "null"}; stderr=${diagnostics.stderr.length === 0 ? "<empty>" : diagnostics.stderr}`;
@@ -0,0 +1,16 @@
1
+ import { BrowserObservationError } from "../domain/errors.js";
2
+ import { mainFrameUrl } from "./CdpCaptureDocuments.js";
3
+ import { allowedSanitizedUrl, delayWithCancellation, isHttpUrl, } from "./CdpCaptureValues.js";
4
+ /** Wait for the attached target's main frame to enter its approved origin. */
5
+ export const authorizedMainFrame = async ({ connection, sessionId, signal, allowedOrigins, delayOperation, }) => {
6
+ for (let attempt = 0; attempt < 80; attempt += 1) {
7
+ const result = await connection.send("Page.getFrameTree", {}, sessionId, signal);
8
+ const url = mainFrameUrl(result);
9
+ if (allowedSanitizedUrl(url, allowedOrigins) !== undefined)
10
+ return result;
11
+ if (isHttpUrl(url))
12
+ throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
13
+ await delayWithCancellation(25, delayOperation, signal);
14
+ }
15
+ throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
16
+ };
@@ -33,19 +33,9 @@ export class CdpBrowserProvider {
33
33
  const discovery = await discoverCdpEndpoint(input.cdp_endpoint, "list_browser_targets", options.signal);
34
34
  const allowedOrigins = new Set(input.allowed_origins);
35
35
  const selected = selectTargets(discovery, allowedOrigins);
36
- const items = selected.allowed.slice(input.offset, input.offset + input.limit);
37
- const nextOffset = input.offset + items.length;
38
36
  return ok(browserTargetListSchema.parse({
39
- schema_version: 1,
40
37
  browser: discovery.version,
41
- targets: {
42
- items,
43
- offset: input.offset,
44
- limit: input.limit,
45
- total: selected.allowed.length,
46
- next_offset: nextOffset < selected.allowed.length ? nextOffset : null,
47
- has_more: nextOffset < selected.allowed.length,
48
- },
38
+ targets: selected.allowed,
49
39
  excluded: selected.excluded,
50
40
  limitations: [
51
41
  "Only page targets whose current URL matches an approved exact origin are listed.",
@@ -76,7 +66,7 @@ export class CdpBrowserProvider {
76
66
  const sourceMaps = input.fetch_source_maps
77
67
  ? await fetchWebSourceMaps(captured.sourceMapRequests, input, options.signal)
78
68
  : undefined;
79
- return ok(webBundleAnalysisSchema.parse(analyzeCapturedWebBundle(captured.inspection, input, sourceMaps)));
69
+ return ok(webBundleAnalysisSchema.parse(analyzeCapturedWebBundle(captured.inspection, sourceMaps)));
80
70
  }
81
71
  catch (cause) {
82
72
  return err(providerError(cause, "analyze_web_bundle"));
@@ -228,7 +218,7 @@ const selectTargets = (discovery, allowedOrigins) => {
228
218
  allowed.push({
229
219
  target_id: target.id,
230
220
  type: target.type,
231
- title: target.title.slice(0, 16_384),
221
+ title: target.title,
232
222
  url: url.url,
233
223
  origin: url.origin,
234
224
  attached: target.attached,
@@ -0,0 +1,9 @@
1
+ import { createHash } from "node:crypto";
2
+ import canonicalize from "canonicalize";
3
+ /** Hash a value using the canonical JSON representation. */
4
+ export const canonicalJsonDigest = (value) => {
5
+ const encoded = canonicalize(value);
6
+ if (encoded === undefined)
7
+ throw new TypeError("Expected canonical JSON");
8
+ return createHash("sha256").update(encoded).digest("hex");
9
+ };
@@ -1,17 +1,16 @@
1
- import { allowedSanitizedUrl, boundedText, numberValue, recordValue, recordsValue, requiredRecord, stringValue, } from "./CdpCaptureValues.js";
1
+ import { allowedSanitizedUrl, numberValue, recordValue, recordsValue, requiredRecord, stringValue, } from "./CdpCaptureValues.js";
2
2
  import { exclusionReasonForUrl } from "./CdpCaptureEventHelpers.js";
3
- /** Normalize allowed frames while retaining a bounded prefix and total count. */
3
+ /** Normalize every allowed frame, optionally selecting a leading frame. */
4
4
  export const captureFrames = (result, allowedOrigins, maximum, completeness) => {
5
5
  const root = recordValue(requiredRecord(result).frameTree);
6
6
  if (root === undefined)
7
- return { total: 0, items: [] };
7
+ return { items: [] };
8
8
  const items = [];
9
- let total = 0;
10
9
  for (const tree of walkFrameTrees(root)) {
11
10
  const frame = recordValue(tree.frame);
12
11
  const frameId = stringValue(frame?.id);
13
12
  const sanitized = allowedSanitizedUrl(frame?.url, allowedOrigins);
14
- if (frame === undefined || frameId === undefined || frameId.length > 256) {
13
+ if (frame === undefined || frameId === undefined) {
15
14
  completeness?.exclude("frames", "invalid_protocol_value");
16
15
  continue;
17
16
  }
@@ -19,27 +18,25 @@ export const captureFrames = (result, allowedOrigins, maximum, completeness) =>
19
18
  completeness?.exclude("frames", exclusionReasonForUrl(stringValue(frame.url)));
20
19
  continue;
21
20
  }
22
- total += 1;
23
- if (items.length >= maximum)
21
+ if (maximum !== undefined && items.length >= maximum)
24
22
  continue;
25
23
  items.push({
26
24
  frame_id: frameId,
27
- parent_frame_id: (stringValue(frame.parentId) ?? "").slice(0, 256) || null,
25
+ parent_frame_id: stringValue(frame.parentId) ?? null,
28
26
  url: sanitized.url,
29
27
  origin: sanitized.origin,
30
28
  });
31
29
  }
32
- return { total, items };
30
+ return { items };
33
31
  };
34
32
  /** Read the current main-frame URL from an untrusted Page.getFrameTree result. */
35
33
  export const mainFrameUrl = (result) => stringValue(recordValue(recordValue(requiredRecord(result).frameTree)?.frame)?.url);
36
- /** Normalize allowed resources while retaining a bounded prefix and total count. */
37
- export const captureResources = (result, allowedOrigins, maximum, completeness) => {
34
+ /** Normalize every allowed resource. */
35
+ export const captureResources = (result, allowedOrigins, completeness) => {
38
36
  const root = recordValue(requiredRecord(result).frameTree);
39
37
  if (root === undefined)
40
- return { total: 0, items: [] };
38
+ return { items: [] };
41
39
  const items = [];
42
- let total = 0;
43
40
  for (const tree of walkFrameTrees(root)) {
44
41
  for (const resource of recordsValue(tree.resources)) {
45
42
  const url = allowedSanitizedUrl(resource.url, allowedOrigins);
@@ -47,21 +44,18 @@ export const captureResources = (result, allowedOrigins, maximum, completeness)
47
44
  completeness?.exclude("resources", exclusionReasonForUrl(stringValue(resource.url)));
48
45
  continue;
49
46
  }
50
- total += 1;
51
- if (items.length >= maximum)
52
- continue;
53
47
  const contentSize = numberValue(resource.contentSize);
54
48
  items.push({
55
49
  rawUrl: stringValue(resource.url) ?? "",
56
50
  url: url.url,
57
51
  origin: url.origin,
58
- type: (stringValue(resource.type) ?? "Other").slice(0, 100),
59
- mime_type: (stringValue(resource.mimeType) ?? "").slice(0, 256),
52
+ type: stringValue(resource.type) ?? "Other",
53
+ mime_type: stringValue(resource.mimeType) ?? "",
60
54
  content_size: contentSize === undefined ? null : Math.max(0, contentSize),
61
55
  });
62
56
  }
63
57
  }
64
- return { total, items };
58
+ return { items };
65
59
  };
66
60
  const walkFrameTrees = function* (root) {
67
61
  const pending = [root];
@@ -106,11 +100,11 @@ export const captureDom = (result, allowedOrigins, input, completeness) => {
106
100
  : [];
107
101
  const baseIndex = nodes.length;
108
102
  total += nodeTypes.length;
109
- for (let index = 0; index < nodeTypes.length && nodes.length < input.limits.max_dom_nodes; index += 1) {
103
+ for (let index = 0; index < nodeTypes.length; index += 1) {
110
104
  const attributeIndexes = numberArray(attributes[index]);
111
105
  const parent = Math.trunc(parents[index] ?? -1);
112
106
  const nodeIndex = nodes.length;
113
- const nodeName = indexedString(strings, nodeNames[index]).slice(0, 256);
107
+ const nodeName = indexedString(strings, nodeNames[index]);
114
108
  nodes.push({
115
109
  index: nodeIndex,
116
110
  parent_index: parent < 0 ? -1 : baseIndex + parent,
@@ -119,8 +113,7 @@ export const captureDom = (result, allowedOrigins, input, completeness) => {
119
113
  node_value_length: indexedString(strings, nodeValues[index]).length,
120
114
  attribute_names: attributeIndexes
121
115
  .filter((_value, attributeIndex) => attributeIndex % 2 === 0)
122
- .map((value) => indexedString(strings, value).slice(0, 256))
123
- .slice(0, 200),
116
+ .map((value) => indexedString(strings, value)),
124
117
  });
125
118
  const metadata = domMetadata({
126
119
  strings,
@@ -131,10 +124,6 @@ export const captureDom = (result, allowedOrigins, input, completeness) => {
131
124
  allowedOrigins,
132
125
  });
133
126
  for (const url of metadata.urls) {
134
- if (urls.length >= input.limits.max_resources) {
135
- completeness?.truncate("metadata");
136
- continue;
137
- }
138
127
  urls.push(url);
139
128
  if (url.destination_scope !== "approved") {
140
129
  excludedUrls += 1;
@@ -150,20 +139,18 @@ export const captureDom = (result, allowedOrigins, input, completeness) => {
150
139
  total,
151
140
  nodes,
152
141
  urls,
153
- agentHints: agentHints.slice(0, input.limits.max_resources),
142
+ agentHints,
154
143
  excludedUrls,
155
144
  };
156
145
  };
157
- export const captureAccessibility = (results, maximum, options) => {
146
+ export const captureAccessibility = (results, options) => {
158
147
  const all = results.flatMap((result) => recordsValue(requiredRecord(result).nodes));
159
148
  const nodeIds = new Set(all.flatMap((node) => {
160
149
  const nodeId = stringValue(node.nodeId);
161
150
  return nodeId === undefined ? [] : [nodeId];
162
151
  }));
163
- let retainedBytes = 0;
164
152
  let excludedFields = 0;
165
- let truncatedFields = 0;
166
- const nodes = all.slice(0, maximum).map((node) => {
153
+ const nodes = all.map((node) => {
167
154
  const captureText = (value) => {
168
155
  const raw = stringValue(recordValue(value)?.value);
169
156
  if (raw === undefined)
@@ -172,21 +159,11 @@ export const captureAccessibility = (results, maximum, options) => {
172
159
  excludedFields += 1;
173
160
  return null;
174
161
  }
175
- const available = Math.max(0, options.maximumTotalBytes - retainedBytes);
176
- const captured = boundedUtf8(raw, Math.min(options.maximumFieldBytes, available));
177
- retainedBytes += captured.bytes;
178
- if (captured.truncated) {
179
- truncatedFields += 1;
180
- if (captured.text === "" && raw !== "") {
181
- excludedFields += 1;
182
- return null;
183
- }
184
- }
185
- return captured.text;
162
+ return raw;
186
163
  };
187
164
  return {
188
- node_id: (stringValue(node.nodeId) ?? "").slice(0, 256),
189
- parent_id: (stringValue(node.parentId) ?? "").slice(0, 256) || null,
165
+ node_id: stringValue(node.nodeId) ?? "",
166
+ parent_id: stringValue(node.parentId) ?? null,
190
167
  role: axText(node.role),
191
168
  name: captureText(node.name),
192
169
  description: captureText(node.description),
@@ -194,15 +171,6 @@ export const captureAccessibility = (results, maximum, options) => {
194
171
  states: accessibilityStates(node.properties),
195
172
  };
196
173
  });
197
- for (const node of all.slice(maximum)) {
198
- for (const value of [node.name, node.description]) {
199
- if (stringValue(recordValue(value)?.value) === undefined)
200
- continue;
201
- excludedFields += 1;
202
- if (options.includeText)
203
- truncatedFields += 1;
204
- }
205
- }
206
174
  return {
207
175
  total: all.length,
208
176
  nodes,
@@ -216,12 +184,11 @@ export const captureAccessibility = (results, maximum, options) => {
216
184
  ? "unavailable"
217
185
  : !options.includeText
218
186
  ? "not_approved"
219
- : truncatedFields > 0
220
- ? "truncated"
221
- : "included",
222
- retained_bytes: retainedBytes,
187
+ : "included",
188
+ retained_bytes: nodes.reduce((total, node) => total +
189
+ Buffer.byteLength(node.name ?? "") +
190
+ Buffer.byteLength(node.description ?? ""), 0),
223
191
  excluded_fields: excludedFields,
224
- truncated_fields: truncatedFields,
225
192
  },
226
193
  };
227
194
  };
@@ -263,7 +230,7 @@ const accessibilityStates = (value) => {
263
230
  : typeof raw === "number"
264
231
  ? numberValue(raw)
265
232
  : typeof raw === "string"
266
- ? raw.slice(0, 256)
233
+ ? raw
267
234
  : undefined;
268
235
  if (state !== undefined)
269
236
  states.set(name, state);
@@ -272,7 +239,7 @@ const accessibilityStates = (value) => {
272
239
  .sort(([left], [right]) => left.localeCompare(right))
273
240
  .map(([name, state]) => ({ name, value: state }));
274
241
  };
275
- const axText = (value) => boundedText(recordValue(value)?.value, 1_024);
242
+ const axText = (value) => stringValue(recordValue(value)?.value) ?? null;
276
243
  const indexedString = (strings, index) => {
277
244
  const integer = numberValue(index);
278
245
  return integer === undefined ? "" : (strings[Math.trunc(integer)] ?? "");
@@ -335,21 +302,6 @@ const domDestination = (value, documentUrl, allowedOrigins) => {
335
302
  return { url: null, scope: "unsupported" };
336
303
  }
337
304
  };
338
- const boundedUtf8 = (value, maximumBytes) => {
339
- const total = Buffer.byteLength(value);
340
- if (total <= maximumBytes)
341
- return { text: value, bytes: total, truncated: false };
342
- let text = "";
343
- let bytes = 0;
344
- for (const character of value) {
345
- const characterBytes = Buffer.byteLength(character);
346
- if (bytes + characterBytes > maximumBytes)
347
- break;
348
- text += character;
349
- bytes += characterBytes;
350
- }
351
- return { text, bytes, truncated: true };
352
- };
353
305
  const domUrlAttributes = [
354
306
  "href",
355
307
  "src",
@@ -15,8 +15,8 @@ export const ingestResponseBodyShape = (state, requestId, value) => {
15
15
  invalidResponseBodyShape(state, requestId);
16
16
  return;
17
17
  }
18
- const inferred = inferBodyShape(state, decoded);
19
- updateResponseBodyShape(state, requestId, inferred.shape, inferred.truncated);
18
+ const inferred = inferBodyShape(decoded);
19
+ updateResponseBodyShape(state, requestId, inferred.shape);
20
20
  };
21
21
  export const requestBodyShape = (state, request) => {
22
22
  if (!state.input.include_json_body_shapes)
@@ -24,52 +24,32 @@ export const requestBodyShape = (state, request) => {
24
24
  const body = stringValue(request.postData);
25
25
  if (!isJsonContentType(recordValue(request.headers)) || body === undefined)
26
26
  return { status: "unavailable", request: null, response: null };
27
- const inferred = inferBodyShape(state, body);
27
+ const inferred = inferBodyShape(body);
28
28
  return {
29
- status: inferred.truncated
30
- ? "truncated"
31
- : inferred.shape === null
32
- ? "unavailable"
33
- : "included",
29
+ status: inferred.shape === null ? "unavailable" : "included",
34
30
  request: inferred.shape,
35
31
  response: null,
36
32
  };
37
33
  };
38
- export const updateResponseBodyShape = (state, requestId, response, truncated) => {
34
+ export const updateResponseBodyShape = (state, requestId, response) => {
39
35
  const current = state.network.get(requestId);
40
36
  if (current === undefined)
41
37
  return;
42
38
  const request = current.body_shapes.request;
43
- const status = truncated || current.body_shapes.status === "truncated"
44
- ? "truncated"
45
- : response !== null
46
- ? "included"
47
- : request !== null
48
- ? "partial"
49
- : "unavailable";
39
+ const status = response !== null
40
+ ? "included"
41
+ : request !== null
42
+ ? "partial"
43
+ : "unavailable";
50
44
  state.network.set(requestId, {
51
45
  ...current,
52
46
  body_shapes: { status, request, response },
53
47
  });
54
48
  };
55
- const inferBodyShape = (state, text) => {
56
- const bytes = Buffer.byteLength(text);
57
- const remaining = state.input.limits.max_total_json_body_bytes - state.jsonBodyBytes;
58
- if (bytes > state.input.limits.max_json_body_bytes || bytes > remaining) {
59
- state.completeness.truncate("json_body_shapes");
60
- return { shape: null, truncated: true };
61
- }
62
- state.jsonBodyBytes += bytes;
63
- const shape = inferJsonShape(text, {
64
- maximumBytes: state.input.limits.max_json_body_bytes,
65
- maximumNodes: state.input.limits.max_json_shape_nodes,
66
- maximumDepth: state.input.limits.max_json_shape_depth,
67
- });
68
- if (shape?.truncated === true)
69
- state.completeness.truncate("json_body_shapes");
70
- return { shape, truncated: shape?.truncated === true };
49
+ const inferBodyShape = (text) => {
50
+ return { shape: inferJsonShape(text) };
71
51
  };
72
52
  const invalidResponseBodyShape = (state, requestId) => {
73
- updateResponseBodyShape(state, requestId, null, false);
53
+ updateResponseBodyShape(state, requestId, null);
74
54
  state.completeness.exclude("json_body_shapes", "invalid_protocol_value");
75
55
  };