rea-agents 6.1.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +7 -5
  2. package/bridge/ghidra/ReaGhidraBridge.java +32 -4
  3. package/bridge/hopper_bridge.py +6 -1
  4. package/dist/android/JadxConfiguration.js +87 -7
  5. package/dist/android/JadxMcpTransport.js +14 -2
  6. package/dist/android/JadxProvider.js +57 -35
  7. package/dist/application/BinaryTargetResolver.js +5 -3
  8. package/dist/application/BrowserEvidence.js +3 -8
  9. package/dist/application/BrowserScenarioEvidence.js +2 -18
  10. package/dist/application/CapabilityInventory.js +43 -9
  11. package/dist/application/ClientConfigurationDocument.js +69 -25
  12. package/dist/application/DirectAnalysis.js +29 -14
  13. package/dist/application/DirectAnalysisCleanup.js +72 -0
  14. package/dist/application/DirectAnalysisStatus.js +4 -5
  15. package/dist/application/Doctor.js +15 -19
  16. package/dist/application/DoctorDiagnostics.js +1 -2
  17. package/dist/application/EnhancedTools.js +51 -6
  18. package/dist/application/EvidenceBundleFiles.js +8 -3
  19. package/dist/application/InvestigationProviders.js +9 -1
  20. package/dist/application/JsonFiles.js +42 -9
  21. package/dist/application/LinuxHopper.js +9 -6
  22. package/dist/application/MacHopper.js +15 -18
  23. package/dist/application/RealHopperAssertions.js +0 -11
  24. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  25. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  26. package/dist/application/Setup.js +8 -16
  27. package/dist/application/SetupHost.js +16 -27
  28. package/dist/application/SetupPlan.js +6 -6
  29. package/dist/application/Uninstall.js +81 -29
  30. package/dist/application/UpdateMaintenance.js +7 -5
  31. package/dist/application/UpdateRuntime.js +12 -12
  32. package/dist/application/WebScriptExportService.js +30 -4
  33. package/dist/application/WorkflowEvidence.js +25 -2
  34. package/dist/application/XrefsAddressResolution.js +45 -0
  35. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  36. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  37. package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
  38. package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
  39. package/dist/application/binary/AnalysisSnapshotCache.js +10 -8
  40. package/dist/application/binary/BinarySession.js +70 -29
  41. package/dist/application/binary/BinarySessionComposition.js +1 -3
  42. package/dist/application/binary/BinarySessionExecution.js +3 -5
  43. package/dist/application/binary/BinarySessionOpen.js +1 -1
  44. package/dist/application/binary/BinarySessionRecords.js +1 -1
  45. package/dist/application/binary/BinarySessionStatus.js +1 -6
  46. package/dist/application/binary/CompositeProvider.js +4 -18
  47. package/dist/application/binary/LazyAnalysisProvider.js +5 -5
  48. package/dist/application/binary/SessionProviderRouter.js +27 -135
  49. package/dist/application/homebrew.js +48 -0
  50. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  51. package/dist/application/javascript/JavaScriptApplicationEvidence.js +2 -6
  52. package/dist/application/javascript/JavaScriptApplicationService.js +6 -1
  53. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -3
  54. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +11 -9
  55. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  56. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  57. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  58. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  59. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  60. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +43 -16
  61. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +46 -6
  62. package/dist/application/javascript/JavaScriptModuleRelationships.js +1 -1
  63. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
  64. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  65. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  66. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  67. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  68. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  69. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  70. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +42 -19
  71. package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
  72. package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
  73. package/dist/application/process/ProcessCli.js +11 -11
  74. package/dist/application/process/ProcessEvidence.js +0 -1
  75. package/dist/artifacts/ArtifactProvider.js +39 -14
  76. package/dist/artifacts/ArtifactReader.js +31 -0
  77. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  78. package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
  79. package/dist/artifacts/NativeDmgArtifactReader.js +65 -20
  80. package/dist/artifacts/SafeOutputTree.js +16 -2
  81. package/dist/artifacts/ZipArtifactReader.js +11 -4
  82. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
  83. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  84. package/dist/artifacts/apple/KeyedArchiveReader.js +21 -3
  85. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  86. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +67 -61
  87. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  88. package/dist/artifacts/inventory/reader.js +3 -3
  89. package/dist/artifacts/inventory/scanCanonical.js +48 -24
  90. package/dist/artifacts/inventory/scanReader.js +5 -9
  91. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  92. package/dist/browser/CdpBrowserProvider.js +2 -3
  93. package/dist/browser/CdpCaptureEventHandlers.js +2 -4
  94. package/dist/browser/CdpCaptureEvents.js +0 -1
  95. package/dist/browser/CdpCaptureValues.js +20 -0
  96. package/dist/browser/CdpElectronProvider.js +0 -2
  97. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  98. package/dist/browser/CdpElectronScripts.js +2 -3
  99. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  100. package/dist/browser/CdpSafeMetadata.js +10 -10
  101. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  102. package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
  103. package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
  104. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  105. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  106. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  107. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  108. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  109. package/dist/browser/history/CaptureFailures.js +6 -2
  110. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  111. package/dist/catalogIdentity.js +0 -1
  112. package/dist/cli/analysisViewCommands.js +36 -0
  113. package/dist/cli/artifactCommands.js +11 -12
  114. package/dist/cli/coreAnalysisCommands.js +3 -3
  115. package/dist/cli/coreBinaryCommands.js +32 -27
  116. package/dist/cli/coreNativeCommands.js +9 -10
  117. package/dist/cli/electronCommands.js +4 -4
  118. package/dist/cli/interactiveSetup.js +6 -6
  119. package/dist/cli/managedCommands.js +7 -8
  120. package/dist/cli/nativeCallCommands.js +1 -2
  121. package/dist/cli/omittableDefaults.js +50 -0
  122. package/dist/cli/processCommands.js +3 -2
  123. package/dist/cli/setupCommands.js +16 -15
  124. package/dist/cli/utilityCommands.js +9 -9
  125. package/dist/cli.js +16 -8
  126. package/dist/cliBrowserScenarioCommands.js +2 -2
  127. package/dist/cliCommandNames.js +1 -0
  128. package/dist/cliJsonInput.js +15 -1
  129. package/dist/cliOutput.js +0 -38
  130. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  131. package/dist/composition/binary.js +9 -9
  132. package/dist/composition/browserScenario.js +2 -1
  133. package/dist/composition/directAnalysis.js +20 -13
  134. package/dist/composition/electronScenario.js +1 -1
  135. package/dist/composition/optionalObservationProviders.js +12 -7
  136. package/dist/config/environment.js +6 -0
  137. package/dist/config/ghidraStartupTimeout.js +4 -9
  138. package/dist/config/homeDirectory.js +12 -0
  139. package/dist/config/mcpResponseBudget.js +9 -1
  140. package/dist/config/parseConfig.js +7 -3
  141. package/dist/config/parsers.js +19 -22
  142. package/dist/contracts/analysisViewToolContracts.js +56 -0
  143. package/dist/contracts/applicationToolContracts.js +5 -4
  144. package/dist/contracts/artifactComparisonExample.js +2 -2
  145. package/dist/contracts/artifactToolContracts.js +1 -1
  146. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  147. package/dist/contracts/browserToolContracts.js +19 -15
  148. package/dist/contracts/enhancedInputs.js +2 -2
  149. package/dist/contracts/enhancedToolContracts.js +4 -3
  150. package/dist/contracts/evm/evmToolContracts.js +1 -1
  151. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  152. package/dist/contracts/inputSchemaPresentation.js +90 -0
  153. package/dist/contracts/investigationExamples.js +4 -3
  154. package/dist/contracts/javascript/electronToolContracts.js +1 -1
  155. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  156. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  157. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  158. package/dist/contracts/managed/managedToolContracts.js +5 -10
  159. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  160. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  161. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  162. package/dist/contracts/native/nativeToolContracts.js +2 -2
  163. package/dist/contracts/officialToolContracts.js +2 -1
  164. package/dist/contracts/promptContracts.js +2 -2
  165. package/dist/contracts/providerSelection.js +1 -1
  166. package/dist/contracts/sessionToolContracts.js +14 -2
  167. package/dist/contracts/sessionToolSchemas.js +1 -14
  168. package/dist/contracts/toolContracts.js +2 -0
  169. package/dist/contracts/toolEffects.js +1 -0
  170. package/dist/contracts/toolOutputSchemaGroups.js +136 -92
  171. package/dist/contracts/toolOutputSchemaPrimitives.js +11 -21
  172. package/dist/contracts/toolSchemaMetadata.js +18 -69
  173. package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
  174. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  175. package/dist/contracts/webScriptToolContracts.js +1 -1
  176. package/dist/doctorRuntime.js +7 -5
  177. package/dist/domain/analysisErrorCore.js +3 -0
  178. package/dist/domain/analysisErrorPresentation.js +18 -3
  179. package/dist/domain/analysisErrorProjection.js +24 -5
  180. package/dist/domain/analysisSnapshot.js +29 -31
  181. package/dist/domain/analysisView/analysisView.js +243 -0
  182. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  183. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  184. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  185. package/dist/domain/android/androidApplication.js +1 -1
  186. package/dist/domain/apple/appleApplication.js +1 -1
  187. package/dist/domain/apple/dylibResolution.js +10 -3
  188. package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
  189. package/dist/domain/apple/keyedArchive.js +26 -2
  190. package/dist/domain/artifactComparison.js +15 -6
  191. package/dist/domain/artifactGraph.js +16 -3
  192. package/dist/domain/artifactInventoryEvidence.js +9 -16
  193. package/dist/domain/artifactOperationError.js +3 -3
  194. package/dist/domain/artifactPartialObservation.js +1 -0
  195. package/dist/domain/artifactPathSyntax.js +49 -0
  196. package/dist/domain/binaryTarget.js +39 -13
  197. package/dist/domain/browserCaptureComparison.js +13 -49
  198. package/dist/domain/browserNetworkEvidence.js +10 -4
  199. package/dist/domain/browserObservation.js +0 -1
  200. package/dist/domain/browserObservationSchemas.js +14 -3
  201. package/dist/domain/browserScenario.js +0 -1
  202. package/dist/domain/browserScenarioCapture.js +1 -2
  203. package/dist/domain/browserScenarioDiff.js +0 -2
  204. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  205. package/dist/domain/browserScenarioDiffValues.js +2 -2
  206. package/dist/domain/browserScenarioValues.js +3 -4
  207. package/dist/domain/callPath.js +8 -9
  208. package/dist/domain/callPathSchemas.js +2 -2
  209. package/dist/domain/changedBehavior.js +3 -3
  210. package/dist/domain/completionLedgerGeneration.js +2 -1
  211. package/dist/domain/configurationErrors.js +12 -0
  212. package/dist/domain/conformancePackage.js +4 -3
  213. package/dist/domain/evidence.js +10 -36
  214. package/dist/domain/evidenceBundle.js +7 -9
  215. package/dist/domain/evidenceCompletionLedger.js +2 -1
  216. package/dist/domain/functionComparison.js +4 -5
  217. package/dist/domain/functionComparisonDimensions.js +120 -87
  218. package/dist/domain/functionComparisonNormalization.js +23 -34
  219. package/dist/domain/functionComparisonResults.js +1 -4
  220. package/dist/domain/functionComparisonSchemas.js +2 -8
  221. package/dist/domain/functionDossierEvidence.js +2 -37
  222. package/dist/domain/javascript/electronActiveObservation.js +26 -69
  223. package/dist/domain/javascript/electronObservation.js +14 -3
  224. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  225. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  226. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  227. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  228. package/dist/domain/javascript/javascriptApplicationGraph.js +26 -3
  229. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  230. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  231. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  232. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  233. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  234. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  235. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  236. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  237. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  238. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  239. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  240. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  241. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  242. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  243. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  244. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  245. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  246. package/dist/domain/javascript/javascriptSemanticAnalysis.js +9 -3
  247. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  248. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  249. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  250. package/dist/domain/javascript/javascriptSemanticDataEffects.js +1 -1
  251. package/dist/domain/javascript/javascriptSemanticGraph.js +88 -46
  252. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  253. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  254. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  255. package/dist/domain/javascript/javascriptSemanticPrimitives.js +1 -12
  256. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  257. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  258. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
  259. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  260. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  261. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  262. package/dist/domain/javascript/javascriptSemanticValues.js +47 -54
  263. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  264. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
  265. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +0 -1
  266. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  267. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  268. package/dist/domain/localPath.js +1 -1
  269. package/dist/domain/managed/managedArtifact.js +6 -4
  270. package/dist/domain/managed/managedMemberComparison.js +2 -9
  271. package/dist/domain/managed/managedNativeVerification.js +0 -2
  272. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  273. package/dist/domain/native/binaryLayout.js +2 -3
  274. package/dist/domain/native/nativeApiBoundary.js +1 -1
  275. package/dist/domain/native/nativeCallObservation.js +5 -3
  276. package/dist/domain/native/nativeInstruction.js +7 -0
  277. package/dist/domain/native/recordedCrash.js +2 -3
  278. package/dist/domain/offsetDateTime.js +17 -0
  279. package/dist/domain/process/processCapture.js +13 -12
  280. package/dist/domain/process/processCaptureCoverage.js +67 -0
  281. package/dist/domain/process/processCaptureExample.js +2 -1
  282. package/dist/domain/process/processCaptureParsing.js +1 -34
  283. package/dist/domain/process/processCaptureValidation.js +81 -13
  284. package/dist/domain/process/processComparison.js +41 -22
  285. package/dist/domain/process/processObservation.js +10 -2
  286. package/dist/domain/process/processScenario.js +24 -2
  287. package/dist/domain/process/processTraceComparison.js +0 -2
  288. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  289. package/dist/domain/process/processTraceEvaluation.js +15 -11
  290. package/dist/domain/process/processTraceSpecification.js +3 -4
  291. package/dist/domain/providerAdapterError.js +2 -0
  292. package/dist/domain/reconstructionCoverage.js +5 -2
  293. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  294. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  295. package/dist/domain/reconstructionVerification.js +3 -3
  296. package/dist/domain/reconstructionVerificationSchemas.js +2 -1
  297. package/dist/domain/referenceSourceGraph.js +20 -21
  298. package/dist/domain/staticRuntimeCorrelation.js +2 -2
  299. package/dist/domain/stringPatterns.js +6 -0
  300. package/dist/domain/swiftSymbolClassification.js +61 -0
  301. package/dist/domain/symbolAnalysis.js +66 -18
  302. package/dist/domain/webCaptureDiff.js +0 -1
  303. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  304. package/dist/domain/webEventListeners.js +3 -2
  305. package/dist/domain/webExecution.js +3 -2
  306. package/dist/domain/webRuntime.js +0 -2
  307. package/dist/domain/webScriptExport.js +1 -1
  308. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  309. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  310. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  311. package/dist/dotnet/ManagedMemberRows.js +75 -62
  312. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  313. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  314. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  315. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  316. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  317. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  318. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  319. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  320. package/dist/evaluation/CodexAgentEval.js +12 -8
  321. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  322. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  323. package/dist/firmware/FirmwareCommand.js +9 -5
  324. package/dist/firmware/FirmwareProvider.js +4 -4
  325. package/dist/generatedPackageMetadata.js +2 -2
  326. package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
  327. package/dist/ghidra/GhidraClient.js +91 -32
  328. package/dist/ghidra/GhidraClientStartup.js +0 -2
  329. package/dist/ghidra/GhidraDoctor.js +6 -5
  330. package/dist/ghidra/GhidraFunctionValues.js +3 -5
  331. package/dist/ghidra/GhidraInstallation.js +40 -12
  332. package/dist/ghidra/GhidraJavaLaunch.js +6 -2
  333. package/dist/ghidra/GhidraLauncher.js +15 -7
  334. package/dist/ghidra/GhidraProvider.js +6 -2
  335. package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
  336. package/dist/ghidra/GhidraProviderClient.js +13 -3
  337. package/dist/ghidra/GhidraSessionError.js +2 -0
  338. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  339. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  340. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  341. package/dist/hopper/BridgeLauncher.js +34 -45
  342. package/dist/hopper/HopperAnalysisProfile.js +3 -8
  343. package/dist/hopper/HopperCleanup.js +56 -27
  344. package/dist/hopper/HopperClient.js +86 -65
  345. package/dist/hopper/HopperMachOImage.js +3 -2
  346. package/dist/hopper/HopperProvider.js +16 -18
  347. package/dist/hopper/HopperRegexSearch.js +3 -6
  348. package/dist/hopper/HopperTargetLease.js +132 -49
  349. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  350. package/dist/ida/IdaConfiguration.js +8 -3
  351. package/dist/ida/IdaInput.js +1 -7
  352. package/dist/ida/IdaMcpConnection.js +8 -4
  353. package/dist/ida/IdaOperationRunner.js +3 -3
  354. package/dist/ida/IdaProvider.js +8 -12
  355. package/dist/ida/IdaSessionClient.js +20 -18
  356. package/dist/ida/IdaWorkspace.js +12 -13
  357. package/dist/inspector/V8InspectorCaptureProjection.js +1 -1
  358. package/dist/inspector/V8InspectorProvider.js +38 -28
  359. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  360. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  361. package/dist/main/shutdown.js +11 -3
  362. package/dist/main/startup.js +9 -2
  363. package/dist/main/transport.js +22 -2
  364. package/dist/main.js +11 -18
  365. package/dist/native/AppleMachoSelection.js +16 -6
  366. package/dist/native/CommandRunner.js +9 -7
  367. package/dist/native/LldbCallTracer.js +8 -2
  368. package/dist/native/NativeMacOSProvider.js +25 -15
  369. package/dist/native/NativeUiHelperRuntime.js +11 -2
  370. package/dist/native/NativeUiObservation.js +2 -2
  371. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  372. package/dist/process/DarwinProcessRunTokenReader.js +16 -2
  373. package/dist/process/ExecFileOutput.js +88 -6
  374. package/dist/process/PrivateRuntimeRoot.js +10 -5
  375. package/dist/process/ProcessOwnership.js +1 -4
  376. package/dist/process/ProcessOwnershipObservation.js +11 -5
  377. package/dist/process/ProviderProcess.js +1 -3
  378. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  379. package/dist/process/capture/ProcessCaptureError.js +13 -0
  380. package/dist/process/capture/ProcessCaptureLifecycle.js +158 -70
  381. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  382. package/dist/process/capture/ProcessHarness.js +21 -25
  383. package/dist/process/capture/ProcessNormalization.js +20 -2
  384. package/dist/process/capture/ProcessSampling.js +25 -2
  385. package/dist/process/capture/TerminalRenderer.js +14 -0
  386. package/dist/process/snapshotEnvironment.js +14 -0
  387. package/dist/server/EvidenceMcpServer.js +25 -14
  388. package/dist/server/createServer.js +49 -36
  389. package/dist/server/mcpClientMetadata.js +12 -5
  390. package/dist/server/promptCompletion.js +3 -8
  391. package/dist/server/registerAnalysisViewTool.js +15 -0
  392. package/dist/server/registerAndroidTools.js +2 -3
  393. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  394. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  395. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  396. package/dist/server/registerApplicationTools/coverage.js +1 -2
  397. package/dist/server/registerApplicationTools/helpers.js +1 -2
  398. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  399. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  400. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  401. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  402. package/dist/server/registerArtifactComparisonTool.js +4 -5
  403. package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
  404. package/dist/server/registerBrowserScenarioTool.js +3 -4
  405. package/dist/server/registerBrowserTools.js +13 -16
  406. package/dist/server/registerBundleComparisonTool.js +5 -6
  407. package/dist/server/registerCloseLifecycleTool.js +2 -3
  408. package/dist/server/registerElectronTools.js +10 -13
  409. package/dist/server/registerEnhancedTools.js +23 -23
  410. package/dist/server/registerEvidenceTools.js +3 -4
  411. package/dist/server/registerEvmTools.js +2 -3
  412. package/dist/server/registerFirmwareTools.js +2 -3
  413. package/dist/server/registerFunctionComparisonTool.js +7 -8
  414. package/dist/server/registerInvestigationTools.js +14 -15
  415. package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
  416. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
  417. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
  418. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
  419. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
  420. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
  421. package/dist/server/registerOfficialTools.js +4 -19
  422. package/dist/server/registerProcessComparisonTool.js +8 -8
  423. package/dist/server/registerRecordedCrashTools.js +2 -3
  424. package/dist/server/registerSessionRecordTools.js +15 -19
  425. package/dist/server/registerSessionStatusTool.js +3 -4
  426. package/dist/server/registerSessionTools.js +12 -18
  427. package/dist/server/registerWebModuleTool.js +2 -3
  428. package/dist/server/registerWebNetworkCaptureTool.js +2 -3
  429. package/dist/server/registerWebRuntimeTools.js +4 -5
  430. package/dist/server/registerWebScriptTool.js +2 -3
  431. package/dist/server/registerWebSourceLocationTool.js +2 -3
  432. package/dist/server/toolResult.js +66 -94
  433. package/dist/server/toolResultEncoding.js +11 -10
  434. package/dist/windows/WindowsNativeLoader.js +1 -0
  435. package/dist/windows/WindowsOwnedProcess.js +60 -15
  436. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  437. package/native/windows/README.md +3 -1
  438. package/native/windows/build/manifest.json +2 -2
  439. package/native/windows/build/rea-windows-x64.node +0 -0
  440. package/package.json +39 -30
  441. package/scripts/rea.mjs +3 -6
  442. package/skills/reverse-engineer-anything/SKILL.md +9 -8
  443. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  444. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  445. package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
  446. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  447. package/dist/config.js +0 -1
  448. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  449. package/dist/contracts/process/processCaptureExample.js +0 -2
  450. package/dist/contracts/toolOutputSchemas.js +0 -2
  451. package/dist/main/reload.js +0 -12
  452. package/dist/main/state.js +0 -3
  453. package/dist/server/sessionToolPolicies.js +0 -2
