rea-agents 3.1.0 → 3.2.1

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 (590) hide show
  1. package/README.md +72 -95
  2. package/bridge/ghidra/ReaGhidraBridge.java +609 -841
  3. package/bridge/hopper_bridge.py +99 -344
  4. package/dist/application/AbortablePromise.js +6 -3
  5. package/dist/application/AnalysisSnapshotCache.js +0 -1
  6. package/dist/application/AnalysisSnapshotFiles.js +7 -7
  7. package/dist/application/AndroidApplicationService.js +1 -1
  8. package/dist/application/AppleApplicationService.js +1 -1
  9. package/dist/application/ArtifactExtraction.js +35 -54
  10. package/dist/application/ArtifactExtractionDestination.js +17 -0
  11. package/dist/application/ArtifactGraphConstruction.js +2 -17
  12. package/dist/application/ArtifactInventory/classify.js +2 -6
  13. package/dist/application/ArtifactInventory/hash.js +2 -20
  14. package/dist/application/ArtifactInventory/scanCanonical.js +8 -12
  15. package/dist/application/ArtifactInventory/scanReader.js +69 -51
  16. package/dist/application/ArtifactInventory.js +6 -14
  17. package/dist/application/AuthorizedArtifactInventory.js +3 -13
  18. package/dist/application/BinarySession.js +41 -13
  19. package/dist/application/BinarySessionComposition.js +0 -11
  20. package/dist/application/BinarySessionOpen.js +2 -1
  21. package/dist/application/BinarySessionRecords.js +5 -93
  22. package/dist/application/BinarySessionStatus.js +5 -16
  23. package/dist/application/BinaryTargetResolver.js +216 -0
  24. package/dist/application/BrowserEvidence.js +42 -58
  25. package/dist/application/BrowserObservationService.js +3 -6
  26. package/dist/application/BrowserScenarioCaptureService.js +3 -6
  27. package/dist/application/BrowserScenarioEvidence.js +3 -3
  28. package/dist/application/CallPathTracing.js +2 -36
  29. package/dist/application/CapabilityInventory.js +10 -15
  30. package/dist/application/ClientConfigurationDocument.js +27 -0
  31. package/dist/application/ClientRegistrationStatus.js +16 -13
  32. package/dist/application/CommandShimReplay.js +14 -1
  33. package/dist/application/DirectAnalysis.js +22 -46
  34. package/dist/application/DirectAnalysisStatus.js +5 -61
  35. package/dist/application/Doctor.js +11 -32
  36. package/dist/application/DoctorDiagnostics.js +1 -2
  37. package/dist/application/DoctorScope.js +1 -1
  38. package/dist/application/ElectronActiveEvidence.js +3 -8
  39. package/dist/application/ElectronActiveObservationService.js +3 -6
  40. package/dist/application/ElectronBoundaryAnalysis.js +7 -8
  41. package/dist/application/ElectronBoundaryGraphContext.js +1 -1
  42. package/dist/application/ElectronBoundaryGraphIpc.js +3 -3
  43. package/dist/application/ElectronBoundaryGraphNative.js +1 -2
  44. package/dist/application/ElectronBoundaryGraphWindows.js +6 -8
  45. package/dist/application/ElectronEvidence.js +4 -7
  46. package/dist/application/ElectronObservationService.js +5 -9
  47. package/dist/application/EnhancedLiteralTracing.js +42 -65
  48. package/dist/application/EnhancedTools.js +76 -44
  49. package/dist/application/EvidenceBundleCommands.js +11 -11
  50. package/dist/application/EvidenceBundleFiles.js +9 -15
  51. package/dist/application/EvidenceLedger.js +6 -41
  52. package/dist/application/FilesystemSnapshot.js +2 -3
  53. package/dist/application/InterfaceBuilderAnalysis.js +266 -0
  54. package/dist/application/InventoryProjectionEvidence.js +4 -2
  55. package/dist/application/InvestigationProviders.js +1 -1
  56. package/dist/application/JavaScriptApplicationEvidence.js +2 -5
  57. package/dist/application/JavaScriptApplicationEvidenceGraph.js +6 -10
  58. package/dist/application/JavaScriptApplicationService.js +6 -29
  59. package/dist/application/JavaScriptApplicationWorkflowEvidence.js +5 -5
  60. package/dist/application/JavaScriptApplicationWorkflowService.js +0 -8
  61. package/dist/application/JavaScriptArtifactAnalysis.js +38 -127
  62. package/dist/application/JavaScriptArtifactFiles.js +67 -107
  63. package/dist/application/JavaScriptArtifactGraphAccumulator.js +0 -7
  64. package/dist/application/JavaScriptArtifactGraphBuilder.js +7 -58
  65. package/dist/application/JavaScriptArtifactGraphBundlers.js +1 -6
  66. package/dist/application/JavaScriptArtifactGraphContext.js +12 -39
  67. package/dist/application/JavaScriptArtifactGraphDocuments.js +4 -11
  68. package/dist/application/JavaScriptArtifactGraphEvidence.js +0 -14
  69. package/dist/application/JavaScriptArtifactGraphFindings.js +3 -3
  70. package/dist/application/JavaScriptArtifactGraphStructure.js +16 -17
  71. package/dist/application/JavaScriptArtifactPathResolution.js +61 -49
  72. package/dist/application/JavaScriptArtifactReconstruction.js +5 -10
  73. package/dist/application/JavaScriptArtifactReconstructionInput.js +2 -14
  74. package/dist/application/JavaScriptJsonModules.js +2 -2
  75. package/dist/application/JavaScriptModuleRelationships.js +22 -27
  76. package/dist/application/JavaScriptReplayPlanning.js +9 -3
  77. package/dist/application/JavaScriptReplayService.js +6 -32
  78. package/dist/application/JavaScriptReturnShapeProjection.js +12 -42
  79. package/dist/application/JavaScriptRuntimeObservationEvidence.js +7 -8
  80. package/dist/application/JavaScriptRuntimeObservationService.js +4 -8
  81. package/dist/application/JavaScriptRuntimeReconciliationEvidence.js +2 -3
  82. package/dist/application/JavaScriptSemanticGraphBuilder.js +11 -41
  83. package/dist/application/JavaScriptSemanticGraphConstruction.js +5 -29
  84. package/dist/application/JavaScriptSemanticGraphEvidence.js +1 -1
  85. package/dist/application/JavaScriptSemanticGraphFingerprintProjection.js +1 -1
  86. package/dist/application/JavaScriptSemanticGraphFlowProjection.js +0 -13
  87. package/dist/application/JavaScriptSemanticGraphProjection.js +1 -3
  88. package/dist/application/JavaScriptSemanticTraceService.js +1 -10
  89. package/dist/application/JsonFiles.js +79 -0
  90. package/dist/application/LinuxHopper.js +11 -9
  91. package/dist/application/LoopbackReplay.js +26 -23
  92. package/dist/application/LoopbackReplayRecorder.js +29 -1
  93. package/dist/application/ManagedApplicationGraphService.js +1 -2
  94. package/dist/application/ManagedMemberComparisonService.js +11 -41
  95. package/dist/application/ManagedNativeVerificationService.js +1 -2
  96. package/dist/application/ManagedReconstructionService.js +1 -1
  97. package/dist/application/ManagedRuntimeCorrelationService.js +5 -8
  98. package/dist/application/NativeApiInspection.js +2 -7
  99. package/dist/application/NativeUiActionTrace.js +394 -0
  100. package/dist/application/NodeRuntimeCharacterizationService.js +3 -7
  101. package/dist/application/PermissionAuthority.js +15 -7
  102. package/dist/application/PermissionFailure.js +5 -0
  103. package/dist/application/ProcessCaptureAuthority.js +5 -7
  104. package/dist/application/ProcessCaptureJournal.js +3 -2
  105. package/dist/application/ProcessCaptureLifecycle.js +5 -12
  106. package/dist/application/ProcessCheckpoints.js +29 -11
  107. package/dist/application/ProcessCli.js +6 -16
  108. package/dist/application/ProcessEvidence.js +5 -7
  109. package/dist/application/ProcessHarness.js +52 -17
  110. package/dist/application/ProcessReactiveCoordinator.js +2 -4
  111. package/dist/application/ProcessReactiveEffects.js +9 -3
  112. package/dist/application/ProcessReactiveHarness.js +13 -7
  113. package/dist/application/ProcessSampling.js +2 -4
  114. package/dist/application/ProcessTimer.js +39 -0
  115. package/dist/application/ProjectPermissionStore.js +39 -96
  116. package/dist/application/RealHopperAssertions.js +20 -66
  117. package/dist/application/ReconstructionCoverageService.js +12 -58
  118. package/dist/application/ReconstructionObligationAuthority.js +2 -2
  119. package/dist/application/ReconstructionObligationCandidates.js +4 -4
  120. package/dist/application/ReconstructionObligationLedgerEvaluation.js +8 -15
  121. package/dist/application/ReconstructionObligationLedgerProjection.js +3 -7
  122. package/dist/application/ReconstructionObligationLedgerService.js +19 -38
  123. package/dist/application/ReferenceSourceImport.js +19 -45
  124. package/dist/application/ReferenceSourceImportEntries.js +2 -4
  125. package/dist/application/ReferenceSourceImportPolicy.js +5 -32
  126. package/dist/application/ReferenceSourceImportTypes.js +0 -16
  127. package/dist/application/RuntimeExecutableDiagnostics.js +55 -29
  128. package/dist/application/SessionProviderRouter.js +2 -2
  129. package/dist/application/Setup.js +1 -3
  130. package/dist/application/SetupClientConfiguration.js +22 -93
  131. package/dist/application/SetupRegistrationEnvironment.js +0 -7
  132. package/dist/application/StoreFileLock.js +119 -0
  133. package/dist/application/TerminalRenderer.js +2 -3
  134. package/dist/application/Uninstall.js +9 -14
  135. package/dist/application/UnknownEvidence.js +1 -1
  136. package/dist/artifacts/ArtifactPaths.js +2 -5
  137. package/dist/artifacts/ArtifactProvider.js +36 -58
  138. package/dist/artifacts/DirectoryArtifactReader.js +13 -8
  139. package/dist/artifacts/MachOSliceArtifactReader.js +1 -5
  140. package/dist/artifacts/NativeDmgArtifactReader.js +11 -11
  141. package/dist/artifacts/NibArchive.js +269 -0
  142. package/dist/artifacts/SafeOutputTree.js +15 -24
  143. package/dist/browser/BrowserProcessStartup.js +1 -2
  144. package/dist/browser/CdpAuthorizedMainFrame.js +16 -0
  145. package/dist/browser/CdpBrowserProvider.js +3 -13
  146. package/dist/browser/CdpCanonicalJsonDigest.js +9 -0
  147. package/dist/browser/CdpCaptureDocuments.js +28 -76
  148. package/dist/browser/CdpCaptureEventBodyShapes.js +13 -33
  149. package/dist/browser/CdpCaptureEventHandlers.js +22 -87
  150. package/dist/browser/CdpCaptureEvents.js +2 -8
  151. package/dist/browser/CdpCaptureStorage.js +9 -20
  152. package/dist/browser/CdpCaptureStorageFingerprints.js +85 -98
  153. package/dist/browser/CdpCaptureValues.js +21 -21
  154. package/dist/browser/CdpConnection.js +10 -25
  155. package/dist/browser/CdpElectronInspection.js +26 -50
  156. package/dist/browser/CdpElectronProvider.js +10 -35
  157. package/dist/browser/CdpElectronScriptEvents.js +8 -16
  158. package/dist/browser/CdpElectronScripts.js +6 -35
  159. package/dist/browser/CdpElectronWorkers.js +6 -10
  160. package/dist/browser/CdpEndpoint.js +25 -41
  161. package/dist/browser/CdpObservationSession.js +14 -26
  162. package/dist/browser/CdpPageCapture.js +34 -48
  163. package/dist/browser/CdpPageCaptureScripts.js +1 -19
  164. package/dist/browser/CdpPageCaptureWorkers.js +6 -10
  165. package/dist/browser/CdpSafeMetadata.js +19 -22
  166. package/dist/browser/CdpScreenshot.js +3 -5
  167. package/dist/browser/CdpTargetSession.js +1 -2
  168. package/dist/browser/CdpWebMcpDiscovery.js +13 -22
  169. package/dist/browser/ElectronFileScope.js +8 -19
  170. package/dist/browser/JavaScriptRuntimeScope.js +9 -14
  171. package/dist/browser/PlaywrightBrowserScenarioProvider.js +31 -64
  172. package/dist/browser/PlaywrightElectronActiveActions.js +54 -69
  173. package/dist/browser/PlaywrightElectronActiveProvider.js +14 -34
  174. package/dist/browser/PlaywrightExecutionBoundary.js +16 -5
  175. package/dist/browser/PlaywrightScenarioActions.js +3 -7
  176. package/dist/browser/PlaywrightScenarioArtifacts.js +23 -92
  177. package/dist/browser/PlaywrightScenarioBrowser.js +3 -5
  178. package/dist/browser/PlaywrightScenarioEvents.js +45 -94
  179. package/dist/browser/PlaywrightScenarioSession.js +14 -30
  180. package/dist/browser/PngVisualDiff.js +22 -14
  181. package/dist/browser/SensitiveTextCapture.js +0 -17
  182. package/dist/browser/V8InspectorCaptureProjection.js +7 -8
  183. package/dist/browser/V8InspectorEndpoint.js +12 -14
  184. package/dist/browser/V8InspectorProvider.js +20 -61
  185. package/dist/browser/WebSourceMapFetcher.js +56 -176
  186. package/dist/catalogIdentity.js +0 -54
  187. package/dist/cli/artifactCommands.js +49 -77
  188. package/dist/cli/coreAnalysisCommands.js +83 -133
  189. package/dist/cli/javascriptApplicationAnalysis.js +1 -9
  190. package/dist/cli/managedCommands.js +5 -270
  191. package/dist/cli/setupCommands.js +3 -12
  192. package/dist/cli/utilityCommands.js +7 -41
  193. package/dist/cli.js +0 -2
  194. package/dist/cliApplicationCommands.js +42 -112
  195. package/dist/cliBrowserAdvancedCommands.js +10 -106
  196. package/dist/cliBrowserCommands.js +15 -127
  197. package/dist/cliBrowserContext.js +30 -0
  198. package/dist/cliCommandNames.js +4 -5
  199. package/dist/cliElectronCommands.js +8 -72
  200. package/dist/cliEvidenceCommands.js +8 -77
  201. package/dist/cliJavaScriptRuntimeCommands.js +9 -91
  202. package/dist/cliJsonInput.js +4 -14
  203. package/dist/cliObservationOptions.js +11 -96
  204. package/dist/cliPolicyCommands.js +2 -17
  205. package/dist/cliProcessCommands.js +3 -3
  206. package/dist/cliSetup.js +0 -13
  207. package/dist/config/browserScenario.js +2 -2
  208. package/dist/config/environment.js +0 -9
  209. package/dist/config/parseConfig.js +1 -33
  210. package/dist/config/parsers.js +6 -27
  211. package/dist/config/passiveObservation.js +7 -77
  212. package/dist/config/permissions.js +0 -7
  213. package/dist/contracts/analysisSearchContract.js +2 -5
  214. package/dist/contracts/applicationToolContracts.js +56 -109
  215. package/dist/contracts/applicationWorkflowInputContracts.js +27 -102
  216. package/dist/contracts/artifactComparisonExample.js +58 -60
  217. package/dist/contracts/artifactToolContracts.js +20 -67
  218. package/dist/contracts/browserScenarioToolContracts.js +6 -51
  219. package/dist/contracts/browserToolContracts.js +8 -73
  220. package/dist/contracts/electronToolContracts.js +8 -108
  221. package/dist/contracts/enhancedInputs.js +23 -54
  222. package/dist/contracts/errorSchemas.js +0 -1
  223. package/dist/contracts/functionComparisonExample.js +10 -24
  224. package/dist/contracts/functionInstructionContract.js +1 -3
  225. package/dist/contracts/functionWorkflowToolContracts.js +2 -2
  226. package/dist/contracts/hopperMemoryContracts.js +3 -3
  227. package/dist/contracts/investigationExamples.js +14 -11
  228. package/dist/contracts/javascriptApplicationWorkflowExamples.js +12 -19
  229. package/dist/contracts/javascriptRuntimeObservationToolContracts.js +2 -20
  230. package/dist/contracts/javascriptRuntimeReconciliationExample.js +45 -12
  231. package/dist/contracts/managedToolContracts.js +6 -95
  232. package/dist/contracts/managedWorkflowExamples.js +77 -128
  233. package/dist/contracts/managedWorkflowToolContracts.js +51 -77
  234. package/dist/contracts/nativeToolContracts.js +7 -11
  235. package/dist/contracts/processCaptureExample.js +2 -69
  236. package/dist/contracts/promptContracts.js +49 -67
  237. package/dist/contracts/providerSelection.js +0 -1
  238. package/dist/contracts/reconstructionReadinessExample.js +1 -6
  239. package/dist/contracts/sessionStatusContract.js +1 -17
  240. package/dist/contracts/sessionToolSchemas.js +6 -15
  241. package/dist/contracts/toolContractExamples.js +11 -11
  242. package/dist/contracts/toolContractHelpers.js +0 -4
  243. package/dist/contracts/toolContracts.js +60 -71
  244. package/dist/contracts/toolEffects.js +5 -13
  245. package/dist/contracts/toolOutputSchemaGroups.js +37 -91
  246. package/dist/contracts/toolOutputSchemaPrimitives.js +16 -56
  247. package/dist/contracts/toolSchemaMetadata.js +8 -19
  248. package/dist/contracts/unknownContractExamples.js +0 -2
  249. package/dist/domain/analysisErrorPresentation.js +46 -54
  250. package/dist/domain/analysisErrorProjection.js +28 -37
  251. package/dist/domain/analysisProfile.js +3 -31
  252. package/dist/domain/analysisSnapshot.js +3 -12
  253. package/dist/domain/androidApplication.js +15 -54
  254. package/dist/domain/appleApplication.js +24 -67
  255. package/dist/domain/artifactComparison.js +11 -29
  256. package/dist/domain/artifactGraph.js +14 -44
  257. package/dist/domain/artifactInspection.js +38 -69
  258. package/dist/domain/artifactInventoryEvidence.js +27 -21
  259. package/dist/domain/binaryTarget.js +2 -221
  260. package/dist/domain/browserCaptureComparison.js +47 -24
  261. package/dist/domain/browserObservation.js +28 -193
  262. package/dist/domain/browserObservationSchemas.js +5 -23
  263. package/dist/domain/browserScenario.js +11 -14
  264. package/dist/domain/browserScenarioCapture.js +11 -12
  265. package/dist/domain/browserScenarioCaptureValues.js +146 -84
  266. package/dist/domain/browserScenarioDiff.js +2 -59
  267. package/dist/domain/browserScenarioDiffEvidence.js +51 -0
  268. package/dist/domain/browserScenarioDiffValues.js +21 -38
  269. package/dist/domain/browserScenarioValues.js +80 -109
  270. package/dist/domain/browserSession.js +4 -7
  271. package/dist/domain/bundleComparison.js +6 -32
  272. package/dist/domain/bytecodeProvider.js +20 -19
  273. package/dist/domain/callPath.js +47 -167
  274. package/dist/domain/callPathSchemas.js +79 -0
  275. package/dist/domain/changedBehavior.js +34 -60
  276. package/dist/domain/completionLedgerGeneration.js +8 -14
  277. package/dist/domain/conformancePackage.js +126 -97
  278. package/dist/domain/conformanceReplay.js +36 -8
  279. package/dist/domain/conformanceTrustGate.js +23 -14
  280. package/dist/domain/customProtocolCapture.js +1 -1
  281. package/dist/domain/electronActiveObservation.js +70 -103
  282. package/dist/domain/electronObservation.js +14 -80
  283. package/dist/domain/electronStaticAnalysisBrowser.js +36 -46
  284. package/dist/domain/electronStaticAnalysisIpc.js +38 -14
  285. package/dist/domain/electronStaticAnalysisNative.js +1 -8
  286. package/dist/domain/electronStaticAnalysisValues.js +10 -17
  287. package/dist/domain/errors.js +33 -54
  288. package/dist/domain/eventProcessTree.js +20 -12
  289. package/dist/domain/evidence.js +2 -10
  290. package/dist/domain/evidenceBundle.js +3 -5
  291. package/dist/domain/evidenceCompletionLedger.js +6 -8
  292. package/dist/domain/functionComparison.js +4 -14
  293. package/dist/domain/functionComparisonNormalization.js +4 -11
  294. package/dist/domain/functionComparisonResults.js +25 -15
  295. package/dist/domain/functionComparisonSchemas.js +49 -33
  296. package/dist/domain/functionDossierEvidence.js +31 -156
  297. package/dist/domain/hopperStartupFailure.js +1 -1
  298. package/dist/domain/hopperValues.js +15 -136
  299. package/dist/domain/interfaceBuilderGraph.js +654 -0
  300. package/dist/domain/javascriptApplicationAnalysis.js +8 -112
  301. package/dist/domain/javascriptApplicationChangeGraph.js +22 -82
  302. package/dist/domain/javascriptApplicationEvidenceSchemas.js +59 -47
  303. package/dist/domain/javascriptApplicationGraph.js +3 -13
  304. package/dist/domain/javascriptApplicationGraphSchemas.js +12 -34
  305. package/dist/domain/javascriptApplicationVersionComparison.js +26 -30
  306. package/dist/domain/javascriptApplicationVersionComparisonSchemas.js +123 -68
  307. package/dist/domain/javascriptApplicationVersionItems.js +120 -53
  308. package/dist/domain/javascriptApplicationVersionKeys.js +24 -11
  309. package/dist/domain/javascriptAstFingerprint.js +25 -58
  310. package/dist/domain/javascriptAstValues.js +9 -0
  311. package/dist/domain/javascriptExportInstrumentation.js +2 -4
  312. package/dist/domain/javascriptExportShapeComparison.js +6 -7
  313. package/dist/domain/javascriptExportShapeComparisonSchemas.js +68 -75
  314. package/dist/domain/javascriptExportShapeSelection.js +17 -19
  315. package/dist/domain/javascriptFeatureSeed.js +20 -12
  316. package/dist/domain/javascriptFeatureTrace.js +13 -67
  317. package/dist/domain/javascriptFeatureTraceSchemas.js +24 -52
  318. package/dist/domain/javascriptFeatureTraversal.js +1 -44
  319. package/dist/domain/javascriptNativeHandoff.js +1 -1
  320. package/dist/domain/javascriptReplay.js +24 -41
  321. package/dist/domain/javascriptRuntimeLoadState.js +3 -8
  322. package/dist/domain/javascriptRuntimeObservation.js +42 -103
  323. package/dist/domain/javascriptRuntimeReconciliation.js +1 -3
  324. package/dist/domain/javascriptRuntimeReconciliationActive.js +8 -17
  325. package/dist/domain/javascriptRuntimeReconciliationGraph.js +10 -23
  326. package/dist/domain/javascriptRuntimeReconciliationMatching.js +18 -12
  327. package/dist/domain/javascriptRuntimeReconciliationParsing.js +16 -45
  328. package/dist/domain/javascriptRuntimeReconciliationResult.js +4 -5
  329. package/dist/domain/javascriptRuntimeReconciliationRuntime.js +8 -12
  330. package/dist/domain/javascriptRuntimeReconciliationSchemas.js +33 -48
  331. package/dist/domain/javascriptRuntimeStaticCandidates.js +3 -3
  332. package/dist/domain/javascriptSemanticAnalysis.js +12 -45
  333. package/dist/domain/javascriptSemanticAsyncEffects.js +1 -9
  334. package/dist/domain/javascriptSemanticCallResolution.js +6 -16
  335. package/dist/domain/javascriptSemanticCalls.js +5 -32
  336. package/dist/domain/javascriptSemanticChildProcesses.js +1 -11
  337. package/dist/domain/javascriptSemanticCoverage.js +11 -0
  338. package/dist/domain/javascriptSemanticDataEffectHelpers.js +1 -8
  339. package/dist/domain/javascriptSemanticDataEffects.js +1 -11
  340. package/dist/domain/javascriptSemanticFingerprints.js +3 -5
  341. package/dist/domain/javascriptSemanticGraphSchemas.js +25 -51
  342. package/dist/domain/javascriptSemanticGraphSerialization.js +2 -13
  343. package/dist/domain/javascriptSemanticIr.js +1 -29
  344. package/dist/domain/javascriptSemanticObjects.js +1 -5
  345. package/dist/domain/javascriptSemanticPrimitives.js +2 -9
  346. package/dist/domain/javascriptSemanticProjection.js +0 -18
  347. package/dist/domain/javascriptSemanticPromises.js +9 -16
  348. package/dist/domain/javascriptSemanticProvenance.js +16 -19
  349. package/dist/domain/javascriptSemanticQuery.js +17 -139
  350. package/dist/domain/javascriptSemanticQueryAssessment.js +9 -37
  351. package/dist/domain/javascriptSemanticQueryIdentity.js +2 -23
  352. package/dist/domain/javascriptSemanticQuerySchemas.js +14 -107
  353. package/dist/domain/javascriptSemanticResources.js +1 -6
  354. package/dist/domain/javascriptSemanticReturns.js +10 -27
  355. package/dist/domain/javascriptSemanticValueTypes.js +1 -0
  356. package/dist/domain/javascriptSemanticValues.js +44 -62
  357. package/dist/domain/javascriptStaticAnalysis.js +21 -43
  358. package/dist/domain/javascriptStaticAnalysisBundler.js +34 -93
  359. package/dist/domain/javascriptStaticAnalysisCalls.js +17 -16
  360. package/dist/domain/javascriptStaticAnalysisFindings.js +3 -19
  361. package/dist/domain/javascriptStaticAnalysisHelpers.js +47 -88
  362. package/dist/domain/javascriptStaticAnalysisState.js +1 -5
  363. package/dist/domain/javascriptStaticAnalysisTypes.js +1 -0
  364. package/dist/domain/jsonShape.js +7 -33
  365. package/dist/domain/localPath.js +7 -0
  366. package/dist/domain/managedApplicationGraph.js +9 -41
  367. package/dist/domain/managedApplicationGraphCoverage.js +24 -156
  368. package/dist/domain/managedApplicationGraphNodes.js +10 -13
  369. package/dist/domain/managedArtifact.js +14 -27
  370. package/dist/domain/managedMemberComparison.js +90 -92
  371. package/dist/domain/managedMemberComparisonCoverage.js +11 -33
  372. package/dist/domain/managedMemberComparisonItems.js +221 -0
  373. package/dist/domain/managedMemberComparisonMatch.js +8 -208
  374. package/dist/domain/managedNativeVerification.js +3 -6
  375. package/dist/domain/managedNativeVerificationMatch.js +55 -59
  376. package/dist/domain/managedNativeVerificationSchemas.js +83 -47
  377. package/dist/domain/managedReconstruction.js +19 -23
  378. package/dist/domain/managedRuntimeCorrelation.js +6 -9
  379. package/dist/domain/nativeApiBoundary.js +2 -7
  380. package/dist/domain/nativeInspection.js +0 -2
  381. package/dist/domain/nativeInvestigationGraph.js +351 -0
  382. package/dist/domain/nativeValueFlow.js +61 -0
  383. package/dist/domain/nodeRuntimeCharacterization.js +1 -5
  384. package/dist/domain/objcSwiftMetadata.js +254 -0
  385. package/dist/domain/peInspection.js +1 -1
  386. package/dist/domain/permissionPolicy.js +13 -0
  387. package/dist/domain/processCapture.js +76 -113
  388. package/dist/domain/processCaptureExample.js +68 -0
  389. package/dist/domain/processCaptureParsing.js +21 -0
  390. package/dist/domain/processCaptureReactiveSchema.js +68 -0
  391. package/dist/domain/processCaptureValidation.js +1 -7
  392. package/dist/domain/processComparison.js +3 -12
  393. package/dist/domain/processReactiveMatching.js +29 -50
  394. package/dist/domain/processReactiveRuntime.js +4 -8
  395. package/dist/domain/processReactiveScenario.js +28 -94
  396. package/dist/domain/processReactiveScenarioPreflight.js +5 -30
  397. package/dist/domain/processReactiveTransition.js +33 -18
  398. package/dist/domain/processScenario.js +56 -90
  399. package/dist/domain/processTraceComparison.js +0 -8
  400. package/dist/domain/processTraceEvaluation.js +14 -4
  401. package/dist/domain/processTraceSpecification.js +11 -17
  402. package/dist/domain/protocolCapture.js +3 -3
  403. package/dist/domain/reconstructionCoverage.js +62 -129
  404. package/dist/domain/reconstructionCoverageEvaluation.js +17 -17
  405. package/dist/domain/reconstructionObligationLedgerSchemas.js +45 -72
  406. package/dist/domain/reconstructionReadiness.js +1 -2
  407. package/dist/domain/reconstructionReadinessSchemas.js +36 -38
  408. package/dist/domain/reconstructionUnknowns.js +3 -3
  409. package/dist/domain/reconstructionVerification.js +13 -47
  410. package/dist/domain/reconstructionVerificationSchemas.js +50 -38
  411. package/dist/domain/referenceSourceGraph.js +53 -61
  412. package/dist/domain/referenceSourceImportParsing.js +1 -5
  413. package/dist/domain/replayMachine.js +19 -31
  414. package/dist/domain/replayMachineRun.js +15 -63
  415. package/dist/domain/replayMachineRuntime.js +41 -41
  416. package/dist/domain/replayMachineValues.js +84 -0
  417. package/dist/domain/residualUnknown.js +25 -30
  418. package/dist/domain/runtimeCharacterization.js +15 -16
  419. package/dist/domain/runtimeIdentification.js +48 -47
  420. package/dist/domain/sourceToBundleComparison.js +9 -85
  421. package/dist/domain/sourceToBundleComparisonSchemas.js +17 -42
  422. package/dist/domain/sourceToBundleSignals.js +4 -15
  423. package/dist/domain/staticRuntimeCorrelation.js +37 -49
  424. package/dist/domain/symbolAnalysis.js +10 -19
  425. package/dist/domain/unicodeCodePointOrder.js +12 -0
  426. package/dist/domain/webBundleAnalysis.js +70 -99
  427. package/dist/domain/webBundleAnalyzer.js +2 -4
  428. package/dist/domain/webBundleAnalyzerAst.js +0 -13
  429. package/dist/domain/webBundleAnalyzerInspection.js +26 -52
  430. package/dist/domain/webBundleAnalyzerResult.js +7 -24
  431. package/dist/domain/webCaptureDiff.js +33 -73
  432. package/dist/domain/webCaptureDiffSchemas.js +86 -0
  433. package/dist/domain/webContentArtifact.js +1 -10
  434. package/dist/domain/webMcpDiscovery.js +3 -14
  435. package/dist/domain/webScreenshot.js +58 -34
  436. package/dist/domain/zipPackageFormat.js +7 -0
  437. package/dist/dotnet/ManagedArtifactInspector.js +17 -50
  438. package/dist/dotnet/ManagedMemberInspector.js +27 -58
  439. package/dist/dotnet/ManagedMemberInspectorCore.js +14 -51
  440. package/dist/dotnet/ManagedMemberInstructionDecoder.js +2 -2
  441. package/dist/dotnet/ManagedMemberRows.js +16 -16
  442. package/dist/dotnet/ManagedMetadataHeaps.js +26 -8
  443. package/dist/dotnet/ManagedMetadataInventory.js +21 -30
  444. package/dist/dotnet/ManagedMetadataInventoryRows.js +57 -63
  445. package/dist/dotnet/ManagedMetadataLayout.js +3 -5
  446. package/dist/dotnet/ManagedMethodBodyReader.js +5 -30
  447. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +19 -49
  448. package/dist/dotnet/ManagedNativeBoundaryInspector.js +13 -41
  449. package/dist/dotnet/ManagedPeReader.js +2 -2
  450. package/dist/dotnet/ManagedStaticProvider.js +13 -71
  451. package/dist/generatedMcpToolCatalog.js +1 -1
  452. package/dist/generatedPackageMetadata.js +1 -1
  453. package/dist/ghidra/GhidraAnalysisProfile.js +3 -8
  454. package/dist/ghidra/GhidraClient.js +4 -12
  455. package/dist/ghidra/GhidraClientWire.js +9 -5
  456. package/dist/ghidra/GhidraDefaults.js +0 -18
  457. package/dist/ghidra/GhidraDiagnostics.js +0 -2
  458. package/dist/ghidra/GhidraDoctor.js +16 -12
  459. package/dist/ghidra/GhidraFunctionValues.js +65 -108
  460. package/dist/ghidra/GhidraInstallation.js +98 -42
  461. package/dist/ghidra/GhidraInventoryValues.js +16 -85
  462. package/dist/ghidra/GhidraLauncher.js +0 -8
  463. package/dist/ghidra/GhidraProvider.js +15 -22
  464. package/dist/ghidra/GhidraProviderCapabilities.js +6 -47
  465. package/dist/ghidra/GhidraRequestQueue.js +6 -30
  466. package/dist/ghidra/GhidraResponseBuffer.js +1 -7
  467. package/dist/ghidra/GhidraSessionValues.js +0 -2
  468. package/dist/ghidra/GhidraTransport.js +4 -7
  469. package/dist/ghidra/protocol.js +2 -2
  470. package/dist/hopper/BridgeLauncher.js +112 -36
  471. package/dist/hopper/HopperAnalysisProfile.js +1 -1
  472. package/dist/hopper/HopperCleanup.js +6 -3
  473. package/dist/hopper/HopperClient.js +4 -7
  474. package/dist/hopper/HopperProcessDiagnostic.js +2 -2
  475. package/dist/hopper/HopperProvider.js +0 -16
  476. package/dist/hopper/HopperRequestQueue.js +21 -40
  477. package/dist/hopper/HopperResponseStream.js +1 -9
  478. package/dist/hopper/HopperSessionValues.js +3 -2
  479. package/dist/hopper/HopperTargetLease.js +119 -0
  480. package/dist/hopper/LinuxPrivateDisplayDiagnostic.js +24 -31
  481. package/dist/hopper/LinuxPrivateDisplayProbe.js +5 -16
  482. package/dist/hopper/protocol.js +6 -4
  483. package/dist/main/reload.js +0 -3
  484. package/dist/main/shutdown.js +1 -1
  485. package/dist/main/state.js +0 -9
  486. package/dist/main/transport.js +0 -5
  487. package/dist/mcpDoctor.js +25 -45
  488. package/dist/native/CommandRunner.js +18 -25
  489. package/dist/native/NativeMacOSProvider.js +13 -38
  490. package/dist/native/NativeMachoInspection.js +1 -1
  491. package/dist/process/BoundedFileBytes.js +17 -0
  492. package/dist/process/ExecFileOutput.js +11 -0
  493. package/dist/process/PendingOperations.js +8 -6
  494. package/dist/process/ProcessOwnership.js +3 -2
  495. package/dist/process/ProcessOwnershipObservation.js +0 -1
  496. package/dist/process/ProviderProcess.js +7 -28
  497. package/dist/reference/ReferenceSourceReader.js +8 -24
  498. package/dist/reference/ReferenceSourceReaderEntries.js +11 -39
  499. package/dist/reference/ReferenceSourceReaderFile.js +13 -31
  500. package/dist/reference/ReferenceSourceReaderPaths.js +3 -18
  501. package/dist/reference/ReferenceSourceReaderValidate.js +3 -6
  502. package/dist/replay/JavaScriptReplayWorker.js +3 -5
  503. package/dist/replay/LinuxJavaScriptReplayRunner.js +33 -29
  504. package/dist/replay/LinuxJavaScriptReplaySandbox.js +0 -19
  505. package/dist/replay/LinuxRuntimeClosure.js +1 -3
  506. package/dist/replay/ReplayOutcome.js +1 -3
  507. package/dist/replay/ReplayProcessLifecycle.js +32 -7
  508. package/dist/replay/ReplaySeccompFile.js +29 -0
  509. package/dist/replay/ReplayWorkerProtocol.js +0 -2
  510. package/dist/replay/SystemJavaScriptReplayHost.js +45 -74
  511. package/dist/server/ProcessCaptureElicitation.js +4 -8
  512. package/dist/server/createServer.js +6 -44
  513. package/dist/server/promptCompletion.js +37 -61
  514. package/dist/server/recordDerivedEvidence.js +1 -1
  515. package/dist/server/registerApplicationTools/characterization.js +4 -8
  516. package/dist/server/registerApplicationTools/compareExportShapes.js +5 -10
  517. package/dist/server/registerApplicationTools/compareSourceToBundle.js +6 -10
  518. package/dist/server/registerApplicationTools/compareVersions.js +5 -10
  519. package/dist/server/registerApplicationTools/controlledReplay.js +3 -5
  520. package/dist/server/registerApplicationTools/coverage.js +6 -71
  521. package/dist/server/registerApplicationTools/helpers.js +1 -13
  522. package/dist/server/registerApplicationTools/obligationLedger.js +3 -2
  523. package/dist/server/registerApplicationTools/traceFeature.js +5 -9
  524. package/dist/server/registerApplicationTools/traceSemantics.js +5 -8
  525. package/dist/server/registerApplicationTools.js +0 -2
  526. package/dist/server/registerArtifactComparisonTool.js +23 -27
  527. package/dist/server/registerBrowserScenarioTool.js +4 -4
  528. package/dist/server/registerBrowserTools.js +5 -8
  529. package/dist/server/registerBundleComparisonTool.js +5 -7
  530. package/dist/server/registerCloseLifecycleTool.js +2 -16
  531. package/dist/server/registerElectronTools.js +10 -29
  532. package/dist/server/registerEnhancedTools.js +10 -11
  533. package/dist/server/registerEvidenceTools.js +15 -22
  534. package/dist/server/registerFunctionComparisonTool.js +30 -25
  535. package/dist/server/registerInvestigationTools/helpers.js +3 -32
  536. package/dist/server/registerInvestigationTools.js +20 -116
  537. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -4
  538. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +15 -17
  539. package/dist/server/registerManagedWorkflowTools/evidence.js +19 -35
  540. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +3 -8
  541. package/dist/server/registerManagedWorkflowTools/planManagedRuntimeCorrelation.js +3 -8
  542. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +10 -14
  543. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +9 -15
  544. package/dist/server/registerOfficialTools.js +1 -43
  545. package/dist/server/registerProcessComparisonTool.js +33 -23
  546. package/dist/server/registerPrompts.js +19 -17
  547. package/dist/server/registerSessionRecordTools.js +10 -156
  548. package/dist/server/registerSessionStatusTool.js +6 -69
  549. package/dist/server/registerSessionTools.js +10 -51
  550. package/dist/server/sessionAvailabilityPolicy.js +0 -2
  551. package/dist/server/sessionEvidence.js +9 -15
  552. package/dist/server/sessionToolPolicies.js +0 -8
  553. package/dist/server/toolResult.js +14 -50
  554. package/dist/serverIdentity.js +0 -20
  555. package/install.sh +1 -1
  556. package/package.json +11 -7
  557. package/scripts/electron-active-hook.cjs +23 -55
  558. package/scripts/hopper-demo-x11.py +13 -32
  559. package/skills/reverse-engineer-anything/SKILL.md +47 -12
  560. package/skills/reverse-engineer-anything/references/evidence-workflows.md +6 -4
  561. package/skills/reverse-engineer-anything/references/javascript-applications.md +13 -13
  562. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +12 -8
  563. package/dist/application/ApplicationWorkflowEvidenceResolver.js +0 -188
  564. package/dist/application/BoundedJsonFiles.js +0 -86
  565. package/dist/application/CrossVersionInventory.js +0 -129
  566. package/dist/application/CrossVersionInvestigation.js +0 -301
  567. package/dist/application/CrossVersionInvestigationCollections.js +0 -23
  568. package/dist/application/CrossVersionInvestigationEvidence.js +0 -64
  569. package/dist/application/CrossVersionInvestigationReplay.js +0 -170
  570. package/dist/application/DeferredFileAuthorization.js +0 -61
  571. package/dist/application/DoctorProjection.js +0 -43
  572. package/dist/application/EnhancedToolPagination.js +0 -22
  573. package/dist/application/EvidenceReferenceResolver.js +0 -26
  574. package/dist/application/InvestigationWorkspaceStore.js +0 -204
  575. package/dist/application/ProcessPairedExperiment.js +0 -72
  576. package/dist/application/ReconstructionCoverageWorkspaceStore.js +0 -31
  577. package/dist/application/ReconstructionReadinessService.js +0 -48
  578. package/dist/cliInvestigationCommands.js +0 -173
  579. package/dist/domain/boundedCartesianProjection.js +0 -15
  580. package/dist/domain/investigationWorkspace.js +0 -347
  581. package/dist/domain/jsonLimits.js +0 -26
  582. package/dist/domain/knownPageCoverage.js +0 -29
  583. package/dist/domain/processPairedExperiment.js +0 -128
  584. package/dist/server/javascriptApplicationResult.js +0 -106
  585. package/dist/server/permissionFailure.js +0 -12
  586. package/dist/server/registerApplicationTools/readiness.js +0 -50
  587. package/dist/server/registerEvidenceResources.js +0 -315
  588. package/dist/server/registerJavaScriptApplicationGraphResource.js +0 -65
  589. package/dist/server/registerReconstructionObligationLedgerResource.js +0 -32
  590. package/dist/server/registerReconstructionReadinessResource.js +0 -32
