rea-agents 6.1.0 → 6.3.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 (573) hide show
  1. package/README.md +24 -24
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +8 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +64 -36
  7. package/dist/android/JadxSession.js +51 -9
  8. package/dist/application/BinaryTargetResolver.js +68 -20
  9. package/dist/application/BrowserEvidence.js +3 -8
  10. package/dist/application/BrowserScenarioEvidence.js +4 -20
  11. package/dist/application/CapabilityInventory.js +43 -9
  12. package/dist/application/ClientConfigurationDocument.js +97 -25
  13. package/dist/application/ClientRegistrationStatus.js +19 -6
  14. package/dist/application/DirectAnalysis.js +41 -20
  15. package/dist/application/DirectAnalysisCleanup.js +71 -0
  16. package/dist/application/DirectAnalysisStatus.js +3 -7
  17. package/dist/application/Doctor.js +40 -53
  18. package/dist/application/DoctorDiagnostics.js +2 -3
  19. package/dist/application/EnhancedTools.js +51 -6
  20. package/dist/application/EvidenceBundleFiles.js +8 -3
  21. package/dist/application/InvestigationProviders.js +13 -5
  22. package/dist/application/JsonFiles.js +56 -23
  23. package/dist/application/LinuxHopper.js +11 -7
  24. package/dist/application/MacHopper.js +15 -18
  25. package/dist/application/RealHopperAssertions.js +0 -11
  26. package/dist/application/ReconstructionObligationCandidates.js +10 -3
  27. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
  28. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  29. package/dist/application/RegularFileRead.js +17 -0
  30. package/dist/application/Setup.js +26 -23
  31. package/dist/application/SetupClientConfiguration.js +18 -7
  32. package/dist/application/SetupHost.js +20 -29
  33. package/dist/application/SetupPlan.js +24 -20
  34. package/dist/application/SetupSkill.js +57 -8
  35. package/dist/application/SupportedClients.js +43 -0
  36. package/dist/application/Uninstall.js +98 -30
  37. package/dist/application/UpdateMaintenance.js +13 -7
  38. package/dist/application/UpdateRuntime.js +12 -12
  39. package/dist/application/Utf8JsonInput.js +64 -0
  40. package/dist/application/WebScriptExportService.js +38 -5
  41. package/dist/application/WorkflowEvidence.js +25 -2
  42. package/dist/application/XrefsAddressResolution.js +45 -0
  43. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  44. package/dist/application/android/AndroidAnalysisService.js +1 -1
  45. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  46. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  47. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  48. package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
  49. package/dist/application/binary/BinarySession.js +86 -29
  50. package/dist/application/binary/BinarySessionComposition.js +1 -3
  51. package/dist/application/binary/BinarySessionExecution.js +3 -5
  52. package/dist/application/binary/BinarySessionOpen.js +10 -2
  53. package/dist/application/binary/BinarySessionRecords.js +1 -1
  54. package/dist/application/binary/BinarySessionStatus.js +1 -6
  55. package/dist/application/binary/CompositeProvider.js +4 -18
  56. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  57. package/dist/application/binary/SessionProviderRouter.js +27 -135
  58. package/dist/application/homebrew.js +48 -0
  59. package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
  60. package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
  61. package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
  62. package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
  63. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
  64. package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
  65. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
  66. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
  67. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
  68. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  69. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  70. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  71. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
  72. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  73. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
  74. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
  75. package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
  76. package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
  77. package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
  78. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  79. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
  80. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
  81. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
  82. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
  83. package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
  84. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
  85. package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
  86. package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
  87. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
  88. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
  89. package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
  90. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
  91. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
  92. package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
  93. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  94. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  95. package/dist/application/native/NativeCallRoutes.js +2 -4
  96. package/dist/application/process/ProcessCli.js +11 -11
  97. package/dist/application/process/ProcessEvidence.js +0 -1
  98. package/dist/artifacts/ArtifactProvider.js +53 -30
  99. package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
  100. package/dist/artifacts/ArtifactReader.js +31 -0
  101. package/dist/artifacts/AsarArtifactReader.js +81 -17
  102. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  103. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  104. package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
  105. package/dist/artifacts/NativeDmgOwnership.js +109 -0
  106. package/dist/artifacts/SafeOutputTree.js +16 -2
  107. package/dist/artifacts/ZipArtifactReader.js +11 -4
  108. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  109. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  110. package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
  111. package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
  112. package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
  113. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
  114. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  115. package/dist/artifacts/inventory/classify.js +33 -14
  116. package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
  117. package/dist/artifacts/inventory/reader.js +3 -3
  118. package/dist/artifacts/inventory/scanCanonical.js +64 -34
  119. package/dist/artifacts/inventory/scanReader.js +12 -20
  120. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
  121. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  122. package/dist/browser/CdpBrowserProvider.js +6 -6
  123. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  124. package/dist/browser/CdpCaptureEvents.js +0 -1
  125. package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
  126. package/dist/browser/CdpCaptureValues.js +20 -0
  127. package/dist/browser/CdpElectronInspection.js +2 -2
  128. package/dist/browser/CdpElectronProvider.js +4 -5
  129. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  130. package/dist/browser/CdpElectronScripts.js +4 -5
  131. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  132. package/dist/browser/CdpSafeMetadata.js +10 -10
  133. package/dist/browser/CdpWebMcpDiscovery.js +16 -13
  134. package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
  135. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  136. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  138. package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
  139. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  140. package/dist/browser/PlaywrightScenarioSession.js +41 -32
  141. package/dist/browser/WebSourceMapFetcher.js +32 -6
  142. package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
  143. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  144. package/dist/browser/history/CaptureFailures.js +6 -2
  145. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  146. package/dist/catalogIdentity.js +0 -1
  147. package/dist/cli/analysisViewCommands.js +36 -0
  148. package/dist/cli/artifactCommands.js +11 -12
  149. package/dist/cli/coreAnalysisCommands.js +3 -3
  150. package/dist/cli/coreBinaryCommands.js +37 -28
  151. package/dist/cli/coreNativeCommands.js +9 -10
  152. package/dist/cli/electronCommands.js +12 -13
  153. package/dist/cli/interactiveSetup.js +6 -6
  154. package/dist/cli/javascriptApplicationAnalysis.js +2 -12
  155. package/dist/cli/jsonOutput.js +3 -2
  156. package/dist/cli/managedCommands.js +7 -8
  157. package/dist/cli/nativeCallCommands.js +1 -2
  158. package/dist/cli/omittableDefaults.js +50 -0
  159. package/dist/cli/processCommands.js +3 -2
  160. package/dist/cli/setupCommands.js +16 -15
  161. package/dist/cli/streamedJsonOutput.js +83 -4
  162. package/dist/cli/utilityCommands.js +10 -12
  163. package/dist/cli.js +19 -8
  164. package/dist/cliBrowserScenarioCommands.js +2 -2
  165. package/dist/cliCommandNames.js +1 -0
  166. package/dist/cliJsonFile.js +179 -0
  167. package/dist/cliJsonInput.js +60 -33
  168. package/dist/cliObservationOptions.js +4 -0
  169. package/dist/cliOutput.js +0 -38
  170. package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
  171. package/dist/composition/binary.js +9 -9
  172. package/dist/composition/browserScenario.js +2 -1
  173. package/dist/composition/directAnalysis.js +20 -14
  174. package/dist/composition/electronScenario.js +1 -1
  175. package/dist/composition/optionalObservationProviders.js +12 -7
  176. package/dist/config/environment.js +6 -0
  177. package/dist/config/ghidraStartupTimeout.js +4 -9
  178. package/dist/config/homeDirectory.js +12 -0
  179. package/dist/config/mcpResponseBudget.js +9 -1
  180. package/dist/config/parseConfig.js +7 -3
  181. package/dist/config/parsers.js +19 -22
  182. package/dist/contracts/analysisViewToolContracts.js +56 -0
  183. package/dist/contracts/applicationToolContracts.js +5 -4
  184. package/dist/contracts/artifactComparisonExample.js +7 -7
  185. package/dist/contracts/artifactToolContracts.js +1 -1
  186. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  187. package/dist/contracts/browserToolContracts.js +19 -15
  188. package/dist/contracts/enhancedInputs.js +2 -2
  189. package/dist/contracts/enhancedToolContracts.js +4 -3
  190. package/dist/contracts/errorSchemas.js +3 -1
  191. package/dist/contracts/evm/evmToolContracts.js +1 -1
  192. package/dist/contracts/functionComparisonExample.js +8 -0
  193. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  194. package/dist/contracts/inputSchemaPresentation.js +181 -0
  195. package/dist/contracts/investigationExamples.js +4 -3
  196. package/dist/contracts/javascript/electronToolContracts.js +3 -2
  197. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
  198. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
  199. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  200. package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
  201. package/dist/contracts/managed/managedToolContracts.js +8 -12
  202. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  203. package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
  204. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  205. package/dist/contracts/native/nativeToolContracts.js +2 -2
  206. package/dist/contracts/officialToolContracts.js +2 -1
  207. package/dist/contracts/promptContracts.js +2 -2
  208. package/dist/contracts/providerSelection.js +1 -1
  209. package/dist/contracts/sessionLifecycleInputs.js +4 -3
  210. package/dist/contracts/sessionStatusContract.js +3 -2
  211. package/dist/contracts/sessionToolContracts.js +17 -4
  212. package/dist/contracts/sessionToolSchemas.js +4 -16
  213. package/dist/contracts/toolContracts.js +2 -0
  214. package/dist/contracts/toolEffects.js +1 -0
  215. package/dist/contracts/toolOutputSchemaGroups.js +138 -94
  216. package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
  217. package/dist/contracts/toolSchemaMetadata.js +18 -69
  218. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  219. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  220. package/dist/contracts/webScriptToolContracts.js +1 -1
  221. package/dist/doctorRuntime.js +7 -5
  222. package/dist/domain/analysisErrorBase.js +5 -0
  223. package/dist/domain/analysisErrorCore.js +3 -0
  224. package/dist/domain/analysisErrorPresentation.js +22 -5
  225. package/dist/domain/analysisErrorProjection.js +24 -5
  226. package/dist/domain/analysisSnapshot.js +31 -31
  227. package/dist/domain/analysisView/analysisView.js +241 -0
  228. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  229. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  230. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  231. package/dist/domain/android/androidApplication.js +1 -1
  232. package/dist/domain/android/androidPartialObservation.js +36 -0
  233. package/dist/domain/apple/appleApplication.js +1 -1
  234. package/dist/domain/apple/dylibResolution.js +10 -3
  235. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  236. package/dist/domain/apple/keyedArchive.js +26 -2
  237. package/dist/domain/artifactComparison.js +15 -6
  238. package/dist/domain/artifactGraph.js +17 -4
  239. package/dist/domain/artifactIdentity.js +8 -8
  240. package/dist/domain/artifactInspection.js +8 -8
  241. package/dist/domain/artifactInventoryEvidence.js +9 -16
  242. package/dist/domain/artifactOperationError.js +3 -3
  243. package/dist/domain/artifactPartialObservation.js +1 -0
  244. package/dist/domain/artifactPathSyntax.js +49 -0
  245. package/dist/domain/binaryTarget.js +39 -13
  246. package/dist/domain/browserCaptureComparison.js +13 -49
  247. package/dist/domain/browserCompleteness.js +3 -2
  248. package/dist/domain/browserNetworkEvidence.js +10 -4
  249. package/dist/domain/browserObservation.js +0 -1
  250. package/dist/domain/browserObservationSchemas.js +14 -3
  251. package/dist/domain/browserScenario.js +0 -1
  252. package/dist/domain/browserScenarioCapture.js +1 -2
  253. package/dist/domain/browserScenarioCaptureValues.js +2 -2
  254. package/dist/domain/browserScenarioDiff.js +0 -2
  255. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  256. package/dist/domain/browserScenarioDiffValues.js +2 -2
  257. package/dist/domain/browserScenarioNormalization.js +3 -3
  258. package/dist/domain/browserScenarioValues.js +6 -6
  259. package/dist/domain/callPath.js +15 -18
  260. package/dist/domain/callPathSchemas.js +2 -2
  261. package/dist/domain/canonicalDigest.js +7 -1
  262. package/dist/domain/canonicalOrdering.js +1 -13
  263. package/dist/domain/changedBehavior.js +5 -6
  264. package/dist/domain/comparisonSemantics.js +0 -5
  265. package/dist/domain/completionLedgerGeneration.js +2 -1
  266. package/dist/domain/configurationErrors.js +12 -0
  267. package/dist/domain/conformancePackage.js +4 -3
  268. package/dist/domain/digests.js +0 -3
  269. package/dist/domain/evidence.js +19 -40
  270. package/dist/domain/evidenceBundle.js +58 -42
  271. package/dist/domain/evidenceCompletionLedger.js +2 -1
  272. package/dist/domain/firmware/firmwareAnalysis.js +4 -3
  273. package/dist/domain/functionComparison.js +6 -6
  274. package/dist/domain/functionComparisonDimensions.js +120 -87
  275. package/dist/domain/functionComparisonNormalization.js +26 -36
  276. package/dist/domain/functionComparisonResults.js +3 -6
  277. package/dist/domain/functionComparisonSchemas.js +2 -8
  278. package/dist/domain/functionDossierEvidence.js +4 -38
  279. package/dist/domain/hopperValues.js +11 -15
  280. package/dist/domain/javascript/electronActiveObservation.js +29 -71
  281. package/dist/domain/javascript/electronObservation.js +14 -3
  282. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
  283. package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
  284. package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
  285. package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
  286. package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
  287. package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
  288. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
  289. package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
  290. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  291. package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
  292. package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
  293. package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
  294. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
  295. package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
  296. package/dist/domain/javascript/javascriptAstValues.js +22 -0
  297. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  298. package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
  299. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  300. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
  301. package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
  302. package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
  303. package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
  304. package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
  305. package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
  306. package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
  307. package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
  308. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  309. package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
  310. package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
  311. package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
  312. package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
  313. package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
  314. package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
  315. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
  316. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
  317. package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
  318. package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
  319. package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
  320. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
  321. package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
  322. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  323. package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
  324. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  325. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
  326. package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
  327. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
  328. package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
  329. package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
  330. package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
  331. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
  332. package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
  333. package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
  334. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
  335. package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
  336. package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
  337. package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
  338. package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
  339. package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
  340. package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
  341. package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
  342. package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
  343. package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
  344. package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
  345. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
  346. package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
  347. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  348. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  349. package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
  350. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  351. package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
  352. package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
  353. package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
  354. package/dist/domain/javascript/javascriptSourceParser.js +34 -9
  355. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
  356. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  357. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
  358. package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
  359. package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
  360. package/dist/domain/jsonSerialization.js +109 -55
  361. package/dist/domain/jsonShape.js +46 -19
  362. package/dist/domain/localPath.js +10 -4
  363. package/dist/domain/managed/managedApplicationGraph.js +10 -6
  364. package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
  365. package/dist/domain/managed/managedArtifact.js +6 -4
  366. package/dist/domain/managed/managedMemberComparison.js +2 -9
  367. package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
  368. package/dist/domain/managed/managedNativeVerification.js +0 -2
  369. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  370. package/dist/domain/native/binaryLayout.js +2 -3
  371. package/dist/domain/native/nativeApiBoundary.js +1 -1
  372. package/dist/domain/native/nativeCallObservation.js +3 -3
  373. package/dist/domain/native/nativeInstruction.js +7 -0
  374. package/dist/domain/native/nativeValueFlow.js +5 -11
  375. package/dist/domain/native/objcSwiftMetadata.js +15 -17
  376. package/dist/domain/native/recordedCrash.js +2 -3
  377. package/dist/domain/offsetDateTime.js +17 -0
  378. package/dist/domain/process/processCapture.js +22 -20
  379. package/dist/domain/process/processCaptureCoverage.js +70 -0
  380. package/dist/domain/process/processCaptureExample.js +45 -1
  381. package/dist/domain/process/processCaptureParsing.js +1 -34
  382. package/dist/domain/process/processCaptureValidation.js +82 -13
  383. package/dist/domain/process/processComparison.js +39 -43
  384. package/dist/domain/process/processObservation.js +10 -2
  385. package/dist/domain/process/processScenario.js +24 -2
  386. package/dist/domain/process/processTraceComparison.js +0 -2
  387. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  388. package/dist/domain/process/processTraceEvaluation.js +19 -15
  389. package/dist/domain/process/processTraceSpecification.js +4 -7
  390. package/dist/domain/providerAdapterError.js +2 -0
  391. package/dist/domain/providerCleanupError.js +6 -2
  392. package/dist/domain/reconstructionCoverage.js +7 -3
  393. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  394. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  395. package/dist/domain/reconstructionUnknowns.js +4 -3
  396. package/dist/domain/reconstructionVerification.js +6 -5
  397. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  398. package/dist/domain/referenceSourceGraph.js +27 -28
  399. package/dist/domain/referenceSourceImportParsing.js +34 -45
  400. package/dist/domain/residualUnknown.js +3 -2
  401. package/dist/domain/staticRuntimeCorrelation.js +4 -3
  402. package/dist/domain/stringPatterns.js +6 -0
  403. package/dist/domain/swiftSymbolClassification.js +66 -0
  404. package/dist/domain/symbolAnalysis.js +83 -20
  405. package/dist/domain/unicodeCodePointOrder.js +6 -0
  406. package/dist/domain/webBundleAnalyzerInspection.js +9 -1
  407. package/dist/domain/webCaptureDiff.js +71 -30
  408. package/dist/domain/webCaptureDiffSchemas.js +8 -11
  409. package/dist/domain/webEventListeners.js +3 -2
  410. package/dist/domain/webExecution.js +3 -2
  411. package/dist/domain/webInventory.js +3 -2
  412. package/dist/domain/webMcpDiscovery.js +4 -3
  413. package/dist/domain/webRuntime.js +0 -2
  414. package/dist/domain/webScriptExport.js +2 -2
  415. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  416. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  417. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  418. package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
  419. package/dist/dotnet/ManagedMemberRows.js +75 -62
  420. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  421. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  422. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  423. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  424. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  425. package/dist/dotnet/ManagedStaticProvider.js +13 -12
  426. package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
  427. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  428. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  429. package/dist/evaluation/CodexAgentEval.js +12 -8
  430. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  431. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  432. package/dist/filesystem/RegularFile.js +41 -0
  433. package/dist/firmware/FirmwareCommand.js +9 -5
  434. package/dist/firmware/FirmwareProvider.js +4 -4
  435. package/dist/generatedPackageMetadata.js +2 -2
  436. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  437. package/dist/ghidra/GhidraClient.js +105 -36
  438. package/dist/ghidra/GhidraClientStartup.js +0 -2
  439. package/dist/ghidra/GhidraDoctor.js +6 -5
  440. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  441. package/dist/ghidra/GhidraInstallation.js +151 -22
  442. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  443. package/dist/ghidra/GhidraLauncher.js +58 -26
  444. package/dist/ghidra/GhidraProvider.js +6 -2
  445. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  446. package/dist/ghidra/GhidraProviderClient.js +13 -3
  447. package/dist/ghidra/GhidraSessionError.js +2 -0
  448. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  449. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  450. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  451. package/dist/hopper/BridgeLauncher.js +34 -45
  452. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  453. package/dist/hopper/HopperCleanup.js +56 -27
  454. package/dist/hopper/HopperClient.js +86 -65
  455. package/dist/hopper/HopperMachOImage.js +3 -2
  456. package/dist/hopper/HopperProvider.js +16 -18
  457. package/dist/hopper/HopperRegexSearch.js +3 -6
  458. package/dist/hopper/HopperTargetLease.js +132 -49
  459. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  460. package/dist/ida/IdaConfiguration.js +8 -3
  461. package/dist/ida/IdaInput.js +1 -7
  462. package/dist/ida/IdaMcpConnection.js +8 -4
  463. package/dist/ida/IdaOperationRunner.js +5 -3
  464. package/dist/ida/IdaProvider.js +8 -12
  465. package/dist/ida/IdaSessionClient.js +24 -20
  466. package/dist/ida/IdaWorkspace.js +12 -13
  467. package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
  468. package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
  469. package/dist/inspector/V8InspectorProvider.js +97 -35
  470. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  471. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  472. package/dist/main/shutdown.js +81 -29
  473. package/dist/main/startup.js +9 -2
  474. package/dist/main/transport.js +23 -3
  475. package/dist/main.js +11 -18
  476. package/dist/native/AppleMachoSelection.js +16 -6
  477. package/dist/native/AppleObjcDispatchFacets.js +3 -3
  478. package/dist/native/AppleObjcProperties.js +17 -7
  479. package/dist/native/CommandRunner.js +9 -7
  480. package/dist/native/LldbCallTracer.js +249 -77
  481. package/dist/native/NativeMacOSProvider.js +32 -17
  482. package/dist/native/NativeMacOSProviderMetadata.js +1 -2
  483. package/dist/native/NativeUiHelperRuntime.js +11 -2
  484. package/dist/native/NativeUiObservation.js +2 -2
  485. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  486. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  487. package/dist/process/ExecFileOutput.js +88 -6
  488. package/dist/process/PrivateRuntimeRoot.js +10 -5
  489. package/dist/process/ProcessOwnership.js +1 -4
  490. package/dist/process/ProcessOwnershipObservation.js +18 -16
  491. package/dist/process/ProviderProcess.js +1 -3
  492. package/dist/process/capture/FilesystemSnapshot.js +131 -24
  493. package/dist/process/capture/ProcessCaptureError.js +13 -0
  494. package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
  495. package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
  496. package/dist/process/capture/ProcessHarness.js +16 -33
  497. package/dist/process/capture/ProcessNormalization.js +20 -2
  498. package/dist/process/capture/ProcessSampling.js +25 -2
  499. package/dist/process/capture/TerminalRenderer.js +14 -0
  500. package/dist/process/snapshotEnvironment.js +14 -0
  501. package/dist/server/EvidenceMcpServer.js +25 -14
  502. package/dist/server/analysisAdmission.js +8 -0
  503. package/dist/server/createServer.js +71 -59
  504. package/dist/server/mcpClientMetadata.js +12 -5
  505. package/dist/server/promptCompletion.js +3 -8
  506. package/dist/server/registerAnalysisViewTool.js +15 -0
  507. package/dist/server/registerAndroidTools.js +2 -3
  508. package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
  509. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  510. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  511. package/dist/server/registerApplicationTools/coverage.js +1 -2
  512. package/dist/server/registerApplicationTools/helpers.js +4 -4
  513. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  514. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  515. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  516. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  517. package/dist/server/registerArtifactComparisonTool.js +4 -5
  518. package/dist/server/registerArtifactTools.js +2 -2
  519. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  520. package/dist/server/registerBrowserScenarioTool.js +3 -4
  521. package/dist/server/registerBrowserTools.js +13 -16
  522. package/dist/server/registerBundleComparisonTool.js +5 -6
  523. package/dist/server/registerCloseLifecycleTool.js +8 -7
  524. package/dist/server/registerElectronTools.js +10 -13
  525. package/dist/server/registerEnhancedTools.js +82 -77
  526. package/dist/server/registerEvidenceTools.js +54 -47
  527. package/dist/server/registerEvmTools.js +2 -3
  528. package/dist/server/registerFirmwareTools.js +2 -3
  529. package/dist/server/registerFunctionComparisonTool.js +7 -8
  530. package/dist/server/registerInvestigationTools.js +14 -15
  531. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  532. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  533. package/dist/server/registerManagedTools.js +7 -4
  534. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  535. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  536. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  537. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  538. package/dist/server/registerOfficialTools.js +32 -41
  539. package/dist/server/registerProcessComparisonTool.js +8 -8
  540. package/dist/server/registerRecordedCrashTools.js +2 -3
  541. package/dist/server/registerSessionRecordTools.js +15 -19
  542. package/dist/server/registerSessionStatusTool.js +3 -4
  543. package/dist/server/registerSessionTools.js +19 -19
  544. package/dist/server/registerWebModuleTool.js +2 -3
  545. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  546. package/dist/server/registerWebRuntimeTools.js +4 -5
  547. package/dist/server/registerWebScriptTool.js +2 -3
  548. package/dist/server/registerWebSourceLocationTool.js +2 -3
  549. package/dist/server/toolResult.js +66 -94
  550. package/dist/server/toolResultEncoding.js +11 -10
  551. package/dist/windows/WindowsNativeLoader.js +1 -0
  552. package/dist/windows/WindowsOwnedProcess.js +60 -15
  553. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  554. package/native/windows/README.md +3 -1
  555. package/native/windows/build/manifest.json +2 -2
  556. package/native/windows/build/rea-windows-x64.node +0 -0
  557. package/package.json +42 -30
  558. package/scripts/rea.mjs +3 -6
  559. package/skills/reverse-engineer-anything/SKILL.md +14 -13
  560. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  561. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  562. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  563. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
  564. package/dist/artifacts/inventory/policy.js +0 -2
  565. package/dist/config.js +0 -1
  566. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  567. package/dist/contracts/process/processCaptureExample.js +0 -2
  568. package/dist/contracts/toolOutputSchemas.js +0 -2
  569. package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
  570. package/dist/main/reload.js +0 -12
  571. package/dist/main/state.js +0 -3
  572. package/dist/server/registerNativeTools.js +0 -6
  573. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { authorizeRuntimeLocation, inspectorExclusionKey, throwIfRuntimeObservationCancelled, } from "./JavaScriptRuntimeScope.js";
