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
@@ -6,13 +6,14 @@ import { err, ok } from "../../domain/result.js";
6
6
  import { createEvidence } from "../../domain/evidence.js";
7
7
  import { OFFICIAL_TOOL_CONTRACTS } from "../../contracts/officialToolContracts.js";
8
8
  import { ENHANCED_TOOL_CONTRACTS } from "../../contracts/enhancedToolContracts.js";
9
+ import { writeAnalysisSnapshot } from "./AnalysisSnapshotFiles.js";
9
10
  import { SessionProviderRouter, } from "./SessionProviderRouter.js";
10
11
  import { InvestigationRecords } from "../investigation/InvestigationRecords.js";
11
12
  import { BinarySessionRecords } from "./BinarySessionRecords.js";
12
13
  import { binarySessionStatus } from "./BinarySessionStatus.js";
13
14
  import { resolveSessionOpen, resolveSessionTarget, validateResolvedSessionTarget, } from "./BinarySessionOpen.js";
14
15
  import { bindExecutionTarget, commitExecutionProfile, prepareSessionExecution, } from "./BinarySessionExecution.js";
15
- import { closeAnalysisClient } from "./AnalysisClientCleanup.js";
16
+ import { analysisErrorWithCleanupFailure, closeAnalysisClient, } from "./AnalysisClientCleanup.js";
16
17
  const OFFICIAL_OPERATIONS = new Set(OFFICIAL_TOOL_CONTRACTS.map(({ name }) => name));
17
18
  const ENHANCED_OPERATIONS = new Set(ENHANCED_TOOL_CONTRACTS.map(({ name }) => name));
18
19
  /**
@@ -24,8 +25,10 @@ const ENHANCED_OPERATIONS = new Set(ENHANCED_TOOL_CONTRACTS.map(({ name }) => na
24
25
  */