@@ -2,35 +2,42 @@ import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { artifactInventoryResultSchema, } from "./artifactGraph.js";
4
4
  import { parseEvidence } from "./evidence.js";
5
- /** Parse, merge, and verify a bounded set of inventory Evidence pages. */
5
+ import { artifactInspectionResultSchema } from "./artifactInspection.js";
6
+ /** Parse, merge, and verify inventory Evidence pages. */
6
7
  export const parseArtifactInventoryEvidence = (input) => assembleInventorySet((Array.isArray(input) ? input : [input]).map((value) => {
7
8
  const evidence = parseEvidence(value);
8
- if (evidence.operation !== "inventory_artifact")
9
- throw new TypeError("Artifact comparison requires inventory_artifact Evidence");
10
- const inventory = artifactInventoryResultSchema.parse(evidence.normalized_result);
11
- if (evidence.subject === null ||
12
- evidence.subject.digest.sha256 !== inventory.manifest.root_sha256 ||
13
- evidence.subject.format !== inventory.manifest.root_format)
9
+ const inventoryEvidence = evidence.operation === "inventory_artifact"
10
+ ? evidence
11
+ : evidence.operation === "inspect_artifact"
12
+ ? artifactInspectionResultSchema.parse(evidence.normalized_result)
13
+ .substeps[0]?.evidence
14
+ : undefined;
15
+ if (inventoryEvidence === undefined)
16
+ throw new TypeError("Artifact comparison requires inspect_artifact Evidence");
17
+ const inventory = artifactInventoryResultSchema.parse(inventoryEvidence.normalized_result);
18
+ if (inventoryEvidence.subject === null ||
19
+ inventoryEvidence.subject.digest.sha256 !==
20
+ inventory.manifest.root_sha256 ||
21
+ inventoryEvidence.subject.format !== inventory.manifest.root_format)
14
22
  throw new TypeError("Artifact inventory Evidence subject does not match its root digest");
15
23
  validateInventoryPage(inventory);
16
24
  return { evidence, inventory };
17
25
  }));
