rea-agents 4.0.0 → 4.1.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 (416) hide show
  1. package/README.md +93 -30
  2. package/bridge/ghidra/ReaGhidraBridge.java +358 -15
  3. package/bridge/ghidra/ReaGhidraExtensions.java +113 -0
  4. package/bridge/ghidra/ReaGhidraPrepareCom.java +32 -0
  5. package/dist/android/AndroidTargetSnapshot.js +34 -0
  6. package/dist/android/JadxAnalysis.js +191 -0
  7. package/dist/android/JadxConfiguration.js +41 -0
  8. package/dist/android/JadxMcpTransport.js +145 -0
  9. package/dist/android/JadxProtocol.js +101 -0
  10. package/dist/android/JadxProvider.js +170 -0
  11. package/dist/android/JadxRelease.js +19 -0
  12. package/dist/android/JadxSession.js +97 -0
  13. package/dist/application/AnalysisContextQueries.js +2 -1
  14. package/dist/application/AnalysisProviderEvaluation.js +5 -3
  15. package/dist/application/AnalysisProviderRegistry.js +2 -1
  16. package/dist/application/AnalysisSnapshotCache.js +4 -1
  17. package/dist/application/AnalysisSnapshotFiles.js +1 -1
  18. package/dist/application/AndroidAnalysisPort.js +1 -0
  19. package/dist/application/AndroidAnalysisService.js +37 -0
  20. package/dist/application/ArtifactExtraction.js +7 -4
  21. package/dist/application/ArtifactGraphConstruction.js +10 -17
  22. package/dist/application/ArtifactInventory/scanCanonical.js +8 -7
  23. package/dist/application/BinarySession.js +16 -3
  24. package/dist/application/BinarySessionExecution.js +4 -1
  25. package/dist/application/BinarySessionOpen.js +3 -2
  26. package/dist/application/BinarySessionRecords.js +9 -3
  27. package/dist/application/BinaryTargetResolver.js +25 -6
  28. package/dist/application/BrowserObservationService.js +2 -1
  29. package/dist/application/BrowserScenarioCaptureService.js +2 -1
  30. package/dist/application/BrowserScenarioEvidence.js +2 -2
  31. package/dist/application/CallPathTracing.js +2 -1
  32. package/dist/application/CapabilityInventory.js +18 -0
  33. package/dist/application/ClientConfigPath.js +3 -1
  34. package/dist/application/ClientConfigurationDocument.js +11 -1
  35. package/dist/application/ClientRegistrationStatus.js +8 -1
  36. package/dist/application/CompositeProvider.js +1 -1
  37. package/dist/application/DirectAnalysis.js +23 -7
  38. package/dist/application/DirectAnalysisStatus.js +3 -3
  39. package/dist/application/Doctor.js +48 -8
  40. package/dist/application/DoctorDiagnostics.js +7 -5
  41. package/dist/application/DoctorScope.js +1 -1
  42. package/dist/application/ElectronActiveEvidence.js +2 -2
  43. package/dist/application/ElectronActiveObservationService.js +2 -1
  44. package/dist/application/ElectronBoundaryAnalysis.js +1 -1
  45. package/dist/application/ElectronObservationService.js +2 -1
  46. package/dist/application/EnhancedLiteralTracing.js +2 -1
  47. package/dist/application/EnhancedToolTypes.js +2 -1
  48. package/dist/application/EnhancedTools.js +3 -1
  49. package/dist/application/EvidenceBundleCommands.js +2 -1
  50. package/dist/application/EvidenceBundleFiles.js +1 -1
  51. package/dist/application/EvidenceInputResolver.js +30 -0
  52. package/dist/application/EvidenceLedger.js +2 -1
  53. package/dist/application/FirmwareAnalysisPort.js +1 -0
  54. package/dist/application/FirmwareAnalysisService.js +35 -0
  55. package/dist/application/FunctionAnalysisEvidence.js +32 -0
  56. package/dist/application/InventoryProjectionEvidence.js +2 -1
  57. package/dist/application/JavaScriptApplicationService.js +50 -3
  58. package/dist/application/JavaScriptApplicationWorkflowService.js +2 -1
  59. package/dist/application/JavaScriptArtifactAnalysis.js +4 -2
  60. package/dist/application/JavaScriptArtifactFiles.js +4 -2
  61. package/dist/application/JavaScriptArtifactPathResolution.js +6 -2
  62. package/dist/application/JavaScriptJsonModules.js +3 -2
  63. package/dist/application/JavaScriptModuleRelationships.js +4 -2
  64. package/dist/application/JavaScriptRuntimeObservationService.js +2 -1
  65. package/dist/application/JavaScriptRuntimeReconciliationService.js +2 -1
  66. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -1
  67. package/dist/application/JavaScriptSemanticTraceService.js +2 -1
  68. package/dist/application/JsonFiles.js +1 -1
  69. package/dist/application/LazyAnalysisProvider.js +3 -1
  70. package/dist/application/LinuxHopper.js +12 -4
  71. package/dist/application/MacHopper.js +20 -7
  72. package/dist/application/ManagedApplicationGraphService.js +2 -1
  73. package/dist/application/ManagedMemberComparisonService.js +3 -1
  74. package/dist/application/ManagedNativeVerificationService.js +2 -1
  75. package/dist/application/ManagedReconstructionService.js +2 -1
  76. package/dist/application/NativeCallRoutes.js +1 -1
  77. package/dist/application/NativeDispatchMetadataInspection.js +1 -1
  78. package/dist/application/NativeUiActionTrace.js +2 -1
  79. package/dist/application/NativeValueTrace.js +1 -1
  80. package/dist/application/ProcessCaptureError.js +1 -1
  81. package/dist/application/ProcessCaptureJournal.js +3 -1
  82. package/dist/application/ProcessCaptureLifecycle.js +6 -3
  83. package/dist/application/ProcessCli.js +9 -5
  84. package/dist/application/ProcessEvidence.js +2 -6
  85. package/dist/application/ProcessHarness.js +3 -2
  86. package/dist/application/ProcessNormalization.js +12 -5
  87. package/dist/application/ProcessSampling.js +3 -1
  88. package/dist/application/ReconstructionCoverageService.js +2 -1
  89. package/dist/application/ReconstructionObligationLedgerService.js +2 -1
  90. package/dist/application/ReferenceSourceImportEntries.js +2 -0
  91. package/dist/application/ReferenceSourceImportPolicy.js +4 -2
  92. package/dist/application/ReferenceSourceVcsAdapter.js +35 -4
  93. package/dist/application/SessionProviderRouter.js +4 -1
  94. package/dist/application/Setup.js +1 -128
  95. package/dist/application/SetupClientConfiguration.js +17 -6
  96. package/dist/application/SetupHost.js +111 -0
  97. package/dist/application/SetupRegistrationEnvironment.js +1 -2
  98. package/dist/application/SetupSkill.js +9 -3
  99. package/dist/application/SetupTypes.js +17 -0
  100. package/dist/application/StoreFileLock.js +7 -2
  101. package/dist/application/SupportedClients.js +8 -0
  102. package/dist/application/Uninstall.js +9 -4
  103. package/dist/application/UpdateRuntime.js +5 -2
  104. package/dist/application/WindowsCapabilities.js +7 -7
  105. package/dist/application/runtime.js +3 -1
  106. package/dist/artifacts/ArtifactProvider.js +3 -1
  107. package/dist/artifacts/DirectoryArtifactReader.js +2 -0
  108. package/dist/artifacts/NativeDmgArtifactReader.js +10 -3
  109. package/dist/artifacts/NibArchive.js +4 -2
  110. package/dist/artifacts/SafeOutputTree.js +26 -10
  111. package/dist/artifacts/ZipArtifactReader.js +1 -0
  112. package/dist/browser/BrowserProcessStartup.js +3 -1
  113. package/dist/browser/CdpAuthorizedMainFrame.js +1 -1
  114. package/dist/browser/CdpBrowserProvider.js +4 -1
  115. package/dist/browser/CdpCaptureDocuments.js +3 -1
  116. package/dist/browser/CdpCaptureEventHandlers.js +6 -2
  117. package/dist/browser/CdpCaptureStorageFingerprints.js +1 -1
  118. package/dist/browser/CdpCaptureValues.js +6 -2
  119. package/dist/browser/CdpConnection.js +8 -6
  120. package/dist/browser/CdpElectronInspection.js +3 -3
  121. package/dist/browser/CdpElectronProvider.js +4 -1
  122. package/dist/browser/CdpElectronScripts.js +2 -2
  123. package/dist/browser/CdpEndpoint.js +22 -10
  124. package/dist/browser/CdpObservationSession.js +2 -1
  125. package/dist/browser/CdpOptionalCommand.js +1 -1
  126. package/dist/browser/CdpPageCapture.js +2 -1
  127. package/dist/browser/CdpSafeMetadata.js +53 -8
  128. package/dist/browser/CdpScreenshot.js +1 -1
  129. package/dist/browser/CdpTargetSession.js +8 -5
  130. package/dist/browser/CdpWebMcpDiscovery.js +1 -1
  131. package/dist/browser/ElectronFileScope.js +9 -3
  132. package/dist/browser/JavaScriptRuntimeScope.js +3 -1
  133. package/dist/browser/PlaywrightBrowserScenarioProvider.js +3 -1
  134. package/dist/browser/PlaywrightElectronActiveActions.js +1 -1
  135. package/dist/browser/PlaywrightElectronActiveProvider.js +6 -2
  136. package/dist/browser/PlaywrightExecutionBoundary.js +1 -1
  137. package/dist/browser/PlaywrightScenarioArtifacts.js +10 -5
  138. package/dist/browser/PlaywrightScenarioBrowser.js +3 -1
  139. package/dist/browser/PlaywrightScenarioEvents.js +6 -2
  140. package/dist/browser/PlaywrightScenarioSession.js +5 -2
  141. package/dist/browser/V8InspectorEndpoint.js +2 -1
  142. package/dist/browser/V8InspectorProvider.js +6 -1
  143. package/dist/browser/WebSourceMapFetcher.js +24 -11
  144. package/dist/cli/androidCommands.js +81 -0
  145. package/dist/{cliApplicationCommands.js → cli/applicationCommands.js} +18 -16
  146. package/dist/{cliBrowserAdvancedCommands.js → cli/browserAdvancedCommands.js} +13 -16
  147. package/dist/{cliBrowserCommands.js → cli/browserCommands.js} +9 -9
  148. package/dist/cli/commandCancellation.js +24 -0
  149. package/dist/cli/coreAnalysisCommands.js +110 -17
  150. package/dist/{cliElectronCommands.js → cli/electronCommands.js} +14 -13
  151. package/dist/cli/firmwareCommands.js +75 -0
  152. package/dist/{cliSetup.js → cli/interactiveSetup.js} +1 -1
  153. package/dist/cli/javascriptApplicationAnalysis.js +1 -1
  154. package/dist/cli/managedCommands.js +1 -1
  155. package/dist/cli/managedProjectGraphCommand.js +1 -1
  156. package/dist/cli/options.js +7 -1
  157. package/dist/{cliProcessCommands.js → cli/processCommands.js} +3 -3
  158. package/dist/cli/referenceSourceImportStatus.js +10 -0
  159. package/dist/cli/setupCommands.js +4 -2
  160. package/dist/cli/utilityCommands.js +3 -2
  161. package/dist/cli.js +10 -15
  162. package/dist/cliBrowserContext.js +1 -1
  163. package/dist/cliBrowserScenarioCommands.js +2 -1
  164. package/dist/cliCommandNames.js +11 -2
  165. package/dist/cliEvidenceCommands.js +2 -1
  166. package/dist/cliJavaScriptRuntimeCommands.js +2 -1
  167. package/dist/cliJsonInput.js +26 -11
  168. package/dist/cliLogging.js +2 -1
  169. package/dist/cliOutput.js +15 -16
  170. package/dist/config/environment.js +11 -1
  171. package/dist/config/parseConfig.js +7 -1
  172. package/dist/config/parsers.js +1 -1
  173. package/dist/contracts/androidToolContracts.js +77 -0
  174. package/dist/contracts/applicationToolContracts.js +32 -5
  175. package/dist/contracts/applicationWorkflowInputContracts.js +13 -13
  176. package/dist/contracts/artifactComparisonExample.js +7 -14
  177. package/dist/contracts/enhancedToolContracts.js +31 -0
  178. package/dist/contracts/errorSchemas.js +4 -2
  179. package/dist/contracts/evidenceInputContracts.js +13 -0
  180. package/dist/contracts/firmwareToolContracts.js +38 -0
  181. package/dist/contracts/officialToolContracts.js +66 -0
  182. package/dist/contracts/promptContracts.js +1 -1
  183. package/dist/contracts/sessionLifecycleInputs.js +4 -0
  184. package/dist/contracts/sessionToolContracts.js +43 -0
  185. package/dist/contracts/sessionToolSchemas.js +1 -1
  186. package/dist/contracts/toolContractExamples.js +5 -0
  187. package/dist/contracts/toolContractTypes.js +2 -0
  188. package/dist/contracts/toolContracts.js +7 -130
  189. package/dist/contracts/toolEffects.js +43 -0
  190. package/dist/contracts/toolOutputSchemaGroups.js +4 -0
  191. package/dist/contracts/toolOutputSchemaPrimitives.js +1 -0
  192. package/dist/doctorRuntime.js +5 -1
  193. package/dist/domain/analysisErrorBase.js +33 -0
  194. package/dist/domain/analysisErrorCore.js +60 -0
  195. package/dist/domain/analysisErrorPresentation.js +22 -2
  196. package/dist/domain/analysisErrorProjection.js +24 -3
  197. package/dist/domain/analysisSnapshot.js +1 -0
  198. package/dist/domain/androidAnalysis.js +141 -0
  199. package/dist/domain/appleAssetCatalog.js +1 -1
  200. package/dist/domain/artifactGraph.js +1 -0
  201. package/dist/domain/artifactInspection.js +19 -17
  202. package/dist/domain/artifactInventoryEvidence.js +20 -25
  203. package/dist/domain/artifactOperationError.js +16 -0
  204. package/dist/domain/browserObservation.js +12 -4
  205. package/dist/domain/browserObservationError.js +23 -0
  206. package/dist/domain/browserScenario.js +1 -1
  207. package/dist/domain/browserScenarioCapture.js +1 -1
  208. package/dist/domain/browserScenarioDiff.js +1 -1
  209. package/dist/domain/browserScenarioNormalization.js +6 -11
  210. package/dist/domain/browserScenarioValues.js +3 -1
  211. package/dist/domain/callPath.js +47 -7
  212. package/dist/domain/canonicalDigest.js +65 -0
  213. package/dist/domain/canonicalOrdering.js +11 -0
  214. package/dist/domain/changedBehavior.js +8 -7
  215. package/dist/domain/comparisonSemantics.js +2 -4
  216. package/dist/domain/configurationErrors.js +25 -0
  217. package/dist/domain/dosCom.js +8 -0
  218. package/dist/domain/electronActiveObservation.js +3 -1
  219. package/dist/domain/electronStaticAnalysisBrowser.js +13 -23
  220. package/dist/domain/electronStaticAnalysisNative.js +2 -1
  221. package/dist/domain/electronStaticAnalysisValues.js +23 -3
  222. package/dist/domain/evidence.js +3 -11
  223. package/dist/domain/evidenceErrors.js +30 -0
  224. package/dist/domain/firmwareAnalysis.js +121 -0
  225. package/dist/domain/functionComparison.js +4 -2
  226. package/dist/domain/functionComparisonDimensions.js +6 -4
  227. package/dist/domain/functionComparisonNormalization.js +8 -1
  228. package/dist/domain/functionComparisonResults.js +1 -4
  229. package/dist/domain/hopperErrors.js +78 -0
  230. package/dist/domain/hopperValues.js +2 -1
  231. package/dist/domain/interfaceBuilderGraph.js +3 -1
  232. package/dist/domain/javascriptApplicationChangeGraph.js +2 -2
  233. package/dist/domain/javascriptApplicationGraph.js +13 -22
  234. package/dist/domain/javascriptApplicationVersionComparison.js +3 -11
  235. package/dist/domain/javascriptApplicationVersionItems.js +3 -3
  236. package/dist/domain/javascriptApplicationVersionKeys.js +1 -1
  237. package/dist/domain/javascriptAstFingerprint.js +1 -1
  238. package/dist/domain/javascriptExportShapeComparison.js +1 -2
  239. package/dist/domain/javascriptExportShapeSelection.js +1 -1
  240. package/dist/domain/javascriptExportShapeVariants.js +7 -3
  241. package/dist/domain/javascriptFeatureSeed.js +29 -9
  242. package/dist/domain/javascriptFeatureTrace.js +9 -13
  243. package/dist/domain/javascriptFeatureTraversal.js +2 -1
  244. package/dist/domain/javascriptNativeHandoff.js +2 -1
  245. package/dist/domain/javascriptRuntimeLoadState.js +2 -2
  246. package/dist/domain/javascriptRuntimeReconciliationActive.js +3 -10
  247. package/dist/domain/javascriptRuntimeReconciliationGraph.js +2 -2
  248. package/dist/domain/javascriptRuntimeReconciliationMatching.js +4 -3
  249. package/dist/domain/javascriptRuntimeReconciliationParsing.js +8 -14
  250. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -4
  251. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +5 -2
  252. package/dist/domain/javascriptRuntimeStaticCandidates.js +8 -4
  253. package/dist/domain/javascriptSemanticAnalysis.js +40 -3
  254. package/dist/domain/javascriptSemanticCallResolution.js +2 -1
  255. package/dist/domain/javascriptSemanticChildProcesses.js +2 -1
  256. package/dist/domain/javascriptSemanticDataEffects.js +2 -1
  257. package/dist/domain/javascriptSemanticFingerprints.js +1 -1
  258. package/dist/domain/javascriptSemanticGraph.js +23 -28
  259. package/dist/domain/javascriptSemanticPrimitives.js +9 -2
  260. package/dist/domain/javascriptSemanticProjection.js +2 -1
  261. package/dist/domain/javascriptSemanticPromises.js +2 -1
  262. package/dist/domain/javascriptSemanticProvenance.js +1 -1
  263. package/dist/domain/javascriptSemanticQuery.js +7 -8
  264. package/dist/domain/javascriptSemanticQueryAssessment.js +1 -2
  265. package/dist/domain/javascriptSemanticQueryIdentity.js +1 -2
  266. package/dist/domain/javascriptSemanticReturns.js +2 -1
  267. package/dist/domain/javascriptSemanticValues.js +50 -16
  268. package/dist/domain/javascriptSourceParser.js +4 -2
  269. package/dist/domain/javascriptStaticAnalysis.js +1 -1
  270. package/dist/domain/javascriptStaticAnalysisBundler.js +2 -1
  271. package/dist/domain/javascriptStaticAnalysisCalls.js +14 -6
  272. package/dist/domain/javascriptStaticAnalysisHelpers.js +31 -4
  273. package/dist/domain/jsonShape.js +6 -2
  274. package/dist/domain/managedMemberComparison.js +1 -0
  275. package/dist/domain/managedMemberComparisonItems.js +2 -0
  276. package/dist/domain/managedNativeVerificationMatch.js +5 -3
  277. package/dist/domain/nativeDataType.js +2 -0
  278. package/dist/domain/nativeFunctionAnnotations.js +43 -0
  279. package/dist/domain/nativeLoadImage.js +95 -0
  280. package/dist/domain/nativeMetadataRecovery.js +55 -0
  281. package/dist/domain/processCapture.js +0 -1
  282. package/dist/domain/processEvidenceProvider.js +11 -0
  283. package/dist/domain/processTraceComparison.js +1 -1
  284. package/dist/domain/providerAdapterError.js +17 -0
  285. package/dist/domain/providerCleanupError.js +1 -1
  286. package/dist/domain/providerSelectionError.js +44 -0
  287. package/dist/domain/reconstructionUnknowns.js +1 -1
  288. package/dist/domain/reconstructionVerification.js +22 -8
  289. package/dist/domain/referenceSourceClassification.js +5 -6
  290. package/dist/domain/referenceSourceGraph.js +9 -17
  291. package/dist/domain/referenceSourceImportParsing.js +38 -23
  292. package/dist/domain/runtimeIdentification.js +1 -1
  293. package/dist/domain/runtimeVersion.js +4 -7
  294. package/dist/domain/safeJson.js +13 -0
  295. package/dist/domain/sourceToBundleComparison.js +5 -7
  296. package/dist/domain/sourceToBundleSignals.js +6 -6
  297. package/dist/domain/staticRuntimeCorrelation.js +9 -7
  298. package/dist/domain/unknownRegistryError.js +10 -0
  299. package/dist/domain/webBundleAnalyzerAst.js +22 -5
  300. package/dist/domain/webBundleAnalyzerInspection.js +20 -14
  301. package/dist/dotnet/ManagedMemberRows.js +1 -1
  302. package/dist/dotnet/ManagedMetadataHeaps.js +3 -2
  303. package/dist/dotnet/ManagedMetadataInventoryRows.js +4 -2
  304. package/dist/dotnet/ManagedMethodBodyReader.js +8 -1
  305. package/dist/dotnet/ManagedStaticProvider.js +3 -1
  306. package/dist/firmware/FirmwareCommand.js +163 -0
  307. package/dist/firmware/FirmwareFiles.js +190 -0
  308. package/dist/firmware/FirmwareProvider.js +258 -0
  309. package/dist/firmware/FirmwarePublication.js +84 -0
  310. package/dist/firmware/FirmwareRelease.js +32 -0
  311. package/dist/firmware/FirmwareReports.js +223 -0
  312. package/dist/generatedMcpToolCatalog.js +1 -1
  313. package/dist/generatedPackageMetadata.js +5 -5
  314. package/dist/ghidra/GhidraAnalysisProfile.js +37 -8
  315. package/dist/ghidra/GhidraClient.js +52 -6
  316. package/dist/ghidra/GhidraDiagnostics.js +3 -0
  317. package/dist/ghidra/GhidraDoctor.js +38 -14
  318. package/dist/ghidra/GhidraFunctionValues.js +10 -4
  319. package/dist/ghidra/GhidraInstallation.js +10 -4
  320. package/dist/ghidra/GhidraInventoryValues.js +39 -2
  321. package/dist/ghidra/GhidraLauncher.js +91 -26
  322. package/dist/ghidra/GhidraLoadImageValues.js +199 -0
  323. package/dist/ghidra/GhidraProvider.js +129 -13
  324. package/dist/ghidra/GhidraProviderCapabilities.js +52 -15
  325. package/dist/ghidra/GhidraRequestQueue.js +2 -2
  326. package/dist/ghidra/GhidraSessionError.js +31 -4
  327. package/dist/ghidra/GhidraSessionValues.js +10 -7
  328. package/dist/ghidra/GhidraTargetSnapshot.js +16 -2
  329. package/dist/ghidra/GhidraTransport.js +12 -0
  330. package/dist/ghidra/extensions/GhidraExtensionFailures.js +20 -0
  331. package/dist/ghidra/extensions/GhidraExtensions.js +170 -0
  332. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +21 -0
  333. package/dist/ghidra/extensions/nativeaot/NativeAotReport.js +84 -0
  334. package/dist/hopper/BridgeLauncher.js +4 -2
  335. package/dist/hopper/HopperAnalysisProfile.js +7 -2
  336. package/dist/hopper/HopperCleanup.js +55 -9
  337. package/dist/hopper/HopperClient.js +14 -4
  338. package/dist/hopper/HopperProcessDiagnostic.js +1 -1
  339. package/dist/hopper/HopperProvider.js +8 -4
  340. package/dist/hopper/HopperRequestQueue.js +7 -3
  341. package/dist/hopper/HopperSessionValues.js +1 -1
  342. package/dist/hopper/HopperSocketConnection.js +1 -1
  343. package/dist/hopper/HopperTargetLease.js +23 -15
  344. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +7 -8
  345. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -2
  346. package/dist/hopper/protocol.js +8 -8
  347. package/dist/ida/IdaConfiguration.js +56 -0
  348. package/dist/ida/IdaDoctor.js +53 -0
  349. package/dist/ida/IdaInput.js +62 -0
  350. package/dist/ida/IdaMcpConnection.js +111 -0
  351. package/dist/ida/IdaOperationRunner.js +299 -0
  352. package/dist/ida/IdaProtocolValues.js +178 -0
  353. package/dist/ida/IdaProvider.js +126 -0
  354. package/dist/ida/IdaProviderCapabilities.js +60 -0
  355. package/dist/ida/IdaSessionClient.js +306 -0
  356. package/dist/ida/IdaWorkspace.js +54 -0
  357. package/dist/main/shutdown.js +21 -1
  358. package/dist/main/startup.js +1 -1
  359. package/dist/main/transport.js +8 -4
  360. package/dist/main.js +5 -2
  361. package/dist/native/AppleDispatchMetadata.js +31 -10
  362. package/dist/native/NativeMacOSProvider.js +87 -15
  363. package/dist/native/NativeMachoInspection.js +42 -12
  364. package/dist/native/NativeUiHelperRuntime.js +7 -1
  365. package/dist/native/NativeUiObservation.js +6 -2
  366. package/dist/native/parsers/demangle.js +1 -1
  367. package/dist/native/parsers/dyldInfo.js +3 -3
  368. package/dist/native/parsers/otool.js +4 -1
  369. package/dist/native/parsers/plist.js +11 -3
  370. package/dist/process/PrivateRuntimeRoot.js +13 -3
  371. package/dist/process/ProcessOwnership.js +5 -73
  372. package/dist/process/ProcessOwnershipObservation.js +62 -2
  373. package/dist/process/ProcessOwnershipProcessTree.js +13 -0
  374. package/dist/process/ProviderProcess.js +24 -7
  375. package/dist/process/ProviderRunLineage.js +1 -1
  376. package/dist/process/WindowsAuthority.js +20 -1
  377. package/dist/reference/ReferenceSourceReaderEntries.js +5 -1
  378. package/dist/reference/ReferenceSourceReaderFile.js +1 -0
  379. package/dist/server/createServer.js +25 -2
  380. package/dist/server/mcpProgress.js +2 -1
  381. package/dist/server/promptCompletion.js +3 -3
  382. package/dist/server/registerAndroidTools.js +30 -0
  383. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -1
  384. package/dist/server/registerApplicationTools/compareSourceToBundle.js +7 -2
  385. package/dist/server/registerApplicationTools/compareVersions.js +5 -1
  386. package/dist/server/registerApplicationTools/traceFeature.js +7 -2
  387. package/dist/server/registerApplicationTools/traceSemantics.js +7 -2
  388. package/dist/server/registerEnhancedTools.js +28 -1
  389. package/dist/server/registerFirmwareTools.js +22 -0
  390. package/dist/server/registerFunctionComparisonTool.js +1 -1
  391. package/dist/server/registerInvestigationTools/helpers.js +2 -1
  392. package/dist/server/registerManagedTools.js +1 -1
  393. package/dist/server/registerManagedWorkflowTools/evidence.js +1 -1
  394. package/dist/server/registerOfficialTools.js +4 -1
  395. package/dist/server/registerProcessComparisonTool.js +5 -2
  396. package/dist/server/registerSessionTools.js +3 -1
  397. package/dist/server/runDerivedOperation.js +1 -1
  398. package/dist/server/sessionAvailabilityPolicy.js +3 -0
  399. package/dist/server/sessionEvidence.js +1 -1
  400. package/dist/server/toolResult.js +2 -1
  401. package/dist/windows/WindowsNativeLoader.js +108 -0
  402. package/dist/windows/WindowsOwnedProcess.js +168 -0
  403. package/dist/windows/WindowsPrivateRuntime.js +137 -0
  404. package/install.sh +4 -6
  405. package/native/windows/README.md +102 -0
  406. package/native/windows/build/manifest.json +9 -0
  407. package/native/windows/build/rea-windows-x64.node +0 -0
  408. package/package.json +38 -24
  409. package/scripts/rea.mjs +1 -1
  410. package/scripts/verify-windows-native-artifact.mjs +39 -0
  411. package/skills/reverse-engineer-anything/SKILL.md +92 -24
  412. package/skills/reverse-engineer-anything/references/android-applications.md +31 -0
  413. package/skills/reverse-engineer-anything/references/javascript-applications.md +19 -2
  414. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +52 -4
  415. package/dist/browser/CdpCanonicalJsonDigest.js +0 -9
  416. package/dist/domain/errors.js +0 -324
