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
@@ -1,5 +1,14 @@
1
- import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisTimeoutError, ArtifactOperationError, BinaryTargetError, BrowserObservationError, EvidenceFileError, EvidenceReferenceError, HopperCancelledError, HopperProcessError, HopperRemoteError, HopperTimeoutError, ProviderAdapterError, ProviderSelectionError, UnknownRegistryError, } from "./errors.js";
2
1
  import { analysisErrorCategory, analysisErrorRemediationAction, analysisErrorUserMessage, assertKnownAnalysisErrorTag, } from "./analysisErrorPresentation.js";
2
+ import { AnalysisCancelledError, AnalysisCapabilityUnavailableError, AnalysisInputError, AnalysisOutputError, AnalysisTimeoutError, } from "./analysisErrorCore.js";
3
+ import { ArtifactOperationError } from "./artifactOperationError.js";
4
+ import { BinaryTargetError } from "./configurationErrors.js";
5
+ import { BrowserObservationError } from "./browserObservationError.js";
6
+ import { EvidenceFileError, EvidenceReferenceError } from "./evidenceErrors.js";
7
+ import { HopperCancelledError, HopperProcessError, HopperRemoteError, HopperTimeoutError, } from "./hopperErrors.js";
8
+ import { ProviderAdapterError } from "./providerAdapterError.js";
9
+ import { ProviderSelectionError } from "./providerSelectionError.js";
10
+ import { UnknownRegistryError } from "./unknownRegistryError.js";
11
+ import {} from "./analysisErrorBase.js";
3
12
  /** Project expected failures into exhaustive, secret-safe caller fields. */
