rea-agents 6.2.0 → 6.4.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 (636) hide show
  1. package/README.md +24 -23
  2. package/bridge/ghidra/ReaGhidraApplySeeds.java +151 -0
  3. package/bridge/ghidra/ReaGhidraBridge.java +597 -209
  4. package/bridge/ghidra/ReaGhidraNoReturnFix.java +123 -0
  5. package/bridge/hopper_bridge.py +2 -0
  6. package/dist/adb/AdbConfiguration.js +88 -0
  7. package/dist/adb/AdbDeviceOutput.js +186 -0
  8. package/dist/adb/AdbProvider.js +1190 -0
  9. package/dist/adb/AdbShellOutput.js +309 -0
  10. package/dist/android/AndroidTargetSnapshot.js +104 -22
  11. package/dist/android/JadxConfiguration.js +44 -24
  12. package/dist/android/JadxProvider.js +59 -21
  13. package/dist/android/JadxSession.js +51 -9
  14. package/dist/apktool/ApktoolConfiguration.js +84 -0
  15. package/dist/apktool/ApktoolDecodeOutput.js +59 -0
  16. package/dist/apktool/ApktoolProvider.js +506 -0
  17. package/dist/application/AnalysisProvider.js +8 -2
  18. package/dist/application/AppBundleExecutable.js +27 -22
  19. package/dist/application/BinaryTargetResolver.js +85 -19
  20. package/dist/application/BrowserScenarioEvidence.js +2 -2
  21. package/dist/application/CapabilityInventory.js +11 -1
  22. package/dist/application/ClientConfigurationDocument.js +98 -0
  23. package/dist/application/ClientConfigurationFiles.js +91 -0
  24. package/dist/application/ClientRegistrationEnvironment.js +35 -0
  25. package/dist/application/ClientRegistrationStatus.js +75 -27
  26. package/dist/application/DirectAnalysis.js +14 -8
  27. package/dist/application/DirectAnalysisCleanup.js +1 -2
  28. package/dist/application/DirectAnalysisStatus.js +3 -6
  29. package/dist/application/Doctor.js +27 -34
  30. package/dist/application/DoctorDiagnostics.js +1 -1
  31. package/dist/application/EvidenceBundleCommands.js +6 -12
  32. package/dist/application/EvidenceBundleFiles.js +1 -1
  33. package/dist/application/GeminiClientSettings.js +139 -0
  34. package/dist/application/HermesClientHome.js +115 -0
  35. package/dist/application/HopperDownload.js +39 -0
  36. package/dist/application/InvestigationProviders.js +10 -4
  37. package/dist/application/JsonFiles.js +16 -15
  38. package/dist/application/JsonInputFile.js +252 -0
  39. package/dist/application/LinuxHopper.js +6 -13
  40. package/dist/application/MacHopper.js +172 -149
  41. package/dist/application/MipsElfAbiFlags.js +140 -0
  42. package/dist/application/ProviderOperationExecution.js +31 -0
  43. package/dist/application/ReconstructionObligationCandidates.js +16 -3
  44. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  45. package/dist/application/ReferenceSourceImport.js +76 -29
  46. package/dist/application/ReferenceSourceImportEntries.js +18 -9
  47. package/dist/application/ReferenceSourceImportPolicy.js +99 -23
  48. package/dist/application/ReferenceSourceImportTypes.js +30 -22
  49. package/dist/application/ReferenceSourceVcsAdapter.js +145 -30
  50. package/dist/application/RegularFileRead.js +103 -0
  51. package/dist/application/Setup.js +69 -10
  52. package/dist/application/SetupClientConfiguration.js +134 -23
  53. package/dist/application/SetupHost.js +102 -22
  54. package/dist/application/SetupPlan.js +18 -17
  55. package/dist/application/SetupSkill.js +81 -13
  56. package/dist/application/SupportedClients.js +305 -37
  57. package/dist/application/Uninstall.js +172 -8
  58. package/dist/application/UpdateMaintenance.js +23 -23
  59. package/dist/application/Utf8JsonInput.js +71 -0
  60. package/dist/application/WebScriptExportService.js +130 -57
  61. package/dist/application/WebSourceLocationService.js +3 -0
  62. package/dist/application/adb/AdbDeviceAnalysisPort.js +1 -0
  63. package/dist/application/adb/AdbDeviceAnalysisService.js +13 -0
  64. package/dist/application/analysisView/AnalysisViewService.js +40 -2
  65. package/dist/application/android/AndroidAnalysisService.js +1 -1
  66. package/dist/application/apktool/ApktoolResourceAnalysisPort.js +1 -0
  67. package/dist/application/apktool/ApktoolResourceAnalysisService.js +13 -0
  68. package/dist/application/binary/AnalysisClientCleanup.js +0 -24
  69. package/dist/application/binary/AnalysisSnapshotCache.js +5 -4
  70. package/dist/application/binary/BinarySession.js +18 -1
  71. package/dist/application/binary/BinarySessionOpen.js +9 -1
  72. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +2 -1
  73. package/dist/application/binaryDiagnostics/PeResourcesPort.js +1 -0
  74. package/dist/application/binaryDiagnostics/PeResourcesService.js +111 -0
  75. package/dist/application/binaryDiagnostics/RecordedCrashService.js +2 -1
  76. package/dist/application/evm/EvmInterfaceService.js +3 -0
  77. package/dist/application/firmware/FirmwareAnalysisService.js +3 -0
  78. package/dist/application/investigation/InspectEvidenceBundle.js +18 -0
  79. package/dist/application/javascript/ElectronActiveEvidence.js +2 -2
  80. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  81. package/dist/application/javascript/ElectronBoundaryGraphContext.js +3 -2
  82. package/dist/application/javascript/ElectronBoundaryGraphIpc.js +2 -2
  83. package/dist/application/javascript/ElectronBoundaryGraphNative.js +20 -3
  84. package/dist/application/javascript/ElectronBoundaryGraphWindows.js +3 -3
  85. package/dist/application/javascript/JavaScriptApplicationEvidence.js +1 -0
  86. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  87. package/dist/application/javascript/JavaScriptApplicationService.js +23 -11
  88. package/dist/application/javascript/JavaScriptApplicationWorkflowEvidence.js +5 -6
  89. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  90. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +171 -36
  91. package/dist/application/javascript/JavaScriptArtifactGraphAccumulator.js +14 -16
  92. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +74 -36
  93. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +4 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +11 -5
  95. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +53 -42
  96. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +92 -10
  97. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +293 -238
  98. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +120 -28
  99. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +4 -0
  100. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  101. package/dist/application/javascript/JavaScriptModuleRelationships.js +10 -20
  102. package/dist/application/javascript/JavaScriptRecoveryService.js +3 -0
  103. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  104. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +11 -5
  105. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +206 -66
  106. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -1
  107. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +18 -23
  108. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +5 -2
  109. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  110. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  111. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +7 -5
  112. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +6 -4
  113. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  114. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +1 -1
  115. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +29 -15
  116. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  117. package/dist/application/jeb/JebAnalysisPort.js +1 -0
  118. package/dist/application/jeb/JebAnalysisService.js +13 -0
  119. package/dist/application/managed/ManagedApplicationGraphService.js +1 -1
  120. package/dist/application/native/NativeCallRoutes.js +2 -4
  121. package/dist/application/native/NativeUiActionTrace.js +16 -8
  122. package/dist/application/native/NativeValueTrace.js +23 -6
  123. package/dist/application/process/ProcessCli.js +25 -20
  124. package/dist/artifacts/ArtifactPaths.js +129 -8
  125. package/dist/artifacts/ArtifactProvider.js +34 -31
  126. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  127. package/dist/artifacts/ArtifactReader.js +23 -0
  128. package/dist/artifacts/ArtifactResourceScope.js +100 -0
  129. package/dist/artifacts/AsarArtifactReader.js +218 -80
  130. package/dist/artifacts/AsarHeader.js +24 -0
  131. package/dist/artifacts/DirectoryArtifactReader.js +168 -65
  132. package/dist/artifacts/MachOSliceArtifactReader.js +116 -39
  133. package/dist/artifacts/NativeDmgArtifactReader.js +179 -87
  134. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  135. package/dist/artifacts/SafeOutputTree.js +245 -70
  136. package/dist/artifacts/SafeOutputTreeCleanup.js +45 -0
  137. package/dist/artifacts/SafeOutputTreeCreationFailure.js +20 -0
  138. package/dist/artifacts/SafeOutputTreeIdentity.js +42 -0
  139. package/dist/artifacts/SafeOutputTreeReadback.js +33 -0
  140. package/dist/artifacts/ZipArtifactReader.js +77 -27
  141. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +58 -18
  142. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +62 -24
  143. package/dist/artifacts/apple/KeyedArchiveReader.js +76 -49
  144. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  145. package/dist/artifacts/extraction/ArtifactExtraction.js +134 -92
  146. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +116 -50
  147. package/dist/artifacts/inventory/ArtifactInventory.js +5 -4
  148. package/dist/artifacts/inventory/classify.js +87 -25
  149. package/dist/artifacts/inventory/hashStableRootArtifact.js +70 -0
  150. package/dist/artifacts/inventory/reader.js +13 -5
  151. package/dist/artifacts/inventory/scanCanonical.js +73 -30
  152. package/dist/artifacts/inventory/scanReader.js +43 -20
  153. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +72 -28
  154. package/dist/artifacts/javascript/JavaScriptSourceAnalysis.js +3 -0
  155. package/dist/browser/BrowserScenarioPartialObservation.js +8 -2
  156. package/dist/browser/BrowserScenarioSecrets.js +52 -37
  157. package/dist/browser/CdpBrowserProvider.js +9 -3
  158. package/dist/browser/CdpCaptureDocuments.js +40 -6
  159. package/dist/browser/CdpCaptureDomSvg.js +210 -0
  160. package/dist/browser/CdpCaptureEventBodyShapes.js +4 -8
  161. package/dist/browser/CdpCaptureEventHandlers.js +26 -9
  162. package/dist/browser/CdpCaptureEvents.js +4 -9
  163. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  164. package/dist/browser/CdpConnection.js +22 -5
  165. package/dist/browser/CdpElectronInspection.js +2 -2
  166. package/dist/browser/CdpElectronProvider.js +4 -3
  167. package/dist/browser/CdpElectronScripts.js +2 -2
  168. package/dist/browser/CdpPageCapture.js +1 -1
  169. package/dist/browser/CdpTargetSession.js +30 -34
  170. package/dist/browser/CdpWebMcpDiscovery.js +48 -23
  171. package/dist/browser/ElectronFileScope.js +99 -9
  172. package/dist/browser/PlaywrightBrowserScenarioProvider.js +63 -7
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +11 -6
  174. package/dist/browser/PlaywrightScenarioArtifacts.js +5 -5
  175. package/dist/browser/PlaywrightScenarioBrowser.js +208 -43
  176. package/dist/browser/PlaywrightScenarioSession.js +130 -65
  177. package/dist/browser/PlaywrightScenarioStorage.js +507 -0
  178. package/dist/browser/PngVisualDiff.js +198 -29
  179. package/dist/browser/WebSourceMapFetcher.js +35 -9
  180. package/dist/browser/assets/LocalWebScriptArtifacts.js +3 -1
  181. package/dist/browser/assets/PublishWebScripts.js +75 -20
  182. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  183. package/dist/browser/assets/WebArtifactReads.js +23 -1
  184. package/dist/browser/assets/WebSourceLocationArtifacts.js +1 -0
  185. package/dist/browser/execution/CdpExecutionCapture.js +3 -3
  186. package/dist/browser/execution/CdpPreciseCoverage.js +5 -8
  187. package/dist/browser/history/HarCapture.js +14 -0
  188. package/dist/browser/history/HarCaptureProcess.js +2 -10
  189. package/dist/browser/history/MitmproxyCaptureAdapter.js +3 -1
  190. package/dist/browser/modules/WebModuleArtifacts.js +1 -0
  191. package/dist/cli/adbCommands.js +337 -0
  192. package/dist/cli/analysisViewCommands.js +39 -1
  193. package/dist/cli/apktoolCommands.js +53 -0
  194. package/dist/cli/artifactCommands.js +8 -11
  195. package/dist/cli/binaryDiagnosticsCommands.js +19 -1
  196. package/dist/cli/browserAdvancedCommands.js +65 -36
  197. package/dist/cli/coreAnalysisCommands.js +2 -2
  198. package/dist/cli/coreBinaryCommands.js +12 -13
  199. package/dist/cli/coreNativeCommands.js +1 -14
  200. package/dist/cli/electronCommands.js +14 -10
  201. package/dist/cli/evmCommands.js +13 -4
  202. package/dist/cli/firmwareCommands.js +7 -2
  203. package/dist/cli/javascriptApplicationAnalysis.js +19 -13
  204. package/dist/cli/javascriptRecoveryCommands.js +22 -15
  205. package/dist/cli/jebCommands.js +99 -0
  206. package/dist/cli/jsonOutput.js +12 -4
  207. package/dist/cli/referenceSourceImportStatus.js +7 -0
  208. package/dist/cli/setupCommands.js +15 -3
  209. package/dist/cli/streamedJsonOutput.js +83 -4
  210. package/dist/cli/utilityCommands.js +68 -22
  211. package/dist/cli/webScriptCommands.js +20 -1
  212. package/dist/cli/webSourceLocationCommands.js +21 -9
  213. package/dist/cli.js +11 -2
  214. package/dist/cliBrowserScenarioCommands.js +2 -1
  215. package/dist/cliCommandNames.js +32 -0
  216. package/dist/cliJsonInput.js +47 -34
  217. package/dist/cliObservationOptions.js +7 -0
  218. package/dist/composition/adb.js +3 -0
  219. package/dist/composition/apktool.js +3 -0
  220. package/dist/composition/auxiliaryAnalysisProviders.js +5 -4
  221. package/dist/composition/binaryDiagnostics.js +4 -0
  222. package/dist/composition/browserScenario.js +2 -2
  223. package/dist/composition/directAnalysis.js +14 -7
  224. package/dist/composition/javascriptAnalysisWorkerProcess.js +48 -0
  225. package/dist/composition/jeb.js +6 -0
  226. package/dist/config/environment.js +10 -0
  227. package/dist/config/ghidraLanguageOverride.js +9 -0
  228. package/dist/config/mcpInputSchemaProfile.js +27 -0
  229. package/dist/config/parseConfig.js +28 -1
  230. package/dist/contracts/adb/adbToolContracts.js +353 -0
  231. package/dist/contracts/advertisedInputExamples.js +48 -0
  232. package/dist/contracts/analysisDetail.js +10 -0
  233. package/dist/contracts/analysisViewToolContracts.js +17 -2
  234. package/dist/contracts/apktool/apktoolToolContracts.js +33 -0
  235. package/dist/contracts/artifactComparisonExample.js +5 -5
  236. package/dist/contracts/artifactToolContracts.js +8 -5
  237. package/dist/contracts/browserToolContracts.js +1 -1
  238. package/dist/contracts/compactInputSchema.js +256 -0
  239. package/dist/contracts/errorSchemas.js +3 -1
  240. package/dist/contracts/functionComparisonExample.js +8 -0
  241. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  242. package/dist/contracts/inputSchemaPresentation.js +104 -13
  243. package/dist/contracts/javascript/electronToolContracts.js +16 -3
  244. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -2
  245. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +6 -3
  246. package/dist/contracts/javascript/javascriptRecoveryToolContracts.js +1 -1
  247. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  248. package/dist/contracts/jeb/jebToolContracts.js +64 -0
  249. package/dist/contracts/managed/managedToolContracts.js +3 -2
  250. package/dist/contracts/mobileApplicationGraphExamples.js +5 -5
  251. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +25 -3
  252. package/dist/contracts/native/nativeToolContracts.js +1 -1
  253. package/dist/contracts/officialToolContracts.js +5 -5
  254. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  255. package/dist/contracts/sessionStatusContract.js +3 -2
  256. package/dist/contracts/sessionToolContracts.js +5 -4
  257. package/dist/contracts/sessionToolSchemas.js +9 -4
  258. package/dist/contracts/toolContractExamples.js +6 -0
  259. package/dist/contracts/toolContractTypes.js +3 -0
  260. package/dist/contracts/toolContracts.js +6 -0
  261. package/dist/contracts/toolEffects.js +167 -0
  262. package/dist/contracts/toolOutputSchemaGroups.js +7 -5
  263. package/dist/contracts/toolOutputSchemaPrimitives.js +2 -5
  264. package/dist/contracts/toolSchemaMetadata.js +82 -7
  265. package/dist/domain/adb/adbDeviceAnalysis.js +583 -0
  266. package/dist/domain/analysisErrorBase.js +5 -0
  267. package/dist/domain/analysisErrorCleanup.js +29 -0
  268. package/dist/domain/analysisErrorPresentation.js +18 -4
  269. package/dist/domain/analysisErrorProjection.js +4 -1
  270. package/dist/domain/analysisSnapshot.js +5 -2
  271. package/dist/domain/analysisView/analysisView.js +53 -5
  272. package/dist/domain/analysisView/binaryLayoutView.js +2 -0
  273. package/dist/domain/analysisView/javascriptApplicationView.js +2 -0
  274. package/dist/domain/analysisView/nativeFunctionView.js +155 -0
  275. package/dist/domain/android/androidApplication.js +25 -20
  276. package/dist/domain/android/androidPartialObservation.js +36 -0
  277. package/dist/domain/apktool/apktoolResourceAnalysis.js +77 -0
  278. package/dist/domain/apple/appleApplication.js +40 -23
  279. package/dist/domain/apple/appleBundleAnatomy.js +95 -28
  280. package/dist/domain/apple/dyldPaths.js +9 -1
  281. package/dist/domain/apple/dylibResolution.js +3 -3
  282. package/dist/domain/apple/interfaceBuilderGraph.js +22 -19
  283. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +10 -1
  284. package/dist/domain/artifactComparison.js +39 -11
  285. package/dist/domain/artifactGraph.js +6 -4
  286. package/dist/domain/artifactIdentity.js +37 -9
  287. package/dist/domain/artifactInspection.js +10 -50
  288. package/dist/domain/artifactIntegrityPolicy.js +10 -0
  289. package/dist/domain/artifactInventoryEvidence.js +16 -17
  290. package/dist/domain/artifactPathSyntax.js +1 -1
  291. package/dist/domain/binaryTarget.js +16 -0
  292. package/dist/domain/binaryTargetTypes.js +8 -1
  293. package/dist/domain/browserCompleteness.js +3 -2
  294. package/dist/domain/browserObservationSchemas.js +8 -4
  295. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  296. package/dist/domain/browserScenarioNormalization.js +3 -3
  297. package/dist/domain/browserScenarioValues.js +3 -2
  298. package/dist/domain/callPath.js +8 -10
  299. package/dist/domain/canonicalDigest.js +7 -1
  300. package/dist/domain/canonicalJsonDigestSteps.js +34 -12
  301. package/dist/domain/canonicalOrdering.js +1 -13
  302. package/dist/domain/changedBehavior.js +2 -3
  303. package/dist/domain/compactStringIdentity.js +9 -0
  304. package/dist/domain/comparisonSemantics.js +0 -5
  305. package/dist/domain/digests.js +0 -3
  306. package/dist/domain/evidence.js +12 -6
  307. package/dist/domain/evidenceBundle.js +51 -33
  308. package/dist/domain/evidenceRecordSummary.js +144 -0
  309. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  310. package/dist/domain/functionComparison.js +2 -1
  311. package/dist/domain/functionComparisonNormalization.js +4 -3
  312. package/dist/domain/functionComparisonResults.js +2 -2
  313. package/dist/domain/functionDossierEvidence.js +2 -1
  314. package/dist/domain/hopperValues.js +11 -15
  315. package/dist/domain/inputIssueProjection.js +16 -1
  316. package/dist/domain/javascript/electronActiveObservation.js +4 -3
  317. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +14 -15
  318. package/dist/domain/javascript/electronStaticAnalysisIpc.js +20 -21
  319. package/dist/domain/javascript/electronStaticAnalysisNative.js +73 -41
  320. package/dist/domain/javascript/electronStaticAnalysisValues.js +24 -4
  321. package/dist/domain/javascript/javascriptAnalysisResourceControls.js +45 -0
  322. package/dist/domain/javascript/javascriptApplicationAnalysis.js +6 -1
  323. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +18 -14
  324. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +4 -0
  325. package/dist/domain/javascript/javascriptApplicationGraph.js +91 -28
  326. package/dist/domain/javascript/javascriptApplicationProjectionResources.js +35 -0
  327. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  328. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  329. package/dist/domain/javascript/javascriptApplicationVersionItems.js +72 -45
  330. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +16 -8
  331. package/dist/domain/javascript/javascriptAstFingerprint.js +60 -33
  332. package/dist/domain/javascript/javascriptAstValues.js +54 -0
  333. package/dist/domain/javascript/javascriptElectronMemberWrites.js +50 -0
  334. package/dist/domain/javascript/javascriptExportShapeComparison.js +3 -2
  335. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +31 -23
  336. package/dist/domain/javascript/javascriptExportShapeSelection.js +2 -2
  337. package/dist/domain/javascript/javascriptExportShapeVariants.js +3 -2
  338. package/dist/domain/javascript/javascriptFeatureSeed.js +5 -3
  339. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  340. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  341. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -4
  342. package/dist/domain/javascript/javascriptModuleSemanticIr.js +15 -0
  343. package/dist/domain/javascript/javascriptNativeHandoff.js +12 -7
  344. package/dist/domain/javascript/javascriptRpcEndpoints.js +253 -0
  345. package/dist/domain/javascript/javascriptRuntimeLoadState.js +1 -3
  346. package/dist/domain/javascript/javascriptRuntimeObservation.js +8 -5
  347. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  348. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  349. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  350. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +12 -6
  351. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  352. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +5 -5
  353. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -223
  354. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  355. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  356. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  357. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +15 -17
  358. package/dist/domain/javascript/javascriptSemanticAnalysis.js +379 -30
  359. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  360. package/dist/domain/javascript/javascriptSemanticCallableResults.js +42 -0
  361. package/dist/domain/javascript/javascriptSemanticCalls.js +8 -1
  362. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -2
  363. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  364. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  365. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  366. package/dist/domain/javascript/javascriptSemanticDerivedAnalysis.js +15 -4
  367. package/dist/domain/javascript/javascriptSemanticFileProjection.js +1 -0
  368. package/dist/domain/javascript/javascriptSemanticFingerprints.js +43 -42
  369. package/dist/domain/javascript/javascriptSemanticGraph.js +205 -52
  370. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +21 -11
  371. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  372. package/dist/domain/javascript/javascriptSemanticIterationSources.js +139 -0
  373. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +774 -136
  374. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  375. package/dist/domain/javascript/javascriptSemanticMutationValues.js +98 -41
  376. package/dist/domain/javascript/javascriptSemanticObjectReferences.js +381 -0
  377. package/dist/domain/javascript/javascriptSemanticObjects.js +9 -7
  378. package/dist/domain/javascript/javascriptSemanticPrimitives.js +7 -2
  379. package/dist/domain/javascript/javascriptSemanticProjection.js +72 -28
  380. package/dist/domain/javascript/javascriptSemanticPromises.js +15 -21
  381. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +100 -0
  382. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  383. package/dist/domain/javascript/javascriptSemanticQuery.js +33 -29
  384. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +4 -5
  385. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  386. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  387. package/dist/domain/javascript/javascriptSemanticReturnedReferences.js +219 -0
  388. package/dist/domain/javascript/javascriptSemanticReturns.js +34 -48
  389. package/dist/domain/javascript/javascriptSemanticState.js +22 -2
  390. package/dist/domain/javascript/javascriptSemanticTraversal.js +25 -2
  391. package/dist/domain/javascript/javascriptSemanticValues.js +169 -30
  392. package/dist/domain/javascript/javascriptSourceAnalysis.js +1 -0
  393. package/dist/domain/javascript/javascriptSourceMapPaths.js +11 -1
  394. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  395. package/dist/domain/javascript/javascriptStaticAnalysis.js +29 -17
  396. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +13 -12
  397. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +49 -5
  398. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +8 -4
  399. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -15
  400. package/dist/domain/javascript/javascriptStaticAnalysisState.js +1 -0
  401. package/dist/domain/javascript/sourceToBundleComparison.js +7 -5
  402. package/dist/domain/javascript/sourceToBundleSignals.js +7 -7
  403. package/dist/domain/jeb/jebAnalysis.js +114 -0
  404. package/dist/domain/jsonSerialization.js +109 -55
  405. package/dist/domain/jsonShape.js +69 -31
  406. package/dist/domain/jsonValue.js +3 -0
  407. package/dist/domain/localPath.js +10 -4
  408. package/dist/domain/managed/managedApplicationGraph.js +47 -6
  409. package/dist/domain/managed/managedApplicationGraphCoverage.js +8 -2
  410. package/dist/domain/managed/managedApplicationGraphNodes.js +94 -59
  411. package/dist/domain/managed/managedArtifact.js +1 -0
  412. package/dist/domain/managed/managedInspectionEvidence.js +13 -0
  413. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  414. package/dist/domain/native/nativeAotPe.js +1408 -0
  415. package/dist/domain/native/nativeCallObservation.js +2 -4
  416. package/dist/domain/native/nativeInstruction.js +21 -0
  417. package/dist/domain/native/nativeMetadataRecovery.js +79 -6
  418. package/dist/domain/native/nativeValueFlow.js +5 -11
  419. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  420. package/dist/domain/native/peResources.js +94 -0
  421. package/dist/domain/nativeConvention.js +33 -0
  422. package/dist/domain/process/processCapture.js +102 -11
  423. package/dist/domain/process/processCaptureCoverage.js +8 -5
  424. package/dist/domain/process/processCaptureExample.js +67 -0
  425. package/dist/domain/process/processCaptureValidation.js +83 -3
  426. package/dist/domain/process/processComparison.js +0 -23
  427. package/dist/domain/process/processScenario.js +62 -10
  428. package/dist/domain/process/processTraceEvaluation.js +4 -4
  429. package/dist/domain/process/processTraceSpecification.js +1 -3
  430. package/dist/domain/propertyListKeys.js +3 -1
  431. package/dist/domain/providerCleanupError.js +6 -2
  432. package/dist/domain/reconstructionCoverage.js +2 -1
  433. package/dist/domain/reconstructionUnknowns.js +4 -3
  434. package/dist/domain/reconstructionVerification.js +3 -2
  435. package/dist/domain/referenceSourceGraph.js +32 -23
  436. package/dist/domain/referenceSourceImportParsing.js +40 -48
  437. package/dist/domain/referenceSourcePathIdentity.js +22 -0
  438. package/dist/domain/referenceSourceRequireBindings.js +137 -0
  439. package/dist/domain/residualUnknown.js +3 -2
  440. package/dist/domain/staticRuntimeCorrelation.js +2 -1
  441. package/dist/domain/swiftSymbolClassification.js +6 -1
  442. package/dist/domain/symbolAnalysis.js +17 -2
  443. package/dist/domain/unicodeCodePointOrder.js +6 -0
  444. package/dist/domain/webBundleAnalyzerInspection.js +23 -3
  445. package/dist/domain/webCaptureDiff.js +170 -30
  446. package/dist/domain/webCaptureDiffSchemas.js +2 -8
  447. package/dist/domain/webInventory.js +3 -2
  448. package/dist/domain/webMcpDiscovery.js +4 -3
  449. package/dist/domain/webScriptExport.js +1 -1
  450. package/dist/domain/webScriptExportError.js +10 -4
  451. package/dist/domain/webScriptExportPlan.js +7 -13
  452. package/dist/domain/zipPackageFormat.js +4 -1
  453. package/dist/domain/zodCollectionSteps.js +24 -0
  454. package/dist/dotnet/ManagedArtifactInspector.js +55 -43
  455. package/dist/dotnet/ManagedDecodeBudget.js +80 -0
  456. package/dist/dotnet/ManagedMemberInspector.js +13 -6
  457. package/dist/dotnet/ManagedMemberInspectorCore.js +2 -2
  458. package/dist/dotnet/ManagedMemberInstructionDecoder.js +5 -4
  459. package/dist/dotnet/ManagedMemberRows.js +9 -4
  460. package/dist/dotnet/ManagedMetadataHeaps.js +15 -5
  461. package/dist/dotnet/ManagedMetadataInventoryRows.js +20 -11
  462. package/dist/dotnet/ManagedMetadataLayout.js +10 -4
  463. package/dist/dotnet/ManagedMethodBodyReader.js +8 -3
  464. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +3 -2
  465. package/dist/dotnet/ManagedNativeBoundaryInspector.js +49 -34
  466. package/dist/dotnet/ManagedPeReader.js +41 -25
  467. package/dist/dotnet/ManagedReaderFailure.js +2 -1
  468. package/dist/dotnet/ManagedStaticProvider.js +65 -31
  469. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  470. package/dist/evaluation/AgentEvaluationReport.js +9 -5
  471. package/dist/evaluation/CodexAgentEval.js +43 -13
  472. package/dist/evm/EvmoleFailures.js +0 -2
  473. package/dist/evm/EvmoleInterfaceProvider.js +67 -2
  474. package/dist/filesystem/OwnedDirectoryHandle.js +29 -0
  475. package/dist/filesystem/OwnedFileHandle.js +36 -0
  476. package/dist/filesystem/RegularFile.js +73 -0
  477. package/dist/filesystem/StableFileHash.js +46 -0
  478. package/dist/filesystem/readFileHandleChunks.js +26 -0
  479. package/dist/firmware/FirmwareCommand.js +25 -3
  480. package/dist/firmware/FirmwareFiles.js +23 -8
  481. package/dist/firmware/FirmwareProvider.js +156 -32
  482. package/dist/firmware/FirmwarePublication.js +24 -3
  483. package/dist/firmware/FirmwareRelease.js +1 -0
  484. package/dist/generatedPackageMetadata.js +2 -2
  485. package/dist/ghidra/GhidraAnalysisProfile.js +55 -4
  486. package/dist/ghidra/GhidraAnalysisSeeds.js +211 -0
  487. package/dist/ghidra/GhidraClient.js +90 -8
  488. package/dist/ghidra/GhidraDiagnostics.js +11 -8
  489. package/dist/ghidra/GhidraFunctionValues.js +26 -2
  490. package/dist/ghidra/GhidraInstallation.js +111 -10
  491. package/dist/ghidra/GhidraInventoryValues.js +23 -1
  492. package/dist/ghidra/GhidraLanguageCatalog.js +99 -0
  493. package/dist/ghidra/GhidraLauncher.js +123 -58
  494. package/dist/ghidra/GhidraLoadImageAttest.js +49 -2
  495. package/dist/ghidra/GhidraMipsProfile.js +79 -0
  496. package/dist/ghidra/GhidraProvider.js +57 -9
  497. package/dist/ghidra/GhidraProviderCapabilities.js +18 -8
  498. package/dist/ghidra/GhidraProviderClient.js +282 -21
  499. package/dist/ghidra/GhidraSessionValues.js +9 -2
  500. package/dist/hopper/HopperAnalysisProfile.js +2 -0
  501. package/dist/hopper/HopperCleanup.js +1 -1
  502. package/dist/hopper/HopperClient.js +15 -6
  503. package/dist/hopper/HopperMachOImage.js +2 -0
  504. package/dist/hopper/HopperProvider.js +13 -2
  505. package/dist/ida/IdaOperationRunner.js +10 -2
  506. package/dist/ida/IdaProvider.js +7 -0
  507. package/dist/ida/IdaSessionClient.js +7 -3
  508. package/dist/ida/IdaWorkspace.js +4 -2
  509. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  510. package/dist/inspector/V8InspectorCaptureProjection.js +46 -13
  511. package/dist/inspector/V8InspectorProvider.js +60 -8
  512. package/dist/javascript/analysis/JavaScriptAnalysisTransfer.js +326 -0
  513. package/dist/javascript/analysis/JavaScriptAnalysisWorker.js +520 -0
  514. package/dist/javascript/analysis/JavaScriptAnalysisWorkerProtocol.js +63 -0
  515. package/dist/javascript/analysis/JavaScriptAnalysisWorkerSchemas.js +521 -0
  516. package/dist/javascript/analysis/JavaScriptAnalysisWorkerServer.js +116 -0
  517. package/dist/javascript/recovery/RecoveryFiles.js +18 -7
  518. package/dist/javascript/recovery/WakaruCommand.js +22 -9
  519. package/dist/javascript/recovery/WakaruExecution.js +11 -7
  520. package/dist/javascript/recovery/WakaruProvider.js +139 -16
  521. package/dist/javascript/recovery/WakaruPublication.js +14 -4
  522. package/dist/javascript/recovery/WakaruRelease.js +10 -3
  523. package/dist/javascript/recovery/WakaruReport.js +12 -7
  524. package/dist/javascript/recovery/WakaruVersion.js +24 -0
  525. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -3
  526. package/dist/javascript/sourceMaps/SourceMapDecoder.js +63 -7
  527. package/dist/javascript/sourceMaps/SourceMapFormat.js +15 -4
  528. package/dist/jeb/JebMcpConnection.js +179 -0
  529. package/dist/jeb/JebMcpEndpoint.js +40 -0
  530. package/dist/jeb/JebProvider.js +299 -0
  531. package/dist/main/shutdown.js +76 -32
  532. package/dist/main/transport.js +1 -1
  533. package/dist/mcpDoctor.js +15 -6
  534. package/dist/native/AppleDispatchCoverage.js +25 -12
  535. package/dist/native/AppleDispatchMetadata.js +14 -7
  536. package/dist/native/AppleMachoFixups.js +71 -15
  537. package/dist/native/AppleMachoSelection.js +23 -3
  538. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  539. package/dist/native/AppleObjcProperties.js +17 -7
  540. package/dist/native/LldbCallTracer.js +241 -75
  541. package/dist/native/NativeMacOSProvider.js +100 -20
  542. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  543. package/dist/native/NativeMachoInspection.js +11 -7
  544. package/dist/native/NativeUiHelperRuntime.js +6 -1
  545. package/dist/native/NativeUiObservation.js +4 -3
  546. package/dist/native/pe/PeResourceLayout.js +120 -0
  547. package/dist/native/pe/PeResourceParser.js +286 -0
  548. package/dist/native/pe/PeResourcesProvider.js +63 -0
  549. package/dist/process/BoundedFileBytes.js +30 -7
  550. package/dist/process/DarwinProcessRunTokenReader.js +8 -3
  551. package/dist/process/OwnedCommand.js +4 -3
  552. package/dist/process/ProcessOwnership.js +104 -112
  553. package/dist/process/ProcessOwnershipObservation.js +104 -51
  554. package/dist/process/ProcessOwnershipProcessTree.js +4 -4
  555. package/dist/process/ProcessRunTokenObservations.js +48 -0
  556. package/dist/process/ProviderDiagnosticRedaction.js +17 -0
  557. package/dist/process/ProviderProcess.js +4 -3
  558. package/dist/process/capture/FilesystemSnapshot.js +116 -22
  559. package/dist/process/capture/ProcessCaptureLifecycle.js +363 -86
  560. package/dist/process/capture/ProcessCaptureProgress.js +62 -0
  561. package/dist/process/capture/ProcessFilesystemEffects.js +19 -4
  562. package/dist/process/capture/ProcessHarness.js +202 -47
  563. package/dist/process/capture/ProcessNormalization.js +3 -1
  564. package/dist/process/capture/ProcessScenarioRuntimeValidation.js +5 -2
  565. package/dist/process/capture/TerminalRenderer.js +24 -7
  566. package/dist/reference/ReferenceSourceReader.js +22 -5
  567. package/dist/reference/ReferenceSourceReaderEntries.js +114 -51
  568. package/dist/reference/ReferenceSourceReaderErrors.js +12 -0
  569. package/dist/reference/ReferenceSourceReaderFile.js +50 -10
  570. package/dist/reference/ReferenceSourceReaderValidate.js +4 -4
  571. package/dist/server/EvidenceMcpServer.js +36 -1
  572. package/dist/server/admittedToolOperation.js +9 -0
  573. package/dist/server/analysisAdmission.js +8 -0
  574. package/dist/server/contractToolHandler.js +21 -0
  575. package/dist/server/createServer.js +118 -47
  576. package/dist/server/registerAdbTools.js +36 -0
  577. package/dist/server/registerAnalysisViewTool.js +4 -9
  578. package/dist/server/registerAndroidTools.js +3 -12
  579. package/dist/server/registerApktoolTools.js +14 -0
  580. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -7
  581. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  582. package/dist/server/registerApplicationTools/compareVersions.js +3 -2
  583. package/dist/server/registerApplicationTools/coverage.js +3 -2
  584. package/dist/server/registerApplicationTools/helpers.js +3 -2
  585. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  586. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -2
  587. package/dist/server/registerApplicationTools/traceFeature.js +3 -2
  588. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  589. package/dist/server/registerArtifactComparisonTool.js +5 -2
  590. package/dist/server/registerArtifactTools.js +2 -2
  591. package/dist/server/registerBinaryDiagnosticsTools.js +16 -4
  592. package/dist/server/registerBrowserScenarioTool.js +10 -7
  593. package/dist/server/registerBrowserTools.js +12 -9
  594. package/dist/server/registerBundleComparisonTool.js +16 -2
  595. package/dist/server/registerCloseLifecycleTool.js +36 -5
  596. package/dist/server/registerElectronTools.js +28 -10
  597. package/dist/server/registerEnhancedTools.js +78 -73
  598. package/dist/server/registerEvidenceTools.js +54 -46
  599. package/dist/server/registerEvmTools.js +4 -9
  600. package/dist/server/registerFirmwareTools.js +3 -11
  601. package/dist/server/registerFunctionComparisonTool.js +5 -2
  602. package/dist/server/registerJavaScriptRecoveryTool.js +4 -9
  603. package/dist/server/registerJavaScriptRuntimeObservationTools.js +9 -6
  604. package/dist/server/registerJebTools.js +16 -0
  605. package/dist/server/registerManagedTools.js +7 -4
  606. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +4 -6
  607. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -2
  608. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +3 -2
  609. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +3 -2
  610. package/dist/server/registerOfficialTools.js +31 -25
  611. package/dist/server/registerPeResourcesTool.js +9 -0
  612. package/dist/server/registerProcessComparisonTool.js +5 -2
  613. package/dist/server/registerRecordedCrashTools.js +4 -9
  614. package/dist/server/registerSessionRecordTools.js +2 -1
  615. package/dist/server/registerSessionTools.js +58 -21
  616. package/dist/server/registerWebModuleTool.js +4 -9
  617. package/dist/server/registerWebNetworkCaptureTool.js +4 -9
  618. package/dist/server/registerWebRuntimeTools.js +6 -5
  619. package/dist/server/registerWebScriptTool.js +6 -3
  620. package/dist/server/registerWebSourceLocationTool.js +4 -9
  621. package/dist/server/toolResult.js +21 -2
  622. package/dist/windows/WindowsPrivateRuntime.js +12 -5
  623. package/install.sh +7 -4
  624. package/licenses/nativeaot-parser-MIT.txt +28 -0
  625. package/native/windows/build/manifest.json +2 -2
  626. package/native/windows/build/rea-windows-x64.node +0 -0
  627. package/package.json +38 -7
  628. package/scripts/rea.mjs +16 -1
  629. package/skills/reverse-engineer-anything/SKILL.md +52 -51
  630. package/skills/reverse-engineer-anything/references/connection-and-recovery.md +127 -0
  631. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -0
  632. package/skills/reverse-engineer-anything/references/javascript-applications.md +92 -13
  633. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +31 -1
  634. package/dist/artifacts/inventory/policy.js +0 -2
  635. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  636. package/dist/server/registerNativeTools.js +0 -6