@@ -4,9 +4,13 @@ import { randomUUID } from "node:crypto";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { _electron as electron } from "playwright-core";
6
6
  import { electronActiveObservationResultSchema, } from "../domain/electronActiveObservation.js";
7
- import { AnalysisError, BrowserObservationError, ProviderAdapterError, } from "../domain/errors.js";
7
+ import { AnalysisError } from "../domain/analysisErrorBase.js";
8
+ import { BrowserObservationError } from "../domain/browserObservationError.js";
9
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
8
10
  import { err, ok } from "../domain/result.js";
9
- import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, observeOwnedProcessLineage, selectCapturedProcessGroupIds, verifyNoTokenOwnedProcesses, } from "../process/ProcessOwnership.js";
11
+ import { cleanupOwnedProcessGroup, cleanupWindowsProcessTree, verifyNoTokenOwnedProcesses, } from "../process/ProcessOwnership.js";
12
+ import { observeOwnedProcessLineage } from "../process/ProcessOwnershipObservation.js";
13
+ import { selectCapturedProcessGroupIds } from "../process/ProcessOwnershipProcessTree.js";
10
14
  import { runElectronActions, readApplicationState, runWithExecutionLimits, } from "./PlaywrightElectronActiveActions.js";
11
15
  const OPERATION = "capture_electron_scenario";