2
+ import { authorizeRuntimeLocation, inspectorExclusionKey, projectReportedRuntimeUrl, throwIfRuntimeObservationCancelled, } from "./JavaScriptRuntimeScope.js";
3
3
  /** Empty durable-location exclusion counters. */
4
4
  export const createInspectorExclusionCounts = () => ({
5
5
  unsupported_location: 0,
@@ -15,26 +15,29 @@ export const describeInspectorTargetLimitations = () => [
15
15
  ];
16
16
  const LOCATION_AUTHORIZATION_WORKERS = 8;
17
17
  /** Canonically authorize, deduplicate, and sort one bounded raw capture. */
18
- export const finalizeInspectorCapture = async ({ input, runtime, target, state, authorizeLocation = authorizeRuntimeLocation, signal, }) => {
19
- throwIfRuntimeObservationCancelled(signal);
18
+ export const finalizeInspectorCapture = async ({ input, runtime, target, state, authorizeLocation = authorizeRuntimeLocation, locationMode = "verify", signal, }) => {
19
+ if (locationMode === "verify")
20
+ throwIfRuntimeObservationCancelled(signal);
20
21
  const exclusions = createInspectorExclusionCounts();
21
22
  const scripts = new Map();
22
23
  const draftsByUrl = new Map();
23
- for (const draft of state.scripts) {
24
- const drafts = draftsByUrl.get(draft.rawUrl) ?? [];
25
- drafts.push(draft);
26
- draftsByUrl.set(draft.rawUrl, drafts);
27
- }
24
+ if (locationMode === "verify")
25
+ for (const draft of state.scripts) {
26
+ const drafts = draftsByUrl.get(draft.rawUrl) ?? [];
27
+ drafts.push(draft);
28
+ draftsByUrl.set(draft.rawUrl, drafts);
29
+ }
28
30
  const groups = [...draftsByUrl];
29
31
  const authorizedGroups = new Array(groups.length);
30
32
  let nextGroup = 0;
31
33
  let stopScheduling = false;
34
+ let unresolvedScripts = 0;
32
35
  const worker = async () => {
33
36
  try {
34
37
  for (;;) {
35
- throwIfRuntimeObservationCancelled(signal);
36
38
  if (stopScheduling)
37
39
  return;
40
+ throwIfRuntimeObservationCancelled(signal);
38
41
  const index = nextGroup;
39
42
  nextGroup += 1;
40
43
  const group = groups[index];
@@ -53,12 +56,18 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
53
56
  throw cause;
54
57
  }
55
58
  };
56
- const workerResults = await Promise.allSettled(Array.from({ length: Math.min(LOCATION_AUTHORIZATION_WORKERS, groups.length) }, worker));
59
+ const workerResults = locationMode === "verify"
60
+ ? await Promise.allSettled(Array.from({ length: Math.min(LOCATION_AUTHORIZATION_WORKERS, groups.length) }, worker))
61
+ : [];
57
62
  const failedWorker = workerResults.find((result) => result.status === "rejected");
58
- throwIfRuntimeObservationCancelled(signal);
63
+ if (locationMode === "verify")
64
+ throwIfRuntimeObservationCancelled(signal);
59
65
  if (failedWorker?.status === "rejected")
60
66
  throw failedWorker.reason;
61
- for (const { drafts, decision } of authorizedGroups) {
67
+ for (const group of authorizedGroups) {
68
+ if (group === undefined)
69
+ continue;
70
+ const { drafts, decision } = group;
62
71
  for (const draft of drafts) {
63
72
  if (!decision.allowed) {
64
73
  exclusions[inspectorExclusionKey(decision.reason)] += 1;
@@ -68,6 +77,14 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
68
77
  scripts.set(script.script_key, script);
69
78
  }
70
79
  }
80
+ if (locationMode === "reported")
81
+ for (const draft of state.scripts) {
82
+ const location = partialScriptLocation(draft.rawUrl);
83
+ if (location.kind === "unresolved")
84
+ unresolvedScripts += 1;
85
+ const script = scriptFromDraft(draft, location);
86
+ scripts.set(script.script_key, script);
87
+ }
71
88
  const items = [...scripts.values()].sort((left, right) => left.script_key < right.script_key
72
89
  ? -1
73
90
  : left.script_key > right.script_key
@@ -77,7 +94,7 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
77
94
  .map((context) => ({
78
95
  context_key: context.contextKey,
79
96
  state: context.state,
80
- name: null,
97
+ name: context.name,
81
98
  origin: context.origin,
82
99
  }))
83
100
  .sort((left, right) => left.context_key < right.context_key
@@ -85,7 +102,8 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
85
102
  : left.context_key > right.context_key
86
103
  ? 1
87
104
  : 0);
88
- throwIfRuntimeObservationCancelled(signal);
105
+ if (locationMode === "verify")
106
+ throwIfRuntimeObservationCancelled(signal);
89
107
  return {
90
108
  runtime,
91
109
  target: {
@@ -132,6 +150,11 @@ export const finalizeInspectorCapture = async ({ input, runtime, target, state,
132
150
  "The discovery-reported file location cannot be verified; loaded script locations are resolved independently from Debugger.scriptParsed.",
133
151
  ]
134
152
  : []),
153
+ ...(unresolvedScripts === 0
154
+ ? []
155
+ : [
156
+ `${String(unresolvedScripts)} observed script location${unresolvedScripts === 1 ? " remains" : "s remain"} unverified; raw URLs and script metadata are retained.`,
157
+ ]),
135
158
  "Scripts collected before attachment may have been garbage-collected and therefore omitted.",
136
159
  "A bounded observation window cannot establish that an unobserved script or behavior never occurs.",
137
160
  "The declared Node/Electron process role is not authenticated by the Inspector protocol.",
@@ -157,3 +180,13 @@ const scriptFromDraft = (draft, location) => {
157
180
  status: "observed-loaded",
158
181
  };
159
182
  };
183
+ const partialScriptLocation = (reportedUrl) => {
184
+ const projection = projectReportedRuntimeUrl(reportedUrl);
185
+ if (projection.allowed)
186
+ return projection.location;
187
+ return {
188
+ kind: "unresolved",
189
+ reported_url: reportedUrl,
190
+ reason: "location-authorization-not-attempted",
191
+ };
192
+ };
@@ -4,13 +4,11 @@ import { BrowserObservationError } from "../domain/browserObservationError.js";
4
4
  import { ProviderAdapterError } from "../domain/providerAdapterError.js";
5
5
  import {} from "../domain/browserObservationErrors.js";
6
6
  import { err, ok } from "../domain/result.js";
7
- import { numberValue, recordValue, cdpStringValue, delayWithCancellation, } from "../browser/CdpCaptureValues.js";
7
+ import { numberValue, recordValue, cdpStringValue, scriptMetadataValues, delayWithCancellation, } from "../browser/CdpCaptureValues.js";
8
8
  import { CdpConnection } from "../browser/CdpConnection.js";
9
9
  import { authorizeRuntimeTargetLocation, inspectorExclusionKey, } from "./JavaScriptRuntimeScope.js";
10
10
  import { createInspectorExclusionCounts, describeInspectorTargetLimitations, finalizeInspectorCapture, } from "./V8InspectorCaptureProjection.js";
11
11
  import { discoverV8Inspector, } from "./V8InspectorEndpoint.js";
12
- /** Public identity committed by passive V8 Inspector observations. */
13
- export { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentity.js";
14
12
  import { V8_INSPECTOR_PROVIDER_IDENTITY } from "./providerIdentity.js";
15
13
  /** Maximum decoded CDP message accepted while observing one Inspector target. */
16
14
  export const INSPECTOR_MAX_PAYLOAD_BYTES = 16 * 1024 * 1024;
@@ -56,19 +54,30 @@ export class V8InspectorProvider {
56
54
  }
57
55
  async observe(input, options = {}) {
58
56
  let connection;
57
+ let discovery;
58
+ let target;
59
+ let state;
59
60
  let primaryFailure;
60
61
  let failed = false;
61
62
  let cleanupFailure;
62
63
  let cleanupFailed = false;
64
+ let connectionClosePromise;
63
65
  let outcome;
66
+ const closeConnection = () => {
67
+ if (connection === undefined)
68
+ return Promise.resolve();
69
+ connectionClosePromise ??= closeInspectorConnection(connection, options.signal);
70
+ return connectionClosePromise;
71
+ };
64
72
  try {
65
- const discovery = await discoverV8Inspector(input.inspector_endpoint, "observe_javascript_runtime", options.signal);
66
- const target = await authorizedTarget(discovery.targets, input, discovery.runtime.product);
73
+ discovery = await discoverV8Inspector(input.inspector_endpoint, "observe_javascript_runtime", options.signal);
74
+ target = await authorizedTarget(discovery.targets, input, discovery.runtime.product);
67
75
  if (input.runtime_kind !== undefined)
68
76
  assertRuntimeKind(target, input.runtime_kind);
69
77
  connection = await CdpConnection.connect(target.webSocketUrl, "observe_javascript_runtime", options.signal, { maxPayloadBytes: INSPECTOR_MAX_PAYLOAD_BYTES });
70
- const state = emptyCaptureState();
71
- const removeListener = connection.onEvent((event) => ingestEvent(event, input, state));
78
+ const captureState = emptyCaptureState();
79
+ state = captureState;
80
+ const removeListener = connection.onEvent((event) => ingestEvent(event, captureState));
72
81
  try {
73
82
  await connection.send("Runtime.enable", {}, undefined, options.signal);
74
83
  await connection.send("Debugger.enable", {}, undefined, options.signal);
@@ -81,7 +90,7 @@ export class V8InspectorProvider {
81
90
  input,
82
91
  runtime: discovery.runtime,
83
92
  target,
84
- state,
93
+ state: captureState,
85
94
  ...(options.signal === undefined ? {} : { signal: options.signal }),
86
95
  });
87
96
  outcome = ok(javascriptRuntimeObservationSchema.parse(result));
@@ -89,12 +98,53 @@ export class V8InspectorProvider {
89
98
  catch (cause) {
90
99
  failed = true;
91
100
  primaryFailure = cause;
92
- outcome = err(providerError(cause, "observe_javascript_runtime"));
101
+ let error = providerError(cause, "observe_javascript_runtime");
102
+ if (state !== undefined &&
103
+ discovery !== undefined &&
104
+ target !== undefined &&
105
+ (cause instanceof BrowserObservationError ||
106
+ options.signal?.aborted === true)) {
107
+ const reason = options.signal?.aborted === true
108
+ ? "cancelled"
109
+ : cause instanceof BrowserObservationError
110
+ ? cause.reason
111
+ : "protocol_error";
112
+ try {
113
+ await closeConnection();
114
+ }
115
+ catch (cause) {
116
+ cleanupFailed = true;
117
+ cleanupFailure = cause;
118
+ }
119
+ try {
120
+ const partialObservation = await finalizeInspectorCapture({
121
+ input,
122
+ runtime: discovery.runtime,
123
+ target,
124
+ state,
125
+ locationMode: "reported",
126
+ });
127
+ error = new BrowserObservationError("observe_javascript_runtime", reason, {
128
+ cause: error,
129
+ ...(error.userMessage === undefined
130
+ ? {}
131
+ : { detail: error.userMessage }),
132
+ partialObservation,
133
+ });
134
+ }
135
+ catch (projectionFailure) {
136
+ error = new BrowserObservationError("observe_javascript_runtime", reason, {
137
+ cause: new AggregateError([error, projectionFailure], "Inspector failure and partial-observation projection both failed"),
138
+ detail: `${error.message} Partial observations could not be projected.`,
139
+ });
140
+ }
141
+ }
142
+ outcome = err(error);
93
143
  }
94
144
  finally {
95
145
  if (connection !== undefined)
96
146
  try {
97
- await closeInspectorConnection(connection, options.signal);
147
+ await closeConnection();
98
148
  }
99
149
  catch (cause) {
100
150
  cleanupFailed = true;
@@ -102,7 +152,11 @@ export class V8InspectorProvider {
102
152
  }
103
153
  }
104
154
  if (cleanupFailed) {
105
- return err(inspectorCleanupError(primaryFailure, cleanupFailure, failed));
155
+ return err(inspectorCleanupError(primaryFailure, cleanupFailure, failed, outcome?.ok === true
156
+ ? outcome.value
157
+ : outcome?.ok === false
158
+ ? outcome.error.partialObservation
159
+ : undefined));
106
160
  }
107
161
  return (outcome ??
108
162
  err(new BrowserObservationError("observe_javascript_runtime", "protocol_error")));
@@ -132,11 +186,21 @@ export const closeInspectorConnection = async (connection, signal) => {
132
186
  signal.removeEventListener("abort", onAbort);
133
187
  }
134
188
  };
135
- export const inspectorCleanupError = (primaryFailure, cleanupFailure, hasPrimaryFailure) => {
189
+ export const inspectorCleanupError = (primaryFailure, cleanupFailure, hasPrimaryFailure, partialObservation) => {
136
190
  const cause = hasPrimaryFailure
137
191
  ? new AggregateError([primaryFailure, cleanupFailure], "Inspector observation and cleanup both failed")
138
192
  : cleanupFailure;
139
- return new BrowserObservationError("observe_javascript_runtime", "cleanup_failed", { cause });
193
+ const cleanupReason = cleanupFailure instanceof Error
194
+ ? cleanupFailure.message
195
+ : String(cleanupFailure);
196
+ return new BrowserObservationError("observe_javascript_runtime", "cleanup_failed", {
197
+ cause,
198
+ cleanup: {
199
+ reason: cleanupReason,
200
+ resources: ["browser_transport"],
201
+ },
202
+ ...(partialObservation === undefined ? {} : { partialObservation }),
203
+ });
140
204
  };
141
205
  const projectTarget = (target) => ({
142
206
  target_id: target.id,
@@ -177,7 +241,7 @@ const emptyCaptureState = () => ({
177
241
  truncated: false,
178
242
  truncationReasons: new Set(),
179
243
  });
180
- const ingestEvent = (event, input, state) => {
244
+ const ingestEvent = (event, state) => {
181
245
  if (event.method !== "Debugger.scriptParsed" &&
182
246
  event.method !== "Debugger.scriptFailedToParse" &&
183
247
  event.method !== "Runtime.executionContextCreated" &&
@@ -186,7 +250,7 @@ const ingestEvent = (event, input, state) => {
186
250
  return;
187
251
  state.eventsObserved += 1;
188
252
  if (event.method === "Debugger.scriptParsed") {
189
- ingestScript(event, input, state);
253
+ ingestScript(event, state);
190
254
  return;
191
255
  }
192
256
  if (event.method === "Debugger.scriptFailedToParse") {
@@ -194,30 +258,31 @@ const ingestEvent = (event, input, state) => {
194
258
  retainEvent(state, 0);
195
259
  return;
196
260
  }
197
- ingestContext(event, input, state);
261
+ ingestContext(event, state);
198
262
  };
199
- const ingestScript = (event, input, state) => {
263
+ const ingestScript = (event, state) => {
200
264
  state.scriptsObserved += 1;
201
265
  const value = recordValue(event.params);
202
266
  const rawUrl = cdpStringValue(value?.url);
203
- if (rawUrl === undefined || rawUrl === "") {
267
+ if (rawUrl === undefined) {
204
268
  state.invalidScripts += 1;
205
269
  retainEvent(state, 0);
206
270
  return;
207
271
  }
272
+ const metadata = scriptMetadataValues(value);
208
273
  const draft = {
209
274
  rawUrl,
210
275
  executionContextKey: contextKey(value?.executionContextId),
211
- cdpHash: cdpStringValue(value?.hash) ?? null,
212
- length: nonnegativeInteger(value?.length),
213
- isModule: value?.isModule === true,
276
+ cdpHash: metadata.hash,
277
+ length: metadata.length,
278
+ isModule: metadata.isModule,
214
279
  };
215
280
  const bytes = retainedMetadataBytes(draft);
216
281
  if (!retainEvent(state, bytes))
217
282
  return;
218
283
  state.scripts.push(draft);
219
284
  };
220
- const ingestContext = (event, input, state) => {
285
+ const ingestContext = (event, state) => {
221
286
  if (event.method === "Runtime.executionContextsCleared") {
222
287
  let byteDelta = 0;
223
288
  for (const context of state.contexts.values()) {
@@ -243,17 +308,18 @@ const ingestContext = (event, input, state) => {
243
308
  retainEvent(state, 0);
244
309
  return;
245
310
  }
246
- const origin = event.method === "Runtime.executionContextCreated"
247
- ? (cdpStringValue(runtimeContext?.origin) ?? null)
248
- : null;
311
+ const previous = state.contexts.get(key);
312
+ const created = event.method === "Runtime.executionContextCreated";
249
313
  const draft = {
250
314
  contextKey: key,
251
- state: event.method === "Runtime.executionContextCreated"
252
- ? "created"
253
- : "destroyed",
254
- origin: origin === "" ? null : origin,
315
+ state: created ? "created" : "destroyed",
316
+ name: created
317
+ ? (cdpStringValue(runtimeContext?.name) ?? null)
318
+ : (previous?.name ?? null),
319
+ origin: created
320
+ ? (cdpStringValue(runtimeContext?.origin) ?? null)
321
+ : (previous?.origin ?? null),
255
322
  };
256
- const previous = state.contexts.get(key);
257
323
  const bytes = retainedMetadataBytes(draft) -
258
324
  (previous === undefined ? 0 : retainedMetadataBytes(previous));
259
325
  if (!retainEvent(state, bytes))
@@ -294,14 +360,10 @@ const waitForCapture = async (connection, observationMs, signal) => {
294
360
  const retainedMetadataBytes = (value) => {
295
361
  const strings = "rawUrl" in value
296
362
  ? [value.rawUrl, value.rawUrl, value.executionContextKey, value.cdpHash]
297
- : [value.contextKey, value.origin];
363
+ : [value.contextKey, value.name, value.origin];
298
364
  return (RETAINED_OBJECT_OVERHEAD_BYTES +
299
365
  strings.reduce((total, text) => total + (text?.length ?? 0) * 2, 0));
300
366
  };
301
- const nonnegativeInteger = (value) => {
302
- const parsed = numberValue(value);
303
- return parsed === undefined ? 0 : Math.max(0, Math.trunc(parsed));
304
- };
305
367
  const contextKey = (value) => {
306
368
  const identifier = numberValue(value);
307
369
  return identifier !== undefined && Number.isSafeInteger(identifier)
@@ -10,6 +10,7 @@ import { ProviderProcessSupervisor, spawnOwnedProviderProcess, } from "../../pro
10
10
  import { checkRecoveryDeadline, inventoryRecoveryFiles, fingerprintRecoveryFile, recoveryFailureMessage, } from "./RecoveryFiles.js";
11
11
  import { RECOVERY_LIMITS } from "./WakaruRelease.js";
12
12
  const OPERATION = "recover_javascript_sources";
13
+ const WAKARU_REQUIREMENT = "Provide an absolute REA_WAKARU_COMMAND pointing to Wakaru 1.13.0 on Linux x64; no tool is installed by REA";
13
14
  /** Resolve and fingerprint explicitly configured tools; acquire nothing at startup. */
14
15
  export const resolveWakaruCommand = async (environment) => {
15
16
  const configured = environment.REA_WAKARU_COMMAND;
@@ -17,7 +18,7 @@ export const resolveWakaruCommand = async (environment) => {
17
18
  process.arch !== "x64" ||
18
19
  configured === undefined ||
19
20
  !isAbsolute(configured))
20
- throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, "Provide an absolute REA_WAKARU_COMMAND pointing to Wakaru 1.13.0 on Linux x64; no tool is installed by REA");
21
+ throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, WAKARU_REQUIREMENT, { userMessage: WAKARU_REQUIREMENT });
21
22
  try {
22
23
  const command = await realpath(configured);
23
24
  await access(command, constants.R_OK | constants.X_OK);
@@ -29,7 +30,11 @@ export const resolveWakaruCommand = async (environment) => {
29
30
  return { command, limiter, ...fingerprint };
30
31
  }
31
32
  catch (cause) {
32
- throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, `Configured Wakaru or util-linux prlimit is unavailable: ${recoveryFailureMessage(cause)}`, { cause });
33
+ const reason = `Configured Wakaru or util-linux prlimit is unavailable: ${recoveryFailureMessage(cause)}`;
34
+ throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, reason, {
35
+ cause,
36
+ userMessage: reason,
37
+ });
33
38
  }
34
39
  };
35
40
  /** Run one bounded command and verify cleanup before consuming its output. */
@@ -30,8 +30,11 @@ const executeWakaruRecovery = async (context) => {
30
30
  arguments: ["--version"],
31
31
  });
32
32
  if (version.exit_code !== 0 ||
33
- version.stdout.trim() !== `wakaru ${WAKARU_RELEASE.version}`)
34
- throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, `This adapter requires Wakaru ${WAKARU_RELEASE.version}; reported version: ${version.stdout.trim()}; exit: ${String(version.exit_code)}; stderr: ${version.stderr}`);
33
+ version.stdout.trim() !== `wakaru ${WAKARU_RELEASE.version}`) {
34
+ // The message names the mismatch; the reason also keeps the tool's stderr.
35
+ const mismatch = `This adapter requires Wakaru ${WAKARU_RELEASE.version}; reported version: ${version.stdout.trim()}; exit: ${String(version.exit_code)}`;
36
+ throw new AnalysisCapabilityUnavailableError("wakaru", OPERATION, `${mismatch}; stderr: ${version.stderr}`, { userMessage: `${mismatch}.` });
37
+ }
35
38
  const run = await runWakaruCommand({
36
39
  ...commandContext,
37
40
  staging,
@@ -1,22 +1,53 @@
1
+ import { AnalysisError } from "../domain/analysisErrorBase.js";
2
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
1
3
  import { MCP_SHUTDOWN_FAILED } from "./messages.js";
2
4
  export const createShutdown = (input) => {
3
- const { handle, session, unregisterReload, dependencies, serverLogger } = input;
4
- let shutdownPromise;
5
+ const { handle, session, dependencies, serverLogger } = input;
6
+ let shutdownAttempt;
7
+ const cleanupOwners = [
8
+ { close: () => handle.close(), closed: false },
9
+ ...(input.closeAndroid === undefined
10
+ ? []
11
+ : [{ close: input.closeAndroid, closed: false }]),
12
+ {
13
+ close: async () => {
14
+ const closed = await session.close({ retainProviderDocuments: true });
15
+ if (!closed.ok)
16
+ throw closed.error;
17
+ },
18
+ closed: false,
19
+ },
20
+ ];
21
+ let shutdownUnregistered = false;
5
22
  let unregisterShutdown = () => undefined;
6
23
  const shutdown = async () => {
7
- shutdownPromise ??= (async () => {
8
- unregisterReload();
9
- unregisterShutdown();
10
- const results = await Promise.allSettled([
11
- handle.close(),
12
- input.closeAndroid?.(),
13
- session.close({ retainProviderDocuments: true }),
14
- ]);
24
+ if (shutdownAttempt !== undefined)
25
+ return shutdownAttempt;
26
+ const pending = cleanupOwners.filter(({ closed }) => !closed);
27
+ const attempt = (async () => {
28
+ const results = await Promise.allSettled(pending.map(async (owner) => {
29
+ await owner.close();
30
+ owner.closed = true;
31
+ }));
32
+ const failures = [];
15
33
  for (const result of results)
16
34
  if (result.status === "rejected")
17
- throw result.reason;
35
+ failures.push(result.reason);
36
+ if (failures.length === 1)
37
+ throw failures[0];
38
+ if (failures.length > 1)
39
+ throw new AggregateError(failures, "Multiple MCP cleanup operations failed");
40
+ if (!shutdownUnregistered) {
41
+ unregisterShutdown();
42
+ shutdownUnregistered = true;
43
+ }
18
44
  })();
19
- return shutdownPromise;
45
+ shutdownAttempt = attempt;
46
+ void attempt.catch(() => {
47
+ if (shutdownAttempt === attempt)
48
+ shutdownAttempt = undefined;
49
+ });
50
+ return attempt;
20
51
  };
21
52
  const requestShutdown = () => {
22
53
  shutdown().catch((cause) => {
@@ -24,27 +55,48 @@ export const createShutdown = (input) => {
24
55
  dependencies.setExitCode(1);
25
56
  serverLogger.error(MCP_SHUTDOWN_FAILED);
26
57
  dependencies.writeStderr(`${MCP_SHUTDOWN_FAILED}\n`);
58
+ if (cause instanceof AnalysisError)
59
+ dependencies.writeStderr(`${projectAnalysisError(cause).message}\n`);
27
60
  });
28
61
  };
29
62
  unregisterShutdown = dependencies.registerShutdown(requestShutdown);
30
63
  return { shutdown, request: requestShutdown };
31
64
  };
32
- const describeShutdownFailure = (cause) => {
33
- if (cause instanceof Error) {
34
- const code = "code" in cause ? cause.code : undefined;
35
- return {
36
- name: cause.name,
37
- message: cause.message,
38
- ...(typeof code === "string" ||
39
- (typeof code === "number" && Number.isFinite(code))
40
- ? { code }
41
- : {}),
42
- };
65
+ const describeShutdownFailure = (cause) => describeShutdownFailureNode(cause, new WeakSet());
66
+ const describeShutdownFailureNode = (cause, active) => {
67
+ if (typeof cause === "object" && cause !== null) {
68
+ if (active.has(cause))
69
+ return { type: "cyclic_error" };
70
+ active.add(cause);
71
+ }
72
+ try {
73
+ if (cause instanceof AnalysisError)
74
+ return { analysis_error: projectAnalysisError(cause) };
75
+ if (cause instanceof Error) {
76
+ const code = "code" in cause ? cause.code : undefined;
77
+ return {
78
+ name: cause.name,
79
+ message: cause.message,
80
+ ...(typeof code === "string" ||
81
+ (typeof code === "number" && Number.isFinite(code))
82
+ ? { code }
83
+ : {}),
84
+ ...(cause instanceof AggregateError
85
+ ? {
86
+ errors: cause.errors.map((error) => describeShutdownFailureNode(error, active)),
87
+ }
88
+ : {}),
89
+ };
90
+ }
91
+ if (cause === null ||
92
+ typeof cause === "string" ||
93
+ typeof cause === "boolean" ||
94
+ (typeof cause === "number" && Number.isFinite(cause)))
95
+ return { type: cause === null ? "null" : typeof cause, value: cause };
96
+ return { type: typeof cause };
97
+ }
98
+ finally {
99
+ if (typeof cause === "object" && cause !== null)
100
+ active.delete(cause);
43
101
  }
44
- if (cause === null ||
45
- typeof cause === "string" ||
46
- typeof cause === "boolean" ||
47
- (typeof cause === "number" && Number.isFinite(cause)))
48
- return { type: cause === null ? "null" : typeof cause, value: cause };
49
- return { type: typeof cause };
50
102
  };
@@ -7,8 +7,15 @@ export const openInitialTarget = async (session, config, serverLogger, writeStde
7
7
  });
8
8
  if (opened.ok)
9
9
  return { ok: true };
10
- await session.close();
11
- serverLogger.error({ errorTag: opened.error._tag }, "Initial target failed to open");
10
+ const closed = await session.close();
11
+ serverLogger.error({
12
+ error: projectAnalysisError(opened.error),
13
+ ...(closed.ok
14
+ ? {}
15
+ : { cleanup_error: projectAnalysisError(closed.error) }),
16
+ }, "Initial target failed to open");
12
17
  writeStderr(`${projectAnalysisError(opened.error).message}\n`);
18
+ if (!closed.ok)
19
+ writeStderr(`${projectAnalysisError(closed.error).message}\n`);
13
20
  return { ok: false, exitCode: 1 };
14
21
  };
@@ -1,5 +1,6 @@
1
1
  import { createAndroidAnalysisProvider } from "../composition/android.js";
2
2
  import { createServer } from "../server/createServer.js";
3
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
3
4
  import { MCP_CONNECTION_LOST, MCP_CONNECTION_START_FAILED, } from "./messages.js";
4
5
  export const startMcpTransport = async (dependencies, session, serverContext) => {
5
6
  const { serverLogger } = serverContext;
@@ -26,10 +27,12 @@ export const startMcpTransport = async (dependencies, session, serverContext) =>
26
27
  try {
27
28
  handle = dependencies.serve(() => {
28
29
  // The SDK can discard a discovery probe and construct a replacement server.
29
- const android = createAndroidAnalysisProvider(dependencies.env);
30
+ const android = createAndroidAnalysisProvider(serverContext.environment);
30
31
  androidProviders.push(android);
31
- return (dependencies.createServer ?? createServer)(session, session, {
32
+ return (dependencies.createServer ?? createServer)({ kind: "session", session }, {
32
33
  logger: serverContext.logger,
34
+ environment: serverContext.environment,
35
+ delivery: serverContext.delivery,
33
36
  ...optionalProviders,
34
37
  androidAnalysis: android,
35
38
  });
@@ -41,11 +44,28 @@ export const startMcpTransport = async (dependencies, session, serverContext) =>
41
44
  });
42
45
  }
43
46
  catch (cause) {
44
- await Promise.allSettled([session.close(), closeAndroid()]);
47
+ const [binaryCleanup, androidCleanup] = await Promise.allSettled([
48
+ session.close(),
49
+ closeAndroid(),
50
+ ]);
45
51
  serverLogger.error({
46
52
  error: cause instanceof Error ? cause.message : String(cause),
47
53
  }, MCP_CONNECTION_START_FAILED);
48
54
  dependencies.writeStderr(`${MCP_CONNECTION_START_FAILED}\n`);
55
+ if (binaryCleanup.status === "fulfilled" && !binaryCleanup.value.ok) {
56
+ const cleanupError = projectAnalysisError(binaryCleanup.value.error);
57
+ serverLogger.error({ cleanup_error: cleanupError }, "Binary provider cleanup failed after MCP startup");
58
+ dependencies.writeStderr(`${cleanupError.message}\n`);
59
+ }
60
+ for (const cleanup of [binaryCleanup, androidCleanup]) {
61
+ if (cleanup.status === "rejected") {
62
+ const reason = cleanup.reason instanceof Error
63
+ ? cleanup.reason.message
64
+ : String(cleanup.reason);
65
+ serverLogger.error({ cleanup_error: reason }, "Provider cleanup rejected after MCP startup");
66
+ dependencies.writeStderr(`Provider cleanup failed: ${reason}\n`);
67
+ }
68
+ }
49
69
  return { ok: false };
50
70
  }
51
71
  return { ok: true, handle, closeAndroid };