18
26
  const validateInventoryPage = (inventory) => {
19
- assertUnique(inventory.nodes.items.map(({ artifact_id: id }) => id), "node ID");
20
- assertUnique(inventory.occurrences.items.map(({ occurrence_id: id }) => id), "occurrence ID");
21
- assertUnique(inventory.occurrences.items.map(({ logical_path: path }) => path), "logical path");
22
- assertUnique(inventory.edges.items.map(({ edge_id: id }) => id), "edge ID");
23
- for (const node of inventory.nodes.items)
24
- if (node.artifact_id !==
25
- `art_${digestCanonical({ schema_version: 1, sha256: node.sha256 })}`)
27
+ assertUnique(inventory.nodes.map(({ artifact_id: id }) => id), "node ID");
28
+ assertUnique(inventory.occurrences.map(({ occurrence_id: id }) => id), "occurrence ID");
29
+ assertUnique(inventory.occurrences.map(({ logical_path: path }) => path), "logical path");
30
+ assertUnique(inventory.edges.map(({ edge_id: id }) => id), "edge ID");
31
+ for (const node of inventory.nodes)
32
+ if (node.artifact_id !== `art_${digestCanonical({ sha256: node.sha256 })}`)
26
33
  throw new TypeError("Artifact node ID is not content-addressed");
27
34
  };