25
26
  export class BinarySession extends BinarySessionRecords {
26
27
  #active;
28
+ #pendingCleanup;
27
29
  #transition = Promise.resolve();
28
- #calls = new Set();
30
+ #transitionGeneration = 0;
31
+ #calls = new Map();
29
32
  #providerRouter;
30
33
  #runtimeUnavailability = new Map();
31
34
  #availabilityListeners = new Set();
@@ -36,14 +39,14 @@ export class BinarySession extends BinarySessionRecords {
36
39
  /** Identify the provider producing evidence for this session. */
37
40
  providerIdentity(operation) {
38
41
  const route = this.#currentRoute();
39
- let selected = route.identity;
42
+ let selected = route.binding?.identity ?? route.identity;
40
43
  if (operation !== undefined) {
41
- const exact = route.capabilities?.get(operation)?.provider;
44
+ const exact = route.capabilities.get(operation)?.provider;
42
45
  if (exact !== undefined)
43
46
  selected = exact;
44
47
  else if (ENHANCED_OPERATIONS.has(operation)) {
45
48
  const providers = new Map();
46
- for (const descriptor of route.capabilities?.values() ?? [])
49
+ for (const descriptor of route.capabilities.values())
47
50
  if (descriptor.available &&
48
51
  OFFICIAL_OPERATIONS.has(descriptor.operation))
49
52
  providers.set(descriptor.provider.id, descriptor.provider);
@@ -79,10 +82,6 @@ export class BinarySession extends BinarySessionRecords {
79
82
  return undefined;
80
83
  return structuredClone(profile);
81
84
  }
82
- /** Return opaque adapter metadata retained for legacy open_binary output. */
83
- openCompatibility() {
84
- return structuredClone(this.#active?.compatibility ?? {});
85
- }
86
85
  /** Observe runtime provider-health changes that affect discovery metadata. */
87
86
  onAvailabilityChanged(listener) {
88
87
  this.#availabilityListeners.add(listener);
@@ -125,62 +124,66 @@ export class BinarySession extends BinarySessionRecords {
125
124
  })), options);
126
125
  }
127
126
  #open(resolve, options) {
128
- return this.#serialize(async () => {
127
+ return this.#serialize(async (admittedThrough) => {
129
128
  if (isAborted(options.signal))
130
129
  return err(new AnalysisCancelledError("open_binary"));
131
130
  const resolved = await resolve();
132
131
  if (!resolved.ok)
133
132
  return resolved;
134
133
  const { target, route, sameTarget } = resolved.value;
135
- const { profile, compatibility } = route;
134
+ const { profile } = route;
136
135
  if (isAborted(options.signal))
137
136
  return err(new AnalysisCancelledError("open_binary"));
138
137
  const activeProfile = this.#active?.profile;
139
138
  const sameProfile = activeProfile === null || activeProfile === undefined
140
139
  ? profile === null
141
140
  : profile !== null && analysisProfilesEqual(activeProfile, profile);
141
+ await this.#drainCalls(admittedThrough);
142
+ if (isAborted(options.signal))
143
+ return err(new AnalysisCancelledError("open_binary"));
144
+ const pendingClosed = await this.#retryPendingCleanup();
145
+ if (!pendingClosed.ok)
146
+ return pendingClosed;
147
+ if (isAborted(options.signal))
148
+ return err(new AnalysisCancelledError("open_binary"));
142
149
  if (sameTarget && sameProfile) {
143
150
  if (options.snapshot !== undefined) {
144
151
  const imported = this.importAnalysisSnapshot(options.snapshot);
145
152
  if (!imported.ok)
146
153
  return imported;
147
154
  }
148
- this.resetSnapshotInvalidation();
149
155
  return ok(target);
150
156
  }
151
- await this.#drainCalls();
152
157
  const previous = this.#active;
153
158
  this.#active = undefined;
154
159
  if (previous !== undefined) {
155
- const closed = await closeAnalysisClient(previous.client, previous.route.identity.id);
160
+ const closed = await this.#retireClient(previous.client, previous.route.identity.id);
156
161
  if (!closed.ok) {
157
162
  this.clearSessionRecords();
158
163
  this.#clearRuntimeAvailability();
159
164
  return closed;
160
165
  }
161
166
  }
167
+ if (isAborted(options.signal))
168
+ return err(await this.#restoreAfterFailedOpen(previous, new AnalysisCancelledError("open_binary")));
162
169
  const runId = randomUUID();
163
170
  const client = route.createClient(target, { runId });
164
171
  const started = await client.execute("health", {}, options);
165
172
  if (!started.ok) {
166
- await client.close();
167
- await this.#restore(previous);
168
- return started;
173
+ return err(await this.#failedOpen(client, route.identity.id, previous, started.error));
169
174
  }
170
175
  if (isAborted(options.signal)) {
171
- await client.close();
172
- await this.#restore(previous);
173
- return err(new AnalysisCancelledError("open_binary"));
176
+ return err(await this.#failedOpen(client, route.identity.id, previous, new AnalysisCancelledError("open_binary")));
174
177
  }
175
178
  this.#active = {
176
179
  target,
177
180
  client,
178
181
  profile,
179
- compatibility: structuredClone(compatibility),
180
182
  route,
181
183
  runId,
182
184
  };
183
185
  this.#clearRuntimeAvailability();
186
+ this.resetSnapshotInvalidation();
184
187
  if (options.snapshot === undefined) {
185
188
  if (profile === null)
186
189
  this.clearSnapshot();
@@ -191,36 +194,93 @@ export class BinarySession extends BinarySessionRecords {
191
194
  const imported = this.importAnalysisSnapshot(options.snapshot);
192
195
  if (!imported.ok) {
193
196
  this.#active = undefined;
194
- await client.close();
195
- await this.#restore(previous);
196
- return imported;
197
+ return err(await this.#failedOpen(client, route.identity.id, previous, imported.error));
197
198
  }
198
199
  }
199
- this.resetSnapshotInvalidation();
200
200
  return ok(target);
201
201
  });
202
202
  }
203
203
  /** Close the active target, if any. */
204
204
  close(options = {}) {
205
- return this.#serialize(async () => {
206
- const previous = this.#active;
207
- this.#active = undefined;
208
- await this.#drainCalls();
209
- const closed = previous === undefined
210
- ? ok(null)
211
- : await closeAnalysisClient(previous.client, previous.route.identity.id, {
212
- ...(options.progress === undefined
213
- ? {}
214
- : { progress: options.progress }),
215
- ...(options.retainProviderDocuments === true
216
- ? { retainDocument: true }
217
- : {}),
218
- });
219
- this.clearSessionRecords();
220
- this.#clearRuntimeAvailability();
221
- return closed;
205
+ return this.#serialize(async (admittedThrough) => {
206
+ await this.#drainCalls(admittedThrough);
207
+ return this.#closeActive(options);
222
208
  });
223
209
  }
210
+ /** Drain earlier requests, save an immutable snapshot, and close under one lifecycle lock. */
211
+ closeWithSnapshot(path, overwrite, options = {}) {
212
+ return this.#serialize(async (admittedThrough) => {
213
+ await this.#drainCalls(admittedThrough);
214
+ const snapshot = this.exportAnalysisSnapshot();
215
+ if (!snapshot.ok)
216
+ return snapshot;
217
+ const written = await writeAnalysisSnapshot(snapshot.value, path, overwrite);
218
+ if (!written.ok)
219
+ return written;
220
+ const closed = await this.#closeActive(options);
221
+ return closed.ok
222
+ ? ok({
223
+ ...written.value,
224
+ primitive_entries: snapshot.value.entries.length,
225
+ workflow_entries: snapshot.value.workflow_entries.length,
226
+ evidence_records: snapshot.value.evidence_bundle.records.length,
227
+ })
228
+ : closed;
229
+ });
230
+ }
231
+ async #closeActive(options) {
232
+ const previous = this.#active;
233
+ this.#active = undefined;
234
+ const closed = previous === undefined
235
+ ? await this.#retryPendingCleanup(options.progress, options.retainProviderDocuments)
236
+ : await this.#retireClient(previous.client, previous.route.identity.id, {
237
+ ...(options.progress === undefined
238
+ ? {}
239
+ : { progress: options.progress }),
240
+ ...(options.retainProviderDocuments === true
241
+ ? { retainDocument: true }
242
+ : {}),
243
+ });
244
+ this.clearSessionRecords();
245
+ this.#clearRuntimeAvailability();
246
+ return closed;
247
+ }
248
+ async #retireClient(client, providerId, options = {}) {
249
+ this.#pendingCleanup = {
250
+ client,
251
+ providerId,
252
+ retainDocument: options.retainDocument === true,
253
+ };
254
+ return this.#retryPendingCleanup(options.progress);
255
+ }
256
+ async #retryPendingCleanup(progress, retainDocument) {
257
+ let pending = this.#pendingCleanup;
258
+ if (pending === undefined)
259
+ return ok(null);
260
+ if (retainDocument !== undefined) {
261
+ pending = { ...pending, retainDocument };
262
+ this.#pendingCleanup = pending;
263
+ }
264
+ const closed = await closeAnalysisClient(pending.client, pending.providerId, {
265
+ ...(progress === undefined ? {} : { progress }),
266
+ ...(pending.retainDocument ? { retainDocument: true } : {}),
267
+ });
268
+ if (closed.ok)
269
+ this.#pendingCleanup = undefined;
270
+ return closed;
271
+ }
272
+ async #failedOpen(client, providerId, previous, primary) {
273
+ const closed = await this.#retireClient(client, providerId);
274
+ if (!closed.ok)
275
+ return analysisErrorWithCleanupFailure(primary, closed.error, "open_binary");
276
+ return this.#restoreAfterFailedOpen(previous, primary);
277
+ }
278
+ async #restoreAfterFailedOpen(previous, primary) {
279
+ const restored = await this.#restore(previous);
280
+ return restored.ok
281
+ ? primary
282
+ : analysisErrorWithCleanupFailure(primary, restored.error, "open_binary");
283
+ }
224
284
  /** Describe the active binary session. */