@@ -1,22 +1,23 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { isAbsolute } from "node:path";
3
- import { compareCodePoints } from "../../domain/canonicalOrdering.js";
3
+ import { compareUnicodeCodePoints } from "../../domain/unicodeCodePointOrder.js";
4
4
  import { AsarArtifactReader } from "../AsarArtifactReader.js";
5
5
  import { ArtifactPathRegistry, normalizeArtifactPath, } from "../ArtifactPaths.js";
6
6
  import { ArtifactReaderFailure, } from "../ArtifactReader.js";
7
7
  import { streamChunkToBuffer } from "../StreamBytes.js";
8
8
  import { hashReadable } from "../ArtifactHash.js";
9
9
  /** Read all relevant textual entries through an already-inventoried reader. */
10
- export const readJavaScriptArtifactFiles = async (reader, snapshot, signal) => {
10
+ export const readJavaScriptArtifactFiles = async (reader, snapshot, resources, signal) => {
11
11
  if (reader instanceof AsarArtifactReader) {
12
12
  const root = snapshot.nodes.find(({ artifact_id }) => artifact_id === snapshot.manifest.root_artifact_id);
13
13
  if (root === undefined)
14
14
  throw new ArtifactReaderFailure("integrity", "Root artifact node is missing");
15
- await verifyEntryBytes(reader.openContainer(signal), { path: ".", sha256: root.sha256, bytes: root.size }, signal);
15
+ await verifyEntryBytes(await reader.openContainer(signal), { path: ".", sha256: root.sha256, bytes: root.size }, signal);
16
16
  }
17
17
  const inventory = expectedInventory(snapshot);
18
18
  const expected = inventory.files;
19
19
  const context = {
20
+ resources,
20
21
  expected,
21
22
  expectedContainers: inventory.containers,
22
23
  registry: new ArtifactPathRegistry(),
@@ -27,11 +28,11 @@ export const readJavaScriptArtifactFiles = async (reader, snapshot, signal) => {
27
28
  invalidUtf8: 0,
28
29
  };
29
30
  await visitReader(reader, "", snapshot.manifest.root_sha256, context);
30
- const files = context.files.sort((left, right) => compareCodePoints(left.path, right.path));
31
+ const files = context.files.sort((left, right) => compareUnicodeCodePoints(left.path, right.path));
31
32
  assertExpectedFilesWereVisited(expected, files);
32
33
  return {
33
34
  files,
34
- containers: context.containers.sort((left, right) => compareCodePoints(left.path, right.path)),
35
+ containers: context.containers.sort((left, right) => compareUnicodeCodePoints(left.path, right.path)),
35
36
  text_bytes_read: context.textBytes,
36
37
  invalid_utf8_files: context.invalidUtf8,
37
38
  };
@@ -43,9 +44,10 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
43
44
  prefix,
44
45
  containerSha256,
45
46
  iterator: reader.entries(context.signal)[Symbol.asyncIterator](),
46
- owned: false,
47
47
  },
48
48
  ];
49
+ const ownedReaders = [];
50
+ let failure;
49
51
  try {
50
52
  while (stack.length > 0) {
51
53
  const frame = stack.at(-1);
@@ -54,8 +56,6 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
54
56
  const next = await frame.iterator.next();
55
57
  if (next.done) {
56
58
  stack.pop();
57
- if (frame.owned)
58
- await frame.reader.close();
59
59
  continue;
60
60
  }
61
61
  const entry = next.value;
@@ -64,17 +64,32 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
64
64
  const nestedAsar = isFilesystemAsar(entry, path);
65
65
  context.registry.add(path, nestedAsar ? "directory" : entry.kind);
66
66
  if (nestedAsar) {
67
- const inventory = expectedContainer(path, context);
67
+ const container = context.expectedContainers.get(path);
68
+ // Inventory deliberately does not expand unverified or unavailable
69
+ // nested archives. Keep the same boundary here when reconstruction
70
+ // reads the active entries again.
71
+ if (container === undefined)
72
+ throw new ArtifactReaderFailure("integrity", `Nested ASAR was not present in inventory: ${path}`);
73
+ if (container.hash_status === "mismatched")
74
+ continue;
75
+ if (container.hash_status === "unavailable")
76
+ throw new ArtifactReaderFailure("unavailable", `Nested ASAR bytes were unavailable during inventory: ${path}`);
77
+ if (container.hash_status !== "verified")
78
+ throw new ArtifactReaderFailure("integrity", `Nested ASAR was not integrity-verified: ${path}`);
79
+ const inventory = container.inventory;
80
+ if (inventory === null)
81
+ throw new ArtifactReaderFailure("integrity", `Verified nested ASAR has no inventory node: ${path}`);
68
82
  await verifyEntryBytes(await frame.reader.open(entry, context.signal), inventory, context.signal);
69
83
  context.containers.push(inventory);
70
84
  const nested = new AsarArtifactReader(entry.adapterKey);
85
+ ownedReaders.push({ reader: nested, path });
71
86
  stack.push({
72
87
  reader: nested,
73
88
  prefix: path,
74
89
  containerSha256: inventory.sha256,
75
90
  iterator: nested.entries(context.signal)[Symbol.asyncIterator](),
76
- owned: true,
77
91
  });
92
+ await nested.prepareContainer(inventory.sha256, context.signal);
78
93
  continue;
79
94
  }
80
95
  const expected = context.expected.get(path);
@@ -97,20 +112,36 @@ const visitReader = async (reader, prefix, containerSha256, context) => {
97
112
  });
98
113
  }
99
114
  }