4
13
  export const projectAnalysisError = (error) => {
5
14
  assertKnownAnalysisErrorTag(error._tag);
@@ -111,6 +120,8 @@ const errorDetails = (error) => requestErrorDetails(error) ??
111
120
  providerErrorDetails(error) ??
112
121
  lifecycleErrorDetails(error);
113
122
  const requestErrorDetails = (error) => {
123
+ if (error instanceof AnalysisOutputError)
124
+ return { operation: error.operation, reason: error.reason };
114
125
  if (error instanceof AnalysisInputError && error.issues.length > 0)
115
126
  return {
116
127
  operation: error.operation,
@@ -154,7 +165,11 @@ const artifactStateErrorDetails = (error) => {
154
165
  };
155
166
  const providerErrorDetails = (error) => {
156
167
  if (error instanceof AnalysisCapabilityUnavailableError)
157
- return { provider_id: error.providerId, operation: error.operation };
168
+ return {
169
+ provider_id: error.providerId,
170
+ operation: error.operation,
171
+ reason: error.reason,
172
+ };
158
173
  if (error instanceof ProviderSelectionError)
159
174
  return {
160
175
  operation: error.operation,
@@ -261,7 +276,13 @@ const lifecycleErrorDetails = (error) => {
261
276
  error.userCategory === "cancelled")
262
277
  return { operation: "process_capture", cleanup: "complete" };
263
278
  if (error instanceof BinaryTargetError)
264
- return { path: error.path };
279
+ return {
280
+ path: error.path,
281
+ reason: error.reason,
282
+ ...(error.constraint === undefined
283
+ ? {}
284
+ : { constraint: error.constraint }),
285
+ };
265
286
  return undefined;
266
287
  };
267
288
  const RETRYABLE_CODES = new Set([
@@ -14,6 +14,7 @@ const formatSchema = z.enum([
14
14
  "elf",
15
15
  "pe",
16
16
  "dos-mz",
17
+ "dos-com",
17
18
  "zip",
18
19
  "ipa",
19
20
  "apk",
@@ -0,0 +1,141 @@
1
+ import { z } from "zod";
2
+ const target = {
3
+ path: z
4
+ .string()
5
+ .min(1)
6
+ .describe("Local APK path; the target is never executed"),
7
+ };
8
+ const classTarget = {
9
+ ...target,
10
+ class_name: z.string().min(1).describe("Exact fully qualified class name"),
11
+ };
12
+ /** Caller intent for static Android inspection, independent of its engine. */
13
+ export const androidInputSchemas = {
14
+ inspect_android_package: z.strictObject(target),
15
+ search_android_classes: z.strictObject({
16
+ ...target,
17
+ query: z
18
+ .string()
19
+ .describe("Case-sensitive class-name substring; empty lists all classes"),
20
+ }),
21
+ inspect_android_class: z.strictObject(classTarget),
22
+ inspect_android_method: z.strictObject({
23
+ ...classTarget,
24
+ method_name: z.string().min(1),
25
+ overload_index: z
26
+ .number()
27
+ .int()
28
+ .nonnegative()
29
+ .optional()
30
+ .describe("Explicit index among same-name methods; required when ambiguous"),
31
+ }),
32
+ trace_android_references: z.strictObject({
33
+ ...classTarget,
34
+ method_name: z
35
+ .string()
36
+ .min(1)
37
+ .optional()
38
+ .describe("Omit for class references; ambiguous overloaded methods are unsupported"),
39
+ }),
40
+ };
41
+ /** Validate operation and input together so their types remain correlated. */
42
+ export const androidRequestSchema = z.discriminatedUnion("operation", [
43
+ z.strictObject({
44
+ operation: z.literal("inspect_android_package"),
45
+ input: androidInputSchemas.inspect_android_package,
46
+ }),
47
+ z.strictObject({
48
+ operation: z.literal("search_android_classes"),
49
+ input: androidInputSchemas.search_android_classes,
50
+ }),
51
+ z.strictObject({
52
+ operation: z.literal("inspect_android_class"),
53
+ input: androidInputSchemas.inspect_android_class,
54
+ }),
55
+ z.strictObject({
56
+ operation: z.literal("inspect_android_method"),
57
+ input: androidInputSchemas.inspect_android_method,
58
+ }),
59
+ z.strictObject({
60
+ operation: z.literal("trace_android_references"),
61
+ input: androidInputSchemas.trace_android_references,
62
+ }),
63
+ ]);
64
+ const textCoverage = z.strictObject({
65
+ status: z.enum(["complete", "partial"]),
66
+ text: z.string(),
67
+ reported_total_bytes: z.number().int().nonnegative().nullable(),
68
+ });
69
+ const method = z.strictObject({
70
+ name: z.string(),
71
+ reported_signature: z.string(),
72
+ overload_index: z.number().int().nonnegative(),
73
+ is_constructor: z.boolean(),
74
+ dex_descriptor: z.null(),
75
+ });
76
+ const engine = z.strictObject({
77
+ name: z.string().min(1),
78
+ version: z.string().nullable(),
79
+ artifact_sha256: z.string().regex(/^[a-f0-9]{64}$/u),
80
+ source_revision: z.string().nullable(),
81
+ worker_count: z.number().int().positive(),
82
+ heap_limit_mib: z.number().int().positive().nullable(),
83
+ });
84
+ const common = { engine };
85
+ /** Portable observations with explicit decompiler and identity limitations. */
86
+ export const androidResultSchemas = {
87
+ inspect_android_package: z.strictObject({
88
+ ...common,
89
+ package_name: z.string().nullable(),
90
+ version_name: z.string().nullable(),
91
+ version_code: z.string().nullable(),
92
+ min_sdk: z.string().nullable(),
93
+ target_sdk: z.string().nullable(),
94
+ permissions: z.array(z.string()),
95
+ manifest: textCoverage,
96
+ class_count: z.number().int().nonnegative(),
97
+ resource_count: z.number().int().nonnegative(),
98
+ signature_verification: z.literal("not_performed"),
99
+ }),
100
+ search_android_classes: z.strictObject({
101
+ ...common,
102
+ query: z.string(),
103
+ total_classes: z.number().int().nonnegative(),
104
+ matches: z.array(z.string()),
105
+ coverage: z.literal("complete"),
106
+ }),
107
+ inspect_android_class: z.strictObject({
108
+ ...common,
109
+ class_name: z.string(),
110
+ methods: z.array(method),
111
+ fields: z.array(z.strictObject({ name: z.string(), reported_type: z.string() })),
112
+ inner_classes: z.array(z.string()),
113
+ }),
114
+ inspect_android_method: z.strictObject({
115
+ ...common,
116
+ class_name: z.string(),
117
+ method: method,
118
+ overload_count: z.number().int().positive(),
119
+ representation: z.enum(["java", "smali"]),
120
+ body_status: z.enum(["available", "not_available"]),
121
+ fell_back: z.boolean(),
122
+ markers: z.array(z.string()),
123
+ source: textCoverage,
124
+ }),
125
+ trace_android_references: z.strictObject({
126
+ ...common,
127
+ class_name: z.string(),
128
+ method_name: z.string().nullable(),
129
+ total: z.number().int().nonnegative(),
130
+ references: z.array(z.strictObject({
131
+ kind: z.string(),
132
+ name: z.string(),
133
+ reported_full_name: z.string(),
134
+ containing_class: z.string(),
135
+ top_class: z.string(),
136
+ source_line: z.null(),
137
+ dex_offset: z.null(),
138
+ })),
139
+ coverage: z.literal("complete"),
140
+ }),
141
+ };
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { jsonValueSchema } from "./jsonValue.js";
3
- import { AnalysisOutputError } from "./errors.js";
3
+ import { AnalysisOutputError } from "./analysisErrorCore.js";
4
4
  /** Caller-controlled page bounds for compiled Apple asset metadata. */
5
5
  export const appleAssetCatalogInputSchema = z.strictObject({
6
6
  offset: z.number().int().min(0).default(0),
@@ -42,6 +42,7 @@ const artifactFormatSchema = z.enum([
42
42
  "elf",
43
43
  "pe",
44
44
  "dos-mz",
45
+ "dos-com",
45
46
  "hopper",
46
47
  "analysis-database",
47
48
  "ipa",
@@ -1,7 +1,7 @@
1
- import { createHash } from "node:crypto";
2
- import canonicalize from "canonicalize";
3
1
  import { z } from "zod";
4
2
  import { artifactInventoryResultSchema, } from "./artifactGraph.js";
3
+ import { canonicalDigest } from "./comparisonSemantics.js";
4
+ import { uniqueSorted } from "./canonicalOrdering.js";
5
5
  import { evidenceSchema, parseEvidence } from "./evidence.js";
6
6
  import { jsonValueSchema } from "./jsonValue.js";
7
7
  import { prefixedDigestSchema } from "./../domain/digests.js";
@@ -137,10 +137,10 @@ export const createArtifactInspection = (inventoryInput) => {
137
137
  },
138
138
  substeps: [
139
139
  {
140
- substep_id: `ais_${digestCanonical({
140
+ substep_id: `ais_${canonicalDigest({
141
141
  operation: "inventory_artifact",
142
142
  evidence_id: inventoryEvidence.evidence_id,
143
- })}`,
143
+ }, "Artifact inspection")}`,
144
144
  operation: "inventory_artifact",
145
145
  status: "completed",
146
146
  evidence_id: inventoryEvidence.evidence_id,
@@ -175,7 +175,7 @@ export const createArtifactInspection = (inventoryInput) => {
175
175
  };
176
176
  return artifactInspectionResultSchema.parse({
177
177
  ...semantic,
178
- inspection_id: `ai_${digestCanonical(semantic)}`,
178
+ inspection_id: `ai_${canonicalDigest(semantic, "Artifact inspection")}`,
179
179
  });
180
180
  };
181
181
  const parseInventoryEvidence = (input) => {
@@ -197,7 +197,10 @@ const observation = (kind, subject, value, evidenceId) => {
197
197
  value: jsonValueSchema.parse(value),
198
198
  evidence_id: evidenceId,
199
199
  };
200
- return { observation_id: `aio_${digestCanonical(semantic)}`, ...semantic };
200
+ return {
201
+ observation_id: `aio_${canonicalDigest(semantic, "Artifact inspection")}`,
202
+ ...semantic,
203
+ };
201
204
  };
202
205
  const allRelationships = (inventory, evidenceId) => inventory.edges.map((edge) => {
203
206
  const semantic = {
@@ -209,7 +212,7 @@ const allRelationships = (inventory, evidenceId) => inventory.edges.map((edge) =
209
212
  evidence_id: evidenceId,
210
213
  };
211
214
  return {
212
- relationship_id: `air_${digestCanonical(semantic)}`,
215
+ relationship_id: `air_${canonicalDigest(semantic, "Artifact inspection")}`,
213
216
  ...semantic,
214
217
  };
215
218
  });
@@ -230,7 +233,10 @@ const allHypotheses = (inventory, evidenceId) => {
230
233
  basis_evidence_ids: [evidenceId],
231
234
  limitation: "Format classification proposes a bounded follow-up; it is not semantic proof.",
232
235
  };
233
- return { hypothesis_id: `aih_${digestCanonical(semantic)}`, ...semantic };
236
+ return {
237
+ hypothesis_id: `aih_${canonicalDigest(semantic, "Artifact inspection")}`,
238
+ ...semantic,
239
+ };
234
240
  });
235
241
  };
236
242
  const contradictions = (inventory, evidenceId) => inventory.integrity_contradictions.map((value) => {
@@ -242,7 +248,7 @@ const contradictions = (inventory, evidenceId) => inventory.integrity_contradict
242
248
  evidence_id: evidenceId,
243
249
  };
244
250
  return {
245
- contradiction_id: `aic_${digestCanonical(semantic)}`,
251
+ contradiction_id: `aic_${canonicalDigest(semantic, "Artifact inspection")}`,
246
252
  ...semantic,
247
253
  };
248
254
  });
@@ -301,17 +307,13 @@ const branch = (reason, detail, nextProbe, evidenceId) => {
301
307
  next_probe: nextProbe,
302
308
  evidence_id: evidenceId,
303
309
  };
304
- return { branch_id: `aib_${digestCanonical(semantic)}`, ...semantic };
310
+ return {
311
+ branch_id: `aib_${canonicalDigest(semantic, "Artifact inspection")}`,
312
+ ...semantic,
313
+ };
305
314
  };
306
315
  const inspectionCoverage = (_inventory, omissions) => {
307
316
  if (Object.values(omissions).some((count) => count > 0))
308
317
  return "truncated";
309
318
  return "complete-within-substeps";
310
319
  };
311
- const digestCanonical = (value) => {
312
- const encoded = canonicalize(value);
313
- if (encoded === undefined)
314
- throw new TypeError("Artifact inspection could not canonicalize");
315
- return createHash("sha256").update(encoded).digest("hex");
316
- };
317
- const uniqueSorted = (values) => [...new Set(values)].sort((left, right) => left < right ? -1 : left > right ? 1 : 0);
@@ -1,6 +1,5 @@
1
- import { createHash } from "node:crypto";
2
- import canonicalize from "canonicalize";
3
1
  import { artifactInventoryResultSchema, } from "./artifactGraph.js";
2
+ import { canonicalDigest, canonicalJson } from "./comparisonSemantics.js";
4
3
  import { parseEvidence } from "./evidence.js";
5
4
  import { artifactInspectionResultSchema } from "./artifactInspection.js";
6
5
  /** Parse, merge, and verify inventory Evidence pages. */
@@ -29,7 +28,8 @@ const validateInventoryPage = (inventory) => {
29
28
  assertUnique(inventory.occurrences.map(({ logical_path: path }) => path), "logical path");
30
29
  assertUnique(inventory.edges.map(({ edge_id: id }) => id), "edge ID");
31
30
  for (const node of inventory.nodes)
32
- if (node.artifact_id !== `art_${digestCanonical({ sha256: node.sha256 })}`)
31
+ if (node.artifact_id !==
32
+ `art_${canonicalDigest({ sha256: node.sha256 }, "Artifact inventory")}`)
33
33
  throw new TypeError("Artifact node ID is not content-addressed");
34
34
  };
35
35
  const assembleInventorySet = (pages) => {
@@ -38,16 +38,17 @@ const assembleInventorySet = (pages) => {
38
38
  const first = pages[0];
39
39
  if (first === undefined)
40
40
  throw new TypeError("Artifact inventory requires Evidence pages");
41
- const manifestJson = canonicalJson(first.inventory.manifest);
41
+ const manifestJson = canonicalJson(first.inventory.manifest, "Artifact inventory");
42
42
  const nodes = new Map();
43
43
  const occurrences = new Map();
44
44
  const paths = new Map();
45
45
  const edges = new Map();
46
46
  for (const page of pages) {
47
- if (canonicalJson(page.inventory.manifest) !== manifestJson)
47
+ if (canonicalJson(page.inventory.manifest, "Artifact inventory") !==
48
+ manifestJson)
48
49
  throw new TypeError("Artifact inventory pages do not share one manifest");
49
- if (canonicalJson(page.inventory.integrity_contradictions) !==
50
- canonicalJson(first.inventory.integrity_contradictions))
50
+ if (canonicalJson(page.inventory.integrity_contradictions, "Artifact inventory") !==
51
+ canonicalJson(first.inventory.integrity_contradictions, "Artifact inventory"))
51
52
  throw new TypeError("Artifact inventory pages do not share integrity contradictions");
52
53
  for (const node of page.inventory.nodes)
53
54
  mergeExact(nodes, node.artifact_id, node, "node");
@@ -99,27 +100,27 @@ const validateCompleteInventory = (inventory) => {
99
100
  if (!nodeIds.has(contradiction.parent_artifact_id) ||
100
101
  !occurrenceIds.has(contradiction.occurrence_id))
101
102
  throw new TypeError("Integrity contradiction references a missing graph member");
102
- const expectedId = `ic_${digestCanonical({
103
+ const expectedId = `ic_${canonicalDigest({
103
104
  root_artifact_id: inventory.manifest.root_artifact_id,
104
105
  logical_path: contradiction.logical_path,
105
106
  declared_sha256: contradiction.declared_sha256,
106
107
  observed_sha256: contradiction.observed_sha256,
107
- })}`;
108
+ }, "Artifact inventory")}`;
108
109
  if (contradiction.contradiction_id !== expectedId)
109
110
  throw new TypeError("Integrity contradiction ID does not match its identity");
110
111
  }
111
- const graphSha256 = digestCanonical({
112
+ const graphSha256 = canonicalDigest({
112
113
  nodes: inventory.nodes,
113
114
  occurrences: inventory.occurrences,
114
115
  edges: inventory.edges,
115
116
  integrity_contradictions: inventory.integrityContradictions,
116
- });
117
+ }, "Artifact inventory");
117
118
  if (graphSha256 !== inventory.manifest.graph_sha256)
118
119
  throw new TypeError("Artifact graph commitment does not match its members");
119
- const manifestId = `agm_${digestCanonical({
120
+ const manifestId = `agm_${canonicalDigest({
120
121
  root_artifact_id: inventory.manifest.root_artifact_id,
121
122
  graph_sha256: graphSha256,
122
- })}`;
123
+ }, "Artifact inventory")}`;
123
124
  if (manifestId !== inventory.manifest.manifest_id)
124
125
  throw new TypeError("Artifact manifest ID does not match its commitment");
125
126
  };
@@ -130,12 +131,12 @@ const validateOccurrence = (occurrence, inventory, nodeIds, occurrenceIds) => {
130
131
  !occurrenceIds.has(occurrence.parent_occurrence_id))
131
132
  throw new TypeError("Artifact occurrence references a missing parent");
132
133
  const expectedId = occurrence.logical_path === "."
133
- ? `occ_${digestCanonical({ root: inventory.manifest.root_artifact_id })}`
134
- : `occ_${digestCanonical({
134
+ ? `occ_${canonicalDigest({ root: inventory.manifest.root_artifact_id }, "Artifact inventory")}`
135
+ : `occ_${canonicalDigest({
135
136
  root_artifact_id: inventory.manifest.root_artifact_id,
136
137
  logical_path: occurrence.logical_path,
137
138
  entry_kind: occurrence.entry_kind,
138
- })}`;
139
+ }, "Artifact inventory")}`;
139
140
  if (occurrence.occurrence_id !== expectedId)
140
141
  throw new TypeError("Artifact occurrence ID does not match its identity");
141
142
  };
@@ -151,13 +152,14 @@ const validateEdge = (edge, nodeIds, occurrenceIds) => {
151
152
  occurrence_id: edge.occurrence_id,
152
153
  logical_path: edge.logical_path,
153
154
  };
154
- if (edge.edge_id !== `edge_${digestCanonical(semantic)}`)
155
+ if (edge.edge_id !== `edge_${canonicalDigest(semantic, "Artifact inventory")}`)
155
156
  throw new TypeError("Artifact edge ID does not match its identity");
156
157
  };
157
158
  const mergeExact = (output, key, value, label) => {
158
159
  const previous = output.get(key);
159
160
  if (previous !== undefined &&
160
- canonicalJson(previous) !== canonicalJson(value))
161
+ canonicalJson(previous, "Artifact inventory") !==
162
+ canonicalJson(value, "Artifact inventory"))
161
163
  throw new TypeError(`Artifact inventory has conflicting ${label} pages`);
162
164
  output.set(key, value);
163
165
  };
@@ -165,10 +167,3 @@ const assertUnique = (values, label) => {
165
167
  if (new Set(values).size !== values.length)
166
168
  throw new TypeError(`Artifact inventory contains a duplicate ${label}`);
167
169
  };
168
- const digestCanonical = (value) => createHash("sha256").update(canonicalJson(value)).digest("hex");
169
- const canonicalJson = (value) => {
170
- const encoded = canonicalize(value);
171
- if (encoded === undefined)
172
- throw new TypeError("Artifact inventory could not canonicalize graph data");
173
- return encoded;
174
- };
@@ -0,0 +1,16 @@
1
+ import { AnalysisError } from "./analysisErrorBase.js";
2
+ /** Artifact inventory or extraction failed a typed safety boundary. */
3
+ export class ArtifactOperationError extends AnalysisError {
4
+ operation;
5
+ reason;
6
+ artifactDetails;
7
+ _tag = "ArtifactOperationError";
8
+ constructor(operation, reason, artifactDetails) {
9
+ super(artifactDetails === undefined
10
+ ? `Artifact ${operation} failed: ${reason}`
11
+ : `Artifact ${operation} failed: ${reason} at ${artifactDetails.logicalPath} (declared_sha256=${artifactDetails.declaredSha256 ?? "unavailable"}, calculated_sha256=${artifactDetails.calculatedSha256 ?? "unavailable"}, unpacked=${String(artifactDetails.unpacked)})`);
12
+ this.operation = operation;
13
+ this.reason = reason;
14
+ this.artifactDetails = artifactDetails;
15
+ }
16
+ }
@@ -5,7 +5,9 @@ const parseExactOrigin = (value) => {
5
5
  try {
6
6
  url = new URL(value);
7
7
  }
8
- catch {
8
+ catch (cause) {
9
+ // Invalid input is represented by the undefined return.
10
+ void cause;
9
11
  return undefined;
10
12
  }
11
13
  if ((url.protocol !== "http:" && url.protocol !== "https:") ||
@@ -44,7 +46,9 @@ export const browserEndpointSchema = z
44
46
  try {
45
47
  url = new URL(value);
46
48
  }
47
- catch {
49
+ catch (cause) {
50
+ // Invalid input is reported through the zod issue.
51
+ void cause;
48
52
  context.addIssue({ code: "custom", message: "Invalid CDP endpoint URL" });
49
53
  return z.NEVER;
50
54
  }
@@ -122,7 +126,9 @@ export const sanitizeBrowserUrl = (value) => {
122
126
  try {
123
127
  parsed = new URL(value);
124
128
  }
125
- catch {
129
+ catch (cause) {
130
+ // Unparseable input is preserved verbatim in the sanitized result.
131
+ void cause;
126
132
  return {
127
133
  url: value,
128
134
  origin: null,
@@ -165,7 +171,9 @@ const removeUrlUserInfo = (value, parsed) => {
165
171
  ? candidate
166
172
  : credentialFreeHref(parsed);
167
173
  }
168
- catch {
174
+ catch (cause) {
175
+ // Fallback to the already-sanitized href when the candidate is invalid.
176
+ void cause;
169
177
  return credentialFreeHref(parsed);
170
178
  }
171
179
  };
@@ -0,0 +1,23 @@
1
+ import { AnalysisError } from "./analysisErrorBase.js";
2
+ import { AnalysisCancelledError } from "./analysisErrorCore.js";
3
+ /** A bounded passive browser observation failed at its CDP boundary. */
4
+ export class BrowserObservationError extends AnalysisError {
5
+ operation;
6
+ reason;
7
+ _tag = "BrowserObservationError";
8
+ cleanupIncomplete;
9
+ cleanupResources;
10
+ userCategory;
11
+ constructor(operation, reason, options) {
12
+ super(`Browser observation ${operation} failed: ${reason}`, options);
13
+ this.operation = operation;
14
+ this.reason = reason;
15
+ this.cleanupIncomplete = reason === "cleanup_failed";
16
+ this.cleanupResources =
17
+ reason === "cleanup_failed" ? ["browser_transport"] : [];
18
+ this.userCategory =
19
+ reason === "cancelled" || options?.cause instanceof AnalysisCancelledError
20
+ ? "cancelled"
21
+ : undefined;
22
+ }
23
+ }
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { browserScenarioActionSchema, browserScenarioBrowserSchema, browserScenarioCaptureSchema, browserScenarioEnvironmentSchema, browserScenarioSecretSchema, browserScenarioStorageSchema, browserScenarioUrlSchema, } from "./browserScenarioValues.js";
3
- export { browserScenarioActionSchema, browserScenarioUrlSchema, browserScenarioValueSchema, } from "./browserScenarioValues.js";
3
+ export {} from "./browserScenarioValues.js";
4
4
  export const browserScenarioInputSchema = z.strictObject({
5
5
  browser: browserScenarioBrowserSchema.describe("Required launch/connect selection. Launch uses the selected executable and an owned temporary profile; connect uses one loopback CDP endpoint and target."),
6
6
  start_url: browserScenarioUrlSchema.describe("Required initial HTTP(S) URL. Query values must be declared separately as public literals or secret references."),
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { browserScenarioCompletenessSchema, browserScenarioEventSchema, browserScenarioStepSchema, } from "./browserScenarioCaptureValues.js";
3
- export { classifyBrowserScenarioCompleteness, browserScenarioCompletenessSchema, browserScenarioEventSchema, browserScenarioStepSchema, browserStepArtifactsSchema, captureStateSchema, } from "./browserScenarioCaptureValues.js";
3
+ export { classifyBrowserScenarioCompleteness, browserScenarioEventSchema, browserScenarioStepSchema, browserStepArtifactsSchema, } from "./browserScenarioCaptureValues.js";
4
4
  /** Step-indexed browser scenario observation. */
5
5
  export const browserScenarioCaptureSchema = z
6
6
  .strictObject({
@@ -1,7 +1,7 @@
1
1
  import {} from "./browserScenarioCapture.js";
2
2
  import { actionState, artifactEvidenceState, captured, eventEvidenceState, eventsFor, screenshotProjection, } from "./browserScenarioDiffEvidence.js";
3
3
  import { browserScenarioDiffSchema, } from "./browserScenarioDiffValues.js";
4
- import { commitBrowserScenarioNormalization, digestCanonicalJson, digestNormalizedScenarioValue, } from "./browserScenarioNormalization.js";
4
+ import { commitBrowserScenarioNormalization, digestNormalizedScenarioValue, } from "./browserScenarioNormalization.js";
5
5
  export { browserScenarioDiffSchema, compareBrowserScenariosInputSchema, } from "./browserScenarioDiffValues.js";
6
6
  /** Compare scenario steps by stable step ID and apply only committed literal rules. */
7
7
  export const compareBrowserScenarios = (input) => {
@@ -1,5 +1,4 @@
1
- import { createHash } from "node:crypto";
2
- import canonicalize from "canonicalize";
1
+ import { canonicalDigest } from "./comparisonSemantics.js";
3
2
  const BUILT_IN_RULES = [
4
3
  "ignore_step_elapsed_ms",
5
4
  "ignore_event_sequence",
@@ -16,17 +15,13 @@ export const commitBrowserScenarioNormalization = (input) => {
16
15
  }))
17
16
  .sort((left, right) => left.rule_id < right.rule_id ? -1 : left.rule_id > right.rule_id ? 1 : 0);
18
17
  const commitment = { built_in_rules: [...BUILT_IN_RULES], rules };
19
- return { ...commitment, sha256: digestCanonicalJson(commitment) };
18
+ return {
19
+ ...commitment,
20
+ sha256: canonicalDigest(commitment, "Browser scenario"),
21
+ };
20
22
  };
21
23
  /** Digest one artifact after applying committed exact-literal rules. */
22
- export const digestNormalizedScenarioValue = (value, artifact, rules) => digestCanonicalJson(normalize(value, artifact, rules));
23
- /** Compute a canonical SHA-256 commitment for JSON-compatible domain data. */
24
- export const digestCanonicalJson = (value) => {
25
- const encoded = canonicalize(value);
26
- if (encoded === undefined)
27
- throw new TypeError("Expected canonical JSON");
28
- return createHash("sha256").update(encoded).digest("hex");
29
- };
24
+ export const digestNormalizedScenarioValue = (value, artifact, rules) => canonicalDigest(normalize(value, artifact, rules), "Browser scenario");
30
25
  const normalize = (value, artifact, rules) => {
31
26
  if (artifact === "screenshot")
32
27
  return value;
@@ -12,7 +12,9 @@ const browserScenarioBaseUrlSchema = z
12
12
  try {
13
13
  url = new URL(value);
14
14
  }
15
- catch {
15
+ catch (cause) {
16
+ // Invalid input is reported through the zod issue.
17
+ void cause;
16
18
  context.addIssue({ code: "custom", message: "Invalid browser URL" });
17
19
  return z.NEVER;
18
20
  }