12
16
  const STARTUP_TIMEOUT_MS = 60_000;
@@ -1,4 +1,4 @@
1
- import { AnalysisCancelledError, AnalysisTimeoutError, } from "../domain/errors.js";
1
+ import { AnalysisCancelledError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
2
2
  const OPERATION = "capture_browser_scenario";
3
3
  export const withPlaywrightExecutionBoundary = (work, timeoutMs, signal) => {
4
4
  if (timeoutMs !== undefined && timeoutMs <= 0)
@@ -44,7 +44,8 @@ const captureScreenshot = async (page) => {
44
44
  },
45
45
  };
46
46
  }
47
- catch {
47
+ catch (cause) {
48
+ void cause;
48
49
  return missing("screenshot capture failed");
49
50
  }
50
51
  };
@@ -53,7 +54,8 @@ const captureDom = async (input) => {
53
54
  try {
54
55
  return textArtifact(secrets.redact(await page.content()));
55
56
  }
56
- catch {
57
+ catch (cause) {
58
+ void cause;
57
59
  return missing("DOM capture failed");
58
60
  }
59
61
  };
@@ -63,7 +65,8 @@ const captureAccessibility = async (input) => {
63
65
  const text = await page.locator("html").ariaSnapshot();
64
66
  return textArtifact(secrets.redact(text));
65
67
  }
66
- catch {
68
+ catch (cause) {
69
+ void cause;
67
70
  return missing("accessibility capture failed");
68
71
  }
69
72
  };
@@ -99,7 +102,8 @@ const captureHistory = async (page, secrets) => {
99
102
  };
100
103
  return { state: "captured", value };
101
104
  }
