rea-agents 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +26 -18
  2. package/bridge/android/ReaJadxBridge.java +14 -5
  3. package/bridge/ghidra/ReaGhidraBridge.java +205 -51
  4. package/bridge/hopper_bridge.py +314 -127
  5. package/bridge/mitmproxy/capture.py +0 -2
  6. package/bridge/native/rea_lldb_tracer.py +630 -94
  7. package/bridge/process/ProcessRunTokenReader.swift +39 -5
  8. package/bridge/pwntools/recorded_crash_impl.py +4 -0
  9. package/dist/android/JadxConfiguration.js +274 -31
  10. package/dist/android/JadxMcpTransport.js +18 -2
  11. package/dist/android/JadxProtocol.js +6 -0
  12. package/dist/android/JadxProvider.js +76 -37
  13. package/dist/android/JadxSession.js +23 -4
  14. package/dist/application/AnalysisContextQueries.js +8 -35
  15. package/dist/application/AnalysisDocument.js +32 -0
  16. package/dist/application/AppBundleExecutable.js +67 -21
  17. package/dist/application/BinaryTargetResolver.js +5 -3
  18. package/dist/application/BrowserEvidence.js +3 -8
  19. package/dist/application/BrowserScenarioEvidence.js +2 -18
  20. package/dist/application/CallPathTracing.js +19 -3
  21. package/dist/application/CapabilityInventory.js +48 -11
  22. package/dist/application/ClientConfigurationDocument.js +917 -8
  23. package/dist/application/ClientRegistrationIdentity.js +26 -5
  24. package/dist/application/ClientRegistrationStatus.js +29 -14
  25. package/dist/application/DirectAnalysis.js +56 -51
  26. package/dist/application/DirectAnalysisCleanup.js +72 -0
  27. package/dist/application/DirectAnalysisStatus.js +4 -5
  28. package/dist/application/Doctor.js +19 -21
  29. package/dist/application/DoctorDiagnostics.js +1 -2
  30. package/dist/application/DoctorScope.js +25 -13
  31. package/dist/application/EnhancedLiteralTracing.js +22 -25
  32. package/dist/application/EnhancedTools.js +64 -17
  33. package/dist/application/EvidenceBundleFiles.js +30 -13
  34. package/dist/application/FunctionAnalysisEvidence.js +2 -3
  35. package/dist/application/InventoryProjectionEvidence.js +4 -3
  36. package/dist/application/InvestigationProviders.js +11 -2
  37. package/dist/application/JsonFiles.js +83 -28
  38. package/dist/application/LinuxHopper.js +9 -6
  39. package/dist/application/MacHopper.js +15 -18
  40. package/dist/application/ProcedureAddressResolution.js +11 -0
  41. package/dist/application/RealHopperAssertions.js +0 -11
  42. package/dist/application/ReconstructionCoverageService.js +7 -4
  43. package/dist/application/ReconstructionObligationCandidates.js +1 -1
  44. package/dist/application/ReconstructionObligationLedgerService.js +4 -3
  45. package/dist/application/ReferenceSourceImportEntries.js +1 -1
  46. package/dist/application/Setup.js +21 -17
  47. package/dist/application/SetupClientConfiguration.js +10 -15
  48. package/dist/application/SetupHost.js +21 -29
  49. package/dist/application/SetupPlan.js +11 -9
  50. package/dist/application/SupportedClients.js +34 -1
  51. package/dist/application/Uninstall.js +82 -29
  52. package/dist/application/Update.js +18 -3
  53. package/dist/application/UpdateMaintenance.js +7 -5
  54. package/dist/application/UpdateRuntime.js +57 -36
  55. package/dist/application/WebModuleTraceService.js +4 -2
  56. package/dist/application/WebNetworkCaptureService.js +4 -2
  57. package/dist/application/WebRuntimeService.js +5 -3
  58. package/dist/application/WebScriptExportService.js +32 -6
  59. package/dist/application/WebSourceLocationService.js +4 -2
  60. package/dist/application/WorkflowEvidence.js +105 -0
  61. package/dist/application/XrefsAddressResolution.js +45 -0
  62. package/dist/application/analysisView/AnalysisViewService.js +76 -0
  63. package/dist/application/binary/AnalysisClientCleanup.js +30 -5
  64. package/dist/application/binary/AnalysisProviderEvaluation.js +22 -7
  65. package/dist/application/binary/AnalysisProviderRegistry.js +4 -6
  66. package/dist/application/binary/AnalysisSnapshotCache.js +13 -14
  67. package/dist/application/binary/BinarySession.js +161 -93
  68. package/dist/application/binary/BinarySessionComposition.js +1 -3
  69. package/dist/application/binary/BinarySessionExecution.js +3 -5
  70. package/dist/application/binary/BinarySessionOpen.js +4 -4
  71. package/dist/application/binary/BinarySessionRecords.js +26 -4
  72. package/dist/application/binary/BinarySessionStatus.js +18 -7
  73. package/dist/application/binary/CompositeProvider.js +16 -17
  74. package/dist/application/binary/LazyAnalysisProvider.js +8 -5
  75. package/dist/application/binary/SessionProviderRouter.js +27 -135
  76. package/dist/application/binaryDiagnostics/BinaryLayoutService.js +4 -2
  77. package/dist/application/binaryDiagnostics/RecordedCrashService.js +4 -2
  78. package/dist/application/evm/EvmInterfaceService.js +4 -2
  79. package/dist/application/homebrew.js +48 -0
  80. package/dist/application/investigation/EvidenceLedger.js +21 -7
  81. package/dist/application/investigation/InvestigationRecords.js +8 -0
  82. package/dist/application/javascript/ElectronActiveEvidence.js +9 -13
  83. package/dist/application/javascript/JavaScriptAnalysisControl.js +34 -0
  84. package/dist/application/javascript/JavaScriptApplicationEvidence.js +21 -4
  85. package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +19 -2
  86. package/dist/application/javascript/JavaScriptApplicationService.js +27 -15
  87. package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +5 -5
  88. package/dist/application/javascript/JavaScriptArtifactAnalysis.js +10 -7
  89. package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +44 -10
  90. package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
  91. package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
  92. package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
  93. package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +12 -3
  94. package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
  95. package/dist/application/javascript/JavaScriptArtifactPathResolution.js +49 -19
  96. package/dist/application/javascript/JavaScriptArtifactReconstruction.js +56 -8
  97. package/dist/application/javascript/JavaScriptModuleRelationships.js +38 -9
  98. package/dist/application/javascript/JavaScriptRecoveryService.js +4 -2
  99. package/dist/application/javascript/JavaScriptRuntimeObservationService.js +6 -4
  100. package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +3 -3
  101. package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +2 -3
  102. package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +63 -61
  103. package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +1 -2
  104. package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +2 -3
  105. package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +1 -5
  106. package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +75 -46
  107. package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +2 -3
  108. package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +64 -19
  109. package/dist/application/managed/ManagedApplicationGraphService.js +4 -3
  110. package/dist/application/managed/ManagedMemberComparisonService.js +9 -5
  111. package/dist/application/managed/ManagedNativeVerificationService.js +6 -4
  112. package/dist/application/managed/ManagedReconstructionService.js +4 -3
  113. package/dist/application/process/ProcessCli.js +25 -17
  114. package/dist/application/process/ProcessEvidence.js +4 -4
  115. package/dist/application/workflowInputError.js +18 -0
  116. package/dist/artifacts/ArtifactProvider.js +48 -13
  117. package/dist/artifacts/ArtifactReader.js +31 -0
  118. package/dist/artifacts/DirectoryArtifactReader.js +2 -1
  119. package/dist/artifacts/MachOSliceArtifactReader.js +106 -15
  120. package/dist/artifacts/NativeDmgArtifactReader.js +73 -21
  121. package/dist/artifacts/SafeOutputTree.js +16 -2
  122. package/dist/artifacts/ZipArtifactReader.js +11 -4
  123. package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +26 -5
  124. package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
  125. package/dist/artifacts/apple/InterfaceBuilderAnalysis.js +176 -56
  126. package/dist/artifacts/apple/InterfaceBuilderDecodeBudget.js +195 -0
  127. package/dist/artifacts/apple/KeyedArchiveReader.js +55 -23
  128. package/dist/artifacts/apple/MachoLoadCommandReader.js +92 -31
  129. package/dist/artifacts/apple/NibArchive.js +81 -14
  130. package/dist/artifacts/apple/NibViewHierarchy.js +10 -3
  131. package/dist/artifacts/apple/PlistNumberLiterals.js +164 -0
  132. package/dist/artifacts/extraction/ArtifactExtraction.js +78 -21
  133. package/dist/artifacts/inventory/ArtifactGraphConstruction.js +79 -68
  134. package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
  135. package/dist/artifacts/inventory/reader.js +3 -3
  136. package/dist/artifacts/inventory/scanCanonical.js +59 -38
  137. package/dist/artifacts/inventory/scanReader.js +5 -9
  138. package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +6 -2
  139. package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
  140. package/dist/browser/CdpBrowserProvider.js +2 -3
  141. package/dist/browser/CdpCaptureCompleteness.js +2 -0
  142. package/dist/browser/CdpCaptureEventHandlers.js +78 -15
  143. package/dist/browser/CdpCaptureEventTypes.js +5 -1
  144. package/dist/browser/CdpCaptureEvents.js +25 -1
  145. package/dist/browser/CdpCaptureValues.js +20 -0
  146. package/dist/browser/CdpConnection.js +30 -11
  147. package/dist/browser/CdpElectronProvider.js +0 -2
  148. package/dist/browser/CdpElectronScriptEvents.js +2 -8
  149. package/dist/browser/CdpElectronScripts.js +2 -3
  150. package/dist/browser/CdpOptionalCommand.js +2 -3
  151. package/dist/browser/CdpPageCapture.js +23 -1
  152. package/dist/browser/CdpPageCaptureScripts.js +2 -3
  153. package/dist/browser/CdpSafeMetadata.js +10 -10
  154. package/dist/browser/PlaywrightBrowserScenarioProvider.js +59 -44
  155. package/dist/browser/PlaywrightElectronActiveActions.js +34 -79
  156. package/dist/browser/PlaywrightElectronActiveProjection.js +141 -0
  157. package/dist/browser/PlaywrightElectronActiveProvider.js +133 -130
  158. package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
  159. package/dist/browser/PlaywrightScenarioBrowser.js +139 -39
  160. package/dist/browser/PlaywrightScenarioEvents.js +1 -1
  161. package/dist/browser/PlaywrightScenarioSession.js +39 -22
  162. package/dist/browser/WebSourceMapFetcher.js +426 -72
  163. package/dist/browser/assets/LocalWebScriptArtifacts.js +2 -2
  164. package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
  165. package/dist/browser/history/CaptureFailures.js +41 -1
  166. package/dist/browser/history/CaptureRelease.js +5 -0
  167. package/dist/browser/history/HarCaptureAdapter.js +3 -3
  168. package/dist/browser/history/HarJson.js +3 -2
  169. package/dist/browser/history/HistoricalCaptureDecoder.js +4 -2
  170. package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
  171. package/dist/catalogIdentity.js +0 -1
  172. package/dist/cli/analysisSelector.js +23 -0
  173. package/dist/cli/analysisViewCommands.js +36 -0
  174. package/dist/cli/applicationCommands.js +2 -3
  175. package/dist/cli/artifactCommands.js +11 -12
  176. package/dist/cli/coreAnalysisCommands.js +3 -3
  177. package/dist/cli/coreBinaryCommands.js +100 -37
  178. package/dist/cli/coreNativeCommands.js +9 -10
  179. package/dist/cli/electronCommands.js +10 -9
  180. package/dist/cli/interactiveSetup.js +6 -6
  181. package/dist/cli/javascriptApplicationAnalysis.js +7 -3
  182. package/dist/cli/jsonOutput.js +4 -99
  183. package/dist/cli/managedCommands.js +7 -8
  184. package/dist/cli/nativeCallCommands.js +3 -5
  185. package/dist/cli/omittableDefaults.js +50 -0
  186. package/dist/cli/processCommands.js +3 -2
  187. package/dist/cli/setupCommands.js +16 -15
  188. package/dist/cli/utilityCommands.js +9 -9
  189. package/dist/cli/webRuntimeCommands.js +8 -8
  190. package/dist/cli.js +18 -9
  191. package/dist/cliBrowserScenarioCommands.js +2 -2
  192. package/dist/cliCommandNames.js +1 -1
  193. package/dist/cliJsonInput.js +24 -5
  194. package/dist/cliOutput.js +0 -38
  195. package/dist/composition/auxiliaryAnalysisProviders.js +27 -23
  196. package/dist/composition/binary.js +9 -9
  197. package/dist/composition/browserScenario.js +2 -1
  198. package/dist/composition/directAnalysis.js +20 -13
  199. package/dist/composition/electronScenario.js +1 -1
  200. package/dist/composition/optionalObservationProviders.js +12 -7
  201. package/dist/config/environment.js +10 -0
  202. package/dist/config/ghidraStartupTimeout.js +12 -0
  203. package/dist/config/homeDirectory.js +12 -0
  204. package/dist/config/mcpResponseBudget.js +30 -0
  205. package/dist/config/parseConfig.js +8 -3
  206. package/dist/config/parsers.js +19 -22
  207. package/dist/contracts/analysisViewToolContracts.js +56 -0
  208. package/dist/contracts/applicationToolContracts.js +5 -4
  209. package/dist/contracts/artifactComparisonExample.js +2 -2
  210. package/dist/contracts/artifactToolContracts.js +1 -1
  211. package/dist/contracts/browserScenarioToolContracts.js +1 -1
  212. package/dist/contracts/browserToolContracts.js +19 -15
  213. package/dist/contracts/enhancedInputs.js +7 -5
  214. package/dist/contracts/enhancedToolContracts.js +7 -6
  215. package/dist/contracts/evm/evmToolContracts.js +1 -1
  216. package/dist/contracts/functionWorkflowToolContracts.js +1 -1
  217. package/dist/contracts/hopperMemoryContracts.js +2 -5
  218. package/dist/contracts/inputSchemaPresentation.js +90 -0
  219. package/dist/contracts/investigationExamples.js +4 -3
  220. package/dist/contracts/javascript/electronToolContracts.js +2 -2
  221. package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +0 -20
  222. package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +245 -0
  223. package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
  224. package/dist/contracts/managed/managedToolContracts.js +7 -14
  225. package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
  226. package/dist/contracts/mobileApplicationGraphExamples.js +3 -3
  227. package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
  228. package/dist/contracts/native/nativeToolContracts.js +5 -3
  229. package/dist/contracts/officialToolContracts.js +16 -16
  230. package/dist/contracts/promptContracts.js +5 -5
  231. package/dist/contracts/providerSelection.js +1 -1
  232. package/dist/contracts/sessionLifecycleInputs.js +3 -7
  233. package/dist/contracts/sessionStatusContract.js +2 -4
  234. package/dist/contracts/sessionToolContracts.js +18 -8
  235. package/dist/contracts/sessionToolSchemas.js +3 -19
  236. package/dist/contracts/toolContractExamples.js +0 -1
  237. package/dist/contracts/toolContractHelpers.js +4 -1
  238. package/dist/contracts/toolContracts.js +2 -0
  239. package/dist/contracts/toolEffects.js +1 -1
  240. package/dist/contracts/toolOutputSchemaGroups.js +160 -115
  241. package/dist/contracts/toolOutputSchemaPrimitives.js +28 -20
  242. package/dist/contracts/toolSchemaMetadata.js +41 -33
  243. package/dist/contracts/webNetworkCaptureToolContracts.js +2 -2
  244. package/dist/contracts/webRuntimeToolContracts.js +1 -1
  245. package/dist/contracts/webScriptToolContracts.js +1 -1
  246. package/dist/doctorRuntime.js +7 -5
  247. package/dist/domain/analysisErrorBase.js +8 -3
  248. package/dist/domain/analysisErrorCore.js +6 -1
  249. package/dist/domain/analysisErrorPresentation.js +90 -20
  250. package/dist/domain/analysisErrorProjection.js +130 -32
  251. package/dist/domain/analysisSnapshot.js +29 -31
  252. package/dist/domain/analysisView/analysisView.js +243 -0
  253. package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
  254. package/dist/domain/analysisView/binaryLayoutView.js +159 -0
  255. package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
  256. package/dist/domain/android/androidAnalysis.js +2 -4
  257. package/dist/domain/android/androidApplication.js +18 -10
  258. package/dist/domain/apple/appleApplication.js +42 -15
  259. package/dist/domain/apple/dyldEnvironment.js +73 -0
  260. package/dist/domain/apple/dylibResolution.js +130 -12
  261. package/dist/domain/apple/dylibResolutionFindings.js +9 -7
  262. package/dist/domain/apple/interfaceBuilderGraph.js +25 -14
  263. package/dist/domain/apple/interfaceBuilderKeyedArchive.js +13 -3
  264. package/dist/domain/apple/keyedArchive.js +35 -3
  265. package/dist/domain/apple/machoContainer.js +54 -0
  266. package/dist/domain/apple/plistNumbers.js +76 -0
  267. package/dist/domain/artifactComparison.js +15 -6
  268. package/dist/domain/artifactGraph.js +16 -3
  269. package/dist/domain/artifactIdentity.js +29 -0
  270. package/dist/domain/artifactInventoryEvidence.js +28 -40
  271. package/dist/domain/artifactOperationError.js +3 -3
  272. package/dist/domain/artifactPartialObservation.js +1 -0
  273. package/dist/domain/artifactPathSyntax.js +49 -0
  274. package/dist/domain/binaryTarget.js +39 -13
  275. package/dist/domain/bridgeCandidateProjection.js +71 -0
  276. package/dist/domain/browserCaptureComparison.js +13 -49
  277. package/dist/domain/browserCompleteness.js +1 -0
  278. package/dist/domain/browserNetworkEvidence.js +10 -4
  279. package/dist/domain/browserObservation.js +0 -1
  280. package/dist/domain/browserObservationError.js +24 -5
  281. package/dist/domain/browserObservationSchemas.js +14 -3
  282. package/dist/domain/browserScenario.js +0 -1
  283. package/dist/domain/browserScenarioCapture.js +1 -2
  284. package/dist/domain/browserScenarioDiff.js +0 -2
  285. package/dist/domain/browserScenarioDiffEvidence.js +0 -12
  286. package/dist/domain/browserScenarioDiffValues.js +2 -2
  287. package/dist/domain/browserScenarioValues.js +5 -10
  288. package/dist/domain/bundleComparison.js +3 -2
  289. package/dist/domain/callPath.js +8 -9
  290. package/dist/domain/callPathSchemas.js +2 -2
  291. package/dist/domain/canonicalJsonDigestSteps.js +133 -0
  292. package/dist/domain/canonicalOrdering.js +9 -5
  293. package/dist/domain/changedBehavior.js +9 -9
  294. package/dist/domain/comparisonSourceEvidence.js +40 -0
  295. package/dist/domain/completionLedgerGeneration.js +2 -1
  296. package/dist/domain/configurationErrors.js +13 -1
  297. package/dist/domain/conformancePackage.js +4 -3
  298. package/dist/domain/evidence.js +65 -36
  299. package/dist/domain/evidenceBundle.js +47 -8
  300. package/dist/domain/evidenceCompletionLedger.js +2 -1
  301. package/dist/domain/evidenceErrors.js +12 -1
  302. package/dist/domain/explicitSensitiveFailure.js +17 -1
  303. package/dist/domain/firmware/firmwareAnalysis.js +6 -7
  304. package/dist/domain/functionComparison.js +4 -5
  305. package/dist/domain/functionComparisonDimensions.js +120 -87
  306. package/dist/domain/functionComparisonNormalization.js +23 -34
  307. package/dist/domain/functionComparisonResults.js +1 -4
  308. package/dist/domain/functionComparisonSchemas.js +2 -8
  309. package/dist/domain/functionDossierEvidence.js +2 -37
  310. package/dist/domain/hopperErrors.js +23 -2
  311. package/dist/domain/hopperValues.js +51 -8
  312. package/dist/domain/immutableJson.js +114 -0
  313. package/dist/domain/inputIssueProjection.js +3 -0
  314. package/dist/domain/javascript/electronActiveObservation.js +47 -64
  315. package/dist/domain/javascript/electronObservation.js +14 -3
  316. package/dist/domain/javascript/electronStaticAnalysisBrowser.js +10 -9
  317. package/dist/domain/javascript/electronStaticAnalysisIpc.js +2 -1
  318. package/dist/domain/javascript/electronStaticAnalysisNative.js +2 -1
  319. package/dist/domain/javascript/electronStaticAnalysisValues.js +6 -12
  320. package/dist/domain/javascript/javascriptApplicationAnalysis.js +71 -23
  321. package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +2 -0
  322. package/dist/domain/javascript/javascriptApplicationGraph.js +39 -3
  323. package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
  324. package/dist/domain/javascript/javascriptApplicationVersionItems.js +5 -2
  325. package/dist/domain/javascript/javascriptApplicationVersionKeys.js +2 -1
  326. package/dist/domain/javascript/javascriptAstValues.js +20 -0
  327. package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
  328. package/dist/domain/javascript/javascriptExportShapeComparison.js +7 -1
  329. package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
  330. package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +29 -1
  331. package/dist/domain/javascript/javascriptExportShapeSelection.js +5 -5
  332. package/dist/domain/javascript/javascriptExportShapeVariants.js +67 -14
  333. package/dist/domain/javascript/javascriptFeatureSeed.js +20 -0
  334. package/dist/domain/javascript/javascriptFeatureTraversal.js +0 -1
  335. package/dist/domain/javascript/javascriptNativeHandoff.js +1 -1
  336. package/dist/domain/javascript/javascriptRecovery.js +3 -8
  337. package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
  338. package/dist/domain/javascript/javascriptRuntimeObservation.js +10 -2
  339. package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +1 -1
  340. package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +3 -2
  341. package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +0 -1
  342. package/dist/domain/javascript/javascriptSemanticAnalysis.js +106 -5
  343. package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
  344. package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
  345. package/dist/domain/javascript/javascriptSemanticChildProcesses.js +2 -1
  346. package/dist/domain/javascript/javascriptSemanticCoverage.js +6 -5
  347. package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +9 -17
  348. package/dist/domain/javascript/javascriptSemanticDataEffects.js +23 -6
  349. package/dist/domain/javascript/javascriptSemanticGraph.js +98 -43
  350. package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +1 -0
  351. package/dist/domain/javascript/javascriptSemanticMemberMutations.js +77 -20
  352. package/dist/domain/javascript/javascriptSemanticMutationValues.js +21 -27
  353. package/dist/domain/javascript/javascriptSemanticObjects.js +83 -42
  354. package/dist/domain/javascript/javascriptSemanticPrimitives.js +18 -21
  355. package/dist/domain/javascript/javascriptSemanticProjection.js +2 -3
  356. package/dist/domain/javascript/javascriptSemanticPromises.js +2 -1
  357. package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -4
  358. package/dist/domain/javascript/javascriptSemanticResourceLimits.js +77 -0
  359. package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
  360. package/dist/domain/javascript/javascriptSemanticReturns.js +32 -17
  361. package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
  362. package/dist/domain/javascript/javascriptSemanticValues.js +126 -61
  363. package/dist/domain/javascript/javascriptSourceMapPaths.js +104 -0
  364. package/dist/domain/javascript/javascriptSourceParser.js +6 -2
  365. package/dist/domain/javascript/javascriptStaticAnalysis.js +22 -17
  366. package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -3
  367. package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +16 -5
  368. package/dist/domain/javascript/javascriptStaticAnalysisFindings.js +66 -7
  369. package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +28 -17
  370. package/dist/domain/javascript/javascriptStaticAnalysisState.js +3 -2
  371. package/dist/domain/javascript/sourceToBundleComparison.js +12 -3
  372. package/dist/domain/javascript/sourceToBundleSignals.js +47 -19
  373. package/dist/domain/jsonSerialization.js +109 -0
  374. package/dist/domain/jsonValue.js +90 -6
  375. package/dist/domain/localPath.js +6 -0
  376. package/dist/domain/managed/managedApplicationGraph.js +10 -10
  377. package/dist/domain/managed/managedArtifact.js +6 -4
  378. package/dist/domain/managed/managedInspectionEvidence.js +16 -0
  379. package/dist/domain/managed/managedMemberComparison.js +2 -9
  380. package/dist/domain/managed/managedMemberComparisonMatch.js +5 -9
  381. package/dist/domain/managed/managedNativeVerification.js +3 -11
  382. package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
  383. package/dist/domain/native/binaryLayout.js +2 -3
  384. package/dist/domain/native/fileOffsetPartialObservation.js +1 -0
  385. package/dist/domain/native/nativeApiBoundary.js +1 -1
  386. package/dist/domain/native/nativeCallObservation.js +37 -13
  387. package/dist/domain/native/nativeCallPartialObservation.js +33 -0
  388. package/dist/domain/native/nativeInstruction.js +7 -0
  389. package/dist/domain/native/recordedCrash.js +2 -3
  390. package/dist/domain/offsetDateTime.js +17 -0
  391. package/dist/domain/process/processCapture.js +21 -16
  392. package/dist/domain/process/processCaptureCoverage.js +67 -0
  393. package/dist/domain/process/processCaptureExample.js +2 -1
  394. package/dist/domain/process/processCaptureParsing.js +1 -34
  395. package/dist/domain/process/processCaptureValidation.js +81 -13
  396. package/dist/domain/process/processComparison.js +79 -26
  397. package/dist/domain/process/processObservation.js +10 -2
  398. package/dist/domain/process/processScenario.js +35 -12
  399. package/dist/domain/process/processTraceComparison.js +0 -2
  400. package/dist/domain/process/processTraceDimensionProjection.js +1 -1
  401. package/dist/domain/process/processTraceEvaluation.js +15 -11
  402. package/dist/domain/process/processTraceSpecification.js +3 -4
  403. package/dist/domain/propertyListKeys.js +1 -1
  404. package/dist/domain/propertyListXmlText.js +19 -0
  405. package/dist/domain/providerAdapterError.js +3 -1
  406. package/dist/domain/providerOperationHealth.js +54 -0
  407. package/dist/domain/reconstructionCoverage.js +5 -2
  408. package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
  409. package/dist/domain/reconstructionReadinessSchemas.js +2 -1
  410. package/dist/domain/reconstructionVerification.js +9 -46
  411. package/dist/domain/reconstructionVerificationSchemas.js +4 -3
  412. package/dist/domain/referenceSourceGraph.js +20 -21
  413. package/dist/domain/staticRuntimeCorrelation.js +8 -45
  414. package/dist/domain/stringPatterns.js +6 -0
  415. package/dist/domain/swiftSymbolClassification.js +61 -0
  416. package/dist/domain/symbolAnalysis.js +66 -18
  417. package/dist/domain/webBundleAnalysis.js +20 -8
  418. package/dist/domain/webBundleAnalyzerInspection.js +13 -8
  419. package/dist/domain/webBundleAnalyzerResult.js +41 -2
  420. package/dist/domain/webCaptureDiff.js +0 -1
  421. package/dist/domain/webCaptureDiffSchemas.js +6 -3
  422. package/dist/domain/webEventListeners.js +3 -2
  423. package/dist/domain/webExecution.js +3 -2
  424. package/dist/domain/webRuntime.js +19 -7
  425. package/dist/domain/webScriptExport.js +1 -1
  426. package/dist/domain/webSourceLocation.js +1 -0
  427. package/dist/dotnet/ManagedArtifactInspector.js +2 -19
  428. package/dist/dotnet/ManagedMemberInspector.js +12 -18
  429. package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
  430. package/dist/dotnet/ManagedMemberRows.js +75 -62
  431. package/dist/dotnet/ManagedMetadataInventory.js +16 -22
  432. package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
  433. package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
  434. package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
  435. package/dist/dotnet/ManagedReaderFailure.js +16 -0
  436. package/dist/dotnet/ManagedStaticProvider.js +3 -5
  437. package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
  438. package/dist/evaluation/AgentEvaluationReport.js +28 -0
  439. package/dist/evaluation/CodexAgentEval.js +12 -8
  440. package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
  441. package/dist/evm/EvmoleInterfaceProvider.js +2 -1
  442. package/dist/firmware/FirmwareCommand.js +9 -5
  443. package/dist/firmware/FirmwareFiles.js +1 -1
  444. package/dist/firmware/FirmwareProvider.js +4 -4
  445. package/dist/generatedPackageMetadata.js +2 -2
  446. package/dist/ghidra/GhidraAnalysisProfile.js +7 -5
  447. package/dist/ghidra/GhidraClient.js +126 -34
  448. package/dist/ghidra/GhidraClientStartup.js +0 -2
  449. package/dist/ghidra/GhidraDiagnostics.js +7 -7
  450. package/dist/ghidra/GhidraDoctor.js +6 -5
  451. package/dist/ghidra/GhidraFunctionValues.js +13 -12
  452. package/dist/ghidra/GhidraInstallation.js +58 -33
  453. package/dist/ghidra/GhidraInventoryValues.js +14 -4
  454. package/dist/ghidra/GhidraJavaLaunch.js +66 -0
  455. package/dist/ghidra/GhidraLauncher.js +47 -22
  456. package/dist/ghidra/GhidraProvider.js +6 -2
  457. package/dist/ghidra/GhidraProviderCapabilities.js +20 -2
  458. package/dist/ghidra/GhidraProviderClient.js +36 -15
  459. package/dist/ghidra/GhidraSessionError.js +13 -7
  460. package/dist/ghidra/GhidraSessionRoot.js +39 -0
  461. package/dist/ghidra/GhidraTargetSnapshot.js +47 -12
  462. package/dist/ghidra/GhidraTransport.js +20 -0
  463. package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
  464. package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
  465. package/dist/hopper/BridgeLauncher.js +65 -56
  466. package/dist/hopper/HopperAnalysisProfile.js +65 -12
  467. package/dist/hopper/HopperCleanup.js +63 -22
  468. package/dist/hopper/HopperClient.js +288 -59
  469. package/dist/hopper/HopperFileOffset.js +237 -0
  470. package/dist/hopper/HopperMachOImage.js +197 -0
  471. package/dist/hopper/HopperOperationStage.js +6 -0
  472. package/dist/hopper/HopperProvider.js +71 -19
  473. package/dist/hopper/HopperProviderCapabilities.js +19 -1
  474. package/dist/hopper/HopperRegexSearch.js +134 -0
  475. package/dist/hopper/HopperRegexWorker.js +27 -0
  476. package/dist/hopper/HopperRequestQueue.js +68 -19
  477. package/dist/hopper/HopperTargetLease.js +133 -49
  478. package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
  479. package/dist/ida/IdaConfiguration.js +8 -3
  480. package/dist/ida/IdaInput.js +1 -7
  481. package/dist/ida/IdaMcpConnection.js +8 -4
  482. package/dist/ida/IdaOperationRunner.js +3 -3
  483. package/dist/ida/IdaProvider.js +8 -12
  484. package/dist/ida/IdaSessionClient.js +20 -18
  485. package/dist/ida/IdaWorkspace.js +12 -13
  486. package/dist/inspector/JavaScriptRuntimeScope.js +9 -1
  487. package/dist/inspector/V8InspectorCaptureProjection.js +9 -4
  488. package/dist/inspector/V8InspectorProvider.js +82 -36
  489. package/dist/javascript/recovery/WakaruCommand.js +7 -2
  490. package/dist/javascript/recovery/WakaruExecution.js +5 -2
  491. package/dist/javascript/sourceMaps/DecodedSourceMap.js +47 -0
  492. package/dist/javascript/sourceMaps/SourceMapCommand.js +16 -0
  493. package/dist/javascript/sourceMaps/SourceMapFormat.js +79 -31
  494. package/dist/javascript/sourceMaps/TraceSourceMap.js +14 -28
  495. package/dist/main/shutdown.js +11 -3
  496. package/dist/main/startup.js +9 -2
  497. package/dist/main/transport.js +22 -2
  498. package/dist/main.js +11 -18
  499. package/dist/mcpDoctor.js +62 -2
  500. package/dist/native/AppleDispatchCoverage.js +47 -6
  501. package/dist/native/AppleDispatchDecodeFacts.js +6 -0
  502. package/dist/native/AppleDispatchMetadata.js +6 -3
  503. package/dist/native/AppleMachoFixups.js +48 -24
  504. package/dist/native/AppleMachoSelection.js +48 -22
  505. package/dist/native/AppleObjcCategories.js +6 -2
  506. package/dist/native/AppleObjcDispatchFacets.js +5 -2
  507. package/dist/native/AppleObjcProperties.js +2 -1
  508. package/dist/native/AppleSwiftDispatchFacets.js +27 -21
  509. package/dist/native/AppleSwiftVtables.js +21 -15
  510. package/dist/native/CommandRunner.js +87 -88
  511. package/dist/native/LldbCallTracer.js +372 -103
  512. package/dist/native/LldbRetainedObservations.js +178 -0
  513. package/dist/native/NativeCallObservation.js +62 -3
  514. package/dist/native/NativeMacOSProvider.js +122 -31
  515. package/dist/native/NativeUiHelperRuntime.js +11 -2
  516. package/dist/native/NativeUiObservation.js +2 -2
  517. package/dist/native/SignatureTargetBinding.js +155 -0
  518. package/dist/native/parsers/lipo.js +71 -1
  519. package/dist/native/pwndbg/PwndbgCoreContext.js +25 -5
  520. package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
  521. package/dist/native/pwntools/RecordedCrashStructureBindings.js +2 -0
  522. package/dist/process/DarwinProcessRunTokenReader.js +23 -10
  523. package/dist/process/ExecFileOutput.js +108 -6
  524. package/dist/process/OwnedCommand.js +7 -2
  525. package/dist/process/PrivateRuntimeRoot.js +10 -5
  526. package/dist/process/ProcessOwnership.js +204 -57
  527. package/dist/process/ProcessOwnershipObservation.js +60 -9
  528. package/dist/process/ProviderProcess.js +39 -10
  529. package/dist/process/capture/FilesystemSnapshot.js +50 -13
  530. package/dist/process/capture/ProcessCaptureError.js +15 -2
  531. package/dist/process/capture/ProcessCaptureLifecycle.js +235 -81
  532. package/dist/process/capture/ProcessFilesystemEffects.js +33 -3
  533. package/dist/process/capture/ProcessHarness.js +21 -25
  534. package/dist/process/capture/ProcessNormalization.js +20 -2
  535. package/dist/process/capture/ProcessSampling.js +25 -2
  536. package/dist/process/capture/TerminalRenderer.js +14 -0
  537. package/dist/process/snapshotEnvironment.js +14 -0
  538. package/dist/server/EvidenceMcpServer.js +157 -0
  539. package/dist/server/createServer.js +61 -41
  540. package/dist/server/mcpClientMetadata.js +12 -5
  541. package/dist/server/promptCompletion.js +3 -8
  542. package/dist/server/registerAnalysisViewTool.js +15 -0
  543. package/dist/server/registerAndroidTools.js +2 -5
  544. package/dist/server/registerApplicationTools/compareExportShapes.js +4 -5
  545. package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
  546. package/dist/server/registerApplicationTools/compareVersions.js +4 -5
  547. package/dist/server/registerApplicationTools/coverage.js +1 -2
  548. package/dist/server/registerApplicationTools/helpers.js +1 -4
  549. package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
  550. package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
  551. package/dist/server/registerApplicationTools/traceFeature.js +4 -5
  552. package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
  553. package/dist/server/registerArtifactComparisonTool.js +13 -10
  554. package/dist/server/registerBinaryDiagnosticsTools.js +2 -5
  555. package/dist/server/registerBrowserScenarioTool.js +3 -6
  556. package/dist/server/registerBrowserTools.js +13 -18
  557. package/dist/server/registerBundleComparisonTool.js +5 -7
  558. package/dist/server/registerCloseLifecycleTool.js +9 -20
  559. package/dist/server/registerElectronTools.js +10 -15
  560. package/dist/server/registerEnhancedTools.js +36 -77
  561. package/dist/server/registerEvidenceTools.js +3 -6
  562. package/dist/server/registerEvmTools.js +2 -5
  563. package/dist/server/registerFirmwareTools.js +2 -5
  564. package/dist/server/registerFunctionComparisonTool.js +15 -12
  565. package/dist/server/registerInvestigationTools.js +16 -17
  566. package/dist/server/registerJavaScriptRecoveryTool.js +2 -5
  567. package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -8
  568. package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -8
  569. package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -7
  570. package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -9
  571. package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -9
  572. package/dist/server/registerOfficialTools.js +4 -21
  573. package/dist/server/registerProcessComparisonTool.js +74 -48
  574. package/dist/server/registerRecordedCrashTools.js +2 -5
  575. package/dist/server/registerSessionRecordTools.js +19 -24
  576. package/dist/server/registerSessionStatusTool.js +19 -6
  577. package/dist/server/registerSessionTools.js +20 -18
  578. package/dist/server/registerWebModuleTool.js +2 -5
  579. package/dist/server/registerWebNetworkCaptureTool.js +2 -5
  580. package/dist/server/registerWebRuntimeTools.js +4 -9
  581. package/dist/server/registerWebScriptTool.js +2 -5
  582. package/dist/server/registerWebSourceLocationTool.js +2 -5
  583. package/dist/server/runDerivedOperation.js +15 -3
  584. package/dist/server/sessionAvailabilityPolicy.js +0 -1
  585. package/dist/server/toolRegistrationOptions.js +2 -2
  586. package/dist/server/toolResult.js +75 -51
  587. package/dist/server/toolResultEncoding.js +34 -0
  588. package/dist/windows/WindowsNativeLoader.js +1 -0
  589. package/dist/windows/WindowsOwnedProcess.js +60 -15
  590. package/dist/windows/WindowsPrivateRuntime.js +7 -8
  591. package/install.sh +1 -1
  592. package/native/windows/README.md +3 -1
  593. package/native/windows/build/manifest.json +2 -2
  594. package/native/windows/build/rea-windows-x64.node +0 -0
  595. package/package.json +44 -30
  596. package/scripts/electron-active-hook-boundaries.cjs +18 -20
  597. package/scripts/electron-active-hook.cjs +241 -37
  598. package/scripts/rea.mjs +3 -6
  599. package/skills/reverse-engineer-anything/SKILL.md +12 -3
  600. package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
  601. package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
  602. package/skills/reverse-engineer-anything/references/javascript-applications.md +20 -3
  603. package/skills/reverse-engineer-anything/references/native-and-artifacts.md +9 -0
  604. package/dist/config.js +0 -1
  605. package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
  606. package/dist/contracts/process/processCaptureExample.js +0 -2
  607. package/dist/contracts/toolOutputSchemas.js +0 -2
  608. package/dist/ghidra/GhidraDefaults.js +0 -2
  609. package/dist/main/reload.js +0 -12
  610. package/dist/main/state.js +0 -3
  611. package/dist/server/sessionToolPolicies.js +0 -2
