rea-agents 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/README.md +83 -108
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisContextQueries.js +21 -9
  6. package/dist/application/AnalysisSnapshotCache.js +0 -1
  7. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  8. package/dist/application/AndroidApplicationService.js +1 -1
  9. package/dist/application/AppleApplicationService.js +1 -1
  10. package/dist/application/ArtifactExtraction.js +35 -54
  11. package/dist/application/ArtifactExtractionDestination.js +17 -0
  12. package/dist/application/ArtifactGraphConstruction.js +2 -17
  13. package/dist/application/ArtifactInventory/classify.js +2 -6
  14. package/dist/application/ArtifactInventory/hash.js +2 -20
  15. package/dist/application/ArtifactInventory/policy.js +17 -0
  16. package/dist/application/ArtifactInventory/reader.js +1 -4
  17. package/dist/application/ArtifactInventory/scanCanonical.js +8 -15
  18. package/dist/application/ArtifactInventory/scanReader.js +76 -58
  19. package/dist/application/ArtifactInventory/types.js +1 -5
  20. package/dist/application/ArtifactInventory.js +6 -14
  21. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  22. package/dist/application/BinarySession.js +54 -28
  23. package/dist/application/BinarySessionComposition.js +0 -11
  24. package/dist/application/BinarySessionOpen.js +2 -1
  25. package/dist/application/BinarySessionRecords.js +24 -86
  26. package/dist/application/BinarySessionStatus.js +16 -21
  27. package/dist/application/BinaryTargetResolver.js +216 -0
  28. package/dist/application/BrowserEvidence.js +39 -57
  29. package/dist/application/BrowserObservationService.js +3 -6
  30. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  31. package/dist/application/BrowserScenarioEvidence.js +3 -3
  32. package/dist/application/CallPathTracing.js +2 -36
  33. package/dist/application/CapabilityClientRequirements.js +26 -0
  34. package/dist/application/CapabilityInventory.js +143 -77
  35. package/dist/application/ClientConfigurationDocument.js +27 -0
  36. package/dist/application/ClientRegistrationStatus.js +16 -13
  37. package/dist/application/CommandShimReplay.js +14 -1
  38. package/dist/application/DirectAnalysis.js +22 -46
  39. package/dist/application/DirectAnalysisStatus.js +5 -61
  40. package/dist/application/Doctor.js +11 -32
  41. package/dist/application/DoctorDiagnostics.js +1 -2
  42. package/dist/application/DoctorScope.js +1 -1
  43. package/dist/application/ElectronActiveEvidence.js +50 -0
  44. package/dist/application/ElectronActiveObservationPort.js +1 -0
  45. package/dist/application/ElectronActiveObservationService.js +78 -0
  46. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  47. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  48. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  49. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  50. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  51. package/dist/application/ElectronEvidence.js +4 -7
  52. package/dist/application/ElectronObservationService.js +5 -9
  53. package/dist/application/EnhancedLiteralTracing.js +42 -65
  54. package/dist/application/EnhancedTools.js +98 -64
  55. package/dist/application/EvidenceBundleCommands.js +16 -12
  56. package/dist/application/EvidenceBundleFiles.js +9 -15
  57. package/dist/application/EvidenceLedger.js +14 -42
  58. package/dist/application/FilesystemSnapshot.js +2 -3
  59. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  60. package/dist/application/InventoryProjectionEvidence.js +4 -2
  61. package/dist/application/InvestigationProviders.js +1 -1
  62. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  63. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  64. package/dist/application/JavaScriptApplicationService.js +6 -29
  65. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  66. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  67. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  68. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  69. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  70. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  71. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  72. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  73. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  74. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  75. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  76. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  77. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  78. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  79. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  80. package/dist/application/JavaScriptJsonModules.js +2 -2
  81. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  82. package/dist/application/JavaScriptReplayPermission.js +1 -1
  83. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  84. package/dist/application/JavaScriptReplayService.js +29 -47
  85. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  86. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  87. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  88. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  89. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  90. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  91. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  92. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  93. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  94. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  95. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  96. package/dist/application/JsonFiles.js +79 -0
  97. package/dist/application/LinuxHopper.js +11 -9
  98. package/dist/application/LoopbackReplay.js +26 -23
  99. package/dist/application/LoopbackReplayRecorder.js +29 -1
  100. package/dist/application/ManagedApplicationGraphService.js +1 -2
  101. package/dist/application/ManagedMemberComparisonService.js +11 -41
  102. package/dist/application/ManagedNativeVerificationService.js +1 -2
  103. package/dist/application/ManagedReconstructionService.js +1 -1
  104. package/dist/application/ManagedRuntimeCorrelationService.js +14 -13
  105. package/dist/application/NativeApiInspection.js +2 -7
  106. package/dist/application/NativeUiActionTrace.js +394 -0
  107. package/dist/application/NodeRuntimeCharacterizationService.js +11 -16
  108. package/dist/application/PermissionAuthority.js +15 -7
  109. package/dist/application/PermissionFailure.js +5 -0
  110. package/dist/application/ProcessCaptureAuthority.js +5 -7
  111. package/dist/application/ProcessCaptureJournal.js +3 -2
  112. package/dist/application/ProcessCaptureLifecycle.js +10 -12
  113. package/dist/application/ProcessCheckpoints.js +29 -11
  114. package/dist/application/ProcessCli.js +8 -17
  115. package/dist/application/ProcessEvidence.js +5 -7
  116. package/dist/application/ProcessHarness.js +60 -20
  117. package/dist/application/ProcessNormalization.js +2 -1
  118. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  119. package/dist/application/ProcessReactiveEffects.js +9 -3
  120. package/dist/application/ProcessReactiveHarness.js +13 -7
  121. package/dist/application/ProcessSampling.js +2 -4
  122. package/dist/application/ProcessTimer.js +39 -0
  123. package/dist/application/ProjectPermissionStore.js +39 -95
  124. package/dist/application/RealHopperAssertions.js +20 -66
  125. package/dist/application/ReconstructionCoverageService.js +12 -58
  126. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  127. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  128. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  129. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  130. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  131. package/dist/application/ReferenceSourceImport.js +21 -47
  132. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  133. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  134. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  135. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  136. package/dist/application/SessionProviderRouter.js +2 -2
  137. package/dist/application/Setup.js +1 -3
  138. package/dist/application/SetupClientConfiguration.js +22 -88
  139. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  140. package/dist/application/StoreFileLock.js +119 -0
  141. package/dist/application/TerminalRenderer.js +2 -3
  142. package/dist/application/Uninstall.js +9 -14
  143. package/dist/application/UnknownEvidence.js +1 -1
  144. package/dist/application/WindowsCapabilities.js +5 -4
  145. package/dist/artifacts/ArtifactPaths.js +2 -5
  146. package/dist/artifacts/ArtifactProvider.js +43 -67
  147. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  148. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  149. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  150. package/dist/artifacts/NibArchive.js +269 -0
  151. package/dist/artifacts/SafeOutputTree.js +21 -31
  152. package/dist/browser/BrowserProcessStartup.js +1 -2
  153. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  154. package/dist/browser/CdpBrowserProvider.js +3 -13
  155. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  156. package/dist/browser/CdpCaptureDocuments.js +28 -76
  157. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  158. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  159. package/dist/browser/CdpCaptureEvents.js +2 -8
  160. package/dist/browser/CdpCaptureStorage.js +9 -20
  161. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -95
  162. package/dist/browser/CdpCaptureValues.js +21 -21
  163. package/dist/browser/CdpConnection.js +10 -25
  164. package/dist/browser/CdpElectronInspection.js +29 -51
  165. package/dist/browser/CdpElectronProvider.js +10 -35
  166. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  167. package/dist/browser/CdpElectronScripts.js +6 -35
  168. package/dist/browser/CdpElectronWorkers.js +6 -10
  169. package/dist/browser/CdpEndpoint.js +25 -41
  170. package/dist/browser/CdpObservationSession.js +14 -26
  171. package/dist/browser/CdpPageCapture.js +34 -48
  172. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  173. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  174. package/dist/browser/CdpSafeMetadata.js +19 -22
  175. package/dist/browser/CdpScreenshot.js +3 -5
  176. package/dist/browser/CdpTargetSession.js +1 -2
  177. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  178. package/dist/browser/ElectronFileScope.js +8 -19
  179. package/dist/browser/JavaScriptRuntimeScope.js +10 -10
  180. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  181. package/dist/browser/PlaywrightElectronActiveActions.js +309 -0
  182. package/dist/browser/PlaywrightElectronActiveProvider.js +274 -0
  183. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  184. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  185. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  186. package/dist/browser/PlaywrightScenarioBrowser.js +7 -9
  187. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  188. package/dist/browser/PlaywrightScenarioSession.js +18 -34
  189. package/dist/browser/PngVisualDiff.js +22 -14
  190. package/dist/browser/SensitiveTextCapture.js +1 -18
  191. package/dist/browser/V8InspectorCaptureProjection.js +7 -7
  192. package/dist/browser/V8InspectorEndpoint.js +12 -14
  193. package/dist/browser/V8InspectorProvider.js +20 -61
  194. package/dist/browser/WebSourceMapFetcher.js +56 -176
  195. package/dist/catalogIdentity.js +12 -60
  196. package/dist/cli/artifactCommands.js +49 -77
  197. package/dist/cli/coreAnalysisCommands.js +83 -133
  198. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  199. package/dist/cli/managedCommands.js +6 -271
  200. package/dist/cli/setupCommands.js +3 -12
  201. package/dist/cli/utilityCommands.js +7 -41
  202. package/dist/cli.js +0 -2
  203. package/dist/cliApplicationCommands.js +44 -114
  204. package/dist/cliBrowserAdvancedCommands.js +12 -102
  205. package/dist/cliBrowserCommands.js +19 -124
  206. package/dist/cliBrowserContext.js +30 -0
  207. package/dist/cliCommandNames.js +5 -5
  208. package/dist/cliElectronCommands.js +49 -71
  209. package/dist/cliEvidenceCommands.js +8 -77
  210. package/dist/cliJavaScriptRuntimeCommands.js +18 -92
  211. package/dist/cliJsonInput.js +4 -14
  212. package/dist/cliObservationOptions.js +11 -92
  213. package/dist/cliPolicyCommands.js +2 -16
  214. package/dist/cliProcessCommands.js +3 -3
  215. package/dist/cliSetup.js +0 -13
  216. package/dist/config/browserScenario.js +77 -0
  217. package/dist/config/electronAutomation.js +35 -0
  218. package/dist/config/environment.js +6 -9
  219. package/dist/config/javascriptReplay.js +41 -0
  220. package/dist/config/managedRuntime.js +25 -0
  221. package/dist/config/parseConfig.js +56 -232
  222. package/dist/config/parsers.js +16 -28
  223. package/dist/config/passiveObservation.js +87 -0
  224. package/dist/config/permissions.js +0 -7
  225. package/dist/config/processCapture.js +47 -0
  226. package/dist/contracts/analysisSearchContract.js +2 -5
  227. package/dist/contracts/applicationToolContracts.js +58 -114
  228. package/dist/contracts/applicationWorkflowInputContracts.js +29 -114
  229. package/dist/contracts/artifactComparisonExample.js +58 -60
  230. package/dist/contracts/artifactToolContracts.js +37 -91
  231. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  232. package/dist/contracts/browserToolContracts.js +10 -75
  233. package/dist/contracts/electronToolContracts.js +27 -98
  234. package/dist/contracts/enhancedInputs.js +31 -78
  235. package/dist/contracts/errorSchemas.js +0 -1
  236. package/dist/contracts/functionComparisonExample.js +10 -24
  237. package/dist/contracts/functionInstructionContract.js +1 -3
  238. package/dist/contracts/functionWorkflowToolContracts.js +4 -5
  239. package/dist/contracts/hopperMemoryContracts.js +3 -3
  240. package/dist/contracts/investigationExamples.js +14 -11
  241. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  242. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  243. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  244. package/dist/contracts/managedToolContracts.js +10 -104
  245. package/dist/contracts/managedWorkflowExamples.js +77 -125
  246. package/dist/contracts/managedWorkflowToolContracts.js +51 -74
  247. package/dist/contracts/nativeToolContracts.js +9 -14
  248. package/dist/contracts/processCaptureExample.js +2 -69
  249. package/dist/contracts/promptContracts.js +49 -67
  250. package/dist/contracts/providerSelection.js +0 -1
  251. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  252. package/dist/contracts/sessionStatusContract.js +1 -17
  253. package/dist/contracts/sessionToolSchemas.js +52 -0
  254. package/dist/contracts/toolContractExamples.js +11 -10
  255. package/dist/contracts/toolContractHelpers.js +19 -0
  256. package/dist/contracts/toolContracts.js +60 -143
  257. package/dist/contracts/toolEffects.js +16 -9
  258. package/dist/contracts/toolOutputSchemaGroups.js +47 -86
  259. package/dist/contracts/toolOutputSchemaPrimitives.js +72 -62
  260. package/dist/contracts/toolSchemaMetadata.js +117 -0
  261. package/dist/contracts/unknownContractExamples.js +0 -2
  262. package/dist/doctorRuntime.js +1 -1
  263. package/dist/domain/analysisErrorPresentation.js +46 -54
  264. package/dist/domain/analysisErrorProjection.js +28 -37
  265. package/dist/domain/analysisProfile.js +3 -31
  266. package/dist/domain/analysisSnapshot.js +3 -12
  267. package/dist/domain/androidApplication.js +15 -52
  268. package/dist/domain/appleApplication.js +24 -65
  269. package/dist/domain/artifactComparison.js +11 -29
  270. package/dist/domain/artifactGraph.js +14 -44
  271. package/dist/domain/artifactInspection.js +38 -69
  272. package/dist/domain/artifactInventoryEvidence.js +27 -21
  273. package/dist/domain/binaryTarget.js +2 -219
  274. package/dist/domain/binaryTargetTypes.js +1 -0
  275. package/dist/domain/browserCaptureComparison.js +35 -60
  276. package/dist/domain/browserObservation.js +45 -197
  277. package/dist/domain/browserObservationSchemas.js +5 -23
  278. package/dist/domain/browserScenario.js +11 -14
  279. package/dist/domain/browserScenarioCapture.js +11 -12
  280. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  281. package/dist/domain/browserScenarioDiff.js +2 -59
  282. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  283. package/dist/domain/browserScenarioDiffValues.js +21 -38
  284. package/dist/domain/browserScenarioValues.js +80 -109
  285. package/dist/domain/browserSession.js +4 -7
  286. package/dist/domain/bundleComparison.js +6 -32
  287. package/dist/domain/bytecodeProvider.js +53 -54
  288. package/dist/domain/callPath.js +50 -169
  289. package/dist/domain/callPathSchemas.js +79 -0
  290. package/dist/domain/changedBehavior.js +34 -60
  291. package/dist/domain/completionLedgerGeneration.js +8 -14
  292. package/dist/domain/conformancePackage.js +126 -97
  293. package/dist/domain/conformanceReplay.js +39 -11
  294. package/dist/domain/conformanceTrustGate.js +174 -30
  295. package/dist/domain/customProtocolCapture.js +4 -4
  296. package/dist/domain/electronActiveObservation.js +244 -0
  297. package/dist/domain/electronObservation.js +21 -83
  298. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  299. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  300. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  301. package/dist/domain/electronStaticAnalysisValues.js +14 -18
  302. package/dist/domain/errors.js +33 -54
  303. package/dist/domain/eventProcessTree.js +101 -90
  304. package/dist/domain/evidence.js +2 -10
  305. package/dist/domain/evidenceBundle.js +3 -5
  306. package/dist/domain/evidenceCompletionLedger.js +6 -8
  307. package/dist/domain/functionComparison.js +4 -14
  308. package/dist/domain/functionComparisonNormalization.js +8 -8
  309. package/dist/domain/functionComparisonResults.js +25 -15
  310. package/dist/domain/functionComparisonSchemas.js +49 -33
  311. package/dist/domain/functionDossierEvidence.js +31 -151
  312. package/dist/domain/hopperStartupFailure.js +1 -1
  313. package/dist/domain/hopperValues.js +17 -141
  314. package/dist/domain/inputIssueProjection.js +4 -1
  315. package/dist/domain/interfaceBuilderGraph.js +654 -0
  316. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  317. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  318. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  319. package/dist/domain/javascriptApplicationGraph.js +3 -13
  320. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  321. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  322. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  323. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  324. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  325. package/dist/domain/javascriptAstFingerprint.js +25 -58
  326. package/dist/domain/javascriptAstValues.js +9 -0
  327. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  328. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  329. package/dist/domain/javascriptExportShapeComparisonSchemas.js +70 -77
  330. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  331. package/dist/domain/javascriptFeatureSeed.js +20 -12
  332. package/dist/domain/javascriptFeatureTrace.js +13 -67
  333. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  334. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  335. package/dist/domain/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascriptReplay.js +100 -101
  337. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  338. package/dist/domain/javascriptRuntimeObservation.js +43 -103
  339. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  340. package/dist/domain/javascriptRuntimeReconciliationActive.js +80 -0
  341. package/dist/domain/javascriptRuntimeReconciliationGraph.js +21 -33
  342. package/dist/domain/javascriptRuntimeReconciliationMatching.js +75 -61
  343. package/dist/domain/javascriptRuntimeReconciliationParsing.js +21 -46
  344. package/dist/domain/javascriptRuntimeReconciliationResult.js +25 -19
  345. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  346. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +34 -49
  347. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  348. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  349. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  350. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  351. package/dist/domain/javascriptSemanticCalls.js +5 -32
  352. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  353. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  354. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  355. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  356. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  357. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  358. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  359. package/dist/domain/javascriptSemanticIr.js +1 -29
  360. package/dist/domain/javascriptSemanticObjects.js +1 -5
  361. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  362. package/dist/domain/javascriptSemanticProjection.js +0 -18
  363. package/dist/domain/javascriptSemanticPromises.js +9 -16
  364. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  365. package/dist/domain/javascriptSemanticQuery.js +17 -139
  366. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  367. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  368. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  369. package/dist/domain/javascriptSemanticResources.js +1 -6
  370. package/dist/domain/javascriptSemanticReturns.js +10 -27
  371. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  372. package/dist/domain/javascriptSemanticValues.js +44 -62
  373. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  374. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  375. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  376. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  377. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  378. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  379. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  380. package/dist/domain/jsonShape.js +7 -33
  381. package/dist/domain/localPath.js +7 -0
  382. package/dist/domain/managedApplicationGraph.js +9 -41
  383. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  384. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  385. package/dist/domain/managedArtifact.js +14 -27
  386. package/dist/domain/managedMemberComparison.js +90 -92
  387. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  388. package/dist/domain/managedMemberComparisonItems.js +221 -0
  389. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  390. package/dist/domain/managedNativeVerification.js +3 -6
  391. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  392. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  393. package/dist/domain/managedReconstruction.js +19 -23
  394. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  395. package/dist/domain/nativeApiBoundary.js +17 -14
  396. package/dist/domain/nativeInspection.js +0 -2
  397. package/dist/domain/nativeInvestigationGraph.js +351 -0
  398. package/dist/domain/nativeValueFlow.js +61 -0
  399. package/dist/domain/nodeRuntimeCharacterization.js +15 -18
  400. package/dist/domain/objcSwiftMetadata.js +254 -0
  401. package/dist/domain/peInspection.js +1 -1
  402. package/dist/domain/permissionPolicy.js +13 -0
  403. package/dist/domain/processCapture.js +76 -113
  404. package/dist/domain/processCaptureExample.js +68 -0
  405. package/dist/domain/processCaptureParsing.js +21 -0
  406. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  407. package/dist/domain/processCaptureReactiveValidation.js +8 -3
  408. package/dist/domain/processCaptureValidation.js +8 -10
  409. package/dist/domain/processComparison.js +12 -16
  410. package/dist/domain/processObservation.js +5 -6
  411. package/dist/domain/processReactiveMatching.js +32 -46
  412. package/dist/domain/processReactiveRuntime.js +4 -8
  413. package/dist/domain/processReactiveScenario.js +28 -94
  414. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  415. package/dist/domain/processReactiveTransition.js +42 -21
  416. package/dist/domain/processScenario.js +62 -93
  417. package/dist/domain/processTraceComparison.js +0 -7
  418. package/dist/domain/processTraceEvaluation.js +14 -4
  419. package/dist/domain/processTraceSpecification.js +11 -17
  420. package/dist/domain/protocolCapture.js +11 -9
  421. package/dist/domain/reconstructionCoverage.js +62 -129
  422. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  423. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  424. package/dist/domain/reconstructionReadiness.js +1 -2
  425. package/dist/domain/reconstructionReadinessSchemas.js +66 -40
  426. package/dist/domain/reconstructionUnknowns.js +3 -3
  427. package/dist/domain/reconstructionVerification.js +13 -47
  428. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  429. package/dist/domain/referenceSourceGraph.js +53 -61
  430. package/dist/domain/referenceSourceImportParsing.js +3 -7
  431. package/dist/domain/replayMachine.js +19 -31
  432. package/dist/domain/replayMachineRun.js +15 -63
  433. package/dist/domain/replayMachineRuntime.js +46 -44
  434. package/dist/domain/replayMachineValues.js +84 -0
  435. package/dist/domain/residualUnknown.js +25 -30
  436. package/dist/domain/runtimeCharacterization.js +15 -16
  437. package/dist/domain/runtimeIdentification.js +48 -47
  438. package/dist/domain/sourceToBundleComparison.js +11 -87
  439. package/dist/domain/sourceToBundleComparisonSchemas.js +25 -50
  440. package/dist/domain/sourceToBundleSignals.js +11 -16
  441. package/dist/domain/staticRuntimeCorrelation.js +44 -54
  442. package/dist/domain/symbolAnalysis.js +10 -19
  443. package/dist/domain/unicodeCodePointOrder.js +12 -0
  444. package/dist/domain/webBundleAnalysis.js +70 -99
  445. package/dist/domain/webBundleAnalyzer.js +2 -4
  446. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  447. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  448. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  449. package/dist/domain/webCaptureDiff.js +48 -85
  450. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  451. package/dist/domain/webContentArtifact.js +1 -10
  452. package/dist/domain/webMcpDiscovery.js +3 -14
  453. package/dist/domain/webScreenshot.js +58 -34
  454. package/dist/domain/zipPackageFormat.js +7 -0
  455. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  456. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  459. package/dist/dotnet/ManagedMemberRows.js +16 -16
  460. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  461. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  462. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  463. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  464. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  465. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  466. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -42
  467. package/dist/dotnet/ManagedPeReader.js +2 -2
  468. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  469. package/dist/generatedMcpToolCatalog.js +1 -1
  470. package/dist/generatedPackageMetadata.js +1 -1
  471. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  472. package/dist/ghidra/GhidraClient.js +5 -13
  473. package/dist/ghidra/GhidraClientStartup.js +1 -1
  474. package/dist/ghidra/GhidraClientWire.js +9 -5
  475. package/dist/ghidra/GhidraDefaults.js +0 -18
  476. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  477. package/dist/ghidra/GhidraDoctor.js +16 -12
  478. package/dist/ghidra/GhidraFunctionValues.js +67 -108
  479. package/dist/ghidra/GhidraInstallation.js +98 -42
  480. package/dist/ghidra/GhidraInventoryValues.js +18 -77
  481. package/dist/ghidra/GhidraLauncher.js +0 -8
  482. package/dist/ghidra/GhidraProvider.js +32 -31
  483. package/dist/ghidra/GhidraProviderCapabilities.js +11 -48
  484. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  485. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  486. package/dist/ghidra/GhidraSessionValues.js +0 -2
  487. package/dist/ghidra/GhidraSocketConnection.js +1 -1
  488. package/dist/ghidra/GhidraTransport.js +4 -7
  489. package/dist/ghidra/protocol.js +19 -42
  490. package/dist/hopper/BridgeLauncher.js +115 -37
  491. package/dist/hopper/HopperAnalysisProfile.js +3 -5
  492. package/dist/hopper/HopperCleanup.js +11 -9
  493. package/dist/hopper/HopperClient.js +5 -8
  494. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  495. package/dist/hopper/HopperProvider.js +0 -30
  496. package/dist/hopper/HopperRequestQueue.js +21 -40
  497. package/dist/hopper/HopperResponseStream.js +1 -9
  498. package/dist/hopper/HopperSessionValues.js +3 -2
  499. package/dist/hopper/HopperTargetLease.js +119 -0
  500. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  501. package/dist/hopper/LinuxPrivateDisplayProbe.js +21 -26
  502. package/dist/hopper/protocol.js +6 -4
  503. package/dist/main/reload.js +1 -9
  504. package/dist/main/shutdown.js +1 -1
  505. package/dist/main/state.js +0 -23
  506. package/dist/main/transport.js +27 -39
  507. package/dist/main.js +17 -15
  508. package/dist/mcpDoctor.js +27 -69
  509. package/dist/native/CommandRunner.js +18 -25
  510. package/dist/native/NativeMacOSProvider.js +13 -38
  511. package/dist/native/NativeMachoInspection.js +1 -1
  512. package/dist/process/BoundedFileBytes.js +17 -0
  513. package/dist/process/ExecFileOutput.js +11 -0
  514. package/dist/process/PendingOperations.js +8 -6
  515. package/dist/process/PrivateRuntimeRoot.js +17 -0
  516. package/dist/process/ProcessOwnership.js +67 -130
  517. package/dist/process/ProcessOwnershipIdentity.js +13 -0
  518. package/dist/process/ProcessOwnershipObservation.js +87 -0
  519. package/dist/process/ProcessOwnershipProcessTree.js +22 -0
  520. package/dist/process/ProviderDeadline.js +8 -12
  521. package/dist/process/ProviderProcess.js +7 -28
  522. package/dist/process/WindowsAuthority.js +32 -0
  523. package/dist/reference/ReferenceSourceReader.js +8 -24
  524. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  525. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  526. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  527. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  528. package/dist/replay/JavaScriptReplayWorker.js +95 -13
  529. package/dist/replay/JavaScriptReplayWorkerTypes.js +1 -0
  530. package/dist/replay/LinuxJavaScriptReplayRunner.js +42 -43
  531. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  532. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  533. package/dist/replay/ReplayOutcome.js +27 -18
  534. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  535. package/dist/replay/ReplaySeccompFile.js +29 -0
  536. package/dist/replay/ReplayWorkerProtocol.js +33 -30
  537. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  538. package/dist/server/ProcessCaptureElicitation.js +4 -8
  539. package/dist/server/createServer.js +145 -119
  540. package/dist/server/mcpClientMetadata.js +32 -0
  541. package/dist/server/promptCompletion.js +37 -61
  542. package/dist/server/recordDerivedEvidence.js +1 -1
  543. package/dist/server/registerApplicationTools/characterization.js +10 -21
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -16
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -15
  546. package/dist/server/registerApplicationTools/compareVersions.js +6 -16
  547. package/dist/server/registerApplicationTools/controlledReplay.js +8 -15
  548. package/dist/server/registerApplicationTools/coverage.js +7 -78
  549. package/dist/server/registerApplicationTools/helpers.js +1 -13
  550. package/dist/server/registerApplicationTools/obligationLedger.js +4 -8
  551. package/dist/server/registerApplicationTools/traceFeature.js +6 -15
  552. package/dist/server/registerApplicationTools/traceSemantics.js +5 -13
  553. package/dist/server/registerApplicationTools.js +0 -2
  554. package/dist/server/registerArtifactComparisonTool.js +27 -35
  555. package/dist/server/registerBrowserScenarioTool.js +3 -8
  556. package/dist/server/registerBrowserTools.js +36 -81
  557. package/dist/server/registerBundleComparisonTool.js +10 -16
  558. package/dist/server/registerCloseLifecycleTool.js +5 -27
  559. package/dist/server/registerElectronTools.js +29 -65
  560. package/dist/server/registerEnhancedTools.js +118 -127
  561. package/dist/server/registerEvidenceTools.js +19 -30
  562. package/dist/server/registerFunctionComparisonTool.js +35 -34
  563. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  564. package/dist/server/registerInvestigationTools.js +36 -148
  565. package/dist/server/registerJavaScriptRuntimeObservationTools.js +15 -27
  566. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +16 -23
  567. package/dist/server/registerManagedWorkflowTools/contract.js +2 -3
  568. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -14
  570. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +4 -14
  571. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +11 -20
  572. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +10 -21
  573. package/dist/server/registerOfficialTools.js +8 -51
  574. package/dist/server/registerProcessComparisonTool.js +43 -38
  575. package/dist/server/registerPrompts.js +19 -17
  576. package/dist/server/registerReplayMachineTool.js +4 -10
  577. package/dist/server/registerSessionRecordTools.js +36 -153
  578. package/dist/server/registerSessionStatusTool.js +18 -96
  579. package/dist/server/registerSessionTools.js +34 -91
  580. package/dist/server/sessionAvailabilityPolicy.js +2 -3
  581. package/dist/server/sessionEvidence.js +9 -15
  582. package/dist/server/sessionToolPolicies.js +1 -13
  583. package/dist/server/toolRegistrationOptions.js +4 -192
  584. package/dist/server/toolResult.js +15 -67
  585. package/dist/serverIdentity.js +0 -20
  586. package/install.sh +1 -1
  587. package/package.json +27 -15
  588. package/scripts/electron-active-hook-boundaries.cjs +394 -0
  589. package/scripts/electron-active-hook.cjs +469 -0
  590. package/scripts/hopper-demo-x11.py +13 -32
  591. package/scripts/rea.mjs +1 -11
  592. package/skills/reverse-engineer-anything/SKILL.md +46 -11
  593. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  594. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  595. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  596. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -180
  597. package/dist/application/BoundedJsonFiles.js +0 -86
  598. package/dist/application/CrossVersionInventory.js +0 -128
  599. package/dist/application/CrossVersionInvestigation.js +0 -301
  600. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  601. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  602. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  603. package/dist/application/DeferredFileAuthorization.js +0 -61
  604. package/dist/application/DoctorProjection.js +0 -43
  605. package/dist/application/EnhancedToolPagination.js +0 -22
  606. package/dist/application/EvidenceReferenceResolver.js +0 -26
  607. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  608. package/dist/application/ProcessPairedExperiment.js +0 -72
  609. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  610. package/dist/application/ReconstructionReadinessService.js +0 -48
  611. package/dist/cliInvestigationCommands.js +0 -173
  612. package/dist/domain/boundedCartesianProjection.js +0 -15
  613. package/dist/domain/investigationWorkspace.js +0 -346
  614. package/dist/domain/jsonLimits.js +0 -26
  615. package/dist/domain/knownPageCoverage.js +0 -21
  616. package/dist/domain/processPairedExperiment.js +0 -128
  617. package/dist/server/DynamicToolAvailability.js +0 -70
  618. package/dist/server/LazyToolCatalog.js +0 -134
  619. package/dist/server/hydrateServerTools.js +0 -191
  620. package/dist/server/javascriptApplicationResult.js +0 -106
  621. package/dist/server/permissionFailure.js +0 -12
  622. package/dist/server/registerApplicationTools/readiness.js +0 -55
  623. package/dist/server/registerEvidenceResources.js +0 -315
  624. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  625. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  626. package/dist/server/registerReconstructionReadinessResource.js +0 -32
  627. package/dist/server/toolInputValidation.js +0 -77
  628. package/scripts/package-runner-bootstrap.mjs +0 -72