115
+ catch (cause) {
116
+ failure = { cause };
117
+ }
100
118
  finally {
101
- await Promise.allSettled(stack
102
- .filter(({ owned }) => owned)
103
- .map(async ({ reader, iterator }) => {
104
- await iterator.return?.();
105
- await reader.close();
106
- }));
119
+ for (const { iterator, prefix, reader } of stack.reverse()) {
120
+ try {
121
+ await iterator.return?.();
122
+ }
123
+ catch (cause) {
124
+ failure = {
125
+ cause: ArtifactReaderFailure.withCleanup(failure === undefined ? cause : failure.cause, ArtifactReaderFailure.cleanupObservation(cause, `JavaScript artifact traversal for ${prefix || reader.format}`)),
126
+ };
127
+ }
128
+ }
129
+ for (const owned of ownedReaders.reverse()) {
130
+ const resource = `nested ASAR reader for ${owned.path}`;
131
+ const cleanup = await context.resources.release({
132
+ kind: "reader",
133
+ reader: owned.reader,
134
+ resource,
135
+ });
136
+ if (cleanup.kind === "failed") {
137
+ failure = {
138
+ cause: ArtifactReaderFailure.withCleanup(failure === undefined ? cleanup.cause : failure.cause, ArtifactReaderFailure.cleanupObservation(cleanup.cause, resource)),
139
+ };
140
+ }
141
+ }
107
142
  }