225
285
  status() {
226
286
  return binarySessionStatus({
@@ -231,6 +291,7 @@ export class BinarySession extends BinarySessionRecords {
231
291
  runId: this.#active?.runId,
232
292
  runtimeLineageSnapshots: this.#active?.client.runtimeLineageSnapshots?.() ?? [],
233
293
  requestActivitySnapshots: this.#active?.client.requestActivitySnapshots?.() ?? [],
294
+ providerOperationHealth: this.#active?.client.operationHealthSnapshot?.() ?? null,
234
295
  });
235
296
  }
236
297
  /** Return the immutable artifact identity captured before its provider started. */
@@ -247,8 +308,14 @@ export class BinarySession extends BinarySessionRecords {
247
308
  * Calls may overlap, but a pending target transition prevents new calls from
248
309
  * entering until the transition has settled.
249
310
  */
250
- async execute(name, arguments_, options) {
251
- const transitioned = await this.#waitForTransition(name, options?.signal);
311
+ execute(name, arguments_, options) {
312
+ const generation = this.#transitionGeneration;
313
+ const call = this.#execute(name, arguments_, options, this.#transition);
314
+ this.#calls.set(call, generation);
315
+ return call.finally(() => this.#calls.delete(call));
316
+ }
317
+ async #execute(name, arguments_, options, transition) {
318
+ const transitioned = await this.#waitForTransition(name, options?.signal, transition);
252
319
  if (!transitioned.ok)
253
320
  return transitioned;
254
321
  const prepared = prepareSessionExecution({
@@ -269,46 +336,40 @@ export class BinarySession extends BinarySessionRecords {
269
336
  if (cached !== undefined)
270
337
  return ok(cached);
271
338
  const call = active.client.execute(name, arguments_, options);
272
- this.#calls.add(call);
273
- try {
274
- const result = await call;
275
- const profiled = bindExecutionTarget(commitExecutionProfile(name, result, profile), name, active.target);
276
- this.#observeRuntimeAvailability(name, profiled);
277
- if (profiled.ok &&
278
- cacheable &&
279
- profile !== undefined &&
280
- name !== "decode_interface_builder" &&
281
- name !== "inspect_asset_catalog" &&
282
- name !== "inspect_keyed_archive" &&
283
- name !== "trace_dylib_resolution") {
284
- const evidence = createEvidence(profiled.value.subject ?? active.target, profiled.value.provider, {
285
- operation: name,
286
- parameters: arguments_,
287
- result: profiled.value.result,
288
- analysisProfile: profile,
289
- rawResult: profiled.value.rawResult,
290
- limitations: profiled.value.limitations,
291
- locations: profiled.value.locations,
292
- });
293
- const recorded = this.recordEvidence(evidence);
294
- if (!recorded.ok)
295
- return recorded;
296
- this.recordSnapshot({
297
- target: active.target,
298
- profile,
299
- operation: name,
300
- parameters: arguments_,
301
- execution: profiled.value,
302
- });
303
- }
304
- else if (profiled.ok && capability?.effects.mutatesArtifact === true) {
305
- this.invalidateSnapshot();
306
- }
307
- return profiled;
339
+ const result = await call;
340
+ const profiled = bindExecutionTarget(commitExecutionProfile(name, result, profile), name, active.target);
341
+ this.#observeRuntimeAvailability(name, profiled);
342
+ if (profiled.ok &&
343
+ cacheable &&
344
+ profile !== undefined &&
345
+ name !== "decode_interface_builder" &&
346
+ name !== "inspect_asset_catalog" &&
347
+ name !== "inspect_keyed_archive" &&
348
+ name !== "trace_dylib_resolution") {
349
+ const evidence = createEvidence(profiled.value.subject ?? active.target, profiled.value.provider, {
350
+ operation: name,
351
+ parameters: arguments_,
352
+ result: profiled.value.result,
353
+ analysisProfile: profile,
354
+ rawResult: profiled.value.rawResult,
355
+ limitations: profiled.value.limitations,
356
+ locations: profiled.value.locations,
357
+ });
358
+ const recorded = this.recordEvidence(evidence);
359
+ if (!recorded.ok)
360
+ return recorded;
361
+ this.recordSnapshot({
362
+ target: active.target,
363
+ profile,
364
+ operation: name,
365
+ parameters: arguments_,
366
+ execution: profiled.value,
367
+ });
308
368
  }
309
- finally {
310
- this.#calls.delete(call);
369
+ else if (profiled.ok && capability.effects.mutatesArtifact) {
370
+ this.invalidateSnapshot();
311
371
  }
372
+ return profiled;
312
373
  }
313
374
  #observeRuntimeAvailability(operation, result) {
314
375
  if (result.ok) {
@@ -374,36 +435,43 @@ export class BinarySession extends BinarySessionRecords {
374
435
  return this.#active?.route ?? this.#providerRouter.initialRoute();
375
436
  }
376
437
  #serialize(operation) {
377
- const result = this.#transition.then(operation, operation);
438
+ // Later calls wait for this transition and must not be included in its drain.
439
+ const admittedThrough = this.#transitionGeneration++;
440
+ const result = this.#transition.then(() => operation(admittedThrough), () => operation(admittedThrough));
378
441
  this.#transition = result.then(() => undefined, () => undefined);
379
442
  return result;
380
443
  }
381
- async #drainCalls() {
382
- await Promise.allSettled(this.#calls);
444
+ async #drainCalls(admittedThrough) {
445
+ await Promise.allSettled([...this.#calls]
446
+ .filter(([, generation]) => generation <= admittedThrough)
447
+ .map(([call]) => call));
383
448
  }
384
449
  async #restore(previous) {
385
450
  if (previous === undefined)
386
- return;
451
+ return ok(null);
387
452
  const runId = randomUUID();
388
453
  const client = previous.route.createClient(previous.target, { runId });
389
454
  const started = await client.execute("health", {});
390
- if (started.ok)
455
+ if (started.ok) {
391
456
  this.#active = {
392
457
  target: previous.target,
393
458
  client,
394
459
  profile: previous.profile,
395
- compatibility: previous.compatibility,
396
460
  route: previous.route,
397
461
  runId,
398
462
  };
399
- else
400
- await client.close();
463
+ return ok(null);
464
+ }
465
+ const closed = await this.#retireClient(client, previous.route.identity.id);
466
+ return closed.ok
467
+ ? ok(null)
468
+ : err(analysisErrorWithCleanupFailure(started.error, closed.error, "open_binary"));
401
469
  }
402
- async #waitForTransition(operation, signal) {
470
+ async #waitForTransition(operation, signal, transition) {
403
471
  if (signal?.aborted === true)
404
472
  return err(new AnalysisCancelledError(operation));
405
473
  if (signal === undefined) {
406
- await this.#transition;
474
+ await transition;
407
475
  return ok(undefined);
408
476
  }
409
477
  return new Promise((resolve) => {
@@ -411,7 +479,7 @@ export class BinarySession extends BinarySessionRecords {
411
479
  resolve(err(new AnalysisCancelledError(operation)));
412
480
  };
413
481
  signal.addEventListener("abort", onAbort, { once: true });
414
- this.#transition.then(() => {
482
+ transition.then(() => {
415
483
  signal.removeEventListener("abort", onAbort);
416
484
  resolve(signal.aborted
417
485
  ? err(new AnalysisCancelledError(operation))
@@ -6,6 +6,4 @@ import { SessionProviderRouter } from "./SessionProviderRouter.js";
6
6
  * Compose one provider-neutral session from deep-provider selection and
7
7
  * disjoint auxiliary operation families.
8
8
  */
9
- export const composeBinarySession = (registry, auxiliaryProviders = []) => new BinarySession(registry instanceof SessionProviderRouter
10
- ? registry
11
- : SessionProviderRouter.selectable(registry, auxiliaryProviders), new InvestigationRecords());
9
+ export const composeBinarySession = (registry, auxiliaryProviders = []) => new BinarySession(SessionProviderRouter.selectable(registry, auxiliaryProviders), new InvestigationRecords());
@@ -9,17 +9,15 @@ export const prepareSessionExecution = (input) => {
9
9
  const { active, operation, parameters, unboundOperationError, lookupSnapshot, } = input;
10
10
  if (active === undefined)
11
11
  return err(new NoBinaryOpenError());
12
- const capability = active.route.capabilities?.get(operation);
13
- if (active.route.capabilities !== undefined &&
14
- capability?.available !== true) {
12
+ const capability = active.route.capabilities.get(operation);
13
+ if (capability?.available !== true) {
15
14
  const selectionError = unboundOperationError(operation, active.route);
16
15
  if (selectionError !== undefined)
17
16
  return err(selectionError);
18
17
  return err(new AnalysisCapabilityUnavailableError(active.route.binding?.identity.id ?? active.route.identity.id, operation, capability?.reason ?? "operation is not declared by this provider"));
19
18
  }
20
19
  const profile = active.profile !== null &&
21
- (capability === undefined ||
22
- capability.provider.id === active.profile.provider.id)
20
+ capability.provider.id === active.profile.provider.id
23
21
  ? active.profile
24
22
  : undefined;
25
23
  const cacheable = profile !== undefined &&
@@ -1,7 +1,7 @@
1
1
  import { snapshotMatchesBinding, snapshotMatchesTarget, snapshotTarget, } from "../../domain/analysisSnapshot.js";
2
2
  import { parseBinaryTarget } from "../BinaryTargetResolver.js";
3
- import {} from "../../domain/binaryTarget.js";
4
- import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
3
+ import {} from "../../domain/binaryTargetTypes.js";
4
+ import { EvidenceIntegrityError, AnalysisSnapshotMismatchError, } from "../../domain/evidenceErrors.js";
5
5
  import {} from "../../domain/analysisErrorBase.js";
6
6
  import { err } from "../../domain/result.js";
7
7
  import { SessionProviderRouter } from "./SessionProviderRouter.js";
@@ -47,8 +47,8 @@ export const validateResolvedSessionTarget = (input) => {
47
47
  const validateSnapshot = ({ snapshot, target, profile, current, stagedSnapshotMatches, }) => {
48
48
  if (snapshot !== undefined &&
49
49
  (profile === null || !snapshotMatchesBinding(snapshot, target, profile)))
50
- return new EvidenceIntegrityError("Analysis snapshot profile_mismatch: target, provider, or analysis profile does not match the requested binary");
50
+ return new AnalysisSnapshotMismatchError("Analysis snapshot profile_mismatch: target, provider, or analysis profile does not match the requested binary");
51
51
  if (current === undefined && !stagedSnapshotMatches(target, profile))
52
- return new EvidenceIntegrityError("Analysis snapshot profile_mismatch: staged target, provider, or analysis profile does not match");
52
+ return new AnalysisSnapshotMismatchError("Analysis snapshot profile_mismatch: staged target, provider, or analysis profile does not match");
53
53
  return undefined;
54
54
  };
@@ -1,11 +1,12 @@
1
1
  import { evidenceBundleForTarget } from "../../domain/evidenceBundle.js";
2
- import { EvidenceIntegrityError } from "../../domain/evidenceErrors.js";
2
+ import { EvidenceIntegrityError, AnalysisSnapshotMismatchError, } from "../../domain/evidenceErrors.js";
3
3
  import {} from "../../domain/analysisErrorBase.js";
4
4
  import {} from "../../domain/unknownRegistryError.js";
5
5
  import { err, ok } from "../../domain/result.js";
6
6
  import { AnalysisSnapshotCache } from "./AnalysisSnapshotCache.js";
7
7
  import { InvestigationRecords } from "../investigation/InvestigationRecords.js";
8
- /** Binary snapshot owner and compatibility facade for composed investigation records. */
8
+ const SNAPSHOT_MUTATION_RECOVERY = "Export session observations through export_evidence_bundle if needed. Close the active target without saving a snapshot, then reopen it before importing or saving a snapshot.";
9
+ /** Own binary snapshots and coordinate the composed investigation records. */
9
10
  export class BinarySessionRecords {
10
11
  #records;
11
12
  #snapshot = new AnalysisSnapshotCache();
@@ -31,9 +32,17 @@ export class BinarySessionRecords {
31
32
  evidenceById(evidenceId) {
32
33
  return this.#records.evidenceById(evidenceId);
33
34
  }
35
+ /** Borrow immutable investigation Evidence without copying a complete graph. */
36
+ evidenceForAnalysis(evidenceId) {
37
+ return this.#records.evidenceForAnalysis(evidenceId);
38
+ }
34
39
  exportEvidenceBundle() {
35
40
  return this.#records.exportEvidenceBundle();
36
41
  }
42
+ /** Borrow a sealed bundle for complete serialization without cloning retained graphs. */
43
+ evidenceBundleForSerialization() {
44
+ return this.#records.evidenceBundleForSerialization();
45
+ }
37
46
  importEvidenceBundle(bundle) {
38
47
  const imported = this.#records.mergeEvidenceBundle(bundle);
39
48
  if (!imported.ok)
@@ -47,7 +56,9 @@ export class BinarySessionRecords {
47
56
  exportAnalysisSnapshot() {
48
57
  const active = this.activeAnalysisBinding();
49
58
  if (this.#snapshotInvalidated)
50
- return err(new EvidenceIntegrityError("Analysis snapshots are unavailable after analysis metadata mutations"));
59
+ return err(new EvidenceIntegrityError("Analysis snapshots are unavailable after analysis metadata mutations", {
60
+ userMessage: `Analysis snapshots are unavailable after analysis metadata mutations. ${SNAPSHOT_MUTATION_RECOVERY}`,
61
+ }));
51
62
  const target = active?.target;
52
63
  const profile = active?.profile ?? undefined;
53
64
  if (target !== undefined && profile === undefined)
@@ -58,8 +69,12 @@ export class BinarySessionRecords {
58
69
  }
59
70
  importAnalysisSnapshot(snapshot) {
60
71
  const active = this.activeAnalysisBinding();
72
+ if (active !== undefined && this.#snapshotInvalidated)
73
+ return err(new EvidenceIntegrityError("Analysis snapshots cannot be imported after analysis metadata mutations", {
74
+ userMessage: `Analysis snapshots cannot be imported after analysis metadata mutations. ${SNAPSHOT_MUTATION_RECOVERY}`,
75
+ }));
61
76
  if (active?.profile === null)
62
- return err(new EvidenceIntegrityError("Analysis snapshot profile_mismatch: the active target has no concrete analysis profile"));
77
+ return err(new AnalysisSnapshotMismatchError("Analysis snapshot profile_mismatch: the active target has no concrete analysis profile"));
63
78
  const imported = this.#snapshot.import(snapshot, active === undefined
64
79
  ? undefined
65
80
  : { target: active.target, profile: active.profile }, (bundle) => {
@@ -78,9 +93,13 @@ export class BinarySessionRecords {
78
93
  this.#emitSnapshotChanged();
79
94
  }
80
95
  lookupSnapshot(target, profile, operation, parameters) {
96
+ if (this.#snapshotInvalidated)
97
+ return undefined;
81
98
  return this.#snapshot.lookup(target, profile, operation, parameters);
82
99
  }
83
100
  recordSnapshot(input) {
101
+ if (this.#snapshotInvalidated)
102
+ return;
84
103
  this.#snapshot.record(input);
85
104
  this.#emitSnapshotChanged();
86
105
  }
@@ -89,6 +108,8 @@ export class BinarySessionRecords {
89
108
  const active = this.activeAnalysisBinding();
90
109
  if (active === undefined || active.profile === null)
91
110
  return err(new EvidenceIntegrityError("Workflow snapshot entries require an active concrete provider profile"));
111
+ if (this.#snapshotInvalidated)
112
+ return ok(null);
92
113
  try {
93
114
  this.#snapshot.recordWorkflow({
94
115
  target: active.target,
@@ -112,6 +133,7 @@ export class BinarySessionRecords {
112
133
  resetSnapshotInvalidation() {
113
134
  if (!this.#snapshotInvalidated)
114
135
  return;
136
+ this.#snapshot.clear();
115
137
  this.#snapshotInvalidated = false;
116
138
  this.#emitSnapshotChanged();
117
139
  }
@@ -1,9 +1,6 @@
1
1
  /** Project internal provider routing state into the caller-visible session status. */
2
- export const binarySessionStatus = ({ target, route, router, runtimeUnavailability, runId, runtimeLineageSnapshots, requestActivitySnapshots, }) => {
3
- const configuredProvider = router.configuredIdentity();
4
- const provider = providerSummary(configuredProvider);
5
- const providers = router.providerIdentities(route).map(providerSummary);
6
- const capabilities = [...(route.capabilities?.values() ?? [])]
2
+ export const binarySessionStatus = ({ target, route, router, runtimeUnavailability, runId, runtimeLineageSnapshots, requestActivitySnapshots, providerOperationHealth, }) => {
3
+ const capabilities = [...route.capabilities.values()]
7
4
  .filter(({ operation }) => operation !== "inventory_artifact")
8
5
  .sort((left, right) => left.operation.localeCompare(right.operation))
9
6
  .map((descriptor) => {
@@ -38,8 +35,6 @@ export const binarySessionStatus = ({ target, route, router, runtimeUnavailabili
38
35
  .map(capabilityStatus),
39
36
  }));
40
37
  const common = {
41
- provider,
42
- providers,
43
38
  capabilities,
44
39
  analysis_provider_binding: analysisProviderBinding,
45
40
  analysis_provider_candidates: analysisProviderCandidates,
@@ -50,6 +45,7 @@ export const binarySessionStatus = ({ target, route, router, runtimeUnavailabili
50
45
  process_lineage: processLineageStatus(runtimeLineageSnapshots),
51
46
  },
52
47
  analysis_activity: requestActivityStatus(requestActivitySnapshots),
48
+ provider_operation_health: providerOperationHealthStatus(providerOperationHealth),
53
49
  };
54
50
  return target === undefined
55
51
  ? { open: false, ...common }
@@ -137,3 +133,18 @@ const capabilityStatus = (descriptor) => ({
137
133
  },
138
134
  limitations: [...descriptor.limitations],
139
135
  });
136
+ const providerOperationHealthStatus = (health) => {
137
+ if (health === undefined || health === null)
138
+ return null;
139
+ return {
140
+ state: health.state,
141
+ stage: health.stage,
142
+ retry_action: health.retryAction,
143
+ exit_code: health.exitCode,
144
+ requests: health.requests.map((request) => ({
145
+ request_id: request.requestId,
146
+ operation: request.operation,
147
+ stage: request.stage,
148
+ })),
149
+ };
150
+ };