@@ -2,10 +2,11 @@ import { BrowserObservationError, } from "../domain/errors.js";
2
2
  import { stableWebResources } from "../domain/webInventory.js";
3
3
  import { CdpConnection } from "./CdpConnection.js";
4
4
  import { CdpCaptureEvents } from "./CdpCaptureEvents.js";
5
+ import { authorizedMainFrame } from "./CdpAuthorizedMainFrame.js";
5
6
  import { captureStorage } from "./CdpCaptureStorage.js";
6
7
  import { optionalCdpCommand } from "./CdpOptionalCommand.js";
7
8
  import { captureAccessibility, captureDom, captureFrames, captureResources, mainFrameUrl, } from "./CdpCaptureDocuments.js";
8
- import { allowedSanitizedUrl, delayWithCancellation, isHttpUrl, } from "./CdpCaptureValues.js";
9
+ import { allowedSanitizedUrl, delayWithCancellation, } from "./CdpCaptureValues.js";
9
10
  import { captureScripts } from "./CdpPageCaptureScripts.js";
10
11
  import { captureWorkers } from "./CdpPageCaptureWorkers.js";
11
12
  /** Capture and normalize one attached page without evaluating page JavaScript. */
@@ -23,7 +24,7 @@ export const capturePage = async (context) => {
23
24
  allowedOrigins,
24
25
  limitations: [
25
26
  "Observation starts when REA attaches; prior network and console activity is unavailable.",
26
- "Raw network headers, bodies, cookies, storage values, console objects, and WebSocket payloads are never retained; separately approved captures retain only bounded redacted text or value-free shapes.",
27
+ "Raw network headers, bodies, cookies, storage values, console objects, and WebSocket payloads are never retained; separately approved captures retain only redacted text or value-free shapes.",
27
28
  "Source maps are reported only as declarative URLs and are not fetched.",
28
29
  "URL-less scripts and console events without an allowed source URL are excluded because their origin cannot be proven.",
29
30
  ],
@@ -41,26 +42,24 @@ const captureAuthorizedPage = async (state) => {
41
42
  const { connection, sessionId, input, signal } = context;
42
43
  await authorizeObservationWindow(state);
43
44
  await captureJsonResponseBodies(state);
44
- const frameResult = await authorizedFrameTree(context, allowedOrigins);
45
+ const frameResult = await authorizedMainFrame({
46
+ connection: context.connection,
47
+ sessionId: context.sessionId,
48
+ signal: context.signal,
49
+ allowedOrigins,
50
+ delayOperation: context.operation,
51
+ });
45
52
  const attachedUrl = mainFrameUrl(frameResult) ?? "";
46
- const frameCapture = captureFrames(frameResult, allowedOrigins, input.limits.max_frames, state.events.completeness);
53
+ const frameCapture = captureFrames(frameResult, allowedOrigins, undefined, state.events.completeness);
47
54
  const frames = frameCapture.items;
48
- if (frameCapture.total > frames.length)
49
- state.events.completeness.truncate("frames");
50
55
  const captureFrame = frames[0];
51
56
  if (captureFrame === undefined)
52
57
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
53
58
  state.events.beginFinalCapture(captureFrame.frame_id);
54
- const resourceCapture = captureResources(await connection.send("Page.getResourceTree", {}, sessionId, signal), allowedOrigins, input.limits.max_resources, state.events.completeness);
55
- if (resourceCapture.total > resourceCapture.items.length)
56
- state.events.completeness.truncate("resources");
59
+ const resourceCapture = captureResources(await connection.send("Page.getResourceTree", {}, sessionId, signal), allowedOrigins, state.events.completeness);
57
60
  const resources = stableWebResources(resourceCapture.items.map(publicResource));
58
61
  const dom = await capturePageDom(state);
59
- if (dom.total > dom.nodes.length)
60
- state.events.completeness.truncate("dom");
61
62
  const accessibility = await accessibilityForFrames(state, frames);
62
- if (accessibility.total > accessibility.nodes.length)
63
- state.events.completeness.truncate("accessibility");
64
63
  const scripts = await captureScripts({
65
64
  context,
66
65
  events: state.events,
@@ -68,15 +67,17 @@ const captureAuthorizedPage = async (state) => {
68
67
  resources,
69
68
  frameIds: new Set(frames.map((frame) => frame.frame_id)),
70
69
  });
71
- const workerCapture = await captureWorkers({ context, allowedOrigins, limitations, events: state.events }, new Set(frames.map((frame) => frame.frame_id)));
72
- if (workerCapture.total > workerCapture.items.length)
73
- state.events.completeness.truncate("workers");
70
+ const workers = await captureWorkers({ context, allowedOrigins, limitations, events: state.events }, new Set(frames.map((frame) => frame.frame_id)));
74
71
  const storageCapture = await captureStorage(context, frames[0]?.origin ?? new URL(attachedUrl).origin, limitations);
75
- if (storageCapture.truncated)
76
- state.events.completeness.truncate("storage_keys");
77
72
  if (!input.include_storage_keys)
78
73
  state.events.completeness.exclude("storage_keys", "not_approved", null);
79
- const completedFrameResult = await authorizedFrameTree(context, allowedOrigins);
74
+ const completedFrameResult = await authorizedMainFrame({
75
+ connection: context.connection,
76
+ sessionId: context.sessionId,
77
+ signal: context.signal,
78
+ allowedOrigins,
79
+ delayOperation: context.operation,
80
+ });
80
81
  const completedUrl = mainFrameUrl(completedFrameResult) ?? "";
81
82
  if (state.events.originViolation)
82
83
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
@@ -91,7 +92,7 @@ const captureAuthorizedPage = async (state) => {
91
92
  accessibility,
92
93
  scripts: scripts.inventory,
93
94
  resources,
94
- workers: workerCapture.items,
95
+ workers,
95
96
  storage: storageCapture.value,
96
97
  }),
97
98
  sourceMapRequests: scripts.sourceMapRequests,
@@ -118,9 +119,14 @@ const authorizeObservationWindow = async (state) => {
118
119
  const { connection, sessionId, signal } = context;
119
120
  await report(context.progress, 1, "Enabling passive CDP domains");
120
121
  await connection.send("Page.enable", {}, sessionId, signal);
121
- const initialFrameResult = await authorizedFrameTree(context, allowedOrigins);
122
- const mainFrame = captureFrames(initialFrameResult, allowedOrigins, 1)
123
- .items[0];
122
+ const initialFrameResult = await authorizedMainFrame({
123
+ connection: context.connection,
124
+ sessionId: context.sessionId,
125
+ signal: context.signal,
126
+ allowedOrigins,
127
+ delayOperation: context.operation,
128
+ });
129
+ const mainFrame = captureFrames(initialFrameResult, allowedOrigins).items[0];
124
130
  if (mainFrame === undefined)
125
131
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
126
132
  events.beginAuthorizedFrame(mainFrame.frame_id);
@@ -140,7 +146,6 @@ const capturePageDom = async (state) => {
140
146
  return captureDom(result, allowedOrigins, context.input, state.events.completeness);
141
147
  };
142
148
  const normalizedInspection = (state, captured) => ({
143
- schema_version: 2,
144
149
  browser: state.context.discovery.version,
145
150
  target: normalizedTarget(state.context.target, captured.attachedUrl, state.allowedOrigins),
146
151
  capture_window: {
@@ -183,32 +188,17 @@ const normalizedInspection = (state, captured) => ({
183
188
  storage: captured.storage,
184
189
  limitations: state.limitations,
185
190
  });
186
- const authorizedFrameTree = async (context, allowedOrigins) => {
187
- for (let attempt = 0; attempt < 80; attempt += 1) {
188
- const result = await context.connection.send("Page.getFrameTree", {}, context.sessionId, context.signal);
189
- const currentUrl = mainFrameUrl(result);
190
- if (allowedSanitizedUrl(currentUrl, allowedOrigins) !== undefined)
191
- return result;
192
- if (isHttpUrl(currentUrl))
193
- throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
194
- await delayWithCancellation(25, context.operation, context.signal);
195
- }
196
- throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
197
- };
198
191
  const enableObservationDomains = async (connection, sessionId, signal) => {
199
192
  await connection.send("Runtime.enable", {}, sessionId, signal);
200
- await connection.send("Debugger.enable", { maxScriptsCacheSize: 4 * 1_024 * 1_024 }, sessionId, signal);
201
- await connection.send("Network.enable", {
202
- maxTotalBufferSize: 4 * 1_024 * 1_024,
203
- maxResourceBufferSize: 1_024 * 1_024,
204
- }, sessionId, signal);
193
+ await connection.send("Debugger.enable", {}, sessionId, signal);
194
+ await connection.send("Network.enable", {}, sessionId, signal);
205
195
  };
206
196
  const accessibilityForFrames = async (state, frames) => {
207
197
  const { context, limitations, events } = state;
208
198
  const results = [];
209
199
  let unavailable = false;
210
200
  for (const frame of frames) {
211
- const result = await optionalCdpCommand(context, "Accessibility.getFullAXTree", { depth: 32, frameId: frame.frame_id }, limitations);
201
+ const result = await optionalCdpCommand(context, "Accessibility.getFullAXTree", { frameId: frame.frame_id }, limitations);
212
202
  if (result === undefined)
213
203
  unavailable = true;
214
204
  else
@@ -216,16 +206,12 @@ const accessibilityForFrames = async (state, frames) => {
216
206
  }
217
207
  if (unavailable)
218
208
  events.completeness.unavailable("accessibility");
219
- const capture = captureAccessibility(results, context.input.limits.max_ax_nodes, {
209
+ const capture = captureAccessibility(results, {
220
210
  includeText: context.input.include_accessibility_text,
221
- maximumFieldBytes: context.input.limits.max_ax_text_field_bytes,
222
- maximumTotalBytes: context.input.limits.max_total_ax_text_bytes,
223
211
  ...(results.length === 0 && unavailable ? { unavailable: true } : {}),
224
212
  });
225
213
  if (!context.input.include_accessibility_text)
226
214
  events.completeness.exclude("accessibility", "not_approved", capture.textCapture.excluded_fields);
227
- if (capture.textCapture.status === "truncated")
228
- events.completeness.truncate("accessibility");
229
215
  if (capture.treeIncomplete)
230
216
  events.completeness.truncate("accessibility");
231
217
  return capture;
@@ -246,7 +232,7 @@ const normalizedTarget = (target, currentUrl, allowedOrigins) => {
246
232
  return {
247
233
  target_id: target.id,
248
234
  type: target.type,
249
- title: target.title.slice(0, 16_384),
235
+ title: target.title,
250
236
  url: url?.url ?? "[unsupported-url]",
251
237
  origin: url?.origin ?? "",
252
238
  attached: target.attached,
@@ -8,7 +8,6 @@ export const captureScripts = async (options) => {
8
8
  frameIds,
9
9
  rawResources,
10
10
  resources,
11
- totalSourceBytes: 0,
12
11
  };
13
12
  const drafts = [];
14
13
  for (const script of events.scripts.values())
@@ -42,26 +41,9 @@ const buildScriptDraft = async (script, state) => {
42
41
  };
43
42
  };
44
43
  const captureScriptSource = async (script, state) => {
45
- const { context, events } = state;
46
- if (script.length > context.input.limits.max_script_source_bytes) {
47
- events.completeness.truncate("script_sources");
48
- return sourceExcluded("declared script length exceeds per-script limit");
49
- }
50
- if (state.totalSourceBytes + script.length >
51
- context.input.limits.max_total_script_source_bytes) {
52
- events.completeness.truncate("script_sources");
53
- return sourceExcluded("total script source limit reached");
54
- }
44
+ const { context } = state;
55
45
  const result = requiredRecord(await context.connection.send("Debugger.getScriptSource", { scriptId: script.scriptId }, context.sessionId, context.signal));
56
46
  const content = stringValue(result.scriptSource) ?? "";
57
- const bytes = Buffer.byteLength(content);
58
- if (bytes > context.input.limits.max_script_source_bytes ||
59
- state.totalSourceBytes + bytes >
60
- context.input.limits.max_total_script_source_bytes) {
61
- events.completeness.truncate("script_sources");
62
- return sourceExcluded("actual source exceeds configured byte limits");
63
- }
64
- state.totalSourceBytes += bytes;
65
47
  return sourceResult(content);
66
48
  };
67
49
  const keyAndBuildInventory = (drafts, scriptCount) => {
@@ -1,11 +1,10 @@
1
- import { allowedSanitizedUrl, boundedText, isHttpUrl, recordValue, recordsValue, stringValue, } from "./CdpCaptureValues.js";
1
+ import { allowedSanitizedUrl, isHttpUrl, recordValue, recordsValue, stringValue, } from "./CdpCaptureValues.js";
2
2
  import { optionalCdpCommand } from "./CdpOptionalCommand.js";
3
3
  export const captureWorkers = async (input, frameIds) => {
4
4
  const { context, allowedOrigins, limitations, events } = input;
5
5
  const completeness = events.completeness;
6
6
  const result = await optionalCdpCommand({ ...context, sessionId: undefined }, "Target.getTargets", {}, limitations);
7
7
  const items = [];
8
- let total = 0;
9
8
  if (result === undefined)
10
9
  completeness.unavailable("workers");
11
10
  for (const target of recordsValue(recordValue(result)?.targetInfos)) {
@@ -29,18 +28,15 @@ export const captureWorkers = async (input, frameIds) => {
29
28
  : "unsupported_url");
30
29
  continue;
31
30
  }
32
- total += 1;
33
- if (items.length >= context.input.limits.max_workers)
34
- continue;
35
31
  items.push({
36
- target_id: (stringValue(target.targetId) ?? "").slice(0, 256),
37
- type: type.slice(0, 100),
32
+ target_id: stringValue(target.targetId) ?? "",
33
+ type,
38
34
  url: url.url,
39
35
  origin: url.origin,
40
36
  attached: target.attached === true,
41
- opener_target_id: boundedText(target.openerId, 256) ?? null,
42
- parent_frame_id: boundedText(target.parentFrameId, 256) ?? null,
37
+ opener_target_id: stringValue(target.openerId) ?? null,
38
+ parent_frame_id: stringValue(target.parentFrameId) ?? null,
43
39
  });
44
40
  }
45
- return { total, items };
41
+ return items;
46
42
  };
@@ -37,15 +37,15 @@ const normalizedHeaders = (value) => {
37
37
  if (typeof value !== "object" || value === null || Array.isArray(value))
38
38
  return new Map();
39
39
  const headers = new Map();
40
- for (const [name, raw] of Object.entries(value).slice(0, 500)) {
41
- const normalized = name.toLowerCase().slice(0, 256);
40
+ for (const [name, raw] of Object.entries(value)) {
41
+ const normalized = name.toLowerCase();
42
42
  const header = typeof raw === "string"
43
43
  ? raw
44
44
  : typeof raw === "number" && Number.isFinite(raw)
45
45
  ? String(raw)
46
46
  : undefined;
47
47
  if (header !== undefined)
48
- headers.set(normalized, header.slice(0, 65_536));
48
+ headers.set(normalized, header);
49
49
  }
50
50
  return headers;
51
51
  };
@@ -53,13 +53,13 @@ const parseCsp = (value, baseUrl, allowedOrigins) => {
53
53
  const directives = [];
54
54
  let nonceCount = 0;
55
55
  let hashCount = 0;
56
- for (const rawDirective of (value ?? "").split(";").slice(0, 100)) {
56
+ for (const rawDirective of (value ?? "").split(";")) {
57
57
  const [rawName, ...tokens] = rawDirective.trim().split(/\s+/u);
58
58
  const name = (rawName ?? "").toLowerCase();
59
- if (!/^[a-z][a-z0-9-]{0,99}$/u.test(name))
59
+ if (!/^[a-z][a-z0-9-]*$/u.test(name))
60
60
  continue;
61
61
  const sources = [];
62
- for (const token of tokens.slice(0, 100)) {
62
+ for (const token of tokens) {
63
63
  const lower = token.toLowerCase();
64
64
  if (lower.startsWith("'nonce-")) {
65
65
  nonceCount += 1;
@@ -80,9 +80,9 @@ const parseCsp = (value, baseUrl, allowedOrigins) => {
80
80
  const cspSource = (token, baseUrl, allowedOrigins) => {
81
81
  const lower = token.toLowerCase();
82
82
  if (/^'[a-z0-9-]+'$/u.test(lower))
83
- return { kind: "keyword", value: lower.slice(0, 100) };
83
+ return { kind: "keyword", value: lower };
84
84
  if (/^[a-z][a-z0-9+.-]*:$/u.test(lower))
85
- return { kind: "scheme", value: lower.slice(0, 100) };
85
+ return { kind: "scheme", value: lower };
86
86
  try {
87
87
  const parsed = new URL(token, baseUrl);
88
88
  return allowedOrigins.has(parsed.origin)
@@ -95,8 +95,8 @@ const cspSource = (token, baseUrl, allowedOrigins) => {
95
95
  };
96
96
  const parseLinks = (value, baseUrl, allowedOrigins) => {
97
97
  const links = [];
98
- for (const entry of splitLinkHeader(value ?? "").slice(0, 100)) {
99
- const match = /^\s*<([^>]{1,4096})>(.*)$/u.exec(entry);
98
+ for (const entry of splitLinkHeader(value ?? "")) {
99
+ const match = /^\s*<([^>]*)>(.*)$/u.exec(entry);
100
100
  if (match === null)
101
101
  continue;
102
102
  const parameters = linkParameters(match[2] ?? "");
@@ -107,8 +107,7 @@ const parseLinks = (value, baseUrl, allowedOrigins) => {
107
107
  rel: (parameters.get("rel") ?? "")
108
108
  .toLowerCase()
109
109
  .split(/\s+/u)
110
- .filter(Boolean)
111
- .slice(0, 32),
110
+ .filter(Boolean),
112
111
  as: boundedHeader(parameters.get("as")),
113
112
  type: boundedHeader(parameters.get("type")),
114
113
  crossorigin: boundedHeader(parameters.get("crossorigin")),
@@ -134,15 +133,15 @@ const splitLinkHeader = (value) => {
134
133
  };
135
134
  const linkParameters = (value) => {
136
135
  const parameters = new Map();
137
- for (const raw of value.split(";").slice(1, 50)) {
136
+ for (const raw of value.split(";").slice(1)) {
138
137
  const separator = raw.indexOf("=");
139
138
  const name = (separator < 0 ? raw : raw.slice(0, separator))
140
139
  .trim()
141
140
  .toLowerCase();
142
- if (!/^[a-z][a-z0-9-]{0,99}$/u.test(name))
141
+ if (!/^[a-z][a-z0-9-]*$/u.test(name))
143
142
  continue;
144
143
  const parameter = separator < 0 ? "" : raw.slice(separator + 1).trim();
145
- parameters.set(name, unquote(parameter).slice(0, 1_024));
144
+ parameters.set(name, unquote(parameter));
146
145
  }
147
146
  return parameters;
148
147
  };
@@ -163,10 +162,8 @@ const permissionFeatures = (value) => [
163
162
  ...new Set((value ?? "")
164
163
  .split(",")
165
164
  .map((entry) => entry.split("=", 1)[0]?.trim().toLowerCase() ?? "")
166
- .filter((feature) => /^[a-z][a-z0-9-]{0,99}$/u.test(feature))),
167
- ]
168
- .sort()
169
- .slice(0, 200);
165
+ .filter((feature) => /^[a-z][a-z0-9-]*$/u.test(feature))),
166
+ ].sort();
170
167
  const wellKnownHint = (url) => {
171
168
  try {
172
169
  const path = new URL(url).pathname.toLowerCase();
@@ -180,20 +177,20 @@ const wellKnownHint = (url) => {
180
177
  };
181
178
  const agentHint = (mechanism, declaration, url) => ({
182
179
  mechanism,
183
- declaration: declaration.slice(0, 256),
180
+ declaration,
184
181
  url,
185
182
  trust: "page-declared-untrusted",
186
183
  });
187
184
  const isAgentRel = (value) => ["mcp", "model-context", "ai-plugin", "service-desc"].includes(value);
188
185
  const policyToken = (value) => {
189
186
  const token = (value ?? "").trim().toLowerCase();
190
- return /^[a-z][a-z0-9_.-]{0,99}$/u.test(token) ? token : null;
187
+ return /^[a-z][a-z0-9_.-]*$/u.test(token) ? token : null;
191
188
  };
192
189
  const nonnegativeInteger = (value) => {
193
190
  const number = numberValue(value === undefined ? undefined : Number(value));
194
191
  return number === undefined ? null : Math.max(0, Math.trunc(number));
195
192
  };
196
- const boundedHeader = (value) => value === undefined ? null : value.trim().toLowerCase().slice(0, 256);
193
+ const boundedHeader = (value) => value === undefined ? null : value.trim().toLowerCase();
197
194
  const unquote = (value) => value.startsWith('"') && value.endsWith('"') ? value.slice(1, -1) : value;
198
195
  const agentHeaderNames = ["x-model-context", "x-webmcp", "mcp-server"];
199
196
  const wellKnownAgentPaths = new Set([
@@ -38,8 +38,7 @@ export const captureCdpScreenshot = async (context) => {
38
38
  }
39
39
  const encoded = stringValue(result?.data);
40
40
  const bytes = encoded === undefined ? undefined : decodeCanonicalBase64(encoded);
41
- if (bytes === undefined ||
42
- bytes.byteLength > context.input.maximum_image_bytes)
41
+ if (bytes === undefined)
43
42
  throw new BrowserObservationError("inspect_web_page", "payload_limit");
44
43
  const dimensions = pngDimensions(bytes);
45
44
  if (navigation.leftScope)
@@ -57,7 +56,6 @@ export const captureCdpScreenshot = async (context) => {
57
56
  terminal: true,
58
57
  });
59
58
  return {
60
- schema_version: 1,
61
59
  browser: context.discovery.version,
62
60
  target: {
63
61
  target_id: context.target.id,
@@ -94,8 +92,8 @@ const pngDimensions = (bytes) => {
94
92
  throw new BrowserObservationError("inspect_web_page", "protocol_error");
95
93
  const width = bytes.readUInt32BE(16);
96
94
  const height = bytes.readUInt32BE(20);
97
- if (width === 0 || height === 0 || width * height > 32_000_000)
98
- throw new BrowserObservationError("inspect_web_page", "payload_limit");
95
+ if (width === 0 || height === 0)
96
+ throw new BrowserObservationError("inspect_web_page", "protocol_error");
99
97
  return { width, height };
100
98
  };
101
99
  const PNG_SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
@@ -40,8 +40,7 @@ const attachedSessionId = (value, operation) => {
40
40
  value === null ||
41
41
  !("sessionId" in value) ||
42
42
  typeof value.sessionId !== "string" ||
43
- value.sessionId.length === 0 ||
44
- value.sessionId.length > 256)
43
+ value.sessionId.length === 0)
45
44
  throw new BrowserObservationError(operation, "protocol_error");
46
45
  return value.sessionId;
47
46
  };
@@ -5,7 +5,7 @@ import { BrowserObservationError } from "../domain/errors.js";
5
5
  import { allowedSanitizedUrl, delayWithCancellation, numberValue, recordValue, recordsValue, stringValue, } from "./CdpCaptureValues.js";
6
6
  import { captureFrames, mainFrameUrl } from "./CdpCaptureDocuments.js";
7
7
  import { optionalCdpCommand } from "./CdpOptionalCommand.js";
8
- import { boundedSensitiveText } from "./SensitiveTextCapture.js";
8
+ import { redactSensitiveText } from "./SensitiveTextCapture.js";
9
9
  /** Discover WebMCP registrations without evaluating or invoking page code. */
10
10
  export const discoverWebMcp = async (context) => {
11
11
  const origins = new Set(context.input.allowed_origins);
@@ -19,7 +19,7 @@ export const discoverWebMcp = async (context) => {
19
19
  const initialUrl = mainFrameUrl(frameTree);
20
20
  if (allowedSanitizedUrl(initialUrl, origins) === undefined)
21
21
  throw new BrowserObservationError("inspect_web_page", "target_not_allowed");
22
- const frames = captureFrames(frameTree, origins, 1_000, completeness).items;
22
+ const frames = captureFrames(frameTree, origins, undefined, completeness).items;
23
23
  const frameUrls = new Map(frames.map((frame) => [
24
24
  frame.frame_id,
25
25
  {
@@ -57,7 +57,7 @@ export const discoverWebMcp = async (context) => {
57
57
  }
58
58
  else
59
59
  // CDP sends the enable response before the required toolsAdded replay.
60
- await delayWithCancellation(Math.max(context.input.observation_ms, 25), "discover_webmcp_tools", context.signal);
60
+ await delayWithCancellation(context.input.observation_ms, "discover_webmcp_tools", context.signal);
61
61
  await assertStableAuthorizedFrame(context, initialUrl, origins);
62
62
  return buildWebMcpResult({
63
63
  context,
@@ -96,7 +96,7 @@ const ingestFrameScopeEvent = (event, state) => {
96
96
  };
97
97
  const handleFrameDetached = (params, state) => {
98
98
  const frameId = stringValue(params.frameId);
99
- if (frameId === undefined || frameId.length > 256) {
99
+ if (frameId === undefined) {
100
100
  state.completeness.exclude("webmcp_tools", "invalid_protocol_value");
101
101
  return true;
102
102
  }
@@ -105,7 +105,7 @@ const handleFrameDetached = (params, state) => {
105
105
  };
106
106
  const handleFrameUpdate = (frame, state) => {
107
107
  const frameId = stringValue(frame?.id) ?? stringValue(frame?.frameId);
108
- if (frameId === undefined || frameId.length > 256) {
108
+ if (frameId === undefined) {
109
109
  state.completeness.exclude("webmcp_tools", "invalid_protocol_value");
110
110
  return true;
111
111
  }
@@ -173,10 +173,6 @@ const ingestWebMcpEvent = (options) => {
173
173
  const normalized = normalizeTool(declared, input, frames, completeness);
174
174
  if (normalized === undefined)
175
175
  continue;
176
- if (!tools.has(normalized.tool_key) && tools.size >= input.max_tools) {
177
- completeness.drop("webmcp_tools");
178
- continue;
179
- }
180
176
  tools.set(normalized.tool_key, normalized);
181
177
  }
182
178
  };
@@ -191,19 +187,19 @@ const normalizeTool = (value, input, frames, completeness) => {
191
187
  completeness.exclude("webmcp_tools", "out_of_target_scope");
192
188
  return undefined;
193
189
  }
194
- const description = boundedSensitiveText(stringValue(value.description) ?? "", 4_096).text;
190
+ const description = redactSensitiveText(stringValue(value.description) ?? "");
195
191
  const annotations = recordValue(value.annotations);
196
192
  return {
197
193
  tool_key: toolKey(frame.url, name),
198
- name: boundedSensitiveText(name, 512).text,
194
+ name: redactSensitiveText(name),
199
195
  description,
200
- frame_id: frameId.slice(0, 256),
196
+ frame_id: frameId,
201
197
  frame_url: frame.url,
202
198
  owner_origin: frame.origin,
203
199
  declaration_kind: numberValue(value.backendNodeId) === undefined
204
200
  ? "imperative"
205
201
  : "declarative",
206
- input_schema_shape: schemaShape(value.inputSchema, input, completeness),
202
+ input_schema_shape: schemaShape(value.inputSchema),
207
203
  annotations: {
208
204
  read_only: booleanOrNull(annotations?.readOnly),
209
205
  untrusted_content: booleanOrNull(annotations?.untrustedContent),
@@ -213,17 +209,13 @@ const normalizeTool = (value, input, frames, completeness) => {
213
209
  trust: "page-declared-untrusted",
214
210
  };
215
211
  };
216
- const schemaShape = (value, input, completeness) => {
212
+ const schemaShape = (value) => {
217
213
  if (recordValue(value) === undefined)
218
214
  return null;
219
215
  const encoded = JSON.stringify(value);
220
- const shape = inferJsonShape(encoded, {
221
- maximumBytes: input.max_schema_bytes,
222
- maximumNodes: input.max_schema_nodes,
223
- maximumDepth: input.max_schema_depth,
224
- });
225
- if (shape === null || shape.truncated)
226
- completeness.truncate("webmcp_tools");
216
+ const shape = inferJsonShape(encoded);
217
+ if (shape === null)
218
+ throw new BrowserObservationError("inspect_web_page", "protocol_error");
227
219
  return shape;
228
220
  };
229
221
  const registrationSource = (stack, allowedOrigins) => {
@@ -242,7 +234,6 @@ const buildWebMcpResult = (options) => {
242
234
  const targetUrl = mainFrameUrl(frameTree) ?? context.target.url;
243
235
  const sanitized = allowedSanitizedUrl(targetUrl, new Set(context.input.allowed_origins));
244
236
  return {
245
- schema_version: 1,
246
237
  browser: context.discovery.version,
247
238
  target: {
248
239
  target_id: context.target.id,
@@ -1,16 +1,9 @@
1
- import { realpath } from "node:fs/promises";
2
- import { isAbsolute, relative } from "node:path";
1
+ import { realpath, stat } from "node:fs/promises";
2
+ import { isAbsolute } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- /** Canonicalize operator roots before evaluating any Electron file target. */
5
- export const canonicalElectronRoots = async (roots) => {
6
- const canonical = [];
7
- for (const root of roots)
8
- canonical.push(await realpath(root));
9
- return [...new Set(canonical)].sort();
10
- };
11
- /** Resolve one file URL and reject host, encoding, and symlink root escapes. */
12
- export const authorizedElectronFile = async (value, roots) => {
13
- if (value.length > 65_536 || /%(?:2f|5c)/iu.test(value))
4
+ /** Resolve one local file URL while rejecting remote hosts and encoded separators. */
5
+ export const authorizedElectronFile = async (value) => {
6
+ if (/%(?:2f|5c)/iu.test(value))
14
7
  return undefined;
15
8
  let url;
16
9
  try {
@@ -35,16 +28,12 @@ export const authorizedElectronFile = async (value, roots) => {
35
28
  return undefined;
36
29
  let canonical;
37
30
  try {
31
+ if (!(await stat(path)).isFile())
32
+ return undefined;
38
33
  canonical = await realpath(path);
39
34
  }
40
35
  catch {
41
36
  return undefined;
42
37
  }
43
- return roots.some((root) => withinRoot(root, canonical))
44
- ? canonical
45
- : undefined;
46
- };
47
- const withinRoot = (root, path) => {
48
- const remainder = relative(root, path);
49
- return (remainder === "" || (!remainder.startsWith("..") && !isAbsolute(remainder)));
38
+ return canonical;
50
39
  };
@@ -1,18 +1,16 @@
1
1
  import { browserOriginSchema, sanitizeBrowserUrl, } from "../domain/browserObservation.js";
2
- import { authorizedElectronFile, canonicalElectronRoots, } from "./ElectronFileScope.js";
3
- /** Canonicalize exact filesystem scopes before Inspector attachment. */
4
- export const canonicalRuntimeRoots = canonicalElectronRoots;
5
- /** Authorize one protocol URL without retaining an out-of-scope value. */
6
- export const authorizeRuntimeLocation = async (value, roots, origins) => {
7
- if (value.startsWith("node:") && value.length <= 4_096)
2
+ import { authorizedElectronFile } from "./ElectronFileScope.js";
3
+ /** Resolve a protocol location exposed by the explicitly selected Inspector endpoint. */
4
+ export const authorizeRuntimeLocation = async (value) => {
5
+ if (value.startsWith("node:") && value.length > 0)
8
6
  return {
9
7
  allowed: true,
10
8
  location: { kind: "builtin", specifier: value },
11
9
  };
12
10
  if (value.startsWith("file:")) {
13
- const filePath = await authorizedElectronFile(value, roots);
11
+ const filePath = await authorizedElectronFile(value);
14
12
  return filePath === undefined
15
- ? { allowed: false, reason: "outside_file_roots" }
13
+ ? { allowed: false, reason: "unsupported_location" }
16
14
  : { allowed: true, location: { kind: "file", file_path: filePath } };
17
15
  }
18
16
  let url;
@@ -25,8 +23,8 @@ export const authorizeRuntimeLocation = async (value, roots, origins) => {
25
23
  if (!["http:", "https:"].includes(url.protocol))
26
24
  return { allowed: false, reason: "unsupported_location" };
27
25
  const parsedOrigin = browserOriginSchema.safeParse(url.origin);
28
- if (!parsedOrigin.success || !origins.includes(parsedOrigin.data))
29
- return { allowed: false, reason: "outside_origins" };
26
+ if (!parsedOrigin.success)
27
+ return { allowed: false, reason: "unsupported_location" };
30
28
  return {
31
29
  allowed: true,
32
30
  location: {
@@ -36,3 +34,5 @@ export const authorizeRuntimeLocation = async (value, roots, origins) => {
36
34
  },
37
35
  };
38
36
  };
37
+ /** Authorize a target whose Node Inspector URL omits its main entry path. */
38
+ export const authorizeRuntimeTargetLocation = async (value) => authorizeRuntimeLocation(value);