108
- };
109
- const expectedContainer = (path, context) => {
110
- const container = context.expectedContainers.get(path);
111
- if (container === undefined)
112
- throw new ArtifactReaderFailure("integrity", `Nested ASAR disappeared from inventory: ${path}`);
113
- return container;
143
+ if (failure !== undefined)
144
+ throw failure.cause;
114
145
  };
115
146
  const readText = async (context, input) => {
116
147
  if (input.expected.kind === "native-addon") {
@@ -155,8 +186,18 @@ const expectedInventory = (snapshot) => {
155
186
  const files = new Map();
156
187
  const containers = new Map();
157
188
  for (const occurrence of snapshot.occurrences) {
158
- if (occurrence.artifact_id === null || occurrence.logical_path === ".")
189
+ if (occurrence.logical_path === ".")
159
190
  continue;
191
+ const isNestedAsar = occurrence.entry_kind === "file" &&
192
+ occurrence.logical_path.toLowerCase().endsWith(".asar");
193
+ if (occurrence.artifact_id === null) {
194
+ if (isNestedAsar)
195
+ containers.set(occurrence.logical_path, {
196
+ hash_status: occurrence.hash_status,
197
+ inventory: null,
198
+ });
199
+ continue;
200
+ }
160
201
  const node = nodes.get(occurrence.artifact_id);
161
202
  if (node === undefined)
162
203
  throw new ArtifactReaderFailure("integrity", `Artifact inventory node is missing: ${occurrence.logical_path}`);
@@ -165,12 +206,15 @@ const expectedInventory = (snapshot) => {
165
206
  // node_modules/@zip.js remains a graph node and must never be opened.
166
207
  if (occurrence.entry_kind !== "file")
167
208
  continue;
168
- if (occurrence.logical_path.toLowerCase().endsWith(".asar"))
209
+ if (isNestedAsar)
169
210
  containers.set(occurrence.logical_path, {
170
- path: occurrence.logical_path,
171
- sha256: node.sha256,
172
- bytes: node.size,
173
- inventory_artifact_id: node.artifact_id,
211
+ hash_status: occurrence.hash_status,
212
+ inventory: {
213
+ path: occurrence.logical_path,
214
+ sha256: node.sha256,
215
+ bytes: node.size,
216
+ inventory_artifact_id: node.artifact_id,
217
+ },
174
218
  });
175
219
  const kind = relevantKind(occurrence.logical_path);
176
220
  if (kind === undefined)
@@ -0,0 +1,3 @@
1
+ import { JavaScriptAnalysisWorker } from "../../javascript/analysis/JavaScriptAnalysisWorker.js";
2
+ /** Construct the inert artifact analyzer; resources are acquired on the first source. */
3
+ export const createJavaScriptSourceAnalysis = (limits, sourceCount) => new JavaScriptAnalysisWorker(limits, undefined, sourceCount);
@@ -5,13 +5,19 @@ import { BrowserObservationError } from "../domain/browserObservationError.js";
5
5
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
6
6
  import { PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY } from "./providerIdentities.js";
7
7
  const OPERATION = "capture_browser_scenario";
8
- const browserScenarioLimitations = (session) => [
8
+ const browserScenarioLimitations = (session, scenario) => [
9
9
  "Event sequence records provider receipt order; simultaneous browser causality is not inferred.",
10
10
  "Network content is retained only when selected; response bytes are browser-decoded, not compressed wire bytes.",
11
11
  "Request bytes are limited to what Playwright exposes; not_exposed does not establish body absence or multipart file coverage.",
12
12
  "Network content reads settle within 5 seconds each and never wait for unfinished responses or refetch them.",
13
13
  "Playwright scenario events do not expose request initiator stacks; receipt order does not prove causality.",
14
14
  "Storage values are hashed only after declared-secret redaction.",
15
+ ...(scenario.storage.local_storage.length === 0 &&
16
+ scenario.storage.session_storage.length === 0
17
+ ? []
18
+ : [
19
+ "Non-cookie storage seeds use CDP pre-script instrumentation; only pauses in the scenario's private seed script are resumed by this observer.",
20
+ ]),
15
21
  ...(session.eventLimitations?.() ?? []),
16
22
  ...(session.mode === "connect"
17
23
  ? [
@@ -40,7 +46,7 @@ export const browserScenarioCaptureData = (input) => ({
40
46
  steps: [...input.steps],
41
47
  events: input.session.events(),
42
48
  limitations: [
43
- ...browserScenarioLimitations(input.session),
49
+ ...browserScenarioLimitations(input.session, input.scenario),
44
50
  ...(input.limitations ?? []),
45
51
  ],
46
52
  });
@@ -6,6 +6,36 @@ const encodedSecretValues = (secret) => new Set([
6
6
  encodeURIComponent(secret),
7
7
  new URLSearchParams([["value", secret]]).toString().slice("value=".length),
8
8
  ]);
9
+ const secretSpellings = (secret, spellings) => {
10
+ if (secret === "")
11
+ return [];
12
+ if (spellings === "raw")
13
+ return [secret];
14
+ const values = [...encodedSecretValues(secret)];
15
+ if (spellings === "bytes")
16
+ values.push(JSON.stringify(secret).slice(1, -1));
17
+ return [...new Set(values)].filter((value) => value !== "");
18
+ };
19
+ const declaredLiterals = (values, spellings) => [
20
+ ...new Set([...values.values()].flatMap((secret) => secretSpellings(secret, spellings))),
21
+ ];
22
+ /** Pick a marker that does not itself contain a declared secret spelling. */
23
+ const redactionMarker = (id, literals) => [`${REDACTION_PREFIX}${id}]`, "[REDACTED]", "…", ""].find((candidate) => literals.every((literal) => !candidate.includes(literal))) ?? "";
24
+ const replaceSecretLiterals = (value, values, spellings, literals) => {
25
+ const replacements = [...values]
26
+ .flatMap(([id, secret]) => secretSpellings(secret, spellings).map((text) => ({ id, text })))
27
+ .sort((left, right) => right.text.length - left.text.length ||
28
+ (left.id < right.id ? -1 : left.id > right.id ? 1 : 0));
29
+ let output = value;
30
+ for (const replacement of replacements)
31
+ output = output.replaceAll(replacement.text, redactionMarker(replacement.id, literals));
32
+ return output;
33
+ };
34
+ const secretNeedles = (values, literals) => [...values].flatMap(([id, secret]) => secretSpellings(secret, "bytes").map((text) => ({
35
+ id,
36
+ needle: Buffer.from(text),
37
+ marker: Buffer.from(redactionMarker(id, literals)),
38
+ })));
9
39
  /** Resolved secret values kept only for one in-memory scenario session. */
10
40
  export class BrowserScenarioSecrets {
11
41
  values;
@@ -38,35 +68,18 @@ export class BrowserScenarioSecrets {
38
68
  return url.href;
39
69
  }
40
70
  redact(value) {
41
- let output = value;
42
- const replacements = [...this.values].sort(([leftId, left], [rightId, right]) => right.length - left.length ||
43
- (leftId < rightId ? -1 : leftId > rightId ? 1 : 0));
44
- for (const [id, secret] of replacements)
45
- if (secret !== "")
46
- output = output.replaceAll(secret, `${REDACTION_PREFIX}${id}]`);
47
- return output;
71
+ const literals = declaredLiterals(this.values, "raw");
72
+ const output = replaceSecretLiterals(value, this.values, "raw", literals);
73
+ return literals.some((literal) => output.includes(literal)) ? "" : output;
48
74
  }
49
75
  /** Replace declared UTF-8, URI/form, and JSON-escaped secrets without decoding binary data. */
50
76
  redactBytes(value) {
51
- const candidates = [...this.values]
52
- .flatMap(([id, secret]) => {
53
- if (secret === "")
54
- return [];
55
- return [
56
- ...new Set([
57
- ...encodedSecretValues(secret),
58
- JSON.stringify(secret).slice(1, -1),
59
- ]),
60
- ].map((text) => {
61
- const needle = Buffer.from(text);
62
- return {
63
- id,
64
- needle,
65
- marker: Buffer.from(`${REDACTION_PREFIX}${id}]`),
66
- index: value.indexOf(needle),
67
- };
68
- });
69
- })
77
+ const literals = declaredLiterals(this.values, "bytes");
78
+ const candidates = secretNeedles(this.values, literals)
79
+ .map((candidate) => ({
80
+ ...candidate,
81
+ index: value.indexOf(candidate.needle),
82
+ }))
70
83
  .sort((left, right) => right.needle.length - left.needle.length ||
71
84
  (left.id < right.id ? -1 : left.id > right.id ? 1 : 0));
72
85
  const parts = [];
@@ -88,20 +101,22 @@ export class BrowserScenarioSecrets {
88
101
  if (parts.length === 0)
89
102
  return value;
90
103
  parts.push(value.subarray(offset));
91
- return Buffer.concat(parts);
104
+ const redacted = Buffer.concat(parts);
105
+ return literals.some((literal) => redacted.includes(Buffer.from(literal)))
106
+ ? Buffer.alloc(0)
107
+ : redacted;
92
108
  }
93
109
  /** Remove only declared secret values from one URL and report that action. */
94
110
  sanitizeUrl(value) {
95
- let output = value;
96
- const replacements = [...this.values].sort(([leftId, left], [rightId, right]) => right.length - left.length ||
97
- (leftId < rightId ? -1 : leftId > rightId ? 1 : 0));
98
- for (const [id, secret] of replacements) {
99
- if (secret === "")
100
- continue;
101
- const marker = `${REDACTION_PREFIX}${id}]`;
102
- for (const candidate of encodedSecretValues(secret))
103
- output = output.replaceAll(candidate, marker);
104
- }
111
+ const literals = declaredLiterals(this.values, "url");
112
+ const output = replaceSecretLiterals(value, this.values, "url", literals);
113
+ if (literals.some((literal) => output.includes(literal)))
114
+ return {
115
+ url: "",
116
+ origin: null,
117
+ query_parameter_names: [],
118
+ redacted: true,
119
+ };
105
120
  const sanitized = sanitizeBrowserUrl(output);
106
121
  return {
107
122
  ...sanitized,
@@ -7,6 +7,7 @@ import { webMcpDiscoverySchema, } from "../domain/webMcpDiscovery.js";
7
7
  import { browserCaptureComparisonSchema, compareBrowserCaptures, } from "../domain/browserCaptureComparison.js";
8
8
  import { webScreenshotDiffSchema, webScreenshotSchema, } from "../domain/webScreenshot.js";
9
9
  import { AnalysisError } from "../domain/analysisErrorBase.js";
10
+ import { AnalysisInputError } from "../domain/analysisErrorCore.js";
10
11
  import { BrowserObservationError } from "../domain/browserObservationError.js";
11
12
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
12
13
  import {} from "../domain/browserObservationErrors.js";
@@ -21,12 +22,11 @@ import { discoverWebMcp } from "./CdpWebMcpDiscovery.js";
21
22
  import { captureCdpScreenshot } from "./CdpScreenshot.js";
22
23
  import { comparePngScreenshots } from "./PngVisualDiff.js";
23
24
  import { CDP_BROWSER_PROVIDER_IDENTITY } from "./providerIdentities.js";
24
- const IDENTITY = CDP_BROWSER_PROVIDER_IDENTITY;
25
25
  const CLEANUP_DOMAINS = ["Network", "Debugger", "Runtime", "Page"];
26
26
  /** Passive browser observation through a selected user-owned CDP endpoint. */
27
27
  export class CdpBrowserProvider {
28
28
  identity() {
29
- return IDENTITY;
29
+ return CDP_BROWSER_PROVIDER_IDENTITY;
30
30
  }
31
31
  async listTargets(input, options = {}) {
32
32
  try {
@@ -174,6 +174,10 @@ export class CdpBrowserProvider {
174
174
  return ok(webScreenshotDiffSchema.parse(comparePngScreenshots(input)));
175
175
  }
176
176
  catch (cause) {
177
+ if (cause instanceof TypeError)
178
+ return err(new AnalysisInputError("compare_web_screenshots", { cause }, [
179
+ { path: [], reason: "invalid_format", message: cause.message },
180
+ ]));
177
181
  return err(providerError(cause, "compare_web_screenshots"));
178
182
  }
179
183
  }
@@ -262,4 +266,6 @@ const providerError = (cause, operation) => cause instanceof BrowserObservationE
262
266
  ? new BrowserObservationError(operation, cause.reason, { cause })
263
267
  : cause instanceof AnalysisError
264
268
  ? cause
265
- : new ProviderAdapterError(IDENTITY.id, operation, { cause });
269
+ : new ProviderAdapterError(CDP_BROWSER_PROVIDER_IDENTITY.id, operation, {
270
+ cause,
271
+ });
@@ -1,5 +1,6 @@
1
1
  import { allowedSanitizedUrl, numberValue, recordValue, recordsValue, requiredRecord, cdpStringValue, } from "./CdpCaptureValues.js";
2
2
  import { exclusionReasonForUrl } from "./CdpCaptureEventHelpers.js";
3
+ import { createDocumentSvgAncestry, domSvgLink } from "./CdpCaptureDomSvg.js";
3
4
  /** Normalize every allowed frame, optionally selecting a leading frame. */
4
5
  export const captureFrames = (result, allowedOrigins, maximum, completeness) => {
5
6
  const root = recordValue(recordValue(result)?.frameTree);
@@ -114,21 +115,27 @@ export const captureDom = (result, allowedOrigins, input, completeness) => {
114
115
  ? documentNodes.attributes
115
116
  : [];
116
117
  const baseIndex = nodes.length;
118
+ const ancestry = createDocumentSvgAncestry({
119
+ nodeTypes,
120
+ nodeNames,
121
+ parents,
122
+ strings,
123
+ attributes,
124
+ });
117
125
  total += nodeTypes.length;
118
126
  for (let index = 0; index < nodeTypes.length; index += 1) {
119
127
  const attributeIndexes = numberArray(attributes[index]);
120
128
  const parent = Math.trunc(parents[index] ?? -1);
121
129
  const nodeIndex = nodes.length;
122
130
  const nodeName = indexedString(strings, nodeNames[index]);
131
+ const attributeNames = uniqueAttributeNames(attributeIndexes, strings);
123
132
  nodes.push({
124
133
  index: nodeIndex,
125
134
  parent_index: parent < 0 ? -1 : baseIndex + parent,
126
135
  node_type: Math.max(0, Math.trunc(nodeTypes[index] ?? 0)),
127
136
  node_name: nodeName,
128
137
  node_value_length: indexedString(strings, nodeValues[index]).length,
129
- attribute_names: attributeIndexes
130
- .filter((_value, attributeIndex) => attributeIndex % 2 === 0)
131
- .map((value) => indexedString(strings, value)),
138
+ attribute_names: attributeNames,
132
139
  });
133
140
  const metadata = domMetadata({
134
141
  strings,
@@ -139,6 +146,7 @@ export const captureDom = (result, allowedOrigins, input, completeness) => {
139
146
  nodeIndex,
140
147
  nodeName,
141
148
  allowedOrigins,
149
+ ...domSvgLink(ancestry, index),
142
150
  });
143
151
  for (const url of metadata.urls) {
144
152
  urls.push(url);
@@ -261,23 +269,49 @@ const indexedString = (strings, index) => {
261
269
  const integer = numberValue(index);
262
270
  return integer === undefined ? "" : (strings[Math.trunc(integer)] ?? "");
263
271
  };
272
+ const uniqueAttributeNames = (attributeIndexes, strings) => {
273
+ const names = [];
274
+ const seen = new Set();
275
+ for (let index = 0; index < attributeIndexes.length; index += 2) {
276
+ const name = indexedString(strings, attributeIndexes[index]);
277
+ if (seen.has(name))
278
+ continue;
279
+ seen.add(name);
280
+ names.push(name);
281
+ }
282
+ return names;
283
+ };
264
284
  const numberArray = (value) => Array.isArray(value)
265
285
  ? value.flatMap((item) => {
266
286
  const number = numberValue(item);
267
287
  return number === undefined ? [] : [number];
268
288
  })
269
289
  : [];
290
+ // Chrome reads an SVG XLink href only when href itself is absent, and an
291
+ // empty href still wins. HTML keeps the literal attribute name `xlink:href`.
292
+ // XML uses any prefix bound to the XLink namespace. Both are stored as href.
293
+ const hrefAttributeValue = (pairs, attribute, options) => {
294
+ const declared = pairs.get(attribute);
295
+ if (declared !== undefined)
296
+ return declared;
297
+ if (attribute !== "href" || !options.svgElement)
298
+ return undefined;
299
+ return options.xmlDocument ? options.xlinkHref : pairs.get("xlink:href");
300
+ };
270
301
  const domMetadata = (options) => {
271
302
  const { strings, attributes, baseUrl, documentUrl, nodeIndex, nodeName, allowedOrigins, } = options;
272
303
  const pairs = new Map();
273
304
  for (let index = 0; index + 1 < attributes.length; index += 2) {
274
- const name = indexedString(strings, attributes[index]).toLowerCase();
305
+ // Chrome already folds HTML names; SVG/XML names remain case-sensitive.
306
+ const name = indexedString(strings, attributes[index]);
275
307
  const value = indexedString(strings, attributes[index + 1]);
276
- pairs.set(name, value);
308
+ // HTML keeps the first declaration. A later repeat must not move dom_urls.
309
+ if (!pairs.has(name))
310
+ pairs.set(name, value);
277
311
  }
278
312
  const urls = [];
279
313
  for (const attribute of domUrlAttributes) {
280
- const value = pairs.get(attribute);
314
+ const value = hrefAttributeValue(pairs, attribute, options);
281
315
  if (value === undefined)
282
316
  continue;
283
317
  const tagName = nodeName.toLowerCase();