@@ -55,6 +55,19 @@ const artifactFormatSchema = z.enum([
55
55
  "file",
56
56
  "unknown",
57
57
  ]);
58
+ /** Formats established from bytes or a virtual directory tree, independent of path roles. */
59
+ const artifactContentFormatSchema = artifactFormatSchema.extract([
60
+ "zip",
61
+ "mach-o-universal",
62
+ "mach-o",
63
+ "elf",
64
+ "pe",
65
+ "dos-mz",
66
+ "plist",
67
+ "directory",
68
+ "file",
69
+ "unknown",
70
+ ]);
58
71
  /** File byte interval for an artifact derived without writing it to disk. */
59
72
  const artifactByteRangeSchema = z.object({
60
73
  offset: z.number().int().min(0),
@@ -72,13 +85,11 @@ const artifactCommandSchema = z.object({
72
85
  /** One content-addressed application artifact in deterministic manifest order. */
73
86
  const artifactNodeSchema = z.object({
74
87
  artifact_id: artifactIdSchema,
75
- kind: artifactKindSchema,
76
- format: artifactFormatSchema,
88
+ format: artifactContentFormatSchema,
77
89
  sha256: sha256Schema,
78
90
  size: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
79
91
  media_type: z.string().min(1).nullable(),
80
92
  architecture: z.string().min(1).nullable(),
81
- executable: z.boolean(),
82
93
  content_state: z.enum(["materialized", "embedded", "virtual"]),
83
94
  limitations: z.array(z.string()),
84
95
  });
@@ -89,6 +100,8 @@ const artifactOccurrenceSchema = z.object({
89
100
  parent_occurrence_id: occurrenceIdSchema.nullable(),
90
101
  logical_path: boundedRelativePathSchema,
91
102
  entry_kind: z.enum(["file", "directory", "symlink", "slice"]),
103
+ artifact_kind: artifactKindSchema,
104
+ artifact_format: artifactFormatSchema,
92
105
  declared_size: z
93
106
  .number()
94
107
  .int()
@@ -0,0 +1,29 @@
1
+ import { canonicalDigest } from "./comparisonSemantics.js";
2
+ /** Content-address an artifact independently of where it was observed. */
3
+ export const artifactIdForContent = (sha256) => `art_${canonicalDigest({ sha256 }, "Artifact")}`;
4
+ /** Identify an occurrence by its root and exact logical location. */
5
+ export const occurrenceIdForLocation = (input) => input.logicalPath === "."
6
+ ? `occ_${canonicalDigest({ root: input.rootArtifactId }, "Artifact")}`
7
+ : `occ_${canonicalDigest({
8
+ root_artifact_id: input.rootArtifactId,
9
+ logical_path: input.logicalPath,
10
+ entry_kind: input.entryKind,
11
+ }, "Artifact")}`;
12
+ /** Commit to graph members in the ordering established by the inventory owner. */
13
+ export const artifactGraphDigest = (input) => canonicalDigest({
14
+ nodes: input.nodes,
15
+ occurrences: input.occurrences,
16
+ edges: input.edges,
17
+ integrity_contradictions: input.contradictions,
18
+ }, "Artifact");
19
+ /** Bind a root artifact to its graph commitment. */
20
+ export const artifactManifestId = (rootArtifactId, graphSha256) => `agm_${canonicalDigest({ root_artifact_id: rootArtifactId, graph_sha256: graphSha256 }, "Artifact")}`;
21
+ /** Identify one integrity disagreement at its observed logical path. */
22
+ export const artifactContradictionId = (input) => `ic_${canonicalDigest({
23
+ root_artifact_id: input.rootArtifactId,
24
+ logical_path: input.logicalPath,
25
+ declared_sha256: input.declaredSha256,
26
+ observed_sha256: input.observedSha256,
27
+ }, "Artifact")}`;
28
+ /** Identify an edge by its semantic relationship and exact occurrence. */
29
+ export const artifactEdgeId = (semantic) => `edge_${canonicalDigest(semantic, "Artifact")}`;
@@ -1,8 +1,9 @@
1
1
  import { artifactInventoryResultSchema, } from "./artifactGraph.js";
2
- import { canonicalDigest, canonicalJson } from "./comparisonSemantics.js";
2
+ import { compareCodePoints } from "./canonicalOrdering.js";
3
+ import { canonicalJson } from "./comparisonSemantics.js";
4
+ import { artifactContradictionId, artifactEdgeId, artifactGraphDigest, artifactIdForContent, artifactManifestId, occurrenceIdForLocation, } from "./artifactIdentity.js";
3
5
  import { parseEvidence } from "./evidence.js";
4
6
  import { artifactInspectionResultSchema } from "./artifactInspection.js";
5
- import { err, ok } from "./result.js";
6
7
  /** Parse, merge, and verify inventory Evidence pages. */
7
8
  export const parseArtifactInventoryEvidence = (input) => assembleInventorySet((Array.isArray(input) ? input : [input]).map((value) => {
8
9
  const evidence = parseEvidence(value);
@@ -29,21 +30,9 @@ const validateInventoryPage = (inventory) => {
29
30
  assertUnique(inventory.occurrences.map(({ logical_path: path }) => path), "logical path");
30
31
  assertUnique(inventory.edges.map(({ edge_id: id }) => id), "edge ID");
31
32
  for (const node of inventory.nodes)
32
- if (node.artifact_id !==
33
- `art_${canonicalDigest({ sha256: node.sha256 }, "Artifact inventory")}`)
33
+ if (node.artifact_id !== artifactIdForContent(node.sha256))
34
34
  throw new TypeError("Artifact node ID is not content-addressed");
35
35
  };
36
- /**
37
- * Result-returning seam for the empty-pages leaf. Other assembly failures
38
- * still throw TypeError (migration in progress); parseArtifactInventoryEvidence
39
- * keeps its throwing contract until callers switch.
40
- */
41
- export const tryAssembleInventorySet = (pages) => pages.length === 0
42
- ? err({
43
- code: "empty",
44
- message: "Artifact inventory requires Evidence pages",
45
- })
46
- : ok(assembleInventorySet(pages));
47
36
  const assembleInventorySet = (pages) => {
48
37
  const first = pages[0];
49
38
  if (first === undefined)
@@ -79,9 +68,9 @@ const assembleInventorySet = (pages) => {
79
68
  return { evidence: pages.map(({ evidence }) => evidence), inventory };
80
69
  };
81
70
  const orderedInventory = (first, pages, values) => {
82
- const nodes = [...values.nodes.values()].sort((left, right) => left.artifact_id.localeCompare(right.artifact_id));
83
- const occurrences = [...values.occurrences.values()].sort((left, right) => left.logical_path.localeCompare(right.logical_path, "en"));
84
- const edges = [...values.edges.values()].sort((left, right) => left.edge_id.localeCompare(right.edge_id));
71
+ const nodes = [...values.nodes.values()].sort((left, right) => compareCodePoints(left.artifact_id, right.artifact_id));
72
+ const occurrences = [...values.occurrences.values()].sort((left, right) => compareCodePoints(left.logical_path, right.logical_path));
73
+ const edges = [...values.edges.values()].sort((left, right) => compareCodePoints(left.edge_id, right.edge_id));
85
74
  return {
86
75
  manifest: first.manifest,
87
76
  nodes,
@@ -90,7 +79,7 @@ const orderedInventory = (first, pages, values) => {
90
79
  integrityContradictions: first.integrity_contradictions,
91
80
  limitations: [
92
81
  ...new Set(pages.flatMap(({ inventory }) => inventory.limitations)),
93
- ].sort((left, right) => left.localeCompare(right)),
82
+ ].sort(compareCodePoints),
94
83
  complete: nodes.length === first.manifest.node_count &&
95
84
  occurrences.length === first.manifest.occurrence_count &&
96
85
  edges.length === first.manifest.edge_count,
@@ -102,6 +91,10 @@ const validateCompleteInventory = (inventory) => {
102
91
  const rootNode = inventory.nodes.find(({ artifact_id: id }) => id === inventory.manifest.root_artifact_id);
103
92
  if (rootNode?.sha256 !== inventory.manifest.root_sha256)
104
93
  throw new TypeError("Artifact root node does not match its manifest digest");
94
+ const rootOccurrence = inventory.occurrences.find(({ logical_path }) => logical_path === ".");
95
+ if (rootOccurrence?.artifact_id !== inventory.manifest.root_artifact_id ||
96
+ rootOccurrence.artifact_format !== inventory.manifest.root_format)
97
+ throw new TypeError("Artifact root occurrence does not match its manifest representation");
105
98
  for (const occurrence of inventory.occurrences)
106
99
  validateOccurrence(occurrence, inventory, nodeIds, occurrenceIds);
107
100
  for (const edge of inventory.edges)
@@ -110,27 +103,24 @@ const validateCompleteInventory = (inventory) => {
110
103
  if (!nodeIds.has(contradiction.parent_artifact_id) ||
111
104
  !occurrenceIds.has(contradiction.occurrence_id))
112
105
  throw new TypeError("Integrity contradiction references a missing graph member");
113
- const expectedId = `ic_${canonicalDigest({
114
- root_artifact_id: inventory.manifest.root_artifact_id,
115
- logical_path: contradiction.logical_path,
116
- declared_sha256: contradiction.declared_sha256,
117
- observed_sha256: contradiction.observed_sha256,
118
- }, "Artifact inventory")}`;
106
+ const expectedId = artifactContradictionId({
107
+ rootArtifactId: inventory.manifest.root_artifact_id,
108
+ logicalPath: contradiction.logical_path,
109
+ declaredSha256: contradiction.declared_sha256,
110
+ observedSha256: contradiction.observed_sha256,
111
+ });
119
112
  if (contradiction.contradiction_id !== expectedId)
120
113
  throw new TypeError("Integrity contradiction ID does not match its identity");
121
114
  }
122
- const graphSha256 = canonicalDigest({
115
+ const graphSha256 = artifactGraphDigest({
123
116
  nodes: inventory.nodes,
124
117
  occurrences: inventory.occurrences,
125
118
  edges: inventory.edges,
126
- integrity_contradictions: inventory.integrityContradictions,
127
- }, "Artifact inventory");
119
+ contradictions: inventory.integrityContradictions,
120
+ });
128
121
  if (graphSha256 !== inventory.manifest.graph_sha256)
129
122
  throw new TypeError("Artifact graph commitment does not match its members");
130
- const manifestId = `agm_${canonicalDigest({
131
- root_artifact_id: inventory.manifest.root_artifact_id,
132
- graph_sha256: graphSha256,
133
- }, "Artifact inventory")}`;
123
+ const manifestId = artifactManifestId(inventory.manifest.root_artifact_id, graphSha256);
134
124
  if (manifestId !== inventory.manifest.manifest_id)
135
125
  throw new TypeError("Artifact manifest ID does not match its commitment");
136
126
  };
@@ -140,13 +130,11 @@ const validateOccurrence = (occurrence, inventory, nodeIds, occurrenceIds) => {
140
130
  if (occurrence.parent_occurrence_id !== null &&
141
131
  !occurrenceIds.has(occurrence.parent_occurrence_id))
142
132
  throw new TypeError("Artifact occurrence references a missing parent");
143
- const expectedId = occurrence.logical_path === "."
144
- ? `occ_${canonicalDigest({ root: inventory.manifest.root_artifact_id }, "Artifact inventory")}`
145
- : `occ_${canonicalDigest({
146
- root_artifact_id: inventory.manifest.root_artifact_id,
147
- logical_path: occurrence.logical_path,
148
- entry_kind: occurrence.entry_kind,
149
- }, "Artifact inventory")}`;
133
+ const expectedId = occurrenceIdForLocation({
134
+ rootArtifactId: inventory.manifest.root_artifact_id,
135
+ logicalPath: occurrence.logical_path,
136
+ entryKind: occurrence.entry_kind,
137
+ });
150
138
  if (occurrence.occurrence_id !== expectedId)
151
139
  throw new TypeError("Artifact occurrence ID does not match its identity");
152
140
  };
@@ -162,7 +150,7 @@ const validateEdge = (edge, nodeIds, occurrenceIds) => {
162
150
  occurrence_id: edge.occurrence_id,
163
151
  logical_path: edge.logical_path,
164
152
  };
165
- if (edge.edge_id !== `edge_${canonicalDigest(semantic, "Artifact inventory")}`)
153
+ if (edge.edge_id !== artifactEdgeId(semantic))
166
154
  throw new TypeError("Artifact edge ID does not match its identity");
167
155
  };
168
156
  const mergeExact = (output, key, value, label) => {
@@ -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)
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ /** Coverage metadata for the bounded projection of candidate relationships. */
3
+ export const bridgeCandidateCoverageSchema = z.strictObject({
4
+ status: z.enum(["complete", "partial"]),
5
+ total_candidates: z.number().int().nonnegative(),
6
+ emitted_candidates: z.number().int().nonnegative(),
7
+ omitted_candidates: z.number().int().nonnegative(),
8
+ });
9
+ // The serialized candidate array is the retained representation; accounting
10
+ // its exact UTF-8 JSON size bounds both array objects and repeated path strings.
11
+ /** Maximum UTF-8 JSON size of a retained candidate array. */
12
+ export const MAX_BRIDGE_CANDIDATE_JSON_BYTES = 2 * 1024 * 1024;
13
+ const jsonText = (value) => {
14
+ const serialized = JSON.stringify(value);
15
+ if (serialized === undefined)
16
+ throw new TypeError("Bridge candidate is not JSON serializable");
17
+ return serialized;
18
+ };
19
+ /** Retain a deterministic prefix of grouped Cartesian candidates within a byte budget. */
20
+ export const projectCartesianCandidates = (input) => {
21
+ const total = input.groups.reduce((sum, group) => sum + group.left.length * group.right.length, 0);
22
+ const preparedGroups = input.groups.map((group) => ({
23
+ left: group.left.map((value) => ({
24
+ value,
25
+ pathBytes: Buffer.byteLength(jsonText(value.path)),
26
+ })),
27
+ right: group.right.map((value) => {
28
+ const emptyLeftCandidate = jsonText(input.createCandidate("", value));
29
+ return {
30
+ value,
31
+ rowOverhead: Buffer.byteLength(emptyLeftCandidate) - 2,
32
+ };
33
+ }),
34
+ }));
35
+ let estimatedFullBytes = 2 + Math.max(0, total - 1); // JSON array brackets and commas.
36
+ for (const group of preparedGroups) {
37
+ estimatedFullBytes +=
38
+ group.left.length *
39
+ group.right.reduce((sum, { rowOverhead }) => sum + rowOverhead, 0) +
40
+ group.right.length *
41
+ group.left.reduce((sum, { pathBytes }) => sum + pathBytes, 0);
42
+ }
43
+ const shouldEmitAll = estimatedFullBytes <= MAX_BRIDGE_CANDIDATE_JSON_BYTES;
44
+ const candidates = [];
45
+ let estimatedRetainedBytes = 2;
46
+ candidateLoop: for (const group of preparedGroups) {
47
+ for (const left of group.left) {
48
+ for (const right of group.right) {
49
+ const candidateBytes = right.rowOverhead + left.pathBytes;
50
+ const additionalBytes = candidateBytes + (candidates.length > 0 ? 1 : 0);
51
+ if (!shouldEmitAll &&
52
+ estimatedRetainedBytes + additionalBytes >
53
+ MAX_BRIDGE_CANDIDATE_JSON_BYTES)
54
+ break candidateLoop;
55
+ candidates.push(input.createCandidate(left.value.path, right.value));
56
+ estimatedRetainedBytes += additionalBytes;
57
+ }
58
+ }
59
+ }
60
+ return {
61
+ candidates,
62
+ coverage: {
63
+ status: candidates.length === total
64
+ ? "complete"
65
+ : "partial",
66
+ total_candidates: total,
67
+ emitted_candidates: candidates.length,
68
+ omitted_candidates: total - candidates.length,
69
+ },
70
+ };
71
+ };
@@ -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);
@@ -33,6 +33,7 @@ const browserExclusionReasonSchema = z.enum([
33
33
  "out_of_target_scope",
34
34
  "provider_unavailable",
35
35
  "invalid_protocol_value",
36
+ "resource_budget_exhausted",
36
37
  ]);
37
38
  const browserExclusionSchema = z.object({
38
39
  section: browserSectionSchema,
@@ -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 {
@@ -1,4 +1,4 @@
1
- import { AnalysisError } from "./analysisErrorBase.js";
1
+ import { AnalysisError, } from "./analysisErrorBase.js";
2
2
  import { AnalysisCancelledError } from "./analysisErrorCore.js";
3
3
  /** A bounded passive browser observation failed at its CDP boundary. */
4
4
  export class BrowserObservationError extends AnalysisError {
@@ -13,13 +13,32 @@ export class BrowserObservationError extends AnalysisError {
13
13
  super(`Browser observation ${operation} failed: ${reason}`, options);
14
14
  this.operation = operation;
15
15
  this.reason = reason;
16
- this.userMessage = options?.detail;
17
- this.cleanupIncomplete = reason === "cleanup_failed";
16
+ this.userMessage =
17
+ options?.detail ?? observationFailureMessage(operation, reason);
18
+ this.cleanupIncomplete =
19
+ this.cleanup !== undefined || reason === "cleanup_failed";
18
20
  this.cleanupResources =
19
- reason === "cleanup_failed" ? ["browser_transport"] : [];
21
+ this.cleanup?.resources ??
22
+ (reason === "cleanup_failed" ? ["browser_transport"] : []);
20
23
  this.userCategory =
21
- reason === "cancelled" || options?.cause instanceof AnalysisCancelledError
24
+ reason === "cancelled" ||
25
+ options?.cause instanceof AnalysisCancelledError ||
26
+ (options?.cause instanceof AnalysisError &&
27
+ options.cause.userCategory === "cancelled")
22
28
  ? "cancelled"
23
29
  : undefined;
24
30
  }
25
31
  }
32
+ const observationFailureMessage = (operation, reason) => {
33
+ if (reason === "cancelled")
34
+ return `${operation} was cancelled. Collected observations and cleanup status are reported when available.`;
35
+ if (reason === "timeout")
36
+ return `${operation} exceeded its execution deadline. Review the target's responsiveness and retained observations before retrying.`;
37
+ if (reason === "endpoint_unreachable")
38
+ return `${operation} could not reach the selected loopback debugging endpoint. Verify that the target process is running with debugging enabled and that the endpoint's port matches it, then retry.`;
39
+ if (reason === "target_not_found")
40
+ return `${operation} could not find the selected target at the debugging endpoint. Refresh target discovery for that endpoint and retry with a returned target ID.`;
41
+ if (reason === "disconnected")
42
+ return `${operation} lost its debugging connection. Verify that the target process is still running, refresh target discovery, and retry the observation.`;
43
+ return undefined;
44
+ };
@@ -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."),