rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,8 +1,8 @@
1
1
  import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
2
2
  import { err, ok } from "../../domain/result.js";
3
3
  import { closeAnalysisClient } from "./AnalysisClientCleanup.js";
4
- /** Synthetic compatibility identity for a deterministic provider set. */
5
- export const compositeProviderIdentity = (identities) => ({
4
+ /** Synthetic identity for a deterministic provider set. */
5
+ const compositeProviderIdentity = (identities) => ({
6
6
  id: `composite:${identities
7
7
  .map(({ id }) => id)
8
8
  .sort()
@@ -16,15 +16,10 @@ export class CompositeProvider {
16
16
  #identity;
17
17
  #capabilities;
18
18
  #providerByOperation;
19
- #profileProvider;
20
19
  constructor(providers) {
21
20
  this.providers = providers;
22
21
  if (providers.length === 0)
23
22
  throw new RangeError("CompositeProvider requires at least one provider");
24
- const profileProviders = providers.filter(({ resolveAnalysisProfile }) => resolveAnalysisProfile !== undefined);
25
- if (profileProviders.length > 1)
26
- throw new TypeError("CompositeProvider supports at most one target-bound analysis profile");
27
- this.#profileProvider = profileProviders[0];
28
23
  this.#identity = Object.freeze(compositeProviderIdentity(providers.map((provider) => provider.identity())));
29
24
  const routes = new Map();
30
25
  const capabilities = [];
@@ -46,12 +41,6 @@ export class CompositeProvider {
46
41
  capabilities() {
47
42
  return this.#capabilities;
48
43
  }
49
- resolveAnalysisProfile(target, options) {
50
- const resolve = this.#profileProvider?.resolveAnalysisProfile;
51
- return resolve === undefined
52
- ? Promise.resolve(ok({ profile: null, compatibility: {} }))
53
- : resolve.call(this.#profileProvider, target, options);
54
- }
55
44
  createClient(target, profile, context) {
56
45
  const clients = new Map();
57
46
  const clientFor = (provider) => {
@@ -62,7 +51,7 @@ export class CompositeProvider {
62
51
  clients.set(provider, created);
63
52
  return created;
64
53
  };
65
- const closeWithOutcome = async (options) => {
54
+ const close = async (options) => {
66
55
  const outcomes = await Promise.all([...clients.entries()].map(([provider, client]) => closeAnalysisClient(client, provider.identity().id, options)));
67
56
  return outcomes.find((outcome) => !outcome.ok) ?? ok(null);
68
57
  };
@@ -88,10 +77,20 @@ export class CompositeProvider {
88
77
  requestActivitySnapshots: () => [...clients.values()]
89
78
  .flatMap((client) => client.requestActivitySnapshots?.() ?? [])
90
79
  .sort((left, right) => left.provider.id.localeCompare(right.provider.id)),
91
- closeWithOutcome,
92
- close: async () => {
93
- await closeWithOutcome();
80
+ operationHealthSnapshot: () => {
81
+ for (const client of clients.values()) {
82
+ const snapshot = client.operationHealthSnapshot?.();
83
+ if (snapshot !== undefined && snapshot.state !== "idle")
84
+ return snapshot;
85
+ }
86
+ for (const client of clients.values()) {
87
+ const snapshot = client.operationHealthSnapshot?.();
88
+ if (snapshot !== undefined)
89
+ return snapshot;
90
+ }
91
+ return undefined;
94
92
  },
93
+ close,
95
94
  };
96
95
  }
97
96
  }
@@ -1,7 +1,7 @@
1
1
  import { AnalysisCancelledError } from "../../domain/analysisErrorCore.js";
2
2
  import { AnalysisError } from "../../domain/analysisErrorBase.js";
3
3
  import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
4
- import { err } from "../../domain/result.js";
4
+ import { err, ok } from "../../domain/result.js";
5
5
  import { ABORTED, waitForAbortable } from "./AbortablePromise.js";
6
6
  const isAborted = (signal) => signal?.aborted === true;
7
7
  /**
@@ -74,13 +74,16 @@ class LazyAnalysisClient {
74
74
  requestActivitySnapshots() {
75
75
  return this.#client?.requestActivitySnapshots?.() ?? [];
76
76
  }
77
- async close() {
77
+ operationHealthSnapshot() {
78
+ return this.#client?.operationHealthSnapshot?.();
79
+ }
80
+ close = async (options) => {
78
81
  this.#closed = true;
79
82
  if (this.#loading === undefined)
80
- return;
83
+ return ok(null);
81
84
  const client = await this.#loading;
82
- await client.close();
83
- }
85
+ return client.close(options);
86
+ };
84
87
  async #load(operation) {
85
88
  if (this.#closed)
86
89
  throw new ProviderAdapterError(this.#providerId, operation, {
@@ -1,40 +1,18 @@
1
- import { analysisProfileSchema, } from "../../domain/analysisProfile.js";
2
- import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, } from "../../domain/analysisErrorCore.js";
3
- import { ProviderAdapterError } from "../../domain/providerAdapterError.js";
1
+ import { AnalysisCapabilityUnavailableError } from "../../domain/analysisErrorCore.js";
4
2
  import { ProviderSelectionError } from "../../domain/providerSelectionError.js";
5
3
  import {} from "../../domain/analysisErrorBase.js";
6
- import { jsonObjectSchema } from "../../domain/jsonValue.js";
7
4
  import { err, ok } from "../../domain/result.js";
8
5
  import { AnalysisProviderRegistry, } from "./AnalysisProviderRegistry.js";
9
- import { ABORTED, waitForAbortable } from "./AbortablePromise.js";
10
- import { CompositeProvider, compositeProviderIdentity, } from "./CompositeProvider.js";
11
- /** Resolve either the compatibility single-provider seam or a selectable set. */
6
+ import { CompositeProvider } from "./CompositeProvider.js";
7
+ /** Resolve one registry-selected deep provider and disjoint auxiliary families. */
12
8
  export class SessionProviderRouter {
13
- runtime;
14
- constructor(runtime) {
15
- this.runtime = runtime;
16
- }
17
- /** Create routing for an embedding backed by one fixed provider or factory. */
18
- static single(provider, options = {}) {
19
- const identity = typeof provider === "function"
20
- ? { id: "unidentified", name: "Unidentified provider", version: null }
21
- : provider.identity();
22
- const capabilities = typeof provider === "function"
23
- ? undefined
24
- : capabilityMap(provider.capabilities());
25
- const resolveProfile = options.resolveAnalysisProfile ??
26
- (typeof provider === "function" ||
27
- provider.resolveAnalysisProfile === undefined
28
- ? () => Promise.resolve(ok({ profile: null, compatibility: {} }))
29
- : (target, resolutionOptions) => provider.resolveAnalysisProfile?.(target, resolutionOptions) ??
30
- Promise.resolve(ok({ profile: null, compatibility: {} })));
31
- return new SessionProviderRouter({
32
- kind: "single",
33
- provider,
34
- identity,
35
- capabilities,
36
- resolveProfile,
37
- });
9
+ registry;
10
+ auxiliaryProviders;
11
+ route;
12
+ constructor(registry, auxiliaryProviders, route) {
13
+ this.registry = registry;
14
+ this.auxiliaryProviders = auxiliaryProviders;
15
+ this.route = route;
38
16
  }
39
17
  /** Create selection-aware routing while keeping auxiliary families disjoint. */
40
18
  static selectable(registry, auxiliaryProviders) {
@@ -48,99 +26,31 @@ export class SessionProviderRouter {
48
26
  if (auxiliaryOperations.has(operation))
49
27
  throw new TypeError(`Deep and auxiliary providers both declare operation ${operation}`);
50
28
  const initialRoute = selectableRoute(auxiliaryProviders, undefined);
51
- return new SessionProviderRouter({
52
- kind: "selectable",
53
- registry,
54
- auxiliaryProviders: [...auxiliaryProviders],
55
- identity: identities.length === 0
56
- ? emptyProviderIdentity()
57
- : compositeProviderIdentity(identities),
58
- initialRoute,
59
- });
60
- }
61
- /** Compatibility identity covering every configured provider. */
62
- configuredIdentity() {
63
- return structuredClone(this.runtime.identity);
64
- }
65
- /** Provider identities exposed through the flat 1.x compatibility field. */
66
- providerIdentities(route) {
67
- if (this.runtime.kind === "single") {
68
- if (route.capabilities === undefined)
69
- return [route.identity];
70
- return uniqueProviderIdentities([...route.capabilities.values()].map(({ provider }) => provider));
71
- }
72
- const selected = route.binding?.identity;
73
- return uniqueProviderIdentities([
74
- ...this.runtime.auxiliaryProviders.map((provider) => provider.identity()),
75
- ...this.runtime.registry
76
- .identities()
77
- .map((identity) => identity.id === selected?.id ? selected : identity),
78
- ]);
29
+ return new SessionProviderRouter(registry, [...auxiliaryProviders], initialRoute);
79
30
  }
80
31
  /** Target-free routes and discovery metadata. */
81
32
  initialRoute() {
82
- if (this.runtime.kind === "selectable")
83
- return this.runtime.initialRoute;
84
- const runtime = this.runtime;
85
- return {
86
- identity: structuredClone(runtime.identity),
87
- capabilities: runtime.capabilities,
88
- profile: null,
89
- compatibility: {},
90
- binding: null,
91
- selection: undefined,
92
- createClient: (target, context) => createSingleProviderClient(runtime, target, undefined, context),
93
- };
33
+ return this.route;
94
34
  }
95
35
  /** Resolve target routes before any provider client is created. */
96
36
  async resolve(target, providerId, signal) {
97
37
  const resolutionOptions = signal === undefined ? undefined : { signal };
98
- if (this.runtime.kind === "selectable") {
99
- const selected = await this.runtime.registry.select(target, providerId, resolutionOptions);
100
- return selected.ok
101
- ? ok(selectableRoute(this.runtime.auxiliaryProviders, selected.value))
102
- : selected;
103
- }
104
- const runtime = this.runtime;
105
- if (providerId !== undefined &&
106
- providerId !== "auto" &&
107
- providerId !== runtime.identity.id)
108
- return err(new ProviderSelectionError({
109
- reason: "unknown_provider",
110
- requestedProviderId: providerId,
111
- candidateIds: [runtime.identity.id],
112
- }));
113
- const resolved = await waitForAbortable(runtime.resolveProfile(target, resolutionOptions), signal);
114
- if (resolved === ABORTED)
115
- return err(new AnalysisCancelledError("open_binary"));
116
- if (!resolved.ok)
117
- return resolved;
118
- const normalized = normalizeProfileResolution(resolved.value, runtime.identity.id);
119
- if (!normalized.ok)
120
- return normalized;
121
- return ok({
122
- identity: structuredClone(runtime.identity),
123
- capabilities: runtime.capabilities,
124
- profile: normalized.value.profile,
125
- compatibility: normalized.value.compatibility,
126
- binding: null,
127
- selection: undefined,
128
- createClient: (openedTarget, context) => createSingleProviderClient(runtime, openedTarget, normalized.value.profile ?? undefined, context),
129
- });
38
+ const selected = await this.registry.select(target, providerId, resolutionOptions);
39
+ return selected.ok
40
+ ? ok(selectableRoute(this.auxiliaryProviders, selected.value))
41
+ : selected;
130
42
  }
131
43
  /** Candidate status authoritative for the active or target-free route. */
132
44
  candidateStatuses(route) {
133
- if (this.runtime.kind === "single")
134
- return [];
135
- return route.selection?.candidates ?? this.runtime.registry.candidates();
45
+ return route.selection?.candidates ?? this.registry.candidates();
136
46
  }
137
47
  /** Produce exact candidate rejections for an intentionally unbound route. */
138
48
  unboundOperationError(operation, route) {
139
- if (this.runtime.kind !== "selectable" ||
140
- route.binding !== null ||
141
- route.selection === undefined)
49
+ if (route.binding !== null ||
50
+ route.selection === undefined ||
51
+ !this.registry.declaredOperations().includes(operation))
142
52
  return undefined;
143
- return this.runtime.registry.unboundOperationError(operation, route.selection);
53
+ return this.registry.unboundOperationError(operation, route.selection);
144
54
  }
145
55
  }
146
56
  const selectableRoute = (auxiliaryProviders, selection) => {
@@ -149,23 +59,23 @@ const selectableRoute = (auxiliaryProviders, selection) => {
149
59
  ...auxiliaryProviders,
150
60
  ...(binding === null ? [] : [binding.provider]),
151
61
  ];
152
- const provider = providers.length === 0 ? undefined : new CompositeProvider(providers);
62
+ const provider = binding === null && providers.length === 1
63
+ ? providers[0]
64
+ : providers.length === 0
65
+ ? undefined
66
+ : new CompositeProvider(providers);
153
67
  const identity = provider?.identity() ?? emptyProviderIdentity();
154
68
  const capabilities = capabilityMap(provider?.capabilities() ?? []);
155
69
  return {
156
70
  identity,
157
71
  capabilities,
158
72
  profile: binding?.profile ?? null,
159
- compatibility: structuredClone(binding?.compatibility ?? {}),
160
73
  binding,
161
74
  selection,
162
75
  createClient: (target, context) => provider?.createClient(target, binding?.profile, context) ??
163
76
  emptyClient(identity),
164
77
  };
165
78
  };
166
- const createSingleProviderClient = (runtime, target, profile, context) => typeof runtime.provider === "function"
167
- ? runtime.provider(target, profile, context)
168
- : runtime.provider.createClient(target, profile, context);
169
79
  const emptyClient = (identity) => ({
170
80
  execute: (operation) => operation === "health"
171
81
  ? Promise.resolve(ok({
@@ -177,7 +87,7 @@ const emptyClient = (identity) => ({
177
87
  subject: null,
178
88
  }))
179
89
  : Promise.resolve(err(new AnalysisCapabilityUnavailableError(identity.id, operation, "operation is not declared by this provider set"))),
180
- close: () => Promise.resolve(),
90
+ close: () => Promise.resolve(ok(null)),
181
91
  });
182
92
  const emptyProviderIdentity = () => ({
183
93
  id: "composite:none",
@@ -185,9 +95,6 @@ const emptyProviderIdentity = () => ({
185
95
  version: null,
186
96
  });
187
97
  const capabilityMap = (capabilities) => new Map(capabilities.map((descriptor) => [descriptor.operation, descriptor]));
188
- const uniqueProviderIdentities = (identities) => [...new Map(identities.map((identity) => [identity.id, identity])).values()]
189
- .sort((left, right) => left.id.localeCompare(right.id))
190
- .map((identity) => structuredClone(identity));
191
98
  const assertDisjoint = (providers) => {
192
99
  const routes = new Set();
193
100
  for (const provider of providers)
@@ -206,18 +113,3 @@ const assertUniqueProviderIds = (identities) => {
206
113
  ids.add(identity.id);
207
114
  }
208
115
  };
209
- const normalizeProfileResolution = (resolution, providerId) => {
210
- try {
211
- return ok({
212
- profile: resolution.profile === null
213
- ? null
214
- : analysisProfileSchema.parse(resolution.profile),
215
- compatibility: jsonObjectSchema.parse(resolution.compatibility),
216
- });
217
- }
218
- catch (cause) {
219
- return err(new ProviderAdapterError(providerId, "resolve_analysis_profile", {
220
- cause,
221
- }));
222
- }
223
- };
@@ -2,7 +2,7 @@ import { isAbsolute } from "node:path";
2
2
  import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../../domain/analysisErrorCore.js";
3
3
  import { createEvidence } from "../../domain/evidence.js";
4
4
  import { inspectBinaryLayoutInputSchema, binaryLayoutSchema, } from "../../domain/native/binaryLayout.js";
5
- import { projectInputIssues } from "../../domain/inputIssueProjection.js";
5
+ import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
6
6
  import { err, ok } from "../../domain/result.js";
7
7
  const OPERATION = "inspect_binary_layout";
8
8
  /** Shared CLI/MCP validation and Evidence composition for offline layout inspection. */
@@ -17,7 +17,9 @@ export class BinaryLayoutService {
17
17
  return err(new AnalysisCancelledError(OPERATION));
18
18
  const input = inspectBinaryLayoutInputSchema.safeParse(rawInput);
19
19
  if (!input.success)
20
- return err(new AnalysisInputError(OPERATION, { cause: input.error }, projectInputIssues(input.error.issues, rawInput)));
20
+ return err(analysisInputErrorFromIssues(OPERATION, input.error.issues, rawInput, {
21
+ cause: input.error,
22
+ }));
21
23
  if (!isAbsolute(input.data.path))
22
24
  return err(new AnalysisInputError(OPERATION, undefined, [
23
25
  {
@@ -2,7 +2,7 @@ import { isAbsolute } from "node:path";
2
2
  import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../../domain/analysisErrorCore.js";
3
3
  import { createEvidence } from "../../domain/evidence.js";
4
4
  import { inspectRecordedCrashInputSchema, recordedCrashSchema, } from "../../domain/native/recordedCrash.js";
5
- import { projectInputIssues } from "../../domain/inputIssueProjection.js";
5
+ import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
6
6
  import { err, ok } from "../../domain/result.js";
7
7
  const OPERATION = "inspect_recorded_crash";
8
8
  /** Shared CLI/MCP validation and Evidence composition for recorded crash inspection. */
@@ -17,7 +17,9 @@ export class RecordedCrashService {
17
17
  return err(new AnalysisCancelledError(OPERATION));
18
18
  const input = inspectRecordedCrashInputSchema.safeParse(rawInput);
19
19
  if (!input.success)
20
- return err(new AnalysisInputError(OPERATION, { cause: input.error }, projectInputIssues(input.error.issues, rawInput)));
20
+ return err(analysisInputErrorFromIssues(OPERATION, input.error.issues, rawInput, {
21
+ cause: input.error,
22
+ }));
21
23
  if (!isAbsolute(input.data.path))
22
24
  return err(new AnalysisInputError(OPERATION, undefined, [
23
25
  {
@@ -3,7 +3,7 @@ import { z } from "zod";
3
3
  import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../../domain/analysisErrorCore.js";
4
4
  import { createEvidence } from "../../domain/evidence.js";
5
5
  import { inspectEvmInterfaceInputSchema, evmInterfaceSchema, } from "../../domain/evm/evmInterface.js";
6
- import { projectInputIssues } from "../../domain/inputIssueProjection.js";
6
+ import { analysisInputErrorFromIssues } from "../../domain/inputIssueProjection.js";
7
7
  import { err, ok } from "../../domain/result.js";
8
8
  const OPERATION = "inspect_evm_interface";
9
9
  const diagnosticsSchema = z.object({
@@ -21,7 +21,9 @@ export class EvmInterfaceService {
21
21
  return err(new AnalysisCancelledError(OPERATION));
22
22
  const input = inspectEvmInterfaceInputSchema.safeParse(rawInput);
23
23
  if (!input.success)
24
- return err(new AnalysisInputError(OPERATION, { cause: input.error }, projectInputIssues(input.error.issues, rawInput)));
24
+ return err(analysisInputErrorFromIssues(OPERATION, input.error.issues, rawInput, {
25
+ cause: input.error,
26
+ }));
25
27
  if (!isAbsolute(input.data.path))
26
28
  return err(new AnalysisInputError(OPERATION, undefined, [
27
29
  {
@@ -1,3 +1,6 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
1
4
  /** Standard executable names and locations used to discover Homebrew. */
2
5
  const HOMEBREW_COMMANDS = [
3
6
  "brew",
@@ -17,3 +20,48 @@ export const probeHomebrew = async (probe) => {
17
20
  }
18
21
  return undefined;
19
22
  };
23
+ const caskDirectoriesSchema = z
24
+ .object({ appdir: z.string().min(1).optional() })
25
+ .loose();
26
+ const caskConfigSchema = z
27
+ .object({
28
+ default: caskDirectoriesSchema.optional(),
29
+ env: caskDirectoriesSchema.optional(),
30
+ explicit: caskDirectoriesSchema.optional(),
31
+ })
32
+ .loose();
33
+ /**
34
+ * Read the application directory Homebrew recorded when it installed a cask,
35
+ * in Homebrew's precedence: explicit option, then environment, then default.
36
+ * Reading the Caskroom avoids `brew` cask commands, which refresh Homebrew's
37
+ * API and bootsnap caches.
38
+ */
39
+ export const installedCaskAppdir = async (caskroom, token, home) => {
40
+ let text;
41
+ try {
42
+ text = await readFile(join(caskroom, token, ".metadata", "config.json"), "utf8");
43
+ }
44
+ catch (cause) {
45
+ // An absent or unreadable receipt means the cask is not installed here.
46
+ void cause;
47
+ return undefined;
48
+ }
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse(text);
52
+ }
53
+ catch (cause) {
54
+ // A malformed receipt does not identify an application directory.
55
+ void cause;
56
+ return undefined;
57
+ }
58
+ const config = caskConfigSchema.safeParse(parsed);
59
+ if (!config.success)
60
+ return undefined;
61
+ const appdir = config.data.explicit?.appdir ??
62
+ config.data.env?.appdir ??
63
+ config.data.default?.appdir;
64
+ if (appdir === undefined)
65
+ return undefined;
66
+ return appdir.startsWith("~/") ? join(home, appdir.slice(2)) : appdir;
67
+ };
@@ -1,8 +1,8 @@
1
1
  import canonicalize from "canonicalize";
2
- import { createEvidenceBundle, parseEvidenceBundle, validateResidualUnknownAddition, } from "../../domain/evidenceBundle.js";
2
+ import { createEvidenceBundle, createImmutableEvidenceBundle, describeEvidenceBundleFailure, parseEvidenceBundle, validateResidualUnknownAddition, } from "../../domain/evidenceBundle.js";
3
3
  import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
4
4
  import { UnknownRegistryError } from "../../domain/unknownRegistryError.js";
5
- import { parseEvidence } from "../../domain/evidence.js";
5
+ import { immutableEvidence, parseEvidence, } from "../../domain/evidence.js";
6
6
  import { createResidualUnknown, updateResidualUnknown, } from "../../domain/residualUnknown.js";
7
7
  import { err, ok } from "../../domain/result.js";
8
8
  /** Session-owned set of immutable evidence records. */
@@ -14,7 +14,7 @@ export class EvidenceLedger {
14
14
  record(input) {
15
15
  let evidence;
16
16
  try {
17
- evidence = parseEvidence(input);
17
+ evidence = immutableEvidence(input);
18
18
  }
19
19
  catch (cause) {
20
20
  return err(new EvidenceIntegrityError("Evidence record validation failed", {
@@ -23,6 +23,11 @@ export class EvidenceLedger {
23
23
  }
24
24
  const existing = this.#records.get(evidence.evidence_id);
25
25
  if (existing !== undefined) {
26
+ // A borrowed record is already authenticated and deeply immutable. Its
27
+ // identity cannot change between reads, so comparing document-sized
28
+ // canonical strings again would add no integrity check.
29
+ if (existing === evidence)
30
+ return ok("duplicate");
26
31
  return recordsAgree(existing, evidence)
27
32
  ? ok("duplicate")
28
33
  : err(new EvidenceIntegrityError("Conflicting evidence record"));
@@ -39,6 +44,7 @@ export class EvidenceLedger {
39
44
  catch (cause) {
40
45
  return err(new EvidenceIntegrityError("Evidence bundle validation failed", {
41
46
  cause,
47
+ userMessage: describeEvidenceBundleFailure(input, cause),
42
48
  }));
43
49
  }
44
50
  // A record-only bundle cannot change the already-valid unknown graph. The
@@ -63,9 +69,9 @@ export class EvidenceLedger {
63
69
  additions.set(evidence.evidence_id, evidence);
64
70
  }
65
71
  for (const [id, evidence] of replacements)
66
- this.#records.set(id, evidence);
72
+ this.#records.set(id, immutableEvidence(evidence));
67
73
  for (const [id, evidence] of additions)
68
- this.#records.set(id, evidence);
74
+ this.#records.set(id, immutableEvidence(evidence));
69
75
  return ok({
70
76
  recordsAdded: additions.size,
71
77
  unknownsAdded: 0,
@@ -117,6 +123,10 @@ export class EvidenceLedger {
117
123
  export() {
118
124
  return structuredClone(createEvidenceBundle([...this.#records.values()], [...this.#unknownRevisions.values()]));
119
125
  }
126
+ /** Borrow a sealed canonical bundle for serialization without copying its records. */
127
+ forSerialization() {
128
+ return createImmutableEvidenceBundle([...this.#records.values()], [...this.#unknownRevisions.values()]);
129
+ }
120
130
  /** Check whether one immutable Evidence ID is present in this ledger. */
121
131
  has(evidenceId) {
122
132
  return this.#records.has(evidenceId);
@@ -126,6 +136,10 @@ export class EvidenceLedger {
126
136
  const evidence = this.#records.get(evidenceId);
127
137
  return evidence === undefined ? undefined : structuredClone(evidence);
128
138
  }
139
+ /** Borrow authenticated immutable Evidence for read-only analysis without a full clone. */
140
+ forAnalysis(evidenceId) {
141
+ return this.#records.get(evidenceId);
142
+ }
129
143
  /** Create one approved unknown and atomically append its mutation evidence. */
130
144
  recordUnknown(input, mutationEvidence) {
131
145
  let parsedMutation;
@@ -271,7 +285,7 @@ export class EvidenceLedger {
271
285
  return err(new UnknownRegistryError("integrity", { cause }));
272
286
  }
273
287
  for (const [id, evidence] of additions)
274
- this.#records.set(id, evidence);
288
+ this.#records.set(id, immutableEvidence(evidence));
275
289
  if (unknown !== undefined && unknownKey !== undefined) {
276
290
  this.#unknownRevisions.set(unknownKey, unknown);
277
291
  this.#unknownHeads.set(unknown.unknown_id, unknown);
@@ -290,7 +304,7 @@ export class EvidenceLedger {
290
304
  #commit(records, unknowns) {
291
305
  this.#records.clear();
292
306
  for (const [id, evidence] of records)
293
- this.#records.set(id, evidence);
307
+ this.#records.set(id, immutableEvidence(evidence));
294
308
  this.#unknownRevisions.clear();
295
309
  this.#unknownHeads.clear();
296
310
  for (const [key, unknown] of unknowns) {
@@ -16,10 +16,18 @@ export class InvestigationRecords {
16
16
  evidenceById(evidenceId) {
17
17
  return this.#evidence.get(evidenceId);
18
18
  }
19
+ /** Borrow an immutable authenticated record for a read-only application workflow. */
20
+ evidenceForAnalysis(evidenceId) {
21
+ return this.#evidence.forAnalysis(evidenceId);
22
+ }
19
23
  /** Export a detached deterministic bundle of Evidence and Unknown revisions. */
20
24
  exportEvidenceBundle() {
21
25
  return this.#evidence.export();
22
26
  }
27
+ /** Borrow a sealed bundle snapshot for complete JSON serialization. */
28
+ evidenceBundleForSerialization() {
29
+ return this.#evidence.forSerialization();
30
+ }
23
31
  /** Atomically merge a bundle and report changes for the owner's post-commit observers. */
24
32
  mergeEvidenceBundle(bundle) {
25
33
  return this.#evidence.import(bundle);
@@ -1,7 +1,7 @@
1
1
  import { canonicalDigest } from "../../domain/comparisonSemantics.js";
2
2
  import { createEvidence } from "../../domain/evidence.js";
3
- import { jsonValueSchema } from "../../domain/jsonValue.js";
4
- /** Create Evidence without retaining arbitrary runtime argument values. */
3
+ import { jsonObjectSchema, jsonValueSchema } from "../../domain/jsonValue.js";
4
+ /** Commit the selected Electron experiment and its observed result. */
5
5
  export const createElectronActiveEvidence = (input, result, provider) => createEvidence(undefined, provider, {
6
6
  predicateType: "rea.electron-active-scenario",
7
7
  operation: "capture_electron_scenario",
@@ -20,14 +20,10 @@ export const createElectronActiveEvidence = (input, result, provider) => createE
20
20
  "Application host platform and architecture were not observed.",
21
21
  ],
22
22
  });
23
- const scenarioProjection = (input) => ({
24
- executable_path: input.executable_path,
25
- application_path: input.application_path,
26
- application_root: input.application_root,
27
- args: [...input.args],
28
- actions: input.actions.map(({ step_id, kind }) => ({ step_id, kind })),
29
- });
30
- const parameters = (input) => ({
31
- ...scenarioProjection(input),
32
- scenario_sha256: canonicalDigest(scenarioProjection(input), "Browser scenario"),
33
- });
23
+ const parameters = (input) => {
24
+ const scenario = jsonObjectSchema.parse(input);
25
+ return {
26
+ ...scenario,
27
+ scenario_sha256: canonicalDigest(scenario, "Electron scenario"),
28
+ };
29
+ };
@@ -0,0 +1,34 @@
1
+ import { setImmediate } from "node:timers/promises";
2
+ import { ArtifactReaderFailure } from "../../artifacts/ArtifactReader.js";
3
+ /** Reject cancelled application work before computing or publishing more results. */
4
+ export const assertJavaScriptAnalysisActive = (signal) => {
5
+ if (signal?.aborted === true)
6
+ throw new ArtifactReaderFailure("cancelled", "JavaScript application analysis cancelled");
7
+ };
8
+ /** Let request control messages run, then recheck the current analysis intent. */
9
+ export const checkpointJavaScriptAnalysis = async (signal) => {
10
+ assertJavaScriptAnalysisActive(signal);
11
+ await setImmediate();
12
+ assertJavaScriptAnalysisActive(signal);
13
+ };
14
+ /** Drive bounded owned-domain steps while permitting cancellation and control I/O. */
15
+ export const completeJavaScriptAnalysisSteps = async (steps, signal) => {
16
+ let deadline = performance.now() + 8;
17
+ try {
18
+ for (;;) {
19
+ assertJavaScriptAnalysisActive(signal);
20
+ const step = steps.next();
21
+ if (step.done) {
22
+ assertJavaScriptAnalysisActive(signal);
23
+ return step.value;
24
+ }
25
+ if (performance.now() >= deadline) {
26
+ await checkpointJavaScriptAnalysis(signal);
27
+ deadline = performance.now() + 8;
28
+ }
29
+ }
30
+ }
31
+ finally {
32
+ steps.return?.();
33
+ }
34
+ };