102
- catch {
105
+ catch (cause) {
106
+ void cause;
103
107
  return missing("history capture failed");
104
108
  }
105
109
  };
@@ -135,7 +139,8 @@ const captureStorage = async (input) => {
135
139
  };
136
140
  return { state: "captured", value };
137
141
  }
138
- catch {
142
+ catch (cause) {
143
+ void cause;
139
144
  return missing("storage capture failed");
140
145
  }
141
146
  };
@@ -2,7 +2,7 @@ import { chmod, mkdtemp, rm } from "node:fs/promises";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join, resolve } from "node:path";
4
4
  import { chromium, } from "playwright-core";
5
- import { BrowserObservationError } from "../domain/errors.js";
5
+ import { BrowserObservationError } from "../domain/browserObservationError.js";
6
6
  import { withPlaywrightExecutionBoundary } from "./PlaywrightExecutionBoundary.js";
7
7
  const OPERATION = "capture_browser_scenario";
8
8
  const allowedBrowserEnvironment = (environment) => {
@@ -133,6 +133,8 @@ export const closePlaywrightScenarioBrowser = async ({ context, browser, profile
133
133
  await rm(profilePath, { recursive: true, force: true, maxRetries: 3 });
134
134
  }
135
135
  })();
136
+ // best-effort cleanup: the bounded execution boundary below observes the
137
+ // same cleanup promise; this early attachment only prevents unhandled rejection.
136
138
  void cleanup.catch(() => undefined);