@@ -1,4 +1,4 @@
1
- import { AnalysisError } from "./analysisErrorBase.js";
1
+ import { AnalysisError, } from "./analysisErrorBase.js";
2
2
  /** Artifact inventory or extraction failed a typed safety boundary. */
3
3
  export class ArtifactOperationError extends AnalysisError {
4
4
  operation;
@@ -8,10 +8,10 @@ export class ArtifactOperationError extends AnalysisError {
8
8
  _tag = "ArtifactOperationError";
9
9
  constructor(operation, reason, artifactDetails,
10
10
  /** The specific constraint that failed, such as the colliding path. */
11
- detail) {
11
+ detail, options) {
12
12
  super(artifactDetails === undefined
13
13
  ? `Artifact ${operation} failed: ${reason}`
14
- : `Artifact ${operation} failed: ${reason} at ${artifactDetails.logicalPath} (declared_sha256=${artifactDetails.declaredSha256 ?? "unavailable"}, calculated_sha256=${artifactDetails.calculatedSha256 ?? "unavailable"}, unpacked=${String(artifactDetails.unpacked)})`);
14
+ : `Artifact ${operation} failed: ${reason} at ${artifactDetails.logicalPath} (declared_sha256=${artifactDetails.declaredSha256 ?? "unavailable"}, calculated_sha256=${artifactDetails.calculatedSha256 ?? "unavailable"}, unpacked=${String(artifactDetails.unpacked)})`, options);
15
15
  this.operation = operation;
16
16
  this.reason = reason;
17
17
  this.artifactDetails = artifactDetails;
@@ -0,0 +1 @@
1
+ export {};
@@ -24,3 +24,52 @@ export const stripQueryAndFragment = (value) => value.split("#", 1)[0]?.split("?
24
24
  export const admitsCanonicalPathSyntax = (value) => !value.includes("\0") &&
25
25
  !value.includes("\\") &&
26
26
  !/%(?:2e|2f|5c)/iu.test(value);
27
+ /** C0 controls and space, which the URL parser strips around its input. */
28
+ const isUrlTrimmed = (code) => code <= 0x20;
29
+ /**
30
+ * The URL text a browser parses from an HTML URL attribute: HTML strips
31
+ * surrounding ASCII whitespace, and the URL parser strips surrounding C0
32
+ * controls and spaces and removes every tab and newline.
33
+ */
34
+ export const htmlUrlText = (value) => {
35
+ let start = 0;
36
+ let end = value.length;
37
+ while (start < end && isUrlTrimmed(value.charCodeAt(start)))
38
+ start += 1;
39
+ while (end > start && isUrlTrimmed(value.charCodeAt(end - 1)))
40
+ end -= 1;
41
+ return value.slice(start, end).replace(/[\t\n\r]/gu, "");
42
+ };
43
+ const UTF8 = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
44
+ const UTF8_ENCODER = new TextEncoder();
45
+ /**
46
+ * Percent-decode a URL path as the URL standard does: valid `%XX` sequences
47
+ * become bytes and any other `%` stays literal. Returns null when the bytes
48
+ * are not UTF-8 or include NUL, because no canonical artifact path can match
49
+ * them. Callers refuse encoded dot and separator bytes before decoding.
50
+ */
51
+ export const percentDecodeUrlPath = (value) => {
52
+ if (!/%[0-9a-f]{2}/iu.test(value))
53
+ return value;
54
+ const bytes = [];
55
+ for (let index = 0; index < value.length;) {
56
+ const escape = value.slice(index, index + 3);
57
+ if (/^%[0-9a-f]{2}$/iu.test(escape)) {
58
+ bytes.push(Number.parseInt(escape.slice(1), 16));
59
+ index += 3;
60
+ continue;
61
+ }
62
+ const character = String.fromCodePoint(value.codePointAt(index) ?? 0);
63
+ bytes.push(...UTF8_ENCODER.encode(character));
64
+ index += character.length;
65
+ }
66
+ try {
67
+ const decoded = UTF8.decode(new Uint8Array(bytes));
68
+ return decoded.includes("\0") ? null : decoded;
69
+ }
70
+ catch (cause) {
71
+ // Invalid UTF-8 cannot name an inventoried path.
72
+ void cause;
73
+ return null;
74
+ }
75
+ };
@@ -7,32 +7,38 @@ import { mzWindowsHeaderOffset, parseDosMzHeader } from "./dosMz.js";
7
7
  export const parseExecutableHeader = (bytes, hostArchitecture, fileSize = bytes.length) => {
8
8
  if (bytes.length >= 4 &&
9
9
  bytes.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46])))
10
- return parseElf(bytes);
10
+ return parseElf(bytes, fileSize);
11
11
  if (bytes.length >= 2 && bytes[0] === 0x4d && bytes[1] === 0x5a)
12
12
  return parseMz(bytes, fileSize);
13
13
  if (bytes.length < 8)
14
14
  return err("truncated or unsupported binary header");
15
15
  const magic = bytes.readUInt32BE(0);
16
16
  if ([0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe].includes(magic))
17
- return parseThinMachO(bytes, magic);
17
+ return parseThinMachO(bytes, magic, fileSize);
18
18
  if ([0xcafebabe, 0xbebafeca, 0xcafebabf, 0xbfbafeca].includes(magic))
19
- return parseFatMachO(bytes, magic, hostArchitecture);
19
+ return parseFatMachO(bytes, magic, hostArchitecture, fileSize);
20
20
  return err("unsupported binary format");
21
21
  };