28
35
  const assembleInventorySet = (pages) => {
29
- if (pages.length === 0 || pages.length > 100)
30
- throw new TypeError("Artifact comparison requires 1 to 100 Evidence pages");
36
+ if (pages.length === 0)
37
+ throw new TypeError("Artifact inventory requires Evidence pages");
31
38
  const first = pages[0];
32
39
  if (first === undefined)
33
- throw new TypeError("Artifact comparison requires Evidence pages");
40
+ throw new TypeError("Artifact inventory requires Evidence pages");
34
41
  const manifestJson = canonicalJson(first.inventory.manifest);
35
42
  const nodes = new Map();
36
43
  const occurrences = new Map();
@@ -42,13 +49,13 @@ const assembleInventorySet = (pages) => {
42
49
  if (canonicalJson(page.inventory.integrity_contradictions) !==
43
50
  canonicalJson(first.inventory.integrity_contradictions))
44
51
  throw new TypeError("Artifact inventory pages do not share integrity contradictions");
45
- for (const node of page.inventory.nodes.items)
52
+ for (const node of page.inventory.nodes)
46
53
  mergeExact(nodes, node.artifact_id, node, "node");
47
- for (const occurrence of page.inventory.occurrences.items) {
54
+ for (const occurrence of page.inventory.occurrences) {
48
55
  mergeExact(occurrences, occurrence.occurrence_id, occurrence, "occurrence");
49
56
  mergeExact(paths, occurrence.logical_path, occurrence, "logical path");
50
57
  }
51
- for (const edge of page.inventory.edges.items)
58
+ for (const edge of page.inventory.edges)
52
59
  mergeExact(edges, edge.edge_id, edge, "edge");
53
60
  }
54
61
  const inventory = orderedInventory(first.inventory, pages, {
@@ -110,7 +117,6 @@ const validateCompleteInventory = (inventory) => {
110
117
  if (graphSha256 !== inventory.manifest.graph_sha256)
111
118
  throw new TypeError("Artifact graph commitment does not match its members");
112
119
  const manifestId = `agm_${digestCanonical({
113
- schema_version: 1,
114
120
  root_artifact_id: inventory.manifest.root_artifact_id,
115
121
  graph_sha256: graphSha256,
116
122
  })}`;
@@ -1,224 +1,4 @@
1
- import { constants } from "node:fs";
2
- import { createHash } from "node:crypto";
3
- import { access, open, readFile, realpath, stat, } from "node:fs/promises";
4
- import { execFile } from "node:child_process";
5
- import { extname, isAbsolute, join, relative, resolve, sep } from "node:path";
6
- import { promisify } from "node:util";
7
- import { BinaryTargetError } from "./errors.js";
8
1
  import { err, ok } from "./result.js";
9
- import { zipPackageFormatForPath } from "./zipPackageFormat.js";
10
- const execFileAsync = promisify(execFile);
11
- /**
12
- * Resolve and classify a readable local target before a provider is selected.
13
- * FAT Mach-O inputs select only a host-compatible architecture so setup remains
14
- * non-interactive; unsupported or ambiguous inputs are returned as typed errors.
15
- */
16
- export const parseBinaryTarget = async (input, cwd = process.cwd(), hostArchitecture = process.arch, targetKind) => {
17
- const candidate = isAbsolute(input) ? input : resolve(cwd, input);
18
- try {
19
- await access(candidate, constants.R_OK);
20
- const canonical = await realpath(candidate);
21
- const resolved = await resolveAppBundle(canonical);
22
- if (!resolved.ok)
23
- return err(resolved.error);
24
- const path = resolved.value;
25
- const handle = await open(path, "r");
26
- try {
27
- if (!(await handle.stat()).isFile())
28
- return err(new BinaryTargetError(path, "target is not a regular file"));
29
- if (targetKind === "database" ||
30
- (targetKind === undefined && path.toLowerCase().endsWith(".hop")))
31
- return ok({
32
- path,
33
- sourcePath: canonical,
34
- sha256: await sha256Handle(handle),
35
- kind: "database",
36
- format: "analysis-database",
37
- });
38
- const artifactFormat = await detectArtifactFormat(path, handle);
39
- if (artifactFormat !== undefined) {
40
- const identity = {
41
- path,
42
- sourcePath: canonical,
43
- sha256: await sha256Handle(handle),
44
- };
45
- return isArchiveFormat(artifactFormat)
46
- ? ok({ ...identity, kind: "archive", format: artifactFormat })
47
- : ok({ ...identity, kind: "artifact", format: artifactFormat });
48
- }
49
- const detected = await readExecutableMetadata(handle, hostArchitecture);
50
- if (!detected.ok)
51
- return err(new BinaryTargetError(path, detected.error));
52
- return ok({
53
- path,
54
- sourcePath: canonical,
55
- sha256: await sha256Handle(handle),
56
- kind: "executable",
57
- ...detected.value,
58
- });
59
- }
60
- finally {
61
- await handle.close();
62
- }
63
- }
64
- catch (cause) {
65
- return err(new BinaryTargetError(candidate, "path is not readable", { cause }));
66
- }
67
- };
68
- const detectArtifactFormat = async (path, handle) => {
69
- const lower = path.toLowerCase();
70
- const magic = Buffer.alloc(8);
71
- const observed = await handle.read(magic, 0, magic.length, 0);
72
- if (observed.bytesRead >= 4 &&
73
- magic[0] === 0x50 &&
74
- magic[1] === 0x4b &&
75
- [0x03, 0x05, 0x07].includes(magic[2] ?? -1) &&
76
- [0x04, 0x06, 0x08].includes(magic[3] ?? -1)) {
77
- return zipPackageFormatForPath(lower) ?? "zip";
78
- }
79
- const named = namedArtifactFormat(lower);
80
- if (named !== undefined)
81
- return named;
82
- if (lower.endsWith(".pkg") &&
83
- observed.bytesRead >= 4 &&
84
- magic.subarray(0, 4).toString("ascii") === "xar!")
85
- return "pkg";
86
- if (lower.endsWith(".dmg")) {
87
- const size = (await handle.stat()).size;
88
- if (size >= 512) {
89
- const trailer = Buffer.alloc(4);
90
- const read = await handle.read(trailer, 0, trailer.length, size - 512);
91
- if (read.bytesRead === 4 && trailer.toString("ascii") === "koly")
92
- return "dmg";
93
- }
94
- }
95
- return undefined;
96
- };
97
- const namedArtifactFormat = (lowerPath) => {
98
- if (lowerPath.endsWith(".asar"))
99
- return "asar";
100
- if (lowerPath.endsWith(".plist"))
101
- return "plist";
102
- if (lowerPath.endsWith(".map"))
103
- return "source-map";
104
- return /\.(?:m?js|cjs)$/u.test(lowerPath) ? "javascript" : undefined;
105
- };
106
- const isArchiveFormat = (format) => ["zip", "ipa", "apk", "msix", "appx", "asar", "dmg", "pkg"].includes(format);
107
- const sha256Handle = async (handle) => {
108
- const hash = createHash("sha256");
109
- const chunk = Buffer.allocUnsafe(64 * 1024);
110
- let position = 0;
111
- while (true) {
112
- const observed = await handle.read(chunk, 0, chunk.length, position);
113
- if (observed.bytesRead === 0)
114
- break;
115
- hash.update(chunk.subarray(0, observed.bytesRead));
116
- position += observed.bytesRead;
117
- }
118
- return hash.digest("hex");
119
- };
120
- const resolveAppBundle = async (path) => {
121
- const metadata = await stat(path);
122
- if (!metadata.isDirectory())
123
- return ok(path);
124
- if (extname(path).toLowerCase() !== ".app")
125
- return err(new BinaryTargetError(path, "target is not an app or file"));
126
- const plistPath = join(path, "Contents", "Info.plist");
127
- let name;
128
- try {
129
- const plist = await readFile(plistPath);
130
- name =
131
- plist.subarray(0, 6).toString("ascii") === "bplist"
132
- ? await readBinaryPlistExecutable(plistPath)
133
- : parseXmlPlistExecutable(plist.toString("utf8"));
134
- }
135
- catch (cause) {
136
- return err(new BinaryTargetError(path, "app has no readable CFBundleExecutable", {
137
- cause,
138
- }));
139
- }
140
- if (!isSafeExecutableName(name))
141
- return err(new BinaryTargetError(path, "app has an unsafe CFBundleExecutable"));
142
- const programs = join(path, "Contents", "MacOS");
143
- const executable = join(programs, name);
144
- try {
145
- const [canonicalPrograms, canonicalExecutable] = await Promise.all([
146
- realpath(programs),
147
- realpath(executable),
148
- ]);
149
- const location = relative(canonicalPrograms, canonicalExecutable);
150
- if (location === ".." ||
151
- location.startsWith(`..${sep}`) ||
152
- isAbsolute(location))
153
- return err(new BinaryTargetError(path, "app program file leaves Contents/MacOS"));
154
- return ok(canonicalExecutable);
155
- }
156
- catch (cause) {
157
- return err(new BinaryTargetError(path, "app program file is missing", { cause }));
158
- }
159
- };
160
- const parseXmlPlistExecutable = (plist) => {
161
- const match = /<key>\s*CFBundleExecutable\s*<\/key>\s*<string>([^<]+)<\/string>/u.exec(plist);
162
- if (match?.[1] === undefined)
163
- throw new Error("CFBundleExecutable is missing");
164
- return decodeXml(match[1].trim());
165
- };
166
- const readBinaryPlistExecutable = async (plistPath) => (await execFileAsync("/usr/bin/plutil", [
167
- "-extract",
168
- "CFBundleExecutable",
169
- "raw",
170
- "-o",
171
- "-",
172
- plistPath,
173
- ])).stdout.trim();
174
- const isSafeExecutableName = (name) => name.length > 0 &&
175
- name !== "." &&
176
- name !== ".." &&
177
- !name.includes("\0") &&
178
- !/[/\\]/u.test(name);
179
- const decodeXml = (value) => value
180
- .replaceAll("&amp;", "&")
181
- .replaceAll("&lt;", "<")
182
- .replaceAll("&gt;", ">")
183
- .replaceAll("&quot;", '"')
184
- .replaceAll("&apos;", "'");
185
- const readExecutableMetadata = async (handle, hostArchitecture) => {
186
- const prefix = Buffer.alloc(4096);
187
- const prefixRead = await handle.read(prefix, 0, prefix.length, 0);
188
- const bytes = prefix.subarray(0, prefixRead.bytesRead);
189
- if (bytes.length >= 64 && bytes[0] === 0x4d && bytes[1] === 0x5a) {
190
- const offset = bytes.readUInt32LE(0x3c);
191
- return readPeMetadata(handle, offset);
192
- }
193
- if (bytes.length >= 8) {
194
- const magic = bytes.readUInt32BE(0);
195
- if ([0xcafebabf, 0xbfbafeca].includes(magic)) {
196
- const little = magic === 0xbfbafeca;
197
- const count = little ? bytes.readUInt32LE(4) : bytes.readUInt32BE(4);
198
- const required = 8 + count * 32;
199
- if (count <= 128 && required > bytes.length) {
200
- const header = Buffer.alloc(required);
201
- const headerRead = await handle.read(header, 0, header.length, 0);
202
- return parseExecutableHeader(header.subarray(0, headerRead.bytesRead), hostArchitecture);
203
- }
204
- }
205
- }
206
- return parseExecutableHeader(bytes, hostArchitecture);
207
- };
208
- const readPeMetadata = async (handle, offset) => {
209
- const fileHeader = Buffer.alloc(24);
210
- const fileHeaderRead = await handle.read(fileHeader, 0, fileHeader.length, offset);
211
- if (fileHeaderRead.bytesRead !== fileHeader.length)
212
- return err("invalid or truncated PE header");
213
- const optionalHeaderSize = fileHeader.readUInt16LE(20);
214
- if (optionalHeaderSize > 4096)
215
- return err("invalid PE optional header size");
216
- const record = Buffer.alloc(24 + optionalHeaderSize);
217
- const recordRead = await handle.read(record, 0, record.length, offset);
218
- return recordRead.bytesRead === record.length
219
- ? parsePeRecord(record)
220
- : err("invalid or truncated PE header");
221
- };
222
2
  /**
223
3
  * Parse supported executable headers without I/O. The caller supplies the host
224
4
  * architecture used for deterministic FAT Mach-O slice selection.
@@ -310,7 +90,8 @@ const parsePe = (bytes) => {
310
90
  return err("invalid or truncated PE header");
311
91
  return parsePeRecord(bytes.subarray(offset));
312
92
  };
313
- const parsePeRecord = (record) => {
93
+ /** Parse a bounded PE signature, COFF record, and optional header without I/O. */
94
+ export const parsePeRecord = (record) => {
314
95
  if (record.length < 24 ||
315
96
  record.toString("binary", 0, 4) !== "PE\u0000\u0000")
316
97
  return err("invalid or truncated PE header");
@@ -1,27 +1,42 @@
1
1
  import { z } from "zod";
2
2
  import { browserScenarioDiffSchema, compareBrowserScenarios, compareBrowserScenariosInputSchema, } from "./browserScenarioDiff.js";
3
3
  import { compareWebCaptures, captureSnapshotSchema, webCaptureDiffSchema, } from "./webCaptureDiff.js";
4
- const maxChangesSchema = z
5
- .number()
6
- .int()
7
- .min(1)
8
- .max(20_000)
9
- .default(2_000)
10
- .describe("Maximum normalized change records to retain.");
11
- /** Top-level MCP shape for exactly one complete passive or scenario pair. */
12
- export const browserCaptureComparisonInputSchema = z.union([
13
- z.strictObject({
14
- before: captureSnapshotSchema.describe("Earlier passive web-page capture."),
15
- after: captureSnapshotSchema.describe("Later passive web-page capture."),
16
- max_changes: maxChangesSchema,
17
- }),
18
- z.strictObject({
19
- before_scenario: compareBrowserScenariosInputSchema.shape.before_scenario.describe("Earlier browser scenario capture."),
20
- after_scenario: compareBrowserScenariosInputSchema.shape.after_scenario.describe("Later browser scenario capture."),
21
- normalization: compareBrowserScenariosInputSchema.shape.normalization.describe("Exact-literal normalization policy."),
22
- max_changes: maxChangesSchema,
23
- }),
24
- ]);
4
+ /** Caller-visible object schema for passive and scenario capture comparisons. */
5
+ export const browserCaptureComparisonInputSchema = z
6
+ .strictObject({
7
+ before: captureSnapshotSchema
8
+ .optional()
9
+ .describe("Earlier passive web-page capture."),
10
+ after: captureSnapshotSchema
11
+ .optional()
12
+ .describe("Later passive web-page capture."),
13
+ before_scenario: compareBrowserScenariosInputSchema.shape.before_scenario
14
+ .optional()
15
+ .describe("Earlier browser scenario capture."),
16
+ after_scenario: compareBrowserScenariosInputSchema.shape.after_scenario
17
+ .optional()
18
+ .describe("Later browser scenario capture."),
19
+ normalization: compareBrowserScenariosInputSchema.shape.normalization
20
+ .unwrap()
21
+ .optional()
22
+ .describe("Exact-literal normalization policy."),
23
+ })
24
+ .superRefine((input, context) => {
25
+ const passive = input.before !== undefined && input.after !== undefined;
26
+ const scenario = input.before_scenario !== undefined && input.after_scenario !== undefined;
27
+ const passiveFieldsPresent = input.before !== undefined || input.after !== undefined;
28
+ const scenarioFieldsPresent = input.before_scenario !== undefined ||
29
+ input.after_scenario !== undefined ||
30
+ input.normalization !== undefined;
31
+ if (passive && !scenarioFieldsPresent)
32
+ return;
33
+ if (scenario && !passiveFieldsPresent)
34
+ return;
35
+ context.addIssue({
36
+ code: "custom",
37
+ message: "Provide before and after passive captures, or before_scenario, after_scenario, and normalization; do not mix comparison types.",
38
+ });
39
+ });
25
40
  /** Result from passive page or browser scenario comparison. */
26
41
  export const browserCaptureComparisonSchema = z.union([
27
42
  browserScenarioDiffSchema,
@@ -29,6 +44,14 @@ export const browserCaptureComparisonSchema = z.union([
29
44
  ]);
30
45
  /** Dispatch a parsed capture comparison to its pure domain comparator. */
31
46
  export const compareBrowserCaptures = (input) => isScenarioComparison(input)
32
- ? compareBrowserScenarios(input)
33
- : compareWebCaptures(input);
34
- const isScenarioComparison = (input) => "before_scenario" in input;
47
+ ? compareBrowserScenarios({
48
+ ...input,
49
+ normalization: input.normalization ?? { rules: [] },
50
+ })
51
+ : compareWebCaptures(toPassiveComparison(input));
52
+ const isScenarioComparison = (input) => input.before_scenario !== undefined && input.after_scenario !== undefined;
53
+ const toPassiveComparison = (input) => {
54
+ if (input.before === undefined || input.after === undefined)
55
+ throw new Error("Validated passive comparison is missing a capture");
56
+ return { before: input.before, after: input.after };
57
+ };