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
@@ -1,5 +1,7 @@
1
+ import { compareCodePoints } from "../../domain/canonicalOrdering.js";
1
2
  import { canonicalDigest } from "../../domain/comparisonSemantics.js";
2
- import { zipPackageFormatForPath } from "../../domain/zipPackageFormat.js";
3
+ import { artifactEdgeId, artifactIdForContent, occurrenceIdForLocation, } from "../../domain/artifactIdentity.js";
4
+ import { hasZipSignature, zipPackageFormatForPath, } from "../../domain/zipPackageFormat.js";
3
5
  import { mzWindowsHeaderOffset, parseDosMzHeader } from "../../domain/dosMz.js";
4
6
  /** Index the first occurrence for each canonical logical path. */
5
7
  export const indexOccurrencesByPath = (occurrences) => {
@@ -15,6 +17,14 @@ export const createOccurrence = (entry, path, parent) => ({
15
17
  parent_occurrence_id: parent,
16
18
  logical_path: path,
17
19
  entry_kind: entry.kind,
20
+ artifact_kind: entry.kind === "directory"
21
+ ? path.toLowerCase().endsWith(".framework")
22
+ ? "framework"
23
+ : "container"
24
+ : classifyArtifactPath(path).kind,
25
+ artifact_format: entry.kind === "directory"
26
+ ? "directory"
27
+ : classifyArtifactPath(path).format,
18
28
  declared_size: entry.declaredSize,
19
29
  compressed_size: entry.compressedSize,
20
30
  executable: entry.executable,
@@ -25,15 +35,8 @@ export const createOccurrence = (entry, path, parent) => ({
25
35
  : { offset: entry.byteOffset, length: entry.declaredSize },
26
36
  limitations: [...entry.limitations],
27
37
  });
28
- /** Preserve collation order and break distinct-name ties by UTF-16 code units. */
29
- export const compareDirectoryChildNames = (left, right) => {
30
- const collated = left.localeCompare(right);
31
- if (collated !== 0)
32
- return collated;
33
- if (left < right)
34
- return -1;
35
- return left > right ? 1 : 0;
36
- };
38
+ /** Compare exact child names independently of host locale and traversal order. */
39
+ export const compareDirectoryChildNames = compareCodePoints;
37
40
  export const materializeDirectoryNodes = (occurrences, nodes) => {
38
41
  const directories = occurrences
39
42
  .filter(({ entry_kind: kind }) => kind === "directory")
@@ -60,15 +63,10 @@ export const materializeDirectoryNodes = (occurrences, nodes) => {
60
63
  const node = createArtifactNode({
61
64
  sha256: canonicalDigest({ kind: "directory", children }, "Artifact"),
62
65
  size: 0,
63
- kind: directory.logical_path.toLowerCase().endsWith(".framework")
64
- ? "framework"
65
- : "container",
66
66
  format: "directory",
67
- executable: false,
68
67
  contentState: "virtual",
69
68
  });
70
- const existing = nodes.get(node.artifact_id);
71
- nodes.set(node.artifact_id, existing?.kind === "framework" ? existing : node);
69
+ nodes.set(node.artifact_id, node);
72
70
  directory.artifact_id = node.artifact_id;
73
71
  directory.hash_status = "verified";
74
72
  }
@@ -77,43 +75,47 @@ export const createRootNode = (input) => createArtifactNode({
77
75
  sha256: input.digest?.sha256 ??
78
76
  canonicalDigest({
79
77
  kind: "directory-root",
80
- children: input.occurrences.map(({ logical_path, artifact_id }) => ({
78
+ children: input.occurrences
79
+ .map(({ logical_path, artifact_id }) => ({
81
80
  logical_path,
82
81
  artifact_id,
83
- })),
82
+ }))
83
+ .sort((left, right) => compareDirectoryChildNames(left.logical_path, right.logical_path)),
84
84
  }, "Artifact"),
85
85
  size: input.digest?.bytes ?? 0,
86
- kind: input.directory ||
87
- ["zip", "ipa", "apk", "msix", "appx", "asar", "dmg", "pkg"].includes(input.format)
88
- ? "container"
89
- : input.format === "dos-mz"
90
- ? "executable"
91
- : classifyArtifactPath(input.path).kind,
92
- format: input.format,
93
- executable: false,
86
+ format: input.digest === null
87
+ ? "directory"
88
+ : classifyArtifactBytes(input.digest.prefix, input.digest.bytes),
94
89
  contentState: "materialized",
95
90
  });
96
91
  export const createArtifactNode = (input) => ({
97
- artifact_id: `art_${canonicalDigest({ sha256: input.sha256 }, "Artifact")}`,
98
- kind: input.kind,
92
+ artifact_id: artifactIdForContent(input.sha256),
99
93
  format: input.format,
100
94
  sha256: input.sha256,
101
95
  size: input.size,
102
96
  media_type: null,
103
97
  architecture: null,
104
- executable: input.executable,
105
98
  content_state: input.contentState,
106
- limitations: [...(input.limitations ?? [])],
99
+ limitations: [],
107
100
  });
108
- export const rootOccurrenceFor = (node, declaredSize) => ({
109
- occurrence_id: `occ_${canonicalDigest({ root: node.artifact_id }, "Artifact")}`,
101
+ export const rootOccurrenceFor = (node, metadata) => ({
102
+ occurrence_id: occurrenceIdForLocation({
103
+ rootArtifactId: node.artifact_id,
104
+ logicalPath: ".",
105
+ entryKind: metadata.format === "directory" ? "directory" : "file",
106
+ }),
110
107
  artifact_id: node.artifact_id,
111
108
  parent_occurrence_id: null,
112
109
  logical_path: ".",
113
- entry_kind: node.format === "directory" ? "directory" : "file",
114
- declared_size: declaredSize,
110
+ entry_kind: metadata.format === "directory" ? "directory" : "file",
111
+ artifact_kind: metadata.format === "directory" ||
112
+ ["zip", "ipa", "apk", "msix", "appx", "asar", "dmg", "pkg"].includes(metadata.format)
113
+ ? "container"
114
+ : artifactRoleForFormat(metadata.path, metadata.format).kind,
115
+ artifact_format: metadata.format,
116
+ declared_size: metadata.size,
115
117
  compressed_size: null,
116
- executable: node.executable,
118
+ executable: metadata.executable,
117
119
  encrypted: false,
118
120
  hash_status: "verified",
119
121
  source_location: null,
@@ -122,11 +124,11 @@ export const rootOccurrenceFor = (node, declaredSize) => ({
122
124
  export const rekeyOccurrences = (rootArtifactId, occurrences) => {
123
125
  const replacements = new Map();
124
126
  for (const occurrence of occurrences)
125
- replacements.set(occurrence.occurrence_id, `occ_${canonicalDigest({
126
- root_artifact_id: rootArtifactId,
127
- logical_path: occurrence.logical_path,
128
- entry_kind: occurrence.entry_kind,
129
- }, "Artifact")}`);
127
+ replacements.set(occurrence.occurrence_id, occurrenceIdForLocation({
128
+ rootArtifactId,
129
+ logicalPath: occurrence.logical_path,
130
+ entryKind: occurrence.entry_kind,
131
+ }));
130
132
  for (const occurrence of occurrences) {
131
133
  occurrence.occurrence_id =
132
134
  replacements.get(occurrence.occurrence_id) ?? occurrence.occurrence_id;
@@ -160,7 +162,7 @@ export const createArtifactEdges = (rootArtifactId, occurrences, producer) => {
160
162
  logical_path: occurrence.logical_path,
161
163
  };
162
164
  edges.push({
163
- edge_id: `edge_${canonicalDigest(semantic, "Artifact")}`,
165
+ edge_id: artifactEdgeId(semantic),
164
166
  ...semantic,
165
167
  producer: occurrence.entry_kind === "slice" ? (producer ?? null) : null,
166
168
  ordinal: edges.length,
@@ -206,34 +208,48 @@ export const classifyArtifactPath = (path) => {
206
208
  };
207
209
  /** Classify executable formats from bytes while retaining path-specific roles. */
208
210
  export const classifyArtifactContent = (path, prefix, fileSize = prefix.length) => {
211
+ return artifactRoleForFormat(path, classifyArtifactBytes(prefix, fileSize));
212
+ };
213
+ const artifactRoleForFormat = (path, format) => {
209
214
  const byPath = classifyArtifactPath(path);
215
+ if (format === "file" || format === byPath.format)
216
+ return byPath;
217
+ if (format === "unknown")
218
+ return { kind: "unknown", format };
219
+ if (format === "zip")
220
+ return {
221
+ kind: "container",
222
+ format: zipPackageFormatForPath(path) ?? format,
223
+ };
224
+ if (format === "plist")
225
+ return { kind: "plist", format };
226
+ return {
227
+ kind: ["native-addon", "dynamic-library"].includes(byPath.kind)
228
+ ? byPath.kind
229
+ : "executable",
230
+ format,
231
+ };
232
+ };
233
+ /** Classify storage bytes independently of path names, roles, and permissions. */
234
+ export const classifyArtifactBytes = (prefix, fileSize = prefix.length) => {
235
+ if (hasZipSignature(prefix))
236
+ return "zip";
237
+ if (prefix.subarray(0, 8).equals(Buffer.from("bplist00")))
238
+ return "plist";
210
239
  if (prefix.length >= 4) {
211
240
  const magic = prefix.readUInt32BE(0);
212
241
  if ([0xcafebabe, 0xbebafeca, 0xcafebabf, 0xbfbafeca].includes(magic))
213
- return {
214
- kind: byPath.kind === "native-addon" ? "native-addon" : "executable",
215
- format: "mach-o-universal",
216
- };
242
+ return "mach-o-universal";
217
243
  if ([0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe].includes(magic))
218
- return {
219
- kind: ["native-addon", "dynamic-library"].includes(byPath.kind)
220
- ? byPath.kind
221
- : "executable",
222
- format: "mach-o",
223
- };
244
+ return "mach-o";
224
245
  if (prefix.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46])))
225
- return {
226
- kind: ["native-addon", "dynamic-library"].includes(byPath.kind)
227
- ? byPath.kind
228
- : "executable",
229
- format: "elf",
230
- };
246
+ return "elf";
231
247
  }
232
248
  if (prefix.length >= 2 && prefix[0] === 0x4d && prefix[1] === 0x5a) {
233
249
  if (!Number.isSafeInteger(fileSize) ||
234
250
  fileSize < prefix.length ||
235
251
  prefix.length < Math.min(fileSize, 64))
236
- return { kind: "unknown", format: "unknown" };
252
+ return "unknown";
237
253
  const windowsOffset = mzWindowsHeaderOffset(prefix);
238
254
  if (windowsOffset !== null) {
239
255
  if (windowsOffset >= 64 &&
@@ -241,18 +257,13 @@ export const classifyArtifactContent = (path, prefix, fileSize = prefix.length)
241
257
  prefix
242
258
  .subarray(windowsOffset, windowsOffset + 4)
243
259
  .equals(Buffer.from([0x50, 0x45, 0, 0])))
244
- return {
245
- kind: byPath.kind === "native-addon" ? "native-addon" : "executable",
246
- format: "pe",
247
- };
248
- }
249
- else if (parseDosMzHeader(prefix, fileSize).ok) {
250
- return { kind: "executable", format: "dos-mz" };
260
+ return "pe";
251
261
  }
252
- // Missing bounded evidence and malformed MZ bytes both remain unclassified.
253
- return { kind: "unknown", format: "unknown" };
262
+ else if (parseDosMzHeader(prefix, fileSize).ok)
263
+ return "dos-mz";
264
+ return "unknown";
254
265
  }
255
- return byPath;
266
+ return "file";
256
267
  };
257
268
  const relationFor = (path) => {
258
269
  const lower = path.toLowerCase();
@@ -2,7 +2,6 @@ import { realpath } from "node:fs/promises";
2
2
  import { artifactInventoryResultSchema, } from "../../domain/artifactGraph.js";
3
3
  import { abortIfNeeded } from "../ArtifactHash.js";
4
4
  import { scanCanonicalArtifactInventory } from "./scanCanonical.js";
5
- export { scanCanonicalArtifactInventory } from "./scanCanonical.js";
6
5
  /** Inventory one local artifact and return every graph collection inline. */
7
6
  export const inventoryArtifact = async (inputPath, options = {}) => {
8
7
  const snapshot = await scanArtifactInventory(inputPath, options);
@@ -3,7 +3,7 @@ import { DirectoryArtifactReader } from "../DirectoryArtifactReader.js";
3
3
  import { MachOSliceArtifactReader } from "../MachOSliceArtifactReader.js";
4
4
  import { NativeDmgArtifactReader } from "../NativeDmgArtifactReader.js";
5
5
  import { ZipArtifactReader } from "../ZipArtifactReader.js";
6
- export const createReader = async (path, format, signal) => {
6
+ export const createReader = async (path, format, environment, signal) => {
7
7
  switch (format) {
8
8
  case "directory":
9
9
  return new DirectoryArtifactReader(path);
@@ -17,12 +17,12 @@ export const createReader = async (path, format, signal) => {
17
17
  return new AsarArtifactReader(path);
18
18
  case "mach-o-universal":
19
19
  return process.platform === "darwin"
20
- ? new MachOSliceArtifactReader(path)
20
+ ? new MachOSliceArtifactReader(path, environment)
21
21
  : undefined;
22
22
  case "dmg":
23
23
  if (process.platform !== "darwin")
24
24
  return undefined;
25
- return NativeDmgArtifactReader.create(path, signal);
25
+ return NativeDmgArtifactReader.create(path, environment, signal);
26
26
  default:
27
27
  return undefined;
28
28
  }
@@ -1,53 +1,73 @@
1
+ import { compareCodePoints } from "../../domain/canonicalOrdering.js";
1
2
  import { createReadStream } from "node:fs";
2
3
  import { lstat } from "node:fs/promises";
3
4
  import { ArtifactReaderFailure, } from "../ArtifactReader.js";
4
5
  import { artifactInventoryResultSchema, } from "../../domain/artifactGraph.js";
5
6
  import { createArtifactEdges, createRootNode, indexOccurrencesByPath, materializeDirectoryNodes, rekeyOccurrences, rootOccurrenceFor, } from "./ArtifactGraphConstruction.js";
6
- import { canonicalDigest } from "../../domain/comparisonSemantics.js";
7
+ import { artifactContradictionId, artifactGraphDigest, artifactManifestId, } from "../../domain/artifactIdentity.js";
7
8
  import { classifyRoot } from "./classify.js";
8
9
  import { hashReadable } from "../ArtifactHash.js";
9
10
  import { createReader, inventoryLimitations } from "./reader.js";
10
11
  import { scanReader, } from "./scanReader.js";
11
12
  import { STRICT_INTEGRITY_POLICY, } from "./types.js";
12
- export const scanCanonicalArtifactInventory = async (path, options = {}) => {
13
+ export const scanCanonicalArtifactInventory = async (path, options = {}, readerFactory = createReader) => {
13
14
  const integrity = options.integrity ?? STRICT_INTEGRITY_POLICY;
14
15
  const metadata = await lstat(path);
15
16
  const rootFormat = await classifyRoot(path, metadata.isDirectory());
16
17
  const rootDigest = metadata.isDirectory()
17
18
  ? null
18
19
  : await hashReadable(createReadStream(path), options.signal);
19
- const reader = await createReader(path, rootFormat, options.signal);
20
+ const reader = await readerFactory(path, rootFormat, options.environment ?? {}, options.signal);
21
+ let outcome;
20
22
  try {
21
23
  const { nodes, occurrences, pendingContradictions } = await scanReader(reader, options.signal, integrity);
22
- return await buildInventorySnapshot({
23
- path,
24
- metadata,
25
- rootFormat,
26
- rootDigest,
27
- reader,
28
- signal: options.signal,
29
- nodes,
30
- occurrences,
31
- pendingContradictions,
32
- });
24
+ outcome = {
25
+ kind: "completed",
26
+ snapshot: await buildInventorySnapshot({
27
+ path,
28
+ metadata,
29
+ rootFormat,
30
+ rootDigest,
31
+ reader,
32
+ signal: options.signal,
33
+ nodes,
34
+ occurrences,
35
+ pendingContradictions,
36
+ }),
37
+ };
33
38
  }
34
- finally {
39
+ catch (cause) {
40
+ outcome = { kind: "failed", cause };
41
+ }
42
+ try {
35
43
  await reader?.close();
36
44
  }
45
+ catch (cleanupCause) {
46
+ const cleanup = ArtifactReaderFailure.cleanupObservation(cleanupCause, `artifact reader for ${path}`);
47
+ const primary = outcome.kind === "failed" ? outcome.cause : cleanupCause;
48
+ throw ArtifactReaderFailure.withCleanup(primary, cleanup, outcome.kind === "completed"
49
+ ? { kind: "artifact-inventory", inventory: outcome.snapshot }
50
+ : undefined);
51
+ }
52
+ if (outcome.kind === "failed")
53
+ throw outcome.cause;
54
+ return outcome.snapshot;
37
55
  };
38
56
  const buildInventorySnapshot = async (input) => {
39
57
  const { path, metadata, rootFormat, rootDigest, reader, signal } = input;
40
58
  materializeDirectoryNodes(input.occurrences, input.nodes);
41
59
  const rootNode = createRootNode({
42
- path,
43
- format: rootFormat,
44
- directory: metadata.isDirectory(),
45
60
  digest: rootDigest,
46
61
  occurrences: input.occurrences,
47
62
  });
48
63
  input.nodes.set(rootNode.artifact_id, rootNode);
49
64
  rekeyOccurrences(rootNode.artifact_id, input.occurrences);
50
- const rootOccurrence = rootOccurrenceFor(rootNode, metadata.size);
65
+ const rootOccurrence = rootOccurrenceFor(rootNode, {
66
+ size: metadata.size,
67
+ executable: (metadata.mode & 0o111) !== 0,
68
+ format: rootFormat,
69
+ path,
70
+ });
51
71
  for (const occurrence of input.occurrences)
52
72
  if (occurrence.parent_occurrence_id === null)
53
73
  occurrence.parent_occurrence_id = rootOccurrence.occurrence_id;
@@ -61,16 +81,20 @@ const buildInventorySnapshot = async (input) => {
61
81
  const edges = createArtifactEdges(rootNode.artifact_id, input.occurrences, reader?.provenance()[0]);
62
82
  const orderedNodes = sortNodes([...input.nodes.values()]);
63
83
  const orderedOccurrences = sortOccurrences(input.occurrences);
64
- const orderedEdges = sortEdges(edges);
84
+ const orderedEdges = sortEdges(edges).map((edge, ordinal) => ({
85
+ ...edge,
86
+ ordinal,
87
+ }));
65
88
  await verifyRootDigest(path, rootDigest, signal);
66
- const graphSha256 = canonicalDigest({
89
+ const graphSha256 = artifactGraphDigest({
67
90
  nodes: orderedNodes,
68
91
  occurrences: orderedOccurrences,
69
92
  edges: orderedEdges,
70
- integrity_contradictions: integrityContradictions,
71
- }, "Artifact");
93
+ contradictions: integrityContradictions,
94
+ });
72
95
  const manifest = buildManifest({
73
96
  rootNode,
97
+ rootFormat,
74
98
  graphSha256,
75
99
  orderedNodes,
76
100
  orderedOccurrences,
@@ -95,12 +119,12 @@ const buildIntegrityContradictions = (pending, occurrenceByPath, occurrenceById,
95
119
  : occurrenceById.get(occurrence.parent_occurrence_id);
96
120
  const parentArtifactId = parent?.artifact_id ?? rootNode.artifact_id;
97
121
  return {
98
- contradiction_id: `ic_${canonicalDigest({
99
- root_artifact_id: rootNode.artifact_id,
100
- logical_path: contradiction.logicalPath,
101
- declared_sha256: contradiction.declaredSha256,
102
- observed_sha256: contradiction.observedSha256,
103
- }, "Artifact")}`,
122
+ contradiction_id: artifactContradictionId({
123
+ rootArtifactId: rootNode.artifact_id,
124
+ logicalPath: contradiction.logicalPath,
125
+ declaredSha256: contradiction.declaredSha256,
126
+ observedSha256: contradiction.observedSha256,
127
+ }),
104
128
  occurrence_id: occurrence.occurrence_id,
105
129
  parent_artifact_id: parentArtifactId,
106
130
  logical_path: contradiction.logicalPath,
@@ -123,17 +147,14 @@ const verifyRootDigest = async (path, rootDigest, signal) => {
123
147
  verified.bytes !== rootDigest.bytes)
124
148
  throw new ArtifactReaderFailure("integrity", "Root artifact changed during inventory");
125
149
  };
126
- const sortNodes = (nodes) => nodes.sort((left, right) => left.artifact_id.localeCompare(right.artifact_id));
127
- const sortOccurrences = (occurrences) => occurrences.sort((left, right) => left.logical_path.localeCompare(right.logical_path, "en"));
128
- const sortEdges = (edges) => edges.sort((left, right) => left.edge_id.localeCompare(right.edge_id));
129
- const buildManifest = ({ rootNode, graphSha256, orderedNodes, orderedOccurrences, orderedEdges, }) => artifactInventoryResultSchema.shape.manifest.parse({
130
- manifest_id: `agm_${canonicalDigest({
131
- root_artifact_id: rootNode.artifact_id,
132
- graph_sha256: graphSha256,
133
- }, "Artifact")}`,
150
+ const sortNodes = (nodes) => nodes.sort((left, right) => compareCodePoints(left.artifact_id, right.artifact_id));
151
+ const sortOccurrences = (occurrences) => occurrences.sort((left, right) => compareCodePoints(left.logical_path, right.logical_path));
152
+ const sortEdges = (edges) => edges.sort((left, right) => compareCodePoints(left.edge_id, right.edge_id));
153
+ const buildManifest = ({ rootNode, rootFormat, graphSha256, orderedNodes, orderedOccurrences, orderedEdges, }) => artifactInventoryResultSchema.shape.manifest.parse({
154
+ manifest_id: artifactManifestId(rootNode.artifact_id, graphSha256),
134
155
  root_artifact_id: rootNode.artifact_id,
135
156
  root_sha256: rootNode.sha256,
136
- root_format: rootNode.format,
157
+ root_format: rootFormat,
137
158
  graph_sha256: graphSha256,
138
159
  node_count: orderedNodes.length,
139
160
  occurrence_count: orderedOccurrences.length,
@@ -2,7 +2,7 @@ import { isAbsolute } from "node:path";
2
2
  import { ArtifactPathRegistry, normalizeArtifactPath, } from "../ArtifactPaths.js";
3
3
  import { ArtifactReaderFailure, } from "../ArtifactReader.js";
4
4
  import { AsarArtifactReader } from "../AsarArtifactReader.js";
5
- import { classifyArtifactContent, createArtifactNode, createOccurrence, nearestParent, } from "./ArtifactGraphConstruction.js";
5
+ import { classifyArtifactContent, classifyArtifactBytes, createArtifactNode, createOccurrence, nearestParent, } from "./ArtifactGraphConstruction.js";
6
6
  import { STRICT_INTEGRITY_POLICY, } from "./types.js";
7
7
  import { hashReadable } from "../ArtifactHash.js";
8
8
  const UNAVAILABLE_UNPACKED_LIMITATION = "ASAR unpacked companion bytes were unavailable; no content hash or child artifact was produced.";
@@ -71,6 +71,8 @@ const visitArtifactEntries = async (context, currentReader, prefix) => {
71
71
  if (digested !== undefined) {
72
72
  context.nodes.set(digested.node.artifact_id, digested.node);
73
73
  occurrence.artifact_id = digested.node.artifact_id;
74
+ occurrence.artifact_kind = digested.classification.kind;
75
+ occurrence.artifact_format = digested.classification.format;
74
76
  occurrence.hash_status = digested.mismatched
75
77
  ? "mismatched"
76
78
  : "verified";
@@ -129,17 +131,11 @@ const digestArtifactEntry = async (context, currentReader, entry, logicalPath) =
129
131
  node: createArtifactNode({
130
132
  sha256: digest.sha256,
131
133
  size: digest.bytes,
132
- kind: classified.kind,
133
- format: classified.format,
134
- executable: entry.executable,
134
+ format: classifyArtifactBytes(digest.prefix, digest.bytes),
135
135
  contentState: "embedded",
136
- limitations: mismatched
137
- ? [
138
- "Observed content contradicts declared integrity metadata and is untrusted.",
139
- ]
140
- : [],
141
136
  }),
142
137
  mismatched,
138
+ classification: classified,
143
139
  };
144
140
  };
145
141
  const isExpandableAsar = (entry, logicalPath) => entry.kind === "file" &&
@@ -125,7 +125,11 @@ const readText = async (context, input) => {
125
125
  try {
126
126
  return {
127
127
  included: true,
128
- value: new TextDecoder("utf-8", { fatal: true }).decode(bytes),
128
+ value: new TextDecoder("utf-8", {
129
+ fatal: true,
130
+ ignoreBOM: input.expected.kind === "javascript" ||
131
+ input.expected.kind === "html",
132
+ }).decode(bytes),
129
133
  };
130
134
  }
131
135
  catch (cause) {
@@ -204,7 +208,7 @@ const relevantKind = (path) => {
204
208
  return "package-json";
205
209
  if (lower.endsWith(".json"))
206
210
  return "json";
207
- if (/\.(?:cjs|mjs|js|jsx|ts|tsx)$/u.test(lower))
211
+ if (/\.(?:cjs|cts|mjs|mts|js|jsx|ts|tsx)$/u.test(lower))
208
212
  return "javascript";
209
213
  if (/\.html?$/u.test(lower))
210
214
  return "html";
@@ -0,0 +1,106 @@
1
+ import { AnalysisError } from "../domain/analysisErrorBase.js";
2
+ import { AnalysisCancelledError, AnalysisTimeoutError, } from "../domain/analysisErrorCore.js";
3
+ import { projectAnalysisError } from "../domain/analysisErrorProjection.js";
4
+ import { BrowserObservationError } from "../domain/browserObservationError.js";
5
+ import { ProviderAdapterError } from "../domain/providerAdapterError.js";
6
+ import { PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY } from "./providerIdentities.js";
7
+ const OPERATION = "capture_browser_scenario";
8
+ const browserScenarioLimitations = (session) => [
9
+ "Event sequence records provider receipt order; simultaneous browser causality is not inferred.",
10
+ "Network content is retained only when selected; response bytes are browser-decoded, not compressed wire bytes.",
11
+ "Request bytes are limited to what Playwright exposes; not_exposed does not establish body absence or multipart file coverage.",
12
+ "Network content reads settle within 5 seconds each and never wait for unfinished responses or refetch them.",
13
+ "Playwright scenario events do not expose request initiator stacks; receipt order does not prove causality.",
14
+ "Storage values are hashed only after declared-secret redaction.",
15
+ ...(session.eventLimitations?.() ?? []),
16
+ ...(session.mode === "connect"
17
+ ? [
18
+ "CDP attachment cannot recover pre-attach events or guarantee launch-time context options.",
19
+ ]
20
+ : []),
21
+ ];
22
+ /** Project one session into the common capture fields used by success and failure. */
23
+ export const browserScenarioCaptureData = (input) => ({
24
+ browser: {
25
+ mode: input.session.mode,
26
+ process_ownership: input.session.processOwnership,
27
+ cleanup: input.cleanup,
28
+ product: input.session.product,
29
+ version: input.session.version,
30
+ },
31
+ scenario: {
32
+ start_origin: new URL(input.scenario.start_url.url).origin,
33
+ action_count: input.scenario.actions.length,
34
+ secret_references: input.scenario.secrets
35
+ .map(({ secret_id: id }) => id)
36
+ .sort(),
37
+ network_content: input.scenario.capture.network,
38
+ },
39
+ duration_ms: Date.now() - input.startedAt,
40
+ steps: [...input.steps],
41
+ events: input.session.events(),
42
+ limitations: [
43
+ ...browserScenarioLimitations(input.session),
44
+ ...(input.limitations ?? []),
45
+ ],
46
+ });
47
+ /** Describe the cleanup failure without discarding its resource evidence. */
48
+ export const browserScenarioCleanupObservation = (cause) => cause instanceof AnalysisError && cause.cleanup !== undefined
49
+ ? cause.cleanup
50
+ : {
51
+ reason: cause instanceof Error ? cause.message : String(cause),
52
+ resources: cause instanceof AnalysisError && cause.cleanupResources.length > 0
53
+ ? cause.cleanupResources
54
+ : ["browser_transport"],
55
+ };
56
+ /** Retain operation diagnostics and capture data after cleanup settles. */
57
+ export const browserScenarioOperationFailure = (cause, partialObservation, cleanupFailure) => {
58
+ const primary = cause instanceof AnalysisError
59
+ ? cause
60
+ : new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, OPERATION, { cause });
61
+ const primaryProjection = projectAnalysisError(primary);
62
+ const cleanupCause = cleanupFailure === undefined
63
+ ? undefined
64
+ : cleanupFailure.cause instanceof AnalysisError
65
+ ? cleanupFailure.cause
66
+ : new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, "close_browser_scenario", { cause: cleanupFailure.cause });
67
+ const cleanupObservation = cleanupFailure === undefined
68
+ ? undefined
69
+ : browserScenarioCleanupObservation(cleanupFailure.cause);
70
+ const retainedOptions = {
71
+ cause: primary,
72
+ partialObservation,
73
+ ...(primary.capturedOutput === undefined
74
+ ? {}
75
+ : { capturedOutput: primary.capturedOutput }),
76
+ ...(primary.cleanup === undefined ? {} : { cleanup: primary.cleanup }),
77
+ };
78
+ if (cleanupCause === undefined) {
79
+ if (primary instanceof AnalysisCancelledError)
80
+ return new AnalysisCancelledError(primary.operation, retainedOptions);
81
+ if (primary instanceof AnalysisTimeoutError)
82
+ return new AnalysisTimeoutError(primary.operation, primary.timeoutMs, retainedOptions);
83
+ if (primary instanceof BrowserObservationError)
84
+ return new BrowserObservationError(primary.operation, primary.reason, {
85
+ ...retainedOptions,
86
+ ...(primary.userMessage === undefined
87
+ ? {}
88
+ : { detail: primary.userMessage }),
89
+ });
90
+ }
91
+ const cleanup = cleanupObservation ?? primary.cleanup;
92
+ return new ProviderAdapterError(PLAYWRIGHT_BROWSER_SCENARIO_PROVIDER_IDENTITY.id, OPERATION, {
93
+ ...retainedOptions,
94
+ cause: cleanupCause === undefined
95
+ ? primary
96
+ : new AggregateError([primary, cleanupCause], "Browser scenario operation and cleanup both failed", { cause: primary }),
97
+ userMessage: primaryProjection.message,
98
+ ...(cleanup === undefined ? {} : { cleanup }),
99
+ diagnostics: {
100
+ primary_error: primaryProjection,
101
+ ...(cleanupCause === undefined
102
+ ? {}
103
+ : { cleanup_error: projectAnalysisError(cleanupCause) }),
104
+ },
105
+ });
106
+ };
@@ -1,4 +1,5 @@
1
- import { browserTargetListSchema, sanitizeBrowserUrl, webPageInspectionSchema, } from "../domain/browserObservation.js";
1
+ import { sanitizeBrowserUrl, } from "../domain/browserObservation.js";
2
+ import { browserTargetListSchema, webPageInspectionSchema, } from "../domain/browserObservationSchemas.js";
2
3
  import { analyzeCapturedWebBundle } from "../domain/webBundleAnalyzer.js";
3
4
  import { webBundleAnalysisSchema, } from "../domain/webBundleAnalysis.js";
4
5
  import { webObservationSessionSchema, } from "../domain/browserSession.js";
@@ -19,8 +20,6 @@ import { observeCdpSession } from "./CdpObservationSession.js";
19
20
  import { discoverWebMcp } from "./CdpWebMcpDiscovery.js";
20
21
  import { captureCdpScreenshot } from "./CdpScreenshot.js";
21
22
  import { comparePngScreenshots } from "./PngVisualDiff.js";
22
- /** Public identity committed by passive browser observations. */
23
- export { CDP_BROWSER_PROVIDER_IDENTITY } from "./providerIdentities.js";
24
23
  import { CDP_BROWSER_PROVIDER_IDENTITY } from "./providerIdentities.js";
25
24
  const IDENTITY = CDP_BROWSER_PROVIDER_IDENTITY;
26
25
  const CLEANUP_DOMAINS = ["Network", "Debugger", "Runtime", "Page"];
@@ -44,6 +44,8 @@ export class CdpCaptureCompleteness {
44
44
  if (reason === "provider_unavailable" ||
45
45
  reason === "invalid_protocol_value")
46
46
  this.#unavailable.add(section);
47
+ if (reason === "resource_budget_exhausted")
48
+ this.#truncated.add(section);
47
49
  const key = `${section}\0${reason}`;
48
50
  const existing = this.#excluded.get(key);
49
51
  const combined = count === null || existing?.count === null