137
139
  // The shared execution boundary rejects cancellation/timeouts instead of
138
140
  // returning a successful capture whose browser or profile may still exist.
@@ -24,9 +24,10 @@ export class PlaywrightScenarioEvents {
24
24
  try {
25
25
  return this.pages.has(request.frame().page());
26
26
  }
27
- catch {
27
+ catch (cause) {
28
28
  // Initial popup navigations can lack a frame. Never guess ownership
29
29
  // from a URL in a shared context; connect captures are attach-limited.
30
+ void cause;
30
31
  return false;
31
32
  }
32
33
  };
@@ -236,6 +237,9 @@ export class PlaywrightScenarioEvents {
236
237
  suggested_filename: this.secrets.redact(download.suggestedFilename()),
237
238
  url: this.safeUrl(download.url()),
238
239
  });
239
- void download.cancel().catch(() => undefined);
240
+ void download.cancel().catch((cause) => {
241
+ // best-effort cleanup: download cancellation must not reject unhandled.
242
+ void cause;
243
+ });
240
244
  }
241
245
  }
@@ -1,5 +1,5 @@
1
1
  import {} from "playwright-core";
2
- import { BrowserObservationError } from "../domain/errors.js";
2
+ import { BrowserObservationError } from "../domain/browserObservationError.js";
3
3
  import { BrowserScenarioSecrets } from "./BrowserScenarioSecrets.js";