22
- const parseThinMachO = (bytes, magic) => {
23
- if (bytes.length < 8)
24
- return err("truncated Mach-O header");
22
+ const parseThinMachO = (bytes, magic, fileSize) => {
23
+ const is64 = magic === 0xfeedfacf || magic === 0xcffaedfe;
24
+ const headerSize = is64 ? 32 : 28;
25
+ if (bytes.length < headerSize)
26
+ return err(`truncated Mach-O header: a ${is64 ? 64 : 32}-bit header needs ${headerSize} bytes; the file has ${fileSize}`);
25
27
  const little = magic === 0xcefaedfe || magic === 0xcffaedfe;
26
- const architecture = machArchitecture(little ? bytes.readUInt32LE(4) : bytes.readUInt32BE(4));
28
+ const read = (offset) => little ? bytes.readUInt32LE(offset) : bytes.readUInt32BE(offset);
29
+ const architecture = machArchitecture(read(4));
27
30
  if (architecture === undefined)
28
31
  return err("unsupported Mach-O architecture");
32
+ const commandBytes = read(20);
33
+ if (headerSize + commandBytes > fileSize)
34
+ return err(`truncated Mach-O load commands: the header declares ${commandBytes} bytes after its ${headerSize}-byte header; the file has ${fileSize}`);
29
35
  return ok({
30
36
  format: "mach-o",
31
37
  architecture,
32
38
  availableArchitectures: [architecture],
33
39
  });
34
40
  };
35
- const parseFatMachO = (bytes, magic, host) => {
41
+ const parseFatMachO = (bytes, magic, host, fileSize) => {
36
42
  const little = magic === 0xbebafeca || magic === 0xbfbafeca;
37
43
  const is64 = magic === 0xcafebabf || magic === 0xbfbafeca;
38
44
  if (bytes.length < 8)
@@ -43,10 +49,24 @@ const parseFatMachO = (bytes, magic, host) => {
43
49
  if (count === 0 || count > 128 || bytes.length < 8 + count * entrySize)
44
50
  return err("truncated or invalid FAT architecture table");
45
51
  const architectures = [];
52
+ const sliceEnds = new Map();
46
53
  for (let index = 0; index < count; index += 1) {
47
- const architecture = machArchitecture(read(8 + index * entrySize));
48
- if (architecture !== undefined && !architectures.includes(architecture))
49
- architectures.push(architecture);
54
+ const entry = 8 + index * entrySize;
55
+ const architecture = machArchitecture(read(entry));
56
+ if (architecture === undefined || architectures.includes(architecture))
57
+ continue;
58
+ architectures.push(architecture);
59
+ const offset = is64
60
+ ? little
61
+ ? bytes.readBigUInt64LE(entry + 8)
62
+ : bytes.readBigUInt64BE(entry + 8)
63
+ : BigInt(read(entry + 8));
64
+ const size = is64
65
+ ? little
66
+ ? bytes.readBigUInt64LE(entry + 16)
67
+ : bytes.readBigUInt64BE(entry + 16)
68
+ : BigInt(read(entry + 12));
69
+ sliceEnds.set(architecture, offset + size);
50
70
  }
51
71
  const preferred = host === "arm64"
52
72
  ? "arm64"
@@ -59,20 +79,26 @@ const parseFatMachO = (bytes, magic, host) => {
59
79
  : undefined;
60
80
  if (preferred === undefined || !architectures.includes(preferred))
61
81
  return err(`FAT binary has no host-compatible ${host} architecture`);
82
+ const sliceEnd = sliceEnds.get(preferred) ?? 0n;
83
+ if (sliceEnd > BigInt(fileSize))
84
+ return err(`truncated FAT slice: the ${preferred} slice ends at byte ${sliceEnd}; the file has ${fileSize}`);
62
85
  return ok({
63
86
  format: "mach-o",
64
87
  architecture: preferred,
65
88
  availableArchitectures: architectures,
66
89
  });
67
90
  };
68
- const parseElf = (bytes) => {
69
- if (bytes.length < 20)
91
+ const parseElf = (bytes, fileSize) => {
92
+ if (bytes.length < 6)
70
93
  return err("truncated ELF header");
71
94
  if (bytes[4] !== 1 && bytes[4] !== 2)
72
95
  return err("unsupported ELF class");
73
96
  const little = bytes[5] === 1;
74
97
  if (!little && bytes[5] !== 2)
75
98
  return err("unsupported ELF endianness");
99
+ const headerSize = bytes[4] === 1 ? 52 : 64;
100
+ if (bytes.length < headerSize)
101
+ return err(`truncated ELF header: an ELF${bytes[4] === 1 ? 32 : 64} header needs ${headerSize} bytes; the file has ${fileSize}`);
76
102
  const machine = little ? bytes.readUInt16LE(18) : bytes.readUInt16BE(18);
77
103
  const architecture = elfArchitecture(machine);
78
104
  if (architecture === undefined)
@@ -1,41 +1,14 @@
1
1
  import { z } from "zod";
2
- import { browserScenarioDiffSchema, compareBrowserScenarios, compareBrowserScenariosInputSchema, } from "./browserScenarioDiff.js";
3
- import { compareWebCaptures, captureSnapshotSchema, webCaptureDiffSchema, } from "./webCaptureDiff.js";
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
- });
2
+ import { compareBrowserScenarios } from "./browserScenarioDiff.js";
3
+ import { compareWebCaptures } from "./webCaptureDiff.js";
4
+ import { browserScenarioDiffSchema, compareBrowserScenariosInputSchema, } from "./browserScenarioDiffValues.js";
5
+ import { compareWebCapturesInputSchema, webCaptureDiffSchema, } from "./webCaptureDiffSchemas.js";
6
+ /** Mutually exclusive passive and scenario capture comparison inputs. */
7
+ export const browserCaptureComparisonInputSchema = z.union([compareWebCapturesInputSchema, compareBrowserScenariosInputSchema], {
8
+ // Standard Schema clients expose the union message, not its branch errors.
9
+ error: (issue) => issue.code === "invalid_union"
10
+ ? z.prettifyError(new z.ZodError(issue.errors.flat()))
11
+ : undefined,
39
12
  });
40
13
  /** Result from passive page or browser scenario comparison. */
41
14
  export const browserCaptureComparisonSchema = z.union([
@@ -43,15 +16,6 @@ export const browserCaptureComparisonSchema = z.union([
43
16
  webCaptureDiffSchema,
44
17
  ]);
45
18
  /** Dispatch a parsed capture comparison to its pure domain comparator. */
46
- export const compareBrowserCaptures = (input) => isScenarioComparison(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
- };
19
+ export const compareBrowserCaptures = (input) => "before_scenario" in input
20
+ ? compareBrowserScenarios(input)
21
+ : compareWebCaptures(input);
@@ -1,13 +1,19 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { z } from "zod";
3
- /** Caller-selected network content; omission retains metadata alone. */
3
+ /** Resolved network content selection recorded by a capture. */
4
4
  export const browserNetworkContentSelectionValuesSchema = z.strictObject({
5
+ request_body: z.boolean(),
6
+ response_body: z.boolean(),
7
+ header_values: z.boolean(),
8
+ });
9
+ /** Caller omission selects metadata alone; individual content facets remain optional. */
10
+ export const browserNetworkContentSelectionSchema = browserNetworkContentSelectionValuesSchema
11
+ .extend({
5
12
  request_body: z.boolean().default(false),
6
13
  response_body: z.boolean().default(false),
7
14
  header_values: z.boolean().default(false),
8
- });
9
- /** Input omission selects metadata without defaulting legacy capture coverage. */
10
- export const browserNetworkContentSelectionSchema = browserNetworkContentSelectionValuesSchema.default({
15
+ })
16
+ .default({
11
17
  request_body: false,
12
18
  response_body: false,
13
19
  header_values: false,
@@ -1,5 +1,4 @@
1
1
  import { z } from "zod";
2
- export { browserTargetListSchema, webPageInspectionSchema, } from "./browserObservationSchemas.js";
3
2
  const parseExactOrigin = (value) => {
4
3
  let url;
5
4
  try {
@@ -81,9 +81,20 @@ const browserScriptSchema = z.object({
81
81
  frame_id: z.string().nullable().default(null),
82
82
  url: z.string(),
83
83
  origin: z.string().nullable(),
84
- cdp_hash: z.string(),
85
- length: z.number().int().min(0),
86
- is_module: z.boolean(),
84
+ cdp_hash: z
85
+ .string()
86
+ .nullable()
87
+ .describe("Producer-reported script hash; null when unavailable."),
88
+ length: z
89
+ .number()
90
+ .int()
91
+ .min(0)
92
+ .nullable()
93
+ .describe("Producer-reported script length; null when unavailable."),
94
+ is_module: z
95
+ .boolean()
96
+ .nullable()
97
+ .describe("Producer-reported module classification; null when unavailable."),
87
98
  language: z.string().nullable(),
88
99
  source_map_url: z.string().nullable(),
89
100
  resource_reconciliation: browserResourceReconciliationSchema,
@@ -1,6 +1,5 @@
1
1
  import { z } from "zod";
2
2
  import { browserScenarioActionSchema, browserScenarioBrowserSchema, browserScenarioCaptureSchema, browserScenarioEnvironmentSchema, browserScenarioSecretSchema, browserScenarioStorageSchema, browserScenarioUrlSchema, } from "./browserScenarioValues.js";
3
- export {} from "./browserScenarioValues.js";
4
3
  export const browserScenarioInputSchema = z.strictObject({
5
4
  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
5
  start_url: browserScenarioUrlSchema.describe("Required initial HTTP(S) URL. Query values must be declared separately as public literals or secret references."),
@@ -1,7 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { browserNetworkContentSelectionValuesSchema } from "./browserNetworkEvidence.js";
3
3
  import { browserScenarioCompletenessSchema, browserScenarioEventSchema, browserScenarioStepSchema, } from "./browserScenarioCaptureValues.js";
4
- export { classifyBrowserScenarioCompleteness, browserScenarioEventSchema, browserScenarioStepSchema, browserStepArtifactsSchema, } from "./browserScenarioCaptureValues.js";
5
4
  /** Step-indexed browser scenario observation. */
6
5
  export const browserScenarioCaptureSchema = z
7
6
  .strictObject({
@@ -16,7 +15,7 @@ export const browserScenarioCaptureSchema = z
16
15
  start_origin: z.string().min(1),
17
16
  action_count: z.number().int().min(1),
18
17
  secret_references: z.array(z.string().min(1)),
19
- network_content: browserNetworkContentSelectionValuesSchema.optional(),
18
+ network_content: browserNetworkContentSelectionValuesSchema,
20
19
  }),
21
20
  duration_ms: z.number().int().min(0),
22
21
  steps: z.array(browserScenarioStepSchema).min(1),
@@ -1,8 +1,6 @@
1
- import {} from "./browserScenarioCapture.js";
2
1
  import { actionState, artifactEvidenceState, captured, eventEvidenceState, eventsFor, networkContentCoverageReason, screenshotProjection, } from "./browserScenarioDiffEvidence.js";
3
2
  import { browserScenarioDiffSchema, } from "./browserScenarioDiffValues.js";
4
3
  import { commitBrowserScenarioNormalization, digestNormalizedScenarioValue, } from "./browserScenarioNormalization.js";
5
- export { browserScenarioDiffSchema, compareBrowserScenariosInputSchema, } from "./browserScenarioDiffValues.js";
6
4
  /** Compare scenario steps by stable step ID and apply only committed literal rules. */
7
5
  export const compareBrowserScenarios = (input) => {
8
6
  const normalization = commitBrowserScenarioNormalization(input.normalization);
@@ -54,18 +54,6 @@ export const eventsFor = (capture, stepIndex) => {
54
54
  export const networkContentCoverageReason = (before, after) => {
55
55
  const left = before.scenario.network_content;
56
56
  const right = after.scenario.network_content;
57
- if (left === undefined || right === undefined) {
58
- const events = [...before.events.items, ...after.events.items];
59
- if (events.some((event) => event.kind === "network-content") ||
60
- ((left === undefined) !== (right === undefined) &&
61
- events.some((event) => event.kind === "request" ||
62
- event.kind === "response" ||
63
- event.kind === "request-failed" ||
64
- event.kind === "request-finished" ||
65
- event.kind === "request-unfinished")))
66
- return "Network content selection is unknown in a legacy capture; capture both sides with matching content selection.";
67
- return undefined;
68
- }
69
57
  return left.request_body !== right.request_body ||
70
58
  left.response_body !== right.response_body ||
71
59
  left.header_values !== right.header_values
@@ -62,8 +62,8 @@ const normalizationInputSchema = z
62
62
  });
63
63
  /** Input for step-aligned comparison of two browser scenario captures. */
64
64
  export const compareBrowserScenariosInputSchema = z.strictObject({
65
- before_scenario: browserScenarioCaptureSchema.describe("Earlier complete capture_browser_scenario result."),
66
- after_scenario: browserScenarioCaptureSchema.describe("Later complete capture_browser_scenario result."),
65
+ before_scenario: browserScenarioCaptureSchema.describe("Earlier complete normalized_result from capture_browser_scenario."),
66
+ after_scenario: browserScenarioCaptureSchema.describe("Later complete normalized_result from capture_browser_scenario."),
67
67
  normalization: normalizationInputSchema
68
68
  .default({ rules: [] })
69
69
  .describe("Exact-literal rules committed in the comparison result."),
@@ -1,10 +1,9 @@
1
1
  import { z } from "zod";
2
+ import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
2
3
  import { isAbsoluteLocalPath, localPathStringSchema } from "./localPath.js";
3
4
  import { browserNetworkContentSelectionSchema } from "./browserNetworkEvidence.js";
4
5
  import { browserEndpointSchema, browserOriginSchema, } from "./browserObservation.js";
5
- export const scenarioIdentifierSchema = z
6
- .string()
7
- .regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
6
+ export const scenarioIdentifierSchema = z.string().regex(IDENTIFIER_PATTERN);
8
7
  const browserExecutablePathSchema = localPathStringSchema.refine(isAbsoluteLocalPath, {
9
8
  message: "executable_path must be an absolute local filesystem path (for example /opt/chromium/chrome or C:\\chromium\\chrome.exe)",
10
9
  });
@@ -84,7 +83,7 @@ export const browserScenarioEnvironmentSchema = z
84
83
  timezone: z
85
84
  .string()
86
85
  .min(1)
87
- .regex(/^[A-Za-z0-9_+-]+(?:\/[A-Za-z0-9_+-]+)*$/u)
86
+ .regex(/^[A-Za-z0-9_+\x2d]+(?:\x2f[A-Za-z0-9_+\x2d]+)*$/u)
88
87
  .default("UTC"),
89
88
  color_scheme: z.enum(["light", "dark", "no-preference"]).default("light"),
90
89
  reduced_motion: z.enum(["reduce", "no-preference"]).default("reduce"),
@@ -1,6 +1,5 @@
1
1
  import { callPathInputSchema, callPathResultSchema, parseCallPathAddress, } from "./callPathSchemas.js";
2
2
  import { parseFunctionEvidence, } from "./functionDossierEvidence.js";
3
- export { callPathInputSchema, callPathResultSchema };
4
3
  /** Minimal directed caller-to-callee adjacency for call-path search. */
5
4
  class CallGraph {
6
5
  successors = new Map();
@@ -112,8 +111,8 @@ const parseSnapshots = (groups) => {
112
111
  const snapshots = new Map();
113
112
  for (const group of groups) {
114
113
  const snapshot = parseFunctionEvidence(group);
115
- const address = normalizeAddress(snapshot.procedure.address);
116
- for (const callee of snapshot.collections.callees.items)
114
+ const address = normalizeAddress(snapshot.dossier.procedure.address);
115
+ for (const callee of snapshot.dossier.callees)
117
116
  normalizeAddress(callee.address);
118
117
  if (snapshots.has(address))
119
118
  throw new TypeError(`Duplicate function Evidence for ${address}`);
@@ -131,9 +130,9 @@ const assertCompatible = (snapshots) => {
131
130
  snapshot.subject.format !== first.subject.format ||
132
131
  snapshot.subject.architecture !== first.subject.architecture)
133
132
  throw new TypeError("Call-path Evidence mixes artifact subjects");
134
- if (snapshot.provider.id !== first.provider.id ||
135
- snapshot.provider.name !== first.provider.name ||
136
- snapshot.provider.version !== first.provider.version)
133
+ if (snapshot.evidence.provider.id !== first.evidence.provider.id ||
134
+ snapshot.evidence.provider.name !== first.evidence.provider.name ||
135
+ snapshot.evidence.provider.version !== first.evidence.provider.version)
137
136
  throw new TypeError("Call-path Evidence mixes providers");
138
137
  }
139
138
  };
@@ -141,7 +140,7 @@ const createGraph = (snapshots) => {
141
140
  const graph = new CallGraph();
142
141
  for (const [address, snapshot] of snapshots) {
143
142
  graph.mergeNode(address);
144
- for (const callee of snapshot.collections.callees.items) {
143
+ for (const callee of snapshot.dossier.callees) {
145
144
  const calleeAddress = normalizeAddress(callee.address);
146
145
  graph.mergeNode(calleeAddress);
147
146
  graph.mergeDirectedEdge(address, calleeAddress);
@@ -249,7 +248,7 @@ const citePath = (addresses, snapshots) => {
249
248
  (index > 0 ? snapshots.get(addresses[index - 1] ?? "") : undefined);
250
249
  return {
251
250
  address,
252
- name: snapshot?.procedure.name ?? null,
251
+ name: snapshot?.dossier.procedure.name ?? null,
253
252
  evidence_links: snapshotLinks(supporting),
254
253
  };
255
254
  });
@@ -267,7 +266,7 @@ const citePath = (addresses, snapshots) => {
267
266
  const snapshotLinks = (snapshot) => {
268
267
  if (snapshot === undefined)
269
268
  throw new TypeError("Every call-path claim requires supporting Evidence");
270
- return snapshot.evidence.map(({ evidence_id }) => evidence_id);
269
+ return [snapshot.evidence.evidence_id];
271
270
  };
272
271
  const uniqueEvidence = (snapshots) => [
273
272
  ...new Set([...snapshots].flatMap((snapshot) => snapshotLinks(snapshot))),
@@ -4,10 +4,10 @@ import { evidenceSchema } from "./evidence.js";
4
4
  import { prefixedDigestSchema } from "./../domain/digests.js";
5
5
  const addressSchema = z
6
6
  .string()
7
- .regex(/^(?:(?:[A-Za-z0-9._~-]|%[0-9A-F]{2})+:)?0x(?:0|[1-9a-f][0-9a-f]*)$/u);
7
+ .regex(/^(?:(?:[A-Za-z0-9._~\x2d]|%[0-9A-F]{2})+:)?0x(?:0|[1-9a-f][0-9a-f]*)$/u);
8
8
  const inputAddressSchema = z
9
9
  .string()
10
- .regex(/^(?:(?:[A-Za-z0-9._~-]|%[0-9a-fA-F]{2})+:)?0[xX][0-9a-fA-F]+$/u)
10
+ .regex(/^(?:(?:[A-Za-z0-9._~\x2d]|%[0-9a-fA-F]{2})+:)?0[xX][0-9a-fA-F]+$/u)
11
11
  .transform((address) => {
12
12
  const separator = address.lastIndexOf(":") + 1;
13
13
  const space = address
@@ -3,9 +3,9 @@ import { artifactComparisonResultSchema } from "./artifactComparison.js";
3
3
  import { uniqueSorted } from "./canonicalOrdering.js";
4
4
  import { comparisonSourceEvidenceIds } from "./comparisonSourceEvidence.js";
5
5
  import { evidenceSchema, parseEvidence } from "./evidence.js";
6
- import { functionComparisonResultSchema } from "./functionComparison.js";
6
+ import { functionComparisonResultSchema } from "./functionComparisonSchemas.js";
7
7
  import { PROCESS_PROVIDER, isProcessEvidenceProvider, } from "./process/processEvidenceProvider.js";
8
- import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/processCapture.js";
8
+ import { comparisonStatusSchema, deriveProcessComparisonStatus, PROCESS_COMPARISON_DIMENSIONS, processCaptureComparisonSchema, } from "./process/processComparison.js";
9
9
  import { prefixedDigestSchema } from "./../domain/digests.js";
10
10
  const evidenceIdSchema = prefixedDigestSchema("ev");
11
11
  /** Input for aggregating existing comparison Evidence. */
@@ -209,7 +209,7 @@ const functionFindings = (evidence) => {
209
209
  dimension: dimension.dimension,
210
210
  scope: "static_candidate",
211
211
  status: dimension.status,
212
- classification: dimension.status === "unknown" || dimension.status === "truncated"
212
+ classification: dimension.status === "unknown"
213
213
  ? "unresolved_branch"
214
214
  : dimension.conclusion_kind,
215
215
  limitations: dimension.limitations,
@@ -1,10 +1,11 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
+ import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
4
5
  import { createEvidenceCompletionLedger, evidenceCompletionRecordSchema, } from "./evidenceCompletionLedger.js";
5
6
  import { digestSchema } from "./../domain/digests.js";
6
7
  import { prefixedDigestSchema } from "./../domain/digests.js";
7
- const identifierSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
8
+ const identifierSchema = z.string().regex(IDENTIFIER_PATTERN);
8
9
  const identitySchema = z.strictObject({
9
10
  id: identifierSchema,
10
11
  version: z.string().min(1),
@@ -2,6 +2,11 @@ import { AnalysisError, } from "./analysisErrorBase.js";
2
2
  /** Runtime configuration could not be parsed safely. */
3
3
  export class ConfigurationError extends AnalysisError {
4
4
  _tag = "ConfigurationError";
5
+ settings;
6
+ constructor(message, options) {
7
+ super(message, options);
8
+ this.settings = (options?.settings ?? []).map(({ setting, constraint }) => ({ setting, constraint }));
9
+ }
5
10
  }
6
11
  /** No app or binary session exists for an analysis request. */
7
12
  export class NoBinaryOpenError extends AnalysisError {
@@ -16,10 +21,17 @@ export class BinaryTargetError extends AnalysisError {
16
21
  reason;
17
22
  _tag = "BinaryTargetError";
18
23
  constraint;
24
+ /** The OS read-permission code of the cause, when the host denied access. */
25
+ systemCode;
19
26
  constructor(path, reason, options) {
20
27
  super(`Cannot open artifact: ${reason}`, options);
21
28
  this.path = path;
22
29
  this.reason = reason;
23
30
  this.constraint = options?.constraint;
31
+ this.systemCode = readPermissionCode(options?.cause);
24
32
  }
25
33
  }
34
+ const readPermissionCode = (cause) => {
35
+ const code = cause instanceof Error ? Reflect.get(cause, "code") : undefined;
36
+ return code === "EACCES" || code === "EPERM" ? code : undefined;
37
+ };
@@ -1,12 +1,13 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import canonicalize from "canonicalize";
3
3
  import { z } from "zod";
4
- import { evidenceEnvelopeSchema } from "./evidence.js";
4
+ import { IDENTIFIER_PATTERN } from "./stringPatterns.js";
5
+ import { evidenceSchema } from "./evidence.js";
5
6
  import { evidenceBundleSchema } from "./evidenceBundle.js";
6
7
  import { err, ok } from "./result.js";
7
8
  import { prefixedDigestSchema } from "./../domain/digests.js";
8
9
  const conformancePackageIdSchema = prefixedDigestSchema("cp");
9
- const scenarioIdSchema = z.string().regex(/^[A-Za-z][A-Za-z0-9._-]*$/u);
10
+ const scenarioIdSchema = z.string().regex(IDENTIFIER_PATTERN);
10
11
  const scenarioManifestSchema = z.strictObject({
11
12
  scenario_id: scenarioIdSchema,
12
13
  name: z.string().min(1),
@@ -45,7 +46,7 @@ const shimPlanSchema = z.strictObject({
45
46
  const expectedEvidenceSchema = z.strictObject({
46
47
  scenario_id: scenarioIdSchema,
47
48
  /** Expected evidence envelopes. */
48
- envelopes: z.array(evidenceEnvelopeSchema),
49
+ envelopes: z.array(evidenceSchema),
49
50
  /** Expected evidence bundle. */
50
51
  bundle: evidenceBundleSchema.nullable(),
51
52
  /** Required dimensions that must be present in the evidence. */