4
4
  import { closePlaywrightScenarioBrowser, openPlaywrightScenarioBrowser, } from "./PlaywrightScenarioBrowser.js";
5
5
  import { performPlaywrightScenarioAction } from "./PlaywrightScenarioActions.js";
@@ -95,7 +95,10 @@ export class PlaywrightScenarioSession {
95
95
  catch (cause) {
96
96
  void opening
97
97
  .then((lateOpened) => closePlaywrightScenarioBrowser(lateOpened, options.signal))
98
- .catch(() => undefined);
98
+ .catch((cause) => {
99
+ // best-effort cleanup: late-open cleanup must not mask the boundary failure.
100
+ void cause;
101
+ });
99
102
  throw cause;
100
103
  }
101
104
  try {
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
- import { BrowserObservationError, } from "../domain/errors.js";
2
+ import { BrowserObservationError } from "../domain/browserObservationError.js";
3
+ import {} from "../domain/browserObservationErrors.js";
3
4
  import { parseCdpEndpointValue, readCdpJson } from "./CdpEndpoint.js";
4
5
  const versionSchema = z
5
6
  .object({
@@ -1,5 +1,8 @@
1
1
  import { javascriptRuntimeObservationSchema, javascriptRuntimeTargetListSchema, } from "../domain/javascriptRuntimeObservation.js";
2
- import { AnalysisError, BrowserObservationError, ProviderAdapterError, } from "../domain/errors.js";
2
+ import { AnalysisError } from "../domain/analysisErrorBase.js";
3
+ import { BrowserObservationError } from "../domain/browserObservationError.js";
4
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
5
+ import {} from "../domain/browserObservationErrors.js";
3
6
  import { err, ok } from "../domain/result.js";
4
7
  import { numberValue, recordValue, stringValue, delayWithCancellation, } from "./CdpCaptureValues.js";
5
8
  import { CdpConnection } from "./CdpConnection.js";
@@ -104,6 +107,8 @@ export class V8InspectorProvider {
104
107
  }
105
108
  export const closeInspectorConnection = async (connection, signal) => {
106
109
  const closing = connection.close();
110
+ // best-effort cleanup: the race below observes the close; this only prevents
111
+ // unhandled rejection when the caller abandons the close via cancellation.
107
112
  void closing.catch(() => undefined);
108
113
  // CdpConnection.close has its own one second transport bound. Do not make a
109
114
  // cancelled caller wait for that fallback.
@@ -1,11 +1,13 @@
1
1
  import * as t from "@babel/types";
2
2
  import { AnyMap, eachMapping } from "@jridgewell/trace-mapping";
3
3
  import { sanitizeBrowserUrl } from "../domain/browserObservation.js";
4
+ import { isUrlLikeModuleSpecifier } from "../domain/webBundleAnalyzerAst.js";
4
5
  import { analyzeParsedJavaScriptSemantics } from "../domain/javascriptSemanticAnalysis.js";
5
6
  import { parseJavaScriptSource } from "../domain/javascriptSourceParser.js";
6
7
  import { hasValidSourceMapContents } from "../domain/sourceMapContents.js";
7
8
  import { webSourceMapsSchema } from "../domain/webBundleAnalysis.js";
8
9
  import { createWebTextArtifact } from "../domain/webContentArtifact.js";
10
+ import { safeParseJson } from "../domain/safeJson.js";
9
11
  /** Fetch and validate approved source maps without browser credentials. */
10
12
  export const fetchWebSourceMaps = async (requests, input, signal, host = { fetch: globalThis.fetch }) => {
11
13
  const items = [];
@@ -126,7 +128,8 @@ const normalizeSourceMap = (request, text, fetchedUrl) => {
126
128
  limitation: `Module edges are incomplete: ${modules.incomplete.length} of ${originalSources.filter(({ artifact }) => artifact !== null).length} original sources could not be parsed in full (${modules.incomplete.join(", ")}).`,
127
129
  };
128
130
  }
129
- catch {
131
+ catch (cause) {
132
+ void cause;
130
133
  return emptySourceMapItem(request, "invalid", "Source-map mappings could not be decoded safely.");
131
134
  }
132
135
  };
@@ -178,13 +181,10 @@ const originalModuleEdges = (sources) => {
178
181
  return { edges, incomplete };
179
182
  };
180
183
  const validSourceMapEnvelope = (text) => {
181
- let parsed;
182
- try {
183
- parsed = JSON.parse(text);
184
- }
185
- catch {
184
+ const parsedResult = safeParseJson(text);
185
+ if (!parsedResult.ok)
186
186
  return false;
187
- }
187
+ const parsed = parsedResult.value;
188
188
  if (!isRecord(parsed) || parsed.version !== 3)
189
189
  return false;
190
190
  if (typeof parsed.mappings === "string")
@@ -194,7 +194,11 @@ const validSourceMapEnvelope = (text) => {
194
194
  const pending = [...parsed.sections];
195
195
  while (pending.length > 0) {
196
196
  const section = pending.pop();
197
- if (!isRecord(section) || !isRecord(section.offset) || !("map" in section))
197
+ if (!isRecord(section) ||
198
+ !isRecord(section.offset) ||
199
+ !validSourceMapOffset(section.offset.line) ||
200
+ !validSourceMapOffset(section.offset.column) ||
201
+ !("map" in section))
198
202
  return false;
199
203
  const map = section.map;
200
204
  if (!isRecord(map) || map.version !== 3)
@@ -207,6 +211,7 @@ const validSourceMapEnvelope = (text) => {
207
211
  }
208
212
  return true;
209
213
  };
214
+ const validSourceMapOffset = (value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
210
215
  const validSourceMapLeaf = (map) => typeof map.mappings === "string" &&
211
216
  Array.isArray(map.sources) &&
212
217
  Array.isArray(map.names) &&
@@ -219,7 +224,9 @@ const approvedUrl = (value, allowedOrigins) => {
219
224
  parsed.password === "" &&
220
225
  allowedOrigins.includes(parsed.origin));
221
226
  }
222
- catch {
227
+ catch (cause) {
228
+ // Non-URL input is not an approved source-map URL.
229
+ void cause;
223
230
  return false;
224
231
  }
225
232
  };
@@ -240,15 +247,21 @@ const sanitizeSource = (value) => {
240
247
  try {
241
248
  return sanitizeBrowserUrl(new URL(value).href).url;
242
249
  }
243
- catch {
250
+ catch (cause) {
251
+ // Non-URL sources are preserved verbatim.
252
+ void cause;
244
253
  return value;
245
254
  }
246
255
  };
247
256
  const resolveOriginalSource = (specifier, base) => {
257
+ if (!isUrlLikeModuleSpecifier(specifier))
258
+ return null;
248
259
  try {
249
260
  return sanitizeSource(new URL(specifier, base).href);
250
261
  }
251
- catch {
262
+ catch (cause) {
263
+ // Unresolvable source specifiers are represented by null.
264
+ void cause;
252
265
  return null;
253
266
  }
254
267
  };
@@ -0,0 +1,81 @@
1
+ import { z } from "incur";
2
+ import { AndroidAnalysisService } from "../application/AndroidAnalysisService.js";
3
+ import { JadxProvider } from "../android/JadxProvider.js";
4
+ import { CLI_COMMANDS } from "../cliCommandNames.js";
5
+ import { logCliCommand } from "../cliLogging.js";
6
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
7
+ import { withCommandCancellation } from "./commandCancellation.js";
8
+ /** Expose the same explicit APK requests through one-shot CLI commands. */
9
+ export const registerAndroidCommands = (cli, logger, environment) => {
10
+ const service = new AndroidAnalysisService(new JadxProvider(environment));
11
+ const execute = (name, operation, input) => withCommandCancellation((signal) => logCliCommand(logger, name, async () => {
12
+ const result = await service.execute(operation, input, { signal });
13
+ return result.ok ? result.value : projectAnalysisError(result.error);
14
+ }));
15
+ const path = z.string().describe("Local standalone APK path");
16
+ const className = z.string().describe("Exact fully qualified class name");
17
+ cli.command(CLI_COMMANDS.inspectAndroidPackage, {
18
+ description: "Inspect APK declarations and decoded manifest without executing it",
19
+ args: z.object({ path }),
20
+ run: ({ args }) => execute(CLI_COMMANDS.inspectAndroidPackage, "inspect_android_package", args),
21
+ });
22
+ cli.command(CLI_COMMANDS.searchAndroidClasses, {
23
+ description: "Search APK class names; empty query inventories all classes",
24
+ args: z.object({
25
+ path,
26
+ query: z
27
+ .string()
28
+ .describe("Case-sensitive class-name substring; empty lists all classes"),
29
+ }),
30
+ run: ({ args }) => execute(CLI_COMMANDS.searchAndroidClasses, "search_android_classes", args),
31
+ });
32
+ cli.command(CLI_COMMANDS.inspectAndroidClass, {
33
+ description: "Inspect one exact APK class's member inventory",
34
+ args: z.object({ path, className }),
35
+ run: ({ args }) => execute(CLI_COMMANDS.inspectAndroidClass, "inspect_android_class", {
36
+ path: args.path,
37
+ class_name: args.className,
38
+ }),
39
+ });
40
+ cli.command(CLI_COMMANDS.inspectAndroidMethod, {
41
+ description: "Decompile one APK method with explicit overload selection",
42
+ args: z.object({
43
+ path,
44
+ className,
45
+ methodName: z.string().describe("Exact declared method name"),
46
+ }),
47
+ options: z.object({
48
+ overloadIndex: z
49
+ .number()
50
+ .int()
51
+ .nonnegative()
52
+ .optional()
53
+ .describe("Explicit zero-based index among same-name methods; required when ambiguous"),
54
+ }),
55
+ run: ({ args, options }) => execute(CLI_COMMANDS.inspectAndroidMethod, "inspect_android_method", {
56
+ path: args.path,
57
+ class_name: args.className,
58
+ method_name: args.methodName,
59
+ ...(options.overloadIndex === undefined
60
+ ? {}
61
+ : { overload_index: options.overloadIndex }),
62
+ }),
63
+ });
64
+ cli.command(CLI_COMMANDS.traceAndroidReferences, {
65
+ description: "Trace incoming APK class or unique-method references",
66
+ args: z.object({ path, className }),
67
+ options: z.object({
68
+ methodName: z
69
+ .string()
70
+ .optional()
71
+ .describe("Unique declared method name; omit for class references"),
72
+ }),
73
+ run: ({ args, options }) => execute(CLI_COMMANDS.traceAndroidReferences, "trace_android_references", {
74
+ path: args.path,
75
+ class_name: args.className,
76
+ ...(options.methodName === undefined
77
+ ? {}
78
+ : { method_name: options.methodName }),
79
+ }),
80
+ });
81
+ };
@@ -1,20 +1,22 @@
1
1
  import { Cli, z } from "incur";
2
- import { compareApplicationVersionsEvidenceValidated, compareJavaScriptExportShapesEvidenceValidated, compareSourceToBundleEvidenceValidated, traceApplicationFeatureEvidenceValidated, } from "./application/JavaScriptApplicationWorkflowService.js";
3
- import { traceJavaScriptSemanticsEvidenceValidated } from "./application/JavaScriptSemanticTraceService.js";
4
- import { evaluateReconstructionCoverage, reconstructionCoverageEvaluationInputSchema, } from "./application/ReconstructionCoverageService.js";
5
- import { buildReconstructionObligationLedgerEvidenceValidated } from "./application/ReconstructionObligationLedgerService.js";
6
- import { CLI_COMMANDS } from "./cliCommandNames.js";
7
- import { parseCliJsonInput } from "./cliJsonInput.js";
8
- import { logCliCommand } from "./cliLogging.js";
9
- import { AnalysisInputError, projectAnalysisError, } from "./domain/errors.js";
10
- import { jsonValueSchema } from "./domain/jsonValue.js";
11
- import { traceApplicationFeatureInputSchema } from "./domain/javascriptFeatureTraceSchemas.js";
12
- import { traceJavaScriptSemanticsInputSchema } from "./domain/javascriptSemanticTraceSchemas.js";
13
- import { compareApplicationVersionsInputSchema } from "./domain/javascriptApplicationVersionComparisonSchemas.js";
14
- import { compareSourceToBundleInputSchema } from "./domain/sourceToBundleComparisonSchemas.js";
15
- import { compareJavaScriptExportShapesInputSchema } from "./domain/javascriptExportShapeComparisonSchemas.js";
16
- import { projectInputIssues } from "./domain/inputIssueProjection.js";
17
- import { reconstructionObligationLedgerInputSchema } from "./domain/reconstructionObligationLedgerSchemas.js";
2
+ import { compareApplicationVersionsEvidenceValidated, compareJavaScriptExportShapesEvidenceValidated, compareSourceToBundleEvidenceValidated, traceApplicationFeatureEvidenceValidated, } from "../application/JavaScriptApplicationWorkflowService.js";
3
+ import { traceJavaScriptSemanticsEvidenceValidated } from "../application/JavaScriptSemanticTraceService.js";
4
+ import { evaluateReconstructionCoverage, reconstructionCoverageEvaluationInputSchema, } from "../application/ReconstructionCoverageService.js";
5
+ import { buildReconstructionObligationLedgerEvidenceValidated } from "../application/ReconstructionObligationLedgerService.js";
6
+ import { CLI_COMMANDS } from "../cliCommandNames.js";
7
+ import { parseCliJsonInput } from "../cliJsonInput.js";
8
+ import { logCliCommand } from "../cliLogging.js";
9
+ import { AnalysisInputError } from "../domain/analysisErrorCore.js";
10
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
11
+ import {} from "../domain/analysisErrorBase.js";
12
+ import { jsonValueSchema } from "../domain/jsonValue.js";
13
+ import { traceApplicationFeatureInputSchema } from "../domain/javascriptFeatureTraceSchemas.js";
14
+ import { traceJavaScriptSemanticsInputSchema } from "../domain/javascriptSemanticTraceSchemas.js";
15
+ import { compareApplicationVersionsInputSchema } from "../domain/javascriptApplicationVersionComparisonSchemas.js";
16
+ import { compareSourceToBundleInputSchema } from "../domain/sourceToBundleComparisonSchemas.js";
17
+ import { compareJavaScriptExportShapesInputSchema } from "../domain/javascriptExportShapeComparisonSchemas.js";
18
+ import { projectInputIssues } from "../domain/inputIssueProjection.js";
19
+ import { reconstructionObligationLedgerInputSchema } from "../domain/reconstructionObligationLedgerSchemas.js";
18
20
  /** Register CLI equivalents of provider-neutral application graph workflows. */
19
21
  export const registerApplicationCommands = (cli, logger) => {
20
22
  registerJsonCommand({
@@ -1,14 +1,15 @@
1
1
  import { Cli, z } from "incur";
2
- import { browserContext, browserCliError } from "./cliBrowserContext.js";
3
- import { browserScopeOptions } from "./cliObservationOptions.js";
4
- import { captureWebScreenshot, compareWebCaptureEvidence, compareWebScreenshotEvidence, discoverWebMcpTools, } from "./application/BrowserObservationService.js";
5
- import { CdpBrowserProvider } from "./browser/CdpBrowserProvider.js";
6
- import { logCliCommand } from "./cliLogging.js";
7
- import { AnalysisInputError } from "./domain/errors.js";
8
- import { browserCaptureComparisonInputSchema } from "./domain/browserCaptureComparison.js";
9
- import { discoverWebMcpToolsInputSchema } from "./domain/webMcpDiscovery.js";
10
- import { captureWebScreenshotInputSchema, compareWebScreenshotsInputSchema, } from "./domain/webScreenshot.js";
11
- import { CLI_COMMANDS } from "./cliCommandNames.js";
2
+ import { browserContext, browserCliError } from "../cliBrowserContext.js";
3
+ import { browserScopeOptions } from "../cliObservationOptions.js";
4
+ import { captureWebScreenshot, compareWebCaptureEvidence, compareWebScreenshotEvidence, discoverWebMcpTools, } from "../application/BrowserObservationService.js";
5
+ import { CdpBrowserProvider } from "../browser/CdpBrowserProvider.js";
6
+ import { logCliCommand } from "../cliLogging.js";
7
+ import { AnalysisInputError } from "../domain/analysisErrorCore.js";
8
+ import { browserCaptureComparisonInputSchema } from "../domain/browserCaptureComparison.js";
9
+ import { discoverWebMcpToolsInputSchema } from "../domain/webMcpDiscovery.js";
10
+ import { captureWebScreenshotInputSchema, compareWebScreenshotsInputSchema, } from "../domain/webScreenshot.js";
11
+ import { safeParseJson } from "../domain/safeJson.js";
12
+ import { CLI_COMMANDS } from "../cliCommandNames.js";
12
13
  /** Register WebMCP, capture-diff, and screenshot CLI equivalents. */
13
14
  export const registerAdvancedBrowserCommands = (cli, logger) => {
14
15
  registerWebMcp(cli, logger);
@@ -135,11 +136,7 @@ const registerScreenshotDiff = (cli, logger) => {
135
136
  });
136
137
  };
137
138
  const parseJson = (value) => {
138
- try {
139
- return JSON.parse(value);
140
- }
141
- catch {
142
- return undefined;
143
- }
139
+ const parsed = safeParseJson(value);
140
+ return parsed.ok ? parsed.value : undefined;
144
141
  };
145
142
  const inputError = (operation) => browserCliError(new AnalysisInputError(operation));
@@ -1,13 +1,13 @@
1
1
  import { Cli, z } from "incur";
2
- import { browserContext, browserCliError } from "./cliBrowserContext.js";
3
- import { analyzeWebBundle, inspectWebPage, listBrowserTargets, observeWebSession, } from "./application/BrowserObservationService.js";
4
- import { logCliCommand } from "./cliLogging.js";
5
- import { inspectWebPageInputSchema, listBrowserTargetsInputSchema, } from "./domain/browserObservation.js";
6
- import { analyzeWebBundleInputSchema } from "./domain/webBundleAnalysis.js";
7
- import { observeWebSessionInputSchema } from "./domain/browserSession.js";
8
- import { AnalysisInputError } from "./domain/errors.js";
9
- import { CLI_COMMANDS } from "./cliCommandNames.js";
10
- import { browserPageInspectionOptions, browserScopeOptions, observationDuration, } from "./cliObservationOptions.js";
2
+ import { browserContext, browserCliError } from "../cliBrowserContext.js";
3
+ import { analyzeWebBundle, inspectWebPage, listBrowserTargets, observeWebSession, } from "../application/BrowserObservationService.js";
4
+ import { logCliCommand } from "../cliLogging.js";
5
+ import { inspectWebPageInputSchema, listBrowserTargetsInputSchema, } from "../domain/browserObservation.js";
6
+ import { analyzeWebBundleInputSchema } from "../domain/webBundleAnalysis.js";
7
+ import { observeWebSessionInputSchema } from "../domain/browserSession.js";
8
+ import { AnalysisInputError } from "../domain/analysisErrorCore.js";
9
+ import { CLI_COMMANDS } from "../cliCommandNames.js";
10
+ import { browserPageInspectionOptions, browserScopeOptions, observationDuration, } from "../cliObservationOptions.js";
11
11
  /** Register CLI equivalents of the passive browser MCP tools. */
12
12
  export const registerBrowserCommands = (cli, logger) => {
13
13
  registerTargetList(cli, logger);
@@ -0,0 +1,24 @@
1
+ /** Translate one-shot CLI interrupts into awaited cleanup and conventional exit codes. */
2
+ export const withCommandCancellation = async (operation, host = process) => {
3
+ const controller = new AbortController();
4
+ let exitCode;
5
+ const interrupt = () => {
6
+ exitCode ??= 130;
7
+ controller.abort();
8
+ };
9
+ const terminate = () => {
10
+ exitCode ??= 143;
11
+ controller.abort();
12
+ };
13
+ host.on("SIGINT", interrupt);
14
+ host.on("SIGTERM", terminate);
15
+ try {
16
+ return await operation(controller.signal);
17
+ }
18
+ finally {
19
+ host.off("SIGINT", interrupt);
20
+ host.off("SIGTERM", terminate);
21
+ if (exitCode !== undefined)
22
+ host.exitCode = exitCode;
23
+ }
24
+ };